예제 #1
0
        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);
            }
        }
예제 #2
0
        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;
        }
예제 #6
0
        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;
                }
            }
        }
예제 #7
0
        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;
                }
            }
        }
예제 #8
0
        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);
        }
예제 #9
0
 public HierarchyLight(HierarchyLight copy)
     : base(copy.name)
 {
     //this.lightIndex = new Light_(copy.lightIndex);
     lightIndex = copy.lightIndex;
 }
예제 #10
0
        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;
                }
            }
        }
예제 #11
0
        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;
        }
예제 #12
0
        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);
        }
예제 #13
0
        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;
                }
            }
        }