Ejemplo n.º 1
0
        private void Setup(SharpRenderer renderer, List <VertexColoredTextured> vertices)
        {
            Dispose();

            var indices = new List <int>(triangles.Count * 3);

            foreach (var t in triangles)
            {
                indices.Add(t.vertex1);
                indices.Add(t.vertex2);
                indices.Add(t.vertex3);
            }

            mesh = SharpMesh.Create(renderer.device, vertices.ToArray(), indices.ToArray(),
                                    new List <SharpSubSet>()
            {
                new SharpSubSet(0, indices.Count, SharpRenderer.arrowDefault)
            }, SharpDX.Direct3D.PrimitiveTopology.TriangleList);
        }
Ejemplo n.º 2
0
        public void CreatePlaneMesh(bool tiny)
        {
            planeVertices  = new List <Vector3>();
            planeTriangles = new List <Models.Triangle>();

            List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>
            {
                new VertexColoredTextured(new Vector3(0f, 0f, 0), new Vector2(0, -1), new Color(255, 255, 255, 255)),
                new VertexColoredTextured(new Vector3(0f, -1, 0), new Vector2(0, 0), new Color(255, 255, 255, 255)),
                new VertexColoredTextured(new Vector3(1f, 0f, 0), new Vector2(1, -1), new Color(255, 255, 255, 255)),
                new VertexColoredTextured(new Vector3(1f, -1f, 0), new Vector2(1, 0), new Color(255, 255, 255, 255))
            };

            foreach (VertexColoredTextured v in vertexList)
            {
                planeVertices.Add((Vector3)v.Position);
            }

            List <int> indexList = new List <int>
            {
                0, 1, 2, 3, 2, 1
            };

            planeTriangles.Add(new Models.Triangle()
            {
                vertex1 = 0, vertex2 = 1, vertex3 = 2, UVCoord1 = 0, UVCoord2 = 1, UVCoord3 = 2
            });
            planeTriangles.Add(new Models.Triangle()
            {
                vertex1 = 3, vertex2 = 2, vertex3 = 1, UVCoord1 = 3, UVCoord2 = 2, UVCoord3 = 1
            });

            if (!tiny)
            {
                Plane = SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), new List <SharpSubSet>()
                {
                    new SharpSubSet(0, indexList.Count, null)
                });
            }
        }
Ejemplo n.º 3
0
        public void LoadModels()
        {
            cubeVertices  = new List <Vector3>();
            cubeTriangles = new List <Models.Triangle>();

            cylinderVertices  = new List <Vector3>();
            cylinderTriangles = new List <Models.Triangle>();

            pyramidVertices  = new List <Vector3>();
            pyramidTriangles = new List <Models.Triangle>();

            sphereVertices  = new List <Vector3>();
            sphereTriangles = new List <Models.Triangle>();

            for (int i = 0; i < 4; i++)
            {
                Models.ModelConverterData objData;

                if (i == 0)
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Box.obj", false);
                }
                else if (i == 1)
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Cylinder.obj", false);
                }
                else if (i == 2)
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Pyramid.obj", false);
                }
                else
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Sphere.obj", false);
                }

                List <Vertex> vertexList = new List <Vertex>();
                foreach (Models.Vertex v in objData.VertexList)
                {
                    vertexList.Add(new Vertex(v.Position));
                    if (i == 0)
                    {
                        cubeVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                    else if (i == 1)
                    {
                        cylinderVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                    else if (i == 2)
                    {
                        pyramidVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                    else if (i == 3)
                    {
                        sphereVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                }

                List <int> indexList = new List <int>();
                foreach (Models.Triangle t in objData.TriangleList)
                {
                    indexList.Add(t.vertex1);
                    indexList.Add(t.vertex2);
                    indexList.Add(t.vertex3);
                    if (i == 0)
                    {
                        cubeTriangles.Add(t);
                    }
                    else if (i == 1)
                    {
                        cylinderTriangles.Add(t);
                    }
                    else if (i == 2)
                    {
                        pyramidTriangles.Add(t);
                    }
                    else if (i == 3)
                    {
                        sphereTriangles.Add(t);
                    }
                }

                if (i == 0)
                {
                    Cube = SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), new List <SharpSubSet>()
                    {
                        new SharpSubSet(0, indexList.Count, null)
                    });
                }
                else if (i == 1)
                {
                    Cylinder = SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), new List <SharpSubSet>()
                    {
                        new SharpSubSet(0, indexList.Count, null)
                    });
                }
                else if (i == 2)
                {
                    Pyramid = SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), new List <SharpSubSet>()
                    {
                        new SharpSubSet(0, indexList.Count, null)
                    });
                }
                else if (i == 3)
                {
                    Sphere = SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), new List <SharpSubSet>()
                    {
                        new SharpSubSet(0, indexList.Count, null)
                    });
                }
            }

            RenderWareModelFile torusModel = new RenderWareModelFile("Torus");

            torusModel.SetForRendering(device, RenderWareFile.ReadFileMethods.ReadRenderWareFile(Application.StartupPath + "/Resources/Models/Torus.DFF"), File.ReadAllBytes(Application.StartupPath + "/Resources/Models/Torus.DFF"));
            Torus          = torusModel.meshList[0];
            torusTriangles = new List <Models.Triangle>();
            foreach (RenderWareFile.Triangle t in torusModel.triangleList)
            {
                torusTriangles.Add(new Models.Triangle()
                {
                    vertex1 = t.vertex1, vertex2 = t.vertex2, vertex3 = t.vertex3
                });
            }
            torusVertices = torusModel.vertexListG;

            CreatePlaneMesh();
        }
