Просмотр исходного кода

Fixed transforms getting messed up by rotation and scaling in the editor transform gizmo, fixed transforms getting messed up on Undo after rotation and scale in editor, fixed lines disappearing in the transform gizmo, fixed typo in documentation

Ivan Safrin 11 лет назад
Родитель
Сommit
13454ea6a1

+ 1 - 1
Core/Contents/Include/PolyBezierCurve.h

@@ -172,7 +172,7 @@ namespace Polycode {
 		void rebuildBuffers();
 		
 		/**
-		* Removes (and deletes!) a gives point by pointer
+		* Removes (and deletes!) a given point by pointer
 		*/
 		void removePoint(BezierPoint *point);
 

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

@@ -53,9 +53,12 @@ public:
     PolycodeSceneEditorActionDataEntry(Vector3 vec3, Number number);
     PolycodeSceneEditorActionDataEntry(Quaternion quat);
     PolycodeSceneEditorActionDataEntry(Vector3 vec3);
+    PolycodeSceneEditorActionDataEntry(Vector3 vec3, Vector3 vec3Secondary);
+    PolycodeSceneEditorActionDataEntry(Quaternion quat, Vector3 vec3);
     PolycodeSceneEditorActionDataEntry(Number number);
     PolycodeSceneEditorActionDataEntry(Entity *entity);
     Vector3 vec3;
+    Vector3 vec3Secondary;
     Quaternion quat;
     Number number;
     Entity *entity;

+ 17 - 4
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -41,6 +41,17 @@ PolycodeSceneEditorActionDataEntry::PolycodeSceneEditorActionDataEntry(Quaternio
     this->quat = quat;
 }
 
+PolycodeSceneEditorActionDataEntry::PolycodeSceneEditorActionDataEntry(Vector3 vec3, Vector3 vec3Secondary) {
+    this->vec3 = vec3;
+    this->vec3Secondary = vec3Secondary;
+}
+
+PolycodeSceneEditorActionDataEntry::PolycodeSceneEditorActionDataEntry(Quaternion quat, Vector3 vec3) {
+    this->quat = quat;
+    this->vec3 = vec3;
+}
+
+
 PolycodeSceneEditorActionDataEntry::PolycodeSceneEditorActionDataEntry(Number number) {
     this->number = number;
 }
@@ -496,12 +507,14 @@ void EntityEditorMainView::doAction(String actionName, PolycodeEditorActionData
 		for(int i=0; i < selectedEntities.size(); i++) {
             if(i < sceneData->entries.size()) {
                 selectedEntities[i]->setScale(sceneData->entries[i].vec3);
+                selectedEntities[i]->setPosition(sceneData->entries[i].vec3Secondary);
             }
 		}
     } else if(actionName == "rotate") {
 		for(int i=0; i < selectedEntities.size(); i++) {
             if(i < sceneData->entries.size()) {
                 selectedEntities[i]->setRotationByQuaternion(sceneData->entries[i].quat);
+                selectedEntities[i]->setPosition(sceneData->entries[i].vec3);
             }
 		}
     } else if(actionName == "select") {
@@ -976,7 +989,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 {
                     PolycodeSceneEditorActionData *data = new PolycodeSceneEditorActionData();
                     for(int i=0; i < selectedEntities.size(); i++) {
-                        data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getScale()));
+                        data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getScale(), selectedEntities[i]->getPosition()));
                     }
                     editor->didAction("scale", beforeData, data);
                     beforeData = NULL;
@@ -987,7 +1000,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 {
                     PolycodeSceneEditorActionData *data = new PolycodeSceneEditorActionData();
                     for(int i=0; i < selectedEntities.size(); i++) {
-                        data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getRotationQuat()));
+                        data->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getRotationQuat(), selectedEntities[i]->getPosition()));
                     }
                     editor->didAction("rotate", beforeData, data);
                     beforeData = NULL;                    
@@ -1011,7 +1024,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 {
                     beforeData = new PolycodeSceneEditorActionData();
                     for(int i=0; i < selectedEntities.size(); i++) {
-                        beforeData->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getScale()));
+                        beforeData->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getScale(), selectedEntities[i]->getPosition()));
                     }
                 }
                 break;
