private Mesh CreateMesh(MeshData[] meshes) { Mesh mesh = new Mesh(); foreach (MeshData data in meshes) { if (data == null) continue; bool use_alpha = (data.Color[0] < 0.9999f); MeshBuffer mb = new MeshBuffer(VertexType.Standard); for (uint i = 0; i < data.Indices.Length; i++) { VertexData v = data.Vertices[data.Indices[i]]; mb.SetVertex(i, new Vertex3D( new Vector3D(v.Position[0], v.Position[1], v.Position[2]), new Vector3D(v.Normal[0], v.Normal[1], v.Normal[2]), Color.White, new Vector2D(v.UV[0], v.UV[1]) )); mb.SetIndex(i, (ushort)data.Indices[i]); } mb.SetColor(Util.ToColor(data.Color[0], data.Color[1], data.Color[2], data.Color[3])); mb.Material.AmbientColor = Util.ToColor(1, data.Color[1], data.Color[2], data.Color[3]); TextureInfo info = null; if (data.Texture1DownLoaded) info = Render.Texture.GetTexture(Path.Combine(Ox.Paths.Cache, data.Texture1), true, true); if (info != null) { mb.Material.Texture1 = (info.Texture == null) ? Render.RenderData.BlankTexture : info.Texture; use_alpha |= info.UseAlpha; } mb.Material.MaterialType = use_alpha ? MaterialType.TransparentAlphaChannel : MaterialType.Solid; mesh.AddMeshBuffer(mb); } return mesh; }
private Mesh UpdateMesh(MeshData[] meshes, Mesh mesh) { if (mesh != null) mesh.Drop(); return CreateMesh(meshes); }
private MeshData[] GetMeshsDataFromPrimFaces(Primitive prim, ViewerFace[] faces) { int dt_index = Primitive.TextureEntry.MAX_FACES; Primitive.TextureEntryFace[] entries = new Primitive.TextureEntryFace[Primitive.TextureEntry.MAX_FACES + 1]; for (int i = 0; i < Primitive.TextureEntry.MAX_FACES; i++) entries[i] = prim.Textures.FaceTextures[i]; entries[dt_index] = prim.Textures.DefaultTexture; int faceCount = 0; Dictionary<int, int> faceDic = new Dictionary<int, int>(); List<int> faceList = new List<int>(); List<VertexData>[] vertexList = new List<VertexData>[entries.Length]; List<uint>[] indexList = new List<uint>[entries.Length]; foreach (ViewerFace face in faces) { int face_number = (entries[face.primFaceNumber] == null) ? dt_index : face.primFaceNumber; if (!faceDic.ContainsKey(face_number)) { vertexList[faceCount] = new List<VertexData>(); indexList[faceCount] = new List<uint>(); faceList.Add(face_number); faceDic.Add(face_number, faceCount++); } int index = faceDic[face_number]; uint i_count = (uint)indexList[index].Count; // Vertex 1 vertexList[index].Add(new VertexData( new float[] { face.v1.X, face.v1.Y, face.v1.Z }, new float[] { face.n1.X, face.n1.Y, face.n1.Z }, new float[] { face.uv1.U, face.uv1.V }, null )); indexList[index].Add(i_count++); // Vertex 2 vertexList[index].Add(new VertexData( new float[] { face.v2.X, face.v2.Y, face.v2.Z }, new float[] { face.n2.X, face.n2.Y, face.n2.Z }, new float[] { face.uv2.U, face.uv2.V }, null )); indexList[index].Add(i_count++); // Vertex 3 vertexList[index].Add(new VertexData( new float[] { face.v3.X, face.v3.Y, face.v3.Z }, new float[] { face.n3.X, face.n3.Y, face.n3.Z }, new float[] { face.uv3.U, face.uv3.V }, null )); indexList[index].Add(i_count++); } MeshData[] meshes = new MeshData[faceCount]; for (int i = 0; i < meshes.Length; i++) { Primitive.TextureEntryFace entry = entries[faceList[i]]; meshes[i] = new MeshData(); meshes[i].Vertices = new VertexData[vertexList[i].Count]; meshes[i].Indices = new uint[indexList[i].Count]; meshes[i].Texture1 = entry.TextureID.ToString() + ".tga"; meshes[i].Color = new float[] { entry.RGBA.A, entry.RGBA.R, entry.RGBA.G, entry.RGBA.B }; vertexList[i].CopyTo(meshes[i].Vertices); indexList[i].CopyTo(meshes[i].Indices); } return meshes; }