示例#1
0
        public void CreateMaterialIdsArrayOk()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            Assert.True(resObjMesh.FaceTrianglesList.Count == resObjMesh.CreateMaterialIdsArray().Length);
        }
示例#2
0
        public void CreateMaterialIdsArrayOk()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            Assert.AreEqual(_resObjMesh.FaceTriangles.Count, _resObjMesh.CreateMaterialIdsArray().Length);
        }
示例#3
0
        public void CreateInstanceDxMeshWithNumberFacesOk()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpath);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder auxMeshBuilder = new MeshBuilder().AddDxMesh(_resObjMesh.FaceTriangles.Count);

            Assert.AreEqual(auxMeshBuilder.DxMesh.NumberFaces, _resObjMesh.FaceTriangles.Count);
        }
示例#4
0
        public void CreateMeshOnlyColor()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpathmeshcolorsolo);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder().AddDxMesh(resObjMesh.FaceTrianglesList.Count).ChargeBuffer(_tgcObjLoader.ObjMeshContainer, 0);

            Assert.NotNull(meshBuilder.GetInstaceDxMesh());
        }
示例#5
0
        public void IndexMaterialIdsArrayOk()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            int[] materialIds = _resObjMesh.CreateMaterialIdsArray();
            Assert.AreEqual(materialIds[15810], 0);
            Assert.AreEqual(materialIds[17010], 1);
        }
示例#6
0
        public void IndexMaterialIdsArrayOk()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            int[] materialIds = resObjMesh.CreateMaterialIdsArray();
            Assert.True(materialIds[15810] == 0);
            Assert.True(materialIds[17010] == 1);
        }
示例#7
0
        public void CreateMeshOnlyColor()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmeshcolorsolo);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder().AddDxMesh(_resObjMesh.FaceTriangles.Count).ChargeBuffer(tgcObjLoader.ObjMeshContainer, 0);

            Assert.NotNull(meshBuilder.DxMesh);
        }
示例#8
0
        public void AddMultiMaterialToBuilderOk()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(tgcObjLoader.ObjMaterialsLoader).ChargueMaterials();

            Assert.NotNull(meshBuilder.MeshMaterials);
        }
示例#9
0
        public void CreateInstanceDxMeshWithNumberFacesOK()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpath);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder auxMeshBuilder = new MeshBuilder()
                                         .AddDxMesh(resObjMesh.FaceTrianglesList.Count);

            Assert.True(auxMeshBuilder.GetInstaceDxMesh().NumberFaces == resObjMesh.FaceTrianglesList.Count);
        }
示例#10
0
        public void AddMaterialToBuilderOk()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpath);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(_tgcObjLoader.ObjMaterialsLoader).ChargueMaterials();

            Assert.NotNull(meshBuilder.MeshMaterials);
        }
示例#11
0
        public void GetTextureCountOk()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(_tgcObjLoader.ObjMaterialsLoader)
                                      .ChargueMaterials();

            Assert.True(meshBuilder.GetTextureCount() == 2);
        }
示例#12
0
        public void FirstMaterialMeshHaveIndexZero()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(_tgcObjLoader.ObjMaterialsLoader)
                                      .ChargueMaterials();

            Assert.NotNull(meshBuilder.MeshMaterials[0]);
        }
示例#13
0
        public void setFile(String filePath)
        {
            this.objFileName = Path.GetFileName(filePath);
            this.objFileDir  = Path.GetDirectoryName(filePath) + "\\";

            if (!objFileName.Equals(""))
            {
                mesh = new ObjMesh(objFileDir + objFileName);
                mesh.Prepare();
                lineDraw.InitLineDraw();
            }
        }
 /// <summary>
 ///   Cargar indexBuffer del mesh de DirectX en forma plana
 /// </summary>
 /// <param name="objMesh">ObjMesh</param>
 /// /// <param name="dxMesh"></param>
 public void ChargeIndexBuffer(ObjMesh objMesh, Mesh dxMesh)
 {
     using (var ib = dxMesh.IndexBuffer)
     {
         var indices = new short[objMesh.FaceTriangles.Count * 3];
         for (var i = 0; i < indices.Length; i++)
         {
             indices[i] = (short)i;
         }
         ib.SetData(indices, 0, LockFlags.None);
     }
 }
