This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/wwlib/wwmouse.h

242 lines
7.8 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : Command & Conquer *
* *
* $Archive:: /Commando/Code/Library/wwmouse.h $*
* *
* $Author:: Byon_g $*
* *
* $Modtime:: 8/11/97 10:11a $*
* *
* $Revision:: 2 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef WW_MOUSE_H
#define WW_MOUSE_H
#include "win.h"
#include "xmouse.h"
class BSurface;
/*
** Handles the mouse as it relates to the C&C game engine. It is expected that only
** one object of this type will be created during the lifetime of the game.
*/
class WWMouseClass : public Mouse {
public:
/*
** Private constructor.
*/
WWMouseClass(Surface * surfaceptr, HWND window);
virtual ~WWMouseClass(void);
/*
** Maintenance callback routine.
*/
void Process_Mouse(void);
/*
** Sets the game-drawn mouse imagery.
*/
virtual void Set_Cursor(int xhotspot, int yhotspot, ShapeSet const * cursor, int shape);
/*
** Controls visibility of the game-drawn mouse.
*/
virtual void Hide_Mouse(void);
virtual void Show_Mouse(void);
/*
** Takes control of and releases control of the mouse with
** respect to the operating system. The mouse must be released
** during operations with the operating system. When the mouse is
** relased, it may move outside of the confining rectangle and its
** shape is controlled by the operating sytem.
*/
virtual void Release_Mouse(void);
virtual void Capture_Mouse(void);
virtual bool Is_Captured(void) const {return(IsCaptured);}
/*
** Hide the mouse if it falls within this game screen region.
*/
virtual void Conditional_Hide_Mouse(Rect region);
virtual void Conditional_Show_Mouse(void);
/*
** Query about the mouse visiblity state and location.
*/
virtual int Get_Mouse_State(void) const;
virtual int Get_Mouse_X(void) const {return(MouseX);}
virtual int Get_Mouse_Y(void) const {return(MouseY);}
/*
** Set the mouse location.
*/
virtual void Set_Mouse_XY( int xpos, int ypos );
/*
** The following two routines can be used to render the mouse onto an alternate
** surface.
*/
virtual void Draw_Mouse(Surface * scr, bool issidebarsurface = false);
virtual void Erase_Mouse(Surface * scr, bool issidebarsurface = false);
//virtual void Draw_Mouse(Surface * scr);
//virtual void Erase_Mouse(Surface * scr);
/*
** Converts O/S screen coordinates into game coordinates.
*/
virtual void Convert_Coordinate(int & x, int & y) const;
/*
** Recalculate the confining rectangle from the window.
*/
void Calc_Confining_Rect(void);
private:
/*
** Used to prevent conflict between the processing callback and
** the normal mouse processing routines. The only potential conflict
** would be with the maintenance callback routine. Since this callback
** and the mouse class maintain a strict master/slave relationship, a
** simple critial section flag is all that is needed.
*/
long Blocked;
/*
** Mouse hide/show state. If zero or greater, the mouse is visible. Otherwise
** it is invisible.
*/
long MouseState;
/*
** If the mouse is being managed by this class (for the game), then this flag
** will be true. When the mouse has been released to be managed by the operating
** system, this flag will be false. However, this class will still track the mouse
** position.
*/
bool IsCaptured;
/*
** This is the last recorded mouse position that it was drawn to.
*/
int MouseX;
int MouseY;
/*
** Points to the main display surface that the mouse will be drawn
** to as it moves.
*/
Surface * SurfacePtr;
/*
** This is the window handle that is used to bind and bias the mouse
** position and drawing procedures.
*/
HWND Window;
/*
** This specifies the rectangle that the game oriented mouse will be
** confined to on the visible surface. If the mouse is manually drawn
** on another surface, then this rectangle cooresponds to the hidden
** surface area where the mouse is to be drawn.
*/
Rect ConfiningRect;
/*
** This specifies the mouse shape data. It records the shape set
** data as well as the particular image contained within.
*/
ShapeSet const * MouseShape;
int ShapeNumber;
/*
** Specifies the hot spot where the image click maps to. This is an
** offset from the upper left corner of the shape image.
*/
int MouseXHot;
int MouseYHot;
/*
** Holds the background image behind the mouse to be used for
** restoring the surface pixels.
*/
BSurface * Background;
Rect SavedRegion;
/*
** This is the alternate mouse background buffer to be used when the
** mouse is manually drawn to an alternate surface by the Draw_Mouse()
** function.
*/
BSurface * Alternate;
Rect AltRegion;
/*
** This is another alternate buffer for drawing the mouse pointer across a second, adjoining
** offscreen buffer.
*/
BSurface * SidebarAlternate;
Rect SidebarAltRegion;
/*
** Conditional hide mouse bounding rectangle and mouse state
** flag.
*/
Rect ConditionalRect;
int ConditionalState;
/*
** Maintenance timer handle.
*/
MMRESULT TimerHandle;
// Determines if there is valid mouse shape data available.
bool Is_Data_Valid(void) const;
bool Validate_Copy_Buffer(void);
void Save_Background(void);
void Restore_Background(void);
Rect Matching_Rect(void) const;
void Raw_Draw_Mouse(Surface * surface, int xoffset, int yoffset);
void Get_Bounded_Position(int & x, int & y) const;
void Update_Mouse_Position(int x, int y);
void Low_Show_Mouse(void);
void Low_Hide_Mouse(void);
void Block_Mouse(void) {InterlockedIncrement(&Blocked);/*Blocked++;*/}
void Unblock_Mouse(void) {InterlockedDecrement(&Blocked);/*Blocked--;*/}
bool Is_Blocked(void) const {return(Blocked != 0);}
bool Is_Hidden(void) const {return(MouseState < 0);}
};
#endif