コード例 #1
0
ファイル: EmitContext.cs プロジェクト: kzyg/spark
            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();
            }
コード例 #2
0
ファイル: EmitContext.cs プロジェクト: kzyg/spark
        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);
        }