Esempio n. 1
0
        public static int BindTexture(NUD.MatTexture matTexture, int hash, int loc, Dictionary <NUD.DummyTextures, Texture> dummyTextures)
        {
            if (Enum.IsDefined(typeof(NUD.DummyTextures), hash))
            {
                return(BindDummyTexture(loc, dummyTextures[(NUD.DummyTextures)hash]));
            }
            else
            {
                GL.ActiveTexture(nutTextureUnit + loc);
                GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.Id);
            }

            // Look through all loaded textures and not just the current modelcontainer.
            foreach (NUT nut in Runtime.TextureContainers)
            {
                Texture texture;
                if (nut.glTexByHashId.TryGetValue(hash, out texture))
                {
                    BindNutTexture(matTexture, texture);
                    break;
                }
            }

            return(nutTextureUnitOffset + loc);
        }
Esempio n. 2
0
        public static void SetTextureUniformsNudMatSphere(Shader shader, NUD.Material mat, Dictionary <NudEnums.DummyTexture, Texture> dummyTextures)
        {
            SetHasTextureUniforms(shader, mat);
            SetRenderModeTextureUniforms(shader);

            // The material shader just uses predefined textures from the Resources folder.
            NUD.MatTexture diffuse     = new NUD.MatTexture((int)NudEnums.DummyTexture.DummyRamp);
            NUD.MatTexture cubeMapHigh = new NUD.MatTexture((int)NudEnums.DummyTexture.StageMapHigh);

            SetHasTextureUniforms(shader, mat);
            SetRenderModeTextureUniforms(shader);

            // The type of texture can be partially determined by texture order.
            GenericMaterial textures = new GenericMaterial(nutTextureUnitOffset);

            textures.AddTexture("dif", GetSphereTexture("dif", dummyTextures));
            textures.AddTexture("spheremap", GetSphereTexture("spheremap", dummyTextures));
            textures.AddTexture("dif2", GetSphereTexture("dif2", dummyTextures));
            textures.AddTexture("dif3", GetSphereTexture("dif3", dummyTextures));
            textures.AddTexture("stagecube", GetSphereTexture("stagecube", dummyTextures));
            textures.AddTexture("cube", GetSphereTexture("cube", dummyTextures));
            textures.AddTexture("ao", GetSphereTexture("ao", dummyTextures));
            textures.AddTexture("normalMap", GetSphereTexture("normalMap", dummyTextures));
            textures.AddTexture("ramp", GetSphereTexture("ramp", dummyTextures));
            textures.AddTexture("dummyRamp", GetSphereTexture("dummyRamp", dummyTextures));

            textures.SetShaderUniforms(shader);
        }
Esempio n. 3
0
        private static void BindNutTexture(NUD.MatTexture matTexture, Texture texture)
        {
            // Set the texture's parameters based on the material settings.
            texture.Bind();
            texture.TextureWrapS = NUD.wrapmode[matTexture.wrapModeS];
            texture.TextureWrapT = NUD.wrapmode[matTexture.wrapModeT];
            texture.MinFilter    = NUD.minfilter[matTexture.minFilter];
            texture.MagFilter    = NUD.magfilter[matTexture.magFilter];

            if (OpenGLExtensions.IsAvailable("GL_EXT_texture_filter_anisotropic") && (texture is Texture2D))
            {
                TextureParameterName anisotropy = (TextureParameterName)ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt;
                GL.TexParameter(TextureTarget.Texture2D, anisotropy, 0.0f);
                if (matTexture.mipDetail == 0x4 || matTexture.mipDetail == 0x6)
                {
                    GL.TexParameter(TextureTarget.Texture2D, anisotropy, 4.0f);
                }
            }
        }
Esempio n. 4
0
        private static void SetTextureParameters(Texture target, NUD.MatTexture matTexture)
        {
            // TODO: Use a sampler object.
            // Set the texture's parameters based on the material settings.
            target.TextureWrapS = NudEnums.wrapModeByMatValue[matTexture.wrapModeS];
            target.TextureWrapT = NudEnums.wrapModeByMatValue[matTexture.wrapModeT];
            target.MinFilter    = NudEnums.minFilterByMatValue[matTexture.minFilter];
            target.MagFilter    = NudEnums.magFilterByMatValue[matTexture.magFilter];

            if (OpenGLExtensions.IsAvailable("GL_EXT_texture_filter_anisotropic") && (target is Texture2D))
            {
                target.Bind();
                TextureParameterName anisotropy = (TextureParameterName)ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt;
                GL.TexParameter(TextureTarget.Texture2D, anisotropy, 0.0f);
                if (matTexture.mipDetail == 0x4 || matTexture.mipDetail == 0x6)
                {
                    GL.TexParameter(TextureTarget.Texture2D, anisotropy, 4.0f);
                }
            }
        }
