Ejemplo n.º 1
0
        public void RemoveOverlappingVertices(CSGMeshingSettings _settings)
        {
            List <CSGVertex> vertices = new List <CSGVertex>();
            List <int>       indices  = new List <int>();

            //Position -> new Index
            Dictionary <Vector3, int> vertexPositonCheckList = new Dictionary <Vector3, int>();

            int existingVertex = -1;

            for (int indexIter = 0; indexIter < m_indices.Count; indexIter++)
            {
                Vector3 currentPosition = Round(m_vertices[m_indices[indexIter]].m_position, _settings.m_overlappingRounding);
                if (!vertexPositonCheckList.TryGetValue(currentPosition, out existingVertex))
                {
                    vertexPositonCheckList.Add(currentPosition, vertices.Count);
                    indices.Add(vertices.Count);
                    vertices.Add(new CSGVertex(currentPosition, m_vertices[m_indices[indexIter]].m_normal,
                                               m_vertices[m_indices[indexIter]].m_uv, m_vertices[m_indices[indexIter]].m_color));
                }
                else
                {
                    vertices[existingVertex].AddToSharedNormal(m_vertices[m_indices[indexIter]].m_normal);
                    indices.Add(existingVertex);
                }

                existingVertex = -1;
            }

            m_vertices.Clear();
            m_vertices.AddRange(vertices);

            m_indices.Clear();
            m_indices.AddRange(indices);
        }
Ejemplo n.º 2
0
        // Return a new CSG solid representing space both this solid and in the
        // solid `csg`. Neither this solid nor the solid `csg` are modified.
        public static List <Mesh> Intersect(CSGNode _nodeAIn, CSGNode _nodeBIn, CSGMeshingSettings _meshSettings)
        {
            List <Mesh> resultantMeshes = new List <Mesh>();

            CSGNode nodeA = _nodeAIn.Clone();
            CSGNode nodeB = _nodeBIn.Clone();

            nodeA.Invert();
            nodeB.ClipTo(nodeA);
            nodeB.Invert();
            nodeA.ClipTo(nodeB);
            nodeB.ClipTo(nodeA);
            nodeA.Build(nodeB.AllPolygons());
            nodeA.Invert();

            CSGModel resultModel = new CSGModel(nodeA.AllPolygons());

            if (resultModel.SubDivideMesh(_meshSettings))
            {
                for (int subMeshIter = 0; subMeshIter < resultModel.m_subModels.Count; subMeshIter++)
                {
                    resultantMeshes.Add(resultModel.m_subModels[subMeshIter].ToMesh());
                }
            }
            else
            {
                resultantMeshes.Add(resultModel.ToMesh());
            }

            return(resultantMeshes);
        }
Ejemplo n.º 3
0
        public static List <Mesh> Subtract(GameObject _objectA, GameObject _objectB, CSGMeshingSettings _meshSettings)
        {
            CSGModel modelA = new CSGModel(_objectA);
            CSGModel modelB = new CSGModel(_objectB);

            CSGNode nodeA = new CSGNode(modelA.ToPolygons());
            CSGNode nodeB = new CSGNode(modelB.ToPolygons());

            return(CSGNode.Subtract(nodeA, nodeB, _meshSettings));
        }
Ejemplo n.º 4
0
        public void MakeWaterTight(CSGMeshingSettings _settings)
        {
            int  count             = 0;
            bool subdividedPolygon = false;

            do
            {
                count++;
                subdividedPolygon = false;

                for (int vertexIter = 0; vertexIter < m_vertices.Count; vertexIter++)
                {
                    for (int polygonIter = 0; polygonIter < m_indices.Count / 3; polygonIter++)
                    {
                        int indexA = polygonIter * 3;
                        int indexB = (polygonIter * 3) + 1;
                        int indexC = (polygonIter * 3) + 2;

                        int vertexA = m_indices[indexA];
                        int vertexB = m_indices[indexB];
                        int vertexC = m_indices[indexC];

                        List <int> indices = new List <int>();

                        indices.AddRange(SubDividePolygon(vertexIter, vertexA, vertexB, vertexC, 0));
                        if (indices.Count > 0)
                        {
                            m_indices.RemoveRange(indexA, 3);
                            m_indices.AddRange(indices);
                            subdividedPolygon = true;
                            break;
                        }

                        indices.AddRange(SubDividePolygon(vertexIter, vertexB, vertexC, vertexA, 1));
                        if (indices.Count > 0)
                        {
                            m_indices.RemoveRange(indexA, 3);
                            m_indices.AddRange(indices);
                            subdividedPolygon = true;
                            break;
                        }

                        indices.AddRange(SubDividePolygon(vertexIter, vertexC, vertexA, vertexB, 2));
                        if (indices.Count > 0)
                        {
                            m_indices.RemoveRange(indexA, 3);
                            m_indices.AddRange(indices);
                            subdividedPolygon = true;
                            break;
                        }
                    }
                }
            } while (_settings.m_useInterpolation ?
                     count < _settings.m_proofingInterpolation : subdividedPolygon);
        }
