コード例 #1
0
        public void LoadGallery()
        {
            string currDirectory = System.AppDomain.CurrentDomain.BaseDirectory;

#if FINAL
            string fullPath = currDirectory + "/galleries/objects/";
#else
            string fullPath = Path.Combine(currDirectory, "../../galleries/objects");
#endif

            string[] paths = Directory.GetFiles(fullPath); // TODO poprawić ścieżkę w finalnej wersji

            foreach (string path in paths)
            {
                string file = Path.GetFileNameWithoutExtension(path);

                Scene.Scene scene = Scene.Scene.ReadSceneFromFile(path);
                if (scene != null)
                {
#if FINAL
                    string ImageUri = currDirectory + "\\galleries\\objects\\" + file + ".png";
#else
                    string ImageUri = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\galleries\\objects\\" + file + ".png";
#endif
                    Add(new PreparedElement(file, ImageUri, scene)); // TODO poprawić ścieżkę w finalnej wersji
                }
            }
        }
コード例 #2
0
        private void button1_Clicked(object sender, RoutedEventArgs e)
        {
            DependencyObject depObj = this.Parent;

            do
            {
                depObj = LogicalTreeHelper.GetParent(depObj);
            } while (depObj.GetType() != typeof(MainWindow));
            MainWindow parent = (MainWindow)depObj;
            Scene tmpScene = new Scene();
            parent.transformPanelButtonClick(x1, y1, z1, x2, y2, z2, x3, y3, z3);
        }
コード例 #3
0
        public Scene Undo(Scene scene)
        {
            if (first != null)
            {
                Element secondRedo = firstRedo;
                firstRedo = new Element();
                firstRedo.next = secondRedo;
                firstRedo.scene = new Scene(scene);

                scene =  first.scene;
                first = first.next;
            }
            return scene;
        }
コード例 #4
0
        public Scene(Scene copy)
        {
            points = new List<Vector3D>();
            foreach (Vector3D copyElem in copy.points) points.Add(new Vector3D(copyElem));
            triangles = new List<Triangle>();
            foreach (Triangle copyElem in copy.triangles) triangles.Add(new Triangle(copyElem.p1,copyElem.p2,copyElem.p3));
            parts = new List<Part>();
            foreach (Part copyElem in copy.parts) parts.Add(new Part(copyElem.triangles));
            materials = new List<Material_>();
            foreach (Material_ copyElem in copy.materials) materials.Add(new Material_(copyElem));
            materialAssign = new List<String>(copy.materialAssign);
            lights = new List<Light_>();
            foreach (Light_ copyElem in copy.lights) lights.Add(new Light_(copyElem));
            cams = new List<Camera>(copy.cams);
            hierarchy = new Hierarchy();
            hierarchy.objects = new List<HierarchyObject>(copy.hierarchy.objects);

            selTriangles = new List<HierarchyMesh>(copy.selTriangles);
            selLights = new List<Light_>(copy.selLights);
            selCams = new List<Camera>(copy.selCams);

            addedObject = new List<HierarchyMesh>(copy.addedObject);

            normals = new List<Vector3D>(copy.normals);

            numIndices = copy.numIndices;
            numSelIndices = copy.numSelIndices;

            indices = new int[3 * copy.triangles.Count];
            selIndices = new int[3 * copy.triangles.Count];

            //for (int i = 0; i < indices.Length; i++)
            //{
            //    indices[i] = copy.indices[i];
            //    selIndices[i] = copy.selIndices[i];
            //}

            vertices = new Vertex[copy.points.Count];
            //for (int i = 0; i < vertices.Length; i++)
            //{
            //    vertices[i] = copy.vertices[i];
            //}

            vertexTriangle = new List<int>[copy.points.Count];
            Parallel.For(0, vertexTriangle.Length, index => vertexTriangle[index] = new List<int>());

            activeCamera = copy.activeCamera;
        }
コード例 #5
0
 public void Paste(Scene scene, Vector3 translation, ViewportOrientation viewport)
 {
     if (viewport == ViewportOrientation.Top)
     {
         translation.Y = copiedElemCenter.y;
     }
     else if (viewport == ViewportOrientation.Front)
     {
         translation.Z = copiedElemCenter.z;
     }
     else if (viewport == ViewportOrientation.Side)
     {
         translation.X = copiedElemCenter.x;
     }
     scene.AddPreparedElement(copyBuffer, translation);
 }
コード例 #6
0
        public MainWindow()
        {
            InitializeComponent();

            renderer = new Renderer(Views.Handle, ViewsBezier.Handle);
            maxViewport = -1;

            //currScene = Scene.GetExampleScene();
            currScene = new Scene();

            // Tworzenie kolekcji obiektów i dodawanie jej do kontrolki ItemsControl
            // galerii ksztaltow.
            _shapesGallery = new ShapeGallery();
            ksztalty_ListView.ItemsSource = _shapesGallery;

            // Tworzenie kolekcji gotowych obiektów i dodawanie jej do kontrolki ItemsControl
            // galerii gotowych obiektów.
            _elementsGallery = new PreparedObjectsGallery();
            gotowe_ListView.ItemsSource = _elementsGallery;

            _surfaceGallery = new SurfaceGallery();
            materialy_ListView.ItemsSource = _surfaceGallery;

            _lightGallery = new LightGallery();
            swiatla_ListView.ItemsSource = _lightGallery;

            //Menu kontekstowe
            contextMenu = new System.Windows.Forms.ContextMenu();
            contextMenu.MenuItems.Add("Przenieś", contextMenuClick);
            contextMenu.MenuItems.Add("Obróć", contextMenuClick);
            contextMenu.MenuItems.Add("Skaluj", contextMenuClick);
            contextMenu.MenuItems.Add("Skaluj wzdłuż osi", contextMenuClick);
            contextMenu.MenuItems.Add("Powiększ widok", contextViewport);
            System.Windows.Forms.MenuItem[] subMenu = new System.Windows.Forms.MenuItem[4];
            System.Windows.Forms.MenuItem subLeft = new System.Windows.Forms.MenuItem("Lewej", subLeftClick);
            System.Windows.Forms.MenuItem subRight = new System.Windows.Forms.MenuItem("Prawej", subRightClick);
            System.Windows.Forms.MenuItem subUp = new System.Windows.Forms.MenuItem("Góry", subUpClick);
            System.Windows.Forms.MenuItem subDown = new System.Windows.Forms.MenuItem("Dołu", subDownClick);
            subMenu[0] = subLeft;
            subMenu[1] = subRight;
            subMenu[2] = subUp;
            subMenu[3] = subDown;
            contextMenu.MenuItems.Add("Dosuń do", subMenu);
            contextMenu.MenuItems[0].Checked = true;
            Views.ContextMenu = contextMenu;
        }
コード例 #7
0
        public override Modeler.Data.Scene.Scene Triangulate(float density)
        {
            uint step = minStep + (uint)((maxStep - minStep) * density);

            float           density_deg = 360.0f / step;
            List <Vector3D> vertices    = new List <Vector3D>();
            List <Triangle> triangles   = new List <Triangle>();

            if (step < 1)
            {
                step = 1;
            }

            // Tworzenie wierzchołków podstawy i dodawanie ich do listy
            float x, y, z;
            float deg = 0;

            for (int i = 0; i < step; i++)
            {
                y    = -1;
                x    = (float)Math.Cos(Utilities.DegToRad(deg));
                z    = (float)Math.Sin(Utilities.DegToRad(deg));
                deg += density_deg;
                vertices.Add(new Vector3D(x, y, z));
            }
            vertices.Add(new Vector3D(0, -1, 0));
            // Łączenie trójkątów w podstawie stożka
            for (uint i = 0; i < step; i++)
            {
                triangles.Add(new Triangle((i + 1) % step, i, (uint)vertices.Count() - 1));
            }

            vertices.Add(new Vector3D(0, 2, 0));

            // Łączenie trójkątów między podstawą a wystającym wierzchołkiem
            for (uint i = 0; i < step; i++)
            {
                triangles.Add(new Triangle(i, (i + 1) % step, (uint)vertices.Count() - 1));
            }

            Modeler.Data.Scene.Scene scene = new Modeler.Data.Scene.Scene();
            scene.points    = vertices;
            scene.triangles = triangles;

            return(scene);
        }
コード例 #8
0
        public void Save(Scene scene)
        {
            //zapisanie obecnego stanu
            Element second = first;
            first = new Element();
            first.next = second;
            first.scene = new Scene(scene);

            //funkcja "powtórz" jest dostępna tylko jeśli ostatnią czynnością było cofnięcie
            firstRedo = null;
            int m = 0;
            for (Element el=first;el!=null;el=el.next)
            {
                m+=el.scene.estimatedMemory();
                if (m > MAX_MEMORY) el.next=null;
            }
        }
コード例 #9
0
        public Scene(Scene copy)
        {
            points = new List<Vector3D>();
            foreach (Vector3D copyElem in copy.points) points.Add(new Vector3D(copyElem));
            triangles = new List<Triangle>();
            foreach (Triangle copyElem in copy.triangles) triangles.Add(new Triangle(copyElem.p1,copyElem.p2,copyElem.p3));
            parts = new List<Part>();
            foreach (Part copyElem in copy.parts) parts.Add(new Part(copyElem.triangles));
            materials = new List<Material_>();
            foreach (Material_ copyElem in copy.materials) materials.Add(new Material_(copyElem));
            materialAssign = new List<String>(copy.materialAssign);
            lights = new List<Light_>();
            foreach (Light_ copyElem in copy.lights) lights.Add(new Light_(copyElem));
            cams = new List<Camera>();
            foreach (Camera copyElem in copy.cams)
            {
                cams.Add(new Camera(copyElem));
            }
            hierarchy = new Hierarchy();
            hierarchy.objects = new List<HierarchyObject>();
            foreach (HierarchyObject hierarchyObject in copy.hierarchy.objects)
            {
                if (hierarchyObject is HierarchyNode)
                {
                    hierarchy.objects.Add(new HierarchyNode((HierarchyNode)hierarchyObject));
                }
                else if (hierarchyObject is HierarchyMesh)
                {
                    hierarchy.objects.Add(new HierarchyMesh((HierarchyMesh)hierarchyObject));
                }
                else if (hierarchyObject is HierarchyLight)
                {
                    hierarchy.objects.Add(new HierarchyLight((HierarchyLight)hierarchyObject));
                }
            }

            selTriangles = new List<HierarchyMesh>(copy.selTriangles);
            selLights = new List<int>(copy.selLights);
            selCams = new List<int>(copy.selCams);

            normals = new List<Vector3D>(copy.normals);

            activeCamera = copy.activeCamera;
            hierarchyChange = true;
        }
