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); }
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); }