Ejemplo n.º 5
0
        // Return a new CSG solid representing space in this solid but not in the
        // solid `csg`. Neither this solid nor the solid `csg` are modified.
        public static List <Mesh> HVSubtract(CSGNode _nodeAIn, CSGNode _nodeBIn, CSGMeshingSettings _meshSettings)
        {
            List <Mesh> resultantMeshes = new List <Mesh>();

            CSGNode nodeA = _nodeAIn.Clone();
            CSGNode nodeB = _nodeBIn.Clone();

            nodeA.ClipTo(nodeB);

            CSGModel resultantModels = new CSGModel(nodeA.AllPolygons());

            resultantModels.SubDivideMesh(_meshSettings);
            resultantMeshes.Add(resultantModels.ToMesh());
            return(resultantMeshes);
        }
Ejemplo n.º 6
0
        // Return a new CSG solid representing space in either this solid or in the
        // solid `csg`. Neither this solid nor the solid `csg` are modified.
        public static List <Mesh> NVUnion(CSGNode _nodeAIn, CSGNode _nodeBIn, CSGMeshingSettings _meshSettings)
        {
            List <Mesh> resultantMeshes = new List <Mesh>();

            CSGNode nodeA = _nodeAIn.Clone();
            CSGNode nodeB = _nodeBIn.Clone();

            nodeA.Build(nodeB.AllPolygons());

            CSGModel resultantModel = new CSGModel(nodeA.AllPolygons());

            resultantModel.SubDivideMesh(_meshSettings);
            resultantMeshes.Add(resultantModel.ToMesh());

            return(resultantMeshes);
        }
Ejemplo n.º 7
0
        public bool SubDivideMesh(CSGMeshingSettings _settings)
        {
            if (_settings.m_useMeshing)
            {
                if (_settings.m_removeOverlaps)
                {
                    RemoveOverlappingVertices(_settings);
                }

                if (_settings.m_waterTightMesh)
                {
                    MakeWaterTight(_settings);
                }

                if (_settings.m_subdivideModel)
                {
                    return(SubDivideModel());
                }
            }
            return(false);
        }
Ejemplo n.º 8
0
        // Return a new CSG solid representing space both this solid and in the
        // solid `csg`. Neither this solid nor the solid `csg` are modified.
        public static List <Mesh> NVIntersect(CSGNode _nodeAIn, CSGNode _nodeBIn, CSGNode _nodeCIn,
                                              CSGNode _nodeDIn, CSGNode _nodeEIn, CSGNode _nodeFIn, CSGMeshingSettings _meshSettings)
        {
            List <Mesh> resultantMeshes = new List <Mesh>();

            CSGNode nodeA = _nodeAIn.Clone();
            CSGNode nodeB = _nodeBIn.Clone();
            CSGNode nodeC = _nodeCIn.Clone();
            CSGNode nodeD = _nodeDIn.Clone();
            CSGNode nodeE = _nodeEIn.Clone();
            CSGNode nodeF = _nodeFIn.Clone();

            nodeA.ClipTo(nodeB);
            nodeA.ClipTo(nodeC);
            nodeA.ClipTo(nodeD);
            nodeA.ClipTo(nodeE);
            nodeA.ClipTo(nodeF);

            CSGModel resultantModels = new CSGModel(nodeA.AllPolygons());

            resultantModels.SubDivideMesh(_meshSettings);
            resultantMeshes.Add(resultantModels.ToMesh());
            return(resultantMeshes);
        }