コード例 #10
0
        public static void RotateOY(Scene scene, float phi)
        {
            //List<uint> uniqueVertices = new List<uint>();
            HashSet<uint> uniqueVertices = new HashSet<uint>();
            if (scene.selTriangles.Count > 0)
            {
                foreach (HierarchyMesh obj in scene.selTriangles)
                {
                    //uint tmp;
                    foreach (uint triagleIdx in obj.triangles)
                    {
                        //tmp = scene.triangles[(int)triagleIdx].p1;
                        //if (!uniqueVertices.Contains(tmp))
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p1);
                        //tmp = scene.triangles[(int)triagleIdx].p2;
                        //if (!uniqueVertices.Contains(tmp))
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p2);
                        //tmp = scene.triangles[(int)triagleIdx].p3;
                        //if (!uniqueVertices.Contains(tmp))
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p3);
                    }
                }

                //Wyznaczenie środka
                Vector3D center = new Vector3D(0, 0, 0);
                foreach (int vertIdx in uniqueVertices)
                {
                    center.x = center.x + scene.points[vertIdx].x / uniqueVertices.Count;
                    center.y = center.y + scene.points[vertIdx].y / uniqueVertices.Count;
                    center.z = center.z + scene.points[vertIdx].z / uniqueVertices.Count;
                }

                //Obrót względem środka
                foreach (int vertIdx in uniqueVertices)
                {
                    scene.points[vertIdx].x = scene.points[vertIdx].x - center.x;
                    scene.points[vertIdx].z = scene.points[vertIdx].z - center.z;
                    float temp = scene.points[vertIdx].x * (float)Math.Cos(-phi) - scene.points[vertIdx].z * (float)Math.Sin(-phi);
                    scene.points[vertIdx].z = scene.points[vertIdx].x * (float)Math.Sin(-phi) + scene.points[vertIdx].z * (float)Math.Cos(-phi);
                    scene.points[vertIdx].x = temp;
                    scene.points[vertIdx].x = scene.points[vertIdx].x + center.x;
                    scene.points[vertIdx].z = scene.points[vertIdx].z + center.z;
                }
            }
        }
コード例 #11
0
        public void LoadGallery()
        {
            string currDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            string fullPath      = Path.Combine(currDirectory, "../../galleries/objects");

            string[] paths = Directory.GetFiles(fullPath); // TODO poprawić ścieżkę w finalnej wersji

            foreach (string path in paths)
            {
                string file = Path.GetFileNameWithoutExtension(path);

                Scene.Scene scene = Scene.Scene.ReadSceneFromFile(path);
                if (scene != null)
                {
                    Add(new PreparedElement(file, "../../Ikony/GotoweElementy/" + file + ".png", scene)); // TODO poprawić ścieżkę w finalnej wersji
                }
            }
        }
コード例 #12
0
        public override Modeler.Data.Scene.Scene Triangulate(float density)
        {
            uint step = minStep + (uint)((maxStep - minStep) * density);

            float density_deg = 360.0f / step;
            List<Vector3D> vertices = new List<Vector3D>();
            List<Triangle> triangles = new List<Triangle>();

            if (step < 1)
                step = 1;

            // Tworzenie wierzchołków podstawy i dodawanie ich do listy
            float x, y, z;
            float deg = 0;
            for (int i = 0; i < step; i++)
            {
                y = -1;
                x = (float)Math.Cos(Utilities.DegToRad(deg));
                z = (float)Math.Sin(Utilities.DegToRad(deg));
                deg += density_deg;
                vertices.Add(new Vector3D(x, y, z));
            }
            vertices.Add(new Vector3D(0, -1, 0));
            // Łączenie trójkątów w podstawie stożka
            for (uint i = 0; i < step; i++)
            {
                triangles.Add(new Triangle((i + 1) % step, i, (uint)vertices.Count() - 1));
            }

            vertices.Add(new Vector3D(0, 2, 0));

            // Łączenie trójkątów między podstawą a wystającym wierzchołkiem
            for (uint i = 0; i < step; i++)
            {
                triangles.Add(new Triangle(i, (i + 1) % step, (uint)vertices.Count() - 1));
            }

            Modeler.Data.Scene.Scene scene = new Modeler.Data.Scene.Scene();
            scene.points = vertices;
            scene.triangles = triangles;

            return scene;
        }
コード例 #13
0
        //działa na razie tylko na meshach które nie są zagnieżdżone w hierarchii, dodaje tylko te które nie są zaznaczone, ustawia bb sceny
        private static void SetBBoxes(Scene s)
        {
            float minx = float.MaxValue;
            float miny = float.MaxValue;
            float minz = float.MaxValue;
            float maxx = float.MinValue;
            float maxy = float.MinValue;
            float maxz = float.MinValue;
            float tmpx, tmpy, tmpz;
            BoundingBox tmpbb;

            foreach (HierarchyMesh mesh in s.hierarchy.objects)
            {
                tmpbb = new BoundingBox(s, mesh);

                if (!s.IsTriangleSelected(mesh.triangles[0]))
                {
                    //sprawdzamy, czy obiekt jest zaznaczony - jest kiedy jakikolwiek jego trójkąt jest na liście trójkatów zaznaczonych
                    //jeśli nie jest dodajemy jego bb do listy
                    otherSceneObjBB.Add(tmpbb);
                }
                //wyznaczamy skrajne punkty do wyznaczenia bb sceny
                tmpx = tmpbb.minBB.x;
                tmpy = tmpbb.minBB.y;
                tmpz = tmpbb.minBB.z;

                if (tmpx < minx)
                    minx = tmpx;
                if (tmpy < miny)
                    miny = tmpy;
                if (tmpz < minz)
                    minz = tmpz;

                tmpx = tmpbb.maxBB.x;
                tmpy = tmpbb.maxBB.y;
                tmpz = tmpbb.maxBB.z;

                if (tmpx > maxx)
                    maxx = tmpx;
                if (tmpy > maxy)
                    maxy = tmpy;
                if (tmpz > maxz)
                    maxz = tmpz;
            }

            Vector3D tmpmin = new Vector3D(minx, miny, minz);
            Vector3D tmpmax = new Vector3D(maxx, maxy, maxz);
            sceneBB = new BoundingBox(tmpmin, tmpmax);
        }
コード例 #14
0
        public static void SlideEZver(Scene scene, String slideDir)
        {
            float minDistance = float.MaxValue;
            float tmpDistance;
            bool colisionFound = false;
            bool canTranslate = true;

            SetBBoxes(scene);                       //tworzy strukture bboxów nie zaznaczonych obiektów na dole hierarchii, oraz bboxx sceny
            SetSlidingObjectBBox(scene);

            Console.WriteLine("bb sceny: " + sceneBB.minBB.x + " " + sceneBB.minBB.y + " " + sceneBB.minBB.z +
                " : " + sceneBB.maxBB.x + " " + sceneBB.maxBB.y + " " + sceneBB.maxBB.z);

            Console.WriteLine("bb przesuwanego obiektu: " + selectedObjectBB.minBB.x + " " + selectedObjectBB.minBB.y + " " + selectedObjectBB.minBB.z + " : "
                 + selectedObjectBB.maxBB.x + " " + selectedObjectBB.maxBB.y + " " + selectedObjectBB.maxBB.z);

            SetSpaceRequiredBox(scene, slideDir);   //wyznacza przestrzeń, w której będzie przesuwany zaznaczony obiekt

            Console.WriteLine("space bb: " + requiredSpaceBB.minBB.x + " " + requiredSpaceBB.minBB.y + " " + requiredSpaceBB.minBB.z + " : "
                + requiredSpaceBB.maxBB.x + " " + requiredSpaceBB.maxBB.y + " " + requiredSpaceBB.maxBB.z + " ");

            if (otherSceneObjBB.Count > 0)
            {
                foreach (BoundingBox otherBB in otherSceneObjBB)
                {
                    Console.WriteLine("Kolizja sprawdzana z obiektem " + otherBB.minBB.x + " " + otherBB.minBB.y + " " + otherBB.minBB.z + " : "
                            + otherBB.maxBB.x + " " + otherBB.maxBB.y + " " + otherBB.maxBB.z);
                    if (BBoxCollisionDetection(otherBB, requiredSpaceBB))//, slideDir))
                    {
                        colisionFound = true;
                        tmpDistance = CalculateDistanceEZ(otherBB, selectedObjectBB, slideDir);
                        if (tmpDistance < minDistance)
                            minDistance = tmpDistance;
                        Console.WriteLine("Kolizja wykryta z obiektem " + otherBB.minBB.x + " " + otherBB.minBB.y +" " + otherBB.minBB.z + " : "
                            + otherBB.maxBB.x + " " + otherBB.maxBB.y + " " + otherBB.maxBB.z);
                        if (BBoxCollisionDetection(otherBB, selectedObjectBB)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                            canTranslate = false;
                    }
                }

                if (colisionFound && canTranslate)
                {
                    Console.WriteLine("Min distance: " + minDistance);

                    if (slideDir.Equals("xyr")) //rzutowanie na płaszczyznę x y - przesunięcie w osi x
                    {
                        Transformations.Translate(scene, minDistance, 0, 0);
                    }

                    else if (slideDir.Equals("xyl"))
                    {
                        Transformations.Translate(scene, -minDistance, 0, 0);
                    }

                    else if (slideDir.Equals("yzu")) //rzutowanie na płaszczyznę y z - przesunięcie w osi y
                    {
                        Transformations.Translate(scene, 0, minDistance, 0);
                    }

                    else if (slideDir.Equals("yzd")) //rzutowanie na płaszczyznę y z - przesunięcie w osi y
                    {
                        Transformations.Translate(scene, 0, -minDistance, 0);
                    }

                    else if (slideDir.Equals("zxf")) //rzutowanie na płaszczyznę y z - przesunięcie w osi y
                    {
                        Transformations.Translate(scene, 0, 0, minDistance);
                    }

                    else //rzutowanie na płaszczyznę z x - przesunięcie w osi z zxb
                    {
                        Transformations.Translate(scene, 0, 0, -minDistance);
                    }
                }
                else if (colisionFound && !canTranslate)
                {
                    Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                }
                else
                {
                    Console.WriteLine("Brak kolizji");
                }
            }
            else
                Console.WriteLine("Brak innych elementów ");
            Clear();
        }
コード例 #15
0
        public static void Slide(Scene scene, String direction)
        {
            BoundingBox tmpbb;
            float tmpDistance = float.MaxValue, minDistance = float.MaxValue, minDistanceGlobal = float.MaxValue;
            bool colisionFound = false;
            bool canTranslate = true;
            SetBBoxes(scene);                       //tworzy strukture bboxów nie zaznaczonych obiektów na dole hierarchii, oraz bboxx sceny

            if (otherSceneObjBB.Count > 0)
            {
                if (direction.Equals("xyl")) //rzutowanie na płaszczyznę x y przesunięcie do lewej
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(sceneBB.minBB.x, tmpbb.minBB.y, tmpbb.minBB.z);
                            Vector3D tmp2 = new Vector3D(tmpbb.minBB.x, tmpbb.maxBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmp2);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                        minDistance = tmpDistance;
                                    if (minDistance < minDistanceGlobal)
                                        minDistanceGlobal = minDistance;
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                        canTranslate = false;
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                        + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound && canTranslate)
                        Transformations.Translate(scene, -minDistanceGlobal, 0, 0);
                    else if(colisionFound && !canTranslate)
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    else
                        Console.WriteLine("Brak kolizji");

                }
                else if (direction.Equals("xyr")) //rzutowanie na płaszczyznę x y przesunięcie do prawej
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(sceneBB.maxBB.x, tmpbb.maxBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmpbb.minBB, tmp);
                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                        minDistance = tmpDistance;
                                    if (minDistance < minDistanceGlobal)
                                        minDistanceGlobal = minDistance;
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                        canTranslate = false;
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                        + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                        Transformations.Translate(scene, minDistanceGlobal, 0, 0);
                    else if (colisionFound && !canTranslate)
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    else
                        Console.WriteLine("Brak kolizji");
                }
                else if (direction.Equals("yzu")) //rzutowanie na płaszczyznę y z przesunięcie do góry
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.maxBB.x, sceneBB.maxBB.y, tmpbb.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmpbb.minBB, tmp);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                        minDistance = tmpDistance;
                                    if (minDistance < minDistanceGlobal)
                                        minDistanceGlobal = minDistance;
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                        canTranslate = false;
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                        + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                        Transformations.Translate(scene, 0, minDistanceGlobal, 0);
                    else if (colisionFound && !canTranslate)
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    else
                        Console.WriteLine("Brak kolizji");
                }
                else if (direction.Equals("yzd")) //rzutowanie na płaszczyznę y z przesunięcie do dołu
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.minBB.x, sceneBB.minBB.y, tmpbb.minBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmpbb.maxBB);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                        minDistance = tmpDistance;
                                    if (minDistance < minDistanceGlobal)
                                        minDistanceGlobal = minDistance;
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                        canTranslate = false;
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                        + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                        Transformations.Translate(scene, 0, -minDistanceGlobal, 0);
                    else if (colisionFound && !canTranslate)
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    else
                        Console.WriteLine("Brak kolizji");
                }
                else if (direction.Equals("zxb")) //rzutowanie na płaszczyznę z x przesunięcie do tyłu
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.minBB.x, tmpbb.minBB.y, sceneBB.minBB.z);
                            requiredSpaceBB = new BoundingBox(tmp, tmpbb.maxBB);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                        minDistance = tmpDistance;
                                    if (minDistance < minDistanceGlobal)
                                        minDistanceGlobal = minDistance;
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                        canTranslate = false;
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                        + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                        Transformations.Translate(scene, 0, 0, -minDistanceGlobal);
                    else if (colisionFound && !canTranslate)
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    else
                        Console.WriteLine("Brak kolizji");
                }
                else //if(direction.Equals("zxf")) //rzutowanie na płaszczyznę z x przesunięcie do przodu
                {
                    foreach (HierarchyMesh mesh in scene.hierarchy.objects)
                    {
                        if (scene.IsTriangleSelected(mesh.triangles[0]))
                        {
                            tmpbb = new BoundingBox(scene, mesh);
                            Vector3D tmp = new Vector3D(tmpbb.maxBB.x, tmpbb.maxBB.y, sceneBB.maxBB.z);
                            requiredSpaceBB = new BoundingBox(tmpbb.minBB, tmp);

                            foreach (BoundingBox otherbb in otherSceneObjBB)
                            {
                                if (BBoxCollisionDetection(otherbb, requiredSpaceBB))//, slideDir))
                                {
                                    colisionFound = true;
                                    tmpDistance = CalculateDistanceEZ(otherbb, tmpbb, direction);
                                    if (tmpDistance < minDistance)
                                        minDistance = tmpDistance;
                                    if (minDistance < minDistanceGlobal)
                                        minDistanceGlobal = minDistance;
                                    if (BBoxCollisionDetection(otherbb, tmpbb)) //jeśli jakiś obiekt przecina się z dosuwanym na początku operacji- nie można dosuwać
                                        canTranslate = false;
                                    Console.WriteLine("Kolizja wykryta z obiektem " + otherbb.minBB.x + " " + otherbb.minBB.y + " " + otherbb.minBB.z + " : "
                                        + otherbb.maxBB.x + " " + otherbb.maxBB.y + " " + otherbb.maxBB.z);
                                }
                            }
                        }
                    }
                    if (colisionFound)
                        Transformations.Translate(scene, 0, 0, minDistanceGlobal);
                    else if (colisionFound && !canTranslate)
                        Console.WriteLine("Płaszczyzna BBoxa którą chcemy dosuwać jest wewnątrz BBoxa innego obiektu. Nie można wykonać operacji.");
                    else
                        Console.WriteLine("Brak kolizji");
                }
            }
            else
                Console.WriteLine("Brak innych objektów sceny");
            Clear();
        }
