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); }
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); }