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 } } }
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); }
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; }
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; }
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); }
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; }
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); }
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; } }
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; }
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; } } }
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 } } }
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; }
//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); }
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(); }
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(); }
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); } }
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(); }
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); }
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; }
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; } }
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); }
//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); } }
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(); } } } }
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(); }
/// <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; }
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; }
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; } }
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; }
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; }
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(); } }
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; }
/// <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; }
/// <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); }
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); }
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); }