示例#15
0
        public void SimpleObj_OneMeshPerMaterialGroup()
        {
            CreateTestObj();
            var mesh       = ObjMesh.FromFile("test.obj");
            var dummyScene = new Scene();

            ObjConverter.AddToScene(mesh, dummyScene, null);

            // There should be four meshes in total (one per group, except if there are multiple
            // materials in the same group)
            Assert.Equal(4, dummyScene.Meshes.Count);
        }
示例#16
0
        public void EnsureRightTypeRenderIsLoadedOnlyColorBranch()
        {
            //TODO asegurar que si tiene material el tipo de render sea difuse map, o si tiene ligth map que sea difuse mas ligth map
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmeshcolorsolo);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddDxMesh(_resObjMesh.FaceTriangles.Count);

            Assert.AreEqual(meshBuilder.ChargueBufferStrategy.RenderType, TgcMesh.MeshRenderType.VERTEX_COLOR);
        }
示例#17
0
        public void GetTextureCountOk()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(tgcObjLoader.ObjMaterialsLoader)
                                      .ChargueMaterials();

            Assert.AreEqual(meshBuilder.GetTextureCount(), 2);
        }
示例#18
0
    /// <summary>
    /// 从本地文件中加载一个.obj模型
    /// </summary>
    /// <param name="modelFilePath">模型文件路径</param>
    /// <param name="texturePath">贴图文件路径</param>
    public void LoadFormFile(string modelFilePath, string texturePath)
    {
        if (!File.Exists(modelFilePath))
        {
            Debug.Log("请确认obj模型文件是否存在!");
        }
        if (!modelFilePath.EndsWith(".obj"))
        {
            Debug.Log("请确认这是一个obj模型文件");
        }

        //读取内容
        StreamReader reader  = new StreamReader(modelFilePath, Encoding.Default);
        string       content = reader.ReadToEnd();

        reader.Close();

        //解析内容
        ObjMesh objInstace = new ObjMesh();

        objInstace = objInstace.LoadFromObj(content);

        //计算网格
        Mesh mesh = new Mesh();

        mesh.vertices  = objInstace.VertexArray;
        mesh.triangles = objInstace.TriangleArray;
        if (objInstace.UVArray.Length > 0)
        {
            mesh.uv = objInstace.UVArray;
        }
        if (objInstace.NormalArray.Length > 0)
        {
            mesh.normals = objInstace.NormalArray;
        }
        mesh.RecalculateBounds();

        //生成物体
        GameObject go         = new GameObject();
        MeshFilter meshFilter = go.AddComponent <MeshFilter>();

        meshFilter.mesh = mesh;


        MeshRenderer meshRenderer = go.AddComponent <MeshRenderer>();

        //获取mtl文件路径
        string mtlFilePath = modelFilePath.Replace(".obj", ".mtl");

        //从mtl文件中加载材质
        Material[] materials = ObjMaterial.Instance.LoadFormMtl(mtlFilePath, texturePath);
    }
示例#19
0
 public static bool Load(ObjMesh mesh, string fileName)
 {
     try
     {
         using (StreamReader streamReader = new StreamReader(fileName))
         {
             Load(mesh, streamReader);
             streamReader.Close();
             return(true);
         }
     }
     catch { return(false); }
 }
示例#20
0
        public void EnsureRightTypeRenderIsLoadedDiffuseMapBranch()
        {
            //TODO asegurar que si tiene material el tipo de render sea difuse map, o si tiene ligth map que sea difuse mas ligth map
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(tgcObjLoader.ObjMaterialsLoader)
                                      .ChargueMaterials();

            Assert.AreEqual(meshBuilder.ChargueBufferStrategy.RenderType, TgcMesh.MeshRenderType.DIFFUSE_MAP);
        }
示例#21
0
 public static bool Load(ObjMesh mesh, string fileName)
 {
     try
     {
         using (StreamReader streamReader = new StreamReader(Platform.openFile(fileName)))
         {
             Load(mesh, streamReader);
             streamReader.Close();
             return true;
         }
     }
     catch { return false; }
 }
示例#22
0
        public void CreateDxMeshWithVertexLimit()
        {
            // 21845 * 3 = 65535
            // Int range 0 to 65535

            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmeshcolorsolo);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder().AddDxMesh(21844);

            Assert.NotNull(meshBuilder.DxMesh);
        }
