Browse Source

Fixed broken transform gizmo funcitonality in X and Y axis locked views in entity editor

Ivan Safrin 11 years ago
parent
commit
df8202c627

+ 4 - 2
IDE/Contents/Include/TransformGizmo.h

@@ -114,8 +114,10 @@ class TransformGizmo : public Entity {
 		static const int TRANSFORM_MOVE_VIEW = 5;
     
         static const int GIZMO_MODE_3D = 0;
-		static const int GIZMO_MODE_2D = 1;
-
+		static const int GIZMO_MODE_2D_X = 1;
+		static const int GIZMO_MODE_2D_Y = 2;
+		static const int GIZMO_MODE_2D_Z = 3;
+    
         static const int ORIENTATION_GLOBAL = 0;
         static const int ORIENTATION_LOCAL = 1;
 

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

@@ -607,7 +607,7 @@ void EntityEditorMainView::setEditorMode(int newMode) {
             mainScene->getDefaultCamera()->setClippingPlanes(-0.1, 1000);
             trackballCamera->setCameraPosition(trackballCamera->getOribitingCenter()+Vector3(trackballCamera->getCameraDistance(), 0.0, 0.0));
             grid->setGridMode(EditorGrid::GRID_MODE_2D_X);
-            transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D);
+            transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D_X);
             trackballCamera->disableRotation(true);
             Update();
         break;
@@ -617,7 +617,7 @@ void EntityEditorMainView::setEditorMode(int newMode) {
             mainScene->getDefaultCamera()->setClippingPlanes(-0.1, 1000);
             trackballCamera->setCameraPosition(trackballCamera->getOribitingCenter()+Vector3(0.001, trackballCamera->getCameraDistance(), 0.00));
             grid->setGridMode(EditorGrid::GRID_MODE_2D_Y);
-            transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D);
+            transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D_Y);
             trackballCamera->disableRotation(true);
             Update();
         break;
@@ -628,7 +628,7 @@ void EntityEditorMainView::setEditorMode(int newMode) {
             mainScene->getDefaultCamera()->setClippingPlanes(-0.1, 1000);
             trackballCamera->setCameraPosition(trackballCamera->getOribitingCenter()+Vector3(0.0, 0.0, trackballCamera->getCameraDistance()));
             grid->setGridMode(EditorGrid::GRID_MODE_2D_Z);
-            transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D);
+            transformGizmo->setGizmoMode(TransformGizmo::GIZMO_MODE_2D_Z);
             trackballCamera->disableRotation(true);
             Update();
         break;

+ 182 - 54
IDE/Contents/Source/TransformGizmo.cpp