Esempio n. 5
0
        public static Texture GetTexture(int hash, NUD.MatTexture matTexture, int loc, Dictionary <NudEnums.DummyTexture, Texture> dummyTextures)
        {
            if (Enum.IsDefined(typeof(NudEnums.DummyTexture), hash))
            {
                return(dummyTextures[(NudEnums.DummyTexture)hash]);
            }

            // Look through all loaded textures and not just the current modelcontainer.
            foreach (NUT nut in Runtime.TextureContainers)
            {
                Texture texture;
                if (nut.glTexByHashId.TryGetValue(hash, out texture))
                {
                    SetTextureParameters(texture, matTexture);
                    return(texture);
                }
            }

            return(RenderTools.defaultTex);
        }
Esempio n. 6
0
        public static void SetTextureUniformsNudMatSphere(Shader shader, NUD.Material mat, Dictionary <NUD.DummyTextures, Texture> dummyTextures)
        {
            SetHasTextureUniforms(shader, mat);
            SetRenderModeTextureUniforms(shader);

            // This is necessary to prevent some models from disappearing.
            SetTextureUniformsToDefaultTexture(shader, RenderTools.defaultTex.Id);

            // The material shader just uses predefined textures from the Resources folder.
            NUD.MatTexture diffuse     = new NUD.MatTexture((int)NUD.DummyTextures.DummyRamp);
            NUD.MatTexture cubeMapHigh = new NUD.MatTexture((int)NUD.DummyTextures.StageMapHigh);

            // The order of the textures in the following section is critical.
            int textureUnitIndexOffset = 0;

            if (mat.hasDiffuse && textureUnitIndexOffset < mat.textures.Count)
            {
                GL.ActiveTexture(nutTextureUnit + textureUnitIndexOffset);
                GL.BindTexture(TextureTarget.Texture2D, NudMatSphereDrawing.sphereDifTex.Id);
                GL.Uniform1(shader.GetVertexAttributeUniformLocation("dif"), nutTextureUnitOffset + textureUnitIndexOffset);
                textureUnitIndexOffset++;
            }

            // Jigglypuff has weird eyes.
            if ((mat.Flags & 0xFFFFFFFF) == 0x9AE11163)
            {
                if (mat.hasDiffuse2)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("dif2"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasNormalMap)
                {
                    GL.ActiveTexture(nutTextureUnit + textureUnitIndexOffset);
                    GL.BindTexture(TextureTarget.Texture2D, NudMatSphereDrawing.sphereNrmMapTex.Id);
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("normalMap"), nutTextureUnitOffset + textureUnitIndexOffset);
                    textureUnitIndexOffset++;
                }
            }
            else if ((mat.Flags & 0xFFFFFFFF) == 0x92F01101)
            {
                // Final smash mats and Mega Man's eyes.
                if (mat.hasDiffuse2)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("dif2"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasRamp)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("ramp"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasDummyRamp)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("dummyRamp"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }
            }
            else
            {
                if (mat.hasSphereMap)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("spheremap"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasDiffuse2)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("dif2"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasDiffuse3)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("dif3"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                // The stage cube maps already use the appropriate dummy texture.
                if (mat.hasStageMap)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("stagecube"), BindTexture(mat.textures[textureUnitIndexOffset], mat.stageMapID, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasCubeMap)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("cube"), BindTexture(cubeMapHigh, cubeMapHigh.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasAoMap)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("ao"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasNormalMap)
                {
                    GL.ActiveTexture(nutTextureUnit + textureUnitIndexOffset);
                    GL.BindTexture(TextureTarget.Texture2D, NudMatSphereDrawing.sphereNrmMapTex.Id);
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("normalMap"), nutTextureUnitOffset + textureUnitIndexOffset);
                    textureUnitIndexOffset++;
                }

                if (mat.hasRamp)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("ramp"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, RenderTools.dummyTextures));
                    textureUnitIndexOffset++;
                }

                if (mat.hasDummyRamp)
                {
                    GL.Uniform1(shader.GetVertexAttributeUniformLocation("dummyRamp"), BindTexture(diffuse, diffuse.hash, textureUnitIndexOffset, RenderTools.dummyTextures));
                    textureUnitIndexOffset++;
                }
            }
        }