示例#23
0
 public Mesh(ObjMesh model)
 {
     vertices = new Vertex[model.TriangleArray.Length];
     for (var i = 0; i < model.TriangleArray.Length; i++)
     {
         var color = Math.Random.Range(0, 255) / 255f;
         var index = model.TriangleArray[i];
         var point = model.VertexArray[index];
         vertices[i] = new Vertex(Vector3.FromObj(point),
                                  Vector3.FromObj(model.NormalArray[index]),
                                  model.UVArray[index].x,
                                  model.UVArray[index].y, new Vector3(color, color, color));
     }
 }
示例#24
0
        private MeshData getContentMesh(ItemStack contentStack, ITesselatorAPI tesselator)
        {
            CurrentModel = EnumKilnModel.Normal;

            if (contentStack == null)
            {
                return(null);
            }

            if (contentStack.Collectible is IInKilnMeshSupplier)
            {
                EnumKilnModel model = EnumKilnModel.Normal;
                MeshData      mesh  = (contentStack.Collectible as IInKilnMeshSupplier).GetMeshWhenInKiln(contentStack, Api.World, Pos, ref model);
                this.CurrentModel = model;

                if (mesh != null)
                {
                    return(mesh);
                }
            }

            if (contentStack.Collectible is IInKilnRendererSupplier)
            {
                EnumKilnModel model = (contentStack.Collectible as IInKilnRendererSupplier).GetDesiredKilnModel(contentStack, this, contentStack == outputStack);
                this.CurrentModel = model;
                return(null);
            }


            InKilnProps renderProps = GetRenderProps(contentStack);

            if (renderProps != null)
            {
                this.CurrentModel = renderProps.UseKilnModel;

                if (contentStack.Class != EnumItemClass.Item)
                {
                    MeshData ObjMesh;
                    tesselator.TesselateBlock(contentStack.Block, out ObjMesh);

                    ObjMesh.ModelTransform(renderProps.Transform);

                    return(ObjMesh);
                }

                return(null);
            }
            return(null);
        }
示例#25
0
        public void CheckIndexBufferIsChargedOk()
        {
            //TODO verificar que el idexbuffer se cargo .
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(_tgcObjLoader.ObjMaterialsLoader)
                                      .ChargueMaterials()
                                      .AddDxMesh(resObjMesh.FaceTrianglesList.Count)
                                      .ChargeBuffer(_tgcObjLoader.ObjMeshContainer, 0);

            Assert.True(meshBuilder.GetInstaceDxMesh().IndexBuffer.SizeInBytes > 0);
        }
示例#26
0
        public void BuildTgcMeshWithEnableTrueOk()
        {
            TgcObjLoader _tgcObjLoader = new TgcObjLoader();

            _tgcObjLoader.LoadObjFromFile(_fullobjpath);
            resObjMesh = _tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            TgcMesh tgcMesh = new MeshBuilder()
                              .AddMaterials(_tgcObjLoader.ObjMaterialsLoader)
                              .AddDxMesh(resObjMesh.FaceTrianglesList.Count)
                              .ChargeBuffer(_tgcObjLoader.ObjMeshContainer, 0)
                              .SetEnable(true)
                              .Build(resObjMesh);

            Assert.True(tgcMesh.Enabled);
        }
示例#27
0
        public void CheckIndexBufferIsChargedOk()
        {
            //TODO verificar que el idexbuffer se cargo .
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(tgcObjLoader.ObjMaterialsLoader)
                                      .ChargueMaterials()
                                      .AddDxMesh(_resObjMesh.FaceTriangles.Count)
                                      .ChargeBuffer(tgcObjLoader.ObjMeshContainer, 0);

            Assert.Greater(meshBuilder.DxMesh.IndexBuffer.SizeInBytes, 0);
        }
示例#28
0
        public void BuildTgcMeshWithAutotransformTrueOk()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpath);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            TgcMesh tgcMesh = new MeshBuilder()
                              .AddMaterials(tgcObjLoader.ObjMaterialsLoader)
                              .AddDxMesh(_resObjMesh.FaceTriangles.Count)
                              .ChargeBuffer(tgcObjLoader.ObjMeshContainer, 0)
                              .AddAutotransform(true)
                              .Build(_resObjMesh);

            Assert.IsTrue(tgcMesh.AutoTransform);
        }
