예제 #1
0
        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);
            }
예제 #2
0
        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);
        }