public Vector3 CenterAndSnapPlanes(ref ChiselSurfaceDefinition surfaceDefinition) { Profiler.BeginSample("CenterAndSnapPlanes"); /* * for (int p = 0; p < polygons.Length; p++) * { * var plane = planes[p]; * var edgeFirst = polygons[p].firstEdge; * var edgeLast = edgeFirst + polygons[p].edgeCount; * for (int e = edgeFirst; e < edgeLast; e++) * { * var vertexIndex = halfEdges[e].vertexIndex; * vertices[vertexIndex] = (float3)MathExtensions.ProjectPointPlane(vertices[vertexIndex], plane); * } * } */ var dmin = (double3)vertices[0]; var dmax = dmin; for (int i = 1; i < vertices.Length; i++) { dmin = math.min(dmin, vertices[i]); dmax = math.max(dmax, vertices[i]); } var center = (float3)((dmin + dmax) * 0.5); var translate = float4x4.Translate(center); for (int i = 0; i < polygons.Length; i++) { ref var surface = ref surfaceDefinition.surfaces[i]; var localSpaceToPlaneSpace = MathExtensions.GenerateLocalToPlaneSpaceMatrix(planes[i]); var originalUVMatrix = surface.surfaceDescription.UV0.ToFloat4x4(); planes[i].w += math.dot(planes[i].xyz, center); var translatedPlaneSpaceToLocalSpace = math.inverse(MathExtensions.GenerateLocalToPlaneSpaceMatrix(planes[i])); var newUVMatrix = math.mul(math.mul(math.mul( originalUVMatrix, localSpaceToPlaneSpace), translate), translatedPlaneSpaceToLocalSpace); surface.surfaceDescription.UV0 = new UVMatrix(newUVMatrix); }
internal static void GenerateSurfaceRenderBuffers(int brushNodeID, LoopList loopList) { var output = CSGManager.GetBrushOutput(brushNodeID); var brushInstance = CSGManager.GetBrushMeshID(brushNodeID); var mesh = BrushMeshManager.GetBrushMesh(brushInstance); var meshPolygons = mesh.polygons; var meshSurfaces = mesh.surfaces; Matrix4x4 worldToLocal = Matrix4x4.identity; CSGManager.GetTreeToNodeSpaceMatrix(brushNodeID, out worldToLocal); var outputSurfaces = new CSGSurfaceRenderBuffer[loopList.loops.Count]; // TODO: should be same size as brush.surfaces.Length int outputSurfaceCount = 0; foreach (var loop in loopList.loops) { var polygonIndex = loop.basePlaneIndex; // TODO: fix this var meshPolygon = meshPolygons[polygonIndex]; var surfaceIndex = meshPolygon.surfaceID; // TODO: fix this var localSpaceToPlaneSpace = MathExtensions.GenerateLocalToPlaneSpaceMatrix(meshSurfaces[surfaceIndex].plane); var uv0Matrix = meshPolygon.description.UV0.ToMatrix() * (localSpaceToPlaneSpace * worldToLocal); // TODO: all separate loops on same surface should be put in same OutputSurfaceMesh if (!loop.Triangulate(uv0Matrix, ref outputSurfaces[outputSurfaceCount])) { continue; } // TODO: make this work // outputSurfaces[outputSurfaceCount].meshQuery = loop.layers; //??? // outputSurfaces[outputSurfaceCount].surfaceParameter = loop.surfaceParameter; //??? outputSurfaces[outputSurfaceCount].surfaceIndex = surfaceIndex; outputSurfaceCount++; } if (outputSurfaceCount != loopList.loops.Count) { Array.Resize(ref outputSurfaces, outputSurfaceCount); } output.renderBuffers.surfaceRenderBuffers.AddRange(outputSurfaces); }