public Scene SceneFromSelection(out Vector3D center) { Scene retScene = new Scene(); HashSet <uint> selectedTriangIdx = new HashSet <uint>(); HashSet <uint> selectedPointsIdx = new HashSet <uint>(); List <Triangle> newTriangles = new List <Triangle>(); List <Vector3D> newPoints = new List <Vector3D>(); List <uint> newTriangleIdx = new List <uint>(); List <int> newLightIdx = new List <int>(); uint idx = 0; for (int i = 0; i < triangles.Count; ++i) { newTriangleIdx.Add(0); } //List<HierarchyMesh> selectedMeshes = new List<HierarchyMesh>(); bool[] selectedPoints = new bool[points.Count]; bool[] selectedTriangs = new bool[triangles.Count]; for (int i = 0; i < selectedPoints.Length; i++) { selectedPoints[i] = false; } for (int i = 0; i < selectedTriangs.Length; i++) { selectedTriangs[i] = false; } foreach (HierarchyMesh mesh in selTriangles) //for (int i = 0; i < selTriangles.Count; i++) { //selectedMeshes.Add(Hierarchy.GetSelectedMesh(hierarchy.objects, (int)mesh.triangles[0])); for (int j = 0; j < mesh.triangles.Count; j++) { int oldIdx = (int)mesh.triangles[j]; newTriangleIdx[oldIdx] = idx++; selectedTriangIdx.Add(mesh.triangles[j]); int triang = (int)mesh.triangles[j]; selectedTriangs[mesh.triangles[j]] = true; newTriangles.Add(new Triangle(triangles[triang].p1, triangles[triang].p2, triangles[triang].p3)); selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p1); selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p2); selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p3); selectedPoints[triangles[(int)mesh.triangles[j]].p1] = true; selectedPoints[triangles[(int)mesh.triangles[j]].p2] = true; selectedPoints[triangles[(int)mesh.triangles[j]].p3] = true; } } idx = 0; for (int i = 0; i < lights.Count; i++) { newLightIdx.Add(-1); } for (int i = 0; i < selLights.Count; i++) { newLightIdx[selLights[i]] = (int)idx++; } for (int i = 0; i < points.Count; i++) { if (selectedPoints[i]) { newPoints.Add(new Vector3D(points[i])); } } // Lista zawiera indeksy poczatka i konca usuwanych punktow (beda // one wystepowaly sekcjami) List <int> pointStartEnd = new List <int>(); bool flag = true; for (int i = 0; i < selectedPoints.Length; i++) { if (!selectedPoints[i] && flag) { pointStartEnd.Add(i); flag = false; } if (selectedPoints[i] && !flag) { pointStartEnd.Add(i - 1); flag = true; } } if (!flag) { pointStartEnd.Add(selectedPoints.Length - 1); } // Lista zawiera indeksy poczatka i konca usuwanych trojkatow List <int> triangStartEnd = new List <int>(); flag = true; for (int i = 0; i < selectedTriangs.Length; i++) { if (!selectedTriangs[i] && flag) { triangStartEnd.Add(i); flag = false; } if (selectedTriangs[i] && !flag) { triangStartEnd.Add(i - 1); flag = true; } } if (!flag) { triangStartEnd.Add(selectedTriangs.Length - 1); } int offset = 0; for (int i = 0; i < pointStartEnd.Count; i += 2) { int diffP = pointStartEnd[i + 1] - pointStartEnd[i] + 1; foreach (Triangle triangle in newTriangles) { if (triangle.p1 > pointStartEnd[i + 1] - offset) { triangle.p1 -= (uint)diffP; } if (triangle.p2 > pointStartEnd[i + 1] - offset) { triangle.p2 -= (uint)diffP; } if (triangle.p3 > pointStartEnd[i + 1] - offset) { triangle.p3 -= (uint)diffP; } } offset += diffP; } List <HierarchyObject> newHierarchy = new List <HierarchyObject>(); if (selectedHierObj != null) { HierarchyNode newNode = new HierarchyNode(selectedHierObj); newHierarchy.Add(newNode); RebuildHierarchy(newHierarchy, newTriangleIdx, newLightIdx); } else { foreach (HierarchyMesh mesh in selTriangles) { HierarchyMesh newMesh = (new HierarchyMesh(mesh.name)); for (int i = 0; i < mesh.triangles.Count; i++) { newMesh.triangles.Add(newTriangleIdx[(int)mesh.triangles[i]]); } newHierarchy.Add(newMesh); } } List <Part> newParts = new List <Part>(); List <String> newMaterialAssign = new List <string>(); for (int i = 0; i < parts.Count; i++) { Part newPart = (new Part(new List <int>())); bool used = false; for (int j = 0; j < parts[i].triangles.Count; j++) { newPart.triangles.Add((int)newTriangleIdx[parts[i].triangles[j]]); if ((int)newTriangleIdx[parts[i].triangles[j]] > 0) { used = true; } } if (used) { newParts.Add(newPart); newMaterialAssign.Add(materialAssign[i]); } } foreach (Material_ material in materials) { retScene.materials.Add(new Material_(material)); } center = new Data.Scene.Vector3D(0, 0, 0); int count = newPoints.Count + selCams.Count + selLights.Count; foreach (Data.Scene.Vector3D v in newPoints) { center.x = center.x + v.x / count; center.y = center.y + v.y / count; center.z = center.z + v.z / count; } //foreach (int c in selCams) //{ // Camera cam = cams[c]; // center.x = center.x + cam.position.X / count; // center.y = center.y + cam.position.Y / count; // center.z = center.z + cam.position.Z / count; //} foreach (int l in selLights) { Light_ light = lights[l]; center.x = center.x + light.position.X / count; center.y = center.y + light.position.Y / count; center.z = center.z + light.position.Z / count; } foreach (Data.Scene.Vector3D v in newPoints) { v.x -= center.x; v.y -= center.y; v.z -= center.z; } List <Light_> newwLights1 = new List <Light_>(); foreach (int lightIndex in selLights) { Light_ light = new Light_(lights[lightIndex]); newwLights1.Add(light); newwLights1[newwLights1.Count - 1].position -= center; int tmp = newwLights1.Count - 1; //dodawanie światel do hierarchii if (selectedHierObj == null) { HierarchyLight newLight = new HierarchyLight(light.name.ToString(), tmp); newHierarchy.Add(newLight); } //newLight.name = light.name; Console.WriteLine("dodawanie do hierarchiii"); } //List<Camera> newCams = new List<Camera>(); //foreach (int camIndex in selCams) //{ // newCams.Add(new Camera(cams[camIndex])); // newCams[newCams.Count - 1].position -= center; //} retScene.points = newPoints; retScene.triangles = newTriangles; retScene.hierarchy.objects = newHierarchy; retScene.parts = newParts; retScene.materialAssign = newMaterialAssign; retScene.lights = newwLights1; //retScene.cams = newCams; hierarchyChange = true; return(retScene); }
public Scene SceneFromSelection(out Vector3D center) { Scene retScene = new Scene(); HashSet<uint> selectedTriangIdx = new HashSet<uint>(); HashSet<uint> selectedPointsIdx = new HashSet<uint>(); List<Triangle> newTriangles = new List<Triangle>(); List<Vector3D> newPoints = new List<Vector3D>(); List<uint> newTriangleIdx = new List<uint>(); List<int> newLightIdx = new List<int>(); uint idx = 0; for (int i = 0; i < triangles.Count; ++i) newTriangleIdx.Add(0); //List<HierarchyMesh> selectedMeshes = new List<HierarchyMesh>(); bool[] selectedPoints = new bool[points.Count]; bool[] selectedTriangs = new bool[triangles.Count]; for (int i = 0; i < selectedPoints.Length; i++) { selectedPoints[i] = false; } for (int i = 0; i < selectedTriangs.Length; i++) { selectedTriangs[i] = false; } foreach (HierarchyMesh mesh in selTriangles) //for (int i = 0; i < selTriangles.Count; i++) { //selectedMeshes.Add(Hierarchy.GetSelectedMesh(hierarchy.objects, (int)mesh.triangles[0])); for (int j = 0; j < mesh.triangles.Count; j++) { int oldIdx = (int)mesh.triangles[j]; newTriangleIdx[oldIdx] = idx++; selectedTriangIdx.Add(mesh.triangles[j]); int triang = (int)mesh.triangles[j]; selectedTriangs[mesh.triangles[j]] = true; newTriangles.Add(new Triangle(triangles[triang].p1, triangles[triang].p2, triangles[triang].p3)); selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p1); selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p2); selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p3); selectedPoints[triangles[(int)mesh.triangles[j]].p1] = true; selectedPoints[triangles[(int)mesh.triangles[j]].p2] = true; selectedPoints[triangles[(int)mesh.triangles[j]].p3] = true; } } idx = 0; for (int i = 0; i < lights.Count; i++) { newLightIdx.Add(-1); } for (int i = 0; i < selLights.Count; i++) { newLightIdx[selLights[i]] = (int)idx++; } for (int i=0; i<points.Count; i++) { if (selectedPoints[i]) { newPoints.Add(new Vector3D(points[i])); } } // Lista zawiera indeksy poczatka i konca usuwanych punktow (beda // one wystepowaly sekcjami) List<int> pointStartEnd = new List<int>(); bool flag = true; for (int i = 0; i < selectedPoints.Length; i++) { if (!selectedPoints[i] && flag) { pointStartEnd.Add(i); flag = false; } if (selectedPoints[i] && !flag) { pointStartEnd.Add(i - 1); flag = true; } } if (!flag) pointStartEnd.Add(selectedPoints.Length - 1); // Lista zawiera indeksy poczatka i konca usuwanych trojkatow List<int> triangStartEnd = new List<int>(); flag = true; for (int i = 0; i < selectedTriangs.Length; i++) { if (!selectedTriangs[i] && flag) { triangStartEnd.Add(i); flag = false; } if (selectedTriangs[i] && !flag) { triangStartEnd.Add(i - 1); flag = true; } } if (!flag) triangStartEnd.Add(selectedTriangs.Length - 1); int offset = 0; for (int i = 0; i < pointStartEnd.Count; i += 2) { int diffP = pointStartEnd[i + 1] - pointStartEnd[i] + 1; foreach (Triangle triangle in newTriangles) { if (triangle.p1 > pointStartEnd[i + 1] - offset) triangle.p1 -= (uint)diffP; if (triangle.p2 > pointStartEnd[i + 1] - offset) triangle.p2 -= (uint)diffP; if (triangle.p3 > pointStartEnd[i + 1] - offset) triangle.p3 -= (uint)diffP; } offset += diffP; } List<HierarchyObject> newHierarchy = new List<HierarchyObject>(); if (selectedHierObj != null) { HierarchyNode newNode = new HierarchyNode(selectedHierObj); newHierarchy.Add(newNode); RebuildHierarchy(newHierarchy, newTriangleIdx, newLightIdx); } else { foreach (HierarchyMesh mesh in selTriangles) { HierarchyMesh newMesh = (new HierarchyMesh(mesh.name)); for (int i = 0; i < mesh.triangles.Count; i++) { newMesh.triangles.Add(newTriangleIdx[(int) mesh.triangles[i]]); } newHierarchy.Add(newMesh); } } List<Part> newParts = new List<Part>(); List<String> newMaterialAssign = new List<string>(); for (int i = 0; i < parts.Count; i++) { Part newPart = (new Part(new List<int>())); bool used = false; for (int j = 0; j < parts[i].triangles.Count; j++) { newPart.triangles.Add((int)newTriangleIdx[parts[i].triangles[j]]); if ((int)newTriangleIdx[parts[i].triangles[j]] > 0) used = true; } if (used) { newParts.Add(newPart); newMaterialAssign.Add(materialAssign[i]); } } foreach (Material_ material in materials) retScene.materials.Add(new Material_(material)); center = new Data.Scene.Vector3D(0, 0, 0); int count = newPoints.Count + selCams.Count + selLights.Count; foreach (Data.Scene.Vector3D v in newPoints) { center.x = center.x + v.x / count; center.y = center.y + v.y / count; center.z = center.z + v.z / count; } //foreach (int c in selCams) //{ // Camera cam = cams[c]; // center.x = center.x + cam.position.X / count; // center.y = center.y + cam.position.Y / count; // center.z = center.z + cam.position.Z / count; //} foreach (int l in selLights) { Light_ light = lights[l]; center.x = center.x + light.position.X / count; center.y = center.y + light.position.Y / count; center.z = center.z + light.position.Z / count; } foreach (Data.Scene.Vector3D v in newPoints) { v.x -= center.x; v.y -= center.y; v.z -= center.z; } List<Light_> newwLights1 = new List<Light_>(); foreach (int lightIndex in selLights) { Light_ light = new Light_(lights[lightIndex]); newwLights1.Add(light); newwLights1[newwLights1.Count - 1].position -= center; int tmp = newwLights1.Count - 1; //dodawanie światel do hierarchii if (selectedHierObj == null) { HierarchyLight newLight = new HierarchyLight(light.name.ToString(), tmp); newHierarchy.Add(newLight); } //newLight.name = light.name; Console.WriteLine( "dodawanie do hierarchiii"); } //List<Camera> newCams = new List<Camera>(); //foreach (int camIndex in selCams) //{ // newCams.Add(new Camera(cams[camIndex])); // newCams[newCams.Count - 1].position -= center; //} retScene.points = newPoints; retScene.triangles = newTriangles; retScene.hierarchy.objects = newHierarchy; retScene.parts = newParts; retScene.materialAssign = newMaterialAssign; retScene.lights = newwLights1; //retScene.cams = newCams; hierarchyChange = true; return retScene; }