Esempio n. 1
0
        public CSGSubModel MergeModels(CSGSubModel _modelIn)
        {
            CSGSubModel result = new CSGSubModel(m_parent);

            if (m_vertices.Count > _modelIn.m_vertices.Count)
            {
                result.m_vertices.AddRange(m_vertices);

                for (int vertexCount = 0; vertexCount < _modelIn.m_vertices.Count; vertexCount++)
                {
                    if (!result.m_vertices.Contains(_modelIn.m_vertices[vertexCount]))
                    {
                        result.m_vertices.Add(_modelIn.m_vertices[vertexCount]);
                    }
                }
            }
            else
            {
                result.m_vertices.AddRange(_modelIn.m_vertices);

                for (int vertexCount = 0; vertexCount < m_vertices.Count; vertexCount++)
                {
                    if (!result.m_vertices.Contains(m_vertices[vertexCount]))
                    {
                        result.m_vertices.Add(m_vertices[vertexCount]);
                    }
                }
            }

            result.m_indices.AddRange(m_indices);
            result.m_indices.AddRange(_modelIn.m_indices);

            return(result);
        }
Esempio n. 2
0
        private bool SubDivideModel()
        {
            Dictionary <int, CSGSubModel> vertexCheckList = new Dictionary <int, CSGSubModel>();

            //Setup check list for each vertex
            for (int vertexIter = 0; vertexIter < m_vertices.Count; vertexIter++)
            {
                vertexCheckList.Add(vertexIter, null);
            }

            List <CSGSubModel> builderSubModels = new List <CSGSubModel>();

            for (int polygonIter = 0; polygonIter < m_indices.Count / 3; polygonIter++)
            {
                int indexAIter = polygonIter * 3;
                int indexBIter = indexAIter + 1;
                int indexCIter = indexBIter + 1;

                List <CSGSubModel> activeSubModels = new List <CSGSubModel>();

                bool vertexAAssigned = (vertexCheckList[m_indices[indexAIter]] != null);
                if (vertexAAssigned)
                {
                    activeSubModels.Add(vertexCheckList[m_indices[indexAIter]]);
                }

                bool vertexBAssigned = (vertexCheckList[m_indices[indexBIter]] != null);
                if (vertexBAssigned)
                {
                    if (!activeSubModels.Contains(vertexCheckList[m_indices[indexBIter]]))
                    {
                        activeSubModels.Add(vertexCheckList[m_indices[indexBIter]]);
                    }
                }

                bool vertexCAssigned = (vertexCheckList[m_indices[indexCIter]] != null);
                if (vertexCAssigned)
                {
                    if (!activeSubModels.Contains(vertexCheckList[m_indices[indexBIter]]))
                    {
                        activeSubModels.Add(vertexCheckList[m_indices[indexCIter]]);
                    }
                }

                if (activeSubModels.Count == 0)
                {
                    CSGSubModel currentSubModel = new CSGSubModel(this);

                    currentSubModel.m_vertices.Add(m_indices[indexAIter]);
                    currentSubModel.m_vertices.Add(m_indices[indexBIter]);
                    currentSubModel.m_vertices.Add(m_indices[indexCIter]);

                    currentSubModel.m_indices.Add(m_indices[indexAIter]);
                    currentSubModel.m_indices.Add(m_indices[indexBIter]);
                    currentSubModel.m_indices.Add(m_indices[indexCIter]);

                    builderSubModels.Add(currentSubModel);

                    vertexCheckList[m_indices[indexAIter]] = currentSubModel;
                    vertexCheckList[m_indices[indexBIter]] = currentSubModel;
                    vertexCheckList[m_indices[indexCIter]] = currentSubModel;
                }
                else if (activeSubModels.Count > 1)
                {
                    do
                    {
                        CSGSubModel result = activeSubModels[0].MergeModels(activeSubModels[1]);
                        for (int vertexIter = 0; vertexIter < result.m_vertices.Count; vertexIter++)
                        {
                            vertexCheckList[result.m_vertices[vertexIter]] = result;
                        }

                        builderSubModels.Remove(activeSubModels[0]);
                        builderSubModels.Remove(activeSubModels[1]);

                        activeSubModels.RemoveAt(1);
                        activeSubModels.RemoveAt(0);

                        activeSubModels.Add(result);
                    } while (activeSubModels.Count > 1);

                    //Adds indices
                    activeSubModels[0].m_indices.Add(m_indices[indexAIter]);
                    activeSubModels[0].m_indices.Add(m_indices[indexBIter]);
                    activeSubModels[0].m_indices.Add(m_indices[indexCIter]);

                    builderSubModels.Add(activeSubModels[0]);
                    activeSubModels.Clear();
                }
                else
                {
                    //Add vertices if not already added
                    if (!activeSubModels[0].m_vertices.Contains(m_indices[indexAIter]))
                    {
                        activeSubModels[0].m_vertices.Add(m_indices[indexAIter]);
                    }

                    if (!activeSubModels[0].m_vertices.Contains(m_indices[indexBIter]))
                    {
                        activeSubModels[0].m_vertices.Add(m_indices[indexBIter]);
                    }

                    if (!activeSubModels[0].m_vertices.Contains(m_indices[indexCIter]))
                    {
                        activeSubModels[0].m_vertices.Add(m_indices[indexCIter]);
                    }

                    //Adds indices
                    activeSubModels[0].m_indices.Add(m_indices[indexAIter]);
                    activeSubModels[0].m_indices.Add(m_indices[indexBIter]);
                    activeSubModels[0].m_indices.Add(m_indices[indexCIter]);

                    //Set vertex check list
                    if (vertexAAssigned)
                    {
                        vertexCheckList[m_indices[indexBIter]] = activeSubModels[0];
                        vertexCheckList[m_indices[indexCIter]] = activeSubModels[0];
                    }
                    else if (vertexBAssigned)
                    {
                        vertexCheckList[m_indices[indexAIter]] = activeSubModels[0];
                        vertexCheckList[m_indices[indexCIter]] = activeSubModels[0];
                    }
                    else
                    {
                        vertexCheckList[m_indices[indexAIter]] = activeSubModels[0];
                        vertexCheckList[m_indices[indexBIter]] = activeSubModels[0];
                    }
                }
            }

            if (builderSubModels.Count > 1)
            {
                m_subModels.AddRange(builderSubModels);
                return(true);
            }

            m_subModels.Clear();
            return(false);
        }