private static void SetTextureUniforms(FMAT mat, FSHP m, SHShaderProgram shader) { for (int t = 0; t < mat.TextureMaps.Count; t++) { MatTexture matex = (MatTexture)mat.TextureMaps[t]; mat.HasDiffuseMap = TextureUniform(shader, mat, $"tex_map{t}", matex); } }
private static bool BindBNTX(BNTX bntx, MatTexture tex, SHShaderProgram shader, string activeTex) { if (bntx.Textures[activeTex].RenderableTex == null || !bntx.Textures[activeTex].RenderableTex.GLInitialized) { bntx.Textures[activeTex].LoadOpenGLTexture(); } BindGLTexture(tex, shader, bntx.Textures[activeTex]); return(bntx.Textures[activeTex].RenderableTex.GLInitialized); }
private static bool TextureUniform(SHShaderProgram shader, FMAT mat, string name, MatTexture mattex) { if (mattex.textureState == STGenericMatTexture.TextureState.Binded) { return(true); } // Bind the texture and create the uniform if the material has the right textures. BindTexture(mattex, mat, shader, mat.GetResFileU() != null); return(true); }
private static bool BindFTEX(BFRESGroupNode ftexContainer, MatTexture tex, SHShaderProgram shader, string activeTex) { FTEX ftex = (FTEX)ftexContainer.ResourceNodes[activeTex]; if (ftex.RenderableTex == null || !ftex.RenderableTex.GLInitialized) { ftex.LoadOpenGLTexture(); } BindGLTexture(tex, shader, ftex); return(ftex.RenderableTex.GLInitialized); }
private static void BindGLTexture(MatTexture tex, SHShaderProgram shader, STGenericTexture texture) { //If the texture is still not initialized then return if (!texture.RenderableTex.GLInitialized) { return; } // GL.ActiveTexture(TextureUnit.Texture0 + texid); GL.BindTexture(TextureTarget.Texture2D, texture.RenderableTex.TexID); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)MatTexture.wrapmode[tex.WrapModeS]); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)MatTexture.wrapmode[tex.WrapModeT]); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)MatTexture.minfilter[tex.MinFilter]); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)MatTexture.magfilter[tex.MagFilter]); GL.TexParameter(TextureTarget.Texture2D, (TextureParameterName)ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt, 0.0f); }
private void SetVertexAttributes(FSHP m, SHShaderProgram shader) { GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_position); GL.VertexAttribPointer(shader.GetAttribute("aPosition"), 3, VertexAttribPointerType.Float, false, DisplayVertex.Size, 0); GL.VertexAttribPointer(shader.GetAttribute("aNormal"), 3, VertexAttribPointerType.Float, false, DisplayVertex.Size, 12); GL.VertexAttribPointer(shader.GetAttribute("aBlendWeight"), 4, VertexAttribPointerType.Float, false, DisplayVertex.Size, 24); GL.VertexAttribIPointer(shader.GetAttribute("aBlendIndex"), 4, VertexAttribIntegerType.Int, DisplayVertex.Size, new IntPtr(40)); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord0"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 56); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord1"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 64); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord2"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 72); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord3"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 80); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord4"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 88); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord5"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 96); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord6"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 104); GL.VertexAttribPointer(shader.GetAttribute("aTexCoord7"), 2, VertexAttribPointerType.Float, false, DisplayVertex.Size, 112); GL.VertexAttribPointer(shader.GetAttribute("aColor0"), 4, VertexAttribPointerType.Float, false, DisplayVertex.Size, 120); GL.VertexAttribPointer(shader.GetAttribute("aColor1"), 4, VertexAttribPointerType.Float, false, DisplayVertex.Size, 136); GL.BindBuffer(BufferTarget.ElementArrayBuffer, ibo_elements); }
private static void SetUniformData(FMAT mat, SHShaderProgram shader, string propertyName) { if (mat.shaderassign.options.ContainsKey(propertyName)) { float value = float.Parse(mat.shaderassign.options[propertyName]); shader.SetFloat(propertyName, value); } if (mat.matparam.ContainsKey(propertyName)) { if (mat.matparam[propertyName].Type == ShaderParamType.Float) { if (mat.anims.ContainsKey(propertyName)) { mat.matparam[propertyName].ValueFloat[0] = mat.anims[propertyName][0]; } shader.SetFloat(propertyName, mat.matparam[propertyName].ValueFloat[0]); } if (mat.matparam[propertyName].Type == ShaderParamType.Float2) { if (mat.anims.ContainsKey(propertyName)) { mat.matparam[propertyName].ValueFloat = new float[2] { mat.anims[propertyName][0], mat.anims[propertyName][1] }; } shader.SetVec2(propertyName, Utils.ToVec2(mat.matparam[propertyName].ValueFloat)); } if (mat.matparam[propertyName].Type == ShaderParamType.Float3) { if (mat.anims.ContainsKey(propertyName)) { mat.matparam[propertyName].ValueFloat = new float[3] { mat.anims[propertyName][0], mat.anims[propertyName][1], mat.anims[propertyName][2] }; } shader.SetVec3(propertyName, Utils.ToVec3(mat.matparam[propertyName].ValueFloat)); } if (mat.matparam[propertyName].Type == ShaderParamType.Float4) { if (mat.anims.ContainsKey(propertyName)) { mat.matparam[propertyName].ValueFloat = new float[4] { mat.anims[propertyName][0], mat.anims[propertyName][1], mat.anims[propertyName][2], mat.anims[propertyName][3] }; } shader.SetVec4(propertyName, Utils.ToVec4(mat.matparam[propertyName].ValueFloat)); } if (mat.matparam[propertyName].Type == ShaderParamType.TexSrt) { // Vector 2 Scale // 1 roation float // Vector2 translate TexSrt texSRT = mat.matparam[propertyName].ValueTexSrt; shader.SetVec2("SRT_Scale", Utils.ToVec2(texSRT.Scaling)); shader.SetFloat("SRT_Rotate", texSRT.Rotation); shader.SetVec2("SRT_Translate", Utils.ToVec2(texSRT.Translation)); } //MTA SRT if (propertyName == "texsrt0" && mat.shaderassign.ShaderArchive == "ssg") { TexSrt texSRT = mat.matparam[propertyName].ValueTexSrt; shader.SetVec2("SRT_Scale", Utils.ToVec2(texSRT.Scaling)); shader.SetFloat("SRT_Rotate", texSRT.Rotation); shader.SetVec2("SRT_Translate", Utils.ToVec2(texSRT.Translation)); } } if (mat.animatedMatParams.ContainsKey(propertyName)) { if (mat.animatedMatParams[propertyName].Type == ShaderParamType.Float) { if (mat.anims.ContainsKey(propertyName)) { mat.animatedMatParams[propertyName].ValueFloat[0] = mat.anims[propertyName][0]; } shader.SetFloat(propertyName, mat.animatedMatParams[propertyName].ValueFloat[0]); } if (mat.animatedMatParams[propertyName].Type == ShaderParamType.Float2) { if (mat.anims.ContainsKey(propertyName)) { mat.animatedMatParams[propertyName].ValueFloat = new float[2] { mat.anims[propertyName][0], mat.anims[propertyName][1] }; } shader.SetVec2(propertyName, Utils.ToVec2(mat.animatedMatParams[propertyName].ValueFloat)); } if (mat.animatedMatParams[propertyName].Type == ShaderParamType.Float3) { Console.WriteLine(propertyName + " " + mat.animatedMatParams[propertyName].ValueFloat); if (mat.anims.ContainsKey(propertyName)) { mat.animatedMatParams[propertyName].ValueFloat = new float[3] { mat.anims[propertyName][0], mat.anims[propertyName][1], mat.anims[propertyName][2] }; } shader.SetVec3(propertyName, Utils.ToVec3(mat.animatedMatParams[propertyName].ValueFloat)); } if (mat.animatedMatParams[propertyName].Type == ShaderParamType.Float4) { if (mat.anims.ContainsKey(propertyName)) { mat.animatedMatParams[propertyName].ValueFloat = new float[4] { mat.anims[propertyName][0], mat.anims[propertyName][1], mat.anims[propertyName][2], mat.anims[propertyName][3] }; } shader.SetVec4(propertyName, Utils.ToVec4(mat.animatedMatParams[propertyName].ValueFloat)); } if (mat.animatedMatParams[propertyName].Type == ShaderParamType.TexSrt) { // Vector 2 Scale // 1 roation float // Vector2 translate TexSrt texSRT = mat.animatedMatParams[propertyName].ValueTexSrt; shader.SetVec2("SRT_Scale", Utils.ToVec2(texSRT.Scaling)); shader.SetFloat("SRT_Rotate", texSRT.Rotation); shader.SetVec2("SRT_Translate", Utils.ToVec2(texSRT.Translation)); } } }
private static void SetUniforms(FMAT mat, SHShaderProgram shader, FSHP m, int id) { }
private void DrawModel(GL_ControlBase control, FSHP m, FMDL mdl, bool ModelSelected) { if (m.lodMeshes[m.DisplayLODIndex].faces.Count <= 3) { return; } var mat = m.GetFMAT(); SHShaderProgram shader = SearchProgram( mat.shaderassign.ShaderArchive, mat.shaderassign.ShaderModel); if (shader == null) { return; } shader.Enable(); shader.EnableVertexAttributes(); GL.Enable(EnableCap.AlphaTest); GL.AlphaFunc(AlphaFunction.Gequal, 0.1f); // SetRenderPass(mat); // SetUniforms(mat, shader, m, m.DisplayId); // SetTextureUniforms(mat, m, shader); shader.LoadUniforms(mdl, m, mdl.Skeleton, control); SetVertexAttributes(m, shader); if (m.Checked && mdl.Skeleton.bones.Count > 0 && mdl.Skeleton.bones[m.BoneIndex].Visible && mat.Enabled) { PrimitiveType primitiveType = PrimitiveType.Triangles; switch (m.lodMeshes[m.DisplayLODIndex].PrimativeType) { case STPrimitiveType.Lines: primitiveType = PrimitiveType.Lines; break; case STPrimitiveType.LineStrips: primitiveType = PrimitiveType.LineStrip; break; case STPrimitiveType.Points: primitiveType = PrimitiveType.Points; break; case STPrimitiveType.Triangles: primitiveType = PrimitiveType.Triangles; break; } GL.DrawElements(primitiveType, m.lodMeshes[m.DisplayLODIndex].displayFaceSize, DrawElementsType.UnsignedInt, m.Offset); } shader.DisableVertexAttributes(); shader.Disable(); }
public static bool BindTexture(MatTexture tex, FMAT material, SHShaderProgram shader, bool IsWiiU) { BFRES bfres = (BFRES)material.Parent.Parent.Parent.Parent; GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1); GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID); string activeTex = tex.Name; if (tex.animatedTexName != "") { activeTex = tex.animatedTexName; } if (IsWiiU) { if (bfres.HasTextures) { var ftexCont = bfres.GetFTEXContainer; if (ftexCont != null) { if (ftexCont.ResourceNodes.ContainsKey(activeTex)) { return(BindFTEX(ftexCont, tex, shader, activeTex)); } } } foreach (var ftexContainer in PluginRuntime.ftexContainers) { if (ftexContainer.ResourceNodes.ContainsKey(activeTex)) { return(BindFTEX(ftexContainer, tex, shader, activeTex)); } } } else { if (bfres.HasTextures) { var bntx = bfres.GetBNTX; if (bntx != null) { if (bntx.Textures.ContainsKey(activeTex)) { return(BindBNTX(bntx, tex, shader, activeTex)); } } } foreach (var bntx in PluginRuntime.bntxContainers) { if (bntx.Textures.ContainsKey(activeTex)) { return(BindBNTX(bntx, tex, shader, activeTex)); } } } return(true); }