コード例 #1
0
        public virtual int BindTexture(STGenericMatTexture tex, ShaderProgram shader)
        {
            GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1);
            GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID);

            string activeTex = tex.Name;

            foreach (var container in TextureContainers)
            {
                if (container.Textures.ContainsKey(activeTex))
                {
                    BindGLTexture(tex, shader, container.Textures[activeTex]);
                    return(tex.textureUnit + 1);
                }
            }

            return(tex.textureUnit + 1);
        }
コード例 #2
0
ファイル: LM2_Render.cs プロジェクト: week9/Switch-Toolbox
        public override int BindTexture(STGenericMatTexture tex, ShaderProgram shader)
        {
            GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1);
            GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID);

            string activeTex = tex.Name;

            foreach (var texture in TextureList)
            {
                if (texture.ID2.ToString("x") == tex.Name)
                {
                    BindGLTexture(tex, shader, texture);
                    return(tex.textureUnit + 1);
                }
            }

            return(tex.textureUnit + 1);
        }
コード例 #3
0
        public override int BindTexture(STGenericMatTexture tex, ShaderProgram shader)
        {
            GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1);
            GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID);

            string activeTex = tex.Name;

            foreach (var texture in TextureList)
            {
                if (TextureList.IndexOf(texture) == ((CMB.CMBTextureMapWrapper)tex).TextureIndex)
                {
                    BindGLTexture(tex, shader, TextureList[((CMB.CMBTextureMapWrapper)tex).TextureIndex]);
                    return(tex.textureUnit + 1);
                }
            }

            return(tex.textureUnit + 1);
        }
コード例 #4
0
ファイル: GFBMDL_Render.cs プロジェクト: week9/Switch-Toolbox
        private static void BindGLTexture(STGenericMatTexture tex, ShaderProgram shader, STGenericTexture texture)
        {
            if (tex.Type == STGenericMatTexture.TextureType.Diffuse)
            {
                shader.SetInt("RedChannel", (int)texture.RedChannel);
                shader.SetInt("GreenChannel", (int)texture.GreenChannel);
                shader.SetInt("BlueChannel", (int)texture.BlueChannel);
                shader.SetInt("AlphaChannel", (int)texture.AlphaChannel);
            }

            //     GL.ActiveTexture(TextureUnit.Texture0 + texid);
            GL.BindTexture(TextureTarget.Texture2D, texture.RenderableTex.TexID);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)STGenericMatTexture.wrapmode[tex.WrapModeS]);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)STGenericMatTexture.wrapmode[tex.WrapModeT]);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)STGenericMatTexture.minfilter[tex.MinFilter]);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)STGenericMatTexture.magfilter[tex.MagFilter]);
            GL.TexParameter(TextureTarget.Texture2D, (TextureParameterName)ExtTextureFilterAnisotropic.TextureMaxAnisotropyExt, 0.0f);
        }
コード例 #5
0
ファイル: GFBMDL_Render.cs プロジェクト: week9/Switch-Toolbox
        public static int BindTexture(STGenericMatTexture tex, ShaderProgram shader)
        {
            GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1);
            GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID);

            string activeTex = tex.Name;

            foreach (var bntx in PluginRuntime.bntxContainers)
            {
                if (bntx.Textures.ContainsKey(activeTex))
                {
                    BindBNTX(bntx, tex, shader, activeTex);
                    return(tex.textureUnit + 1);
                }
            }

            return(tex.textureUnit + 1);
        }
コード例 #6
0
        public virtual int BindTexture(STGenericMatTexture tex, ShaderProgram shader)
        {
            GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1);
            GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID);

            string activeTex = tex.Name;

            foreach (var container in TextureContainers)
            {
                for (int i = 0; i < container.TextureList?.Count; i++)
                {
                    if (activeTex == container.TextureList[i].Text)
                    {
                        BindGLTexture(tex, shader, container.TextureList[i]);
                        return(tex.textureUnit + 1);
                    }
                }
            }

            return(tex.textureUnit + 1);
        }
コード例 #7
0
        public static int BindTexture(STGenericMatTexture tex)
        {
            GL.ActiveTexture(TextureUnit.Texture0 + tex.textureUnit + 1);
            GL.BindTexture(TextureTarget.Texture2D, RenderTools.defaultTex.RenderableTex.TexID);

            string activeTex = tex.Name;

            foreach (var bcresTexContainer in PluginRuntime.bcresTexContainers)
            {
                if (bcresTexContainer.ResourceNodes.ContainsKey(activeTex))
                {
                    TXOBWrapper txob = (TXOBWrapper)bcresTexContainer.ResourceNodes[activeTex];

                    if (txob.RenderableTex == null || !txob.RenderableTex.GLInitialized)
                    {
                        txob.LoadOpenGLTexture();
                    }

                    BindGLTexture(tex, txob.RenderableTex.TexID);
                    break;
                }
            }
            return(tex.textureUnit + 1);
        }