コード例 #16
0
        public static void TranslateAddedObject(Scene scene, float x, float y, float z)
        {
            HashSet<uint> uniqueVertices = new HashSet<uint>();
            if (scene.addedObject.Count > 0)
            {
                //DateTime startSearchVert = DateTime.Now;
                foreach (HierarchyMesh obj in scene.addedObject)
                {
                    foreach (uint triagleIdx in obj.triangles)
                    {
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p1);
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p2);
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p3);
                    }
                }
                //TimeSpan Elapsed = DateTime.Now - startSearchVert;

                //DateTime startTranslateVert = DateTime.Now;
                foreach (int vertIdx in uniqueVertices)
                {
                    scene.points[vertIdx].x += x;
                    scene.points[vertIdx].y += y;
                    scene.points[vertIdx].z += z;
                }
                //T/imeSpan ElapsedTranslate = DateTime.Now - startTranslateVert;

                //Console.WriteLine("Czas wyszukiwania: {0}, czas przesuwania {1}", Elapsed, ElapsedTranslate);

                scene.addedObject.RemoveRange(0, scene.addedObject.Count);
            }
        }
コード例 #17
0
        private void NowyB_Click(object sender, RoutedEventArgs e)
        {
            if(currScene.modified == true)
            {
                MessageBoxResult ifSave = System.Windows.MessageBox.Show("Czy chesz zapisać bieżącą scenę ?", "", MessageBoxButton.YesNo, MessageBoxImage.Question);
                if(ifSave == MessageBoxResult.Yes)
                {
                    SaveFileAs(sender, e);
                }
            }

            //SurfaceRenderer.Render(new Material_("mat1", 0.6f, 0.95f, 0.5f, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 100, 1, 1, 1));
            currScene = null;
            undo = null;
            undo = new UndoStack();
            currScene = new Scene();
            trNumTBG1.Text = currScene.triangles.Count().ToString();
            trNumTBG2.Text = currScene.triangles.Count().ToString();
            trNumTBG3.Text = currScene.triangles.Count().ToString();
            trNumTBG4.Text = currScene.triangles.Count().ToString();

            Renderer.RecalculateData(currScene);
            cameraPan.newSceneLoaded();
            cameraPan.comboBox1.SelectedIndex = currScene.activeCamera;
            currScene.selectedHierObj = null;

            //sceneChange = false;
            RenderViews();
        }
コード例 #18
0
        public BoundingBox(Scene sc, List<Triangle> obj)
        {
            float minx = float.MaxValue;
            float miny = float.MaxValue;
            float minz = float.MaxValue;
            float maxx = float.MinValue;
            float maxy = float.MinValue;
            float maxz = float.MinValue;
            float tmpx, tmpy, tmpz;

            foreach (Triangle triangleIdx in obj)
            {
                tmpx = sc.points[(int)triangleIdx.p1].x;
                if (minx > tmpx)
                    minx = tmpx;
                if (maxx < tmpx)
                    maxx = tmpx;

                tmpy = sc.points[(int)triangleIdx.p1].y;
                if (miny > tmpy)
                    miny = tmpy;
                if (maxy < tmpy)
                    maxy = tmpy;

                tmpz = sc.points[(int)triangleIdx.p1].z;
                if (minz > tmpz)
                    minz = tmpz;
                if (maxz < tmpz)
                    maxz = tmpz;

                tmpx = sc.points[(int)triangleIdx.p2].x;
                if (minx > tmpx)
                    minx = tmpx;
                if (maxx < tmpx)
                    maxx = tmpx;

                tmpy = sc.points[(int)triangleIdx.p2].y;
                if (miny > tmpy)
                    miny = tmpy;
                if (maxy < tmpy)
                    maxy = tmpy;

                tmpz = sc.points[(int)triangleIdx.p2].z;
                if (minz > tmpz)
                    minz = tmpz;
                if (maxz < tmpz)
                    maxz = tmpz;

                tmpx = sc.points[(int)triangleIdx.p3].x;
                if (minx > tmpx)
                    minx = tmpx;
                if (maxx < tmpx)
                    maxx = tmpx;

                tmpy = sc.points[(int)triangleIdx.p3].y;
                if (miny > tmpy)
                    miny = tmpy;
                if (maxy < tmpy)
                    maxy = tmpy;

                tmpz = sc.points[(int)triangleIdx.p3].z;
                if (minz > tmpz)
                    minz = tmpz;
                if (maxz < tmpz)
                    maxz = tmpz;
            }

            minBB = new Vector3D(minx, miny, minz);
            maxBB = new Vector3D(maxx, maxy, maxz);
        }
コード例 #19
0
        private void redoClick(object sender, RoutedEventArgs e)
        {
            if (tabWidok.SelectedIndex == 0)
            {
                currScene = undo.Redo(currScene);
                Renderer.RecalculateData(currScene);
                RenderViews();
            }
            else
            {
                bezierSurface = bezierUndo.Redo(bezierSurface);
                RenderBezier();
            }
            currScene.selectedHierObj = null;
            trNumTBG1.Text = currScene.triangles.Count().ToString();
            trNumTBG2.Text = currScene.triangles.Count().ToString();
            trNumTBG3.Text = currScene.triangles.Count().ToString();
            trNumTBG4.Text = currScene.triangles.Count().ToString();

            //sceneChange = true;
        }
コード例 #20
0
        public static void Scale(Scene scene, float x, float y, float z)
        {
            List<uint> selectedTriangles = new List<uint>();

            foreach (HierarchyMesh mesh in scene.selTriangles)
            {
                selectedTriangles.AddRange(mesh.triangles);
            }

            Vector3D center = new Vector3D(0, 0, 0);

            HashSet<uint> uniquePoints = new HashSet<uint>();
            foreach (uint triangleIndex in selectedTriangles)
            {
                uint p1 = scene.triangles[(int)triangleIndex].p1;
                uint p2 = scene.triangles[(int)triangleIndex].p2;
                uint p3 = scene.triangles[(int)triangleIndex].p3;

                uniquePoints.Add(p1);
                uniquePoints.Add(p2);
                uniquePoints.Add(p3);
            }

            foreach (uint uniquePoint in uniquePoints)
            {
                center.x += scene.points[(int)uniquePoint].x;
                center.y += scene.points[(int)uniquePoint].y;
                center.z += scene.points[(int)uniquePoint].z;
            }

            center.x /= uniquePoints.Count;
            center.y /= uniquePoints.Count;
            center.z /= uniquePoints.Count;

            float factorX = 0.3f * x;
            float factorY = 0.3f * y;
            float factorZ = 0.3f * z;

            foreach (uint pointIndex in uniquePoints)
            {
                scene.points[(int)pointIndex] -= center;
                scene.points[(int)pointIndex] *= new Vector3D(1 + factorX, 1 + factorY, 1 + factorZ);
                scene.points[(int)pointIndex] += center;
            }
        }
コード例 #21
0
        private static void SetSlidingObjectBBox(Scene s)
        {
            List<Triangle> selected = new List<Triangle>();

            foreach (HierarchyMesh selMesh in s.selTriangles)
            {
                foreach (uint triangleIdx in selMesh.triangles)
                {
                    if(s.IsTriangleSelected(triangleIdx))
                        selected.Add(s.triangles[(int)triangleIdx]);
                }

            }

            selectedObjectBB = new BoundingBox(s, selected);
        }