Ejemplo n.º 4
0
        private void AddNativeData(SharpDevice device, Extension_0003 extension, List <string> MaterialStream, Matrix transformMatrix)
        {
            isNativeData = true;
            NativeDataGC n = null;

            foreach (RWSection rw in extension.extensionSectionList)
            {
                if (rw is BinMeshPLG_050E binmesh)
                {
                    if (binmesh.numMeshes == 0)
                    {
                        return;
                    }
                }
                if (rw is NativeDataPLG_0510 native)
                {
                    n = native.nativeDataStruct.nativeData;
                    break;
                }
            }

            if (n == null)
            {
                throw new Exception();
            }

            List <Vertex3> vertexList1            = new List <Vertex3>();
            List <Vertex3> normalList             = new List <Vertex3>();
            List <RenderWareFile.Color> colorList = new List <RenderWareFile.Color>();
            List <Vertex2> textCoordList          = new List <Vertex2>();

            foreach (Declaration d in n.declarations)
            {
                foreach (object o in d.entryList)
                {
                    if (d.declarationType == Declarations.Vertex)
                    {
                        vertexList1.Add((Vertex3)o);
                    }
                    else if (d.declarationType == Declarations.Color)
                    {
                        colorList.Add((RenderWareFile.Color)o);
                    }
                    else if (d.declarationType == Declarations.TextCoord)
                    {
                        textCoordList.Add((Vertex2)o);
                    }
                    else if (d.declarationType == Declarations.Normal)
                    {
                        normalList.Add((Vertex3)o);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
            }

            List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>();
            List <int>         indexList            = new List <int>();
            int                k = 0;
            int                previousAmount = 0;
            List <SharpSubSet> subSetList     = new List <SharpSubSet>();

            foreach (TriangleDeclaration td in n.triangleDeclarations)
            {
                foreach (TriangleList tl in td.TriangleListList)
                {
                    foreach (int[] objectList in tl.entries)
                    {
                        Vector3       position          = new Vector3();
                        SharpDX.Color color             = new SharpDX.Color(255, 255, 255, 255);
                        Vector2       textureCoordinate = new Vector2();
                        Vector3       normal            = new Vector3();

                        for (int j = 0; j < objectList.Count(); j++)
                        {
                            if (n.declarations[j].declarationType == Declarations.Vertex)
                            {
                                position = (Vector3)Vector3.Transform(
                                    new Vector3(
                                        vertexList1[objectList[j]].X,
                                        vertexList1[objectList[j]].Y,
                                        vertexList1[objectList[j]].Z),
                                    transformMatrix);
                            }
                            else if (n.declarations[j].declarationType == Declarations.Color)
                            {
                                color = new SharpDX.Color(colorList[objectList[j]].R, colorList[objectList[j]].G, colorList[objectList[j]].B, colorList[objectList[j]].A);
                                if (color.A == 0)
                                {
                                    color = new SharpDX.Color(255, 255, 255, 255);
                                }
                            }
                            else if (n.declarations[j].declarationType == Declarations.TextCoord)
                            {
                                textureCoordinate.X = textCoordList[objectList[j]].X;
                                textureCoordinate.Y = textCoordList[objectList[j]].Y;
                            }
                            else if (n.declarations[j].declarationType == Declarations.Normal)
                            {
                                normal = new Vector3(
                                    normalList[objectList[j]].X,
                                    normalList[objectList[j]].Y,
                                    normalList[objectList[j]].Z);
                            }
                        }

                        vertexList.Add(new VertexColoredTextured(position, textureCoordinate, color));

                        indexList.Add(k);
                        k++;

                        vertexListG.Add(position);
                    }

                    subSetList.Add(new SharpSubSet(previousAmount, vertexList.Count() - previousAmount,
                                                   TextureManager.GetTextureFromDictionary(MaterialStream[td.MaterialIndex]), MaterialStream[td.MaterialIndex]));

                    previousAmount = vertexList.Count();
                }
            }

            if (vertexList.Count > 0)
            {
                for (int i = 2; i < indexList.Count; i++)
                {
                    triangleList.Add(new Triangle(0, (ushort)(i + triangleListOffset - 2), (ushort)(i + triangleListOffset - 1), (ushort)(i + triangleListOffset)));
                }

                triangleListOffset += vertexList.Count;

                VertexColoredTextured[] vertices = vertexList.ToArray();
                AddToMeshList(SharpMesh.Create(device, vertices, indexList.ToArray(), subSetList, SharpDX.Direct3D.PrimitiveTopology.TriangleStrip));
            }
            else
            {
                AddToMeshList(null);
            }
        }
Ejemplo n.º 5
0
        private void AddGeometry(SharpDevice device, Geometry_000F g, Matrix transformMatrix)
        {
            List <string> materialList = new List <string>();

            foreach (Material_0007 m in g.materialList.materialList)
            {
                if (m.texture != null)
                {
                    string textureName = m.texture.diffuseTextureName.stringString;
                    materialList.Add(textureName);
                }
                else
                {
                    materialList.Add(DefaultTexture);
                }
            }

            if ((g.geometryStruct.geometryFlags2 & GeometryFlags2.isNativeGeometry) != 0)
            {
                AddNativeData(device, g.geometryExtension, materialList, transformMatrix);
                return;
            }

            List <Vector3>       vertexList1   = new List <Vector3>();
            List <Vector3>       normalList    = new List <Vector3>();
            List <Vector2>       textCoordList = new List <Vector2>();
            List <SharpDX.Color> colorList     = new List <SharpDX.Color>();

            if ((g.geometryStruct.geometryFlags & GeometryFlags.hasVertexPositions) != 0)
            {
                MorphTarget m = g.geometryStruct.morphTargets[0];
                foreach (Vertex3 v in m.vertices)
                {
                    Vector3 pos = (Vector3)Vector3.Transform(new Vector3(v.X, v.Y, v.Z), transformMatrix);
                    vertexList1.Add(pos);
                    vertexListG.Add(pos);
                }
            }

            if ((g.geometryStruct.geometryFlags & GeometryFlags.hasNormals) != 0)
            {
                for (int i = 0; i < vertexList1.Count; i++)
                {
                    normalList.Add(new Vector3(g.geometryStruct.morphTargets[0].normals[i].X, g.geometryStruct.morphTargets[0].normals[i].Y, g.geometryStruct.morphTargets[0].normals[i].Z));
                }
            }

            if ((g.geometryStruct.geometryFlags & GeometryFlags.hasVertexColors) != 0)
            {
                for (int i = 0; i < vertexList1.Count; i++)
                {
                    RenderWareFile.Color c = g.geometryStruct.vertexColors[i];
                    colorList.Add(new SharpDX.Color(c.R, c.G, c.B, c.A));
                }
            }
            else
            {
                for (int i = 0; i < vertexList1.Count; i++)
                {
                    colorList.Add(new SharpDX.Color(1f, 1f, 1f, 1f));
                }
            }

            if ((g.geometryStruct.geometryFlags & GeometryFlags.hasTextCoords) != 0)
            {
                for (int i = 0; i < vertexList1.Count; i++)
                {
                    Vertex2 tc = g.geometryStruct.textCoords[i];
                    textCoordList.Add(new Vector2(tc.X, tc.Y));
                }
            }
            else
            {
                for (int i = 0; i < vertexList1.Count; i++)
                {
                    textCoordList.Add(new Vector2());
                }
            }

            List <SharpSubSet> SubsetList = new List <SharpSubSet>();
            List <int>         indexList  = new List <int>();
            int previousIndexCount        = 0;

            for (int i = 0; i < materialList.Count; i++)
            {
                foreach (Triangle t in g.geometryStruct.triangles)
                {
                    if (t.materialIndex == i)
                    {
                        indexList.Add(t.vertex1);
                        indexList.Add(t.vertex2);
                        indexList.Add(t.vertex3);

                        triangleList.Add(new Triangle(t.materialIndex, (ushort)(t.vertex1 + triangleListOffset), (ushort)(t.vertex2 + triangleListOffset), (ushort)(t.vertex3 + triangleListOffset)));
                    }
                }

                if (indexList.Count - previousIndexCount > 0)
                {
                    SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount,
                                                   TextureManager.GetTextureFromDictionary(materialList[i]), materialList[i]));
                }

                previousIndexCount = indexList.Count();
            }

            triangleListOffset += vertexList1.Count;

            if (SubsetList.Count > 0)
            {
                VertexColoredTextured[] vertices = new VertexColoredTextured[vertexList1.Count];
                for (int i = 0; i < vertices.Length; i++)
                {
                    vertices[i] = new VertexColoredTextured(vertexList1[i], textCoordList[i], colorList[i]);
                }
                AddToMeshList(SharpMesh.Create(device, vertices, indexList.ToArray(), SubsetList));
            }
            else
            {
                AddToMeshList(null);
            }
        }
