// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef R2_TOOL_CHOOSE_POS_H #define R2_TOOL_CHOOSE_POS_H #include "tool.h" #include "../decal.h" #include "prim_render.h" #include "nel/misc/vector.h" #include "nel/misc/polygon.h" class CEntity; class CEntityCL; class CLuaObject; namespace R2 { /** * Tool to choose a position on landscape, with transparent entity drawn under the mouse * A transparent version of the entity to be created is drawn under the mouse * at the chosen position. * Additionnally, a set of zone can be created to choose the pos. These zone must be at a valid * position on the map to allow validation * */ class CToolChoosePos : public CTool { public: CToolChoosePos() { nlassert(0); } enum TAction { NoAction, SelectPos, Cancel }; // CToolChoosePos(sint ghostSlot, const std::string &cursValid = "curs_create.tga", const std::string &cursInvalid = "curs_stop.tga", const std::vector &polyList = std::vector(), const CPrimLook &polyValidLook = CPrimLook(), const CPrimLook &polyInvalidLook = CPrimLook() ); /** Init for multiple pos selection (for the creation tool) * Multiple position can be chosen by holding 'shift' down */ void enableMultiPos(const std::string &cursValidMulti = "curs_create_multi.tga"); bool isMultiPos() const { return _MultiPos; } // force multi-creation to be used by default (no need for the shift key down) void lockMultiPos() { _MultiPosLocked = true; } // {} ~CToolChoosePos(); // from CTool virtual const char *getToolUIName() const { return ""; } virtual bool isCreationTool() const { return true; } virtual void updateAfterRender(); virtual void updateBeforeRender(); virtual bool onMouseLeftButtonClicked(); virtual bool onMouseRightButtonClicked(); virtual void cancel(); /** Update the cursor on the ui. Depending on the context the cursor * may take different shapes (for example, it wouldn't show a 'stop' cursor when * the palette is under and one has just selected an object to drop) */ virtual void updateInvalidCursorOnUI(); protected: std::string _CursValid; std::string _CursValidMulti; std::string _CursInvalid; bool _Valid; NLMISC::CVector _CreatePosition; private: CDecal _BadPlaceDecal; CDecal _TestDecal; bool _MultiPos; bool _MultiPosLocked; float _CreateAngle; TAction _WantedAction; bool _WarningNoMeshOrSkeletonShown; NLMISC::CVector _DefaultScale; float _LocalSelectBoxSize; std::vector _PolyList; std::vector _PolyRender; CPrimLook _PolyValidLook; CPrimLook _PolyInvalidLook; protected: sint _GhostSlot; protected: CEntityCL *getGhost(); // for derivers virtual void commit(const NLMISC::CVector &createPosition, float createAngle) = 0; virtual bool stopAfterCommit() const { return true; } /** For derivers : additionnal checking can be done on the pos to choose * Pos must at least be a valid pacs pos */ virtual bool isValidChoosePos(const NLMISC::CVector2f &pos) const { return isValid2DPos(pos); } void removeGhostSlot(); private: void hideMapSelectionAxis(); void showPolys(bool visible); }; } // R2 #endif