예제 #1
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;
    }
예제 #2
0
        public HeightMap(string fileName) : base()
        {
            // Load heightmap
            Bitmap bitmap;

            using (Stream imageStream = File.Open(fileName, FileMode.Open))
            {
                Image image = Image.FromStream(imageStream);
                bitmap = new Bitmap(image);
            }
            int h = bitmap.Height, w = bitmap.Width;

            Vector3[,] pos = new Vector3[h, w]; // all the positions
            Vector2[,] tex = new Vector2[h, w]; // all the texture coordinates

            // Read the height position from the image:
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    Color col = bitmap.GetPixel(i, j);
                    // 0f < brightness < 1f
                    pos[i, j] = 2 * new Vector3(1f * i / (h - 1), .5f * col.GetBrightness() + .5f, 1f * j / (w - 1)) - Vector3.One;
                    // everything is evenly divided over the texture.
                    tex[i, j] = new Vector2(1f * i / (h - 1), 1f * j / (w - 1));
                }
            }
            // Now we will make the mesh:
            if (MAKE_QUADS)
            {
                vertices  = new ObjVertex[4 * (h - 1) * (w - 1)];
                triangles = new ObjTriangle[0];
                quads     = new ObjQuad[(h - 1) * (w - 1)];
                for (int i = 0; i + 1 < h; i++)
                {
                    for (int j = 0; j + 1 < w; j++)
                    {
                        int       offset = 4 * ((w - 1) * i + j);
                        Vector3[] vv     = new Vector3[] { pos[i, j], pos[i, j + 1], pos[i + 1, j], pos[i + 1, j + 1] };
                        Vector2[] uv     = new Vector2[] { tex[i, j], tex[i, j + 1], tex[i + 1, j], tex[i + 1, j + 1] };

                        Vector3[] ts = new Vector3[] { Vector3.Zero, Vector3.Zero, Vector3.Zero, Vector3.Zero };
                        // calculate the tangents as an average over all the possible triangles to make with others of the quad.
                        for (int k = 0; k < 4; k++)
                        {
                            Vector3[] tinc = new Vector3[] { Vector3.Zero, Vector3.Zero, Vector3.Zero, Vector3.Zero };
                            MeshLoader.GetTangents(vv[(k + 1) % 4], vv[(k + 2) % 4], vv[(k + 3) % 4], uv[(k + 1) % 4], uv[(k + 2) % 4], uv[(k + 3) % 4], out tinc[1], out tinc[2], out tinc[3]);
                            for (int l = 1; l < 4; l++)
                            {
                                ts[(k + l) % 4] += tinc[l] / 3f;
                            }
                        }

                        for (int k = 0; k < 4; k++)
                        {
                            vertices[offset + k] = new ObjVertex(uv[k], ts[k], Vector3.UnitY, vv[k]);
                        }
                        quads[offset / 4] = new ObjQuad(offset + 0, offset + 1, offset + 2, offset + 3);
                    }
                }
            }
            else
            {
                vertices  = new ObjVertex[6 * (h - 1) * (w - 1)];
                triangles = new ObjTriangle[2 * (h - 1) * (w - 1)];
                quads     = new ObjQuad[0];
                for (int i = 0; i + 1 < h; i++)
                {
                    for (int j = 0; j + 1 < w; j++)
                    {
                        for (int k = 0; k < 2; k++)
                        {
                            Vector3 v0 = pos[i, j], v1 = pos[i + 1, j + 1], v2 = pos[i + k, j + 1 - k];
                            Vector2 uv0 = tex[i, j], uv1 = tex[i + 1, j + 1], uv2 = tex[i + k, j + 1 - k];

                            Vector3 t0, t1, t2;
                            MeshLoader.GetTangents(v0, v1, v2, uv0, uv1, uv2, out t0, out t1, out t2);

                            int offset = 6 * ((w - 1) * i + j) + 3 * k;
                            vertices[offset + 0]  = new ObjVertex(uv0, t0, Vector3.UnitY, v0);
                            vertices[offset + 1]  = new ObjVertex(uv1, t1, Vector3.UnitY, v1);
                            vertices[offset + 2]  = new ObjVertex(uv2, t2, Vector3.UnitY, v2);
                            triangles[offset / 3] = new ObjTriangle(offset + 0, offset + 1, offset + 2);
                        }
                    }
                }
            }
        }