private IndirectionTexture createColorVertexMaterial(Technique technique, MaterialDescription description, bool alpha, bool depthCheck)
        {
            //Create depth check pass if needed
            var pass = createDepthPass(technique, description, alpha, depthCheck);

            //Setup this pass
            setupCommonPassAttributes(description, alpha, pass);

            //Setup material specific depth values
            pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA);
            pass.setDepthFunction(CompareFunction.CMPF_LESS_EQUAL);
            pass.setDepthWriteEnabled(false);

            //Material specific, setup shaders
            pass.setVertexProgram("colorvertex\\vs");
            if (alpha)
            {
                pass.setFragmentProgram("colorvertex\\fsAlpha");
            }
            else
            {
                pass.setFragmentProgram("colorvertex\\fs");
            }

            return(null);
        }
        private MaterialPtr createFromDescription(MaterialDescription description, bool alpha)
        {
            String name = description.Name;

            if (description.CreateAlphaMaterial && alpha) //Is this an automatic alpha material?
            {
                name += "Alpha";
            }
            MaterialPtr material = MaterialManager.getInstance().create(name, GroupName, false, null);

            CreateMaterial createMaterial = createUnifiedMaterial;

            if (description.IsSpecialMaterial && !specialMaterialFuncs.TryGetValue(description.SpecialMaterial, out createMaterial))
            {
                Logging.Log.Error("Could not find special material creation function {0} for material {1} in {2}.", description.SpecialMaterial, description.Name, description.SourceFile);
                createMaterial = createUnifiedMaterial; //Attempt to create something, out above clears this variable
            }

            IndirectionTexture indirectionTex = createMaterial(material.Value.getTechnique(0), description, alpha, true);

            if (alpha)
            {
                //Create no depth check technique
                Technique technique = material.Value.createTechnique();
                technique.setLodIndex(1);
                technique.createPass();
                createMaterial(technique, description, alpha, false);
            }

            //If we have an indirection texture we need to seup the virtual texturing, if not no additional techniques will be created and the
            //entity must disable itself for feedback buffer rendering somehow (likely visibility mask).
            if (indirectionTex != null)
            {
                String vertexShaderName   = shaderFactory.createFeedbackVertexProgram(indirectionTex.FeedbackBufferVPName, description.NumHardwareBones, description.NumHardwarePoses);
                String fragmentShaderName = shaderFactory.createFeedbackBufferFP(indirectionTex.FeedbackBufferFPName);
                indirectionTex.setupFeedbackBufferTechnique(material.Value, vertexShaderName);

                int count = 0;
                if (!indirectionTextureUsageCounts.TryGetValue(indirectionTex.Id, out count))
                {
                    indirectionTextureUsageCounts.Add(indirectionTex.Id, 0);
                }
                else
                {
                    indirectionTextureUsageCounts[indirectionTex.Id] = count + 1;
                }
            }

            material.Value.compile();
            material.Value.load();

            createdMaterials.Add(material.Value, new MaterialInfo(material.Value, indirectionTex));

            return(material);
        }
        private Pass createDepthPass(Technique technique, MaterialDescription description, bool alpha, bool depthCheck)
        {
            var pass = technique.getPass(0); //Make sure technique has one pass already defined

            if ((alpha || description.HasOpacityValue) && depthCheck)
            {
                //Setup depth check pass
                pass.setColorWriteEnabled(false);
                pass.setDepthBias(-1.0f);
                pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA);

                pass.setVertexProgram(shaderFactory.createDepthCheckVertexProgram("DepthCheckVP", description.NumHardwareBones, description.NumHardwarePoses));
                pass.setFragmentProgram(shaderFactory.createHiddenFP("HiddenFP"));

                pass = technique.createPass(); //Get another pass
            }
            return(pass);
        }
        //--------------------------------------
        //Specific material creation funcs
        //--------------------------------------
        private IndirectionTexture createUnifiedMaterial(Technique technique, MaterialDescription description, bool alpha, bool depthCheck)
        {
            //Create depth check pass if needed
            var pass = createDepthPass(technique, description, alpha, depthCheck);

            if (description.NoDepthWriteAlpha)
            {
                pass.setDepthWriteEnabled(false);
                pass.setDepthCheckEnabled(true);
                pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA);
                pass.setDepthFunction(CompareFunction.CMPF_LESS_EQUAL);
            }
            else
            {
                pass.setDepthWriteEnabled(description.EnableDepthWrite);
                pass.setDepthCheckEnabled(description.EnableDepthCheck);
                pass.setSceneBlending(description.SceneBlending);
                pass.setDepthFunction(description.DepthFunction);
            }

            //Setup this pass
            setupCommonPassAttributes(description, alpha, pass);

            //Setup shaders
            TextureMaps textureMaps;

            pass.setFragmentProgram(shaderFactory.createFragmentProgram(description, alpha, out textureMaps));
            pass.setVertexProgram(shaderFactory.createUnifiedVertexProgram(description, textureMaps));

            if ((textureMaps & TextureMaps.Opacity) == TextureMaps.Opacity || description.HasOpacityValue)
            {
                pass.setSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA);
                pass.setDepthFunction(CompareFunction.CMPF_LESS_EQUAL);
            }

            //Setup Textures
            IndirectionTexture indirectionTex = null;

            switch (textureMaps)
            {
            case TextureMaps.Normal:
                indirectionTex = setupNormalTextures(description, pass);
                break;

            case TextureMaps.Normal | TextureMaps.Diffuse:
                indirectionTex = setupNormalDiffuseTextures(description, pass);
                break;

            case TextureMaps.Normal | TextureMaps.Diffuse | TextureMaps.Specular:
                indirectionTex = setupNormalDiffuseSpecularTextures(description, pass);
                break;

            case TextureMaps.Normal | TextureMaps.Diffuse | TextureMaps.Opacity:
                indirectionTex = setupNormalDiffuseOpacityTextures(description, pass);
                break;

            case TextureMaps.Normal | TextureMaps.Diffuse | TextureMaps.Opacity | TextureMaps.Specular:
                indirectionTex = setupNormalDiffuseSpecularOpacityTextures(description, pass);
                break;

            case TextureMaps.Normal | TextureMaps.Opacity:
                indirectionTex = setupNormalOpacityTextures(description, pass);
                break;
            }

            using (var gpuParams = pass.getFragmentProgramParameters())
            {
                if (indirectionTex != null)
                {
                    virtualTextureManager.setupVirtualTextureFragmentParams(gpuParams, indirectionTex);
                }

                if (description.HasGlossMap)
                {
                    gpuParams.Value.setNamedConstant("glossyStart", description.GlossyStart);
                    gpuParams.Value.setNamedConstant("glossyRange", description.GlossyRange);
                }

                if ((textureMaps & TextureMaps.Opacity) == 0 && description.HasOpacityValue)
                {
                    gpuParams.Value.setNamedConstant("opacity", description.OpacityValue);
                }
            }

            return(indirectionTex);
        }
Пример #5
0
 private Pass(IntPtr pass, Technique parent)
 {
     this.pass   = pass;
     this.parent = parent;
 }