示例#29
0
        public void CreateMeshColorAndDifusseMap()
        {
            //TODO el test de cuando el mesh es color y difuse
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpathmultimaterial);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            MeshBuilder meshBuilder = new MeshBuilder()
                                      .AddMaterials(tgcObjLoader.ObjMaterialsLoader)
                                      .ChargueMaterials()
                                      .AddDxMesh(_resObjMesh.FaceTriangles.Count)
                                      .ChargeBuffer(tgcObjLoader.ObjMeshContainer, 0);

            Assert.NotNull(meshBuilder.DxMesh);
        }
示例#30
0
        public void BuildTgcMeshWithBoundingBoxOk()  //TODO el boundingbox no deberia estar acoplado al mesh
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpath);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            TgcMesh tgcMesh = new MeshBuilder()
                              .AddMaterials(tgcObjLoader.ObjMaterialsLoader)
                              .AddDxMesh(_resObjMesh.FaceTriangles.Count)
                              .ChargeBuffer(tgcObjLoader.ObjMeshContainer, 0)
                              .SetEnable(true)
                              .AddAutotransform(true)
                              .SetHasBoundingBox(false)
                              .Build(_resObjMesh);

            Assert.NotNull(tgcMesh.BoundingBox);
        }
示例#31
0
        public void TgcMeshBuildWithTextureOk()
        {
            TGCObjLoader tgcObjLoader = new TGCObjLoader();

            tgcObjLoader.LoadObjFromFile(_fullobjpath);
            _resObjMesh = tgcObjLoader.ObjMeshContainer.ListObjMesh.First();
            TgcMesh tgcMesh = new MeshBuilder()
                              .AddMaterials(tgcObjLoader.ObjMaterialsLoader)
                              .ChargueMaterials()
                              .AddDxMesh(_resObjMesh.FaceTriangles.Count)
                              .ChargeBuffer(tgcObjLoader.ObjMeshContainer, 0)
                              .AddAutotransform(true)
                              .SetEnable(true)
                              .SetHasBoundingBox(true)
                              .Build(_resObjMesh);

            Assert.Greater(tgcMesh.Materials.Length, 0);
        }
示例#32
0
    public static bool Load2(ObjMesh mesh, StreamReader streamReader, ObjMesh prevmesh)
    {
        if(prevmesh !=null) {
        //mesh.Vertices = prevmesh.Vertices;

        }
        try
        {
        //streamReader.BaseStream.Position = 0;
                Load(mesh, streamReader);
                streamReader.Close();
        #if DEBUG
            Console.WriteLine("Loaded "+mesh.Triangles.Length.ToString()+" triangles and"+mesh.Quads.Length.ToString()+" quadrilaterals parsed, with a grand total of "+mesh.Vertices.Length.ToString()+" vertices.");
        #endif
                return true;

        }
        catch(Exception er) { Console.WriteLine(er);return false; }
    }
    /// <summary>
    /// 从本地文件中加载一个.obj模型
    /// </summary>
    /// <param name="modelFilePath">模型文件路径</param>
    /// <param name="texturePath">贴图文件路径</param>
    public void LoadFormFile(string modelFilePath, string texturePath)
    {
        if(!File.Exists(modelFilePath))
            Debug.Log("请确认obj模型文件是否存在!");
        if(!modelFilePath.EndsWith(".obj"))
           Debug.Log("请确认这是一个obj模型文件");

        //读取内容
        StreamReader reader = new StreamReader(modelFilePath,Encoding.Default);
        string content = reader.ReadToEnd();
        reader.Close();

        //解析内容
        ObjMesh objInstace = new ObjMesh();
        objInstace = objInstace.LoadFromObj(content);

        //计算网格
        Mesh mesh = new Mesh();
        mesh.vertices = objInstace.VertexArray;
        mesh.triangles = objInstace.TriangleArray;
        if(objInstace.UVArray.Length > 0)
            mesh.uv = objInstace.UVArray;
        if(objInstace.NormalArray.Length>0)
            mesh.normals = objInstace.NormalArray;
        mesh.RecalculateBounds();

        //生成物体
        GameObject go = new GameObject();
        MeshFilter meshFilter = go.AddComponent<MeshFilter>();
        meshFilter.mesh = mesh;

        MeshRenderer meshRenderer = go.AddComponent<MeshRenderer>();

        //获取mtl文件路径
        string mtlFilePath = modelFilePath.Replace(".obj",".mtl");
        //从mtl文件中加载材质
        Material[] materials = ObjMaterial.Instance.LoadFormMtl(mtlFilePath, texturePath);
    }
