Skip to content
42 changes: 42 additions & 0 deletions GeneralsMD/Code/Tools/WorldBuilder/include/BrushTool.h
Original file line number Diff line number Diff line change
Expand Up @@ -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};

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);
Expand All @@ -48,9 +74,19 @@ 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);

public:
virtual void mouseDown(TTrackingMode m, CPoint viewPt, WbView* pView, CWorldBuilderDoc *pDoc);
Expand All @@ -60,4 +96,10 @@ class BrushTool : public Tool
virtual void activate(); ///< Become the current tool.
virtual Bool followsTerrain(void) {return false;};

protected:
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();
};
1 change: 1 addition & 0 deletions GeneralsMD/Code/Tools/WorldBuilder/include/DrawObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ class DrawObject : public RenderObjClass
static void enableFeedback(void) {m_disableFeedback = false;};
static Bool isFeedbackEnabled(void) { return !m_disableFeedback;};
static void setFeedbackPos(Coord3D pos);
static Coord3D getFeedbackPos() { return m_feedbackPoint; }

static void setWaypointDragFeedback(const Coord3D &start, const Coord3D &end);
static void setRampFeedbackParms(const Coord3D *start, const Coord3D *end, Real rampWidth);
Expand Down
9 changes: 9 additions & 0 deletions GeneralsMD/Code/Tools/WorldBuilder/include/WorldBuilderView.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ class CWorldBuilderView : public WbView
CPoint m_scrollMin; ///< The minimum scrollbar positions.
CPoint m_scrollMax; ///< The maximum scroll bar positions.

// Brush mode hint flicker reduction
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the second place I see in this review that does flicker reduction. Is this a common problem in World Builder text rendering? I wonder if there should be a systemic fix for this or some helper class that allows for easy fix for any new screen text that is added.

Because adding these 4 members for every text or class that has this issue looks quite a bit verbose.

Int m_lastBrushMode; ///< Last brush mode drawn (for flicker reduction)
CRect m_lastHintRect; ///< Last hint rectangle drawn (for flicker reduction)
CPoint m_lastHintPos; ///< Last hint position (for flicker reduction)
Bool m_hintDrawnThisPaint; ///< Flag to prevent double-drawing in same paint cycle

protected:

/// Draw a texture bitmap in a rectangle in the dc.
Expand All @@ -98,6 +104,9 @@ class CWorldBuilderView : public WbView
/// Draw the object's icon in the dc at a given point.
void drawObjectInView(CDC *pDc, MapObject *pMapObj);

/// Draw brush mode hint on canvas
void drawBrushModeHint(CDC *pDc, CRgn *pUpdateRgn = NULL);

public:
/// Get the current draw size in pixels in the 2d window of one height map cell.
Int getCellSize(void) {return m_cellSize;}
Expand Down
20 changes: 19 additions & 1 deletion GeneralsMD/Code/Tools/WorldBuilder/include/brushoptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,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=1,
MAX_RAISE_LOWER=21,
MIN_SMOOTH_RADIUS=1,
MAX_SMOOTH_RADIUS=5,
MIN_SMOOTH_RATE=1,
MAX_SMOOTH_RATE=10};

BrushOptions(CWnd* pParent = NULL); // standard constructor

Expand Down Expand Up @@ -64,6 +70,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()

Expand All @@ -72,16 +81,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:

Expand Down
5 changes: 4 additions & 1 deletion GeneralsMD/Code/Tools/WorldBuilder/include/wbview.h
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,13 @@ class WbView : public CView
afx_msg void OnShowTerrain();
afx_msg void OnUpdateShowTerrain(CCmdUI* pCmdUI);
afx_msg int OnCreate(LPCREATESTRUCT lpcs);

afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint point);

//}}AFX_MSG
DECLARE_MESSAGE_MAP()

protected:
Bool handleBrushMouseWheel(UINT nFlags, short zDelta);
};

/////////////////////////////////////////////////////////////////////////////
Expand Down
8 changes: 8 additions & 0 deletions GeneralsMD/Code/Tools/WorldBuilder/include/wbview3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ class WbView3d : public WbView, public DX8_CleanupHook
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnDestroy();
Expand Down Expand Up @@ -216,6 +217,12 @@ class WbView3d : public WbView, public DX8_CleanupHook
Int m_pickPixels;
Int m_partialMapSize;

// Brush mode hint flicker reduction
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this flicker reduction stuff? Why does it flicker?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The hint on-screen text would draw twice, originally with a black rectangle window, then with just the text. The overlap would create flicker when the mouse position was recalculated.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any original on-screen text in World Builder that is treated identical to this, with these kind of 4 member variables, to fix flickering?

Int m_lastBrushMode; ///< Last brush mode drawn (for flicker reduction)
RECT m_lastHintRect; ///< Last hint rectangle drawn (for flicker reduction)
CPoint m_lastHintPos; ///< Last hint position (for flicker reduction)
Bool m_hintDrawnThisFrame; ///< Flag to prevent double-drawing in same frame

protected:

UINT getLastDrawTime();
Expand All @@ -225,6 +232,7 @@ class WbView3d : public WbView, public DX8_CleanupHook
void drawCircle( HDC hdc, const Coord3D & centerPoint, Real radius, COLORREF color );
void drawLabels(HDC hdc);
void drawLabels(void);
void drawBrushModeHint(HDC hdc);
void shutdownWW3D();
void killTheTimer();
void render();
Expand Down
33 changes: 25 additions & 8 deletions GeneralsMD/Code/Tools/WorldBuilder/res/WorldBuilder.rc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
Copy link

Choose a reason for hiding this comment

The 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?

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
Expand Down
4 changes: 4 additions & 0 deletions GeneralsMD/Code/Tools/WorldBuilder/res/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@
#define IDC_PSEd_Color1 1031
#define IDC_FEATHER_LABEL 1032
#define IDC_WIDTH_LABEL3 1032
#define IDC_RAISELOWER_EDIT 1800
#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
Expand Down
Loading