Ejemplo n.º 9
0
        // Return a new CSG solid representing space in this solid but not in the
        // solid `csg`. Neither this solid nor the solid `csg` are modified.
        public static List <Mesh> NVSubtract(CSGNode _nodeAIn, CSGNode _nodeBIn, CSGNode _nodeCIn, CSGNode _nodeDIn, CSGMeshingSettings _meshSettings)
        {
            List <Mesh> resultantMeshes = new List <Mesh>();

            CSGNode nodeA = _nodeAIn.Clone();
            CSGNode nodeB = _nodeBIn.Clone();

            nodeA.ClipTo(nodeB);

            CSGNode nodeC = _nodeCIn.Clone();
            CSGNode nodeD = _nodeDIn.Clone();

            nodeD.Invert();
            nodeC.ClipTo(nodeD);

            CSGModel resultantModelA = new CSGModel(nodeA.AllPolygons());
            CSGModel resultantModelB = new CSGModel(nodeC.AllPolygons());

            resultantMeshes.Add(resultantModelA.ToMesh());
            resultantMeshes.Add(resultantModelB.ToMesh());
            return(resultantMeshes);
        }
Ejemplo n.º 10
0
        public static List <Mesh> NVIntersect(GameObject _objectA, GameObject _objectB, CSGMeshingSettings _meshSettings)
        {
            Mesh       mesh       = _objectB.GetComponent <MeshFilter>().mesh;
            GameObject planeRight = GameObject.Instantiate(_objectB);

            planeRight.AddComponent <DestroyOnLateUpdate>();
            GameObject planeLeft = GameObject.Instantiate(_objectB);

            planeLeft.AddComponent <DestroyOnLateUpdate>();
            GameObject planeUP = GameObject.Instantiate(_objectB);

            planeUP.AddComponent <DestroyOnLateUpdate>();
            GameObject planeBack = GameObject.Instantiate(_objectB);

            planeBack.AddComponent <DestroyOnLateUpdate>();
            GameObject planeFront = GameObject.Instantiate(_objectB);

            planeFront.AddComponent <DestroyOnLateUpdate>();

            planeRight.transform.position = _objectB.transform.position + new Vector3(mesh.bounds.max.x * planeRight.transform.localScale.x, 0.0f, 0.0f);
            planeRight.transform.Rotate(new Vector3(0.0f, 0.0f, 90.0f));
            planeLeft.transform.position = _objectB.transform.position + new Vector3(mesh.bounds.min.x * planeLeft.transform.localScale.x, 0.0f, 0.0f);
            planeLeft.transform.Rotate(new Vector3(0.0f, 0.0f, -90.0f));
            planeUP.transform.position = _objectB.transform.position;
            planeUP.transform.Rotate(new Vector3(180.0f, 0.0f, 0.0f));
            planeBack.transform.position = _objectB.transform.position + new Vector3(0.0f, 0.0f, mesh.bounds.max.z * planeRight.transform.localScale.z);
            planeBack.transform.Rotate(new Vector3(-90.0f, 0.0f, 0.0f));
            planeFront.transform.position = _objectB.transform.position + new Vector3(0.0f, 0.0f, mesh.bounds.min.z * planeRight.transform.localScale.z);
            planeFront.transform.Rotate(new Vector3(90.0f, 0.0f, 0.0f));

            CSGModel modelA = new CSGModel(_objectA);
            CSGModel modelB = new CSGModel(planeRight);
            CSGModel modelC = new CSGModel(planeLeft);
            CSGModel modelD = new CSGModel(planeUP);
            CSGModel modelE = new CSGModel(planeBack);
            CSGModel modelF = new CSGModel(planeFront);

            CSGNode nodeA = new CSGNode(modelA.ToPolygons());
            CSGNode nodeB = new CSGNode(modelB.ToPolygons());
            CSGNode nodeC = new CSGNode(modelC.ToPolygons());
            CSGNode nodeD = new CSGNode(modelD.ToPolygons());
            CSGNode nodeE = new CSGNode(modelE.ToPolygons());
            CSGNode nodeF = new CSGNode(modelF.ToPolygons());

            return(CSGNode.NVIntersect(nodeA, nodeB, nodeC, nodeD, nodeE, nodeF, _meshSettings));
        }