コード例 #22
0
 //parametr direction jest odpowiedzialny za kierunek w którym dosuwamy zaznaczony objekt,
 //może przyjmować 6 wartości: xyl, xyr, zxf, zxb, yzu, yzd. Będzie podawany odpowiednio na podstawie
 //wybranej opcji w menu kontekstowym oraz widoku, w którym dana opcja została wybrana
 private static void SetSpaceRequiredBox(Scene s, String direction)
 {
     if(direction.Equals("xyl")) //rzutowanie na płaszczyznę x y przesunięcie do lewej
     {
         Vector3D tmp = new Vector3D(sceneBB.minBB.x, selectedObjectBB.minBB.y, selectedObjectBB.minBB.z);
         Vector3D tmp2 = new Vector3D(selectedObjectBB.minBB.x, selectedObjectBB.maxBB.y, selectedObjectBB.maxBB.z);
         requiredSpaceBB = new BoundingBox(tmp, tmp2);
     }
     else if(direction.Equals("xyr")) //rzutowanie na płaszczyznę x y przesunięcie do prawej
     {
         Vector3D tmp = new Vector3D(sceneBB.maxBB.x, selectedObjectBB.maxBB.y, selectedObjectBB.maxBB.z);
         Vector3D tmp2 = new Vector3D(selectedObjectBB.maxBB.x, selectedObjectBB.minBB.y, selectedObjectBB.minBB.z);
         requiredSpaceBB = new BoundingBox(tmp2, tmp);
     }
     else if(direction.Equals("yzu")) //rzutowanie na płaszczyznę y z przesunięcie do góry
     {
         Vector3D tmp = new Vector3D(selectedObjectBB.maxBB.x, sceneBB.maxBB.y, selectedObjectBB.maxBB.z);
         Vector3D tmp2 = new Vector3D(selectedObjectBB.minBB.x, selectedObjectBB.maxBB.y, selectedObjectBB.minBB.z);
         requiredSpaceBB = new BoundingBox(tmp2, tmp);
     }
     else if(direction.Equals("yzd")) //rzutowanie na płaszczyznę y z przesunięcie do dołu
     {
         Vector3D tmp = new Vector3D(selectedObjectBB.minBB.x, sceneBB.minBB.y, selectedObjectBB.minBB.z);
         Vector3D tmp2 = new Vector3D(selectedObjectBB.maxBB.x, selectedObjectBB.minBB.y, selectedObjectBB.maxBB.z);
         requiredSpaceBB = new BoundingBox(tmp, tmp2);
     }
     else if(direction.Equals("zxb")) //rzutowanie na płaszczyznę z x przesunięcie do tyłu
     {
         Vector3D tmp = new Vector3D(selectedObjectBB.minBB.x, selectedObjectBB.minBB.y, sceneBB.minBB.z);
         Vector3D tmp2 = new Vector3D(selectedObjectBB.maxBB.x, selectedObjectBB.maxBB.y, selectedObjectBB.minBB.z);
         requiredSpaceBB = new BoundingBox(tmp, tmp2);
     }
     else //if(direction.Equals("zxf")) //rzutowanie na płaszczyznę z x przesunięcie do przodu
     {
         Vector3D tmp = new Vector3D(selectedObjectBB.maxBB.x, selectedObjectBB.maxBB.y, sceneBB.maxBB.z);
         Vector3D tmp2 = new Vector3D(selectedObjectBB.minBB.x, selectedObjectBB.minBB.y, selectedObjectBB.maxBB.z);
         requiredSpaceBB = new BoundingBox(tmp2, tmp);
     }
 }
コード例 #23
0
        public static void SelectElems(Scene scene, List<Vector3> camsPoints, Pair<List<Vector3>, List<int> > lightsPoints,
            ViewportType viewportType, Point pos, Point size, Vector2 orthoSize, Vector3 orthoPos, Vector3 orthoLookAt, bool ctrl)
        {
            Vector3 outCamPos = new Vector3(), outSurfPos = new Vector3();

            switch(viewportType)
            {
                case ViewportType.Perspective:
                    CalcPerspCoords(pos, size, scene.cams[scene.activeCamera].fovAngle, scene.cams[scene.activeCamera].rotateAngle,
                scene.cams[scene.activeCamera].position, scene.cams[scene.activeCamera].lookAt, out outCamPos, out outSurfPos);
                    break;

                case ViewportType.Orto:
                    CalcOrthoCoords(pos, size, orthoSize, orthoPos, orthoLookAt, out outCamPos, out outSurfPos);
                    break;
            }

            List<Triang> triangsCam = new List<Triang>();
            for(int i = 0; i < camsPoints.Count / 8; ++i)
            {
                for(int j = RenderCamera.triangles.Length - 1; j < RenderCamera.triangles.Length; ++j)
                {
                    triangsCam.Add(new Triang(camsPoints[3 * i + (int)RenderCamera.triangles[j].p1],
                                              camsPoints[3 * i + (int)RenderCamera.triangles[j].p2],
                                              camsPoints[3 * i + (int)RenderCamera.triangles[j].p3]));
                }
            }

            List<Triang> triangsLight = new List<Triang>();
            int sumPoints = 0;
            for(int i = 0; i < lightsPoints.Second.Count; ++i)
            {
                for(int j = 0; j < lightsPoints.Second[i]; ++j)
                {
                    triangsLight.Add(new Triang(lightsPoints.First[sumPoints + (int)RenderLight.triangles[j].p1],
                                                lightsPoints.First[sumPoints + (int)RenderLight.triangles[j].p2],
                                                lightsPoints.First[sumPoints + (int)RenderLight.triangles[j].p3]));
                }

                sumPoints += lightsPoints.Second[i] == RenderLight.trianglesSpotNum ? RenderLight.pointsSpotNum : RenderLight.pointsPointNum;
            }

            bool clipped = false;
            float clipMin = 0, clipMax = 0;
            Vector3 rayShift = new Vector3(0);

            if(viewportType == ViewportType.Orto && Renderer.Clipping == true)
            {
                float xmin, xplus, ymin, yplus, zmin, zplus;

                if(outCamPos.Z > 40000)
                {
                    xmin = Renderer.GetClipPlanePosition(ClipPlaneType.XMIN);
                    xplus = Renderer.GetClipPlanePosition(ClipPlaneType.XPLUS);
                    ymin = Renderer.GetClipPlanePosition(ClipPlaneType.YMIN);
                    yplus = Renderer.GetClipPlanePosition(ClipPlaneType.YPLUS);
                    zmin = Renderer.GetClipPlanePosition(ClipPlaneType.ZMIN);
                    zplus = Renderer.GetClipPlanePosition(ClipPlaneType.ZPLUS);

                    if(outCamPos.X < xmin || outCamPos.X > xplus || outCamPos.Y < ymin || outCamPos.Y > yplus)
                    {
                        clipped = true;
                    }
                    else
                    {
                        clipMin = 50001 - zplus;
                        clipMax = zplus - zmin;

                        rayShift = new Vector3(0, 0, clipMin);
                    }
                }
                else if(outCamPos.X > 40000)
                {
                    xmin = Renderer.GetClipPlanePosition(ClipPlaneType.ZPLUS);
                    xplus = Renderer.GetClipPlanePosition(ClipPlaneType.ZMIN);
                    ymin = Renderer.GetClipPlanePosition(ClipPlaneType.YMIN);
                    yplus = Renderer.GetClipPlanePosition(ClipPlaneType.YPLUS);
                    zmin = Renderer.GetClipPlanePosition(ClipPlaneType.XMIN);
                    zplus = Renderer.GetClipPlanePosition(ClipPlaneType.XPLUS);

                    if(outCamPos.Z > xmin || outCamPos.Z < xplus || outCamPos.Y < ymin || outCamPos.Y > yplus)
                    {
                        clipped = true;
                    }
                    else
                    {
                        clipMin = 50001 - zplus;
                        clipMax = zplus - zmin;

                        rayShift = new Vector3(clipMin, 0, 0);
                    }
                }
                else if(outCamPos.Y > 40000)
                {
                    xmin = Renderer.GetClipPlanePosition(ClipPlaneType.XMIN);
                    xplus = Renderer.GetClipPlanePosition(ClipPlaneType.XPLUS);
                    ymin = Renderer.GetClipPlanePosition(ClipPlaneType.ZPLUS);
                    yplus = Renderer.GetClipPlanePosition(ClipPlaneType.ZMIN);
                    zmin = Renderer.GetClipPlanePosition(ClipPlaneType.YMIN);
                    zplus = Renderer.GetClipPlanePosition(ClipPlaneType.YPLUS);

                    if(outCamPos.X < xmin || outCamPos.X > xplus || outCamPos.Z > ymin || outCamPos.Z < yplus)
                    {
                        clipped = true;
                    }
                    else
                    {
                        clipMin = 50001 - zplus;
                        clipMax = zplus - zmin;

                        rayShift = new Vector3(0, clipMin, 0);
                    }
                }
            }

            Vector3 rayDir = Vector3.Normalize(outSurfPos - outCamPos);

            SlimDX.Ray ray = new SlimDX.Ray(outCamPos + 0.01f * rayDir - rayShift, rayDir);

            float[] triangleDist = new float[scene.triangles.Count];
            float minDist = float.PositiveInfinity;
            int minIndex = -1;

            if(clipped == false)
            {
                if(viewportType == ViewportType.Orto && Renderer.Clipping == true)
                {
                    for(int i = 0; i < scene.triangles.Count; ++i)
                    {
                        float dist;

                        if(SlimDX.Ray.Intersects(ray, scene.points[(int)scene.triangles[i].p1], scene.points[(int)scene.triangles[i].p2],
                            scene.points[(int)scene.triangles[i].p3], out dist))
                        {
                            if(dist >= 0 && dist < minDist && dist < clipMax)
                            {
                                minIndex = i;
                                minDist = dist;
                            }
                        }
                    }
                }
                else
                {
                    for(int i = 0; i < scene.triangles.Count; ++i)
                    {
                        float dist;

                        if(SlimDX.Ray.Intersects(ray, scene.points[(int)scene.triangles[i].p1], scene.points[(int)scene.triangles[i].p2],
                            scene.points[(int)scene.triangles[i].p3], out dist))
                        {
                            if(dist >= 0 && dist < minDist)
                            {
                                minIndex = i;
                                minDist = dist;
                            }
                        }
                    }
                }
            }

            minDist += clipMin;

            ray = new SlimDX.Ray(outCamPos + 0.01f * rayDir, rayDir);

            float[] camsTriangleDist = new float[triangsCam.Count];
            float camsMinDist = float.PositiveInfinity;
            int camsMinIndex = -1;

            if(viewportType != ViewportType.Perspective)
            {
                for(int i = 0; i < triangsCam.Count; ++i)
                {
                    float dist;

                    if(SlimDX.Ray.Intersects(ray, triangsCam[i].p1, triangsCam[i].p2, triangsCam[i].p3, out dist))
                    {
                        if(dist >= 0 && dist < camsMinDist)
                        {
                            camsMinIndex = i;
                            camsMinDist = dist;
                        }
                    }
                }
            }

            float[] lightsTriangleDist = new float[triangsLight.Count];
            float lightsMinDist = float.PositiveInfinity;
            int lightsMinIndex = -1;

            if(viewportType != ViewportType.Perspective)
            {
                for(int i = 0; i < triangsLight.Count; ++i)
                {
                    float dist;

                    if(SlimDX.Ray.Intersects(ray, triangsLight[i].p1, triangsLight[i].p2, triangsLight[i].p3, out dist))
                    {
                        if(dist >= 0 && dist < lightsMinDist)
                        {
                            lightsMinIndex = i;
                            lightsMinDist = lightsTriangleDist[i];
                        }
                    }
                }
            }

            List<float> pointsDist = new List<float>();
            float pointsMinDist = float.PositiveInfinity;
            int pointsMinIndex = -1;

            if(viewportType != ViewportType.Perspective)
            {
                for(int i = 0; i < scene.lights.Count; ++i)
                {
                    if(scene.lights[i].type == Light_Type.Spot || scene.lights[i].type == Light_Type.Goniometric)
                    {
                        float dist;

                        Vector3 lightPos = scene.lights[i].position + scene.lights[i].direction * Renderer.spotLightDist * orthoSize.X / 10;
                        if(SlimDX.Ray.Intersects(ray, new BoundingBox(new Vector3(lightPos.X - Renderer.pointSize * orthoSize.X / 20,
                                                                                  lightPos.Y - Renderer.pointSize * orthoSize.X / 20,
                                                                                  lightPos.Z - Renderer.pointSize * orthoSize.X / 20),
                                                                      new Vector3(lightPos.X + Renderer.pointSize * orthoSize.X / 20,
                                                                                  lightPos.Y + Renderer.pointSize * orthoSize.X / 20,
                                                                                  lightPos.Z + Renderer.pointSize * orthoSize.X / 20)), out dist))
                        {
                            pointsDist.Add(dist);
                        }
                        else
                        {
                            pointsDist.Add(-1);
                        }
                    }
                }

                for(int i = 0; i < scene.cams.Count; ++i)
                {
                    float dist;

                    Vector3 camPos = scene.cams[i].position;
                    if(SlimDX.Ray.Intersects(ray, new BoundingBox(new Vector3(camPos.X - Renderer.pointSize * orthoSize.X / 20,
                                                                                camPos.Y - Renderer.pointSize * orthoSize.X / 20,
                                                                                camPos.Z - Renderer.pointSize * orthoSize.X / 20),
                                                                    new Vector3(camPos.X + Renderer.pointSize * orthoSize.X / 20,
                                                                                camPos.Y + Renderer.pointSize * orthoSize.X / 20,
                                                                                camPos.Z + Renderer.pointSize * orthoSize.X / 20)), out dist))
                    {
                        pointsDist.Add(dist);
                    }
                    else
                    {
                        pointsDist.Add(-1);
                    }

                    Vector3 camLookAt = Renderer.camsLookAtPoints[i];
                    if(SlimDX.Ray.Intersects(ray, new BoundingBox(new Vector3(camLookAt.X - Renderer.pointSize * orthoSize.X / 20,
                                                                                camLookAt.Y - Renderer.pointSize * orthoSize.X / 20,
                                                                                camLookAt.Z - Renderer.pointSize * orthoSize.X / 20),
                                                                    new Vector3(camLookAt.X + Renderer.pointSize * orthoSize.X / 20,
                                                                                camLookAt.Y + Renderer.pointSize * orthoSize.X / 20,
                                                                                camLookAt.Z + Renderer.pointSize * orthoSize.X / 20)), out dist))
                    {
                        pointsDist.Add(dist);
                    }
                    else
                    {
                        pointsDist.Add(-1);
                    }
                }

                for(int i = 0; i < pointsDist.Count; ++i)
                {
                    if(pointsDist[i] >= 0 && pointsDist[i] < pointsMinDist)
                    {
                        pointsMinIndex = i;
                        pointsMinDist = pointsDist[i];
                    }
                }
            }

            int foundTriangle = minIndex;
            int foundLight = lightsMinIndex;
            int foundCamera = camsMinIndex;
            int foundPoint = pointsMinIndex;

            if(foundPoint >= 0 && pointsMinDist < minDist && pointsMinDist < lightsMinDist)
            {
                pointFound = pointsMinIndex;

                scene.selTriangles.Clear();
                scene.selLights.Clear();
                scene.selCams.Clear();
            }
            else
            {
                pointFound = -1;

                if(foundLight >= 0 && lightsMinDist < minDist && lightsMinDist < camsMinDist && lightsMinDist < pointsMinDist)
                {
                    foundTriangle = -1;
                    foundCamera = -1;
                }
                if(foundCamera >= 0 && camsMinDist < minDist && camsMinDist < lightsMinDist && camsMinDist < pointsMinDist)
                {
                    foundTriangle = -1;
                    foundLight = -1;
                }

                if(ctrl == false)
                {
                    scene.selTriangles.Clear();
                    scene.selLights.Clear();
                    scene.selCams.Clear();
                }

                if(foundTriangle >= 0)
                {
                    HierarchyMesh mesh = Hierarchy.GetSelectedMesh(scene.hierarchy.objects, foundTriangle);
                    if(scene.selTriangles.Contains(mesh) == false)
                    {
                        scene.selTriangles.Add(mesh);
                    }
                    else
                    {
                        if(ctrl == true)
                        {
                            scene.selTriangles.Remove(mesh);
                        }
                    }
                }
                else if(foundLight >= 0)
                {
                    int i = 0;
                    int index = lightsPoints.Second[i];
                    while(foundLight > index)
                    {
                        index += lightsPoints.Second[++i];
                    }
                    int lightIndex = i;

                    if(scene.selLights.Contains(lightIndex) == false)
                    {
                        scene.selLights.Add(lightIndex);
                    }
                    else
                    {
                        if(ctrl == true)
                        {
                            scene.selLights.Remove(lightIndex);
                        }
                    }
                }
                else if(foundCamera >= 0)
                {
                    int cameraIndex = foundCamera / RenderCamera.triangles.Length;
                    if(scene.selCams.Contains(cameraIndex) == false)
                    {
                        scene.selCams.Add(cameraIndex);
                    }
                    else
                    {
                        if(ctrl == true)
                        {
                            scene.selCams.Remove(cameraIndex);
                        }
                    }
                }
                else
                {
                    if(ctrl == false)
                    {
                        scene.selTriangles.Clear();
                        scene.selLights.Clear();
                        scene.selCams.Clear();
                    }
                }
            }
        }