コード例 #8
0
        private BcresTextureMapWrapper CreateGenericMatTexture(int textureUnit, BCRES bcres, TextureMapInfo TextureMapInfo)
        {
            STGenericMatTexture tex1 = new STGenericMatTexture();
            var TexRef  = TextureMapInfo.TextureRef;
            var Sampler = TextureMapInfo.Sampler;

            tex1.textureUnit = textureUnit++;
            tex1.Name        = TexRef.Reference.Name;
            tex1.Type        = STGenericMatTexture.TextureType.Diffuse;
            TextureMaps.Add(tex1);

            switch (TextureMapInfo.WrapU)
            {
            case PICATextureWrap.Repeat: tex1.wrapModeS = 0; break;

            case PICATextureWrap.Mirror: tex1.wrapModeS = 1; break;

            case PICATextureWrap.ClampToEdge: tex1.wrapModeS = 2; break;

            case PICATextureWrap.ClampToBorder: tex1.wrapModeS = 2; break;
            }
            switch (TextureMapInfo.WrapV)
            {
            case PICATextureWrap.Repeat: tex1.wrapModeT = 0; break;

            case PICATextureWrap.Mirror: tex1.wrapModeT = 1; break;

            case PICATextureWrap.ClampToEdge: tex1.wrapModeT = 2; break;

            case PICATextureWrap.ClampToBorder: tex1.wrapModeT = 2; break;
            }

            switch (TextureMapInfo.MagFilter)
            {
            case PICATextureFilter.Linear: tex1.magFilter = 0; break;

            case PICATextureFilter.Nearest: tex1.magFilter = 1; break;
            }

            switch (TextureMapInfo.MinFilter)
            {
            case PICATextureFilter.Linear: tex1.minFilter = 0; break;

            case PICATextureFilter.Nearest: tex1.minFilter = 1; break;
            }

            switch (TextureMapInfo.MipFilter)
            {
            case PICATextureFilter.Linear: tex1.mipDetail = 0; break;

            case PICATextureFilter.Nearest: tex1.mipDetail = 1; break;
            }

            switch (TextureMapInfo.WrapV)
            {
            case PICATextureWrap.Repeat: tex1.wrapModeT = 0; break;

            case PICATextureWrap.Mirror: tex1.wrapModeT = 1; break;

            case PICATextureWrap.ClampToEdge: tex1.wrapModeT = 2; break;

            case PICATextureWrap.ClampToBorder: tex1.wrapModeT = 2; break;
            }


            var wrapperTexMap = new BcresTextureMapWrapper(bcres, TextureMapInfo, tex1);

            return(wrapperTexMap);
        }
コード例 #9
0
        private void TextureUniform(ShaderProgram shader, STGenericMaterial mat, bool hasTex, string name, STGenericMatTexture mattex)
        {
            if (mattex.textureState == STGenericMatTexture.TextureState.Binded)
            {
                return;
            }

            // Bind the texture and create the uniform if the material has the right textures.
            if (hasTex)
            {
                GL.Uniform1(shader[name], BindTexture(mattex, shader));
            }
        }
