private static PrimitiveType GetPrimitiveType(STGenericObject.LOD_Mesh p)
        {
            switch (p.PrimativeType)
            {
            case STPrimitiveType.Triangles: return(PrimitiveType.Triangles);

            case STPrimitiveType.TrangleStrips: return(PrimitiveType.TriangleStrip);

            case STPrimitiveType.Quads: return(PrimitiveType.Quads);

            case STPrimitiveType.Points: return(PrimitiveType.Points);

            case STPrimitiveType.LineStrips: return(PrimitiveType.LineStrip);

            case STPrimitiveType.Lines: return(PrimitiveType.Lines);

            default: return(PrimitiveType.Triangles);
            }
        }
Ejemplo n.º 2
0
        public void LoadFile(string FileName, bool IsModel = false)
        {
            if (!IsModel)
            {
                MessageBox.Show("Not valid model csv");
                return;
            }

            string line = null;

            List <Model> models = new List <Model>();

            TextReader      csv   = new StreamReader(FileName);
            Model           model = new Model();
            STGenericObject STobj = new STGenericObject();
            Vertex          vtx   = new Vertex();

            STGenericObject.LOD_Mesh lod = new STGenericObject.LOD_Mesh();
            int Index = 0;
            int ww    = 0;

            while (true)
            {
                line = csv.ReadLine();
                if (line != null)
                {
                    if (line.StartsWith("Obj Name"))
                    {
                        model         = new Model();
                        STobj         = new STGenericObject();
                        model.Name    = line.Split(':')[1].Replace("\n", "");
                        model.subType = DataSubType.position;
                        models.Add(model);

                        STobj.ObjectName = model.Name;
                        lod               = new STGenericObject.LOD_Mesh();
                        lod.IndexFormat   = STIndexFormat.UInt16;
                        lod.PrimitiveType = STPolygonType.Triangle;
                        STobj.lodMeshes.Add(lod);
                        STobj.VertexBufferIndex = Index;
                        objects.Add(STobj);
                        Index++;
                    }
                    else if (line.StartsWith("tex_Array:"))
                    {
                    }
                    else if (line.StartsWith("Bone_Suport"))
                    {
                    }
                    else if (line.StartsWith("Color_Suport"))
                    {
                    }
                    else if (line.StartsWith("UV_Num:"))
                    {
                        int uvCount;
                        int.TryParse(line.Split(':')[1].Replace("\n", ""), out uvCount);
                        model.UVChannelCount = uvCount;
                    }
                    else if (line.StartsWith("vert_Array"))
                    {
                        model.type = DataType.vertex;
                    }
                    else if (line.StartsWith("face_Array"))
                    {
                        model.type = DataType.faces;
                    }
                    else if (line.StartsWith("bone_Array"))
                    {
                        model.type = DataType.bones;
                    }
                    else
                    {
                        string[] values = line.Replace("\n", "").Replace("\r", "").Split(',');

                        if (model.type == DataType.vertex)
                        {
                            switch (model.subType)
                            {
                            case DataSubType.position:
                                vtx = new Vertex();
                                STobj.vertices.Add(vtx);

                                STobj.HasPos = true;

                                float.TryParse(values[0], out X);
                                float.TryParse(values[1], out Y);
                                float.TryParse(values[2], out Z);
                                vtx.pos       = new Vector3(X, Y, Z);
                                model.subType = DataSubType.normals;
                                break;

                            case DataSubType.normals:
                                STobj.HasNrm = true;

                                float.TryParse(values[0], out X);
                                float.TryParse(values[1], out Y);
                                float.TryParse(values[2], out Z);
                                vtx.nrm       = new Vector3(X, Y, Z);
                                model.subType = DataSubType.colors;
                                break;

                            case DataSubType.colors:
                                STobj.HasVertColors = true;

                                float.TryParse(values[0], out X);
                                float.TryParse(values[1], out Y);
                                float.TryParse(values[2], out Z);
                                float.TryParse(values[3], out W);
                                vtx.col       = new Vector4(X / 255, Y / 255, Z / 255, W / 255);
                                model.subType = DataSubType.uv0;
                                break;

                            case DataSubType.uv0:
                                STobj.HasUv0 = true;

                                float.TryParse(values[0], out X);
                                float.TryParse(values[1], out Y);
                                vtx.uv0 = new Vector2(X, Y);
                                if (model.UVChannelCount == 1)
                                {
                                    model.subType = DataSubType.position;
                                }
                                else
                                {
                                    model.subType = DataSubType.uv1;
                                }
                                break;

                            case DataSubType.uv1:
                                STobj.HasUv1 = true;

                                float.TryParse(values[0], out X);
                                float.TryParse(values[1], out Y);
                                vtx.uv1 = new Vector2(X, Y);
                                if (model.UVChannelCount == 2)
                                {
                                    model.subType = DataSubType.position;
                                }
                                else
                                {
                                    model.subType = DataSubType.uv2;
                                }
                                break;

                            case DataSubType.uv2:
                                STobj.HasUv2 = true;

                                float.TryParse(values[0], out X);
                                float.TryParse(values[1], out Y);
                                vtx.uv2 = new Vector2(X, Y);
                                if (model.UVChannelCount == 3)
                                {
                                    model.subType = DataSubType.position;
                                }
                                else
                                {
                                    model.subType = DataSubType.uv3;
                                }
                                break;

                            case DataSubType.uv3:
                                float.TryParse(values[0], out X);
                                float.TryParse(values[1], out Y);
                                model.subType = DataSubType.position;
                                break;
                            }
                        }
                        if (model.type == DataType.faces)
                        {
                            int face;
                            foreach (string v in values)
                            {
                                var cleaned = v.Replace(".0", string.Empty);
                                int.TryParse(cleaned, out face);
                                lod.faces.Add(face - 1);
                            }
                        }
                        if (model.type == DataType.bones)
                        {
                            STobj.HasWeights = true;
                            STobj.HasIndices = true;

                            Array.Resize(ref values, values.Length - 1);

                            List <string> bones   = new List <string>();
                            List <float>  weights = new List <float>();

                            int bbs = 0;
                            foreach (string obj in values)
                            {
                                if (bbs == 0)
                                {
                                    bones.Add(obj);
                                    bbs += 1;
                                }
                                else
                                {
                                    float.TryParse(obj, out X);
                                    weights.Add(X);
                                    bbs = 0;
                                }
                            }

                            STobj.bones.Add(bones.ToArray());
                            STobj.weightsT.Add(weights.ToArray());
                        }
                    }
                }
                else
                {
                    break;
                }
            }

            if (objects[0].weightsT.Count != objects[0].vertices.Count)
            {
                throw new Exception("Incorrect vertex amount");
            }

            foreach (STGenericObject obj in objects)
            {
                obj.lodMeshes[0].GenerateSubMesh();
                for (int v = 0; v < obj.vertices.Count; v++)
                {
                    foreach (string bn in obj.bones[v])
                    {
                        obj.vertices[v].boneNames.Add(bn);
                    }
                    foreach (float f in obj.weightsT[v])
                    {
                        obj.vertices[v].boneWeights.Add(f);
                    }
                }
                foreach (Vertex v in obj.vertices)
                {
                    if (v.boneNames.Count == 1)
                    {
                        Console.WriteLine($"{v.boneNames[0]} {v.boneWeights[0]}");
                    }
                    if (v.boneNames.Count == 2)
                    {
                        Console.WriteLine($"{v.boneNames[0]} {v.boneWeights[0]} {v.boneNames[1]} {v.boneWeights[1]}");
                    }
                    if (v.boneNames.Count == 3)
                    {
                        Console.WriteLine($"{v.boneNames[0]} {v.boneWeights[0]} {v.boneNames[1]} {v.boneWeights[1]} {v.boneNames[2]} {v.boneWeights[2]}");
                    }
                    if (v.boneNames.Count == 4)
                    {
                        Console.WriteLine($"{v.boneNames[0]} {v.boneWeights[0]} {v.boneNames[1]} {v.boneWeights[1]} {v.boneNames[2]} {v.boneWeights[2]} {v.boneNames[3]} {v.boneWeights[3]}");
                    }
                }
            }

            csv.Close();
            csv = null;
        }
