Exemple #1
0
        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);
        }
Exemple #2
0
        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;
            }
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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);
        }