From e6dbe0a8609f1806bef58ca025065dad42bf64f1 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 10 Jun 2023 16:50:59 +0100 Subject: [PATCH 1/9] Add multi dimensional entries to inspector -Added 3 new classes GuiInspectorType2DValue - 2 dimensional value GuiInspectorType3DValue - 3 dimensional value GuiInspectorType4DValue - 4 dimensional value Added GuiInspectorTypePoint3F for 3 dimensional positions. Added GuiInspectorTypeMatrixRotation for object rotation. Translates rotation to degrees atm. Input from this is not accounted for just yet. --- .../source/gui/editor/guiInspectorTypes.cpp | 555 ++++++++++++++++++ Engine/source/gui/editor/guiInspectorTypes.h | 96 ++- Engine/source/gui/editor/inspector/field.cpp | 6 +- 3 files changed, 653 insertions(+), 4 deletions(-) diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index 5f682a1a8..c1f355b96 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -1719,3 +1719,558 @@ void GuiInspectorTypeSFXSourceName::consoleInit() ConsoleBaseType::getType( TypeSFXSourceName )->setInspectorFieldType( "GuiInspectorTypeSFXSourceName" ); } + +//----------------------------------------------------------------------------- +// Two Dimensional Field base GuiInspectorField Class +//----------------------------------------------------------------------------- + +void GuiInspectorType2DValue::constructEditControlChildren(GuiControl* retCtrl, S32 width) +{ + mCtrlX = new GuiTextEditCtrl(); + GuiControl* mLabelX = new GuiControl(); + + mCtrlY = new GuiTextEditCtrl(); + GuiControl* mLabelY = new GuiControl(); + + mScriptValue = new GuiTextCtrl(); + + _registerEditControl(mCtrlX); + _registerEditControl(mCtrlY); + + mCtrlX->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mCtrlX->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + + mCtrlY->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mCtrlY->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + + mLabelX->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiXDimensionText"); + mLabelY->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiYDimensionText"); + + mScriptValue->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiTextProfile"); + + S32 labelWidth = 3; + mLabelX->setExtent(Point2I(labelWidth, 18)); + mLabelY->setExtent(Point2I(labelWidth, 18)); + + mCtrlX->setExtent(Point2I(width - labelWidth, 18)); + mCtrlY->setExtent(Point2I(width - labelWidth, 18)); + mScriptValue->setExtent(Point2I(width, 18)); + + mCtrlX->setPosition(Point2I(labelWidth, 0)); + mCtrlY->setPosition(Point2I(labelWidth, 0)); + + char szBuffer[512]; + dSprintf(szBuffer, 512, "%d.apply(%d.getText() SPC %d.getText());", getId(), mCtrlX->getId(), mCtrlY->getId()); + + mCtrlX->setField("AltCommand", szBuffer); + mCtrlY->setField("AltCommand", szBuffer); + + mCtrlX->setField("Validate", szBuffer); + mCtrlY->setField("Validate", szBuffer); + + GuiControl* mContainerX = new GuiControl(); + mContainerX->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mContainerX->setExtent(Point2I(width, 18)); + mContainerX->addObject(mLabelX); + mContainerX->addObject(mCtrlX); + _registerEditControl(mContainerX); + + GuiControl* mContainerY = new GuiControl(); + mContainerY->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mContainerY->setExtent(Point2I(width, 18)); + mContainerY->addObject(mLabelY); + mContainerY->addObject(mCtrlY); + _registerEditControl(mContainerY); + + retCtrl->addObject(mContainerX); + retCtrl->addObject(mContainerY); + //retCtrl->addObject(mScriptValue); +} + +void GuiInspectorType2DValue::updateValue() +{ + if (mField) + { + Parent::updateValue(); + const char* data = getData(); + if (!data) + data = ""; + U32 elementCount = StringUnit::getUnitCount(data, " "); + + if (elementCount > 0) + { + mCtrlX->setText(StringUnit::getUnit(data, 0, " \t\n")); + } + + if (elementCount > 1) + { + mCtrlY->setText(StringUnit::getUnit(data, 1, " \t\n")); + } + + mScriptValue->setText(data); + + mEdit->setDataField(StringTable->insert("tooltip"), NULL, data); + } +} + +bool GuiInspectorType2DValue::resize(const Point2I& newPosition, const Point2I& newExtent) +{ + if (!Parent::resize(newPosition, newExtent)) + return false; + + if (mEdit != NULL) + { + return updateRects(); + } + + return false; +} + +bool GuiInspectorType2DValue::updateRects() +{ + S32 rowSize = 18; + S32 dividerPos, dividerMargin; + mInspector->getDivider(dividerPos, dividerMargin); + Point2I fieldExtent = getExtent(); + Point2I fieldPos = getPosition(); + + mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin - 29, fieldExtent.y); + S32 cellWidth = mCeil((dividerPos - dividerMargin - 29)); + + mCtrlX->setExtent(Point2I(cellWidth - 3, 18)); + mCtrlY->setExtent(Point2I(cellWidth - 3, 18)); + + S32 dimX = 10; + + mCaptionLabel->resize(Point2I(mProfile->mTextOffset.x, 0), Point2I(fieldExtent.x, rowSize)); + mDimensionLabelX->resize(Point2I(fieldExtent.x - dividerPos - dimX, 0), Point2I(dimX, rowSize)); + mDimensionLabelY->resize(Point2I(fieldExtent.x - dividerPos - dimX, rowSize + 3), Point2I(dimX, rowSize)); + + mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent); + + return true; +} + +//----------------------------------------------------------------------------- +// Three Dimensional Field base GuiInspectorField Class +//----------------------------------------------------------------------------- + +void GuiInspectorType3DValue::constructEditControlChildren(GuiControl* retCtrl, S32 width) +{ + Parent::constructEditControlChildren(retCtrl, width); + + mCtrlZ = new GuiTextEditCtrl(); + GuiControl* mLabelZ = new GuiControl(); + + _registerEditControl(mCtrlZ); + + mCtrlZ->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mCtrlZ->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + + mLabelZ->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiZDimensionText"); + + mScriptValue->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiTextProfile"); + + S32 labelWidth = 3; + mLabelZ->setExtent(Point2I(labelWidth, 18)); + + mCtrlZ->setExtent(Point2I(width - labelWidth, 18)); + + mCtrlZ->setPosition(Point2I(labelWidth, 0)); + + char szBuffer[512]; + dSprintf(szBuffer, 512, "%d.apply(%d.getText() SPC %d.getText() SPC %d.getText());", getId(), mCtrlX->getId(), mCtrlY->getId(), mCtrlZ->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); + + GuiControl* mContainerZ = new GuiControl(); + mContainerZ->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mContainerZ->setExtent(Point2I(width, 18)); + mContainerZ->addObject(mLabelZ); + mContainerZ->addObject(mCtrlZ); + _registerEditControl(mContainerZ); + + retCtrl->addObject(mContainerZ); + //retCtrl->addObject(mScriptValue); +} + +void GuiInspectorType3DValue::updateValue() +{ + if (mField) + { + Parent::updateValue(); + const char* data = getData(); + if (!data) + data = ""; + + U32 elementCount = StringUnit::getUnitCount(data, " "); + + if (elementCount > 2) + { + mCtrlZ->setText(StringUnit::getUnit(data, 2, " \t\n")); + } + } +} + +bool GuiInspectorType3DValue::resize(const Point2I& newPosition, const Point2I& newExtent) +{ + if (!Parent::resize(newPosition, newExtent)) + return false; + + if (mEdit != NULL) + { + return updateRects(); + } + + return false; +} + +bool GuiInspectorType3DValue::updateRects() +{ + if (!Parent::updateRects()) + return false; + + S32 rowSize = 18; + S32 dividerPos, dividerMargin; + mInspector->getDivider(dividerPos, dividerMargin); + Point2I fieldExtent = getExtent(); + Point2I fieldPos = getPosition(); + + S32 cellWidth = mCeil((dividerPos - dividerMargin - 29)); + + mCtrlZ->setExtent(Point2I(cellWidth - 3, 18)); + + S32 dimX = 10; + + mDimensionLabelZ->resize(Point2I(fieldExtent.x - dividerPos - dimX, rowSize + rowSize + 6), Point2I(dimX, rowSize)); + + return true; +} + +//----------------------------------------------------------------------------- +// Four Dimensional Field base GuiInspectorField Class +//----------------------------------------------------------------------------- + +void GuiInspectorType4DValue::constructEditControlChildren(GuiControl* retCtrl, S32 width) +{ + Parent::constructEditControlChildren(retCtrl, width); + + mCtrlW = new GuiTextEditCtrl(); + GuiControl* mLabelW = new GuiControl(); + + _registerEditControl(mCtrlW); + + mCtrlW->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mCtrlW->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + + mLabelW->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiZDimensionText"); + + S32 labelWidth = 3; + mLabelW->setExtent(Point2I(labelWidth, 18)); + + mCtrlW->setExtent(Point2I(width - labelWidth, 18)); + + mScriptValue->setExtent(Point2I(width, 18)); + + mCtrlW->setPosition(Point2I(labelWidth, 0)); + + char szBuffer[512]; + dSprintf(szBuffer, 512, "%d.apply(%d.getText() SPC %d.getText() SPC %d.getText() SPC %d.getText());", getId(), mCtrlX->getId(), mCtrlY->getId(), mCtrlZ->getId(), mCtrlW->getId()); + + mCtrlX->setField("AltCommand", szBuffer); + mCtrlY->setField("AltCommand", szBuffer); + mCtrlZ->setField("AltCommand", szBuffer); + mCtrlW->setField("AltCommand", szBuffer); + + mCtrlX->setField("Validate", szBuffer); + mCtrlY->setField("Validate", szBuffer); + mCtrlZ->setField("Validate", szBuffer); + mCtrlW->setField("Validate", szBuffer); + + GuiControl* mContainerW = new GuiControl(); + mContainerW->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mContainerW->setExtent(Point2I(width, 18)); + mContainerW->addObject(mLabelW); + mContainerW->addObject(mCtrlW); + _registerEditControl(mContainerW); + + retCtrl->addObject(mContainerW); + //retCtrl->addObject(mScriptValue); +} + +void GuiInspectorType4DValue::updateValue() +{ + if (mField) + { + Parent::updateValue(); + const char* data = getData(); + if (!data) + data = ""; + U32 elementCount = StringUnit::getUnitCount(data, " "); + + if (elementCount > 3) + { + mCtrlW->setText(StringUnit::getUnit(data, 3, " \t\n")); + } + } +} + +bool GuiInspectorType4DValue::resize(const Point2I& newPosition, const Point2I& newExtent) +{ + if (!Parent::resize(newPosition, newExtent)) + return false; + + if (mEdit != NULL) + { + return updateRects(); + } + + return false; +} + +bool GuiInspectorType4DValue::updateRects() +{ + if (!Parent::updateRects()) + return false; + + S32 rowSize = 18; + S32 dividerPos, dividerMargin; + mInspector->getDivider(dividerPos, dividerMargin); + Point2I fieldExtent = getExtent(); + Point2I fieldPos = getPosition(); + + S32 cellWidth = mCeil((dividerPos - dividerMargin - 29)); + + mCtrlW->setExtent(Point2I(cellWidth - 3, 18)); + + S32 dimX = 10; + + mDimensionLabelW->resize(Point2I(fieldExtent.x - dividerPos - dimX, rowSize + rowSize + 6), Point2I(dimX, rowSize)); + + return true; +} + +//----------------------------------------------------------------------------- +// TypePoint3F GuiInspectorField Class +//----------------------------------------------------------------------------- +IMPLEMENT_CONOBJECT(GuiInspectorTypePoint3F); + +ConsoleDocClass(GuiInspectorTypePoint3F, + "@brief Inspector field type for Point3F\n\n" + "Editor use only.\n\n" + "@internal" +); +void GuiInspectorTypePoint3F::consoleInit() +{ + Parent::consoleInit(); + + ConsoleBaseType::getType(TypeMatrixPosition)->setInspectorFieldType("GuiInspectorTypePoint3F"); + ConsoleBaseType::getType(TypePoint3F)->setInspectorFieldType("GuiInspectorTypePoint3F"); +} + +GuiControl* GuiInspectorTypePoint3F::constructEditControl() +{ + GuiStackControl* retCtrl = new GuiStackControl(); + + if (retCtrl == NULL) + return retCtrl; + + mCaptionLabel = new GuiTextCtrl(); + mCaptionLabel->registerObject(); + mCaptionLabel->setControlProfile(mProfile); + mCaptionLabel->setText(mCaption); + addObject(mCaptionLabel); + + mDimensionLabelX = new GuiTextCtrl(); + mDimensionLabelX->registerObject(); + mDimensionLabelX->setControlProfile(mProfile); + mDimensionLabelX->setText("X"); + addObject(mDimensionLabelX); + + mDimensionLabelY = new GuiTextCtrl(); + mDimensionLabelY->registerObject(); + mDimensionLabelY->setControlProfile(mProfile); + mDimensionLabelY->setText("Y"); + addObject(mDimensionLabelY); + + mDimensionLabelZ = new GuiTextCtrl(); + mDimensionLabelZ->registerObject(); + mDimensionLabelZ->setControlProfile(mProfile); + mDimensionLabelZ->setText("Z"); + addObject(mDimensionLabelZ); + + retCtrl->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiDefaultProfile"); + retCtrl->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + retCtrl->setDataField(StringTable->insert("stackingType"), NULL, "Vertical"); + retCtrl->setDataField(StringTable->insert("dynamicSize"), NULL, "1"); + retCtrl->setDataField(StringTable->insert("padding"), NULL, "3"); + + _registerEditControl(retCtrl); + + constructEditControlChildren(retCtrl, getWidth()); + + mUseHeightOverride = true; + mHeightOverride = retCtrl->getHeight(); + + return retCtrl; +} + +//----------------------------------------------------------------------------- +// GuiInspectorTypeMatrixRotation GuiInspectorField Class +//----------------------------------------------------------------------------- +IMPLEMENT_CONOBJECT(GuiInspectorTypeMatrixRotation); + +ConsoleDocClass(GuiInspectorTypeMatrixRotation, + "@brief Inspector field type for rotation\n\n" + "Editor use only.\n\n" + "@internal" +); +void GuiInspectorTypeMatrixRotation::consoleInit() +{ + Parent::consoleInit(); + + ConsoleBaseType::getType(TypeMatrixRotation)->setInspectorFieldType("GuiInspectorTypeMatrixRotation"); +} + +GuiControl* GuiInspectorTypeMatrixRotation::constructEditControl() +{ + GuiStackControl* retCtrl = new GuiStackControl(); + + if (retCtrl == NULL) + return retCtrl; + + mCaptionLabel = new GuiTextCtrl(); + mCaptionLabel->registerObject(); + mCaptionLabel->setControlProfile(mProfile); + mCaptionLabel->setText(mCaption); + addObject(mCaptionLabel); + + mDimensionLabelX = new GuiTextCtrl(); + mDimensionLabelX->registerObject(); + mDimensionLabelX->setControlProfile(mProfile); + mDimensionLabelX->setText("Yaw"); + addObject(mDimensionLabelX); + + mDimensionLabelY = new GuiTextCtrl(); + mDimensionLabelY->registerObject(); + mDimensionLabelY->setControlProfile(mProfile); + mDimensionLabelY->setText("Pitch"); + addObject(mDimensionLabelY); + + mDimensionLabelZ = new GuiTextCtrl(); + mDimensionLabelZ->registerObject(); + mDimensionLabelZ->setControlProfile(mProfile); + mDimensionLabelZ->setText("Roll"); + addObject(mDimensionLabelZ); + + retCtrl->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiDefaultProfile"); + retCtrl->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + retCtrl->setDataField(StringTable->insert("stackingType"), NULL, "Vertical"); + retCtrl->setDataField(StringTable->insert("dynamicSize"), NULL, "1"); + retCtrl->setDataField(StringTable->insert("padding"), NULL, "3"); + + _registerEditControl(retCtrl); + + 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); + + mUseHeightOverride = true; + mHeightOverride = retCtrl->getHeight(); + + return retCtrl; +} + +void GuiInspectorTypeMatrixRotation::updateValue() +{ + if (mField) + { + Parent::updateValue(); + const char* data = getData(); + if (!data) + data = ""; + 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); + mCtrlX->setText(szBuffer); + } + + if (elementCount > 1) + { + F32 pitch = dAtof(StringUnit::getUnit(data, 1, " \t\n")) * dAtof(StringUnit::getUnit(data, 3, " \t\n")); + char szBuffer[128]; + dSprintf(szBuffer, 128, "%.2f", pitch); + 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); + mCtrlZ->setText(szBuffer); + } + + mScriptValue->setText(data); + + mEdit->setDataField(StringTable->insert("tooltip"), NULL, data); + } + +} + +bool GuiInspectorTypeMatrixRotation::resize(const Point2I& newPosition, const Point2I& newExtent) +{ + if (!Parent::resize(newPosition, newExtent)) + return false; + + if (mEdit != NULL) + { + return updateRects(); + } +} + +bool GuiInspectorTypeMatrixRotation::updateRects() +{ + S32 rowSize = 18; + S32 dividerPos, dividerMargin; + mInspector->getDivider(dividerPos, dividerMargin); + Point2I fieldExtent = getExtent(); + Point2I fieldPos = getPosition(); + + mEditCtrlRect.set(fieldExtent.x - dividerPos + dividerMargin, 1, dividerPos - dividerMargin - 29, fieldExtent.y); + S32 cellWidth = mCeil((dividerPos - dividerMargin - 29)); + + mCtrlX->setExtent(Point2I(cellWidth - 3, 18)); + mCtrlY->setExtent(Point2I(cellWidth - 3, 18)); + mCtrlZ->setExtent(Point2I(cellWidth - 3, 18)); + + mCaptionLabel->resize(Point2I(mProfile->mTextOffset.x, 0), Point2I(fieldExtent.x, rowSize)); + mDimensionLabelX->resize(Point2I(fieldExtent.x - dividerPos - 30, 0), Point2I(30, rowSize)); + mDimensionLabelY->resize(Point2I(fieldExtent.x - dividerPos - 30, rowSize + 3), Point2I(50, rowSize)); + mDimensionLabelZ->resize(Point2I(fieldExtent.x - dividerPos - 20, rowSize + rowSize + 6), Point2I(40, rowSize)); + + mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent); + + return true; +} diff --git a/Engine/source/gui/editor/guiInspectorTypes.h b/Engine/source/gui/editor/guiInspectorTypes.h index 858501a28..60514748a 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.h +++ b/Engine/source/gui/editor/guiInspectorTypes.h @@ -576,5 +576,99 @@ public: virtual void _populateMenu( GuiPopUpMenuCtrl *menu ); }; +//----------------------------------------------------------------------------- +// Two Dimensional Field base GuiInspectorField Class +//----------------------------------------------------------------------------- -#endif // _GUI_INSPECTOR_TYPES_H_ \ No newline at end of file +class GuiInspectorType2DValue : public GuiInspectorField +{ +private: + typedef GuiInspectorField Parent; +protected: + GuiTextEditCtrl* mCtrlX; + GuiTextEditCtrl* mCtrlY; + GuiTextCtrl* mScriptValue; + +public: + GuiTextCtrl* mCaptionLabel; + GuiTextCtrl* mDimensionLabelX; + GuiTextCtrl* mDimensionLabelY; + + virtual void constructEditControlChildren(GuiControl* retCtrl, S32 width); + virtual void updateValue(); + virtual bool resize(const Point2I& newPosition, const Point2I& newExtent); + virtual bool updateRects(); +}; + +//----------------------------------------------------------------------------- +// Three Dimensional Field base GuiInspectorField Class +//----------------------------------------------------------------------------- + +class GuiInspectorType3DValue : public GuiInspectorType2DValue +{ +private: + typedef GuiInspectorType2DValue Parent; +protected: + GuiTextEditCtrl* mCtrlZ; + +public: + GuiTextCtrl* mDimensionLabelZ; + + virtual void constructEditControlChildren(GuiControl* retCtrl, S32 width); + virtual void updateValue(); + virtual bool resize(const Point2I& newPosition, const Point2I& newExtent); + virtual bool updateRects(); +}; + +//----------------------------------------------------------------------------- +// Four Dimensional Field base GuiInspectorField Class +//----------------------------------------------------------------------------- + +class GuiInspectorType4DValue : public GuiInspectorType3DValue +{ +private: + typedef GuiInspectorType3DValue Parent; +protected: + GuiTextEditCtrl* mCtrlW; + +public: + GuiTextCtrl* mDimensionLabelW; + + virtual void constructEditControlChildren(GuiControl* retCtrl, S32 width); + virtual void updateValue(); + virtual bool resize(const Point2I& newPosition, const Point2I& newExtent); + virtual bool updateRects(); +}; + +//----------------------------------------------------------------------------- +// TypePoint3F GuiInspectorField Class +//----------------------------------------------------------------------------- + +class GuiInspectorTypePoint3F : public GuiInspectorType3DValue +{ +private: + typedef GuiInspectorField Parent; +public: + DECLARE_CONOBJECT(GuiInspectorTypePoint3F); + static void consoleInit(); + virtual GuiControl* constructEditControl(); +}; + +//----------------------------------------------------------------------------- +// TypeMatrixRotation GuiInspectorField Class +//----------------------------------------------------------------------------- + +class GuiInspectorTypeMatrixRotation : public GuiInspectorType3DValue +{ +private: + typedef GuiInspectorField Parent; +public: + DECLARE_CONOBJECT(GuiInspectorTypeMatrixRotation); + static void consoleInit(); + virtual GuiControl* constructEditControl(); + virtual void updateValue(); + virtual bool resize(const Point2I& newPosition, const Point2I& newExtent); + virtual bool updateRects(); +}; + +#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..9af91fcc3 100644 --- a/Engine/source/gui/editor/inspector/field.cpp +++ b/Engine/source/gui/editor/inspector/field.cpp @@ -331,12 +331,12 @@ void GuiInspectorField::setData( const char* data, bool callbacks ) || type == TypeColorF || type == TypePoint2I || type == TypePoint2F - || type == TypePoint3F + //|| type == TypePoint3F || type == TypePoint4F || type == TypeRectI || type == TypeRectF - || type == TypeMatrixPosition - || type == TypeMatrixRotation + //|| type == TypeMatrixPosition + //|| type == TypeMatrixRotation || type == TypeBox3F || type == TypeRectUV || type == TypeRotationF) From 639ca1c03adee2149defa8ca4ba2adb949dbee6c Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 10 Jun 2023 17:00:09 +0100 Subject: [PATCH 2/9] Update profiles.ed.tscript missing profiles --- .../game/tools/gui/profiles.ed.tscript | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Templates/BaseGame/game/tools/gui/profiles.ed.tscript b/Templates/BaseGame/game/tools/gui/profiles.ed.tscript index 1f83afeec..bd8dc4ad2 100644 --- a/Templates/BaseGame/game/tools/gui/profiles.ed.tscript +++ b/Templates/BaseGame/game/tools/gui/profiles.ed.tscript @@ -207,6 +207,26 @@ new GuiControlProfile (ToolsGuiTextBoldProfile : ToolsGuiTextProfile) fontType = "Arial Bold"; }; +if( !isObject( ToolsGuiXDimensionText ) ) +new GuiControlProfile (ToolsGuiXDimensionText : ToolsGuiTextBoldProfile) +{ + fillColor = "255 129 123 120"; +}; + +if( !isObject( ToolsGuiYDimensionText ) ) +new GuiControlProfile (ToolsGuiYDimensionText : ToolsGuiTextBoldProfile) +{ + fillColor = "129 255 123 120"; +}; + + +if( !isObject( ToolsGuiZDimensionText ) ) +new GuiControlProfile (ToolsGuiZDimensionText : ToolsGuiTextBoldProfile) +{ + fillColor = "123 129 255 120"; +}; + + if( !isObject( ToolsGuiTextBoldCenterProfile ) ) new GuiControlProfile (ToolsGuiTextBoldCenterProfile : ToolsGuiTextProfile) { From 0a7550eeba103cc04304c7ad72c735503852ed36 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 10 Jun 2023 18:15:03 +0100 Subject: [PATCH 3/9] Update guiInspectorTypes.cpp --- Engine/source/gui/editor/guiInspectorTypes.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index c1f355b96..0bd56dd3f 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -2154,19 +2154,19 @@ GuiControl* GuiInspectorTypeMatrixRotation::constructEditControl() mDimensionLabelX = new GuiTextCtrl(); mDimensionLabelX->registerObject(); mDimensionLabelX->setControlProfile(mProfile); - mDimensionLabelX->setText("Yaw"); + mDimensionLabelX->setText("Ptich"); addObject(mDimensionLabelX); mDimensionLabelY = new GuiTextCtrl(); mDimensionLabelY->registerObject(); mDimensionLabelY->setControlProfile(mProfile); - mDimensionLabelY->setText("Pitch"); + mDimensionLabelY->setText("Roll"); addObject(mDimensionLabelY); mDimensionLabelZ = new GuiTextCtrl(); mDimensionLabelZ->registerObject(); mDimensionLabelZ->setControlProfile(mProfile); - mDimensionLabelZ->setText("Roll"); + mDimensionLabelZ->setText("Yaw"); addObject(mDimensionLabelZ); retCtrl->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiDefaultProfile"); @@ -2219,8 +2219,8 @@ void GuiInspectorTypeMatrixRotation::updateValue() if (elementCount > 1) { F32 pitch = dAtof(StringUnit::getUnit(data, 1, " \t\n")) * dAtof(StringUnit::getUnit(data, 3, " \t\n")); - char szBuffer[128]; - dSprintf(szBuffer, 128, "%.2f", pitch); + char szBuffer[64]; + dSprintf(szBuffer, 64, "%.2f", pitch); mCtrlY->setText(szBuffer); } @@ -2268,7 +2268,7 @@ bool GuiInspectorTypeMatrixRotation::updateRects() mCaptionLabel->resize(Point2I(mProfile->mTextOffset.x, 0), Point2I(fieldExtent.x, rowSize)); mDimensionLabelX->resize(Point2I(fieldExtent.x - dividerPos - 30, 0), Point2I(30, rowSize)); mDimensionLabelY->resize(Point2I(fieldExtent.x - dividerPos - 30, rowSize + 3), Point2I(50, rowSize)); - mDimensionLabelZ->resize(Point2I(fieldExtent.x - dividerPos - 20, rowSize + rowSize + 6), Point2I(40, rowSize)); + mDimensionLabelZ->resize(Point2I(fieldExtent.x - dividerPos - 30, rowSize + rowSize + 6), Point2I(40, rowSize)); mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent); From 92920dbcd92225dce2fb0435ce3b5e3cf289c10a Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sat, 10 Jun 2023 21:30:58 +0100 Subject: [PATCH 4/9] Change to GuiTextEditSliderCtrl Change dimension elements to a guiTextEditSliderCtrl add a button to copy all elements of the multi dimension class to the platform clipboard --- .../source/gui/editor/guiInspectorTypes.cpp | 48 ++++++++++++++++--- Engine/source/gui/editor/guiInspectorTypes.h | 11 +++-- Engine/source/gui/editor/inspector/field.cpp | 6 +-- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index 0bd56dd3f..00ee9aacd 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -1726,22 +1726,38 @@ void GuiInspectorTypeSFXSourceName::consoleInit() void GuiInspectorType2DValue::constructEditControlChildren(GuiControl* retCtrl, S32 width) { - mCtrlX = new GuiTextEditCtrl(); + mCtrlX = new GuiTextEditSliderCtrl(); GuiControl* mLabelX = new GuiControl(); - mCtrlY = new GuiTextEditCtrl(); + mCtrlY = new GuiTextEditSliderCtrl(); GuiControl* mLabelY = new GuiControl(); mScriptValue = new GuiTextCtrl(); + + mCopyButton = new GuiBitmapButtonCtrl(); + mCopyButton->setExtent(Point2I(15, 15)); + mCopyButton->setBitmap(StringTable->insert("ToolsModule:copy_btn_n_image")); + mCopyButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile"); + 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); 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"); 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"); mLabelX->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiXDimensionText"); mLabelY->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiYDimensionText"); @@ -1799,12 +1815,18 @@ void GuiInspectorType2DValue::updateValue() if (elementCount > 0) { - mCtrlX->setText(StringUnit::getUnit(data, 0, " \t\n")); + F32 value = dAtof(StringUnit::getUnit(data, 0, " \t\n")); + char szBuffer[64]; + dSprintf(szBuffer, 64, "%.4f", value); + mCtrlX->setText(szBuffer); } if (elementCount > 1) { - mCtrlY->setText(StringUnit::getUnit(data, 1, " \t\n")); + F32 value = dAtof(StringUnit::getUnit(data, 1, " \t\n")); + char szBuffer[64]; + dSprintf(szBuffer, 64, "%.4f", value); + mCtrlY->setText(szBuffer); } mScriptValue->setText(data); @@ -1846,6 +1868,8 @@ bool GuiInspectorType2DValue::updateRects() mDimensionLabelX->resize(Point2I(fieldExtent.x - dividerPos - dimX, 0), Point2I(dimX, rowSize)); mDimensionLabelY->resize(Point2I(fieldExtent.x - dividerPos - dimX, rowSize + 3), Point2I(dimX, rowSize)); + mCopyButton->resize(Point2I(mProfile->mTextOffset.x, rowSize + 3), Point2I(15, 15)); + mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent); return true; @@ -1859,13 +1883,16 @@ void GuiInspectorType3DValue::constructEditControlChildren(GuiControl* retCtrl, { Parent::constructEditControlChildren(retCtrl, width); - mCtrlZ = new GuiTextEditCtrl(); + mCtrlZ = new GuiTextEditSliderCtrl(); GuiControl* mLabelZ = new GuiControl(); _registerEditControl(mCtrlZ); 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"); mLabelZ->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiZDimensionText"); @@ -1913,7 +1940,10 @@ void GuiInspectorType3DValue::updateValue() if (elementCount > 2) { - mCtrlZ->setText(StringUnit::getUnit(data, 2, " \t\n")); + F32 value = dAtof(StringUnit::getUnit(data, 2, " \t\n")); + char szBuffer[64]; + dSprintf(szBuffer, 64, "%.4f", value); + mCtrlZ->setText(szBuffer); } } } @@ -2115,6 +2145,12 @@ GuiControl* GuiInspectorTypePoint3F::constructEditControl() constructEditControlChildren(retCtrl, getWidth()); + addObject(mCopyButton); + + char szBuffer[512]; + dSprintf(szBuffer, 512, "setClipboard(%d.getText() SPC %d.getText() SPC %d.getText());", mCtrlX->getId(), mCtrlY->getId(), mCtrlZ->getId()); + mCopyButton->setField("Command", szBuffer); + mUseHeightOverride = true; mHeightOverride = retCtrl->getHeight(); diff --git a/Engine/source/gui/editor/guiInspectorTypes.h b/Engine/source/gui/editor/guiInspectorTypes.h index 60514748a..27516882a 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.h +++ b/Engine/source/gui/editor/guiInspectorTypes.h @@ -42,6 +42,10 @@ #include "gui/buttons/guiBitmapButtonCtrl.h" #endif +#ifndef _GUITEXTEDITSLIDERCTRL_H_ +#include "gui/controls/guiTextEditSliderCtrl.h" +#endif + class GuiPopUpMenuCtrl; /// A base class for other inspector field types which @@ -585,14 +589,15 @@ class GuiInspectorType2DValue : public GuiInspectorField private: typedef GuiInspectorField Parent; protected: - GuiTextEditCtrl* mCtrlX; - GuiTextEditCtrl* mCtrlY; + GuiTextEditSliderCtrl* mCtrlX; + GuiTextEditSliderCtrl* mCtrlY; GuiTextCtrl* mScriptValue; public: GuiTextCtrl* mCaptionLabel; GuiTextCtrl* mDimensionLabelX; GuiTextCtrl* mDimensionLabelY; + GuiBitmapButtonCtrl* mCopyButton; virtual void constructEditControlChildren(GuiControl* retCtrl, S32 width); virtual void updateValue(); @@ -609,7 +614,7 @@ class GuiInspectorType3DValue : public GuiInspectorType2DValue private: typedef GuiInspectorType2DValue Parent; protected: - GuiTextEditCtrl* mCtrlZ; + GuiTextEditSliderCtrl* mCtrlZ; public: GuiTextCtrl* mDimensionLabelZ; diff --git a/Engine/source/gui/editor/inspector/field.cpp b/Engine/source/gui/editor/inspector/field.cpp index 9af91fcc3..b5b0f7d65 100644 --- a/Engine/source/gui/editor/inspector/field.cpp +++ b/Engine/source/gui/editor/inspector/field.cpp @@ -331,12 +331,12 @@ void GuiInspectorField::setData( const char* data, bool callbacks ) || type == TypeColorF || type == TypePoint2I || type == TypePoint2F - //|| type == TypePoint3F + || type == TypePoint3F || type == TypePoint4F || type == TypeRectI || type == TypeRectF - //|| type == TypeMatrixPosition - //|| type == TypeMatrixRotation + || type == TypeMatrixPosition + || type == TypeMatrixRotation || type == TypeBox3F || type == TypeRectUV || type == TypeRotationF) From cbe2bd4c7b6d99ce69a1760fc7c5560e604abbca Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 11 Jun 2023 21:59:03 +0100 Subject: [PATCH 5/9] Conversions Commit from Azaezel to fix the naming of inspector fields. TypeMatrixField still messes around on first responder, we know these functions convert angAxis to eul properly and from eul to angAxis but when the data comes to TypeMatrix it changes.... weird issue is weird. --- .../source/gui/editor/guiInspectorTypes.cpp | 136 ++++++++++++------ Engine/source/gui/editor/guiInspectorTypes.h | 20 ++- Engine/source/gui/editor/inspector/field.cpp | 11 +- Engine/source/gui/editor/inspector/field.h | 2 +- Engine/source/gui/worldEditor/editor.cpp | 4 +- Engine/source/math/mConsoleFunctions.cpp | 10 ++ Engine/source/math/mMath.h | 16 +++ 7 files changed, 146 insertions(+), 53 deletions(-) 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_ From a4e2bfe34e46c99bfd3771159a7ffc7b8f8dccdc Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 11 Jun 2023 22:37:08 +0100 Subject: [PATCH 6/9] Commit before cleanup -TypeRotationMatrix working as designed no more funny business on focus. --- .../source/gui/editor/guiInspectorTypes.cpp | 27 ++++++++++++------- Engine/source/gui/editor/guiInspectorTypes.h | 1 + 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index 26a23df2b..df0dcad8e 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -2247,15 +2247,15 @@ void GuiInspectorTypeMatrixRotation::constructEditControlChildren(GuiControl* re mCtrlX->setField("AltCommand", angleInput.c_str()); mCtrlX->setField("Validate", angleInput.c_str()); - mCtrlX->setDataField(StringTable->insert("format"), NULL, "%g"); + mCtrlX->setDataField(StringTable->insert("format"), NULL, "%.6f"); mCtrlY->setField("AltCommand", angleInput.c_str()); mCtrlY->setField("Validate", angleInput.c_str()); - mCtrlY->setDataField(StringTable->insert("format"), NULL, "%g"); + mCtrlY->setDataField(StringTable->insert("format"), NULL, "%.6f"); mCtrlZ->setField("AltCommand", angleInput.c_str()); mCtrlZ->setField("Validate", angleInput.c_str()); - mCtrlZ->setDataField(StringTable->insert("format"), NULL, "%g"); + mCtrlZ->setDataField(StringTable->insert("format"), NULL, "%.6f"); } void GuiInspectorTypeMatrixRotation::updateValue() @@ -2268,28 +2268,28 @@ void GuiInspectorTypeMatrixRotation::updateValue() 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"))); + mDegToRad(dAtof(StringUnit::getUnit(data, 3, " \t\n")))); - EulerF euler = mAngToEul(angAx); + eulAng = mAngToEul(angAx); U32 elementCount = StringUnit::getUnitCount(data, " "); if (elementCount > 0) { char szBuffer[64]; - dSprintf(szBuffer, 64, "%g", euler.x); + dSprintf(szBuffer, 64, "%.6f", eulAng.x); mCtrlX->setText(szBuffer); } if (elementCount > 1) { char szBuffer[64]; - dSprintf(szBuffer, 64, "%g", euler.y); + dSprintf(szBuffer, 64, "%.6f", eulAng.y); mCtrlY->setText(szBuffer); } if (elementCount > 2) { char szBuffer[64]; - dSprintf(szBuffer, 64, "%g", euler.z); + dSprintf(szBuffer, 64, "%.6f", eulAng.z); mCtrlZ->setText(szBuffer); } @@ -2339,7 +2339,13 @@ bool GuiInspectorTypeMatrixRotation::updateRects() void GuiInspectorTypeMatrixRotation::updateAng(AngAxisF newAngAx) { - angAx = newAngAx; + angAx.axis = newAngAx.axis; + angAx.angle = mRadToDeg(newAngAx.angle); +} + +void GuiInspectorTypeMatrixRotation::updateEul(EulerF newEul) +{ + eulAng = newEul; } void GuiInspectorTypeMatrixRotation::updateData() @@ -2350,13 +2356,14 @@ void GuiInspectorTypeMatrixRotation::updateData() StringTableEntry GuiInspectorTypeMatrixRotation::getValue() { - String angBuffer = String::ToString("%g %g %g %g", angAx.axis.x, angAx.axis.y, angAx.axis.z, angAx.angle); + String angBuffer = String::ToString("%.6f %.6f %.6f %.6f", 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->updateEul(mAngToEul(angAx)); object->updateData(); } diff --git a/Engine/source/gui/editor/guiInspectorTypes.h b/Engine/source/gui/editor/guiInspectorTypes.h index 62ccfd066..82d34e51f 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.h +++ b/Engine/source/gui/editor/guiInspectorTypes.h @@ -686,6 +686,7 @@ public: virtual bool updateRects(); void updateAng(AngAxisF newAngAx); + void updateEul(EulerF newEul); virtual void updateData(); virtual StringTableEntry getValue(); From 55272078058cb9b843371e8bc22a2829a7f07c31 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Tue, 13 Jun 2023 15:11:28 +0100 Subject: [PATCH 7/9] AngAxis toEuler Add Euler set and to functions to AngAxis. Removes the need to use a matrix --- Engine/source/math/mAngAxis.cpp | 67 +++++++++++++++++++++++++++++++++ Engine/source/math/mAngAxis.h | 2 + Engine/source/math/mMath.h | 8 ++-- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/Engine/source/math/mAngAxis.cpp b/Engine/source/math/mAngAxis.cpp index d7196cdd4..83a5e673f 100644 --- a/Engine/source/math/mAngAxis.cpp +++ b/Engine/source/math/mAngAxis.cpp @@ -34,6 +34,42 @@ AngAxisF & AngAxisF::set( const QuatF & q ) axis.set(1.0f,0.0f,0.0f); return *this; } +AngAxisF& AngAxisF::set(const EulerF& eul) +{ + F32 c1 = mCos(eul.y / 2); + F32 s1 = mSin(eul.y / 2); + F32 c2 = mCos(eul.z / 2); + F32 s2 = mSin(eul.z / 2); + F32 c3 = mCos(eul.x / 2); + F32 s3 = mSin(eul.x / 2); + + F32 c1c2 = c1 * c2; + F32 s1s2 = s1 * s2; + + F32 w = c1c2 * c3 - s1s2 * s3; + F32 x = c1c2 * s3 + s1s2 * c3; + F32 y = s1 * c2 * c3 + c1 * s2 * s3; + F32 z = c1 * s2 * c3 - s1 * c2 * s3; + + angle = 2.0f * mAcos(w); + + F32 norm = x * x + y * y + z * z; + if (norm < POINT_EPSILON) + { + axis.set(1.0f, 0.0f, 0.0f); + } + else + { + norm = mSqrt(norm); + x /= norm; + y /= norm; + z /= norm; + } + + axis.set(x, y, z); + + return *this; +} AngAxisF & AngAxisF::set( const MatrixF & mat ) { @@ -93,3 +129,34 @@ void AngAxisF::RotateZ(F32 angle, const Point3F & from, Point3F * to) mat.mulV(from,to); } +EulerF AngAxisF::toEuler() const +{ + EulerF r; + + F32 s = mSin(angle); + F32 c = mCos(angle); + F32 invc = 1 - c; + + if ((axis.x * axis.y * invc + axis.z * s) > (1 - POINT_EPSILON)) + { + r.y = 2.0f * mAtan2(axis.x * mSin(angle / 2), mCos(angle / 2)); + r.z = -M_HALFPI_F; + r.x = 0.f; + return r; + } + + if ((axis.x * axis.y * invc + axis.z * s) < -(1 - POINT_EPSILON)) + { + r.y = -2.0f * mAtan2(axis.x * mSin(angle / 2), mCos(angle / 2)); + r.z = -M_HALFPI_F; + r.x = 0.f; + return r; + } + + r.x = mAtan2(axis.x * s - axis.y * axis.z * invc, 1.0f - (axis.x * axis.x + axis.z * axis.z) * invc); + r.y = mAtan2(axis.y * s - axis.x * axis.z * invc, 1.0f - (axis.y * axis.y + axis.z * axis.z) * invc); + r.z = mAsin(axis.x * axis.y * invc + axis.z * s); + + return r; + +} diff --git a/Engine/source/math/mAngAxis.h b/Engine/source/math/mAngAxis.h index fd02ad8ec..a5adca3a7 100644 --- a/Engine/source/math/mAngAxis.h +++ b/Engine/source/math/mAngAxis.h @@ -45,6 +45,7 @@ class AngAxisF explicit AngAxisF( const QuatF &q ); AngAxisF& set( const Point3F & _axis, F32 _angle ); + AngAxisF& set( const EulerF & _axis); AngAxisF& set( const MatrixF & m ); AngAxisF& set( const QuatF & q ); @@ -60,6 +61,7 @@ class AngAxisF static void RotateX(F32 angle, const Point3F & from, Point3F * to); static void RotateY(F32 angle, const Point3F & from, Point3F * to); static void RotateZ(F32 angle, const Point3F & from, Point3F * to); + EulerF toEuler() const; }; //---------------------------------------------------------------------------- diff --git a/Engine/source/math/mMath.h b/Engine/source/math/mMath.h index eb816bffe..4ddb78ac4 100644 --- a/Engine/source/math/mMath.h +++ b/Engine/source/math/mMath.h @@ -54,16 +54,14 @@ inline AngAxisF mEulDegToAng(EulerF euler) { - MatrixF tempMat = MatrixF(euler * M_PI_F / 180.0f, Point3F::Zero); - AngAxisF angAx = AngAxisF(tempMat); + AngAxisF angAx; + angAx.set(euler * M_PI_F / 180.0f); return angAx; } inline EulerF mAngToEul(AngAxisF angAx) { - MatrixF tempMat; - angAx.setMatrix(&tempMat); - EulerF euler = tempMat.toEuler(); + EulerF euler = angAx.toEuler(); euler *= 180.0f / M_PI_F; return euler; } From 22f8e4628827a90c72d0215f038ffeb50174eff1 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Mon, 3 Jul 2023 20:59:16 +0100 Subject: [PATCH 8/9] Copy and Paste Copy and paste buttons added for multi dimensional fields No longer name conflict errors coming up. --- .../source/gui/editor/guiInspectorTypes.cpp | 71 ++++++++++++------- Engine/source/gui/editor/guiInspectorTypes.h | 3 +- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index df0dcad8e..53039fee5 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -1736,17 +1736,25 @@ void GuiInspectorType2DValue::constructEditControlChildren(GuiControl* retCtrl, mLabelY = new GuiControl(); _registerEditControl(mLabelY, "ly"); - mScriptValue = new GuiTextCtrl(); - _registerEditControl(mScriptValue, "val"); + mScriptValue = new GuiTextEditCtrl(); - mCopyButton = new GuiBitmapButtonCtrl(); - mCopyButton->setExtent(Point2I(15, 15)); - mCopyButton->setBitmap(StringTable->insert("ToolsModule:copy_btn_n_image")); - mCopyButton->setDataField(StringTable->insert("Profile"), NULL, "GuiButtonProfile"); + mCopyButton = new GuiButtonCtrl(); + mCopyButton->setExtent(Point2I(45, 15)); + mCopyButton->registerObject(); + mCopyButton->setDataField(StringTable->insert("text"), NULL, "Copy"); + mCopyButton->setDataField(StringTable->insert("Profile"), NULL, "GuiInspectorButtonProfile"); 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."); - _registerEditControl(mCopyButton, "cpy"); + + mPasteButton = new GuiButtonCtrl(); + mPasteButton->setExtent(Point2I(45, 15)); + mPasteButton->registerObject(); + mPasteButton->setDataField(StringTable->insert("text"), NULL, "Paste"); + mPasteButton->setDataField(StringTable->insert("Profile"), NULL, "GuiInspectorButtonProfile"); + mPasteButton->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + mPasteButton->setDataField(StringTable->insert("hovertime"), NULL, "1000"); + mPasteButton->setDataField(StringTable->insert("tooltip"), NULL, "Copy all values for script."); mCtrlX->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); mCtrlX->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); @@ -1763,7 +1771,8 @@ void GuiInspectorType2DValue::constructEditControlChildren(GuiControl* retCtrl, mLabelX->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiXDimensionText"); mLabelY->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiYDimensionText"); - mScriptValue->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiTextProfile"); + mScriptValue->setDataField(StringTable->insert("profile"), NULL, "GuiInspectorTextEditProfile"); + mScriptValue->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); S32 labelWidth = 3; mLabelX->setExtent(Point2I(labelWidth, 18)); @@ -1869,7 +1878,8 @@ bool GuiInspectorType2DValue::updateRects() mDimensionLabelX->resize(Point2I(fieldExtent.x - dividerPos - dimX, 0), Point2I(dimX, rowSize)); mDimensionLabelY->resize(Point2I(fieldExtent.x - dividerPos - dimX, rowSize + 3), Point2I(dimX, rowSize)); - mCopyButton->resize(Point2I(mProfile->mTextOffset.x, rowSize + 3), Point2I(15, 15)); + mCopyButton->resize(Point2I(mProfile->mTextOffset.x, rowSize + 3), Point2I(45, 15)); + mPasteButton->resize(Point2I(mProfile->mTextOffset.x, rowSize + rowSize + 6), Point2I(45, 15)); mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent); @@ -1897,8 +1907,6 @@ void GuiInspectorType3DValue::constructEditControlChildren(GuiControl* retCtrl, mLabelZ->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiZDimensionText"); - mScriptValue->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiTextProfile"); - S32 labelWidth = 3; mLabelZ->setExtent(Point2I(labelWidth, 18)); @@ -1925,7 +1933,6 @@ void GuiInspectorType3DValue::constructEditControlChildren(GuiControl* retCtrl, _registerEditControl(mContainerZ, "cz"); retCtrl->addObject(mContainerZ); - //retCtrl->addObject(mScriptValue); } void GuiInspectorType3DValue::updateValue() @@ -2032,7 +2039,6 @@ void GuiInspectorType4DValue::constructEditControlChildren(GuiControl* retCtrl, _registerEditControl(mContainerW); retCtrl->addObject(mContainerW); - //retCtrl->addObject(mScriptValue); } void GuiInspectorType4DValue::updateValue() @@ -2146,11 +2152,14 @@ GuiControl* GuiInspectorTypePoint3F::constructEditControl() constructEditControlChildren(retCtrl, getWidth()); - addObject(mCopyButton); - char szBuffer[512]; dSprintf(szBuffer, 512, "setClipboard(%d.getText() SPC %d.getText() SPC %d.getText());", mCtrlX->getId(), mCtrlY->getId(), mCtrlZ->getId()); mCopyButton->setField("Command", szBuffer); + addObject(mCopyButton); + + dSprintf(szBuffer, 512, "%d.apply(getWords(getClipboard(), 0, 2));", getId()); + mPasteButton->setField("Command", szBuffer); + addObject(mPasteButton); mUseHeightOverride = true; mHeightOverride = retCtrl->getHeight(); @@ -2186,28 +2195,24 @@ 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("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"); @@ -2222,6 +2227,15 @@ GuiControl* GuiInspectorTypeMatrixRotation::constructEditControl() //retCtrl->addObject(mScriptValue); + char szBuffer[512]; + dSprintf(szBuffer, 512, "setClipboard(%d.getText());", mScriptValue->getId()); + mCopyButton->setField("Command", szBuffer); + addObject(mCopyButton); + + dSprintf(szBuffer, 512, "%d.apply(getClipboard());", getId()); + mPasteButton->setField("Command", szBuffer); + addObject(mPasteButton); + mUseHeightOverride = true; mHeightOverride = retCtrl->getHeight(); @@ -2232,19 +2246,19 @@ void GuiInspectorTypeMatrixRotation::constructEditControlChildren(GuiControl* re { Parent::constructEditControlChildren(retCtrl, width); - if (!mScriptValue) - { - mScriptValue = new GuiTextEditCtrl(); - // Don't forget to register ourselves - _registerEditControl(mScriptValue, "value"); - } - U32 svID = mScriptValue->getId(); + // Don't forget to register ourselves + _registerEditControl(mScriptValue, "value"); 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()); + // enable script value + String angleInput = String::ToString("%d.apply(%d.getText());", getId(), mScriptValue->getId()); mScriptValue->setField("AltCommand", angleInput.c_str()); mScriptValue->setField("Validate", angleInput.c_str()); + // change command for pitch roll yaw input. + angleInput = String::ToString("%d.applyRotation(mEulDegToAng(%d.getText() SPC %d.getText() SPC %d.getText()));", getId(), mCtrlX->getId(), mCtrlY->getId(), mCtrlZ->getId()); + + mCtrlX->setField("AltCommand", angleInput.c_str()); mCtrlX->setField("Validate", angleInput.c_str()); mCtrlX->setDataField(StringTable->insert("format"), NULL, "%.6f"); @@ -2334,6 +2348,9 @@ bool GuiInspectorTypeMatrixRotation::updateRects() mEdit->resize(mEditCtrlRect.point, mEditCtrlRect.extent); + mCopyButton->resize(Point2I(mProfile->mTextOffset.x, rowSize + 3), Point2I(45, 15)); + mPasteButton->resize(Point2I(mProfile->mTextOffset.x, rowSize + rowSize + 6), Point2I(45, 15)); + return true; } diff --git a/Engine/source/gui/editor/guiInspectorTypes.h b/Engine/source/gui/editor/guiInspectorTypes.h index 82d34e51f..4616a590d 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.h +++ b/Engine/source/gui/editor/guiInspectorTypes.h @@ -601,7 +601,8 @@ public: GuiTextCtrl* mCaptionLabel; GuiTextCtrl* mDimensionLabelX; GuiTextCtrl* mDimensionLabelY; - GuiBitmapButtonCtrl* mCopyButton; + GuiButtonCtrl* mCopyButton; + GuiButtonCtrl* mPasteButton; virtual void constructEditControlChildren(GuiControl* retCtrl, S32 width); virtual void updateValue(); From f127b084cea4e3f39fa4bf5f202eb2ef68bc7b62 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Tue, 4 Jul 2023 07:15:03 +0100 Subject: [PATCH 9/9] Add 2d value types - TypePoint2F and TypePoint2I now display as multi dimensional --- .../source/gui/editor/guiInspectorTypes.cpp | 98 ++++++++++++++++++- Engine/source/gui/editor/guiInspectorTypes.h | 26 +++++ 2 files changed, 122 insertions(+), 2 deletions(-) diff --git a/Engine/source/gui/editor/guiInspectorTypes.cpp b/Engine/source/gui/editor/guiInspectorTypes.cpp index 53039fee5..1f583d528 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.cpp +++ b/Engine/source/gui/editor/guiInspectorTypes.cpp @@ -2093,6 +2093,100 @@ bool GuiInspectorType4DValue::updateRects() return true; } +//----------------------------------------------------------------------------- +// TypePoint2F GuiInspectorField Class +//----------------------------------------------------------------------------- +IMPLEMENT_CONOBJECT(GuiInspectorTypePoint2F); + +ConsoleDocClass(GuiInspectorTypePoint2F, + "@brief Inspector field type for Point2F\n\n" + "Editor use only.\n\n" + "@internal" +); +void GuiInspectorTypePoint2F::consoleInit() +{ + Parent::consoleInit(); + + ConsoleBaseType::getType(TypePoint2F)->setInspectorFieldType("GuiInspectorTypePoint2F"); +} + +GuiControl* GuiInspectorTypePoint2F::constructEditControl() +{ + GuiStackControl* retCtrl = new GuiStackControl(); + + if (retCtrl == NULL) + return retCtrl; + + mCaptionLabel = new GuiTextCtrl(); + mCaptionLabel->registerObject(); + mCaptionLabel->setControlProfile(mProfile); + mCaptionLabel->setText(mCaption); + addObject(mCaptionLabel); + + mDimensionLabelX = new GuiTextCtrl(); + mDimensionLabelX->registerObject(); + mDimensionLabelX->setControlProfile(mProfile); + mDimensionLabelX->setText("X"); + addObject(mDimensionLabelX); + + mDimensionLabelY = new GuiTextCtrl(); + mDimensionLabelY->registerObject(); + mDimensionLabelY->setControlProfile(mProfile); + mDimensionLabelY->setText("Y"); + addObject(mDimensionLabelY); + + retCtrl->setDataField(StringTable->insert("profile"), NULL, "ToolsGuiDefaultProfile"); + retCtrl->setDataField(StringTable->insert("tooltipprofile"), NULL, "GuiToolTipProfile"); + retCtrl->setDataField(StringTable->insert("stackingType"), NULL, "Vertical"); + retCtrl->setDataField(StringTable->insert("dynamicSize"), NULL, "1"); + retCtrl->setDataField(StringTable->insert("padding"), NULL, "3"); + + _registerEditControl(retCtrl); + + constructEditControlChildren(retCtrl, getWidth()); + + char szBuffer[512]; + dSprintf(szBuffer, 512, "setClipboard(%d.getText() SPC %d.getText());", mCtrlX->getId(), mCtrlY->getId()); + mCopyButton->setField("Command", szBuffer); + addObject(mCopyButton); + + dSprintf(szBuffer, 512, "%d.apply(getWords(getClipboard(), 0, 1));", getId()); + mPasteButton->setField("Command", szBuffer); + addObject(mPasteButton); + + mUseHeightOverride = true; + mHeightOverride = retCtrl->getHeight() + 16 + 6; + + return retCtrl; +} + +//----------------------------------------------------------------------------- +// TypePoint2I GuiInspectorField Class +//----------------------------------------------------------------------------- +IMPLEMENT_CONOBJECT(GuiInspectorTypePoint2I); + +ConsoleDocClass(GuiInspectorTypePoint2I, + "@brief Inspector field type for Point2I\n\n" + "Editor use only.\n\n" + "@internal" +); +void GuiInspectorTypePoint2I::consoleInit() +{ + Parent::consoleInit(); + + ConsoleBaseType::getType(TypePoint2I)->setInspectorFieldType("GuiInspectorTypePoint2I"); +} + +GuiControl* GuiInspectorTypePoint2I::constructEditControl() +{ + GuiControl* retCtrl = Parent::constructEditControl(); + + mCtrlX->setDataField(StringTable->insert("format"), NULL, "%d"); + mCtrlY->setDataField(StringTable->insert("format"), NULL, "%d"); + + return retCtrl; +} + //----------------------------------------------------------------------------- // TypePoint3F GuiInspectorField Class //----------------------------------------------------------------------------- @@ -2162,7 +2256,7 @@ GuiControl* GuiInspectorTypePoint3F::constructEditControl() addObject(mPasteButton); mUseHeightOverride = true; - mHeightOverride = retCtrl->getHeight(); + mHeightOverride = retCtrl->getHeight() + 6; return retCtrl; } @@ -2237,7 +2331,7 @@ GuiControl* GuiInspectorTypeMatrixRotation::constructEditControl() addObject(mPasteButton); mUseHeightOverride = true; - mHeightOverride = retCtrl->getHeight(); + mHeightOverride = retCtrl->getHeight() + 6; return retCtrl; } diff --git a/Engine/source/gui/editor/guiInspectorTypes.h b/Engine/source/gui/editor/guiInspectorTypes.h index 4616a590d..31b21a186 100644 --- a/Engine/source/gui/editor/guiInspectorTypes.h +++ b/Engine/source/gui/editor/guiInspectorTypes.h @@ -652,6 +652,32 @@ public: virtual bool updateRects(); }; +//----------------------------------------------------------------------------- +// TypePoint2F GuiInspectorField Class +//----------------------------------------------------------------------------- + +class GuiInspectorTypePoint2F : public GuiInspectorType2DValue +{ +private: + typedef GuiInspectorType2DValue Parent; +public: + DECLARE_CONOBJECT(GuiInspectorTypePoint2F); + static void consoleInit(); + virtual GuiControl* constructEditControl(); +}; + +class GuiInspectorTypePoint2I : public GuiInspectorTypePoint2F +{ +private: + typedef GuiInspectorTypePoint2F Parent; +public: + DECLARE_CONOBJECT(GuiInspectorTypePoint2I); + static void consoleInit(); + virtual GuiControl* constructEditControl(); +}; + + + //----------------------------------------------------------------------------- // TypePoint3F GuiInspectorField Class //-----------------------------------------------------------------------------