Пример #1
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);
        }
Пример #2
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;
        }