示例#34
0
    static void Load(ObjMesh mesh, TextReader textReader)
    {
        vertices = new List<Vector3>();
        normals = new List<Vector3>();
        texCoords = new List<Vector2>();
        objVerticesIndexDictionary = new Dictionary<ObjMesh.ObjVertex, int>();
        objVertices = new List<ObjMesh.ObjVertex>();
        objTriangles = new List<ObjMesh.ObjTriangle>();
        objQuads = new List<ObjMesh.ObjQuad>();

        string line;
        while ((line = textReader.ReadLine()) != null)
        {
            line = line.Trim(splitCharacters);
            line = line.Replace("  ", " ");

            string[] parameters = line.Split(splitCharacters);

            switch (parameters[0])
            {
                case "p": // Point
                    break;

                case "v": // Vertex
                    float x = float.Parse(parameters[1]);
                    float y = float.Parse(parameters[2]);
                    float z = float.Parse(parameters[3]);
                    vertices.Add(new Vector3(x, y, z));
                    break;

                case "vt": // TexCoord
                    float u = float.Parse(parameters[1]);
                    float v = float.Parse(parameters[2]);
                    texCoords.Add(new Vector2(u, v));
                    break;

                case "vn": // Normal
                    float nx = float.Parse(parameters[1]);
                    float ny = float.Parse(parameters[2]);
                    float nz = float.Parse(parameters[3]);
                    normals.Add(new Vector3(nx, ny, nz));
                    break;

                case "f":
                    switch (parameters.Length)
                    {
                        case 4:
                            ObjMesh.ObjTriangle objTriangle = new ObjMesh.ObjTriangle();
                            objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                            objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                            objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                            objTriangles.Add(objTriangle);
                            break;

                        case 5:
                            ObjMesh.ObjQuad objQuad = new ObjMesh.ObjQuad();
                            objQuad.Index0 = ParseFaceParameter(parameters[1]);
                            objQuad.Index1 = ParseFaceParameter(parameters[2]);
                            objQuad.Index2 = ParseFaceParameter(parameters[3]);
                            objQuad.Index3 = ParseFaceParameter(parameters[4]);
                            objQuads.Add(objQuad);
                            break;
                    }
                    break;
            }
        }

        mesh.Vertices = objVertices.ToArray();
        mesh.Triangles = objTriangles.ToArray();
        mesh.Quads = objQuads.ToArray();

        objVerticesIndexDictionary = null;
        vertices = null;
        normals = null;
        texCoords = null;
        objVertices = null;
        objTriangles = null;
        objQuads = null;
    }
示例#35
0
    static void Load(ObjMesh mesh, StreamReader textReader)
    {
        //try {
        //vertices = null;
            //objVertices = null;
            if(vertices == null) {
        vertices = new List<Vector3>();
            }
            if(normals == null) {
        normals = new List<Vector3>();
            }
            if(texCoords == null) {
        texCoords = new List<Vector2>();
            }
            if(objVerticesIndexDictionary == null) {
        objVerticesIndexDictionary = new Dictionary<ObjMesh.ObjVertex, int>();
            }
            if(objVertices == null) {
        objVertices = new List<ObjMesh.ObjVertex>();
            }
        objTriangles = new List<ObjMesh.ObjTriangle>();
        objQuads = new List<ObjMesh.ObjQuad>();
            mesh.vertexPositionOffset = vertices.Count;
        string line;
        while ((line = textReader.ReadLine()) != null)
        {
            if(line.Length<2) {
            break;
            }
            line = line.Trim(splitCharacters);
            line = line.Replace("  ", " ");

            string[] parameters = line.Split(splitCharacters);

            switch (parameters[0])
            {
                case "usemtl":
                    //Material specification
                    try {
                    mesh.Material = materials[parameters[1]];
                    }catch(KeyNotFoundException) {
                    Console.WriteLine("WARNING: Texture parse failure: "+parameters[1]);
                    }
                    break;
                case "p": // Point
                    break;

                case "v": // Vertex
                    float x = parsefloat(parameters[1]);
                    float y = parsefloat(parameters[2]);
                    float z = parsefloat(parameters[3]);
                    vertices.Add(new Vector3(x, y, z));
                    break;

                case "vt": // TexCoord
                    float u = parsefloat(parameters[1]);
                    float v = parsefloat(parameters[2]);
                    texCoords.Add(new Vector2(u, v));
                    break;

                case "vn": // Normal
                    float nx = parsefloat(parameters[1]);
                    float ny = parsefloat(parameters[2]);
                    float nz = parsefloat(parameters[3]);
                    normals.Add(new Vector3(nx, ny, nz));
                    break;

                case "f":
                    switch (parameters.Length)
                    {
                        case 4:
                            ObjMesh.ObjTriangle objTriangle = new ObjMesh.ObjTriangle();
                            objTriangle.Index0 = ParseFaceParameter(parameters[1]);
                            objTriangle.Index1 = ParseFaceParameter(parameters[2]);
                            objTriangle.Index2 = ParseFaceParameter(parameters[3]);
                            objTriangles.Add(objTriangle);
                            break;

                        case 5:
                            ObjMesh.ObjQuad objQuad = new ObjMesh.ObjQuad();
                            objQuad.Index0 = ParseFaceParameter(parameters[1]);
                            objQuad.Index1 = ParseFaceParameter(parameters[2]);
                            objQuad.Index2 = ParseFaceParameter(parameters[3]);
                            objQuad.Index3 = ParseFaceParameter(parameters[4]);
                            objQuads.Add(objQuad);
                            break;
                    }
                    break;
            }

            }
        //}catch(Exception er) {
        //	Console.WriteLine(er);
        //	Console.WriteLine("Successfully recovered. Bounds/Collision checking may fail though");
        //}

        mesh.Vertices = objVertices.ToArray();
        mesh.Triangles = objTriangles.ToArray();
        mesh.Quads = objQuads.ToArray();
        textReader.BaseStream.Close();
    }