@@ -1020,7 +1033,7 @@ void EntityEditorMainView::handleEvent(Event *event) {
                 {
                     beforeData = new PolycodeSceneEditorActionData();
                     for(int i=0; i < selectedEntities.size(); i++) {
-                        beforeData->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getRotationQuat()));
+                        beforeData->entries.push_back(PolycodeSceneEditorActionDataEntry(selectedEntities[i]->getRotationQuat(), selectedEntities[i]->getPosition()));
                     }
                 }
                 break;

+ 16 - 1
IDE/Contents/Source/TransformGizmo.cpp

@@ -121,7 +121,7 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	addChild(scaleDecorators);
 		
 	transformAndScaleLines = new Entity();
-	addChild(transformAndScaleLines);
+	addChild(transformAndScaleLines);    
 		
 	rotateDectorators = new Entity();
 	addChild(rotateDectorators);
@@ -132,6 +132,7 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	yLine->getMesh()->dirtyArrays();
 	yLine->depthTest = false;
 	yLine->setColor(0.0, 1.0, 0.0, 1.0);
+    yLine->setLocalBoundingBox(yLine->getMesh()->calculateBBox());
     yLine->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX() * 2.0);
 	transformAndScaleLines->addChild(yLine);
 
@@ -141,6 +142,7 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	xLine->getMesh()->dirtyArrays();
 	xLine->depthTest = false;
 	xLine->setColor(1.0, 0.0, 0.0, 1.0);
+    xLine->setLocalBoundingBox(xLine->getMesh()->calculateBBox());
     xLine->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX() * 2.0);
 	transformAndScaleLines->addChild(xLine);
 
@@ -150,6 +152,7 @@ TransformGizmo::TransformGizmo(Scene *targetScene, Camera *targetCamera) : Entit
 	zLine->getMesh()->dirtyArrays();
 	zLine->depthTest = false;
 	zLine->setColor(0.0, 0.0, 1.0, 1.0);
+    zLine->setLocalBoundingBox(zLine->getMesh()->calculateBBox());
     zLine->setLineWidth(CoreServices::getInstance()->getRenderer()->getBackingResolutionScaleX() * 2.0);
 	transformAndScaleLines->addChild(zLine);
 	
@@ -533,6 +536,9 @@ void TransformGizmo::transformSelectedEntities(const Vector3 &move, const Vector
                 
                 selectedEntities[i]->setPosition(globalPosition - selectedEntities[i]->getParentEntity()->getConcatenatedMatrix().getPosition());
                 selectedEntities[i]->setRotationByQuaternion(currentRotation * q);
+                if(move.length() == 0.0) {
+                    entityPositions[i] = selectedEntities[i]->getPosition();
+                }
                 
                 selectedEntities[i]->setScale(selectedEntities[i]->getScale() * (Vector3(1.0, 1.0, 1.0)+newScale));
                 
@@ -543,6 +549,9 @@ void TransformGizmo::transformSelectedEntities(const Vector3 &move, const Vector
                     scalePosition.z = globalPosition.z + ((globalPosition.z - globalCenter.z) * newScale.z);
                     scalePosition = selectedEntities[i]->getParentEntity()->getConcatenatedMatrix().Inverse().transpose() * scalePosition;
                     selectedEntities[i]->setPosition(scalePosition);
+                    if(move.length() == 0.0) {
+                        entityPositions[i] = selectedEntities[i]->getPosition();
+                    }
                 }
                 
             } else {
@@ -575,6 +584,9 @@ void TransformGizmo::transformSelectedEntities(const Vector3 &move, const Vector
                 
                 selectedEntities[i]->setPosition(globalPosition - selectedEntities[i]->getParentEntity()->getConcatenatedMatrix().getPosition());
                 selectedEntities[i]->setRotationByQuaternion(currentRotation * q);
+                if(move.length() == 0.0) {
+                    entityPositions[i] = selectedEntities[i]->getPosition();
+                }
                 
                 selectedEntities[i]->setScale(selectedEntities[i]->getScale() * (Vector3(1.0, 1.0, 1.0)+scale));
                 
@@ -585,6 +597,9 @@ void TransformGizmo::transformSelectedEntities(const Vector3 &move, const Vector
                     scalePosition.z = globalPosition.z + ((globalPosition.z - globalCenter.z) * scale.z);
                     scalePosition = selectedEntities[i]->getParentEntity()->getConcatenatedMatrix().Inverse().transpose() * scalePosition;
                     selectedEntities[i]->setPosition(scalePosition);
+                    if(move.length() == 0.0) {
+                        entityPositions[i] = selectedEntities[i]->getPosition();
+                    }
                 }
                 
             } else {