Ejemplo n.º 6
0
 private void AddToMeshList(SharpMesh mesh)
 {
     meshList.Add(mesh);
     completeMeshList.Add(mesh);
 }
Ejemplo n.º 7
0
        private void AddAtomic(SharpDevice device, AtomicSector_0009 AtomicSector, List <string> MaterialList)
        {
            if (AtomicSector.atomicSectorStruct.isNativeData)
            {
                AddNativeData(device, AtomicSector.atomicSectorExtension, MaterialList, Matrix.Identity);
                return;
            }

            List <VertexColoredTextured> vertexList = new List <VertexColoredTextured>();

            foreach (Vertex3 v in AtomicSector.atomicSectorStruct.vertexArray)
            {
                vertexList.Add(new VertexColoredTextured(new Vector3(v.X, v.Y, v.Z), new Vector2(), new SharpDX.Color()));
                vertexListG.Add(new Vector3(v.X, v.Y, v.Z));
            }

            for (int i = 0; i < vertexList.Count; i++)
            {
                RenderWareFile.Color c = AtomicSector.atomicSectorStruct.colorArray[i];

                VertexColoredTextured v = vertexList[i];
                v.Color       = new SharpDX.Color(c.R, c.G, c.B, c.A);
                vertexList[i] = v;
            }

            for (int i = 0; i < vertexList.Count; i++)
            {
                Vertex2 tc = AtomicSector.atomicSectorStruct.uvArray[i];

                VertexColoredTextured v = vertexList[i];
                v.TextureCoordinate = new Vector2(tc.X, tc.Y);
                vertexList[i]       = v;
            }

            List <SharpSubSet> SubsetList = new List <SharpSubSet>();
            List <int>         indexList  = new List <int>();
            int previousIndexCount        = 0;

            for (int i = 0; i < MaterialList.Count; i++)
            {
                for (int j = 0; j < AtomicSector.atomicSectorStruct.triangleArray.Length; j++) // each (Triangle t in AtomicSector.atomicStruct.triangleArray)
                {
                    Triangle t = AtomicSector.atomicSectorStruct.triangleArray[j];
                    if (t.materialIndex == i)
                    {
                        indexList.Add(t.vertex1);
                        indexList.Add(t.vertex2);
                        indexList.Add(t.vertex3);

                        triangleList.Add(new Triangle(t.materialIndex, (ushort)(t.vertex1 + triangleListOffset), (ushort)(t.vertex2 + triangleListOffset), (ushort)(t.vertex3 + triangleListOffset)));
                    }
                }

                if (indexList.Count - previousIndexCount > 0)
                {
                    SubsetList.Add(new SharpSubSet(previousIndexCount, indexList.Count - previousIndexCount,
                                                   TextureManager.GetTextureFromDictionary(MaterialList[i]), MaterialList[i]));
                }

                previousIndexCount = indexList.Count();
            }

            triangleListOffset += AtomicSector.atomicSectorStruct.vertexArray.Length;

            if (SubsetList.Count > 0)
            {
                AddToMeshList(SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray(), SubsetList));
            }
        }
