-
Notifications
You must be signed in to change notification settings - Fork 124
feature(WorldBuilder): add all operation modes to single brush tool #1910
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
b70665c
02ac220
a6110ad
14299cc
f5cae0f
dc80a61
f57f9bd
2118634
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -31,14 +31,40 @@ class WorldHeightMapEdit; | |
| /// Height brush tool. | ||
| class BrushTool : public Tool | ||
| { | ||
| public: | ||
| enum { | ||
| MIN_RAISE_LOWER = 1, | ||
| MAX_RAISE_LOWER = 21, | ||
| MIN_SMOOTH_RADIUS = 1, | ||
| MAX_SMOOTH_RADIUS = 5, | ||
| MIN_SMOOTH_RATE = 1, | ||
| MAX_SMOOTH_RATE = 10 | ||
| }; | ||
|
|
||
| enum EBrushMode { | ||
| BRUSH_MODE_RAISE, | ||
| BRUSH_MODE_LOWER, | ||
| BRUSH_MODE_SET, | ||
| BRUSH_MODE_SMOOTH | ||
| }; | ||
|
|
||
| protected: | ||
| enum {MIN_DELAY_TIME = 60}; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this name is too generic. I would suggest to add what the delay time is for in the name. |
||
|
|
||
| WorldHeightMapEdit *m_htMapEditCopy; ///< ref counted. | ||
| WorldHeightMapEdit *m_htMapFeatherCopy; ///< ref counted. | ||
| WorldHeightMapEdit *m_htMapRateCopy; ///< ref counted (smooth mode). | ||
|
|
||
| static Int m_brushWidth; | ||
| static Int m_brushFeather; | ||
| static Bool m_brushSquare; | ||
| static Int m_brushHeight; | ||
| static Int m_raiseLowerAmount; | ||
| static Int m_smoothRadius; | ||
| static Int m_smoothRate; | ||
|
|
||
| EBrushMode m_activeMode; | ||
| Int m_lastMoveTime; | ||
|
|
||
| public: | ||
| BrushTool(void); | ||
|
|
@@ -48,9 +74,68 @@ class BrushTool : public Tool | |
| static Int getWidth(void) {return m_brushWidth;}; ///<Returns width. | ||
| static Int getFeather(void) {return m_brushFeather;}; ///<Returns feather. | ||
| static Int getHeight(void) {return m_brushHeight;}; ///<Returns height. | ||
| static Int getRaiseLowerAmount(void) {return m_raiseLowerAmount;}; | ||
| static Int getSmoothRadius(void) {return m_smoothRadius;}; | ||
| static Int getSmoothRate(void) {return m_smoothRate;}; | ||
| static void setWidth(Int width); | ||
| static void setFeather(Int feather); | ||
| static void setHeight(Int height); | ||
| static void setRaiseLowerAmount(Int amount); | ||
| static void setSmoothRadius(Int radius); | ||
| static void setSmoothRate(Int rate); | ||
| static EBrushMode getModeFromModifiers(Bool shiftDown, Bool ctrlDown); | ||
| static EBrushMode getPreviewModeFromKeys(); | ||
| static const char* getModeDisplayName(EBrushMode mode); | ||
| static void getModeHintStrings(char *primaryBuf, Int primaryBufSize, char *secondaryBuf, Int secondaryBufSize); | ||
|
|
||
| // Helper functions for brush hint drawing (shared between 2D and 3D views) | ||
| struct BrushHintInfo { | ||
| Bool shouldShow; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
reading further, the only case it is used is |
||
| Bool shouldClear; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't understand the difference between
|
||
| EBrushMode currentMode; | ||
| Int modeInt; | ||
| CPoint hintPos; | ||
| }; | ||
| static Bool getBrushHintInfo(BrushHintInfo &info, char *hintTextBuf, Int hintTextBufSize, const CPoint &hintPos, Int lastBrushMode); | ||
|
|
||
| // Shared smoothing algorithm function (processes a single cell) | ||
| static void applySmoothingAlgorithm( | ||
| WorldHeightMapEdit *editMap, | ||
| WorldHeightMapEdit *featherMap, | ||
| Int i, Int j, | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I presume these are cell coordinates? Then cellX and cellY would be better. |
||
| Int rate, | ||
| Int smoothRadius, | ||
| Int minRadius, | ||
| Int maxRadius, | ||
| CWorldBuilderDoc *pDoc); | ||
|
|
||
| // Shared brush iteration with rate accumulation - returns true if rate buffer overflow occurred | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. returning |
||
| static Bool applyBrushWithRateAccumulation( | ||
| WorldHeightMapEdit *editMap, | ||
| WorldHeightMapEdit *featherMap, | ||
| WorldHeightMapEdit *rateMap, | ||
| const CPoint &ndx, | ||
| Int brushWidth, | ||
| Int rateMultiplier, | ||
| Int smoothRadius, | ||
| Int minRadius, | ||
| Int maxRadius, | ||
| CWorldBuilderDoc *pDoc); | ||
|
|
||
| // Shared rate buffer reset | ||
| static void resetSmoothingBuffers( | ||
| WorldHeightMapEdit *editMap, | ||
| WorldHeightMapEdit *featherMap, | ||
| WorldHeightMapEdit *rateMap); | ||
|
|
||
| // Helper to create a partial range for height map updates | ||
| static IRegion2D makePartialRange(const CPoint &ndx, Int brushWidth); | ||
|
|
||
| // Helper to calculate blend factor (square or round) | ||
| static Real calcBlendFactor(const CPoint &ndx, Int i, Int j, Int width, Int feather, Bool square); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would name it A boolean should be named in a way that is clear it is a boolean, e.g. |
||
|
|
||
| // Helper to get effective brush width including feather | ||
| static Int getEffectiveBrushWidth(Int baseWidth, Int feather); | ||
|
|
||
| public: | ||
| virtual void mouseDown(TTrackingMode m, CPoint viewPt, WbView* pView, CWorldBuilderDoc *pDoc); | ||
|
|
@@ -60,4 +145,10 @@ class BrushTool : public Tool | |
| virtual void activate(); ///< Become the current tool. | ||
| virtual Bool followsTerrain(void) {return false;}; | ||
|
|
||
| protected: | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think these can be made private |
||
| EBrushMode determineBrushMode() const; | ||
| void applySetHeightBrush(const CPoint &ndx, Int brushWidth, CWorldBuilderDoc *pDoc); | ||
| void applyRaiseLowerBrush(const CPoint &ndx, Int brushWidth, Bool raising, CWorldBuilderDoc *pDoc); | ||
| void applySmoothBrush(const CPoint &ndx, Int brushWidth, CWorldBuilderDoc *pDoc); | ||
| void resetSmoothRateBuffer(); | ||
| }; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -23,6 +23,7 @@ | |
|
|
||
| #include "WBPopupSlider.h" | ||
| #include "OptionsPanel.h" | ||
| #include "BrushTool.h" | ||
| ///////////////////////////////////////////////////////////////////////////// | ||
| /// BrushOptions modeless (floating) dialog - allows entry and display of brush width and feather. | ||
|
|
||
|
|
@@ -35,7 +36,13 @@ class BrushOptions : public COptionsPanel , public PopupSliderOwner | |
| FREQ_BRUSH_TICKS=10, | ||
| MIN_FEATHER=0, | ||
| FREQ_FEATHER_TICKS=4, | ||
| MAX_FEATHER=20}; | ||
| MAX_FEATHER=20, | ||
| MIN_RAISE_LOWER = BrushTool::MIN_RAISE_LOWER, | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are these even used anywhere? I can only find usage of BrushTool:: |
||
| MAX_RAISE_LOWER = BrushTool::MAX_RAISE_LOWER, | ||
| MIN_SMOOTH_RADIUS = BrushTool::MIN_SMOOTH_RADIUS, | ||
| MAX_SMOOTH_RADIUS = BrushTool::MAX_SMOOTH_RADIUS, | ||
| MIN_SMOOTH_RATE = BrushTool::MIN_SMOOTH_RATE, | ||
| MAX_SMOOTH_RATE = BrushTool::MAX_SMOOTH_RATE}; | ||
|
|
||
| BrushOptions(CWnd* pParent = NULL); // standard constructor | ||
|
|
||
|
|
@@ -64,6 +71,9 @@ class BrushOptions : public COptionsPanel , public PopupSliderOwner | |
| afx_msg void OnChangeFeatherEdit(); | ||
| afx_msg void OnChangeSizeEdit(); | ||
| afx_msg void OnChangeHeightEdit(); | ||
| afx_msg void OnChangeRaiseLowerEdit(); | ||
| afx_msg void OnChangeSmoothRadiusEdit(); | ||
| afx_msg void OnChangeSmoothRateEdit(); | ||
| //}}AFX_MSG | ||
| DECLARE_MESSAGE_MAP() | ||
|
|
||
|
|
@@ -72,16 +82,25 @@ class BrushOptions : public COptionsPanel , public PopupSliderOwner | |
| static Int m_currentWidth; ///< current brush width in the ui. | ||
| static Int m_currentFeather; ///< current feather width in the ui. | ||
| static Int m_currentHeight; | ||
| static Int m_currentRaiseLower; | ||
| static Int m_currentSmoothRadius; | ||
| static Int m_currentSmoothRate; | ||
|
|
||
| Bool m_updating; ///<true if the ui is updating itself. | ||
| WBPopupSliderButton m_brushWidthPopup; | ||
| WBPopupSliderButton m_brushFeatherPopup; | ||
| WBPopupSliderButton m_brushHeightPopup; | ||
| WBPopupSliderButton m_raiseLowerPopup; | ||
| WBPopupSliderButton m_smoothRadiusPopup; | ||
| WBPopupSliderButton m_smoothRatePopup; | ||
|
|
||
| public: | ||
| static void setWidth(Int width); | ||
| static void setFeather(Int feather); | ||
| static void setHeight(Int height); | ||
| static void setRaiseLowerAmount(Int amount); | ||
| static void setSmoothRadius(Int radius); | ||
| static void setSmoothRate(Int rate); | ||
|
|
||
| public: | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -494,7 +494,7 @@ BEGIN | |
| CONTROL "",ID_SLIDER,"Static",SS_BLACKFRAME,0,1,19,62 | ||
| END | ||
|
|
||
| IDD_BRUSH_OPTIONS DIALOG DISCARDABLE 0, 0, 118, 138 | ||
| IDD_BRUSH_OPTIONS DIALOG DISCARDABLE 0, 0, 118, 300 | ||
| STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | ||
| CAPTION "Height Brush Options" | ||
| FONT 8, "MS Sans Serif" | ||
|
|
@@ -504,16 +504,33 @@ BEGIN | |
| EDITTEXT IDC_FEATHER_EDIT,71,55,17,12,ES_AUTOHSCROLL | ||
| RTEXT "Size in cells:",IDC_STATIC,24,56,39,10 | ||
| PUSHBUTTON "1",IDC_SIZE_POPUP,93,11,8,12,BS_BITMAP | ||
| GROUPBOX "Brush Width:",IDC_STATIC,1,1,113,34 | ||
| GROUPBOX "Brush Feather Width:",IDC_STATIC,1,43,113,39 | ||
| GROUPBOX "Brush Width (Shift + Scroll Wheel):",IDC_STATIC,1,1,113,34 | ||
| GROUPBOX "Brush Feather Width (Ctrl + Scroll Wheel):",IDC_STATIC,1,43,113,39 | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I suspect there is no other way to tell about key mappings other than hard coding into strings? How do we know to update these strings when changing key mappings? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don' think so. This is also consistent with the rest of the file. Lots of hardcoded key mappings. |
||
| PUSHBUTTON "1",IDC_FEATHER_POPUP,93,55,8,12,BS_BITMAP | ||
| LTEXT "35 FT.",IDC_WIDTH_LABEL,71,24,43,8 | ||
| LTEXT "35 FT.",IDC_HEIGHT_LABEL,71,120,36,8 | ||
| GROUPBOX "Brush Height:",IDC_STATIC,1,90,113,45 | ||
| EDITTEXT IDC_HEIGHT_EDIT,71,105,17,12,ES_AUTOHSCROLL | ||
| RTEXT "Size in 1/8 cells:",IDC_STATIC,0,107,63,10 | ||
| PUSHBUTTON "1",IDC_HEIGHT_POPUP,93,106,8,12,BS_BITMAP | ||
| LTEXT "35 FT.",IDC_FEATHER_LABEL,71,68,41,8 | ||
| GROUPBOX "Raise / Lower Amount (LMB / Shift+LMB):",IDC_STATIC,1,90,113,34 | ||
| EDITTEXT IDC_RAISELOWER_EDIT,71,105,17,12,ES_AUTOHSCROLL | ||
| RTEXT "Amount:",IDC_STATIC,23,106,40,8 | ||
| PUSHBUTTON "1",IDC_RAISELOWER_POPUP,93,105,8,12,BS_BITMAP | ||
| LTEXT "0.0 FEET.",IDC_RAISELOWER_LABEL,71,118,43,8 | ||
| GROUPBOX "Set Height (Ctrl + LMB):",IDC_STATIC,1,132,113,34 | ||
| EDITTEXT IDC_HEIGHT_EDIT,71,147,17,12,ES_AUTOHSCROLL | ||
| RTEXT "Size in 1/8 cells:",IDC_STATIC,0,149,63,10 | ||
| PUSHBUTTON "1",IDC_HEIGHT_POPUP,93,148,8,12,BS_BITMAP | ||
| LTEXT "35 FT.",IDC_HEIGHT_LABEL,71,160,36,8 | ||
| GROUPBOX "Smooth (Ctrl + Shift + LMB):",IDC_STATIC,1,174,113,50 | ||
| EDITTEXT IDC_RADIUS_EDIT,71,189,17,12,ES_AUTOHSCROLL | ||
| RTEXT "Radius:",IDC_STATIC,23,190,40,8 | ||
| PUSHBUTTON "1",IDC_RADIUS_POPUP,93,189,8,12,BS_BITMAP | ||
| EDITTEXT IDC_RATE_EDIT,71,205,17,12,ES_AUTOHSCROLL | ||
| RTEXT "Rate:",IDC_STATIC,23,206,40,8 | ||
| PUSHBUTTON "1",IDC_RATE_POPUP,93,205,8,12,BS_BITMAP | ||
| GROUPBOX "Brush Modes:",IDC_STATIC,1,232,113,65 | ||
| LTEXT "LMB - Raise Height",IDC_STATIC,5,242,108,8 | ||
| LTEXT "Shift + LMB - Lower Height",IDC_STATIC,5,252,108,8 | ||
| LTEXT "Ctrl + LMB - Set Height",IDC_STATIC,5,262,108,8 | ||
| LTEXT "Ctrl + Shift + LMB - Smooth",IDC_STATIC,5,272,108,8 | ||
| END | ||
|
|
||
| IDD_TERRAIN_MATERIAL DIALOG DISCARDABLE 0, 0, 200, 286 | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -199,6 +199,10 @@ | |
| #define IDC_PSEd_Color1 1031 | ||
| #define IDC_FEATHER_LABEL 1032 | ||
| #define IDC_WIDTH_LABEL3 1032 | ||
| #define IDC_RAISELOWER_EDIT 1800 | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Place them in order of number. Also, why 1800? something like 2000 + comment would be more clear that this is custom superhackers stuff |
||
| #define IDC_RAISELOWER_POPUP 1801 | ||
| #define IDC_RAISELOWER_LABEL 1802 | ||
| #define IDC_MODE_LEGEND 1803 | ||
| #define IDC_TERRAIN_TREEVIEW 1033 | ||
| #define IDC_SLIDER3 1034 | ||
| #define IDC_SWAP_TEXTURES 1035 | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.