tge/engine/game/debugView.cc
2025-02-17 23:17:30 -06:00

203 lines
5.8 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "console/console.h"
#include "dgl/dgl.h"
#include "gui/core/guiTSControl.h"
#include "game/gameConnection.h"
#include "game/player.h"
#include "game/debugView.h"
IMPLEMENT_CONOBJECT(DebugView);
DebugView::DebugView()
{
for (int i = 0; i < MaxTextLines; i++)
mTextLines[i][0] = '\0';
}
ConsoleMethod( DebugView, addLine, void, 5, 5, "( Point3F start, Point3F end, Color3F color)"
"Cause a line to be drawn persistently by the DebugView.")
{
Point3F start(0, 0, 0);
Point3F end(0, 0, 0);
ColorF color(0, 0, 0, 1.0f);
int numArgsRead;
//read the args in
numArgsRead = dSscanf(argv[2], "%g %g %g", &start.x, &start.y, &start.z);
if (numArgsRead != 3)
{
Con::printf("%s() - invalid start point.", argv[0]);
return;
}
numArgsRead = dSscanf(argv[3], "%g %g %g", &end.x, &end.y, &end.z);
if (numArgsRead != 3)
{
Con::printf("%s() - invalid end point.", argv[0]);
return;
}
numArgsRead = dSscanf(argv[4], "%g %g %g", &color.red, &color.green, &color.blue);
if (numArgsRead != 3)
{
Con::printf("%s() - invalid color.", argv[0]);
return;
}
object->addLine(start, end, color);
}
ConsoleMethod( DebugView, clearLines, void, 2, 2, "()"
"Clear all lines added by addLine.")
{
object->clearLines();
}
ConsoleMethod( DebugView, setText, void, 4, 5, "(int line, string text, Color3F color=NULL)"
"Set one of the lines in the DebugView to contain the specified text at the specified color.")
{
ColorF color(0.0f, 0.0f, 0.0f, 1.0f);
bool setColor = false;
if (argc >= 5)
{
int numArgsRead = dSscanf(argv[4], "%g %g %g", &color.red, &color.green, &color.blue);
if (numArgsRead == 3)
setColor = true;
}
object->setTextLine(dAtoi(argv[2]), argv[3], setColor ? &color : NULL);
}
ConsoleMethod( DebugView, clearText, void, 2, 3, "(int line=-1)"
"Clears all lines, or if a line is specified, that specific line.")
{
int lineNum = -1;
if (argc == 3)
lineNum = dAtoi(argv[2]);
object->clearTextLine(lineNum);
}
void DebugView::addLine(const Point3F &start, const Point3F &end, const ColorF &color)
{
DebugLine newLine(start, end, color);
mLines.push_back(newLine);
}
void DebugView::clearLines()
{
mLines.clear();
}
void DebugView::setTextLine(int line, const char *text, ColorF *color)
{
if (line < 0 || line >= MaxTextLines || !text)
return;
dStrncpy(&mTextLines[line][0], text, MaxTextLineLength);
mTextLines[line][MaxTextLineLength] = '\0';
if (!color)
mTextColors[line] = mProfile->mFontColor;
else
mTextColors[line] = *color;
}
void DebugView::clearTextLine(int line)
{
if (line < 0)
{
for (int i = 0; i < MaxTextLines; i++)
mTextLines[i][0] = '\0';
}
else if (line < MaxTextLines)
mTextLines[line][0] = '\0';
}
void DebugView::onRender(Point2I offset, const RectI &updateRect)
{
S32 i;
#if defined(TORQUE_DEBUG) || defined(INTERNAL_RELEASE)
GuiTSCtrl *tsCtrl;
if (! Sim::findObject("PlayGui", tsCtrl))
{
Con::printf("DebugView failed - unable to find TS ctrl.");
return;
}
//draw the lines first
for (i = 0; i < mLines.size(); i++)
{
//project the line to the screen
Point3F startPos, endPos;
if (tsCtrl->project(mLines[i].start, &startPos) && tsCtrl->project(mLines[i].end, &endPos))
{
glBegin(GL_LINES);
glColor4f(mLines[i].color.red, mLines[i].color.green, mLines[i].color.blue, 1.0f);
glVertex2i((S32)startPos.x, (S32)startPos.y);
glVertex2i((S32)endPos.x, (S32)endPos.y);
glEnd();
}
}
//draw the task above each player's head
SimGroup *g = Sim::getClientGroup();
SimGroup::iterator j;
for (j = g->begin(); j != g->end(); j++)
{
GameConnection *client = static_cast<GameConnection*>(*j);
Player *player = NULL;
if (! client->getControlObject())
continue;
player = dynamic_cast<Player*>(client->getControlObject());
if (! player)
continue;
//draw a test string above everyone's head
Point3F playerPos;
MatrixF const& tempTransform = player->getTransform();
tempTransform.getColumn(3, &playerPos);
playerPos.z += 1.7f;
Point3F textPos;
if (tsCtrl->project(playerPos, &textPos))
{
//const char *textStr = client->getDataField("objective", NULL);
const char *textStr = Con::executef(2, "aiGetTaskDesc", avar("%d", client->getId()));
if (!textStr || !textStr[0])
textStr = "Shoot Me!";
if ((textStr[0] == 'E' || textStr[0] == 'F') && textStr[1] == ':')
{
if (textStr[0] == 'E')
dglSetBitmapModulation(ColorF(1.0, 0.0, 0.0, 1.0));
else
dglSetBitmapModulation(ColorF(0.0, 1.0, 0.0, 1.0));
dglDrawText(mFont, Point2I(textPos.x, textPos.y), &textStr[2]);
}
else
{
dglSetBitmapModulation(mProfile->mFontColor);
dglDrawText(mFont, Point2I(textPos.x, textPos.y), textStr);
}
}
}
#endif
//draw the text - for final release, this is the only thing to be rendered
Point2I textOffset = offset;
for (i = 0; i < MaxTextLines; i++)
{
dglSetBitmapModulation(mTextColors[i]);
if (mTextLines[i][0] != '\0')
dglDrawText(mFont, textOffset, mTextLines[i]);
textOffset.y += mFont->getHeight();
}
renderChildControls(offset, updateRect);
}