private void deleteLight(int lightIndex, List <HierarchyObject> listHObj)//usuwa z hierarchii { List <HierarchyObject> treeList = new List <HierarchyObject>(); foreach (HierarchyObject ho in listHObj) { if (ho is HierarchyLight)//jeśli jest to light { HierarchyLight hl = (HierarchyLight)ho; if (lightIndex == hl.lightIndex) //jeśli jest to swiatlo, które szukamy { //listHObj.Remove(ho); treeList.Add(ho); } } else if (ho is HierarchyNode) //jeśli jest to node { HierarchyNode hn = (HierarchyNode)ho; deleteLight(lightIndex, hn.hObjects); } } foreach (HierarchyObject ho in treeList) { listHObj.Remove(ho); } }
public void AddLight(Light_ light, Vector3 translation) { modified = true; lights.Add(light); light.position += translation; HierarchyLight lgt = new HierarchyLight(light.name, lights.Count - 1); hierarchy.objects.Add(lgt); hierarchyChange = true; Console.WriteLine("dadajemy swiatlo " + lgt.name); }
private void buildHierarchy(HierarchyNode nodeParent, TreeViewItem treeItem, List<HierarchyMesh> meshes, List<HierarchyLight> lights) { foreach (TreeViewItem tvi in treeItem.Items) { if (tvi.HasItems) { HierarchyNode hn = new HierarchyNode(tvi.Header.ToString()); //Console.WriteLine("nazwa nodea " + tvi.Header.ToString()); buildHierarchy(hn, tvi, meshes, lights); //Console.WriteLine("budujemy hierarchie - node :" + hn.name.ToString()); nodeParent.hObjects.Add(hn); } else //mesh || light { char[] delimiterChars = { '_' }; string[] words = tvi.Name.Split(delimiterChars); if (words[0].Equals("mesh")) //mesh { HierarchyMesh hm = new HierarchyMesh(tvi.Header.ToString()); foreach (HierarchyMesh hmesh in meshes) { if (Convert.ToInt32(words[1]) == (int)hmesh.triangles.ElementAt(0)) { hm = hmesh; hm.name = tvi.Header.ToString(); break; } } //Console.WriteLine("budujemy hierarchie - mesh :" + hm.name.ToString()); nodeParent.hObjects.Add(hm); } else //if(words[0].Equals("light")); { HierarchyLight hl = new HierarchyLight(tvi.Name.ToString(), (Convert.ToInt32(words[1]))); hl.name = tvi.Header.ToString(); nodeParent.hObjects.Add(hl); } } } }
private void addTreeViewLight(HierarchyLight hobj, TreeViewItem parent) { TreeViewItem child = new TreeViewItem(); child.Header = hobj.name; child.Name = ("light"+"_" + (hobj.lightIndex)); //identyfikacja kamery po indeksie child.IsSelected = false; parent.Items.Add(child); }
//po modyfikacjach w panelu hierarchii "odświeżamy" hierarchię sceny private void refreshHierarchy() { Hierarchy hierarchy = new Hierarchy(); if (((TreeViewItem)treeView1.Items.GetItemAt(0)).HasItems) { List<HierarchyMesh> meshes = currScene.hierarchy.GetAllMeshes(); List<HierarchyLight> lights = currScene.hierarchy.GetAllLights(); foreach (TreeViewItem tvi in ((TreeViewItem)treeView1.Items.GetItemAt(0)).Items) { if (tvi.HasItems) { HierarchyNode hn = new HierarchyNode(tvi.Header.ToString()); buildHierarchy(hn, tvi, meshes, lights); hierarchy.objects.Add(hn); //Console.WriteLine("budujemy hierarchie - node :" + hn.name.ToString()); } else { char[] delimiterChars = { '_' }; string[] words = tvi.Name.Split(delimiterChars); if (words[0].Equals("mesh")) { HierarchyMesh hm = new HierarchyMesh(tvi.Header.ToString()); foreach (HierarchyMesh hmesh in meshes) { if (Convert.ToInt32(words[1]) == (int)hmesh.triangles.ElementAt(0)) { hm = hmesh; hm.name = tvi.Header.ToString(); break; } } //Console.WriteLine("budujemy hierarchie - mesh :" + hm.name.ToString()); hierarchy.objects.Add(hm); } else //if(words[0].Equals("light")); { HierarchyLight hl = new HierarchyLight(tvi.Header.ToString(), Convert.ToInt32(words[1])); hl.name = tvi.Header.ToString(); hierarchy.objects.Add(hl); } } } } currScene.hierarchy = hierarchy; }
private static void ReadHierarchy(HierarchyNode node, List<Light_> lights, List<string> text, ref int pointer) { string objNumLabel = File.GetAttribute(text[pointer], 0); if(objNumLabel != "node_count") { throw new Exception(); } uint objNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); for(int i = 0; i < objNum; ++i) { HierarchyObject newObject = null; string objStrLabel = File.GetAttribute(text[pointer], 0); if(objStrLabel != "hier_type") { throw new Exception(); } string objStr = File.GetAttribute(text[pointer++], 1); string[] objNameAtts = File.GetAttributes(text[pointer]); if(objNameAtts[0] != "hier_name") { throw new Exception(); } string objName = objName = File.CutFirstString(text[pointer]); ++pointer; switch(objStr) { case "Mesh": newObject = new HierarchyMesh(objName); node.hObjects.Add(newObject); string triangleNumLabel = File.GetAttribute(text[pointer], 0); if(triangleNumLabel != "triangle_count") { new Exception(); } uint triangleNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); List<uint> triangles = new List<uint>(); string[] triangs = File.GetAttributes(text[pointer]); for(int j = 0; j < triangleNum; ++j) { triangles.Add(uint.Parse(triangs[j])); } ++pointer; ((HierarchyMesh)newObject).triangles = triangles; break; case "Light": string lightIdxLabel = File.GetAttribute(text[pointer], 0); if (lightIdxLabel != "light_index") { new Exception(); } int lightIdx = int.Parse(File.GetAttribute(text[pointer++], 1)); newObject = new HierarchyLight(objName, lightIdx); node.hObjects.Add(newObject); break; case "Node": newObject = new HierarchyNode(objName); node.hObjects.Add(newObject); ReadHierarchy((HierarchyNode)newObject, lights, text, ref pointer); break; } } }
private static void ReadHierarchy(HierarchyNode node, List<Light_> lights, List<string> text, int pointer) { string objNumLabel = File.GetAttribute(text[pointer], 0); if(objNumLabel != "node_count") { node = null; } uint objNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); for(int i = 0; i < objNum; ++i) { HierarchyObject newObject = null; string objStrLabel = File.GetAttribute(text[pointer], 0); if(objStrLabel != "hier_type") { node = null; } string objStr = File.GetAttribute(text[pointer++], 1); string objNameLabel = File.GetAttribute(text[pointer], 0); if(objNameLabel != "hier_name") { node = null; } string objName = File.GetAttribute(text[pointer++], 1); switch(objStr) { case "Mesh": newObject = new HierarchyMesh(objName); node.hObjects.Add(newObject); string triangleNumLabel = File.GetAttribute(text[pointer], 0); if(triangleNumLabel != "triangle_count") { node = null; } uint triangleNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); List<uint> triangles = new List<uint>(); string[] triangs = File.GetAttributes(text[pointer]); for(int j = 0; j < triangleNum; ++j) { triangles.Add(uint.Parse(triangs[j])); } ++pointer; ((HierarchyMesh)newObject).triangles = triangles; break; case "Light": newObject = new HierarchyLight(GetLightByName(lights, objName)); node.hObjects.Add(newObject); break; case "Node": newObject = new HierarchyNode(objName); node.hObjects.Add(newObject); ReadHierarchy((HierarchyNode)newObject, lights, text, pointer); break; } } }
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 HierarchyLight(HierarchyLight copy) : base(copy.name) { //this.lightIndex = new Light_(copy.lightIndex); lightIndex = copy.lightIndex; }
private static void ReadHierarchy(HierarchyNode node, List <Light_> lights, List <string> text, int pointer) { string objNumLabel = File.GetAttribute(text[pointer], 0); if (objNumLabel != "node_count") { node = null; } uint objNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); for (int i = 0; i < objNum; ++i) { HierarchyObject newObject = null; string objStrLabel = File.GetAttribute(text[pointer], 0); if (objStrLabel != "hier_type") { node = null; } string objStr = File.GetAttribute(text[pointer++], 1); string objNameLabel = File.GetAttribute(text[pointer], 0); if (objNameLabel != "hier_name") { node = null; } string objName = File.GetAttribute(text[pointer++], 1); switch (objStr) { case "Mesh": newObject = new HierarchyMesh(objName); node.hObjects.Add(newObject); string triangleNumLabel = File.GetAttribute(text[pointer], 0); if (triangleNumLabel != "triangle_count") { node = null; } uint triangleNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); List <uint> triangles = new List <uint>(); string[] triangs = File.GetAttributes(text[pointer]); for (int j = 0; j < triangleNum; ++j) { triangles.Add(uint.Parse(triangs[j])); } ++pointer; ((HierarchyMesh)newObject).triangles = triangles; break; case "Light": newObject = new HierarchyLight(GetLightByName(lights, objName)); node.hObjects.Add(newObject); break; case "Node": newObject = new HierarchyNode(objName); node.hObjects.Add(newObject); ReadHierarchy((HierarchyNode)newObject, lights, text, pointer); break; } } }
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 void AddLight(Light_ light, Vector3 translation) { modified = true; lights.Add(light); light.position += translation; HierarchyLight lgt = new HierarchyLight(light.name, lights.Count - 1); hierarchy.objects.Add(lgt); hierarchyChange = true; Console.WriteLine("dadajemy swiatlo "+lgt.name); }
private static void ReadHierarchy(HierarchyNode node, List <Light_> lights, List <string> text, ref int pointer) { string objNumLabel = File.GetAttribute(text[pointer], 0); if (objNumLabel != "node_count") { throw new Exception(); } uint objNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); for (int i = 0; i < objNum; ++i) { HierarchyObject newObject = null; string objStrLabel = File.GetAttribute(text[pointer], 0); if (objStrLabel != "hier_type") { throw new Exception(); } string objStr = File.GetAttribute(text[pointer++], 1); string[] objNameAtts = File.GetAttributes(text[pointer]); if (objNameAtts[0] != "hier_name") { throw new Exception(); } string objName = objName = File.CutFirstString(text[pointer]); ++pointer; switch (objStr) { case "Mesh": newObject = new HierarchyMesh(objName); node.hObjects.Add(newObject); string triangleNumLabel = File.GetAttribute(text[pointer], 0); if (triangleNumLabel != "triangle_count") { new Exception(); } uint triangleNum = uint.Parse(File.GetAttribute(text[pointer++], 1)); List <uint> triangles = new List <uint>(); string[] triangs = File.GetAttributes(text[pointer]); for (int j = 0; j < triangleNum; ++j) { triangles.Add(uint.Parse(triangs[j])); } ++pointer; ((HierarchyMesh)newObject).triangles = triangles; break; case "Light": string lightIdxLabel = File.GetAttribute(text[pointer], 0); if (lightIdxLabel != "light_index") { new Exception(); } int lightIdx = int.Parse(File.GetAttribute(text[pointer++], 1)); newObject = new HierarchyLight(objName, lightIdx); node.hObjects.Add(newObject); break; case "Node": newObject = new HierarchyNode(objName); node.hObjects.Add(newObject); ReadHierarchy((HierarchyNode)newObject, lights, text, ref pointer); break; } } }