Ejemplo n.º 8
0
        public void LoadModels(bool tiny = false)
        {
            cubeVertices  = new List <Vector3>();
            cubeTriangles = new List <Models.Triangle>();

            cylinderVertices  = new List <Vector3>();
            cylinderTriangles = new List <Models.Triangle>();

            pyramidVertices  = new List <Vector3>();
            pyramidTriangles = new List <Models.Triangle>();

            sphereVertices  = new List <Vector3>();
            sphereTriangles = new List <Models.Triangle>();

            torusVertices  = new List <Vector3>();
            torusTriangles = new List <Models.Triangle>();

            for (int i = 0; i < 5; i++)
            {
                Models.ModelConverterData objData;

                if (i == 0)
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Box.obj", false);
                }
                else if (i == 1)
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Cylinder.obj", false);
                }
                else if (i == 2)
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Pyramid.obj", false);
                }
                else if (i == 3)
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Sphere.obj", false);
                }
                else
                {
                    objData = ReadOBJFile(Application.StartupPath + "/Resources/Models/Torus.obj", false);
                }

                List <Vertex> vertexList = new List <Vertex>();
                foreach (Models.Vertex v in objData.VertexList)
                {
                    vertexList.Add(new Vertex(v.Position));
                    if (i == 0)
                    {
                        cubeVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                    else if (i == 1)
                    {
                        cylinderVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                    else if (i == 2)
                    {
                        pyramidVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                    else if (i == 3)
                    {
                        sphereVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                    else if (i == 4)
                    {
                        torusVertices.Add(new Vector3(v.Position.X, v.Position.Y, v.Position.Z));
                    }
                }

                List <int> indexList = new List <int>();
                foreach (Models.Triangle t in objData.TriangleList)
                {
                    indexList.Add(t.vertex1);
                    indexList.Add(t.vertex2);
                    indexList.Add(t.vertex3);
                    if (i == 0)
                    {
                        cubeTriangles.Add(t);
                    }
                    else if (i == 1)
                    {
                        cylinderTriangles.Add(t);
                    }
                    else if (i == 2)
                    {
                        pyramidTriangles.Add(t);
                    }
                    else if (i == 3)
                    {
                        sphereTriangles.Add(t);
                    }
                    else if (i == 4)
                    {
                        torusTriangles.Add(t);
                    }
                }

                if (!tiny)
                {
                    SharpMesh mesh = SharpMesh.Create(device, vertexList.ToArray(), indexList.ToArray());
                    switch (i)
                    {
                    case 0:
                        Cube = mesh;
                        break;

                    case 1:
                        Cylinder = mesh;
                        break;

                    case 2:
                        Pyramid = mesh;
                        break;

                    case 3:
                        Sphere = mesh;
                        break;

                    case 4:
                        Torus = mesh;
                        break;
                    }
                }
            }

            CreatePlaneMesh(tiny);
        }