コード例 #10
0
            public void Read(FileReader reader, LM2_ARCADE_Model root)
            {
                Skeleton         = new STSkeleton();
                DrawableRenderer = new GenericModelRenderer();
                root.DrawableContainer.Drawables.Add(Skeleton);
                root.DrawableContainer.Drawables.Add(DrawableRenderer);

                reader.ReadSignature(4, "VM61");
                ushort Type    = reader.ReadUInt16();
                ushort Unknown = reader.ReadUInt16();

                if (Type == 0)
                {
                }
                else if ((Type == 1))
                {
                    throw new Exception("Animation files not supported yet!");
                }
                else
                {
                    throw new Exception("Unknown type found! " + Type);
                }

                Alignment = reader.ReadUInt32();
                uint  Padding       = reader.ReadUInt32();
                ulong MaterialCount = reader.ReadUInt64();

                HeaderSize = reader.ReadUInt64();
                ulong TextureMapsCount  = reader.ReadUInt64();
                ulong TextureMapsOffset = reader.ReadUInt64();

                ulong BoneCount       = reader.ReadUInt64();
                ulong BoneOffset      = reader.ReadUInt64();
                ulong FirstNodeOffset = reader.ReadUInt64(); //Either an offset or the total size of section up to the node
                ulong LinkNodeCount   = reader.ReadUInt64();
                ulong LinkNodeOffset  = reader.ReadUInt64();
                ulong TotalNodeCount  = reader.ReadUInt64();
                ulong TotalNodeOffset = reader.ReadUInt64();
                ulong Padding2        = reader.ReadUInt64();

                root.Nodes.Add("Materials");
                root.Nodes.Add("Root");
                root.Nodes.Add("All Nodes");

                long pos = reader.Position;

                if (TextureMapsOffset != 0)
                {
                    reader.SeekBegin(TextureMapsOffset);
                    for (int i = 0; i < (int)TextureMapsCount; i++)
                    {
                        TextureMaps.Add(reader.ReadNameOffset(false, typeof(ulong)));
                    }
                }

                reader.SeekBegin(pos);
                for (int i = 0; i < (int)MaterialCount; i++)
                {
                    Material mat = new Material();
                    mat.Read(reader);
                    Materials.Add(mat);

                    var genericMat = new STGenericMaterial();
                    genericMat.Text = mat.Name;

                    for (int t = 0; t < mat.TextureIndices.Length; t++)
                    {
                        if (mat.TextureIndices[t] != -1)
                        {
                            Console.WriteLine("TextureIndices " + mat.TextureIndices[t]);
                            string Texture = TextureMaps[mat.TextureIndices[t]];

                            var textureMap = new STGenericMatTexture();
                            textureMap.Name = Texture;
                            genericMat.TextureMaps.Add(textureMap);

                            if (Texture.EndsWith("col.dds"))
                            {
                                textureMap.Type = STGenericMatTexture.TextureType.Diffuse;
                            }
                            if (Texture.EndsWith("col.mot"))
                            {
                                textureMap.Type = STGenericMatTexture.TextureType.Diffuse;
                            }
                        }
                    }

                    root.Nodes[0].Nodes.Add(genericMat);
                }

                if (TotalNodeCount != 0)
                {
                    for (int i = 0; i < (int)TotalNodeCount; i++)
                    {
                        reader.SeekBegin((int)TotalNodeOffset + (i * 16));

                        string NodeName = reader.ReadNameOffset(false, typeof(ulong));
                        var    Offset   = reader.ReadUInt64();

                        Console.WriteLine($"{NodeName}");

                        if (Offset != 0)
                        {
                            reader.SeekBegin(Offset);
                            Node node = new Node();
                            node.Name = NodeName;
                            node.Read(reader);
                            TotalNodes.Add(node);
                        }
                    }
                }

                if (BoneCount != 0)
                {
                    for (int i = 0; i < (int)BoneCount; i++)
                    {
                        reader.SeekBegin((int)BoneOffset + (i * 16));

                        string NodeName = reader.ReadNameOffset(false, typeof(ulong));
                        ulong  Offset   = reader.ReadUInt64();

                        if (Offset != 0)
                        {
                            reader.SeekBegin(Offset);
                            Node node = new Node();
                            node.Name = NodeName;
                            node.Read(reader);
                            BoneList.Add(node); //This list is for mapping to meshes
                        }
                    }
                }

                foreach (var node in TotalNodes)
                {
                    // TreeNode lowerWrapper = new TreeNode($"{node.Name}");
                    // root.Nodes[3].Nodes.Add(lowerWrapper);

                    LoadChildern(TotalNodes, node, root.Nodes[2]);
                }

                if (FirstNodeOffset != 0)
                {
                    reader.SeekBegin(FirstNodeOffset);
                    ulong NodeOffset = reader.ReadUInt64();
                    reader.SeekBegin(NodeOffset);
                    Node node = new Node();
                    node.Name = GetNodeName(TotalNodes, node);
                    node.Read(reader);

                    LoadBones(TotalNodes, node, root.Nodes[1]);
                }



                if (LinkNodeCount != 0)
                {
                    root.Nodes.Add("Links");

                    for (int i = 0; i < (int)LinkNodeCount; i++)
                    {
                        TreeNode linkWrapper = new TreeNode($"Link {i}");
                        root.Nodes[3].Nodes.Add(linkWrapper);

                        reader.SeekBegin((int)LinkNodeOffset + (i * 16));

                        ulong NodeOffset1 = reader.ReadUInt64();
                        ulong NodeOffset2 = reader.ReadUInt64();

                        reader.SeekBegin(NodeOffset1);
                        Node node1 = new Node();
                        node1.Name = GetNodeName(TotalNodes, node1);
                        node1.Read(reader);

                        reader.SeekBegin(NodeOffset2);
                        Node node2 = new Node();
                        node2.Name = GetNodeName(TotalNodes, node1);
                        node2.Read(reader);

                        //  LoadChildern(TotalNodes, node1, linkWrapper);
                        // LoadChildern(TotalNodes, node2, linkWrapper);

                        LinkNodes.Add(Tuple.Create(node1, node2));
                    }
                }

                Skeleton.update();
                Skeleton.reset();
            }
