diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index 00ee9aacd..26a23df2b 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -1727,13 +1727,17 @@ void GuiInspectorTypeSFXSourceName::consoleInit() void GuiInspectorType2DValue::constructEditControlChildren(GuiControl* retCtrl, S32 width) { mCtrlX = new GuiTextEditSliderCtrl(); - GuiControl* mLabelX = new GuiControl(); + _registerEditControl(mCtrlX, "x"); + mLabelX = new GuiControl(); + _registerEditControl(mLabelX, "lx"); mCtrlY = new GuiTextEditSliderCtrl(); - GuiControl* mLabelY = new GuiControl(); + _registerEditControl(mCtrlY, "y"); + mLabelY = new GuiControl(); + _registerEditControl(mLabelY, "ly"); mScriptValue = new GuiTextCtrl(); - + _registerEditControl(mScriptValue, "val"); mCopyButton = new GuiBitmapButtonCtrl(); mCopyButton->setExtent(Point2I(15, 15)); @@ -1742,22 +1746,19 @@ void GuiInspectorType2DValue::constructEditControlChildren(GuiControl* retCtrl, mCopyButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); mCopyButton->setDataField(StringTable->insert("hovertime"), NULL, "1000"); mCopyButton->setDataField(StringTable->insert("tooltip"), NULL, "Copy all values for script."); - mCopyButton->registerObject(); - - _registerEditControl(mCtrlX); - _registerEditControl(mCtrlY); + _registerEditControl(mCopyButton, "cpy"); mCtrlX->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); mCtrlX->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); mCtrlX->setDataField(StringTable->insert("format"), NULL, "%.4f"); mCtrlX->setDataField(StringTable->insert("range"), NULL, "-1e+03 1e+03"); - mCtrlX->setDataField(StringTable->insert("increment"), NULL, "0.0001"); + mCtrlX->setDataField(StringTable->insert("increment"), NULL, "0.1"); mCtrlY->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); mCtrlY->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); mCtrlY->setDataField(StringTable->insert("format"), NULL, "%.4f"); mCtrlY->setDataField(StringTable->insert("range"), NULL, "-1e+03 1e+03"); - mCtrlY->setDataField(StringTable->insert("increment"), NULL, "0.0001"); + mCtrlY->setDataField(StringTable->insert("increment"), NULL, "0.1"); mLabelX->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiXDimensionText"); mLabelY->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiYDimensionText"); @@ -1784,19 +1785,19 @@ void GuiInspectorType2DValue::constructEditControlChildren(GuiControl* retCtrl, mCtrlX->setField("Validate", szBuffer); mCtrlY->setField("Validate", szBuffer); - GuiControl* mContainerX = new GuiControl(); + mContainerX = new GuiControl(); mContainerX->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); mContainerX->setExtent(Point2I(width, 18)); mContainerX->addObject(mLabelX); mContainerX->addObject(mCtrlX); - _registerEditControl(mContainerX); + _registerEditControl(mContainerX, "cx"); - GuiControl* mContainerY = new GuiControl(); + mContainerY = new GuiControl(); mContainerY->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); mContainerY->setExtent(Point2I(width, 18)); mContainerY->addObject(mLabelY); mContainerY->addObject(mCtrlY); - _registerEditControl(mContainerY); + _registerEditControl(mContainerY, "cy"); retCtrl->addObject(mContainerX); retCtrl->addObject(mContainerY); @@ -1884,15 +1885,15 @@ void GuiInspectorType3DValue::constructEditControlChildren(GuiControl* retCtrl, Parent::constructEditControlChildren(retCtrl, width); mCtrlZ = new GuiTextEditSliderCtrl(); - GuiControl* mLabelZ = new GuiControl(); - - _registerEditControl(mCtrlZ); + _registerEditControl(mCtrlZ, "z"); + mLabelZ = new GuiControl(); + _registerEditControl(mLabelZ, "lz"); mCtrlZ->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); mCtrlZ->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); mCtrlZ->setDataField(StringTable->insert("format"), NULL, "%.4f"); mCtrlZ->setDataField(StringTable->insert("range"), NULL, "-1e+03 1e+03"); - mCtrlZ->setDataField(StringTable->insert("increment"), NULL, "0.0001"); + mCtrlZ->setDataField(StringTable->insert("increment"), NULL, "0.1"); mLabelZ->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiZDimensionText"); @@ -1916,12 +1917,12 @@ void GuiInspectorType3DValue::constructEditControlChildren(GuiControl* retCtrl, mCtrlY->setField("Validate", szBuffer); mCtrlZ->setField("Validate", szBuffer); - GuiControl* mContainerZ = new GuiControl(); + mContainerZ = new GuiControl(); mContainerZ->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); mContainerZ->setExtent(Point2I(width, 18)); mContainerZ->addObject(mLabelZ); mContainerZ->addObject(mCtrlZ); - _registerEditControl(mContainerZ); + _registerEditControl(mContainerZ, "cz"); retCtrl->addObject(mContainerZ); //retCtrl->addObject(mScriptValue); @@ -2185,24 +2186,28 @@ GuiControl* GuiInspectorTypeMatrixRotation::constructEditControl() mCaptionLabel->registerObject(); mCaptionLabel->setControlProfile(mProfile); mCaptionLabel->setText(mCaption); + _registerEditControl(mCaptionLabel, "cl"); addObject(mCaptionLabel); mDimensionLabelX = new GuiTextCtrl(); mDimensionLabelX->registerObject(); mDimensionLabelX->setControlProfile(mProfile); - mDimensionLabelX->setText("Ptich"); + mDimensionLabelX->setText("Pitch"); + _registerEditControl(mDimensionLabelX, "pl"); addObject(mDimensionLabelX); mDimensionLabelY = new GuiTextCtrl(); mDimensionLabelY->registerObject(); mDimensionLabelY->setControlProfile(mProfile); mDimensionLabelY->setText("Roll"); + _registerEditControl(mDimensionLabelY, "rl"); addObject(mDimensionLabelY); mDimensionLabelZ = new GuiTextCtrl(); mDimensionLabelZ->registerObject(); mDimensionLabelZ->setControlProfile(mProfile); mDimensionLabelZ->setText("Yaw"); + _registerEditControl(mDimensionLabelZ, "yl"); addObject(mDimensionLabelZ); retCtrl->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiDefaultProfile"); @@ -2215,18 +2220,7 @@ GuiControl* GuiInspectorTypeMatrixRotation::constructEditControl() constructEditControlChildren(retCtrl, getWidth()); - retCtrl->addObject(mScriptValue); - - char szBuffer[512]; - dSprintf(szBuffer, 512, "%d.apply(%d.getText());", getId(), mScriptValue->getId()); - - mCtrlX->setField("AltCommand", szBuffer); - mCtrlY->setField("AltCommand", szBuffer); - mCtrlZ->setField("AltCommand", szBuffer); - - mCtrlX->setField("Validate", szBuffer); - mCtrlY->setField("Validate", szBuffer); - mCtrlZ->setField("Validate", szBuffer); + //retCtrl->addObject(mScriptValue); mUseHeightOverride = true; mHeightOverride = retCtrl->getHeight(); @@ -2234,37 +2228,68 @@ GuiControl* GuiInspectorTypeMatrixRotation::constructEditControl() return retCtrl; } +void GuiInspectorTypeMatrixRotation::constructEditControlChildren(GuiControl* retCtrl, S32 width) +{ + Parent::constructEditControlChildren(retCtrl, width); + + if (!mScriptValue) + { + mScriptValue = new GuiTextEditCtrl(); + // Don't forget to register ourselves + _registerEditControl(mScriptValue, "value"); + } + U32 svID = mScriptValue->getId(); + retCtrl->addObject(mScriptValue); + + String angleInput = String::ToString("%d.applyRotation(mEulDegToAng(%d.getText() SPC %d.getText() SPC %d.getText()));", getId(), mCtrlX->getId(), mCtrlY->getId(), mCtrlZ->getId()); + mScriptValue->setField("AltCommand", angleInput.c_str()); + mScriptValue->setField("Validate", angleInput.c_str()); + + mCtrlX->setField("AltCommand", angleInput.c_str()); + mCtrlX->setField("Validate", angleInput.c_str()); + mCtrlX->setDataField(StringTable->insert("format"), NULL, "%g"); + + mCtrlY->setField("AltCommand", angleInput.c_str()); + mCtrlY->setField("Validate", angleInput.c_str()); + mCtrlY->setDataField(StringTable->insert("format"), NULL, "%g"); + + mCtrlZ->setField("AltCommand", angleInput.c_str()); + mCtrlZ->setField("Validate", angleInput.c_str()); + mCtrlZ->setDataField(StringTable->insert("format"), NULL, "%g"); +} + void GuiInspectorTypeMatrixRotation::updateValue() { if (mField) { - Parent::updateValue(); + Update::updateValue(); const char* data = getData(); - if (!data) - data = ""; + + angAx.set(Point3F(dAtof(StringUnit::getUnit(data, 0, " \t\n")), + dAtof(StringUnit::getUnit(data, 1, " \t\n")), + dAtof(StringUnit::getUnit(data, 2, " \t\n"))), + dAtof(StringUnit::getUnit(data, 3, " \t\n"))); + + EulerF euler = mAngToEul(angAx); + U32 elementCount = StringUnit::getUnitCount(data, " "); if (elementCount > 0) { - F32 yaw = dAtof(StringUnit::getUnit(data, 0, " \t\n")) * dAtof(StringUnit::getUnit(data, 3, " \t\n")); char szBuffer[64]; - dSprintf(szBuffer, 64, "%.2f", yaw); + dSprintf(szBuffer, 64, "%g", euler.x); mCtrlX->setText(szBuffer); } - if (elementCount > 1) { - F32 pitch = dAtof(StringUnit::getUnit(data, 1, " \t\n")) * dAtof(StringUnit::getUnit(data, 3, " \t\n")); char szBuffer[64]; - dSprintf(szBuffer, 64, "%.2f", pitch); + dSprintf(szBuffer, 64, "%g", euler.y); mCtrlY->setText(szBuffer); } - if (elementCount > 2) { - F32 roll = dAtof(StringUnit::getUnit(data, 2, " \t\n")) * dAtof(StringUnit::getUnit(data, 3, " \t\n")); char szBuffer[64]; - dSprintf(szBuffer, 64, "%.2f", roll); + dSprintf(szBuffer, 64, "%g", euler.z); mCtrlZ->setText(szBuffer); } @@ -2284,6 +2309,7 @@ bool GuiInspectorTypeMatrixRotation::resize(const Point2I& newPosition, const Po { return updateRects(); } + return false; } bool GuiInspectorTypeMatrixRotation::updateRects() @@ -2310,3 +2336,27 @@ bool GuiInspectorTypeMatrixRotation::updateRects() return true; } + +void GuiInspectorTypeMatrixRotation::updateAng(AngAxisF newAngAx) +{ + angAx = newAngAx; +} + +void GuiInspectorTypeMatrixRotation::updateData() +{ + StringTableEntry data = getValue(); + setData(data); +} + +StringTableEntry GuiInspectorTypeMatrixRotation::getValue() +{ + String angBuffer = String::ToString("%g %g %g %g", angAx.axis.x, angAx.axis.y, angAx.axis.z, angAx.angle); + return StringTable->insert(angBuffer.c_str()); +} + +DefineEngineMethod(GuiInspectorTypeMatrixRotation, applyRotation, void, (AngAxisF angAx), , "") +{ + object->updateAng(angAx); + object->updateData(); +} + diff --git a/Engine/source/gui/editor/guiInspectorTypes.h b/Engine/source/gui/editor/guiInspectorTypes.h index 27516882a..62ccfd066 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.h +++ b/Engine/source/gui/editor/guiInspectorTypes.h @@ -590,7 +590,11 @@ private: typedef GuiInspectorField Parent; protected: GuiTextEditSliderCtrl* mCtrlX; + GuiControl* mLabelX; + GuiControl* mContainerX; GuiTextEditSliderCtrl* mCtrlY; + GuiControl* mLabelY; + GuiControl* mContainerY; GuiTextCtrl* mScriptValue; public: @@ -615,6 +619,8 @@ private: typedef GuiInspectorType2DValue Parent; protected: GuiTextEditSliderCtrl* mCtrlZ; + GuiControl* mLabelZ; + GuiControl* mContainerZ; public: GuiTextCtrl* mDimensionLabelZ; @@ -652,7 +658,7 @@ public: class GuiInspectorTypePoint3F : public GuiInspectorType3DValue { private: - typedef GuiInspectorField Parent; + typedef GuiInspectorType3DValue Parent; public: DECLARE_CONOBJECT(GuiInspectorTypePoint3F); static void consoleInit(); @@ -666,14 +672,22 @@ public: class GuiInspectorTypeMatrixRotation : public GuiInspectorType3DValue { private: - typedef GuiInspectorField Parent; + typedef GuiInspectorType3DValue Parent; + typedef GuiInspectorField Update; public: + AngAxisF angAx; + EulerF eulAng; DECLARE_CONOBJECT(GuiInspectorTypeMatrixRotation); static void consoleInit(); virtual GuiControl* constructEditControl(); + virtual void constructEditControlChildren(GuiControl* retCtrl, S32 width); virtual void updateValue(); virtual bool resize(const Point2I& newPosition, const Point2I& newExtent); virtual bool updateRects(); -}; + void updateAng(AngAxisF newAngAx); + + virtual void updateData(); + virtual StringTableEntry getValue(); +}; #endif // _GUI_INSPECTOR_TYPES_H_ diff --git a/Engine/source/gui/editor/inspector/field.cpp b/Engine/source/gui/editor/inspector/field.cpp index b5b0f7d65..b5f0827fd 100644 --- a/Engine/source/gui/editor/inspector/field.cpp +++ b/Engine/source/gui/editor/inspector/field.cpp @@ -673,13 +673,16 @@ void GuiInspectorField::_executeSelectedCallback() //----------------------------------------------------------------------------- -void GuiInspectorField::_registerEditControl( GuiControl *ctrl ) +void GuiInspectorField::_registerEditControl(GuiControl* ctrl, StringTableEntry suffix) { + if (ctrl->isProperlyAdded()) return; + ctrl->setInternalName(suffix); + char szName[512]; - if(mInspector->getInspectObject() != nullptr) - dSprintf( szName, 512, "IE_%s_%d_%s_Field", ctrl->getClassName(), mInspector->getInspectObject()->getId(), mCaption); + if (mInspector->getInspectObject() != nullptr) + dSprintf(szName, 512, "IE_%s_%d_%s_%s_Field", ctrl->getClassName(), mInspector->getInspectObject()->getId(), suffix, mCaption); else - dSprintf(szName, 512, "IE_%s_%s_Field", ctrl->getClassName(), mCaption); + dSprintf(szName, 512, "IE_%s_%s_%s_Field", ctrl->getClassName(), suffix, mCaption); // Register the object ctrl->registerObject( szName ); diff --git a/Engine/source/gui/editor/inspector/field.h b/Engine/source/gui/editor/inspector/field.h index 7ee5e1d80..67412cd44 100644 --- a/Engine/source/gui/editor/inspector/field.h +++ b/Engine/source/gui/editor/inspector/field.h @@ -100,7 +100,7 @@ class GuiInspectorField : public GuiControl //Special edit field, variable type StringTableEntry mVariableType; - virtual void _registerEditControl( GuiControl *ctrl ); + virtual void _registerEditControl(GuiControl* ctrl, StringTableEntry suffix = ""); virtual void _executeSelectedCallback(); void _setFieldDocs( StringTableEntry docs ); diff --git a/Engine/source/gui/worldEditor/editor.cpp b/Engine/source/gui/worldEditor/editor.cpp index c60127540..11558f926 100644 --- a/Engine/source/gui/worldEditor/editor.cpp +++ b/Engine/source/gui/worldEditor/editor.cpp @@ -110,7 +110,7 @@ void EditManager::editorDisabled() for(SimGroupIterator itr(Sim::getRootGroup()); *itr; ++itr) { SimObject *so = *itr; - AssertFatal(so->isProperlyAdded() && !so->isRemoved(), "bad"); + AssertFatal(so->isProperlyAdded() && !so->isRemoved(), avar("%s added but not removed!", so->getName())); so->onEditorDisable(); } @@ -161,4 +161,4 @@ DefineEngineMethod( EditManager, editorDisabled, void, (), , "Perform the onEdit DefineEngineMethod( EditManager, isEditorEnabled, bool, (), , "Return the value of gEditingMission." ) { return gEditingMission; -} \ No newline at end of file +} diff --git a/Engine/source/math/mConsoleFunctions.cpp b/Engine/source/math/mConsoleFunctions.cpp index 0abe94dbe..ef0e14445 100644 --- a/Engine/source/math/mConsoleFunctions.cpp +++ b/Engine/source/math/mConsoleFunctions.cpp @@ -464,3 +464,13 @@ DefineEngineFunction(mDecToBin, const char*, (S32 n), , "convert decimal to a bi } return ret.c_str(); } + +DefineEngineFunction(mEulDegToAng, AngAxisF, (EulerF euler), , "convert euler to degrees") +{ + return mEulDegToAng(euler); +} + +DefineEngineFunction(mAngToEul, EulerF, (AngAxisF angAx), , "convert degrees to euler") +{ + return mAngToEul(angAx); +} diff --git a/Engine/source/math/mMath.h b/Engine/source/math/mMath.h index 4710f6bf0..eb816bffe 100644 --- a/Engine/source/math/mMath.h +++ b/Engine/source/math/mMath.h @@ -52,4 +52,20 @@ #include "math/mRotation.h" #endif +inline AngAxisF mEulDegToAng(EulerF euler) +{ + MatrixF tempMat = MatrixF(euler * M_PI_F / 180.0f, Point3F::Zero); + AngAxisF angAx = AngAxisF(tempMat); + return angAx; +} + +inline EulerF mAngToEul(AngAxisF angAx) +{ + MatrixF tempMat; + angAx.setMatrix(&tempMat); + EulerF euler = tempMat.toEuler(); + euler *= 180.0f / M_PI_F; + return euler; +} + #endif //_MMATH_H_