Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Unicode in plTextFont (avatar tooltips, console, etc.) #1489

Merged
merged 7 commits into from
Oct 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Sources/Plasma/FeatureLib/pfAnimation/plAnimDebugList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ void plAnimDebugList::ShowReport()

x = startX;
y = startY;
txt.DrawString(x, y, "Material Animations:", 255, 255, 255, 255, plDebugText::kStyleBold);
txt.DrawString(x, y, ST_LITERAL("Material Animations:"), 255, 255, 255, 255, plDebugText::kStyleBold);
y += yOff;
for (const plKey& matKey : fMaterialKeys)
{
Expand All @@ -141,7 +141,7 @@ void plAnimDebugList::ShowReport()
}
}
y += yOff;
txt.DrawString(x, y, "AGMaster Anims", 255, 255, 255, 255, plDebugText::kStyleBold);
txt.DrawString(x, y, ST_LITERAL("AGMaster Anims"), 255, 255, 255, 255, plDebugText::kStyleBold);
y += yOff;

for (const plKey& soKey : fSOKeys)
Expand Down
14 changes: 7 additions & 7 deletions Sources/Plasma/FeatureLib/pfAudio/plListener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ bool plListener::IEval(double secs, float del, uint32_t dirty)

int y = 16 + 12, x = 400;
if( fPrintDbgInfo )
plDebugText::Instance().DrawString( x, 16, "Listener:", (uint32_t)0xffffffff, plDebugText::kStyleBold );
plDebugText::Instance().DrawString(x, 16, ST_LITERAL("Listener:"), (uint32_t)0xffffffff, plDebugText::kStyleBold);

// Get the avatar's SceneObject
plKey key = plNetClientApp::GetInstance()->GetLocalPlayerKey();
Expand All @@ -86,7 +86,7 @@ bool plListener::IEval(double secs, float del, uint32_t dirty)
{
// We don't have a position to init by, so do NOT eval yet!!!
if( fPrintDbgInfo )
plDebugText::Instance().DrawString( x, y, "Not eval-ing yet", (uint32_t)0xffffffff );
plDebugText::Instance().DrawString(x, y, ST_LITERAL("Not eval-ing yet"), (uint32_t)0xffffffff);
return true;
}

Expand Down Expand Up @@ -171,7 +171,7 @@ bool plListener::IEval(double secs, float del, uint32_t dirty)
if( facingType == kInvalid || posType == kInvalid || velType == kInvalid )
{
if( fPrintDbgInfo )
plDebugText::Instance().DrawString( x, y, "Not eval-ing: missing one or more parameter bases", (uint32_t)0xff0000ff );
plDebugText::Instance().DrawString(x, y, ST_LITERAL("Not eval-ing: missing one or more parameter bases"), (uint32_t)0xff0000ff);
return true;
}

Expand All @@ -191,22 +191,22 @@ bool plListener::IEval(double secs, float del, uint32_t dirty)
ST::string str;
str = ST::format("Direction: ({3.2f},{3.2f},{3.2f}) from {}", dir.fX, dir.fY, dir.fZ,
(facingType == kObject) ? pRefObject->GetKeyName() : "VCam");
plDebugText::Instance().DrawString( x, y, str.c_str(), (uint32_t)0xffffffff );
plDebugText::Instance().DrawString(x, y, str, (uint32_t)0xffffffff);
y += 12;

str = ST::format("Up: ({3.2f},{3.2f},{3.2f}) from {}", up.fX, up.fY, up.fZ,
(facingType == kObject) ? pRefObject->GetKeyName() : "VCam");
plDebugText::Instance().DrawString( x, y, str.c_str(), (uint32_t)0xffffffff );
plDebugText::Instance().DrawString(x, y, str, (uint32_t)0xffffffff);
y += 12;

str = ST::format("Position: ({3.2f},{3.2f},{3.2f}) from {}", position.fX, position.fY, position.fZ,
(posType == kObject) ? pRefObject->GetKeyName() : "VCam");
plDebugText::Instance().DrawString( x, y, str.c_str(), (uint32_t)0xffffffff );
plDebugText::Instance().DrawString(x, y, str, (uint32_t)0xffffffff);
y += 12;