コード例 #24
0
        public MainWindow()
        {
            try
            {
                InitializeComponent();
            }
            catch (Exception e)
            {
            }

            bezierSurface = new BezierSurface("new surface", "");
            bezierSurface.Triangulate(0.5f);

            renderer = new Renderer(Views.Handle, ViewsBezier.Handle);
            maxViewport = ViewportOrientation.None;
            mouseDownHandled = false;
            shiftingViewport = ViewportOrientation.None;
            shiftingBezierViewport = ViewportOrientation.None;
            //currScene = Scene.GetExampleScene();
            currScene = new Scene();

            // Tworzenie kolekcji obiektów i dodawanie jej do kontrolki ItemsControl
            // galerii ksztaltow.
            _shapesGallery = new ShapeGallery();
            // Wczytywanie powierzchni beziera
            ksztalty_ListView.ItemsSource = _shapesGallery;

            // Tworzenie kolekcji gotowych obiektów i dodawanie jej do kontrolki ItemsControl
            // galerii gotowych obiektów.
            _elementsGallery = new PreparedObjectsGallery();
            gotowe_ListView.ItemsSource = _elementsGallery;

            _surfaceGallery = new SurfaceGallery();
            materialy_ListView.ItemsSource = _surfaceGallery;

            _lightGallery = new LightGallery();
            swiatla_ListView.ItemsSource = _lightGallery;

            //Menu kontekstowe
            contextMenu = new System.Windows.Forms.ContextMenu();
            contextMenu.MenuItems.Add("Przenieś", contextMenuClick);
            contextMenu.MenuItems.Add("Obróć", contextMenuClick);
            contextMenu.MenuItems.Add("Skaluj", contextMenuClick);
            contextMenu.MenuItems.Add("Skaluj wzdłuż osi", contextMenuClick);
            contextMenu.MenuItems.Add("Powiększ widok", contextViewport);
            contextMenu.MenuItems.Add("Zapisz gotowy element", contextSave);
            System.Windows.Forms.MenuItem[] subMenu = new System.Windows.Forms.MenuItem[4];
            System.Windows.Forms.MenuItem subLeft = new System.Windows.Forms.MenuItem("Lewej", subLeftClick);
            System.Windows.Forms.MenuItem subRight = new System.Windows.Forms.MenuItem("Prawej", subRightClick);
            System.Windows.Forms.MenuItem subUp = new System.Windows.Forms.MenuItem("Góry", subUpClick);
            System.Windows.Forms.MenuItem subDown = new System.Windows.Forms.MenuItem("Dołu", subDownClick);
            subMenu[0] = subLeft;
            subMenu[1] = subRight;
            subMenu[2] = subUp;
            subMenu[3] = subDown;
            contextMenu.MenuItems.Add("Dosuń do", subMenu);
            contextMenu.MenuItems.Add("Kopiuj", contextCopy);
            contextMenu.MenuItems.Add("Wklej", contextPaste);
            contextMenu.MenuItems.Add("Usuń", contextDelete);
            contextMenu.MenuItems[0].Checked = true;
            Views.ContextMenu = contextMenu;

            //Menu kontekstowe dla płatów beziera
            bezierContextMenu = new ContextMenu();
            bezierContextMenu.MenuItems.Add("Zresetuj punkty", bezierContextMenuClick);
            bezierContextMenu.MenuItems.Add("Nowa powierzchnia", bezierContextMenuNewSurface);
            ViewsBezier.ContextMenu = bezierContextMenu;

            copyPaste = new CopyPaste.CopyPaste();
        }
コード例 #25
0
        /// <summary>
        /// Triangulacja sfery metodą południkowo równoleżnikową
        /// </summary>
        /// <param name="density"></param>
        /// <returns></returns>
        public override Modeler.Data.Scene.Scene Triangulate(float density)
        {
            Scene.Scene scene = new Scene.Scene();
            List<Vector3D> vertices = new List<Vector3D>();
            List<Triangle> triangles = new List<Triangle>();

            int width = (int)(maxStep * density);
            int height = (int)(maxStep * density);
            float theta, phi;
            float x, y, z;

            if (width < 3)
                width = 3;
            if (height < 3)
                height = 3;

            //Tworzenie wierzchołków
            for (int j = 1; j < height; j++)
            {
                for (int i = 0; i < width; i++)
                {
                    theta = (float)((float)j / height - 1) * (float)Math.PI;
                    phi = (float)((float)i / width - 1) * (float)Math.PI * 2;

                    x = (float)(Math.Sin(theta) * Math.Cos(phi));
                    y = (float)(Math.Cos(theta));
                    z = (float)(-Math.Sin(theta) * Math.Sin(phi));

                    vertices.Add(new Vector3D(x, y, z));
                }
            }
            // Dodanie biegunow
            vertices.Add(new Vector3D(0, 1, 0));
            vertices.Add(new Vector3D(0, -1, 0));

            uint p1, p2, p3;

            // Łączenie punktow w trojkaty, za wyjatkiem trojkatow przy biegunach
            for (uint j = 0; j < height - 2 ; j++)
            {
                for (uint i = 0; i < width ; i++)
                {
                    p1 = (uint)((j * width + i) % width + j * width);
                    p2 = (uint)(((j + 1) * width + i + 1) % width + (j + 1) * width);
                    p3 = (uint)((j * width + i + 1) % width + j * width);
                    triangles.Add(new Triangle(p1, p2, p3));
                    p1 = (uint)((j * width + i) % width + j * width);
                    p2 = (uint)(((j + 1) * width + i) % width + (j + 1) * width);
                    p3 = (uint)(((j + 1) * width + i + 1) % width + (j + 1) * width);
                    triangles.Add(new Triangle(p1, p2, p3));
                }
            }

            // Laczenie trojkatow przy biegunach
            uint north = (uint)vertices.Count - 2;
            uint south = (uint)vertices.Count - 1;
            for (uint i = 0; i < width; i++)
            {
                p1 = (uint)(i % width);
                p2 = (uint)((i + 1) % width);
                triangles.Add(new Triangle(south, p1, p2));
                p1 = (uint)(((height - 2) * width + i) % width + (height - 2) * width);
                p2 = (uint)(((height - 2) * width + i + 1) % width + (height - 2) * width);
                triangles.Add(new Triangle(p2, p1, north));
            }

            scene.points = vertices;
            scene.triangles = triangles;

            return scene;
        }
