Exemplo n.º 1
0
        private static void SetBlendState(RMaterial meshMaterial, MatlAttribute a)
        {
            var blendState = (MatlAttribute.MatlBlendState)a.DataObject;

            // TODO: Does "src factor" toggle something in the shader?
            meshMaterial.BlendSrc = BlendingFactor.One;
            if (blendState.Unk1 == 0)
            {
                meshMaterial.BlendSrc = BlendingFactor.Zero;
            }

            if (blendState.BlendFactor2 == 1)
            {
                meshMaterial.BlendDst = BlendingFactor.One;
            }
            else if (blendState.BlendFactor2 == 2)
            {
                meshMaterial.BlendDst = BlendingFactor.SrcAlpha;
            }
            else if (blendState.BlendFactor2 == 6)
            {
                meshMaterial.BlendDst = BlendingFactor.OneMinusSrcAlpha;
            }

            // TODO: Do both need to be set?
            meshMaterial.UseAlphaSampleCoverage = blendState.Unk7 == 1 || blendState.Unk8 == 1;
        }
Exemplo n.º 2
0
        private static void SetSamplerInformation(RMaterial material, MatlAttribute a)
        {
            var samplerStruct = (MatlAttribute.MatlSampler)a.DataObject;

            SamplerObject sampler = new SamplerObject
            {
                TextureWrapS = MatlToGl.GetWrapMode(samplerStruct.WrapS),
                TextureWrapT = MatlToGl.GetWrapMode(samplerStruct.WrapT),
                TextureWrapR = MatlToGl.GetWrapMode(samplerStruct.WrapR),
                MagFilter    = MatlToGl.GetMagFilter(samplerStruct.MagFilter),
                MinFilter    = MatlToGl.GetMinFilter(samplerStruct.MinFilter)
            };

            GL.SamplerParameter(sampler.Id, SamplerParameterName.TextureLodBias, samplerStruct.LodBias);

            if (samplerStruct.Unk6 == 2 && RenderSettings.Instance.EnableExperimental)
            {
                GL.SamplerParameter(sampler.Id, SamplerParameterName.TextureMaxAnisotropyExt, (float)samplerStruct.MaxAnisotropy);
            }
            else
            {
                GL.SamplerParameter(sampler.Id, SamplerParameterName.TextureMaxAnisotropyExt, 1.0f);
            }

            material.samplerByParamId[a.ParamId] = sampler;
        }
Exemplo n.º 3
0
        private static void SetTextureParameter(RMaterial meshMaterial, MatlAttribute a)
        {
            // Don't make texture names case sensitive.
            var textureName = ((MatlAttribute.MatlString)a.DataObject).Text.ToLower();

            meshMaterial.textureNameByParamId[a.ParamId] = textureName;
        }
Exemplo n.º 4
0
        private static void SetRasterizerState(RMaterial meshMaterial, MatlAttribute a)
        {
            var rasterizerState = (MatlAttribute.MatlRasterizerState)a.DataObject;

            meshMaterial.DepthBias = rasterizerState.DepthBias;
            meshMaterial.CullMode  = MatlToGl.GetCullMode(rasterizerState.CullMode);
        }
Exemplo n.º 5
0
        public void SetMaterialUniforms(Shader shader, RMaterial previousMaterial)
        {
            // TODO: This code could be moved to the constructor.
            if (genericMaterial == null || shouldUpdateTextures)
            {
                genericMaterial      = CreateGenericMaterial();
                shouldUpdateTextures = true;
            }

            if (uniformBlock == null)
            {
                uniformBlock = new UniformBlock(shader, "MaterialParams")
                {
                    BlockBinding = 1
                };
                SetMaterialParams(uniformBlock);
            }

            if (shouldUpdateUniformBlock)
            {
                SetMaterialParams(uniformBlock);
                shouldUpdateUniformBlock = false;
            }

            // This needs to be updated more than once.
            AddDebugParams(uniformBlock);

            // Update the uniform values.
            genericMaterial.SetShaderUniforms(shader, previousMaterial?.genericMaterial);
            uniformBlock.BindBlock(shader);
        }
