Exemplo n.º 1
0
    void Start()
    {
        if (model != null)
        {
            mesh          = model.sharedMesh;
            meshVertices  = mesh.vertices;
            meshTriangles = mesh.triangles;
            for (int i = 0; i < meshVertices.Length; i++)
            {
                meshVertices[i] = model.transform.TransformPoint(meshVertices[i]);
            }
            binarySpacePartition = new BSP(mesh, 14);

#if G3_USING_UNITY
            DMesh3Builder dMeshBuilder = new DMesh3Builder();
            dMeshBuilder.AppendNewMesh(false, false, false, false);
            foreach (Vector3 vertex in meshVertices)
            {
                dMeshBuilder.AppendVertex(vertex.x, vertex.y, vertex.z);
            }
            for (int i = 0; i < meshTriangles.Length; i += 3)
            {
                dMeshBuilder.AppendTriangle(meshTriangles[i], meshTriangles[i + 1], meshTriangles[i + 2]);
            }
            g3MeshTree = new DMeshAABBTree3(dMeshBuilder.Meshes[0]);
            g3MeshTree.Build();
#endif
        }
    }
        public override bool BuildOnMesh(DMesh3Builder meshBuilder)
        {
            var doorCopy = new DMesh3(Mesh, bCompact: true);

            if (FrontNormal == -Vector3d.AxisZ)
            {
                // trick to prevent 180 rotation
                FrontNormal += new Vector3d(0.0000001, 0.0, 0.0);
            }

            var meshWidth  = doorCopy.GetBounds().Width;
            var meshHeight = doorCopy.GetBounds().Height;

            var widthScale  = WidthLimit / meshWidth;
            var heightScale = HeightLimit / meshHeight;

            Quaterniond orientingQuaternion = new Quaterniond(Vector3d.AxisZ, FrontNormal);

            MeshTransforms.Rotate(doorCopy, Vector3d.Zero, orientingQuaternion);
            MeshTransforms.Scale(doorCopy, Math.Min(widthScale, heightScale));
            MeshTransforms.Translate(doorCopy, Origin);

            meshBuilder.AppendNewMesh(doorCopy);
            meshBuilder.SetActiveMesh(0);
            return(true);
        }
Exemplo n.º 3
0
    void Start()
    {
        if (model != null)
        {
            mesh          = model.sharedMesh;
            meshVertices  = mesh.vertices;
            meshTriangles = mesh.triangles;
            for (int i = 0; i < meshVertices.Length; i++)
            {
                meshVertices[i] = model.transform.TransformPoint(meshVertices[i]);
            }
            binarySpacePartition = new BSP(mesh, 14);

            if (diskMaterial)
            {
                int numDisksToDraw = Mathf.Min(binarySpacePartition.splittingDisks.Length, 15);
                diskMatrices = new Matrix4x4[numDisksToDraw];
                for (int i = 0; i < numDisksToDraw; i++)
                {
                    diskMatrices[i] = Matrix4x4.TRS(
                        binarySpacePartition.splittingDisks[i].average,
                        Quaternion.LookRotation(binarySpacePartition.splittingDisks[i].plane),
                        new Vector3(1f, 1f, 0.0001f) * Mathf.Sqrt(binarySpacePartition.splittingDisks[i].sqRadius));
                }
            }

#if G3_USING_UNITY
            DMesh3Builder dMeshBuilder = new DMesh3Builder();
            dMeshBuilder.AppendNewMesh(false, false, false, false);
            foreach (Vector3 vertex in meshVertices)
            {
                dMeshBuilder.AppendVertex(vertex.x, vertex.y, vertex.z);
            }
            for (int i = 0; i < meshTriangles.Length; i += 3)
            {
                dMeshBuilder.AppendTriangle(meshTriangles[i], meshTriangles[i + 1], meshTriangles[i + 2]);
            }
            g3MeshTree = new DMeshAABBTree3(dMeshBuilder.Meshes[0]);
            g3MeshTree.Build();
#endif
        }
    }
        public override bool BuildOnMesh(DMesh3Builder meshBuilder)
        {
            DMesh3 windowCopy = null;

            BuildingTask = Task.Run(() =>
            {
                windowCopy = new DMesh3(Mesh, bCompact: true);
                //var windowCopy = Mesh;
                if (FrontNormal == -Vector3d.AxisZ)
                {
                    // trick to prevent 180 rotation
                    FrontNormal += new Vector3d(0.0000001, 0.0, 0.0);
                }

                var meshWidth  = windowCopy.GetBounds().Width;
                var meshHeight = windowCopy.GetBounds().Height;

                var widthScale    = WidthLimit / meshWidth;
                var heightScale   = HeightLimit / meshHeight;
                var selectedScale = Math.Min(widthScale, heightScale);

                Quaterniond orientingQuaternion = new Quaterniond(Vector3d.AxisZ, FrontNormal);
                MeshTransforms.Rotate(windowCopy, Vector3d.Zero, orientingQuaternion);

                MeshTransforms.Scale(windowCopy, selectedScale);

                MeshTransforms.Translate(windowCopy, Origin);
                //MeshTransforms.Translate(windowCopy, Origin + Vector3d.AxisY * meshHeight * selectedScale * 0.6);
            }).ContinueWith(t =>
            {
                lock (meshBuilder)
                {
                    meshBuilder.AppendNewMesh(windowCopy);
                    meshBuilder.SetActiveMesh(0);
                }
            });

            return(true);
        }