private void AddBaseFacet( ShaderClassInfo classInfo, ShaderFacetInfo baseFacet, Func <IEmitBlock, IEmitVal, IEmitVal> baseFacetAccessor) { var derivedFacetDecl = GetFacetForBase( classInfo.MidClassDecl, baseFacet.OriginalClass); var baseAttrs = baseFacet.Attributes; var baseAttrCount = baseAttrs.Length; var derivedAttrs = new ShaderAttributeInfo[baseAttrCount]; var derivedFacetInfo = new ShaderFacetInfo { OriginalClass = baseFacet.OriginalClass, FacetAccessor = baseFacetAccessor, Attributes = derivedAttrs, }; var derivedFacetAttrDecls = derivedFacetDecl.Attributes.ToArray(); for (int ii = 0; ii < baseAttrCount; ++ii) { var baseAttrInfo = baseAttrs[ii]; if (baseAttrInfo == null) { continue; } var baseAttrAccessor = baseAttrInfo.Accessor; var derivedAttrDecl = derivedFacetAttrDecls[ii]; var attrInfo = new ShaderAttributeInfo { AttributeDecl = derivedAttrDecl, Accessor = (b, shaderObj) => baseAttrAccessor(b, derivedFacetInfo.FacetAccessor(b, shaderObj)), Type = baseAttrInfo.Type, Name = baseAttrInfo.Name, }; derivedFacetInfo.Attributes[ii] = attrInfo; } derivedFacetInfo.Mixins.AddRange(baseFacet.Mixins); SetFacetForBase( classInfo, derivedFacetInfo); }
private void SetFacetForBase( ShaderClassInfo classInfo, ShaderFacetInfo facetInfo) { int ii = -1; // start at -1 since first facet is direct, not inherited foreach (var f in classInfo.MidClassDecl.Facets) { if (f.OriginalShaderClass.Decl == facetInfo.OriginalClass) { classInfo.InheritedFacets[ii] = facetInfo; return; } ++ii; } }
private void AddForwardingAccessors( IEmitClass emitClass, ShaderFacetInfo baseFacet) { var baseClass = _mapShaderClassToInfo[baseFacet.OriginalClass]; var baseAttrs = baseFacet.Attributes; var baseAttrCount = baseAttrs.Length; for (int ii = 0; ii < baseAttrCount; ++ii) { var baseAttrInfo = baseAttrs[ii]; if (baseAttrInfo == null) { continue; } emitClass.AddForwardingFieldAccessors( baseClass.InterfaceClass, baseAttrInfo.Type, baseAttrInfo.Name); } }
private ShaderFacetInfo CreateDirectFacet( MidFacetDecl midFacet, MidElementDecl constantElement, MidElementDecl uniformElement, IEmitClass ifaceClass, EmitEnv env) { var midAttributes = midFacet.Attributes.ToArray(); var attributeCount = midAttributes.Length; var attributeInfos = new ShaderAttributeInfo[attributeCount]; var result = new ShaderFacetInfo { OriginalClass = midFacet.OriginalShaderClass.Decl, FacetAccessor = (b, shaderObj) => shaderObj, Attributes = attributeInfos }; for (int ii = 0; ii < attributeCount; ++ii) { var midAttribute = midAttributes[ii]; var midElement = midAttribute.Element; if (midAttribute.IsAbstract) { continue; } if (midElement == constantElement) { if (midAttribute.Exp == null) { continue; } env.Insert(midAttribute, (b) => EmitExp(midAttribute.Exp, b, env)); } else if (midElement == uniformElement) { if (midAttribute.Exp != null) { continue; } if (!midAttribute.IsInput) { continue; } var attrType = EmitType(midAttribute.Type, env); var attrName = midAttribute.Name.ToString(); ifaceClass.WrapperWriteLine(""); ifaceClass.WrapperWriteLine( "// input @Uniform {0} {1}", midAttribute.Type, attrName); var attrField = ifaceClass.AddFieldAndAccessors( attrType, attrName); var attrInfo = new ShaderAttributeInfo(); attrInfo.AttributeDecl = midAttribute; attrInfo.Accessor = (b, shaderObj) => b.GetArrow( shaderObj, attrField); attrInfo.Type = attrType; attrInfo.Name = attrName; attributeInfos[ii] = attrInfo; } } return(result); }