str = ST::format("Velocity: ({3.2f},{3.2f},{3.2f}) from {}", velocity.fX, velocity.fY, velocity.fZ,
(velType == kObject) ? pRefObject->GetKeyName() : "VCam");
plDebugText::Instance().DrawString( x, y, str.c_str(), (uint32_t)0xffffffff );
plDebugText::Instance().DrawString(x, y, str, (uint32_t)0xffffffff);
y += 12;
}
plgDispatch::MsgSend( msg );
Expand Down
66 changes: 31 additions & 35 deletions Sources/Plasma/FeatureLib/pfConsole/pfConsole.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -770,8 +770,6 @@ void pfConsole::IClear()
void pfConsole::Draw( plPipeline *p )
{
int i, yOff, y, x, eOffset, height;
char *line;
char tmp[ kMaxCharsWide ];
bool showTooltip = false;
float thisTime; // For making the console FX speed konstant regardless of framerate
const float kEffectDuration = 0.5f;
Expand All @@ -786,7 +784,7 @@ void pfConsole::Draw( plPipeline *p )
if( fMsgTimeoutTimer > 0 )
{
/// Message hint--draw the last line of the console for a bit
drawText.DrawString( 10, 4, fDisplayBuffer + kMaxCharsWide * ( fNumDisplayLines - 1 ), fConsoleTextColor );
drawText.DrawString(10, 4, ST::string::from_latin_1(fDisplayBuffer + kMaxCharsWide * (fNumDisplayLines - 1)), fConsoleTextColor);
fMsgTimeoutTimer--;
}
fLastTime = thisTime;
Expand Down Expand Up @@ -827,28 +825,28 @@ void pfConsole::Draw( plPipeline *p )
if( fMode == kModeSingleLine )
{
// Bgnd (TEMP ONLY)
x = kMaxCharsWide * drawText.CalcStringWidth( "W" ) + 4;
x = kMaxCharsWide * drawText.CalcStringWidth(ST_LITERAL("W")) + 4;
y = height - eOffset;
drawText.DrawRect( 4, 0, x, y, /*color*/0, 0, 0, 127 );

/// Actual text
if( fEffectCounter == 0 )
drawText.DrawString( 10, 4, "Plasma 2.0 Console", 255, 255, 255, 255 );
drawText.DrawString(10, 4, ST_LITERAL("Plasma 2.0 Console"), 255, 255, 255, 255);

if( !showTooltip )
drawText.DrawString( 10, 4 + yOff - eOffset, fDisplayBuffer + kMaxCharsWide * ( fNumDisplayLines - 1 ), fConsoleTextColor );
drawText.DrawString(10, 4 + yOff - eOffset, ST::string::from_latin_1(fDisplayBuffer + kMaxCharsWide * (fNumDisplayLines - 1)), fConsoleTextColor);

y = 4 + yOff + yOff - eOffset;
}
else
{
// Bgnd (TEMP ONLY)
x = kMaxCharsWide * drawText.CalcStringWidth( "W" ) + 4;
x = kMaxCharsWide * drawText.CalcStringWidth(ST_LITERAL("W")) + 4;
y = yOff * ( fNumDisplayLines + 2 ) + 14 - eOffset;
drawText.DrawRect( 4, 0, x, y, /*color*/0, 0, 0, 127 );

/// Actual text
drawText.DrawString( 10, 4, "Plasma 2.0 Console", 255, 255, 255, 255 );
drawText.DrawString(10, 4, ST_LITERAL("Plasma 2.0 Console"), 255, 255, 255, 255);

static int countDown = 3000;
if( fHelpTimer > 0 || fEffectCounter > 0 || fMode != kModeFull )
Expand All @@ -861,7 +859,6 @@ void pfConsole::Draw( plPipeline *p )
static char tmpSrc[ kMaxCharsWide ];
if( !rezLoaded )
{
memset( tmp, 0, sizeof( tmp ) );
memset( tmpSrc, 0, sizeof( tmpSrc ) );
// Our concession to windows
#ifdef HS_BUILD_FOR_WIN32
Expand All @@ -886,23 +883,23 @@ void pfConsole::Draw( plPipeline *p )
// Need to define for other platforms?
#endif
}
memcpy( tmp, tmpSrc, sizeof( tmp ) );

if( countDown <= 0 )
{
y = 4 + yOff - eOffset;
if( countDown <= -480 )
{
tmp[ ( (-countDown - 480)>> 4 ) + 1 ] = 0;
ST::string tmp = ST::string::from_latin_1(tmpSrc).left(((-countDown - 480) >> 4) + 1);
drawText.DrawString( 10, y, tmp, fConsoleTextColor );
}
y += yOff * ( fNumDisplayLines - ( showTooltip ? 1 : 0 ) );
}
else
{
for( i = 0, y = 4 + yOff - eOffset, line = fDisplayBuffer; i < fNumDisplayLines - ( showTooltip ? 1 : 0 ); i++ )
{
drawText.DrawString( 10, y, line, fConsoleTextColor );
y = 4 + yOff - eOffset;
const char* line = fDisplayBuffer;
for (i = 0; i < fNumDisplayLines - (showTooltip ? 1 : 0); i++) {
drawText.DrawString(10, y, ST::string::from_latin_1(line), fConsoleTextColor);
y += yOff;
line += kMaxCharsWide;
}
Expand All @@ -912,38 +909,37 @@ void pfConsole::Draw( plPipeline *p )
y += yOff;
}

// strcpy( tmp, fHelpMode ? "Get Help On:" : "]" );
if ( fHelpMode )
strcpy( tmp, "Get Help On:");
else if (fPythonMode )
if ( fPythonMultiLines == 0 )
strcpy( tmp, ">>>");
else
strcpy( tmp, "...");
else
strcpy( tmp, "]" );
ST::string prompt;
if (fHelpMode) {
prompt = ST_LITERAL("Get Help On:");
} else if (fPythonMode) {
if (fPythonMultiLines == 0) {
prompt = ST_LITERAL(">>>");
} else {
prompt = ST_LITERAL("...");
}
} else {
prompt = ST_LITERAL("]");
}

drawText.DrawString( 10, y, tmp, 255, 255, 255, 255 );
i = 19 + drawText.CalcStringWidth( tmp );
drawText.DrawString( i, y, fWorkingLine, fConsoleTextColor );
drawText.DrawString(10, y, prompt, 255, 255, 255, 255);
i = 19 + drawText.CalcStringWidth(prompt);
drawText.DrawString(i, y, IGetWorkingLine(), fConsoleTextColor);

if( fCursorTicks >= 0 )
{
strcpy( tmp, fWorkingLine );
tmp[ fWorkingCursor ] = 0;
x = drawText.CalcStringWidth( tmp );
drawText.DrawString( i + x, y + 2, "_", 255, 255, 255 );
ST::string lineUpToCursor = ST::string::from_latin_1(fWorkingLine, fWorkingCursor);
x = drawText.CalcStringWidth(lineUpToCursor);
drawText.DrawString(i + x, y + 2, ST_LITERAL("_"), 255, 255, 255);
}
fCursorTicks--;
if( fCursorTicks < -kCursorBlinkRate )
fCursorTicks = kCursorBlinkRate;

if (showTooltip) {
ST::char_buffer helpMsgBuf = fLastHelpMsg.to_latin_1();
if (helpMsgBuf.size() > kMaxCharsWide - 2) {
helpMsgBuf[kMaxCharsWide - 2] = 0;
}
drawText.DrawString(i, y - yOff, helpMsgBuf.c_str(), 255, 255, 0);
ST::string helpMsg = ST::string::from_latin_1(helpMsgBuf.data(), std::min(helpMsgBuf.size(), static_cast<size_t>(kMaxCharsWide - 2)));
drawText.DrawString(i, y - yOff, helpMsg, 255, 255, 0);
} else {
fHelpTimer--;
}
Expand Down
3 changes: 1 addition & 2 deletions Sources/Plasma/FeatureLib/pfConsole/pfConsoleCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1247,8 +1247,7 @@ PF_CONSOLE_CMD( Graphics_DebugText, // Group name
"string face, int size", // Params
"Sets the font face and size used for drawing debug text" ) // Help string
{
const ST::string& face = params[0];
plDebugText::Instance().SetFont(face.c_str(), (uint16_t)(int)params[1]);
plDebugText::Instance().SetFont(params[0], (uint16_t)(int)params[1]);
}

PF_CONSOLE_CMD( Graphics_DebugText, // Group name
Expand Down
21 changes: 8 additions & 13 deletions Sources/Plasma/FeatureLib/pfDXPipeline/plDXPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ You can contact Cyan Worlds, Inc. by email [email protected]

#include <algorithm>
#include <string_theory/string>
#include <utility>

//#define MF_TOSSER

Expand Down Expand Up @@ -2280,15 +2281,15 @@ void plDXPipeline::Resize( uint32_t width, uint32_t height )

//// MakeTextFont /////////////////////////////////////////////////////////////

plTextFont *plDXPipeline::MakeTextFont( char *face, uint16_t size )
plTextFont* plDXPipeline::MakeTextFont(ST::string face, uint16_t size)
{
plTextFont *font;


font = new plDXTextFont( this, fD3DDevice );
if (font == nullptr)
return nullptr;
font->Create( face, size );
font->Create(std::move(face), size);
font->Link( &fTextFontRefList );

return font;
Expand Down Expand Up @@ -9811,9 +9812,8 @@ void plDXPlateManager::IDrawToDevice( plPipeline *pipe )
{
dxPipe->IDrawPlate( plate );

const char *title = plate->GetTitle();
if( plDebugText::Instance().IsEnabled() && title[ 0 ] != 0 )
{
ST::string title = plate->GetTitle();
if (plDebugText::Instance().IsEnabled() && !title.empty()) {
hsPoint3 pt;
pt.Set( 0, -0.5, 0 );
pt = plate->GetTransform() * pt;
Expand All @@ -9829,26 +9829,21 @@ void plDXPlateManager::IDrawToDevice( plPipeline *pipe )
hsPoint3 pt, pt2;
int i;

if( graph->GetLabelText( 0 )[ 0 ] != 0 )
{
uint32_t numLabels = graph->GetNumLabels();
if (numLabels > 0) {
/// Draw key
const char *str;

pt.Set( -0.5, -0.5, 0 );
pt = plate->GetTransform() * pt;
pt.fX = pt.fX * scrnWidthDiv2 + scrnWidthDiv2;
pt.fY = pt.fY * scrnHeightDiv2 + scrnHeightDiv2;
pt.fY += plDebugText::Instance().GetFontHeight();

uint32_t numLabels = graph->GetNumLabels();
if (numLabels > graph->GetNumColors())
numLabels = graph->GetNumColors();

for( i = 0; i < numLabels; i++ )
{
str = graph->GetLabelText( i );
if( str[ 0 ] == 0 )
break;
ST::string str = graph->GetLabelText(i);

pt2 = pt;
pt2.fX -= plDebugText::Instance().CalcStringWidth( str );
Expand Down
2 changes: 1 addition & 1 deletion Sources/Plasma/FeatureLib/pfDXPipeline/plDXPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -557,7 +557,7 @@ class plDXPipeline : public pl3DPipeline<plDXDevice>
void LoadResources() override; // Tells us where it's a good time to load in unmanaged resources.

// Create a debug text font object
plTextFont *MakeTextFont(char *face, uint16_t size) override;
plTextFont* MakeTextFont(ST::string face, uint16_t size) override;

// Create and/or Refresh geometry buffers
void CheckVertexBufferRef(plGBufferGroup* owner, uint32_t idx) override;
Expand Down
4 changes: 3 additions & 1 deletion Sources/Plasma/FeatureLib/pfGLPipeline/plGLPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ You can contact Cyan Worlds, Inc. by email [email protected]
#include "HeadSpin.h"
#include "hsWindows.h"

#include <string_theory/string>

#include "plPipeline/hsWinRef.h"

#include "plGLPipeline.h"
Expand Down Expand Up @@ -79,7 +81,7 @@ bool plGLPipeline::PrepForRender(plDrawable* drawable, std::vector<int16_t>& vis
void plGLPipeline::Render(plDrawable* d, const std::vector<int16_t>& visList)
{}

plTextFont* plGLPipeline::MakeTextFont(char* face, uint16_t size)
plTextFont* plGLPipeline::MakeTextFont(ST::string face, uint16_t size)
{
return nullptr;
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/Plasma/FeatureLib/pfGLPipeline/plGLPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class plGLPipeline : public pl3DPipeline<plGLDevice>
bool PreRender(plDrawable* drawable, std::vector<int16_t>& visList, plVisMgr* visMgr=nullptr) override;
bool PrepForRender(plDrawable* drawable, std::vector<int16_t>& visList, plVisMgr* visMgr=nullptr) override;
void Render(plDrawable* d, const std::vector<int16_t>& visList) override;
plTextFont* MakeTextFont(char* face, uint16_t size) override;
plTextFont* MakeTextFont(ST::string face, uint16_t size) override;
void CheckVertexBufferRef(plGBufferGroup* owner, uint32_t idx) override;
void CheckIndexBufferRef(plGBufferGroup* owner, uint32_t idx) override;
bool OpenAccess(plAccessSpan& dst, plDrawableSpans* d, const plVertexSpan* span, bool readOnly) override;
Expand Down
6 changes: 2 additions & 4 deletions Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIDialogMod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -426,9 +426,7 @@ static bool showBounds = false;
float x = sW * ctrl->fBoundsPoints[j].fX;
float y = sH * ctrl->fBoundsPoints[j].fY;
plDebugText::Instance().DrawRect( (uint16_t)(x - 2), (uint16_t)(y - 2), (uint16_t)(x + 2), (uint16_t)(y + 2), color );
char str[24];
snprintf(str, std::size(str), "%zu", j);
plDebugText::Instance().DrawString( (uint16_t)(x + 8), (uint16_t)(y - 8), str, color );
plDebugText::Instance().DrawString((uint16_t)(x + 8), (uint16_t)(y - 8), ST::string::from_uint(j), color);
}
}
else
Expand Down Expand Up @@ -484,7 +482,7 @@ static bool showBounds = false;
{
const hsBounds3 &bnds = fMousedCtrl->GetBounds();
plDebugText::Instance().DrawString((uint16_t)(bnds.GetMins().fX), (uint16_t)(bnds.GetMins().fY),
fMousedCtrl->GetKeyName().c_str(), (uint32_t)0xffffff00);
fMousedCtrl->GetKeyName(), (uint32_t)0xffffff00);
}
#endif

Expand Down
3 changes: 2 additions & 1 deletion Sources/Plasma/NucleusLib/inc/plPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ class plVisMgr;

class plViewTransform;

namespace ST { class string; }

struct PipelineParams
{
Expand Down Expand Up @@ -169,7 +170,7 @@ class plPipeline : public plCreatable
virtual void Draw(plDrawable* d) = 0;

// Device-specific ref creation. Includes buffers and fonts
virtual plTextFont *MakeTextFont( char *face, uint16_t size ) = 0;
virtual plTextFont* MakeTextFont(ST::string face, uint16_t size) = 0;

// Create and/or Refresh geometry buffers
virtual void CheckVertexBufferRef(plGBufferGroup* owner, uint32_t idx) = 0;
Expand Down
4 changes: 2 additions & 2 deletions Sources/Plasma/PubUtilLib/plAudio/plSound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,10 @@ void plSound::IUpdateDebugPlate()
fDebugPlate->SetPosition( -0.5, 0 );
fDebugPlate->SetDataRange( 0, 100, 100 );
fDebugPlate->SetColors( 0x80202000 );
fDebugPlate->SetLabelText( "Desired", "Curr", "Soft", "Dist" );
fDebugPlate->SetLabelText({ST_LITERAL("Desired"), ST_LITERAL("Curr"), ST_LITERAL("Soft"), ST_LITERAL("Dist")});
}

fDebugPlate->SetTitle(GetKeyName().c_str()); // Bleah
fDebugPlate->SetTitle(GetKeyName()); // Bleah
fDebugPlate->SetVisible( true );
fDebugPlate->AddData( (int32_t)( fDesiredVol * 100.f ),
(int32_t)( fCurrVolume * 100.f ),
Expand Down
Loading