private void CreatePrim(WarpRenderer renderer, LLPrimitive prim, IPrimMesher primMesher) { const float MIN_SIZE = 2f; if (prim.Prim.PrimData.PCode != PCode.Prim) { return; } if (prim.Scale.LengthSquared() < MIN_SIZE * MIN_SIZE) { return; } RenderingMesh renderMesh; DetailLevel lod = DetailLevel.Medium; renderMesh = primMesher.GetRenderingMesh(prim, lod); if (renderMesh == null) { return; } warp_Vector primPos = ConvertVector(prim.ScenePosition); warp_Quaternion primRot = ConvertQuaternion(prim.RelativeRotation); warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); if (prim.Parent != null) { m.transform(warp_Matrix.quaternionMatrix(ConvertQuaternion(prim.Parent.RelativeRotation))); } warp_Vector primScale = ConvertVector(prim.Scale); string primID = prim.ID.ToString(); // Create the prim faces for (int i = 0; i < renderMesh.Faces.Length; i++) { RenderingMesh.Face face = renderMesh.Faces[i]; string meshName = primID + "-Face-" + i.ToString(); warp_Object faceObj = new warp_Object(face.Vertices.Length, face.Indices.Length / 3); for (int j = 0; j < face.Vertices.Length; j++) { Vertex v = face.Vertices[j]; warp_Vector pos = ConvertVector(v.Position); warp_Vector norm = ConvertVector(v.Normal); if (prim.Prim.Sculpt == null || prim.Prim.Sculpt.SculptTexture == UUID.Zero) { norm = norm.reverse(); } warp_Vertex vert = new warp_Vertex(pos, norm, v.TexCoord.X, v.TexCoord.Y); faceObj.addVertex(vert); } for (int j = 0; j < face.Indices.Length; j += 3) { faceObj.addTriangle( face.Indices[j + 0], face.Indices[j + 1], face.Indices[j + 2]); } Primitive.TextureEntryFace teFace = prim.Prim.Textures.GetFace((uint)i); Color4 faceColor = GetFaceColor(teFace); string materialName = GetOrCreateMaterial(renderer, faceColor); faceObj.transform(m); faceObj.setPos(primPos); faceObj.scaleSelf(primScale.x, primScale.y, primScale.z); renderer.Scene.addObject(meshName, faceObj); renderer.SetObjectMaterial(meshName, materialName); } }
public void RenderingMeshSerializationTest() { const int FACES = 13; const int MAX_VERTICES = 499; const int MAX_INDICES = 1009; RenderingMesh mesh = new RenderingMesh(); mesh.Faces = new RenderingMesh.Face[FACES]; for (int i = 0; i < FACES; i++) { RenderingMesh.Face face = new RenderingMesh.Face(); face.Vertices = new Vertex[m_rng.Next(MAX_VERTICES)]; for (int j = 0; j < face.Vertices.Length; j++) { face.Vertices[j] = new Vertex { Normal = RandomVector(), Position = RandomVector(), TexCoord = new Vector2(0.5f, 0.5f) } } ; face.Indices = new ushort[m_rng.Next(MAX_INDICES)]; for (int j = 0; j < face.Indices.Length; j++) { face.Indices[j] = (ushort)m_rng.Next(face.Vertices.Length); } mesh.Faces[i] = face; } byte[] data = mesh.Serialize(); RenderingMesh mesh2 = RenderingMesh.Deserialize(data); Assert.AreEqual(mesh.Faces.Length, mesh2.Faces.Length); for (int i = 0; i < mesh.Faces.Length; i++) { RenderingMesh.Face face = mesh.Faces[i]; RenderingMesh.Face face2 = mesh2.Faces[i]; Assert.AreEqual(face.Vertices.Length, face2.Vertices.Length); Assert.AreEqual(face.Indices.Length, face2.Indices.Length); for (int j = 0; j < face.Vertices.Length; j++) { Vertex v = face.Vertices[j]; Vertex v2 = face2.Vertices[j]; Assert.AreEqual(v.Position, v2.Position); Assert.AreEqual(v.Normal, v2.Normal); Assert.AreEqual(v.TexCoord, v2.TexCoord); } for (int j = 0; j < face.Indices.Length; j++) { Assert.AreEqual(face.Indices[j], face2.Indices[j]); } } }
public RenderingMesh GetRenderingMesh(LLPrimitive prim, DetailLevel lod) { OMVR.FacetedMesh omvrMesh = null; if (prim.Prim.Sculpt != null && prim.Prim.Sculpt.SculptTexture != UUID.Zero) { SculptMesh mesh = GetSculptMesh(prim, lod, false); if (mesh != null) omvrMesh = GenerateFacetedMesh(1, prim.Prim, mesh.viewerFaces); } else { PrimMesh mesh = GetPrimMesh(prim, lod, false); if (mesh != null) omvrMesh = GenerateFacetedMesh(mesh.numPrimFaces, prim.Prim, mesh.viewerFaces); } if (omvrMesh != null) { // Copy the faces RenderingMesh.Face[] renderingFaces = new RenderingMesh.Face[omvrMesh.Faces.Count]; for (int i = 0; i < omvrMesh.Faces.Count; i++) { OMVR.Face face = omvrMesh.Faces[i]; RenderingMesh.Face renderingFace = new RenderingMesh.Face(); // Copy the vertices for this face renderingFace.Vertices = new Vertex[face.Vertices.Count]; for (int j = 0; j < face.Vertices.Count; j++) { OMVR.Vertex vertex = face.Vertices[j]; renderingFace.Vertices[j] = new Vertex { Position = vertex.Position, Normal = vertex.Normal, TexCoord = vertex.TexCoord }; } // Copy the indices for this face renderingFace.Indices = face.Indices.ToArray(); renderingFaces[i] = renderingFace; } return new RenderingMesh { Faces = renderingFaces }; } else { return null; } }