public static void FixNormals(ref ModelConverterData data) { List <Vector3>[] normalListList = new List <Vector3> [data.VertexList.Count]; for (int i = 0; i < normalListList.Count(); i++) { normalListList[i] = new List <Vector3>(); } foreach (Triangle t in data.TriangleList) { normalListList[t.vertex1].Add(data.NormalList[t.normal1]); normalListList[t.vertex2].Add(data.NormalList[t.normal2]); normalListList[t.vertex3].Add(data.NormalList[t.normal3]); } for (int i = 0; i < data.VertexList.Count; i++) { Vector3 acc = new Vector3(); foreach (Vector3 v in normalListList[i]) { acc += v; } acc.Normalize(); Vertex TempVertex = data.VertexList[i]; TempVertex.Normal = acc; data.VertexList[i] = TempVertex; } }
public static void FixColors(ref ModelConverterData d) { for (int i = 0; i < d.TriangleList.Count; i++) { if (d.VertexList[d.TriangleList[i].vertex1].HasColor == false) { Vertex TempVertex = d.VertexList[d.TriangleList[i].vertex1]; TempVertex.Color = d.ColorList[d.TriangleList[i].Color1]; TempVertex.HasColor = true; d.VertexList[d.TriangleList[i].vertex1] = TempVertex; } else { Vertex TempVertex = d.VertexList[d.TriangleList[i].vertex1]; if (!TempVertex.Color.Equals(d.ColorList[d.TriangleList[i].Color1])) { TempVertex.Color.R = d.ColorList[d.TriangleList[i].Color1].R; TempVertex.Color.G = d.ColorList[d.TriangleList[i].Color1].G; TempVertex.Color.B = d.ColorList[d.TriangleList[i].Color1].B; TempVertex.Color.A = d.ColorList[d.TriangleList[i].Color1].A; d.TriangleList[i].vertex1 = d.VertexList.Count; d.VertexList.Add(TempVertex); } } if (d.VertexList[d.TriangleList[i].vertex2].HasColor == false) { Vertex TempVertex = d.VertexList[d.TriangleList[i].vertex2]; TempVertex.Color = d.ColorList[d.TriangleList[i].Color2]; TempVertex.HasColor = true; d.VertexList[d.TriangleList[i].vertex2] = TempVertex; } else { Vertex TempVertex = d.VertexList[d.TriangleList[i].vertex2]; if (!TempVertex.Color.Equals(d.ColorList[d.TriangleList[i].Color2])) { TempVertex.Color.R = d.ColorList[d.TriangleList[i].Color2].R; TempVertex.Color.G = d.ColorList[d.TriangleList[i].Color2].G; TempVertex.Color.B = d.ColorList[d.TriangleList[i].Color2].B; TempVertex.Color.A = d.ColorList[d.TriangleList[i].Color2].A; d.TriangleList[i].vertex2 = d.VertexList.Count; d.VertexList.Add(TempVertex); } } if (d.VertexList[d.TriangleList[i].vertex3].HasColor == false) { Vertex TempVertex = d.VertexList[d.TriangleList[i].vertex3]; TempVertex.Color = d.ColorList[d.TriangleList[i].Color3]; TempVertex.HasColor = true; d.VertexList[d.TriangleList[i].vertex3] = TempVertex; } else { Vertex TempVertex = d.VertexList[d.TriangleList[i].vertex3]; if (!TempVertex.Color.Equals(d.ColorList[d.TriangleList[i].Color3])) { TempVertex.Color.R = d.ColorList[d.TriangleList[i].Color3].R; TempVertex.Color.G = d.ColorList[d.TriangleList[i].Color3].G; TempVertex.Color.B = d.ColorList[d.TriangleList[i].Color3].B; TempVertex.Color.A = d.ColorList[d.TriangleList[i].Color3].A; d.TriangleList[i].vertex3 = d.VertexList.Count; d.VertexList.Add(TempVertex); } } } }
public static void FixUVCoords(ref ModelConverterData data) { for (int i = 0; i < data.TriangleList.Count; i++) { if (data.VertexList[data.TriangleList[i].vertex1].HasUV == false) { Vertex TempVertex = data.VertexList[data.TriangleList[i].vertex1]; TempVertex.TexCoord.X = data.UVList[data.TriangleList[i].UVCoord1].X; TempVertex.TexCoord.Y = data.UVList[data.TriangleList[i].UVCoord1].Y; TempVertex.HasUV = true; data.VertexList[data.TriangleList[i].vertex1] = TempVertex; } else { Vertex TempVertex = data.VertexList[data.TriangleList[i].vertex1]; if ((TempVertex.TexCoord.X != data.UVList[data.TriangleList[i].UVCoord1].X) | (TempVertex.TexCoord.Y != data.UVList[data.TriangleList[i].UVCoord1].Y)) { TempVertex.TexCoord.X = data.UVList[data.TriangleList[i].UVCoord1].X; TempVertex.TexCoord.Y = data.UVList[data.TriangleList[i].UVCoord1].Y; data.TriangleList[i].vertex1 = data.VertexList.Count; data.VertexList.Add(TempVertex); } } if (data.VertexList[data.TriangleList[i].vertex2].HasUV == false) { Vertex TempVertex = data.VertexList[data.TriangleList[i].vertex2]; TempVertex.TexCoord.X = data.UVList[data.TriangleList[i].UVCoord2].X; TempVertex.TexCoord.Y = data.UVList[data.TriangleList[i].UVCoord2].Y; TempVertex.HasUV = true; data.VertexList[data.TriangleList[i].vertex2] = TempVertex; } else { Vertex TempVertex = data.VertexList[data.TriangleList[i].vertex2]; if ((TempVertex.TexCoord.X != data.UVList[data.TriangleList[i].UVCoord2].X) | (TempVertex.TexCoord.Y != data.UVList[data.TriangleList[i].UVCoord2].Y)) { TempVertex.TexCoord.X = data.UVList[data.TriangleList[i].UVCoord2].X; TempVertex.TexCoord.Y = data.UVList[data.TriangleList[i].UVCoord2].Y; data.TriangleList[i].vertex2 = data.VertexList.Count; data.VertexList.Add(TempVertex); } } if (data.VertexList[data.TriangleList[i].vertex3].HasUV == false) { Vertex TempVertex = data.VertexList[data.TriangleList[i].vertex3]; TempVertex.TexCoord.X = data.UVList[data.TriangleList[i].UVCoord3].X; TempVertex.TexCoord.Y = data.UVList[data.TriangleList[i].UVCoord3].Y; TempVertex.HasUV = true; data.VertexList[data.TriangleList[i].vertex3] = TempVertex; } else { Vertex TempVertex = data.VertexList[data.TriangleList[i].vertex3]; if ((TempVertex.TexCoord.X != data.UVList[data.TriangleList[i].UVCoord3].X) | (TempVertex.TexCoord.Y != data.UVList[data.TriangleList[i].UVCoord3].Y)) { TempVertex.TexCoord.X = data.UVList[data.TriangleList[i].UVCoord3].X; TempVertex.TexCoord.Y = data.UVList[data.TriangleList[i].UVCoord3].Y; data.TriangleList[i].vertex3 = data.VertexList.Count; data.VertexList.Add(TempVertex); } } } }
public static ModelConverterData ReadOBJFile(string InputFile, bool hasUVCoords = true) { ModelConverterData objData = new ModelConverterData() { MaterialList = new List <string>(), VertexList = new List <Vertex>(), NormalList = new List <Vector3>(), UVList = new List <Vector2>(), ColorList = new List <Color>(), TriangleList = new List <Triangle>(), MTLLib = null }; if (!hasUVCoords) { objData.UVList = new List <Vector2>() { new Vector2() } } ; string[] OBJFile = File.ReadAllLines(InputFile); int CurrentMaterial = -1; foreach (string j in OBJFile) { if (j.Length > 2) { if (j.StartsWith("v ")) { string a = Regex.Replace(j, @"\s+", " "); string[] SubStrings = a.Split(' '); Vertex TempVertex = new Vertex(); TempVertex.Position.X = Convert.ToSingle(SubStrings[1]); TempVertex.Position.Y = Convert.ToSingle(SubStrings[2]); TempVertex.Position.Z = Convert.ToSingle(SubStrings[3]); TempVertex.Color = SharpDX.Color.White; objData.VertexList.Add(TempVertex); } else if (j.Substring(0, 3) == "vn ") { string[] SubStrings = j.Split(' '); Vector3 TempNormal = new Vector3 { X = Convert.ToSingle(SubStrings[1]), Y = Convert.ToSingle(SubStrings[2]), Z = Convert.ToSingle(SubStrings[3]) }; objData.NormalList.Add(TempNormal); } else if (j.Substring(0, 3) == "vt ") { string[] SubStrings = j.Split(' '); Vector2 TempUV = new Vector2 { X = Convert.ToSingle(SubStrings[1]), Y = Convert.ToSingle(SubStrings[2]) }; objData.UVList.Add(TempUV); } else if (j.Substring(0, 3) == "vc ") // Special code { string[] SubStrings = j.Split(' '); SharpDX.Color TempColor = new SharpDX.Color { R = Convert.ToByte(SubStrings[1]), G = Convert.ToByte(SubStrings[2]), B = Convert.ToByte(SubStrings[3]), A = Convert.ToByte(SubStrings[4]) }; objData.ColorList.Add(TempColor); } else if (j.StartsWith("f ")) { string[] SubStrings = j.Split(' '); Triangle TempTriangle = new Triangle { materialIndex = CurrentMaterial, vertex1 = Convert.ToInt32(SubStrings[1].Split('/')[0]) - 1, vertex2 = Convert.ToInt32(SubStrings[2].Split('/')[0]) - 1, vertex3 = Convert.ToInt32(SubStrings[3].Split('/')[0]) - 1 }; if (hasUVCoords) { try { TempTriangle.UVCoord1 = Convert.ToInt32(SubStrings[1].Split('/')[1]) - 1; TempTriangle.UVCoord2 = Convert.ToInt32(SubStrings[2].Split('/')[1]) - 1; TempTriangle.UVCoord3 = Convert.ToInt32(SubStrings[3].Split('/')[1]) - 1; } catch { MessageBox.Show("Error parsing texture coordinates. The model will be imported without them."); hasUVCoords = false; objData.UVList = new List <Vector2>() { new Vector2() }; } } objData.TriangleList.Add(TempTriangle); } else if (j.StartsWith("usemtl ")) { objData.MaterialList.Add(Regex.Replace(j.Substring(7), @"\s+", "")); CurrentMaterial += 1; } else if (j.StartsWith("mtllib ")) { objData.MTLLib = j.Substring(7).Split('\\').LastOrDefault(); } } } // Special code if (objData.ColorList.Count == objData.VertexList.Count) { for (int i = 0; i < objData.VertexList.Count; i++) { Vertex v = objData.VertexList[i]; v.Color = objData.ColorList[i]; objData.VertexList[i] = v; } } try { objData.MaterialList = ReplaceMaterialNames(InputFile, objData.MTLLib, objData.MaterialList); } catch { MessageBox.Show("Unable to load material lib. Will use material names as texture names."); } if (hasUVCoords) { FixNormals(ref objData); FixUVCoords(ref objData); } return(objData); }
public static ModelConverterData ReadAssimp(string fileName) { Scene scene = new AssimpContext().ImportFile(fileName, PostProcessSteps.Debone | PostProcessSteps.FindInstances | PostProcessSteps.FindInvalidData | PostProcessSteps.OptimizeGraph | PostProcessSteps.OptimizeMeshes | PostProcessSteps.Triangulate | PostProcessSteps.PreTransformVertices); ModelConverterData data = new ModelConverterData() { MaterialList = new List <string>(), VertexList = new List <Vertex>(), UVList = new List <Vector2>(), ColorList = new List <SharpDX.Color>(), TriangleList = new List <Triangle>() }; foreach (var mat in scene.Materials) { if (mat.TextureDiffuse.FilePath == null) { data.MaterialList.Add(Path.GetFileNameWithoutExtension("")); } else { data.MaterialList.Add(Path.GetFileNameWithoutExtension(mat.TextureDiffuse.FilePath)); } } int totalVertices = 0; foreach (var m in scene.Meshes) { for (int i = 0; i < m.VertexCount; i++) { Vertex v = new Vertex() { Position = new Vector3(m.Vertices[i].X, m.Vertices[i].Y, m.Vertices[i].Z) }; if (m.HasTextureCoords(0)) { v.TexCoord = new Vector2(m.TextureCoordinateChannels[0][i].X, m.TextureCoordinateChannels[0][i].Y); } else { v.TexCoord = new Vector2(); } if (m.HasVertexColors(0)) { v.Color = new SharpDX.Color(m.VertexColorChannels[0][i].R, m.VertexColorChannels[0][i].G, m.VertexColorChannels[0][i].B, m.VertexColorChannels[0][i].A); } else { v.Color = SharpDX.Color.White; } data.VertexList.Add(v); } foreach (var t in m.Faces) { data.TriangleList.Add(new Triangle() { vertex1 = t.Indices[0] + totalVertices, vertex2 = t.Indices[1] + totalVertices, vertex3 = t.Indices[2] + totalVertices, materialIndex = m.MaterialIndex }); } totalVertices += m.VertexCount; } return(data); }
public static ModelConverterData ConvertDataFromDAEObject(List <ModelConverterDataCollada> DAEObjectList, bool ignoreUVsAndColors) { ModelConverterData data = new ModelConverterData() { MaterialList = new List <string>(), VertexList = new List <Vertex>(), NormalList = new List <Vector3>(), UVList = new List <Vector2>(), ColorList = new List <Color>(), TriangleList = new List <Triangle>(), MTLLib = null }; int TotalVertices = 0; int TotalUVs = 0; int TotalColors = 0; foreach (ModelConverterDataCollada i in DAEObjectList) { foreach (Vector3 j in i.PositionVertexList) { Vector3 NewPos = (Vector3)Vector3.Transform(j, i.TransformMatrix); data.VertexList.Add(new Vertex { Position = NewPos }); } foreach (Vector2 j in i.TexCoordList) { data.UVList.Add(j); } foreach (Vector3 j in i.NormalList) { data.NormalList.Add(j); } foreach (Color j in i.VColorList) { data.ColorList.Add(j); } foreach (TriangleListCollada j in i.TriangleListList) { if (j.TriangleList.Count == 0) { continue; } if (j.TextureName == null) { j.TextureName = "default"; } if (!data.MaterialList.Contains(j.TextureName)) { data.MaterialList.Add(j.TextureName); } foreach (Triangle k in j.TriangleList) { for (int m = 0; m < data.MaterialList.Count; m++) { if (data.MaterialList[m] == j.TextureName) { k.materialIndex = m; break; } } k.vertex1 += TotalVertices; k.vertex2 += TotalVertices; k.vertex3 += TotalVertices; k.normal1 += TotalVertices; k.normal2 += TotalVertices; k.normal3 += TotalVertices; k.UVCoord1 += TotalUVs; k.UVCoord2 += TotalUVs; k.UVCoord3 += TotalUVs; k.Color1 += TotalColors; k.Color2 += TotalColors; k.Color3 += TotalColors; data.TriangleList.Add(k); } } TotalVertices += i.PositionVertexList.Count; TotalUVs += i.TexCoordList.Count; TotalColors += i.VColorList.Count; } if (!ignoreUVsAndColors) { FixNormals(ref data); FixUVCoords(ref data); FixColors(ref data); } return(data); }
public static RWSection[] CreateBSPFile(ModelConverterData data, bool flipUVs) { Vertex3 Max = new Vertex3(data.VertexList[0].Position.X, data.VertexList[0].Position.Y, data.VertexList[0].Position.Z); Vertex3 Min = new Vertex3(data.VertexList[0].Position.X, data.VertexList[0].Position.Y, data.VertexList[0].Position.Z); foreach (Vertex i in data.VertexList) { if (i.Position.X > Max.X) { Max.X = i.Position.X; } if (i.Position.Y > Max.Y) { Max.Y = i.Position.Y; } if (i.Position.Z > Max.Z) { Max.Z = i.Position.Z; } if (i.Position.X < Min.X) { Min.X = i.Position.X; } if (i.Position.Y < Min.Y) { Min.Y = i.Position.Y; } if (i.Position.Z < Min.Z) { Min.Z = i.Position.Z; } } List <Vertex3> vList = new List <Vertex3>(data.VertexList.Count); foreach (Vertex v in data.VertexList) { vList.Add(new Vertex3(v.Position.X, v.Position.Y, v.Position.Z)); } List <Color> cList = new List <Color>(data.VertexList.Count); foreach (Vertex v in data.VertexList) { cList.Add(new Color(v.Color.R, v.Color.G, v.Color.B, v.Color.A)); } List <Vertex2> uvList = new List <Vertex2>(data.VertexList.Count); if (flipUVs) { foreach (Vertex v in data.VertexList) { uvList.Add(new Vertex2(v.TexCoord.X, v.TexCoord.Y)); } } else { foreach (Vertex v in data.VertexList) { uvList.Add(new Vertex2(v.TexCoord.X, -v.TexCoord.Y)); } } List <RenderWareFile.Triangle> tList = new List <RenderWareFile.Triangle>(data.TriangleList.Count); foreach (Triangle t in data.TriangleList) { tList.Add(new RenderWareFile.Triangle((ushort)t.materialIndex, (ushort)t.vertex1, (ushort)t.vertex2, (ushort)t.vertex3)); } List <BinMesh> binMeshList = new List <BinMesh>(); int TotalNumberOfTristripIndicies = 0; for (int i = 0; i < data.MaterialList.Count; i++) { List <int> indices = new List <int>(); foreach (Triangle f in data.TriangleList) { if (f.materialIndex == i) { indices.Add(f.vertex1); indices.Add(f.vertex2); indices.Add(f.vertex3); } } TotalNumberOfTristripIndicies += indices.Count(); binMeshList.Add(new BinMesh { materialIndex = i, indexCount = indices.Count(), vertexIndices = indices.ToArray() }); } WorldFlags worldFlags = WorldFlags.HasOneSetOfTextCoords | WorldFlags.HasVertexColors | WorldFlags.WorldSectorsOverlap | (WorldFlags)0x00010000; World_000B world = new World_000B() { worldStruct = new WorldStruct_0001() { rootIsWorldSector = 1, inverseOrigin = new Vertex3(-0f, -0f, -0f), numTriangles = (uint)data.TriangleList.Count(), numVertices = (uint)data.VertexList.Count(), numPlaneSectors = 0, numAtomicSectors = 1, colSectorSize = 0, worldFlags = worldFlags, boxMaximum = Max, boxMinimum = Min, }, materialList = new MaterialList_0008() { materialListStruct = new MaterialListStruct_0001() { materialCount = data.MaterialList.Count() }, materialList = new Material_0007[data.MaterialList.Count()] }, firstWorldChunk = new AtomicSector_0009() { atomicSectorStruct = new AtomicSectorStruct_0001() { matListWindowBase = 0, numTriangles = data.TriangleList.Count(), numVertices = data.VertexList.Count(), boxMaximum = Max, boxMinimum = Min, collSectorPresent = 0x2F50D984, unused = 0, vertexArray = vList.ToArray(), colorArray = cList.ToArray(), uvArray = uvList.ToArray(), triangleArray = tList.ToArray() }, atomicSectorExtension = new Extension_0003() { extensionSectionList = new List <RWSection>() { new BinMeshPLG_050E() { binMeshHeaderFlags = BinMeshHeaderFlags.TriangleList, numMeshes = binMeshList.Count(), totalIndexCount = TotalNumberOfTristripIndicies, binMeshList = binMeshList.ToArray() } } } }, worldExtension = new Extension_0003() }; for (int i = 0; i < data.MaterialList.Count; i++) { world.materialList.materialList[i] = new Material_0007() { materialStruct = new MaterialStruct_0001() { unusedFlags = 0, color = new RenderWareFile.Color() { R = 0xFF, G = 0xFF, B = 0xFF, A = 0xFF }, unusedInt2 = 0x2DF53E84, isTextured = 1, ambient = 1f, specular = 1f, diffuse = 1f }, texture = new Texture_0006() { textureStruct = new TextureStruct_0001() { filterMode = TextureFilterMode.FILTERLINEAR, addressModeU = TextureAddressMode.TEXTUREADDRESSWRAP, addressModeV = TextureAddressMode.TEXTUREADDRESSWRAP, useMipLevels = 1 }, diffuseTextureName = new String_0002() { stringString = data.MaterialList[i] }, alphaTextureName = new String_0002() { stringString = "" }, textureExtension = new Extension_0003() }, materialExtension = new Extension_0003(), }; } return(new RWSection[] { world }); }
public static RWSection[] CreateDFFFile(ModelConverterData data, bool flipUVs) { Vertex3 Max = new Vertex3(data.VertexList[0].Position.X, data.VertexList[0].Position.Y, data.VertexList[0].Position.Z); Vertex3 Min = new Vertex3(data.VertexList[0].Position.X, data.VertexList[0].Position.Y, data.VertexList[0].Position.Z); foreach (Vertex i in data.VertexList) { if (i.Position.X > Max.X) { Max.X = i.Position.X; } if (i.Position.Y > Max.Y) { Max.Y = i.Position.Y; } if (i.Position.Z > Max.Z) { Max.Z = i.Position.Z; } if (i.Position.X < Min.X) { Min.X = i.Position.X; } if (i.Position.Y < Min.Y) { Min.Y = i.Position.Y; } if (i.Position.Z < Min.Z) { Min.Z = i.Position.Z; } } Vertex3 sphereCenter; sphereCenter.X = (Max.X + Min.X) / 2f; sphereCenter.Y = (Max.Y + Min.Y) / 2f; sphereCenter.Z = (Max.Z + Min.Z) / 2f; float sphereRadius = Math.Max((Max.X - Min.X) / 2f, Math.Max((Max.Y - Min.Y) / 2f, (Max.Z - Min.Z) / 2f)); List <Vertex3> vList = new List <Vertex3>(data.VertexList.Count); foreach (Vertex v in data.VertexList) { vList.Add(new Vertex3(v.Position.X, v.Position.Y, v.Position.Z)); } List <Vertex3> nList = new List <Vertex3>(data.VertexList.Count); foreach (Vertex v in data.VertexList) { nList.Add(new Vertex3(-v.Normal.X, -v.Normal.Y, -v.Normal.Z)); } List <Color> cList = new List <Color>(data.VertexList.Count); foreach (Vertex v in data.VertexList) { cList.Add(new Color(v.Color.R, v.Color.G, v.Color.B, v.Color.A)); } List <Vertex2> uvList = new List <Vertex2>(data.VertexList.Count); if (flipUVs) { foreach (Vertex v in data.VertexList) { uvList.Add(new Vertex2(v.TexCoord.X, v.TexCoord.Y)); } } else { foreach (Vertex v in data.VertexList) { uvList.Add(new Vertex2(v.TexCoord.X, -v.TexCoord.Y)); } } List <RenderWareFile.Triangle> tList = new List <RenderWareFile.Triangle>(data.TriangleList.Count); foreach (Triangle t in data.TriangleList) { tList.Add(new RenderWareFile.Triangle((ushort)t.materialIndex, (ushort)t.vertex1, (ushort)t.vertex2, (ushort)t.vertex3)); } List <Material_0007> materials = new List <Material_0007>(data.MaterialList.Count); for (int i = 0; i < data.MaterialList.Count; i++) { materials.Add(new Material_0007() { materialStruct = new MaterialStruct_0001() { unusedFlags = 0, color = new Color() { R = 0xFF, G = 0xFF, B = 0xFF, A = 0xFF }, unusedInt2 = currentRenderWareVersion == scoobyRenderWareVersion ? 0x27584014 : 0, isTextured = 1, ambient = 1f, specular = 1f, diffuse = 1f }, texture = new Texture_0006() { textureStruct = new TextureStruct_0001() { filterMode = TextureFilterMode.FILTERLINEARMIPLINEAR, addressModeU = TextureAddressMode.TEXTUREADDRESSWRAP, addressModeV = TextureAddressMode.TEXTUREADDRESSWRAP, useMipLevels = 1 }, diffuseTextureName = new String_0002() { stringString = data.MaterialList[i] }, alphaTextureName = new String_0002() { stringString = "" }, textureExtension = new Extension_0003() }, materialExtension = new Extension_0003() }); } List <BinMesh> binMeshList = new List <BinMesh>(); int TotalNumberOfTristripIndicies = 0; for (int i = 0; i < data.MaterialList.Count; i++) { List <int> indices = new List <int>(); foreach (Triangle f in data.TriangleList) { if (f.materialIndex == i) { indices.Add(f.vertex1); indices.Add(f.vertex2); indices.Add(f.vertex3); } } TotalNumberOfTristripIndicies += indices.Count(); binMeshList.Add(new BinMesh { materialIndex = i, indexCount = indices.Count(), vertexIndices = indices.ToArray() }); } Clump_0010 clump = new Clump_0010() { clumpStruct = new ClumpStruct_0001() { atomicCount = 1 }, frameList = new FrameList_000E() { frameListStruct = new FrameListStruct_0001() { frames = new List <Frame>() { new Frame() { position = new Vertex3(), rotationMatrix = new Matrix3x3() { M11 = 1f, M12 = 0f, M13 = 0f, M21 = 0f, M22 = 1f, M23 = 0f, M31 = 0f, M32 = 0f, M33 = 1f, }, parentFrame = -1, unknown = 131075 }, new Frame() { position = new Vertex3(), rotationMatrix = new Matrix3x3() { M11 = 1f, M12 = 0f, M13 = 0f, M21 = 0f, M22 = 1f, M23 = 0f, M31 = 0f, M32 = 0f, M33 = 1f, }, parentFrame = 0, unknown = 0 } } }, extensionList = new List <Extension_0003>() { new Extension_0003(), new Extension_0003() } }, geometryList = new GeometryList_001A() { geometryListStruct = new GeometryListStruct_0001() { numberOfGeometries = 1, }, geometryList = new List <Geometry_000F>() { new Geometry_000F() { geometryStruct = new GeometryStruct_0001() { geometryFlags = GeometryFlags.hasLights | GeometryFlags.modeulateMaterialColor | GeometryFlags.hasTextCoords | GeometryFlags.hasVertexColors | GeometryFlags.hasVertexPositions | (nList.Count > 0 ? GeometryFlags.hasNormals:0), geometryFlags2 = (GeometryFlags2)1, numTriangles = data.TriangleList.Count(), numVertices = data.VertexList.Count(), numMorphTargets = 1, ambient = 1f, specular = 1f, diffuse = 1f, vertexColors = cList.ToArray(), textCoords = uvList.ToArray(), triangles = tList.ToArray(), morphTargets = new MorphTarget[] { new MorphTarget() { hasNormals = nList.Count > 0 ? 1 : 0, hasVertices = 1, sphereCenter = sphereCenter, radius = sphereRadius, vertices = vList.ToArray(), normals = nList.ToArray(), } } }, materialList = new MaterialList_0008() { materialListStruct = new MaterialListStruct_0001() { materialCount = materials.Count() }, materialList = materials.ToArray() }, geometryExtension = new Extension_0003() { extensionSectionList = new List <RWSection>() { new BinMeshPLG_050E() { binMeshHeaderFlags = BinMeshHeaderFlags.TriangleList, numMeshes = binMeshList.Count(), totalIndexCount = TotalNumberOfTristripIndicies, binMeshList = binMeshList.ToArray() } } } } } }, atomicList = new List <Atomic_0014>() { new Atomic_0014() { atomicStruct = new AtomicStruct_0001() { frameIndex = 1, geometryIndex = 0, unknown1 = 5, unknown2 = 0 }, atomicExtension = currentRenderWareVersion == scoobyRenderWareVersion ? new Extension_0003() { extensionSectionList = new List <RWSection>() { new MaterialEffectsPLG_0120() { value = 0 } } } : new Extension_0003() } }, clumpExtension = new Extension_0003() }; return(new RWSection[] { clump }); }