// 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_PICK
#define R2_TOOL_PICK
#include "tool.h"
#include "editor.h"
//
#include "nel/misc/smart_ptr.h"
namespace R2
{
/** Tool to select an instance in scene / in the component feature list / in the world map
* The tool can possibly select a position in scene if there's not entity
* under the mouse.
*/
class CToolPick : public CTool
{
public:
// build a new pick tool with the given CPicker interface (should not be NULL or assert)
CToolPick(
const std::string &cursCanPickInstance = "r2ed_tool_can_pick.tga",
const std::string &cursCannotPickInstance = "curs_stop.tga",
const std::string &cursCanPickPos = "r2ed_tool_pick.tga",
const std::string &cursCannotPickPos = "r2ed_tool_pick.tga",
bool wantMouseUp = false
);
// from CTool
virtual const char *getToolUIName() const { return ""; } // by default, no associated icon in the ui
virtual bool isCreationTool() const { return false; }
virtual bool isPickTool() const { return true; }
virtual void updateAfterRender();
virtual bool onMouseRightButtonClicked();
virtual bool onMouseLeftButtonDown();
virtual bool onMouseLeftButtonClicked();
virtual void cancel() {}
void setIgnoreInstances(const std::string & ignoreInstances);
//////////////////
// FOR DERIVERS //
//////////////////
// Called by the picker tool when an instance has been selected
virtual void pick(CInstance &instance) = 0;
// Called by the picker tool when a position has been selecte
virtual void pick(const NLMISC::CVector &pos) = 0;
/** Called when the picking action has been canceled.
* Default behaviour is to restore the default tool
*/
virtual void cancelPick() { getEditor().setCurrentTool(NULL); }
// Test to see if an instance is 'pickable' (default is yes)
virtual bool canPick(const CInstance &/* instance */) const { return true; }
// lua exports
/** Export the pick method to lua.
* We need to expose this to lua, because there's no way
* to route user events of the ui to the current editor tool.
* So to maintain UI abstraction we use 2 steps :
* CTool::checkInstanceUnderMouse() is called -> if no collision is found in scene or in world map, a call
* is made into lua to retrieve ui instance over which the mouse is. Then the mouse cursor is updated ifthat instance is 'pickable'
* On a mouse button click, lua check that the current tool is a picking tool. If so, then
* lua code call the 'pick' method exported below to do the selection.
*/
int luaPick(CLuaState &ls);
int luaCanPick(CLuaState &ls);
//
REFLECT_EXPORT_START(R2::CToolPick, R2::CTool)
REFLECT_LUA_METHOD("pick", luaPick);
REFLECT_LUA_METHOD("canPick", luaCanPick); // return true if the curent instance under the mouse can be selected
REFLECT_EXPORT_END
private:
std::string _CursCanPickPos;
std::string _CursCannotPickPos;
std::string _CursCanPickInstance;
std::string _CursCannotPickInstance;
CInstance::TRefPtr _CandidateInstance;
NLMISC::CVector _Intersection;
bool _ValidPos;
bool _WantMouseUp;
std::vector _IgnoreInstances;
private:
bool validate();
};
} // R2
#endif