コード例 #1
0
ファイル: Warp3DRenderer.cs プロジェクト: jhurliman/simian
        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);
            }
        }
コード例 #2
0
ファイル: MeshTests.cs プロジェクト: jhurliman/simian
        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]);
                }
            }
        }
コード例 #3
0
ファイル: PrimMesher.cs プロジェクト: osgrid/openmetaverse
        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;
            }
        }