📄 edittsctrl.cc
字号:
//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "platform/platform.h"
#include "platform/event.h"
#include "core/dnet.h"
#include "editor/editTSCtrl.h"
#include "sceneGraph/sceneGraph.h"
#include "editor/editor.h"
#include "game/gameConnection.h"
#include "game/gameBase.h"
#include "game/missionArea.h"
#include "console/consoleTypes.h"
#include "terrain/terrData.h"
#include "game/game.h"
#include "game/sphere.h"
#include "gui/core/guiCanvas.h"
IMPLEMENT_CONOBJECT(EditTSCtrl);
//------------------------------------------------------------------------------
Point3F EditTSCtrl::smCamPos;
EulerF EditTSCtrl::smCamRot;
MatrixF EditTSCtrl::smCamMatrix;
F32 EditTSCtrl::smVisibleDistance = 2100.f;
EditTSCtrl::EditTSCtrl() :
mEditManager(0)
{
mRenderMissionArea = true;
mMissionAreaFillColor.set(255,0,0,20);
mMissionAreaFrameColor.set(255,0,0,128);
mConsoleFrameColor.set(255,0,0,255);
mConsoleFillColor.set(255,0,0,120);
mConsoleSphereLevel = 1;
mConsoleCircleSegments = 32;
mConsoleLineWidth = 1;
mRightMousePassThru = true;
mConsoleRendering = false;
}
EditTSCtrl::~EditTSCtrl()
{
}
//------------------------------------------------------------------------------
bool EditTSCtrl::onAdd()
{
if(!Parent::onAdd())
return(false);
// give all derived access to the fields
setModStaticFields(true);
return true;
}
void EditTSCtrl::onRender(Point2I offset, const RectI &updateRect)
{
updateGuiInfo();
Parent::onRender(offset, updateRect);
// We have to do this because of how GuiTSCtrl deals with filters.
if(!mApplyFilterToChildren)
Parent::renderChildControls(offset, updateRect);
}
//------------------------------------------------------------------------------
void EditTSCtrl::initPersistFields()
{
Parent::initPersistFields();
addGroup("Mission Area");
addField("renderMissionArea", TypeBool, Offset(mRenderMissionArea, EditTSCtrl));
addField("missionAreaFillColor", TypeColorI, Offset(mMissionAreaFillColor, EditTSCtrl));
addField("missionAreaFrameColor", TypeColorI, Offset(mMissionAreaFrameColor, EditTSCtrl));
endGroup("Mission Area");
addGroup("Misc");
addField("consoleFrameColor", TypeColorI, Offset(mConsoleFrameColor, EditTSCtrl));
addField("consoleFillColor", TypeColorI, Offset(mConsoleFillColor, EditTSCtrl));
addField("consoleSphereLevel", TypeS32, Offset(mConsoleSphereLevel, EditTSCtrl));
addField("consoleCircleSegments", TypeS32, Offset(mConsoleCircleSegments, EditTSCtrl));
addField("consoleLineWidth", TypeS32, Offset(mConsoleLineWidth, EditTSCtrl));
endGroup("Misc");
}
void EditTSCtrl::consoleInit()
{
Con::addVariable("pref::Editor::visibleDistance", TypeF32, &EditTSCtrl::smVisibleDistance);
}
//------------------------------------------------------------------------------
void EditTSCtrl::make3DMouseEvent(Gui3DMouseEvent & gui3DMouseEvent, const GuiEvent & event)
{
(GuiEvent&)(gui3DMouseEvent) = event;
// get the eye pos and the mouse vec from that...
Point3F sp(event.mousePoint.x, event.mousePoint.y, 1);
Point3F wp;
unproject(sp, &wp);
gui3DMouseEvent.pos = smCamPos;
gui3DMouseEvent.vec = wp - smCamPos;
gui3DMouseEvent.vec.normalize();
}
//------------------------------------------------------------------------------
void EditTSCtrl::getCursor(GuiCursor *&cursor, bool &visible, const GuiEvent &event)
{
make3DMouseEvent(mLastEvent, event);
get3DCursor(cursor, visible, mLastEvent);
}
void EditTSCtrl::get3DCursor(GuiCursor *&cursor, bool &visible, const Gui3DMouseEvent &event)
{
event;
cursor = NULL;
visible = true;
}
//------------------------------------------------------------------------------
void EditTSCtrl::onMouseUp(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DMouseUp(mLastEvent);
}
void EditTSCtrl::onMouseDown(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DMouseDown(mLastEvent);
}
void EditTSCtrl::onMouseMove(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DMouseMove(mLastEvent);
}
void EditTSCtrl::onMouseDragged(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DMouseDragged(mLastEvent);
}
void EditTSCtrl::onMouseEnter(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DMouseEnter(mLastEvent);
}
void EditTSCtrl::onMouseLeave(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DMouseLeave(mLastEvent);
}
void EditTSCtrl::onRightMouseDown(const GuiEvent & event)
{
// always process the right mouse event first...
make3DMouseEvent(mLastEvent, event);
on3DRightMouseDown(mLastEvent);
if(mRightMousePassThru && mProfile->mCanKeyFocus)
{
// ok, gotta disable the mouse
// script functions are lockMouse(true); Canvas.cursorOff();
Platform::setWindowLocked(true);
Canvas->setCursorON(false);
setFirstResponder();
}
}
void EditTSCtrl::onRightMouseUp(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DRightMouseUp(mLastEvent);
}
void EditTSCtrl::onRightMouseDragged(const GuiEvent & event)
{
make3DMouseEvent(mLastEvent, event);
on3DRightMouseDragged(mLastEvent);
}
bool EditTSCtrl::onInputEvent(const InputEvent & event)
{
if(mRightMousePassThru && event.deviceType == MouseDeviceType &&
event.objInst == KEY_BUTTON1 && event.action == SI_BREAK)
{
// if the right mouse pass thru is enabled,
// we want to reactivate mouse on a right mouse button up
Platform::setWindowLocked(false);
Canvas->setCursorON(true);
}
// we return false so that the canvas can properly process the right mouse button up...
return false;
}
//------------------------------------------------------------------------------
void EditTSCtrl::renderWorld(const RectI & updateRect)
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glClear(GL_DEPTH_BUFFER_BIT);
glDisable(GL_CULL_FACE);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
dglSetCanonicalState();
gClientSceneGraph->renderScene();
if(mRenderMissionArea)
renderMissionArea();
glDisable(GL_DEPTH_TEST);
// render through console callbacks
SimSet * missionGroup = static_cast<SimSet*>(Sim::findObject("MissionGroup"));
if(missionGroup)
{
mConsoleRendering = true;
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
for(SimSetIterator itr(missionGroup); *itr; ++itr)
{
char buf[2][16];
dSprintf(buf[0], 16, (*itr)->isSelected() ? "true" : "false");
dSprintf(buf[1], 16, (*itr)->isExpanded() ? "true" : "false");
Con::executef(*itr, 4, "onEditorRender", getIdString(), buf[0], buf[1]);
}
glDisable(GL_DEPTH_TEST);
mConsoleRendering = false;
}
// render the editor stuff
renderScene(updateRect);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
dglSetClipRect(updateRect);
}
//#ifdef TGE_RPG /// TGE_Map
//
//void EditTSCtrl::renderMissionArea()
//{
// MissionArea * obj = dynamic_cast<MissionArea*>(Sim::findObject("MissionArea"));
// TerrainBlock * terrain = dynamic_cast<TerrainBlock*>(Sim::findObject("Terrain"));
// if(!terrain)
// return;
//
// GridSquare * gs = terrain->findSquare(TerrainBlock::BlockShift, Point2I(0,0));
// F32 height = F32(gs->maxHeight) * 0.03125f + 10.f;
// const RectI &area = obj->getArea();
//
// renderCuboidFrame(area, height,mMissionAreaFillColor,mMissionAreaFrameColor );
//}
//
//
//
//#else
void EditTSCtrl::renderMissionArea()
{
MissionArea * obj = dynamic_cast<MissionArea*>(Sim::findObject("MissionArea"));
TerrainBlock * terrain = dynamic_cast<TerrainBlock*>(Sim::findObject("Terrain"));
if(!terrain)
return;
GridSquare * gs = terrain->findSquare(TerrainBlock::BlockShift, Point2I(0,0));
F32 height = F32(gs->maxHeight) * 0.03125f + 10.f;
//
const RectI &area = obj->getArea();
Point2F min(area.point.x, area.point.y);
Point2F max(area.point.x + area.extent.x, area.point.y + area.extent.y);
glDisable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
ColorI & a = mMissionAreaFillColor;
ColorI & b = mMissionAreaFrameColor;
for(U32 i = 0; i < 2; i++)
{
//
if(i){glColor4ub(a.red,a.green,a.blue,a.alpha);glBegin(GL_QUADS);} else {glColor4f(b.red,b.green,b.blue,b.alpha); glBegin(GL_LINE_LOOP);}
glVertex3f(min.x, min.y, 0);
glVertex3f(max.x, min.y, 0);
glVertex3f(max.x, min.y, height);
glVertex3f(min.x, min.y, height);
glEnd();
//
if(i){glColor4ub(a.red,a.green,a.blue,a.alpha);glBegin(GL_QUADS);} else {glColor4f(b.red,b.green,b.blue,b.alpha); glBegin(GL_LINE_LOOP);}
glVertex3f(min.x, max.y, 0);
glVertex3f(max.x, max.y, 0);
glVertex3f(max.x, max.y, height);
glVertex3f(min.x, max.y, height);
glEnd();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -