public MeshVolumeFormula(List <Term1D> xTerms, List <Term1D> yTerms, List <Term2D> xyTerms, float k, MeshID id, float relativeVolume) { m_formula = new Polynome2D(k); foreach (Term1D term in xTerms) { m_formula.AddXTerm(term); } foreach (Term1D term in yTerms) { m_formula.AddYTerm(term); } foreach (Term2D term in xyTerms) { m_formula.AddXYTerm(term); } m_id = id; m_relativeVolume = relativeVolume; }
public MeshVolumeFormula(Polynome2D formula, MeshID id, float relativeVolume) { m_formula = new Polynome2D(formula.k); foreach (Term1D term in formula.xTerms) { m_formula.AddXTerm(term); } foreach (Term1D term in formula.yTerms) { m_formula.AddYTerm(term); } foreach (Term2D term in formula.xyTerms) { m_formula.AddXYTerm(term); } m_id = id; m_relativeVolume = relativeVolume; }
internal static void CombineSubMeshes(TreeInfo treeInfo, MeshQuery[] meshQueries, VertexChannelFlags vertexChannelMask) { var subMeshCounts = treeInfo.subMeshCounts; subMeshCounts.Clear(); var treeBrushNodeIDs = treeInfo.treeBrushes; var treeBrushNodeCount = (Int32)(treeBrushNodeIDs.Count); if (treeBrushNodeCount <= 0) { return; } var uniqueMeshDescriptions = new Dictionary <MeshID, int>(); for (Int32 b = 0, count_b = treeBrushNodeCount; b < count_b; b++) { var nodeID = treeBrushNodeIDs[b]; var nodeIndex = nodeID - 1; var nodeType = nodeFlags[nodeIndex].nodeType; if (nodeType != CSGNodeType.Brush) { continue; } var brushOutput = nodeHierarchies[nodeIndex].brushOutput; //var operation_type_bits = GetNodeOperationByIndex(nodeIndex); if (brushOutput == null //|| //brush.triangleMesh == null //|| //((int)operation_type_bits & InfiniteBrushBits) == InfiniteBrushBits ) { continue; } var renderBuffers = brushOutput.renderBuffers; if (renderBuffers.surfaceRenderBuffers.Count == 0) { continue; } var surfaceRenderBuffers = renderBuffers.surfaceRenderBuffers; for (int j = 0, count_j = (int)renderBuffers.surfaceRenderBuffers.Count; j < count_j; j++) { var brushSurfaceBuffer = surfaceRenderBuffers[j]; var surfaceVertexCount = (brushSurfaceBuffer.vertices == null) ? 0 : brushSurfaceBuffer.vertices.Length; var surfaceIndexCount = (brushSurfaceBuffer.indices == null) ? 0 : brushSurfaceBuffer.indices.Length; if (surfaceVertexCount <= 0 || surfaceIndexCount <= 0) { continue; } var surfaceParameter = (brushSurfaceBuffer.meshQuery.LayerParameterIndex == LayerParameterIndex.None) ? 0 : brushSurfaceBuffer.surfaceParameter; var meshID = new MeshID() { meshQuery = brushSurfaceBuffer.meshQuery, surfaceParameter = surfaceParameter }; int generatedMeshIndex; if (!uniqueMeshDescriptions.TryGetValue(meshID, out generatedMeshIndex)) { generatedMeshIndex = -1; } if (generatedMeshIndex == -1 || (subMeshCounts[generatedMeshIndex].vertexCount + surfaceVertexCount) >= kMaxVertexCount) { int meshIndex, subMeshIndex; if (generatedMeshIndex != -1) { generatedMeshIndex = (int)subMeshCounts.Count; var prevMeshCountIndex = generatedMeshIndex; subMeshIndex = subMeshCounts[prevMeshCountIndex].subMeshIndex + 1; meshIndex = subMeshCounts[prevMeshCountIndex].meshIndex; } else { generatedMeshIndex = (int)subMeshCounts.Count; meshIndex = generatedMeshIndex; subMeshIndex = 0; } uniqueMeshDescriptions[meshID] = generatedMeshIndex; SubMeshCounts newSubMesh = new SubMeshCounts(); newSubMesh.meshIndex = meshIndex; newSubMesh.subMeshIndex = subMeshIndex; newSubMesh.meshQuery = meshID.meshQuery; newSubMesh.surfaceIdentifier = surfaceParameter; newSubMesh.indexCount = surfaceIndexCount; newSubMesh.vertexCount = surfaceVertexCount; newSubMesh.surfaceHash = brushSurfaceBuffer.surfaceHash; newSubMesh.geometryHash = brushSurfaceBuffer.geometryHash; newSubMesh.surfaces.Add(brushSurfaceBuffer); subMeshCounts.Add(newSubMesh); continue; } var currentSubMesh = subMeshCounts[generatedMeshIndex]; currentSubMesh.indexCount += surfaceIndexCount; currentSubMesh.vertexCount += surfaceVertexCount; currentSubMesh.surfaceHash = Hashing.XXH64_mergeRound(currentSubMesh.surfaceHash, brushSurfaceBuffer.surfaceHash); currentSubMesh.geometryHash = Hashing.XXH64_mergeRound(currentSubMesh.geometryHash, brushSurfaceBuffer.geometryHash); currentSubMesh.surfaces.Add(brushSurfaceBuffer); } } for (int i = (int)subMeshCounts.Count - 1; i >= 0; i--) { if (subMeshCounts[i].vertexCount != 0 && subMeshCounts[i].indexCount != 0) { continue; } subMeshCounts.RemoveAt(i); } }