public void BindAttribute( MidFacetDecl midFacet, MidAttributeDecl midAttr, Func <IEmitBlock, IEmitVal, IEmitVal> accessor, IEmitType type, string name) { int ii = 0; foreach (var a in midFacet.Attributes) { if (a == midAttr) { Attributes[ii] = new ShaderAttributeInfo { AttributeDecl = midAttr, Accessor = accessor, Type = type, Name = name, }; return; } ++ii; } throw new NotImplementedException(); }
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); }