From 26087be9f3dcd532071368bf98a34f94c60912c2 Mon Sep 17 00:00:00 2001 From: "Martin Felis (berta)" Date: Sat, 13 Nov 2010 18:45:15 +0100 Subject: [PATCH] polished GUI --- asteroids/ControllerCommands.cc | 29 ++++++ asteroids/Model.cc | 5 +- asteroids/View.cc | 167 ++++++++++++++++++++------------ asteroids/View.h | 6 ++ data/sounds/laser.wav | Bin 59996 -> 56592 bytes engine/ControllerBase.cc | 3 + engine/IMGUIControls.cc | 94 +++++++++++++++--- engine/IMGUIControls.h | 3 + engine/SoundBase.cc | 2 +- engine/ViewBase.cc | 1 + 10 files changed, 234 insertions(+), 76 deletions(-) diff --git a/asteroids/ControllerCommands.cc b/asteroids/ControllerCommands.cc index 7398a3b..87446ec 100644 --- a/asteroids/ControllerCommands.cc +++ b/asteroids/ControllerCommands.cc @@ -1,5 +1,6 @@ // #include "Engine.h" +#include "Game.h" #include "Controller.h" #include "Model.h" #include "EntityBase.h" @@ -18,6 +19,10 @@ static Controller *ControllerInstance = NULL; bool Cmd_ControllerForwardDown (std::vector args) { assert (ControllerInstance); + // only continue if the game is running + if (GetModel()->GetGameState() != GameStateRunning) + return false; + Engine::EntityBase* player_entity = Engine::GetEntity (Engine::GetPlayerEntityId()); if (player_entity) { player_entity->SetControllerKeyState (EntityKeyStateForward); @@ -36,6 +41,10 @@ bool Cmd_ControllerForwardDown (std::vector args) { bool Cmd_ControllerForwardUp (std::vector args) { assert (ControllerInstance); + // only continue if the game is running + if (GetModel()->GetGameState() != GameStateRunning) + return false; + Engine::EntityBase* player_entity = Engine::GetEntity (Engine::GetPlayerEntityId()); if (player_entity) { player_entity->UnsetControllerKeyState (EntityKeyStateForward); @@ -54,6 +63,10 @@ bool Cmd_ControllerForwardUp (std::vector args) { bool Cmd_ControllerTurnLeftDown (std::vector args) { assert (ControllerInstance); + // only continue if the game is running + if (GetModel()->GetGameState() != GameStateRunning) + return false; + Engine::EntityBase* player_entity = Engine::GetEntity (Engine::GetPlayerEntityId()); if (player_entity) { player_entity->SetControllerKeyState (EntityKeyStateTurnLeft); @@ -67,6 +80,10 @@ bool Cmd_ControllerTurnLeftDown (std::vector args) { bool Cmd_ControllerTurnLeftUp (std::vector args) { assert (ControllerInstance); + // only continue if the game is running + if (GetModel()->GetGameState() != GameStateRunning) + return false; + Engine::EntityBase* player_entity = Engine::GetEntity (Engine::GetPlayerEntityId()); if (player_entity) { player_entity->UnsetControllerKeyState (EntityKeyStateTurnLeft); @@ -80,6 +97,10 @@ bool Cmd_ControllerTurnLeftUp (std::vector args) { bool Cmd_ControllerTurnRightDown (std::vector args) { assert (ControllerInstance); + // only continue if the game is running + if (GetModel()->GetGameState() != GameStateRunning) + return false; + Engine::EntityBase* player_entity = Engine::GetEntity (Engine::GetPlayerEntityId()); if (player_entity) { player_entity->SetControllerKeyState (EntityKeyStateTurnRight); @@ -93,6 +114,10 @@ bool Cmd_ControllerTurnRightDown (std::vector args) { bool Cmd_ControllerTurnRightUp (std::vector args) { assert (ControllerInstance); + // only continue if the game is running + if (GetModel()->GetGameState() != GameStateRunning) + return false; + Engine::EntityBase* player_entity = Engine::GetEntity (Engine::GetPlayerEntityId()); if (player_entity) { player_entity->UnsetControllerKeyState (EntityKeyStateTurnRight); @@ -106,6 +131,10 @@ bool Cmd_ControllerTurnRightUp (std::vector args) { bool Cmd_ControllerAttack (std::vector args) { assert (ControllerInstance); + // only continue if the game is running + if (GetModel()->GetGameState() != GameStateRunning) + return false; + ShipEntity* player_entity = (ShipEntity*) Engine::GetEntity (Engine::GetPlayerEntityId ()); if (player_entity) { player_entity->Attack (); diff --git a/asteroids/Model.cc b/asteroids/Model.cc index b90d751..c805fb0 100644 --- a/asteroids/Model.cc +++ b/asteroids/Model.cc @@ -32,7 +32,6 @@ int Model::OnInit (int argc, char* argv[]) { /// \TODO use or similar for initialization of mCurrentLevelIndex mCurrentLevelIndex = 99999; - mNewestHighscoreEntryIndex = 99999; if (InitLevelList() == 0) Engine::LogError ("No levels found!"); @@ -56,6 +55,10 @@ int Model::OnInit (int argc, char* argv[]) { AddHighscoreEntry ("Jabba the Hutt", 1000); } + // Reset the newest highscore entry index which may be used for highlighting + // the newest entry. + mNewestHighscoreEntryIndex = 99999; + // initialize event handlers and register them Engine::RegisterListener (this, EventLevelComplete); Engine::RegisterListener (this, EventGameOver); diff --git a/asteroids/View.cc b/asteroids/View.cc index 752855f..d146067 100644 --- a/asteroids/View.cc +++ b/asteroids/View.cc @@ -42,6 +42,9 @@ int View::OnInit (int argc, char* argv[]) { LoadFont("AldotheApache.ttf size=20 color=#000000"); + button_width = 250; + button_height = 40; + // This is a simple star field that makes the game so spacy int i; for (i = 0; i < 200; i++) { @@ -389,21 +392,34 @@ void View::DrawUi () { glPopMatrix (); glMatrixMode (GL_MODELVIEW); +} +void View::DrawPageTitle (const std::string& title) { + SelectFont("console.ttf size=46 color=#808080"); + float width, height; + DrawGLStringMeasure(title.c_str(), &width, &height); + + float xpos = (screen_right - width) * 0.5 - 40; + float ypos = 180; + Engine::GUI::Label (4, title.c_str(), xpos - 2, ypos + 2); + + SelectFont("console.ttf size=46 color=#ffffff"); + Engine::GUI::Label (4, title.c_str(), xpos, ypos); } void View::DrawUiMainMenu() { - Engine::GUI::Label (4, "A s t e r o i d s", screen_right * 0.5 - 100, 180); + DrawPageTitle ("Asteroids"); - if (Engine::GUI::Button (1, "New Game", screen_right * 0.5 - 100, 200, 250, 40)) { + SelectFont("console.ttf size=23"); + if (Engine::GUI::Button (1, "New Game", screen_right * 0.5 - 100, 200, button_width, button_height)) { GetModel()->SetGameState(GameStateEnterPlayername); } - if (Engine::GUI::Button (2, "Highscores", screen_right * 0.5 - 100, 250, 250, 40)) { + if (Engine::GUI::Button (2, "Highscores", screen_right * 0.5 - 100, 250, button_width, button_height)) { GetModel()->SetGameState(GameStateShowHighscore); } - if (Engine::GUI::Button (3, "Quit", screen_right * 0.5 - 100, 330, 250, 40)) { + if (Engine::GUI::Button (3, "Quit", screen_right * 0.5 - 100, 330, button_width, button_height)) { Engine::RunCommand("quit"); } } @@ -432,141 +448,168 @@ void View::DrawUiGameRunning() { } void View::DrawUiGameOver() { - Engine::GUI::Label (4, "G a m e O v e r", screen_right * 0.5 - 100, 180); + DrawPageTitle ("Game Over"); + + SelectFont("console.ttf size=23 color=#ffffff"); if (GetModel()->GetPlayerLives() == 0) { - Engine::GUI::Label(5, "That was pathetic!", screen_right * 0.5 - 80, screen_bottom * 0.5 - 8); + Engine::GUI::LabelCentered(5, + "That was pathetic!", + screen_right * 0.5, + screen_bottom * 0.5 - 8); } else { - Engine::GUI::Label (6, "You earned yourself the", - screen_right * 0.5 - 80, + Engine::GUI::LabelCentered (6, "You earned yourself the", + screen_right * 0.5, screen_bottom * 0.5 - 32); - Engine::GUI::Label (7, "You Rock(TM) award.", - screen_right * 0.5 - 60, + Engine::GUI::LabelCentered (7, "You Rock(TM) award.", + screen_right * 0.5, screen_bottom * 0.5 + 0); - Engine::GUI::Label (8, "Go tell your friends.", - screen_right * 0.5 - 70, + Engine::GUI::LabelCentered (8, "Go tell your friends.", + screen_right * 0.5, screen_bottom * 0.5 + 32); } if (Engine::GUI::Button (2, "Continue...", - screen_right * 0.5 - 100, - screen_bottom * 0.5 + 60, 250, 40)) { + (screen_right - button_width) * 0.5, + screen_bottom * 0.5 + 80, button_width, button_height)) { GetModel()->SetGameState(GameStateShowHighscore); } } void View::DrawUiLevelComplete() { - Engine::GUI::Label (4, "Level Complete!", screen_right * 0.5 - 100, 180); + DrawPageTitle ("Level Complete!"); - Engine::GUI::Label (6, "Congratulations - You rock!", screen_right * 0.5 - 80, screen_bottom * 0.5 -16); + SelectFont ("console.ttf size=23"); - if(Engine::GUI::Button (1, "Next level ...", screen_right * 0.5 - 80, screen_bottom * 0.5 - 48, 250, 40)) { + if(Engine::GUI::Button (1, "Next level ...", (screen_right - button_width) * 0.5, screen_bottom * 0.5 + 60, button_width, button_height)) { GetModel()->SetGameState(GameStateRunning); } } void View::DrawUiGamePaused() { - Engine::GUI::Label (4, "- P a u s e d -", screen_right * 0.5 - 100, 180); + DrawPageTitle ("Game Paused"); + SelectFont ("console.ttf size=23"); - if (Engine::GUI::Button (1, "Resume Game", screen_right * 0.5 - 100, 200, 250, 40)) { + if (Engine::GUI::Button (1, "Resume Game", screen_right * 0.5 - 100, 200, button_width, button_height)) { GetModel()->SetGameState(GameStateRunning); } - if (Engine::GUI::Button (2, "Abort Game", screen_right * 0.5 - 100, 250, 250, 40)) { + if (Engine::GUI::Button (2, "Abort Game", screen_right * 0.5 - 100, 250, button_width, button_height)) { GetModel()->SetGameState(GameStateMainMenu); } - if (Engine::GUI::Button (3, "Quit", screen_right * 0.5 - 100, 330, 250, 40)) { + if (Engine::GUI::Button (3, "Quit", screen_right * 0.5 - 100, 330, button_width, button_height)) { Engine::RunCommand("quit"); } } void View::DrawUiPlayerDied() { - Engine::GUI::Label (4, "You died ...", screen_right * 0.5 - 40, screen_bottom * 0.5 - 8 - 32); + DrawPageTitle ("You died!"); + SelectFont ("console.ttf size=23"); - if (Engine::GUI::Button (1, "Continue", screen_right * 0.5 - 100, 200, 250, 40)) { + if (Engine::GUI::Button (1, "Continue", screen_right * 0.5 - 100, 200, button_width, button_height)) { GetModel()->SetGameState(GameStateRunning); } } +/** \brief Draws an entry in the form .... + * + * The amount of dots is also computed within this function. Not necessarily + * fast, however it works for now. + */ +void View::DrawHighscoreEntry (float x, float y, float entry_width, const std::string &name, unsigned int points) { + const float width_buffer = 30.; + float width, height; + float name_width, points_value_width; + + // Measure and draw the name + DrawGLStringMeasure (name.c_str(), &name_width, &height); + name_width = fabsf(name_width); + Engine::DrawGLString ( x, y, name.c_str()); + + // Compute the width of the points value when it is printed out + std::ostringstream points_value_stream; + points_value_stream << points; + DrawGLStringMeasure (points_value_stream.str().c_str(), &points_value_width, &height); + points_value_width = fabsf(points_value_width); + + // Compute the amount of dots. This is done by iteratively adding a dot '.' + // to a stream and check whether it has the desired width. + float dots_width = 0.; + std::ostringstream dots_stream; + + while (ceil(name_width) + dots_width + points_value_width + width_buffer < entry_width) { + dots_stream << "."; + DrawGLStringMeasure (dots_stream.str().c_str(), &dots_width, &height); + dots_width = fabsf(dots_width); + } + + // Drawing of the dots and the points value + Engine::DrawGLString ( x + entry_width - points_value_width - dots_width - 10, y, dots_stream.str().c_str()); + Engine::DrawGLString ( x + entry_width - points_value_width, y, points_value_stream.str().c_str()); +} + void View::DrawUiHighscore() { - float x = screen_right * 0.5 - 100; + DrawPageTitle ("Highscores"); + SelectFont ("console.ttf size=23"); + + unsigned int entry_length = 32; + float char_width, height; + DrawGLStringMeasure ("M", &char_width, &height); + float entry_width = fabsf(char_width * entry_length); + float x = screen_right * 0.5 - entry_width * 0.5; float y = screen_bottom * 0.5 - 8 - 128; // then we do the drawings - Engine::DrawGLString ( x, y, "A s t e r o i d s"); - y += 30; - Engine::DrawGLString ( x, y, "Highscore"); - - y += 30; + y += 60; std::list::iterator highscore_iter = GetModel()->mHighscoreList.begin(); SetFontJustification(Engine::FontJustificationLeft); - unsigned int entry_length = 32; - unsigned int i = 0; while (highscore_iter != GetModel()->mHighscoreList.end()) { - // compute the number of digits - unsigned int digits = 1; - unsigned int temp_val = highscore_iter->points; - while (temp_val > 0) { - temp_val /= 10; - digits ++; - } - - // output of the name - std::ostringstream out_stream; - out_stream << highscore_iter->name; - - // add dots to fill the line - temp_val = entry_length - out_stream.str().size() - digits; - for (temp_val; temp_val > 0; temp_val--) { - out_stream << "."; - } - out_stream << highscore_iter->points; - // Check whether we have to highlight an entry (such as when entering // the name) if (GetModel()->mNewestHighscoreEntryIndex < GetModel()->mHighscoreList.size() && GetModel()->mNewestHighscoreEntryIndex == i) { - SelectFont("console.ttf color=#e8d500"); - Engine::DrawGLString ( x, y, out_stream.str().c_str()); - SelectFont("console.ttf color=#ffffff"); + // we highlight the newest entry + SelectFont("console.ttf color=#e8d500 size=23"); } else { - Engine::DrawGLString ( x, y, out_stream.str().c_str()); + SelectFont("console.ttf color=#ffffff size=23"); } + DrawHighscoreEntry ( x, y, entry_width, highscore_iter->name, highscore_iter->points); // go down one line - y += 16; + y += 20; i++; highscore_iter++; } - if (Engine::GUI::Button (1, "Back to MainMenu", x + 16, y + 16, 250, 40)) { + if (Engine::GUI::Button (1, "Back to Menu", screen_right * 0.5 - 250 * 0.5, y + 16, button_width, button_height)) { GetModel()->SetGameState(GameStateMainMenu); } } void View::DrawUiEnterPlayername() { - Engine::GUI::Label (4, "A s t e r o i d s", screen_right * 0.5 - 100, 180); - + DrawPageTitle ("Asteroids"); + SelectFont ("console.ttf size=23"); + // Enter your name std::string player_name = GetModel()->GetPlayerName(); - SelectFont("console.ttf"); - Engine::GUI::Label (1, "Enter your name: ", screen_right * 0.5 - 100, 250); + SelectFont("console.ttf size=23"); + Engine::GUI::Label (1, "Enter your name: ", screen_right * 0.5 - 220, 250); if (Engine::GUI::LineEdit (2, screen_right * 0.5 + 20, 238, player_name, 16)) { GetModel()->SetPlayerName(player_name); } - if (Engine::GUI::Button (3, "Start Game", screen_right - 150 - 20, 500, 150, 40)) { + if (Engine::GUI::Button (3, "Start Game", screen_right - 180 - 20, 500, 180, 40)) { GetModel()->SetGameState(GameStateRunning); } - if (Engine::GUI::Button (5, "Back", 20, 500, 150, 40)) { + if (Engine::GUI::Button (5, "Back", 20, 500, 180, 40)) { GetModel()->SetGameState(GameStateMainMenu); } } diff --git a/asteroids/View.h b/asteroids/View.h index 2a9ea61..bf7573b 100644 --- a/asteroids/View.h +++ b/asteroids/View.h @@ -35,12 +35,15 @@ class View : public Engine::ViewBase { private: void DrawUi(); + void DrawPageTitle(const std::string &title); + void DrawUiMainMenu(); void DrawUiGameRunning(); void DrawUiGameOver(); void DrawUiLevelComplete(); void DrawUiGamePaused(); void DrawUiPlayerDied(); + void DrawHighscoreEntry(float x, float y, float entry_width, const std::string &name, unsigned int points); void DrawUiHighscore(); void DrawUiEnterPlayername(); @@ -73,6 +76,9 @@ class View : public Engine::ViewBase { float screen_top; float screen_bottom; + int button_width; + int button_height; + virtual bool OnReceiveEvent (const Engine::EventBasePtr &event); }; diff --git a/data/sounds/laser.wav b/data/sounds/laser.wav index 2db525c3e2abd18590aa0be1281bdb3bf986e691..08b676f9cc48fe373fc0cd305f15d96992b79cae 100644 GIT binary patch literal 56592 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 KtmR*6_x}LlXn_X+ diff --git a/engine/ControllerBase.cc b/engine/ControllerBase.cc index 855d73a..54cb273 100644 --- a/engine/ControllerBase.cc +++ b/engine/ControllerBase.cc @@ -159,6 +159,9 @@ void ControllerBase::IMGUIFinish () { if (uistate.activeitem == 0) uistate.activeitem = -1; } + + // also reset the last keysym such that old values will not be reported + uistate.last_keysym = SDLK_FIRST; } /** \brief Keyboard processing */ diff --git a/engine/IMGUIControls.cc b/engine/IMGUIControls.cc index 27128b5..0385fe6 100644 --- a/engine/IMGUIControls.cc +++ b/engine/IMGUIControls.cc @@ -38,6 +38,40 @@ void DrawBlock (int x, int y, int w, int h) { assert (h > d); assert (w > d); + float color[4]; + glGetFloatv (GL_CURRENT_COLOR, color); + + glBegin(GL_QUADS); + + // middle part + glVertex3f (x, y, 0.); + glVertex3f (x, y + h, 0.); + glVertex3f (x + w, y + h, 0.); + glVertex3f (x + w, y, 0.); + + glEnd(); + + glColor4fv (color); + + // "Shading" + glLineWidth(3); + glColor3f (color[0] * shading_dark, color[1] * shading_dark, color[2] * shading_dark); + + glBegin(GL_LINE_STRIP); + glVertex3f (x,y + 2, 0.); + glVertex3f (x,y +h, 0.); + glVertex3f (x + w - 2, y + h, 0.); + glEnd(); +} + +void DrawRoundedBlock (int x, int y, int w, int h) { + const int d = 16; + const float shading_dark = 0.5; + const float shading_light = 1.3; + + assert (h > d); + assert (w > d); + glBegin(GL_QUADS); // lower part glVertex3f (x, y, 0.); @@ -103,6 +137,26 @@ void Label (int id, const char* caption, int x, int y) { } } +/** \brief Draws a label with a given caption centered at the position (vertically centered) + * + * This function draws the label at the horizontal x position and centers the + * label with regard to the height of the rendered caption. + * + * \TODO [med] The vertical alignment around the center of the vertical height + * of the string is rather unfortunate as different contents will be rendered + * at different vertical positions (e.g. "aaa" and "ggg") + */ +void LabelCentered (int id, const char* caption, int x, int y) { + if (caption != NULL) { + float width, height; + view = EngineGetView (); + assert (view); + + view->DrawGLStringMeasure(caption, &width, &height); + view->DrawGLString(x - 0.5 * width, y + height * 0.5, caption); + } +} + /** \brief Draws a button at the given position * * The area defined by the parameters defines the clickable area. However @@ -137,20 +191,20 @@ bool Button (int id, const char* caption, int x, int y, int w, int h) { // Render glColor3f (0.2, 0.2, 0.2); -// DrawBlock (x + 4, y + 4, w, h); +// DrawRoundedBlock (x + 4, y + 4, w, h); if (controller->uistate.hotitem == id || controller->uistate.kbditem == id) { if (controller->uistate.activeitem == id) { glColor3f (0.8, 0.8, 0.8); - DrawBlock (x, y, w, h); + DrawRoundedBlock (x, y, w, h); } else { glColor3f (0.7, 0.7, 0.7); - DrawBlock (x, y, w, h); + DrawRoundedBlock (x, y, w, h); } } else { glColor3f (0.4, 0.4, 0.4); - DrawBlock (x, y, w, h); + DrawRoundedBlock (x, y, w, h); } // Caption @@ -159,9 +213,25 @@ bool Button (int id, const char* caption, int x, int y, int w, int h) { view = EngineGetView (); assert (view); - glColor3f (1., 1., 1.); + // we have to load the font prior to measuring it + SelectFont("console.ttf size=23"); view->DrawGLStringMeasure(caption, &width, &height); - view->DrawGLString(x + w * 0.5 - width * 0.5, y + h * 0.5 - height * 0.5, caption); + + float xpos = x + w * 0.5 - width * 0.5; + float ypos = y + h * 0.5 - height * 0.5; + // LogDebug ("measure '%s' width = %f height = %f", caption, width, height); + + if (controller->uistate.hotitem == id || controller->uistate.kbditem == id) { + SelectFont("console.ttf size=23 color=#666666"); + view->DrawGLString( xpos - 2., ypos + 2., caption); + SelectFont("console.ttf size=23 color=#ffffff"); + view->DrawGLString( xpos, ypos, caption); + } else { + SelectFont("console.ttf size=23 color=#4d4d4d"); + view->DrawGLString( xpos - 2., ypos + 2., caption); + SelectFont("console.ttf size=23 color=#b3b3b3"); + view->DrawGLString( xpos, ypos, caption); + } } // Mouse Logic @@ -217,8 +287,12 @@ bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxleng controller = EngineGetController(); assert (controller); + int textpos_x = x + 8; + int textpos_y = y + 5; + + y -= 16; int w = maxlength * 16; - int h = 20; + int h = 30; // LogMessage ("id = %d hotitem = %d activeitem = %d kbditem = %d key = %s", id, controller->uistate.hotitem, controller->uistate.activeitem, controller->uistate.kbditem, convert_keycode (controller->uistate.last_keysym)); @@ -238,10 +312,6 @@ bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxleng return false; } - // Render - glColor3f (0.2, 0.2, 0.2); - DrawBlock (x + 4, y + 4, w, h); - // If we have keyboard focus, we highlight the widget if ( controller->uistate.kbditem == id) { if (controller->uistate.activeitem == id) { @@ -269,7 +339,7 @@ bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxleng text_output += "_"; view->DrawGLStringMeasure(text_value.c_str(), &width, &height); - view->DrawGLString(x + 16, y + 12, text_output.c_str()); + view->DrawGLString(textpos_x, textpos_y, text_output.c_str()); // Keyboard Logic if (controller->uistate.kbditem == id) { diff --git a/engine/IMGUIControls.h b/engine/IMGUIControls.h index ffb821e..0815925 100644 --- a/engine/IMGUIControls.h +++ b/engine/IMGUIControls.h @@ -19,6 +19,9 @@ bool regionhit (int x, int y, int w, int h); /** \brief Draws a label at the given position with vertical center at y */ void Label (int id, const char* caption, int x, int y); +/** \brief Draws a label centered at the given position with vertical center at y */ +void LabelCentered (int id, const char* caption, int x, int y); + /** \brief Draws a button at the given position * diff --git a/engine/SoundBase.cc b/engine/SoundBase.cc index e32c1ed..68aae26 100644 --- a/engine/SoundBase.cc +++ b/engine/SoundBase.cc @@ -46,7 +46,7 @@ int SoundBase::OnInit(int argc, char* argv[]) { int audio_rate = 22050; Uint16 audio_format = AUDIO_S16; int audio_channels = 2; - int audio_buffers = 4096; + int audio_buffers = 1024; LogDebug("Sound Init"); if (Mix_OpenAudio (audio_rate, audio_format, audio_channels, audio_buffers)) { diff --git a/engine/ViewBase.cc b/engine/ViewBase.cc index 2f7e5f0..e820b4c 100644 --- a/engine/ViewBase.cc +++ b/engine/ViewBase.cc @@ -339,6 +339,7 @@ void ViewBase::DrawGLStringMeasure (const char* str, float *width, float *height OGLFT::BBox bbox = mCurrentFont->measure (str); *width = bbox.x_max_ - bbox.x_min_; *height = bbox.y_max_ - bbox.y_min_; +// LogDebug ("measure bbox '%s' = %f,%f %f,%f",str, bbox.x_min_, bbox.y_min_, bbox.x_max_, bbox.y_max_); } void ViewBase::GetCamereEye (float *eye_out) {