From 3f9686eaede746d3fb6d4a022b1242668dbc079d Mon Sep 17 00:00:00 2001 From: false_genesis Date: Sat, 5 Apr 2008 23:47:37 +0000 Subject: [PATCH] * forgot to add files in prev. commit * added BLP related files to vc71 project --- src/Client/GUI/CCursorController.cpp | 137 +++++++++++++++++++++++++++ src/Client/GUI/CCursorController.h | 59 ++++++++++++ src/PseuWoW.vcproj | 12 +++ 3 files changed, 208 insertions(+) create mode 100644 src/Client/GUI/CCursorController.cpp create mode 100644 src/Client/GUI/CCursorController.h diff --git a/src/Client/GUI/CCursorController.cpp b/src/Client/GUI/CCursorController.cpp new file mode 100644 index 0000000..72a76f0 --- /dev/null +++ b/src/Client/GUI/CCursorController.cpp @@ -0,0 +1,137 @@ +#include "CCursorController.h" + +CCursorController::CCursorController(ICursorControl* irrCursor, IVideoDriver* irrVideoDriver) : +m_pMouseCursor(0), used(0), irrCursorControl(irrCursor), videoDriver(irrVideoDriver) +{ + updateMousePos(); + + setVisible(true); + setOSCursorVisible(false); +} + +CCursorController::~CCursorController() +{ + Clear(); +} + +void CCursorController::setVisible(bool visible) +{ + IsVisible = visible; +} + +bool CCursorController::isVisible() const +{ + return IsVisible; +} + +void CCursorController::setOSCursorVisible(bool visible) +{ + IsOSCursorVisible = visible; +} + +bool CCursorController::isOSCursorVisible() const +{ + return IsOSCursorVisible; +} + +void CCursorController::render() +{ + updateMousePos(); + + if(isVisible() && used) + { + _IRR_DEBUG_BREAK_IF(!m_pMouseCursor); // There isn't any cursor texture loaded + if(m_pMouseCursor) + { + videoDriver->draw2DImage(m_pMouseCursor, + topleft ? position2di(m_MousePos.X,m_MousePos.Y) : position2di(m_MousePos.X - m_pMouseCursor->getSize().Width/2+1, + m_MousePos.Y - m_pMouseCursor->getSize().Height/2+2), + rect(position2di(0,0),m_pMouseCursor->getSize()), + 0, SColor(140,255,255,255), true); + } + } + + if(isOSCursorVisible()) + { + irrCursorControl->setVisible(true); + irrCursorControl->setPosition(irrCursorControl->getPosition()); + } + else + { + irrCursorControl->setVisible(false); + irrCursorControl->setPosition(irrCursorControl->getPosition()); + } +} + +void CCursorController::addMouseCursorTexture(c8* Cursor_file, bool top_left) +{ + m_pMouseCursor = videoDriver->getTexture(Cursor_file); + + bool isAlreadyLoaded = false; + for(u32 i = 0; i < m_aMouseCursors.size() && !isAlreadyLoaded; i++) + { + if(m_aMouseCursors[i].tex->getName() == m_pMouseCursor->getName()) + { + isAlreadyLoaded = !isAlreadyLoaded; + break; + } + } + + if (!isAlreadyLoaded) + { + videoDriver->makeColorKeyTexture(m_pMouseCursor, SColor(255,0,0,0)); + + m_aMouseCursors.push_back(TexBoolPair(m_pMouseCursor,top_left)); + used++; + } + + // So the first loaded cursor will be active + if(used > 0) + setActiveCursor(0); +} + +ITexture* CCursorController::getCursorTexture(u32 index) const +{ + _IRR_DEBUG_BREAK_IF(index>used); // access violation + + return m_aMouseCursors[index].tex; +} + +void CCursorController::removeCursor(u32 index) +{ + _IRR_DEBUG_BREAK_IF(index>used); // access violation + + videoDriver->removeTexture(m_aMouseCursors[index].tex); + m_aMouseCursors.erase(index); + used--; +} + +void CCursorController::setActiveCursor(u32 index) +{ + _IRR_DEBUG_BREAK_IF(index>used); // access violation + + m_pMouseCursor = m_aMouseCursors[index].tex; + topleft = m_aMouseCursors[index].topleft; +} + +void CCursorController::Clear() +{ + for(u32 i = 0; i < m_aMouseCursors.size(); i++) + { + removeCursor(i); + } + + m_aMouseCursors.clear(); +} + +position2di& CCursorController::getMousePos() +{ + return updateMousePos(); +} + +position2di& CCursorController::updateMousePos() +{ + m_MousePos = irrCursorControl->getPosition(); + + return m_MousePos; +} diff --git a/src/Client/GUI/CCursorController.h b/src/Client/GUI/CCursorController.h new file mode 100644 index 0000000..e573316 --- /dev/null +++ b/src/Client/GUI/CCursorController.h @@ -0,0 +1,59 @@ +// Copyright (c) 2007-2008 Tomer Nosrati +// This file is part of the "NUSoftware Game Engine". +// For conditions of distribution and use, see copyright notice in nge.h + +#ifndef __C_CURSOR_H__ +#define __C_CURSOR_H__ + +#include "irrlicht/irrlicht.h" + +using namespace irr; +using namespace irr::core; +using namespace irr::gui; +using namespace irr::scene; +using namespace irr::video; + +//! Cursor controller v0.2 +/*! This class controls the cursor. You can choose to use the OS's cursor, a custom +cursor or both. You can also have many custom cursors and switch between them easily. +*/ +class CCursorController +{ + struct TexBoolPair + { + TexBoolPair(ITexture *t, bool tl) { tex = t; topleft = tl; } + ITexture *tex; + bool topleft; + }; +public: + CCursorController(ICursorControl* irrCursor, IVideoDriver* irrVideoDriver); + ~CCursorController(); + + void setVisible(bool visible); + bool isVisible() const; + void setOSCursorVisible(bool visible); + bool isOSCursorVisible() const; + + void render(); + void addMouseCursorTexture(c8* Cursor_file, bool top_left = false); + ITexture* getCursorTexture(u32 index) const; + void removeCursor(u32 index); + void setActiveCursor(u32 index); + void Clear(); + position2di& getMousePos(); + +private: + position2di& updateMousePos(); + + bool IsOSCursorVisible; + bool IsVisible; + bool topleft; + position2di m_MousePos; + ICursorControl* irrCursorControl; + IVideoDriver* videoDriver; + array m_aMouseCursors; + ITexture* m_pMouseCursor; + + u32 used; +}; +#endif // __C_CURSOR_H__ diff --git a/src/PseuWoW.vcproj b/src/PseuWoW.vcproj index ef7f51b..5dd6018 100644 --- a/src/PseuWoW.vcproj +++ b/src/PseuWoW.vcproj @@ -423,6 +423,12 @@ + + + + @@ -471,6 +477,12 @@ + + + +