コード例 #11
0
        public void DrawUVs(int PolygonGroupIndex, int UvChannelIndex, List <STGenericObject> genericObjects, STGenericMatTexture textureMap)
        {
            if (genericObjects.Count == 0)
            {
                return;
            }

            foreach (var genericObject in genericObjects)
            {
                int divisions = 4;
                int lineWidth = 1;

                Color uvColor   = Runtime.UVEditor.UVColor;
                Color gridColor = Color.Black;

                List <int> f = new List <int>();
                int        displayFaceSize = 0;
                if (genericObject.lodMeshes.Count > 0)
                {
                    f = genericObject.lodMeshes[0].getDisplayFace();
                    displayFaceSize = genericObject.lodMeshes[0].displayFaceSize;
                }
                if (genericObject.PolygonGroups.Count > 0)
                {
                    if (PolygonGroupIndex == -1)
                    {
                        foreach (var group in genericObject.PolygonGroups)
                        {
                            f.AddRange(group.GetDisplayFace());
                            displayFaceSize += group.displayFaceSize;
                        }
                    }
                    else
                    {
                        if (genericObject.PolygonGroups.Count > PolygonGroupIndex)
                        {
                            f = genericObject.PolygonGroups[PolygonGroupIndex].GetDisplayFace();
                            displayFaceSize = genericObject.PolygonGroups[PolygonGroupIndex].displayFaceSize;
                        }
                    }
                }

                Console.WriteLine($"displayFaceSize {f.Count} {displayFaceSize} {genericObject.vertices.Count }");

                for (int v = 0; v < displayFaceSize; v += 3)
                {
                    if (displayFaceSize < 3 || genericObject.vertices.Count < 3)
                    {
                        return;
                    }

                    Vector2 v1 = new Vector2(0);
                    Vector2 v2 = new Vector2(0);
                    Vector2 v3 = new Vector2(0);

                    if (f.Count < v + 2)
                    {
                        continue;
                    }

                    if (UvChannelIndex == 0)
                    {
                        v1 = genericObject.vertices[f[v]].uv0;
                        v2 = genericObject.vertices[f[v + 1]].uv0;
                        v3 = genericObject.vertices[f[v + 2]].uv0;
                    }
                    if (UvChannelIndex == 1)
                    {
                        v1 = genericObject.vertices[f[v]].uv1;
                        v2 = genericObject.vertices[f[v + 1]].uv1;
                        v3 = genericObject.vertices[f[v + 2]].uv1;
                    }
                    if (UvChannelIndex == 2)
                    {
                        v1 = genericObject.vertices[f[v]].uv2;
                        v2 = genericObject.vertices[f[v + 1]].uv2;
                        v3 = genericObject.vertices[f[v + 2]].uv2;
                    }

                    v1 = new Vector2(v1.X, 1 - v1.Y);
                    v2 = new Vector2(v2.X, 1 - v2.Y);
                    v3 = new Vector2(v3.X, 1 - v3.Y);

                    DrawUVTriangleAndGrid(v1, v2, v3, divisions, uvColor, lineWidth, gridColor, textureMap);
                }
            }
        }
コード例 #12
0
        private void DrawUVTriangleAndGrid(Vector2 v1, Vector2 v2, Vector2 v3, int divisions,
                                           Color uvColor, int lineWidth, Color gridColor, STGenericMatTexture textureMap)
        {
            GL.UseProgram(0);

            float   bounds  = 1;
            Vector2 scaleUv = new Vector2(2);
            Vector2 transUv = new Vector2(-1f);

            if (textureMap != null && textureMap.Transform != null)
            {
                scaleUv *= textureMap.Transform.Scale;
                transUv += textureMap.Transform.Translate;
            }

            //Disable textures so they don't affect color
            GL.Disable(EnableCap.Texture2D);
            DrawUvTriangle(v1, v2, v3, uvColor, scaleUv, transUv);

            // Draw Grid
            GL.Color3(gridColor);
            GL.LineWidth(1);

            //  DrawHorizontalGrid(divisions, bounds, scaleUv);
            // DrawVerticalGrid(divisions, bounds, scaleUv);
        }