Ejemplo n.º 3
0
        public void Load(System.IO.Stream stream)
        {
            CanSave = true;

            //Set renderer
            Renderer = new GMX_Renderer();
            DrawableContainer.Name = FileName;
            DrawableContainer.Drawables.Add(Renderer);

            //Read file
            GMXHeader = new Header();
            GMXHeader.Read(new FileReader(stream));

            int MeshIndex = 0;

            for (int i = 0; i < GMXHeader.Meshes.Count; i++)
            {
                var renderedMesh = new GenericRenderedObject();
                renderedMesh.ImageKey         = "mesh";
                renderedMesh.SelectedImageKey = "mesh";
                renderedMesh.Checked          = true;

                if (GMXHeader.Meshes[i].VertexGroup != null)
                {
                    renderedMesh.vertices = GMXHeader.Meshes[i].VertexGroup.Vertices;
                }

                if (GMXHeader.Meshes[i].IndexGroup != null)
                {
                    renderedMesh.lodMeshes = new List <STGenericObject.LOD_Mesh>();
                    var msh = new STGenericObject.LOD_Mesh();
                    msh.PrimitiveType = STPolygonType.Triangle;
                    msh.FirstVertex   = 0;

                    /*  int VertexID = 0;
                     * for (int f = 0; f < GMXHeader.Meshes[i].VertexCount; f+= 3)
                     * {
                     *    msh.faces.AddRange(new List<int>() { VertexID + 2, VertexID + 1, VertexID });
                     *    VertexID++;
                     * }*/

                    for (int f = 0; f < GMXHeader.Meshes[i].IndexGroup.Indices.Length; f++)
                    {
                        msh.faces.AddRange(new int[3]
                        {
                            GMXHeader.Meshes[i].IndexGroup.Indices[f++],
                            GMXHeader.Meshes[i].IndexGroup.Indices[f++],
                            GMXHeader.Meshes[i].IndexGroup.Indices[f]
                        });
                    }

                    renderedMesh.lodMeshes.Add(msh);
                }

                renderedMesh.Tag = GMXHeader.Meshes[i];

                if (GMXHeader.Meshes[i].VertexGroup != null)
                {
                    renderedMesh.Text = $"Mesh ({MeshIndex++})";
                    Nodes.Add(renderedMesh);
                    Renderer.Meshes.Add(renderedMesh);
                }
            }
        }