Ejemplo n.º 1
0
        public void DeleteSelected()
        {
            modified = true;
            // Najpierw stworz listy indeksow zaznaczonych elementow: trojkatow
            // punktow, swiatel, kamer
            // Obiekty nalezy usunac rowniez z hierarchii
            #region usuwanie_geometrii
            HashSet <uint>       selectedTriangIdx = new HashSet <uint>();
            HashSet <uint>       selectedPointsIdx = new HashSet <uint>();
            List <HierarchyMesh> selectedMeshes    = new List <HierarchyMesh>();
            bool[] deletedPoints  = new bool[points.Count];
            bool[] deletedTriangs = new bool[triangles.Count];
            for (int i = 0; i < deletedPoints.Length; i++)
            {
                deletedPoints[i] = false;
            }
            for (int i = 0; i < deletedTriangs.Length; i++)
            {
                deletedTriangs[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++)
                {
                    selectedTriangIdx.Add(mesh.triangles[j]);
                    deletedTriangs[mesh.triangles[j]] = true;

                    selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p1);
                    selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p2);
                    selectedPointsIdx.Add(triangles[(int)mesh.triangles[j]].p3);

                    deletedPoints[triangles[(int)mesh.triangles[j]].p1] = true;
                    deletedPoints[triangles[(int)mesh.triangles[j]].p2] = true;
                    deletedPoints[triangles[(int)mesh.triangles[j]].p3] = true;
                }
            }

            // Usuwanie z hierarchii
            foreach (HierarchyMesh mesh in selectedMeshes)
            {
                deleteMesh((int)mesh.triangles.ElementAt(0), hierarchy.objects);
            }


            // 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 < deletedPoints.Length; i++)
            {
                if (deletedPoints[i] && flag)
                {
                    pointStartEnd.Add(i);
                    flag = false;
                }
                if (!deletedPoints[i] && !flag)
                {
                    pointStartEnd.Add(i - 1);
                    flag = true;
                }
            }
            if (!flag)
            {
                pointStartEnd.Add(deletedPoints.Length - 1);
            }

            // Lista zawiera indeksy poczatka i konca usuwanych trojkatow
            List <int> triangStartEnd = new List <int>();
            flag = true;
            for (int i = 0; i < deletedTriangs.Length; i++)
            {
                if (deletedTriangs[i] && flag)
                {
                    triangStartEnd.Add(i);
                    flag = false;
                }
                if (!deletedTriangs[i] && !flag)
                {
                    triangStartEnd.Add(i - 1);
                    flag = true;
                }
            }
            if (!flag)
            {
                triangStartEnd.Add(deletedTriangs.Length - 1);
            }

            // Usuwanie punktow oraz trojkatow i czesci
            int offset = 0;
            for (int i = 0; i < pointStartEnd.Count; i += 2)
            {
                int diff = pointStartEnd[i + 1] - pointStartEnd[i] + 1;
                points.RemoveRange(pointStartEnd[i] - offset, diff);
                offset += diff;
            }
            offset = 0;
            List <int> idxToDelete = new List <int>();
            for (int i = 0; i < triangStartEnd.Count; i += 2)
            {
                int diff = triangStartEnd[i + 1] - triangStartEnd[i] + 1;
                triangles.RemoveRange(triangStartEnd[i] - offset, diff);
                offset += diff;
                for (int j = 0; j < parts.Count; j++)
                {
                    //if (parts[j].triangles.Contains(triangStartEnd[i]))
                    // Szemrana poprawka z tym ifem
                    //if (parts[j].triangles.Count > 0)
                    //{
                    if (parts[j].triangles.Min() >= triangStartEnd[i] &&
                        parts[j].triangles.Max() <= triangStartEnd[i + 1])
                    {
                        idxToDelete.Add(j);
                    }
                    //}
                }
                //if (idxToDelete > -1)
                //{
                //    parts.RemoveAt(idxToDelete);
                //    materialAssign.RemoveAt(idxToDelete);
                //}
            }
            offset = 0;
            foreach (int i in idxToDelete)
            {
                parts.RemoveAt(i - offset);
                materialAssign.RemoveAt(i - offset);
                ++offset;
            }
            if (parts.Count == 0)
            {
                materials.RemoveRange(0, materials.Count);
                materialAssign.RemoveRange(0, materialAssign.Count);
            }

            // Przebudowa sceny - nalezy pozmieniac indeksy punktow do ktorych
            // odwoluja sie pozostale trojkaty, oraz naprawic indeksy trojkatow
            // w hierarchii

            List <HierarchyMesh> meshes = hierarchy.GetAllMeshes();
            offset = 0;
            for (int i = 0; i < pointStartEnd.Count; i += 2)
            {
                int diffP = pointStartEnd[i + 1] - pointStartEnd[i] + 1;
                foreach (Triangle triangle in triangles)
                {
                    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;
            }
            offset = 0;
            for (int i = 0; i < triangStartEnd.Count; i += 2)
            {
                int diffT = triangStartEnd[i + 1] - triangStartEnd[i] + 1;
                foreach (Part part in parts)
                {
                    for (int j = 0; j < part.triangles.Count; j++)
                    {
                        if (part.triangles[j] > triangStartEnd[i + 1] - offset)
                        {
                            part.triangles[j] -= diffT;
                        }
                    }
                }
                foreach (HierarchyMesh mesh in meshes)
                {
                    for (int j = 0; j < mesh.triangles.Count; j++)
                    {
                        if (mesh.triangles[j] > triangStartEnd[i + 1] - offset)
                        {
                            mesh.triangles[j] -= (uint)diffT;
                        }
                    }
                }
                offset += diffT;
            }

            ClearSelectedTriangles();
            #endregion

            #region usuwanie_kamer
            if (cams.Count > 1 && selCams.Count > 0)
            {
                if (activeCamera == cams.Count() - 1)
                {
                    activeCamera--;
                }

                cams.RemoveAt(selCams[0]);
                //if (selCams[0] == activeCamera)
                //if (activeCamera < 1)
                //{
                //    activeCamera++;
                //}
                //else
                //{
                //    activeCamera--;
                //}
                selCams.RemoveRange(0, selCams.Count);

                cameraRemoved = true;
            }
            #endregion

            #region usuwanie_swiatel
            offset = 0;
            selLights.Sort();
            Dictionary <int, int> newLightIdxOffsset = new Dictionary <int, int>();
            foreach (int i in selLights)
            {
                deleteLight(i, hierarchy.objects);
            }
            for (int i = 0; i < lights.Count; i++)
            {
                newLightIdxOffsset[i] = offset;
                if (selLights.Contains(i))
                {
                    offset++;
                }
            }

            for (int i = 0; i < selLights.Count; i++)
            {
                lights.RemoveAt(selLights[i] - i);
            }
            RebuildLightHierarchy(hierarchy.objects, newLightIdxOffsset);
            selLights.RemoveRange(0, selLights.Count);

            //// Usuwanie z hierarchii świateł
            //foreach (int hLight in selLights)
            //{
            //    deleteLight(lights.ElementAt(hLight).name, hierarchy.objects);
            //}

            hierarchyChange = true;
            #endregion
        }