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); } }
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; }
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); } } }