2010-05-06 00:08:41 +00:00
|
|
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
|
|
// 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
#include "stdpch.h"
|
|
|
|
//
|
|
|
|
/*
|
|
|
|
#include "tool_draw_road.h"
|
|
|
|
#include "game_share/object.h"
|
|
|
|
#include "dmc/idmc.h"
|
|
|
|
#include "editor.h"
|
|
|
|
//
|
|
|
|
#include "nel/misc/vectord.h"
|
|
|
|
|
|
|
|
|
|
|
|
using namespace NLMISC;
|
|
|
|
|
|
|
|
namespace R2
|
|
|
|
{
|
|
|
|
|
2010-06-10 09:50:19 +00:00
|
|
|
// ***************************************************************
|
2010-05-06 00:08:41 +00:00
|
|
|
CToolDrawRoad::CToolDrawRoad()
|
|
|
|
{
|
|
|
|
_NumWayPoints = 0;
|
|
|
|
_ValidPos = false;
|
|
|
|
}
|
|
|
|
|
2010-06-10 09:50:19 +00:00
|
|
|
// ***************************************************************
|
2010-05-06 00:08:41 +00:00
|
|
|
void CToolDrawRoad::updateAfterRender()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void CToolDrawRoad::cancel()
|
|
|
|
{
|
|
|
|
// no-op there
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-10 09:50:19 +00:00
|
|
|
// ***************************************************************
|
2010-05-06 00:08:41 +00:00
|
|
|
void CToolDrawRoad::updateBeforeRender()
|
|
|
|
{
|
|
|
|
// Build vector for direction pointed by mouse in world
|
|
|
|
sint32 mouseX, mouseY;
|
|
|
|
getMousePos(mouseX, mouseY);
|
|
|
|
if (!isInScreen(mouseX, mouseY))
|
|
|
|
{
|
|
|
|
// mouse not in screen so don't display the last way point
|
|
|
|
_WayPoints.resize(_NumWayPoints);
|
|
|
|
_Road.setWayPoints(_WayPoints, true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
CTool::CWorldViewRay worldViewRay;
|
|
|
|
//
|
|
|
|
computeWorldViewRay(mouseX, mouseY, worldViewRay);
|
|
|
|
//
|
|
|
|
CVector wpPos; // the pos where the ghost will be shown
|
|
|
|
CVector inter; // intersection of view ray with landscape
|
|
|
|
_ValidPos = false;
|
|
|
|
switch(computeLandscapeRayIntersection(worldViewRay, inter))
|
|
|
|
{
|
|
|
|
case NoIntersection:
|
|
|
|
if (worldViewRay.OnMiniMap)
|
|
|
|
{
|
|
|
|
_WayPoints.resize(_NumWayPoints);
|
|
|
|
_Road.setWayPoints(_WayPoints, true);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// no collision, can't drop entity
|
|
|
|
wpPos = worldViewRay.Origin + 3.f * worldViewRay.Dir;
|
|
|
|
break;
|
|
|
|
case ValidPacsPos:
|
|
|
|
wpPos = inter;
|
|
|
|
_ValidPos = true; // good pos to drop entity
|
|
|
|
break;
|
|
|
|
case InvalidPacsPos:
|
|
|
|
wpPos = inter;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
nlassert(0);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
_WayPoints.resize(_NumWayPoints + 1);
|
|
|
|
_WayPoints.back() = wpPos;
|
|
|
|
_Road.setWayPoints(_WayPoints, _ValidPos);
|
|
|
|
// change mouse depending on result
|
|
|
|
if (!isMouseOnUI())
|
|
|
|
{
|
|
|
|
setMouseCursor(_ValidPos ? "curs_create.tga" : "curs_stop.tga");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
setMouseCursor("curs_create.tga");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-10 09:50:19 +00:00
|
|
|
// ***************************************************************
|
2010-05-06 00:08:41 +00:00
|
|
|
bool CToolDrawRoad::onMouseLeftButtonClicked()
|
|
|
|
{
|
|
|
|
if (_ValidPos)
|
|
|
|
{
|
|
|
|
++ _NumWayPoints;
|
|
|
|
}
|
|
|
|
startDoubleClickCheck();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-06-10 09:50:19 +00:00
|
|
|
// ***************************************************************
|
2010-05-06 00:08:41 +00:00
|
|
|
bool CToolDrawRoad::onMouseLeftButtonDown()
|
|
|
|
{
|
|
|
|
if (!checkDoubleClick()) return false;
|
|
|
|
_WayPoints.resize(_NumWayPoints);
|
|
|
|
if (_WayPoints.empty()) return true;
|
|
|
|
// send network command to create a new road
|
|
|
|
CObject *desc = getDMC().newComponent("Road");
|
|
|
|
if (desc)
|
|
|
|
{
|
|
|
|
static volatile bool wantDump = false;
|
|
|
|
if (wantDump)
|
|
|
|
{
|
|
|
|
desc->dump();
|
|
|
|
}
|
|
|
|
CObject *points = desc->getAttr("Points");
|
|
|
|
if (points)
|
|
|
|
{
|
|
|
|
for(uint k = 0; k < _WayPoints.size(); ++k)
|
|
|
|
{
|
|
|
|
CObject *wp = getDMC().newComponent("WayPoint");
|
|
|
|
if (!wp) continue;
|
|
|
|
wp->setObject("Position", buildVector(CVectorD(_WayPoints[k])));
|
|
|
|
points->insert("", wp, -1);
|
|
|
|
if (wantDump)
|
|
|
|
{
|
|
|
|
desc->dump();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// send creation command
|
|
|
|
// tmp : static npc counter
|
|
|
|
static int roadCounter = 0;
|
|
|
|
// add in component list of default feature
|
|
|
|
if (getEditor().getDefaultFeature())
|
|
|
|
{
|
|
|
|
getDMC().requestInsertNode(getEditor().getDefaultFeature()->getId(),
|
|
|
|
"Components",
|
|
|
|
-1,
|
|
|
|
toString("ROAD_%d", roadCounter++),
|
|
|
|
desc);
|
|
|
|
}
|
|
|
|
//
|
|
|
|
delete desc;
|
|
|
|
}
|
|
|
|
getEditor().setCurrentTool(NULL);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-10 09:50:19 +00:00
|
|
|
// ***************************************************************
|
2010-05-06 00:08:41 +00:00
|
|
|
bool CToolDrawRoad::onMouseRightButtonClicked()
|
|
|
|
{
|
|
|
|
// cancel the drawing
|
|
|
|
getEditor().setCurrentTool(NULL);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // R2
|
|
|
|
*/
|