コード例 #26
0
        private void OpenFile(object sender, RoutedEventArgs e)
        {
            if (currScene.modified)
            {
                MessageBoxResult ifSave = System.Windows.MessageBox.Show("Czy chesz zapisać bieżącą scenę ?", "", MessageBoxButton.YesNo, MessageBoxImage.Question);
                if (ifSave == MessageBoxResult.Yes)
                {
                    SaveFileAs(sender, e);
                }
            }

            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

            dlg.Filter = "Pliki sceny |*.scn|Wszystkie pliki |*.*";
            //dlg.InitialDirectory = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

            Nullable<bool> result = dlg.ShowDialog();

            if (result == true)
            {
                undo = null;
                undo = new UndoStack();
                Scene fileScene = Scene.ReadSceneFromFile(dlg.FileName);
                if (fileScene != null)
                {
                    currScene = fileScene;

                    Renderer.RecalculateData(currScene);

                    cameraPan.newSceneLoaded();
                    cameraPan.comboBox1.SelectedIndex = currScene.activeCamera;

                    RenderViews();
                }
                else
                {
                    System.Windows.MessageBox.Show("Wybrany plik ma niepoprawny format.", "Błąd", MessageBoxButton.OK, MessageBoxImage.Warning);
                }
                trNumTBG1.Text = currScene.triangles.Count().ToString();
                trNumTBG2.Text = currScene.triangles.Count().ToString();
                trNumTBG3.Text = currScene.triangles.Count().ToString();
                trNumTBG4.Text = currScene.triangles.Count().ToString();
            }
            currScene.selectedHierObj = null;
        }
コード例 #27
0
        public static void Translate(Scene scene, float x, float y, float z)
        {
            // Transformacja odbywa się tylko jeśli zaznaczony jest jakiś obiekt
            // tymczasowo tylko siatka trojkatow
            //List<uint> uniqueVertices = new List<uint>();
            HashSet<uint> uniqueVertices = new HashSet<uint>();
            if (scene.selTriangles.Count > 0)
            {
                //DateTime startSearchVert = DateTime.Now;
                foreach (HierarchyMesh obj in scene.selTriangles)
                {
                    foreach (uint triagleIdx in obj.triangles)
                    {
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p1);
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p2);
                        uniqueVertices.Add(scene.triangles[(int)triagleIdx].p3);
                    }
                }
                //TimeSpan Elapsed = DateTime.Now - startSearchVert;

                //DateTime startTranslateVert = DateTime.Now;
                foreach (int vertIdx in uniqueVertices)
                {
                    scene.points[vertIdx].x += x;
                    scene.points[vertIdx].y += y;
                    scene.points[vertIdx].z += z;
                }
                //TimeSpan ElapsedTranslate = DateTime.Now - startTranslateVert;

                //Console.WriteLine("Czas wyszukiwania: {0}, czas przesuwania {1}", Elapsed, ElapsedTranslate);
            }
            foreach (Light_ light in scene.selLights)
            {
                light.position.X += x;
                light.position.Y += y;
                light.position.Z += z;
            }
        }
コード例 #28
0
        private void undoClick(object sender, RoutedEventArgs e)
        {
            if (tabWidok.SelectedIndex == 0)
            {
                currScene = undo.Undo(currScene);
                //cameraPan.newSceneLoaded();
                Renderer.RecalculateData(currScene);
                RenderViews();
            } else if (tabWidok.SelectedIndex == 1)
            {
                bezierSurface = bezierUndo.Undo(bezierSurface);
                //bezierSurface.Triangulate((float)triang_Slider.Value);
                RenderBezier();
            }
            currScene.selectedHierObj = null;
            trNumTBG1.Text = currScene.triangles.Count().ToString();
            trNumTBG2.Text = currScene.triangles.Count().ToString();
            trNumTBG3.Text = currScene.triangles.Count().ToString();
            trNumTBG4.Text = currScene.triangles.Count().ToString();

            //sceneChange = true;
        }
コード例 #29
0
        public static Scene ReadSceneFromFile(string file)
        {
            Scene scene = new Scene();

            try
            {
                scene.filePath = file;
                scene.modified = false;

                List<string> text = File.ReadFileLines(file);
                int pointer = 0;

                string pointsNumLabel = File.GetAttribute(text[pointer], 0);
                if(pointsNumLabel != "points_count")
                {
                    return null;
                }
                uint pointsNum = uint.Parse(File.GetAttribute(text[pointer++], 1));

                List<Vector3D> points = new List<Vector3D>();

                for(int i = 0; i < pointsNum; ++i)
                {
                    string[] attsPoint = File.GetAttributes(text[pointer++]);
                    points.Add(new Vector3D(float.Parse(attsPoint[0], CultureInfo.InvariantCulture),
                                            float.Parse(attsPoint[1], CultureInfo.InvariantCulture),
                                            float.Parse(attsPoint[2], CultureInfo.InvariantCulture)));
                }

                string triangleNumLabel = File.GetAttribute(text[pointer], 0);
                if(triangleNumLabel != "triangles_count")
                {
                    return null;
                }
                uint triangleNum = uint.Parse(File.GetAttribute(text[pointer++], 1));

                List<Triangle> triangles = new List<Triangle>();

                for(int i = 0; i < triangleNum; ++i)
                {
                    string[] attsTriangle = File.GetAttributes(text[pointer++]);
                    triangles.Add(new Triangle(uint.Parse(attsTriangle[0]), uint.Parse(attsTriangle[1]), uint.Parse(attsTriangle[2])));
                }

                string partsNumLabel = File.GetAttribute(text[pointer], 0);
                if(partsNumLabel != "parts_count")
                {
                    return null;
                }
                uint partsNum = uint.Parse(File.GetAttribute(text[pointer++], 1));

                List<uint> trPart = new List<uint>();

                string[] atts = File.GetAttributes(text[pointer]);
                for(int i = 0; i < triangleNum; ++i)
                {
                    trPart.Add(uint.Parse(atts[i]));
                }
                ++pointer;

                List<Part> parts = new List<Part>();

                for(int i = 0; i < partsNum; ++i)
                {
                    List<int> partTriangles = new List<int>();

                    for(int j = 0; j < trPart.Count; ++j)
                    {
                        if(trPart[j] == i)
                        {
                            partTriangles.Add(j);
                        }
                    }

                    parts.Add(new Part(partTriangles));
                }

                string matNumLabel = File.GetAttribute(text[pointer], 0);
                if(matNumLabel != "materials_count")
                {
                    return null;
                }
                uint matNum = uint.Parse(File.GetAttribute(text[pointer++], 1));

                List<Material_> materials = new List<Material_>();

                for(int i = 0; i < matNum; ++i)
                {
                    string[] matName = File.GetAttributes(text[pointer]);
                    if(matName[0] != "mat_name")
                    {
                        return null;
                    }
                    string name = File.CutFirstString(text[pointer]);
                    ++pointer;

                    string rgbLabel = File.GetAttribute(text[pointer], 0);
                    if(rgbLabel != "rgb")
                    {
                        return null;
                    }
                    float colorR = float.Parse(File.GetAttribute(text[pointer], 1), CultureInfo.InvariantCulture);
                    float colorG = float.Parse(File.GetAttribute(text[pointer], 2), CultureInfo.InvariantCulture);
                    float colorB = float.Parse(File.GetAttribute(text[pointer++], 3), CultureInfo.InvariantCulture);

                    string kdCrLabel = File.GetAttribute(text[pointer], 0);
                    float kdCr = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(kdCrLabel != "kdCr")
                    {
                        return null;
                    }
                    string kdCgLabel = File.GetAttribute(text[pointer], 0);
                    float kdCg = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(kdCgLabel != "kdCg")
                    {
                        return null;
                    }
                    string kdCbLabel = File.GetAttribute(text[pointer], 0);
                    float kdCb = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(kdCbLabel != "kdCb")
                    {
                        return null;
                    }

                    string ksCrLabel = File.GetAttribute(text[pointer], 0);
                    float ksCr = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(ksCrLabel != "ksCr")
                    {
                        return null;
                    }
                    string ksCgLabel = File.GetAttribute(text[pointer], 0);
                    float ksCg = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(ksCgLabel != "ksCg")
                    {
                        return null;
                    }
                    string ksCbLabel = File.GetAttribute(text[pointer], 0);
                    float ksCb = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(ksCbLabel != "ksCb")
                    {
                        return null;
                    }

                    string krCrLabel = File.GetAttribute(text[pointer], 0);
                    float krCr = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(krCrLabel != "krCr")
                    {
                        return null;
                    }
                    string krCgLabel = File.GetAttribute(text[pointer], 0);
                    float krCg = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(krCgLabel != "krCg")
                    {
                        return null;
                    }
                    string krCbLabel = File.GetAttribute(text[pointer], 0);
                    float krCb = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(krCbLabel != "krCb")
                    {
                        return null;
                    }

                    string kaCrLabel = File.GetAttribute(text[pointer], 0);
                    float kaCr = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(kaCrLabel != "kaCr")
                    {
                        return null;
                    }
                    string kaCgLabel = File.GetAttribute(text[pointer], 0);
                    float kaCg = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(kaCgLabel != "kaCg")
                    {
                        return null;
                    }
                    string kaCbLabel = File.GetAttribute(text[pointer], 0);
                    float kaCb = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(kaCbLabel != "kaCb")
                    {
                        return null;
                    }

                    string gLabel = File.GetAttribute(text[pointer], 0);
                    float g = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(gLabel != "g")
                    {
                        return null;
                    }
                    string nLabel = File.GetAttribute(text[pointer], 0);
                    float n = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    if(nLabel != "n")
                    {
                        return null;
                    }

                    materials.Add(new Material_(name, colorR, colorG, colorB, kdCr, kdCg, kdCb, ksCr, ksCg, ksCb, krCr, krCg, krCb, kaCr, kaCg, kaCb, g, n));
                }

                List<string> matAssign = new List<string>();

                for(int i = 0; i < partsNum; ++i)
                {
                    string mat = File.CutFirstString(text[pointer++]);
                    matAssign.Add(mat);
                }

                string lightsLabel = File.GetAttribute(text[pointer], 0);
                if(lightsLabel != "lights_count")
                {
                    return null;
                }
                uint lightsNum = uint.Parse(File.GetAttribute(text[pointer++], 1));

                List<Light_> lights = new List<Light_>();

                for(int i = 0; i < lightsNum; ++i)
                {
                    string[] lightName = File.GetAttributes(text[pointer]);
                    if(lightName[0] != "light_name")
                    {
                        return null;
                    }
                    string name = File.CutFirstString(text[pointer]);
                    ++pointer;

                    string enabledLabel = File.GetAttribute(text[pointer], 0);
                    if(enabledLabel != "enabled")
                    {
                        return null;
                    }
                    bool enabled = int.Parse(File.GetAttribute(text[pointer++], 1)) == 1 ? true : false;

                    string typeLabel = File.GetAttribute(text[pointer], 0);
                    if(typeLabel != "light_type")
                    {
                        return null;
                    }
                    Light_Type type = Light_Type.Point;
                    switch(File.GetAttribute(text[pointer++], 1))
                    {
                        case "point":
                            type = Light_Type.Point;
                            break;

                        case "spot":
                            type = Light_Type.Spot;
                            break;

                        case "goniometric":
                            type = Light_Type.Goniometric;
                            break;
                    }

                    string colorLabel = File.GetAttribute(text[pointer], 0);
                    if(colorLabel != "rgb")
                    {
                        return null;
                    }
                    float colorR = float.Parse(File.GetAttribute(text[pointer], 1), CultureInfo.InvariantCulture);
                    float colorG = float.Parse(File.GetAttribute(text[pointer], 2), CultureInfo.InvariantCulture);
                    float colorB = float.Parse(File.GetAttribute(text[pointer++], 3), CultureInfo.InvariantCulture);

                    string powerLabel = File.GetAttribute(text[pointer], 0);
                    if(powerLabel != "power")
                    {
                        return null;
                    }
                    float power = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);

                    string posLabel = File.GetAttribute(text[pointer], 0);
                    if(posLabel != "pos")
                    {
                        return null;
                    }
                    Vector3 pos = new Vector3(float.Parse(File.GetAttribute(text[pointer], 1), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer], 2), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer++], 3), CultureInfo.InvariantCulture));

                    string dirLabel = File.GetAttribute(text[pointer], 0);
                    if(dirLabel != "dir")
                    {
                        return null;
                    }
                    Vector3 dir = new Vector3(float.Parse(File.GetAttribute(text[pointer], 1), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer], 2), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer++], 3), CultureInfo.InvariantCulture));

                    string innerAngleLabel = File.GetAttribute(text[pointer], 0);
                    if(innerAngleLabel != "inner_angle")
                    {
                        return null;
                    }
                    float innerAngle = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    string outerAngleLabel = File.GetAttribute(text[pointer], 0);
                    if(outerAngleLabel != "outer_angle")
                    {
                        return null;
                    }
                    float outerAngle = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);

                    SortedList<float, float> goniometric = new SortedList<float, float>();

                    string gonioNumLabel = File.GetAttribute(text[pointer], 0);
                    if(gonioNumLabel != "gonio_count")
                    {
                        return null;
                    }
                    uint gonioNum = uint.Parse(File.GetAttribute(text[pointer++], 1));

                    for(int j = 0; j < gonioNum; ++j)
                    {
                        float gonioIndex = float.Parse(File.GetAttribute(text[pointer], 0), CultureInfo.InvariantCulture);
                        float gonioValue = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);

                        goniometric.Add(gonioIndex, gonioValue);
                    }

                    lights.Add(new Light_(name, type, enabled, colorR, colorG, colorB, power, pos));

                    lights[lights.Count - 1].direction = new Vector3(dir.X, dir.Y, dir.Z);
                    lights[lights.Count - 1].innerAngle = innerAngle;
                    lights[lights.Count - 1].outerAngle = outerAngle;
                    lights[lights.Count - 1].goniometric = goniometric;
                }

                string camsNumLabel = File.GetAttribute(text[pointer], 0);
                if(camsNumLabel != "cams_count")
                {
                    return null;
                }
                uint camsNum = uint.Parse(File.GetAttribute(text[pointer++], 1));

                List<Camera> cams = new List<Camera>();

                string activeCamLabel = File.GetAttribute(text[pointer], 0);
                if(activeCamLabel != "active")
                {
                    return null;
                }
                uint activeCam = uint.Parse(File.GetAttribute(text[pointer++], 1));

                for(int i = 0; i < camsNum; ++i)
                {
                    string nameLabel = File.GetAttribute(text[pointer], 0);
                    if(nameLabel != "cam_name")
                    {
                        return null;
                    }
                    string name = File.CutFirstString(text[pointer]);
                    ++pointer;

                    string resLabel = File.GetAttribute(text[pointer], 0);
                    if(resLabel != "resolution")
                    {
                        return null;
                    }
                    Pair<int, int> res = new Pair<int, int>(int.Parse(File.GetAttribute(text[pointer], 1)), int.Parse(File.GetAttribute(text[pointer++], 2)));

                    string posLabel = File.GetAttribute(text[pointer], 0);
                    if(posLabel != "pos")
                    {
                        return null;
                    }
                    Vector3 pos = new Vector3(float.Parse(File.GetAttribute(text[pointer], 1), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer], 2), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer++], 3), CultureInfo.InvariantCulture));

                    string lookAtLabel = File.GetAttribute(text[pointer], 0);
                    if(lookAtLabel != "lookAt")
                    {
                        return null;
                    }
                    Vector3 lookAt = new Vector3(float.Parse(File.GetAttribute(text[pointer], 1), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer], 2), CultureInfo.InvariantCulture),
                        float.Parse(File.GetAttribute(text[pointer++], 3), CultureInfo.InvariantCulture));

                    string fovAngleLabel = File.GetAttribute(text[pointer], 0);
                    if(fovAngleLabel != "fov")
                    {
                        return null;
                    }
                    float fovAngle = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);
                    string rotateAngleLabel = File.GetAttribute(text[pointer], 0);
                    if(rotateAngleLabel != "rotation")
                    {
                        return null;
                    }
                    float rotateAngle = float.Parse(File.GetAttribute(text[pointer++], 1), CultureInfo.InvariantCulture);

                    cams.Add(new Camera(name, res.First, res.Second, pos, lookAt, fovAngle, rotateAngle));
                }

                HierarchyNode root = new HierarchyNode("Hierarchy");

                ReadHierarchy(root, lights, text, ref pointer);
                if(root == null)
                {
                    return null;
                }

                Hierarchy hierarchy = new Hierarchy();
                hierarchy.objects = root.hObjects;

                scene.points = points;
                scene.triangles = triangles;
                scene.parts = parts;
                scene.materials = materials;
                scene.materialAssign = matAssign;
                scene.lights = lights;
                scene.cams = cams;
                scene.activeCamera = (int)activeCam;
                scene.hierarchy = hierarchy;
            }
            catch(Exception)
            {
                return null;
            }

            return scene;
        }
