Forráskód Böngészése

Added a camera fov frustum visualizer to the 3d editor

Ivan Safrin 12 éve
szülő
commit
3c419a0c53

+ 4 - 1
Core/Contents/Include/PolyMesh.h

@@ -250,6 +250,8 @@ namespace Polycode {
             Vertex *addVertex(Number x, Number y, Number z, Number u, Number v);
         
             Vertex *getVertex(unsigned int index) const;
+
+            Vertex *getActualVertex(unsigned int index) const;
         
 			/**
 			* Sets the vertex buffer for the mesh.
@@ -362,7 +364,8 @@ namespace Polycode {
 			*/
 			bool useVertexColors;
             bool indexedMesh;
-        
+
+            void addIndexedFace(unsigned int i1, unsigned int i2);
             void addIndexedFace(unsigned int i1, unsigned int i2, unsigned int i3);
             void addIndexedFace(unsigned int i1, unsigned int i2, unsigned int i3, unsigned int i4);
             void addIndex(unsigned int index);

+ 16 - 0
Core/Contents/Source/PolyMesh.cpp

@@ -739,6 +739,14 @@ void Mesh::addIndex(unsigned int index) {
     indices.push_back(index % vertices.size());
 }
 
+Vertex *Mesh::getActualVertex(unsigned int index) const {
+    if(index < vertices.size()) {
+        return vertices[index];
+    } else {
+        return NULL;
+    }
+}
+
 void Mesh::addIndexedFace(unsigned int i1, unsigned int i2, unsigned int i3) {
     if(!vertices.size()) {
         return;
@@ -748,6 +756,14 @@ void Mesh::addIndexedFace(unsigned int i1, unsigned int i2, unsigned int i3) {
     indices.push_back(i3 % vertices.size());
 }
 
+void Mesh::addIndexedFace(unsigned int i1, unsigned int i2) {
+    if(!vertices.size()) {
+        return;
+    }
+    indices.push_back(i1 % vertices.size());
+    indices.push_back(i2 % vertices.size());
+}
+
 void Mesh::addIndexedFace(unsigned int i1, unsigned int i2, unsigned int i3, unsigned int i4) {
     if(!vertices.size()) {
         return;

+ 3 - 1
IDE/Contents/Include/PolycodeEntityEditor.h

@@ -42,7 +42,9 @@ class CameraDisplay : public Entity {
         void Update();
     
     private:
-        SceneMesh *fovMesh;
+        SceneMesh *fovSceneMesh;
+        Mesh *fovMesh;
+        Camera *camera;
 };
 
 class EntityEditorMainView : public UIElement {

+ 48 - 0
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -29,7 +29,39 @@ extern Scene *globalScene;
 
 CameraDisplay::CameraDisplay(Camera *camera) : Entity() {
     
+    editorOnly = true;
+    
+    fovSceneMesh = new SceneMesh(Mesh::LINE_MESH);
+    fovSceneMesh->setColor(1.0, 0.0, 1.0, 1.0);
+    fovMesh = fovSceneMesh->getMesh();
+    fovMesh->indexedMesh = true;
+    
+    fovMesh->addVertex(0.0, 0.0, 0.0);
+    
+    fovMesh->addVertex(-1.0, 1.0, 1.0);
+    fovMesh->addVertex(1.0, 1.0, 1.0);
+    fovMesh->addVertex(1.0, -1.0, 1.0);
+    fovMesh->addVertex(-1.0, -1.0, 1.0);
+
+//    fovMesh->addVertex(0.0, 0.0, 0.0);
+//    fovMesh->addVertex(0.0, 0.0, 2.0);
+    
+    fovMesh->addIndexedFace(0, 1);
+    fovMesh->addIndexedFace(0, 2);
+    fovMesh->addIndexedFace(0, 3);
+    fovMesh->addIndexedFace(0, 4);
+    
+    fovMesh->addIndexedFace(1, 2);
+    fovMesh->addIndexedFace(2, 3);
+    fovMesh->addIndexedFace(3, 4);
+    fovMesh->addIndexedFace(4, 1);
+    
+//    fovMesh->addIndexedFace(5, 6);
+    
+    addChild(fovSceneMesh);
+    
     camera->addChild(this);
+    this->camera = camera;
 }
 
 CameraDisplay::~CameraDisplay() {
@@ -37,7 +69,23 @@ CameraDisplay::~CameraDisplay() {
 }
 
 void CameraDisplay::Update() {
+    Number fovRad = (90+camera->getFOV()/2.0) * TORADIANS;
+    
+    Number displayScale = 2.0;
     
+    Number xPos = cos(fovRad) * displayScale;
+    Number yPos = xPos * 0.5625;
+    Number zPos = sin(fovRad) * displayScale;
+    
+    fovMesh->getActualVertex(1)->set(-xPos, yPos, zPos);
+    fovMesh->getActualVertex(2)->set(xPos, yPos, zPos);
+    fovMesh->getActualVertex(3)->set(xPos, -yPos, zPos);
+    fovMesh->getActualVertex(4)->set(-xPos, -yPos, zPos);
+    fovMesh->dirtyArray(RenderDataArray::VERTEX_DATA_ARRAY);
+/*
+    fovMesh->getActualVertex(5)->set(0.0, 0.0, camera->getNearClipppingPlane());
+    fovMesh->getActualVertex(6)->set(0.0, 0.0, camera->getFarClipppingPlane());
+ */
 }
 
 

+ 3 - 3
IDE/Contents/Source/TransformGizmo.cpp

@@ -113,21 +113,21 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	
 	// MOVE
 	
-	yArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.1, 12);
+	yArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.05, 12);
 	yArrow->setColor(0.0, 1.0, 0.0, 1.0);
 	yArrow->setPosition(0.0, 1.0, 0.0);
 	yArrow->depthTest = false;
 	trasnformDecorators->addChild(yArrow);
     yArrow->setMaterialByName("Unlit");
 	
-	xArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.1, 12);
+	xArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.05, 12);
 	xArrow->setColor(1.0, 0.0, 0.0, 1.0);
 	xArrow->setPosition(1.0, 0.0, 0.0);
 	xArrow->Roll(-90);
 	xArrow->depthTest = false;
 	trasnformDecorators->addChild(xArrow);
 
-	zArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.1, 12);
+	zArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.05, 12);
 	zArrow->setColor(0.0, 0.0, 1.0, 1.0);
 	zArrow->setPosition(0.0, 0.0, 1.0);
 	zArrow->Pitch(90);