@@ -486,12 +486,25 @@ void TransformGizmo::setTransformOrientation(int orientation) {
 }
 
 void TransformGizmo::setTransformPlaneFromView() {
-    if(gizmoMode == GIZMO_MODE_2D) {
-        setTransformPlane(0.0, 0.0, 1.0, true);
-    } else {
-        Vector3 camVec =  targetCamera->getConcatenatedMatrix().getPosition() - getConcatenatedMatrix().getPosition();
-        camVec.Normalize();
-        setTransformPlane(camVec.x, camVec.y, camVec.z, true);
+    
+    switch(gizmoMode) {
+        case GIZMO_MODE_2D_X:
+            setTransformPlane(1.0, 0.0, 0.0, true);
+            transformConstraint = Vector3(1.0, 0.0, 0.0);
+        break;
+        case GIZMO_MODE_2D_Y:
+            setTransformPlane(0.0, 1.0, 0.0, true);
+            transformConstraint = Vector3(0.0, 1.0, 0.0);
+        break;
+        case GIZMO_MODE_2D_Z:
+            setTransformPlane(0.0, 0.0, 1.0, true);
+            transformConstraint = Vector3(0.0, 0.0, -1.0);
+        break;
+        default:
+            Vector3 camVec =  targetCamera->getConcatenatedMatrix().getPosition() - getConcatenatedMatrix().getPosition();
+            camVec.Normalize();
+            setTransformPlane(camVec.x, camVec.y, camVec.z, true);
+        break;
     }
 }
 
@@ -525,6 +538,11 @@ void TransformGizmo::setTransformPlane(Number x, Number y, Number z, bool forceG
 Vector3 TransformGizmo::getTransformPlanePosition() {
 
 	Ray ray = targetScene->projectRayFromCameraAndViewportCoordinate(targetCamera, coreInput->getMousePosition());
+    
+    // hack to fix NaN's in the plane intersect math (sorry)
+    ray.direction += Vector3(0.00001, 0.00001, 0.00001);
+    
+    
     Vector3 ret = ray.planeIntersectPoint(transformPlane, transformPlaneDistance);
     return ret;
 }
@@ -545,64 +563,171 @@ void TransformGizmo::setTransformMode(int newMode) {
 	yawGrip->enabled = false;
     viewportRotateGrip->enabled = false;
 	
+    xTransformGrip->enabled = false;
+    yTransformGrip->enabled = false;
+    zTransformGrip->enabled = false;
+    
 			
 	mode = newMode;
 	switch (mode) {
 		case TRANSFORM_MOVE:
 			trasnformDecorators->visible = true;
 			transformAndScaleLines->visible = true;
-			xTransformGrip->enabled = true;
-			yTransformGrip->enabled = true;
-            if(gizmoMode == GIZMO_MODE_3D) {
-                zTransformGrip->enabled = true;
-                zArrow->visible = true;
-                zLine->visible = true;
-            } else {
-                zArrow->visible = false;
-                zLine->visible = false;
-            }
             
+            switch(gizmoMode) {
+                case GIZMO_MODE_3D:
+                    xTransformGrip->enabled = true;
+                    yTransformGrip->enabled = true;
+                    zTransformGrip->enabled = true;
+                    xArrow->visible = true;
+                    yArrow->visible = true;
+                    zArrow->visible = true;
+                    xLine->visible = true;
+                    yLine->visible = true;
+                    zLine->visible = true;
+                break;
+                case GIZMO_MODE_2D_X:
+                    xTransformGrip->enabled = false;
+                    yTransformGrip->enabled = true;
+                    zTransformGrip->enabled = true;
+                    xArrow->visible = false;
+                    yArrow->visible = true;
+                    zArrow->visible = true;
+                    xLine->visible = false;
+                    yLine->visible = true;
+                    zLine->visible = true;
+                break;
+                case GIZMO_MODE_2D_Y:
+                    xTransformGrip->enabled = true;
+                    yTransformGrip->enabled = false;
+                    zTransformGrip->enabled = true;
+                    xArrow->visible = true;
+                    yArrow->visible = false;
+                    zArrow->visible = true;
+                    xLine->visible = true;
+                    yLine->visible = false;
+                    zLine->visible = true;
+                break;
+                case GIZMO_MODE_2D_Z:
+                    xTransformGrip->enabled = true;
+                    yTransformGrip->enabled = true;
+                    zTransformGrip->enabled = false;
+                    xArrow->visible = true;
+                    yArrow->visible = true;
+                    zArrow->visible = false;
+                    xLine->visible = true;
+                    yLine->visible = true;
+                    zLine->visible = false;
+
+                break;
+            }
 		break;
 		case TRANSFORM_SCALE:
 			scaleDecorators->visible = true;
-			transformAndScaleLines->visible = true;					
-			xTransformGrip->enabled = true;
-			yTransformGrip->enabled = true;
-            if(gizmoMode == GIZMO_MODE_3D) {
-                zTransformGrip->enabled = true;
-                zBox->visible = true;
-                zLine->visible = true;
-            } else {
-                zBox->visible = false;
-                zLine->visible = false;
+			transformAndScaleLines->visible = true;
+            switch(gizmoMode) {
+                case GIZMO_MODE_3D:
+                    xTransformGrip->enabled = true;
+                    yTransformGrip->enabled = true;
+                    zTransformGrip->enabled = true;
+                    xBox->visible = true;
+                    yBox->visible = true;
+                    zBox->visible = true;
+                    xLine->visible = true;
+                    yLine->visible = true;
+                    zLine->visible = true;
+                    break;
+                case GIZMO_MODE_2D_X:
+                    xTransformGrip->enabled = false;
+                    yTransformGrip->enabled = true;
+                    zTransformGrip->enabled = true;
+                    xBox->visible = false;
+                    yBox->visible = true;
+                    zBox->visible = true;
+                    xLine->visible = false;
+                    yLine->visible = true;
+                    zLine->visible = true;
+                    break;
+                case GIZMO_MODE_2D_Y:
+                    xTransformGrip->enabled = true;
+                    yTransformGrip->enabled = false;
+                    zTransformGrip->enabled = true;
+                    xBox->visible = true;
+                    yBox->visible = false;
+                    zBox->visible = true;
+                    xLine->visible = true;
+                    yLine->visible = false;
+                    zLine->visible = true;
+                    break;
+                case GIZMO_MODE_2D_Z:
+                    xTransformGrip->enabled = true;
+                    yTransformGrip->enabled = true;
+                    zTransformGrip->enabled = false;
+                    xBox->visible = true;
+                    yBox->visible = true;
+                    zBox->visible = false;
+                    xLine->visible = true;
+                    yLine->visible = true;
+                    zLine->visible = false;
+                    break;
             }
+            
 
 		break;	
 		case TRANSFORM_ROTATE:
 			rotateDectorators->visible = true;
             
-            if(gizmoMode == GIZMO_MODE_3D) {
-                rollGrip->enabled = true;
-                rollCircle->visible = true;
-                pitchGrip->enabled = true;
-                pitchCircle->visible = true;
-                yawGrip->enabled = true;
-                yawCircle->visible = true;
-                viewportRotateGrip->enabled = false;
-                outerCircle->visible = false;
-                outerCircle->setColor(1.0, 1.0, 1.0, 1.0);
-                
-            } else {
-                rollGrip->enabled = false;
-                rollCircle->visible = false;
-                pitchGrip->enabled = false;
-                pitchCircle->visible = false;
-                yawGrip->enabled = false;
-                yawCircle->visible = false;
-                
-                viewportRotateGrip->enabled = true;
-                outerCircle->visible = true;
-                outerCircle->setColor(0.0, 0.0, 1.0, 1.0);
+            switch(gizmoMode) {
+                case GIZMO_MODE_3D:
+                    rollGrip->enabled = true;
+                    rollCircle->visible = true;
+                    pitchGrip->enabled = true;
+                    pitchCircle->visible = true;
+                    yawGrip->enabled = true;
+                    yawCircle->visible = true;
+                    viewportRotateGrip->enabled = false;
+                    outerCircle->visible = false;
+                    outerCircle->setColor(1.0, 1.0, 1.0, 1.0);
+                break;
+                case GIZMO_MODE_2D_X:
+                    rollGrip->enabled = false;
+                    rollCircle->visible = false;
+                    pitchGrip->enabled = false;
+                    pitchCircle->visible = false;
+                    yawGrip->enabled = false;
+                    yawCircle->visible = false;
+                    viewportRotateGrip->enabled = true;
+                    outerCircle->visible = true;
+                    outerCircle->setColor(1.0, 0.0, 0.0, 1.0);
+                    viewportRotateGrip->setYaw(90);
+                    viewportRotateGrip->setPitch(90);
+                break;
+                case GIZMO_MODE_2D_Y:
+                    rollGrip->enabled = false;
+                    rollCircle->visible = false;
+                    pitchGrip->enabled = false;
+                    pitchCircle->visible = false;
+                    yawGrip->enabled = false;
+                    yawCircle->visible = false;
+                    viewportRotateGrip->enabled = true;
+                    outerCircle->visible = true;
+                    outerCircle->setColor(0.0, 1.0, 0.0, 1.0);
+                    viewportRotateGrip->setPitch(0);
+                    viewportRotateGrip->setYaw(0);
+                break;
+                case GIZMO_MODE_2D_Z:
+                    rollGrip->enabled = false;
+                    rollCircle->visible = false;
+                    pitchGrip->enabled = false;
+                    pitchCircle->visible = false;
+                    yawGrip->enabled = false;
+                    yawCircle->visible = false;
+                    viewportRotateGrip->enabled = true;
+                    outerCircle->visible = true;
+                    outerCircle->setColor(0.0, 0.0, 1.0, 1.0);
+                    viewportRotateGrip->setPitch(90);
+                    viewportRotateGrip->setYaw(0);
+                break;
             }
 		break;
 		default:
@@ -703,7 +828,7 @@ void TransformGizmo::transformSelectedEntities(const Vector3 &move, const Vector
             Vector3 axisVector = transformConstraint;
             
             // always global in the 2d view
-            if(gizmoMode == GIZMO_MODE_2D || mode == TRANSFORM_ROTATE_VIEW) {
+            if(gizmoMode != GIZMO_MODE_3D || mode == TRANSFORM_ROTATE_VIEW) {
                 axisVector = currentRotation.Inverse().applyTo(axisVector);
             }
             axisVector.Normalize();
@@ -828,10 +953,9 @@ void TransformGizmo::handleEvent(Event *event) {
 			}
 		} else 	if(event->getDispatcher() == viewportRotateGrip) {
 			if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN) {
-                if(gizmoMode == GIZMO_MODE_2D) {
+                if(gizmoMode != GIZMO_MODE_3D) {
                     transforming = true;
-                    transformConstraint = Vector3(0.0, 0.0, -1.0);
-                    setTransformPlane(0.0, 0.0, 1.0, true);
+                    setTransformPlaneFromView();
                     startingAngle = getTransformPlaneAngle();
                 }
 			}
@@ -888,7 +1012,7 @@ void TransformGizmo::handleEvent(Event *event) {
 							  transforming = true;
 							  setTransformPlaneFromView();
 							  transformConstraint = transformPlane;
-							  if (gizmoMode == GIZMO_MODE_2D) {
+							  if (gizmoMode == GIZMO_MODE_2D_Z) {
 								  transformConstraint = transformConstraint * -1.0;
 							  }
 							  startingAngle = getTransformPlaneAngle();
@@ -927,6 +1051,10 @@ void TransformGizmo::handleEvent(Event *event) {
                             Vector3 newPoint = getTransformPlanePosition();
                             Vector3 diff = (planeMatrix.Inverse() * newPoint) -(planeMatrix.Inverse() * startingPoint);
                             diff = diff * getCompoundScale();
+                            
+                            printf("newPoint: %f,%f,%f\n", newPoint.x, newPoint.y, newPoint.z);
+                            printf("diff: %f,%f,%f (constraint: %f,%f,%f)\n", diff.x, diff.y, diff.z, transformConstraint.x, transformConstraint.y, transformConstraint.z);
+                            
                             transformSelectedEntities(transformConstraint * diff, Vector3(0.0, 0.0, 0.0), 0.0);
                             startingPoint = newPoint;
                         }
@@ -1051,7 +1179,7 @@ void TransformGizmo::Update() {
     viewportRotateGripBase->setRotationByQuaternion(getRotationQuat().Inverse());
     
 	Number scale;
-    if(gizmoMode == GIZMO_MODE_2D) {
+    if(gizmoMode != GIZMO_MODE_3D) {
         scale = targetCamera->getPosition().length() * 0.1;
     } else {
         scale = getPosition().distance(targetCamera->getPosition()) * 0.1;