Example #1
0
File: Prim.cs Project: yooyke/work
        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;
        }
Example #2
0
File: Prim.cs Project: yooyke/work
        private Mesh UpdateMesh(MeshData[] meshes, Mesh mesh)
        {
            if (mesh != null)
                mesh.Drop();

            return CreateMesh(meshes);
        }
Example #3
0
        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;
        }