示例#36
0
文件: Mesh.cs 项目: IDWMaster/3DAPI
    public static ObjMesh deserialize(BinaryReader mreader)
    {
        ObjMesh mymesh = new ObjMesh();
        bool hasimage = mreader.ReadBoolean();
        if(hasimage) {
        int len = (int)mreader.ReadInt64();
            byte[] image = mreader.ReadBytes(len);
            MemoryStream mstream = new MemoryStream();
            mstream.Write(image,0,image.Length);
            mstream.Position = 0;
            try
            {
                mymesh.Material = new Bitmap(mstream);
            }
            catch (Exception)
            {

            }
        }

        mymesh.name = mreader.ReadString();
        mymesh.quads = new ObjMesh.ObjQuad[mreader.ReadInt32()];
        for(int i = 0;i<mymesh.quads.Length;i++) {
        ObjQuad currentQuad = new ObjQuad();
            currentQuad.Index0 = mreader.ReadInt32();
            currentQuad.Index1 = mreader.ReadInt32();
            currentQuad.Index2 = mreader.ReadInt32();
            currentQuad.Index3 = mreader.ReadInt32();
            mymesh.quads[i] = currentQuad;
        }
        mymesh.triangles = new ObjMesh.ObjTriangle[mreader.ReadInt32()];
        for(int i = 0;i<mymesh.triangles.Length;i++) {
        ObjTriangle currentQuad = new ObjTriangle();
            currentQuad.Index0 = mreader.ReadInt32();
            currentQuad.Index1 = mreader.ReadInt32();
            currentQuad.Index2 = mreader.ReadInt32();
            mymesh.triangles[i] = currentQuad;
        }
        mymesh.vertices = new ObjMesh.ObjVertex[mreader.ReadInt32()];
        for(int i = 0;i<mymesh.vertices.Length;i++) {
        ObjVertex mtex = new ObjVertex();
            mtex.Normal.X = mreader.ReadSingle();
            mtex.Normal.Y = mreader.ReadSingle();
            mtex.Normal.Z = mreader.ReadSingle();
            mtex.TexCoord.X = mreader.ReadSingle();
            mtex.TexCoord.Y = mreader.ReadSingle();
            mtex.Vertex.X = mreader.ReadSingle();
            mtex.Vertex.Y = mreader.ReadSingle();
            mtex.Vertex.Z = mreader.ReadSingle();
            mymesh.vertices[i] = mtex;
        }

        return mymesh;
    }
示例#37
0
文件: Mesh.cs 项目: IDWMaster/3DAPI
 public ObjMesh(System.IO.StreamReader file, ObjMesh prevmesh)
 {
     ObjMeshLoader.Load2(this,file,prevmesh);
 }