Пример #1
0
        private void AddSubRenderState(SubRenderState newSubRenderState, string dstTechniqueSchemeName,
                                       string materialNem,
                                       string groupName, int passIndex)
        {
            //Check if a different sub render state of the same type already exists
            ShaderGenerator shaderGenerator = ShaderGenerator.Instance;

            //Create a new scheme if needed
            shaderGenerator.CreateScheme(dstTechniqueSchemeName);

            //Update the active render state
            this.generatedRenderState = shaderGenerator.GetRenderState(dstTechniqueSchemeName, materialNem,
                                                                       (ushort)passIndex);

            //add the new sub render state
            this.generatedRenderState.AddTemplateSubRenderState(newSubRenderState);
        }
Пример #2
0
        private void TranslatePass(Scripting.Compiler.ScriptCompiler compiler, AbstractNode node)
        {
            var             obj                    = (ObjectAbstractNode)node;
            var             pass                   = (Pass)obj.Parent.Context;
            Technique       technique              = pass.Parent;
            Material        material               = technique.Parent;
            ShaderGenerator shaderGenerator        = ShaderGenerator.Instance;
            string          dstTechniqueSchemeName = obj.Name;
            bool            techniqueCreated;

            //Make sure scheme name is valid - use default if none exists
            if (dstTechniqueSchemeName == string.Empty)
            {
                dstTechniqueSchemeName = ShaderGenerator.DefaultSchemeName;
            }

            //Create the shader based tedchnique
            techniqueCreated = shaderGenerator.CreateShaderBasedTechnique(material.Name, material.Group,
                                                                          technique.SchemeName, dstTechniqueSchemeName,
                                                                          shaderGenerator.
                                                                          CreateShaderOverProgrammablePass);

            if (techniqueCreated)
            {
                //Go over all render state properties
                for (int i = 0; i < obj.Children.Count; i++)
                {
                    if (obj.Children[i] is PropertyAbstractNode)
                    {
                        var            prop = obj.Children[i] as PropertyAbstractNode;
                        SubRenderState subRenderState;

                        //Handle light count property.
                        if (prop != null && prop.Name == "light_count")
                        {
                            if (prop.Values.Count != 3)
                            {
                                //compiler.AddError(...);
                            }
                            else
                            {
                                var lightCount = new int[3];
                                if (!getInts(prop.Values, 0, out lightCount, 3))
                                {
                                    //compiler.addError(...);
                                }
                                else
                                {
                                    shaderGenerator.CreateScheme(dstTechniqueSchemeName);
                                    RenderState renderState = shaderGenerator.GetRenderState(dstTechniqueSchemeName,
                                                                                             material.Name,
                                                                                             material.Group,
                                                                                             (ushort)pass.Index);
                                    renderState.SetLightCount(lightCount);
                                    renderState.LightCountAutoUpdate = false;
                                }
                            }
                        }
                        else
                        {
                            subRenderState = ShaderGenerator.Instance.createSubRenderState(compiler, prop, pass, this);
                            if (subRenderState != null)
                            {
                                AddSubRenderState(subRenderState, dstTechniqueSchemeName, material.Name, material.Group,
                                                  pass.Index);
                            }
                        }
                    }
                    else
                    {
                        processNode(compiler, obj.Children[i]);
                    }
                }
            }
        }