Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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);
                    }
                }
            }
        }
Beispiel #3
0
        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);
                    }
                }
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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 });
        }
Beispiel #8
0
        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 });
        }