Example #1
0
        private void TranslateTextureUnit(Scripting.Compiler.ScriptCompiler compiler, AbstractNode node)
        {
            var             obj                    = (ObjectAbstractNode)node;
            var             texState               = (TextureUnitState)obj.Parent.Context;
            Pass            pass                   = texState.Parent;
            Technique       technique              = pass.Parent;
            Material        material               = technique.Parent;
            ShaderGenerator shaderGenerator        = ShaderGenerator.Instance;
            string          dstTechniqueSchemeName = obj.Name;
            bool            techniqueCreated;

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

            //check if technique already created
            techniqueCreated = shaderGenerator.HasShaderBasedTechnique(material.Name, material.Group,
                                                                       technique.SchemeName, dstTechniqueSchemeName);

            if (techniqueCreated == false)
            {
                //Create the shader based techniqe
                techniqueCreated = shaderGenerator.CreateShaderBasedTechnique(material.Name, material.Group,
                                                                              technique.SchemeName,
                                                                              dstTechniqueSchemeName,
                                                                              shaderGenerator.
                                                                              CreateShaderOverProgrammablePass);
            }

            if (techniqueCreated)
            {
                //Attempt to get the render state which might have been created by the pass parsing
                this.generatedRenderState = shaderGenerator.GetRenderState(dstTechniqueSchemeName, material.Name,
                                                                           material.Group, (ushort)pass.Index);

                //Go over all the 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 = ShaderGenerator.Instance.createSubRenderState(compiler, prop,
                                                                                                      texState, this);

                        if (subRenderState != null)
                        {
                            AddSubRenderState(subRenderState, dstTechniqueSchemeName, material.Name, material.Group,
                                              pass.Index);
                        }
                    }
                    else
                    {
                        processNode(compiler, obj.Children[i]);
                    }
                }
            }
        }
Example #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]);
                    }
                }
            }
        }