コード例 #30
0
        public static void SelectElems(Scene scene, ViewportType viewportType, Point pos, Point size, Vector2 orthoSize, Vector3 orthoPos, Vector3 orthoLookAt)
        {
            Vector3 outCamPos = new Vector3(), outSurfPos = new Vector3();

            switch(viewportType)
            {
                case ViewportType.Perspective:
                    CalcPerspCoords(pos, size, scene.cams.ElementAt(scene.activeCamera).fovAngle, scene.cams.ElementAt(scene.activeCamera).rotateAngle,
                scene.cams.ElementAt(scene.activeCamera).position, scene.cams.ElementAt(scene.activeCamera).lookAt, out outCamPos, out outSurfPos);
                    break;

                case ViewportType.Orto:
                    CalcOrthoCoords(pos, size, orthoSize, orthoPos, orthoLookAt, out outCamPos, out outSurfPos);
                    break;
            }

            List<Triang> triangs = new List<Triang>();
            for(int i = 0; i < scene.triangles.Count; ++i)
            {
                Triangle triangle = scene.triangles.ElementAt(i);
                triangs.Add(new Triang(scene.points.ElementAt((int)triangle.p1), scene.points.ElementAt((int)triangle.p2), scene.points.ElementAt((int)triangle.p3)));
            }

            const float lightDiameter = 1;
            const float cameraDiameter = 1;

            Vector3 rayDir = Vector3.Normalize(outSurfPos - outCamPos);

            SlimDX.Ray ray = new SlimDX.Ray(outCamPos + 0.01f * rayDir, rayDir);

            float[] triangleDist = new float[triangs.Count];

            for(int i = 0; i < triangs.Count; ++i)
            {
                float dist;

                if(SlimDX.Ray.Intersects(ray, triangs[i].p1, triangs[i].p2, triangs[i].p3, out dist))
                {
                    triangleDist[i] = dist;
                }
                else
                {
                    triangleDist[i] = -1;
                }
            }

            float minDist = float.PositiveInfinity;
            int minIndex = -1;

            for(int i = 0; i < triangleDist.Length; ++i)
            {
                if(triangleDist[i] >= 0 && triangleDist[i] < minDist)
                {
                    minIndex = i;
                    minDist = triangleDist[i];
                }
            }

            int foundTriangle = minIndex;
            Light_ foundLight = null; // TODO wyliczyć
            Camera foundCamera = null; // TODO wyliczyć

            if(foundTriangle >= 0)
            {
                HierarchyMesh mesh = GetSelectedMesh(scene.hierarchy.objects, foundTriangle);
                if(scene.selTriangles.Contains(mesh) == false)
                {
                    scene.selTriangles.Add(mesh);
                }
            }
            else if(foundLight != null)
            {

            }
            else if(foundCamera != null)
            {

            }
            else
            {
                scene.selTriangles.Clear();
                scene.selLights.Clear();
                scene.selCams.Clear();
            }
        }
コード例 #31
0
        public override Scene.Scene Triangulate(float density)
        {
            List<Vector3D> vertices = new List<Vector3D>();

            vertices.Add(new Vector3D(-1, -1, -1));   //0
            vertices.Add(new Vector3D(1, -1, -1));    //1
            vertices.Add(new Vector3D(1, -1, 1));     //2
            vertices.Add(new Vector3D(-1, -1, 1));    //3
            vertices.Add(new Vector3D(-1, 1, -1));    //4
            vertices.Add(new Vector3D(1, 1, -1));     //5
            vertices.Add(new Vector3D(1, 1, 1));      //6
            vertices.Add(new Vector3D(-1, 1, 1));     //7

            // Lista trójkątów tworzących sześcian
            List<Triangle> triangles = new List<Triangle>();

            // Górna ściana
            triangles.Add(new Triangle(4, 5, 7));
            triangles.Add(new Triangle(6, 7, 5));
            // Tylna ściana
            triangles.Add(new Triangle(0, 1, 4));
            triangles.Add(new Triangle(5, 4, 1));
            // Lewa ściana
            triangles.Add(new Triangle(1, 2, 5));
            triangles.Add(new Triangle(6, 5, 2));
            // Przednia ściana
            triangles.Add(new Triangle(2, 3, 6));
            triangles.Add(new Triangle(7, 6, 3));
            // Prawa ściana
            triangles.Add(new Triangle(3, 0, 7));
            triangles.Add(new Triangle(4, 7, 0));
            // Dolna ściana
            triangles.Add(new Triangle(1, 0, 2));
            triangles.Add(new Triangle(3, 2, 0));

            int step = (int)(maxStep * density);

            Vector3D midAB;
            int vertIdx = 0;
            List<Triangle> newTriangles;
            for (int i = 0; i < step; i++)
            {
                newTriangles = new List<Triangle>();
                foreach (Triangle triangle in triangles)
                {
                    midAB = new Vector3D();
                    midAB.x = (vertices[(int)triangle.p2].x + vertices[(int)triangle.p3].x) / 2.0f;
                    midAB.y = (vertices[(int)triangle.p2].y + vertices[(int)triangle.p3].y) / 2.0f;
                    midAB.z = (vertices[(int)triangle.p2].z + vertices[(int)triangle.p3].z) / 2.0f;

                    vertIdx = vertices.Count;
                    vertices.Add(midAB);

                    newTriangles.Add(new Triangle((uint)vertIdx, triangle.p1, triangle.p2));
                    newTriangles.Add(new Triangle((uint)vertIdx, triangle.p3, triangle.p1));
                }
                triangles = null;
                triangles = newTriangles;
            }

            Modeler.Data.Scene.Scene scene = new Modeler.Data.Scene.Scene();
            scene.points = vertices;
            scene.triangles = triangles;

            return scene;
        }