Exemplo n.º 6
0
        private static void SetBlendState(RMaterial meshMaterial, MatlAttribute.MatlBlendState blendState)
        {
            meshMaterial.SourceColor      = blendState.SourceColor.ToOpenTk();
            meshMaterial.DestinationColor = blendState.DestinationColor.ToOpenTk();

            meshMaterial.EnableAlphaSampleCoverage = blendState.EnableAlphaSampleToCoverage != 0;
        }
Exemplo n.º 7
0
 private static void SetRasterizerState(RMaterial meshMaterial, MatlAttribute.MatlRasterizerState rasterizerState)
 {
     meshMaterial.DepthBias         = rasterizerState.DepthBias;
     meshMaterial.CullMode          = rasterizerState.CullMode.ToOpenTk();
     meshMaterial.EnableFaceCulling = rasterizerState.CullMode != MatlCullMode.None;
     meshMaterial.FillMode          = rasterizerState.FillMode.ToOpenTk();
 }
Exemplo n.º 8
0
        public static RMaterial CreateMaterial(MatlEntry currentEntry, int index, Dictionary <string, RTexture> textureByName)
        {
            RMaterial meshMaterial = new RMaterial(currentEntry.MaterialLabel, currentEntry.ShaderLabel, index)
            {
                TextureByName = textureByName
            };

            foreach (var pair in currentEntry.GetTextures())
            {
                // Don't make texture names case sensitive.
                meshMaterial.UpdateTexture(pair.Key, pair.Value.ToLower());
            }

            foreach (var pair in currentEntry.GetFloats())
            {
                meshMaterial.UpdateFloat(pair.Key, pair.Value);
            }

            foreach (var pair in currentEntry.GetVectors())
            {
                meshMaterial.UpdateVec4(pair.Key, pair.Value.ToOpenTk());
            }

            foreach (var pair in currentEntry.GetBools())
            {
                meshMaterial.UpdateBoolean(pair.Key, pair.Value);
            }

            foreach (var pair in currentEntry.GetSamplers())
            {
                meshMaterial.UpdateSampler(pair.Key, pair.Value.ToSamplerData());
            }

            foreach (var pair in currentEntry.GetRasterizerStates())
            {
                SetRasterizerState(meshMaterial, pair.Value);
            }

            foreach (var pair in currentEntry.GetBlendStates())
            {
                SetBlendState(meshMaterial, pair.Value);
            }

            return(meshMaterial);
        }
Exemplo n.º 9
0
        public static RMaterial CreateMaterial(MatlEntry currentEntry, int index, Dictionary <string, RTexture> textureByName)
        {
            RMaterial meshMaterial = new RMaterial()
            {
                MaterialLabel = currentEntry.MaterialLabel,
                ShaderLabel   = currentEntry.ShaderLabel,
                Index         = index,
                TextureByName = textureByName
            };

            foreach (MatlAttribute attribute in currentEntry.Attributes)
            {
                if (attribute.DataObject == null)
                {
                    continue;
                }

                switch (attribute.DataType)
                {
                case MatlEnums.ParamDataType.String:
                    SetTextureParameter(meshMaterial, attribute);
                    break;

                case MatlEnums.ParamDataType.Vector4:
                    var vec4 = (MatlAttribute.MatlVector4)attribute.DataObject;
                    meshMaterial.vec4ByParamId[attribute.ParamId] = new Vector4(vec4.X, vec4.Y, vec4.Z, vec4.W);
                    break;

                case MatlEnums.ParamDataType.Boolean:
                    // Convert to vec4 to use with rendering.
                    // Use cyan to differentiate with no value (blue).
                    bool boolValue = (bool)attribute.DataObject;
                    meshMaterial.boolByParamId[attribute.ParamId] = boolValue;
                    break;

                case MatlEnums.ParamDataType.Float:
                    float floatValue = (float)attribute.DataObject;
                    meshMaterial.floatByParamId[attribute.ParamId] = floatValue;
                    break;

                case MatlEnums.ParamDataType.BlendState:
                    SetBlendState(meshMaterial, attribute);
                    break;

                case MatlEnums.ParamDataType.RasterizerState:
                    SetRasterizerState(meshMaterial, attribute);
                    break;
                }
            }

            foreach (MatlAttribute a in currentEntry.Attributes)
            {
                if (a.DataObject == null || a.DataType != MatlEnums.ParamDataType.Sampler)
                {
                    continue;
                }

                SetSamplerInformation(meshMaterial, a);
            }

            return(meshMaterial);
        }