コード例 #32
0
        /// <summary>
        /// Triangulacja sfery poprzez podzial szescianu
        /// </summary>
        /// <param name="density"></param>
        /// <returns></returns>
        public Modeler.Data.Scene.Scene TriangulateAlt(float density)
        {
            //Tymczasowo na sztywno ustalona liczba kroków
            // gestosc 1 - 10 krokow
            // gestosc 0 - 0 krok
            uint step = (uint) (10f * density);

            List<Vector3D> vertices = new List<Vector3D>();

            vertices.Add(new Vector3D(-1, -1, 1));    //0
            vertices.Add(new Vector3D(1, -1, 1));     //1
            vertices.Add(new Vector3D(1, -1, -1));    //2
            vertices.Add(new Vector3D(-1, -1, -1));   //3
            vertices.Add(new Vector3D(-1, 1, 1));     //4
            vertices.Add(new Vector3D(1, 1, 1));      //5
            vertices.Add(new Vector3D(1, 1, -1));     //6
            vertices.Add(new Vector3D(-1, 1, -1));    //7

            // Lista trójkątów tworzących sześcian
            List<Triangle> triangles = new List<Triangle>();

            // Górna ściana
            triangles.Add(new Triangle(5, 7, 6));
            triangles.Add(new Triangle(7, 5, 4));
            // Przednia ściana
            triangles.Add(new Triangle(5, 0, 1));
            triangles.Add(new Triangle(0, 5, 4));
            // Prawa ściana
            triangles.Add(new Triangle(5, 2, 6));
            triangles.Add(new Triangle(2, 5, 1));
            // Tylna ściana
            triangles.Add(new Triangle(6, 3, 2));
            triangles.Add(new Triangle(3, 6, 7));
            // Lewa ściana
            triangles.Add(new Triangle(4, 3, 7));
            triangles.Add(new Triangle(3, 4, 0));
            // Dolna ściana
            triangles.Add(new Triangle(0, 1, 2));
            triangles.Add(new Triangle(2, 3, 0));

            /*
             * Poczatek wlasciwego algorytmu. Korzystajac z listy trojkatow i
             * wierzcholkow szescianu stworzyc kule.
             */

            for (int i = 0; i < step; i++)
            {
                List<Triangle> newTriangles = new List<Triangle>(triangles.Count() * 2);
                Vector3D midAB;
                int idx = -1;
                int tmp;
                foreach (Triangle triangle in triangles)
                {
                    // Oblicz wspolrzedne nowego wierzcholka
                    midAB = vertices[(int)(triangle.p1)] + vertices[(int)(triangle.p2)];
                    midAB /= 2f;
                    //midAB.Multiply(vertices[(int)triangle.p1].Length()/midAB.Length());
                    midAB *= (vertices[(int)triangle.p1].Length() / midAB.Length());

                    // Dodaj wierzcholek do listy i sprawdz indeks
                    if ((tmp = vertices.IndexOf(midAB)) != -1)
                    {
                        idx = tmp;
                    }
                    else
                    {
                        idx = vertices.Count();
                        vertices.Add(midAB);
                    }

                    // Dodaj nowe trojkaty do listy nowych trojkatow
                    newTriangles.Add(new Triangle(triangle.p3, triangle.p1, (uint)idx));
                    newTriangles.Add(new Triangle(triangle.p2, triangle.p3, (uint)idx));
                }

                triangles = null;
                triangles = newTriangles;
            }

            Modeler.Data.Scene.Scene scene = new Modeler.Data.Scene.Scene();
            scene.points = vertices;
            scene.triangles = triangles;

            //TraingulateAlt(density);

            return scene;
        }
コード例 #33
0
        /// <summary>
        /// Triangulacja sfery poprzez podzial szescianu
        /// </summary>
        /// <param name="density"></param>
        /// <returns></returns>
        public Modeler.Data.Scene.Scene TriangulateAlt(float density)
        {
            //Tymczasowo na sztywno ustalona liczba kroków
            // gestosc 1 - 10 krokow
            // gestosc 0 - 0 krok
            uint step = (uint)(10f * density);

            List <Vector3D> vertices = new List <Vector3D>();

            vertices.Add(new Vector3D(-1, -1, 1));    //0
            vertices.Add(new Vector3D(1, -1, 1));     //1
            vertices.Add(new Vector3D(1, -1, -1));    //2
            vertices.Add(new Vector3D(-1, -1, -1));   //3
            vertices.Add(new Vector3D(-1, 1, 1));     //4
            vertices.Add(new Vector3D(1, 1, 1));      //5
            vertices.Add(new Vector3D(1, 1, -1));     //6
            vertices.Add(new Vector3D(-1, 1, -1));    //7

            // Lista trójkątów tworzących sześcian
            List <Triangle> triangles = new List <Triangle>();

            // Górna ściana
            triangles.Add(new Triangle(5, 7, 6));
            triangles.Add(new Triangle(7, 5, 4));
            // Przednia ściana
            triangles.Add(new Triangle(5, 0, 1));
            triangles.Add(new Triangle(0, 5, 4));
            // Prawa ściana
            triangles.Add(new Triangle(5, 2, 6));
            triangles.Add(new Triangle(2, 5, 1));
            // Tylna ściana
            triangles.Add(new Triangle(6, 3, 2));
            triangles.Add(new Triangle(3, 6, 7));
            // Lewa ściana
            triangles.Add(new Triangle(4, 3, 7));
            triangles.Add(new Triangle(3, 4, 0));
            // Dolna ściana
            triangles.Add(new Triangle(0, 1, 2));
            triangles.Add(new Triangle(2, 3, 0));

            /*
             * Poczatek wlasciwego algorytmu. Korzystajac z listy trojkatow i
             * wierzcholkow szescianu stworzyc kule.
             */

            for (int i = 0; i < step; i++)
            {
                List <Triangle> newTriangles = new List <Triangle>(triangles.Count() * 2);
                Vector3D        midAB;
                int             idx = -1;
                int             tmp;
                foreach (Triangle triangle in triangles)
                {
                    // Oblicz wspolrzedne nowego wierzcholka
                    midAB  = vertices[(int)(triangle.p1)] + vertices[(int)(triangle.p2)];
                    midAB /= 2f;
                    //midAB.Multiply(vertices[(int)triangle.p1].Length()/midAB.Length());
                    midAB *= (vertices[(int)triangle.p1].Length() / midAB.Length());

                    // Dodaj wierzcholek do listy i sprawdz indeks
                    if ((tmp = vertices.IndexOf(midAB)) != -1)
                    {
                        idx = tmp;
                    }
                    else
                    {
                        idx = vertices.Count();
                        vertices.Add(midAB);
                    }

                    // Dodaj nowe trojkaty do listy nowych trojkatow
                    newTriangles.Add(new Triangle(triangle.p3, triangle.p1, (uint)idx));
                    newTriangles.Add(new Triangle(triangle.p2, triangle.p3, (uint)idx));
                }

                triangles = null;
                triangles = newTriangles;
            }

            Modeler.Data.Scene.Scene scene = new Modeler.Data.Scene.Scene();
            scene.points    = vertices;
            scene.triangles = triangles;

            //TraingulateAlt(density);

            return(scene);
        }
コード例 #34
0
        public override Scene.Scene Triangulate(float density)
        {
            List <Vector3D> vertices = new List <Vector3D>();

            vertices.Add(new Vector3D(-1, -1, -1));   //0
            vertices.Add(new Vector3D(1, -1, -1));    //1
            vertices.Add(new Vector3D(1, -1, 1));     //2
            vertices.Add(new Vector3D(-1, -1, 1));    //3
            vertices.Add(new Vector3D(-1, 1, -1));    //4
            vertices.Add(new Vector3D(1, 1, -1));     //5
            vertices.Add(new Vector3D(1, 1, 1));      //6
            vertices.Add(new Vector3D(-1, 1, 1));     //7

            // Lista trójkątów tworzących sześcian
            List <Triangle> triangles = new List <Triangle>();

            // Górna ściana
            triangles.Add(new Triangle(4, 5, 7));
            triangles.Add(new Triangle(6, 7, 5));
            // Tylna ściana
            triangles.Add(new Triangle(0, 1, 4));
            triangles.Add(new Triangle(5, 4, 1));
            // Lewa ściana
            triangles.Add(new Triangle(1, 2, 5));
            triangles.Add(new Triangle(6, 5, 2));
            // Przednia ściana
            triangles.Add(new Triangle(2, 3, 6));
            triangles.Add(new Triangle(7, 6, 3));
            // Prawa ściana
            triangles.Add(new Triangle(3, 0, 7));
            triangles.Add(new Triangle(4, 7, 0));
            // Dolna ściana
            triangles.Add(new Triangle(1, 0, 2));
            triangles.Add(new Triangle(3, 2, 0));

            int step = (int)(maxStep * density);

            Vector3D        midAB;
            int             vertIdx = 0;
            List <Triangle> newTriangles;

            for (int i = 0; i < step; i++)
            {
                newTriangles = new List <Triangle>();
                foreach (Triangle triangle in triangles)
                {
                    midAB   = new Vector3D();
                    midAB.x = (vertices[(int)triangle.p2].x + vertices[(int)triangle.p3].x) / 2.0f;
                    midAB.y = (vertices[(int)triangle.p2].y + vertices[(int)triangle.p3].y) / 2.0f;
                    midAB.z = (vertices[(int)triangle.p2].z + vertices[(int)triangle.p3].z) / 2.0f;

                    vertIdx = vertices.Count;
                    vertices.Add(midAB);

                    newTriangles.Add(new Triangle((uint)vertIdx, triangle.p1, triangle.p2));
                    newTriangles.Add(new Triangle((uint)vertIdx, triangle.p3, triangle.p1));
                }
                triangles = null;
                triangles = newTriangles;
            }

            Modeler.Data.Scene.Scene scene = new Modeler.Data.Scene.Scene();
            scene.points    = vertices;
            scene.triangles = triangles;

            return(scene);
        }
コード例 #35
0
        public BoundingBox(Scene sc, HierarchyMesh obj)
        {
            float minx = float.MaxValue;
            float miny = float.MaxValue;
            float minz = float.MaxValue;
            float maxx = float.MinValue;
            float maxy = float.MinValue;
            float maxz = float.MinValue;
            float tmpx, tmpy, tmpz;

            foreach (uint triangleIdx in obj.triangles)
            {
                tmpx = sc.points[(int)(sc.triangles[(int)triangleIdx].p1)].x;
                if (minx > tmpx)
                    minx = tmpx;
                if (maxx < tmpx)
                    maxx = tmpx;

                tmpy = sc.points[(int)(sc.triangles[(int)triangleIdx].p1)].y;
                if (miny > tmpy)
                    miny = tmpy;
                if (maxy < tmpy)
                    maxy = tmpy;

                tmpz = sc.points[(int)(sc.triangles[(int)triangleIdx].p1)].z;
                if (minz > tmpz)
                    minz = tmpz;
                if (maxz < tmpz)
                    maxz = tmpz;

                tmpx = sc.points[(int)(sc.triangles[(int)triangleIdx].p2)].x;
                if (minx > tmpx)
                    minx = tmpx;
                if (maxx < tmpx)
                    maxx = tmpx;

                tmpy = sc.points[(int)(sc.triangles[(int)triangleIdx].p2)].y;
                if (miny > tmpy)
                    miny = tmpy;
                if (maxy < tmpy)
                    maxy = tmpy;

                tmpz = sc.points[(int)(sc.triangles[(int)triangleIdx].p2)].z;
                if (minz > tmpz)
                    minz = tmpz;
                if (maxz < tmpz)
                    maxz = tmpz;

                tmpx = sc.points[(int)(sc.triangles[(int)triangleIdx].p3)].x;
                if (minx > tmpx)
                    minx = tmpx;
                if (maxx < tmpx)
                    maxx = tmpx;

                tmpy = sc.points[(int)(sc.triangles[(int)triangleIdx].p3)].y;
                if (miny > tmpy)
                    miny = tmpy;
                if (maxy < tmpy)
                    maxy = tmpy;

                tmpz = sc.points[(int)(sc.triangles[(int)triangleIdx].p3)].z;
                if (minz > tmpz)
                    minz = tmpz;
                if (maxz < tmpz)
                    maxz = tmpz;
            }

            minBB = new Vector3D(minx, miny, minz);
            maxBB = new Vector3D(maxx, maxy, maxz);
        }