From 5ceb4694a05ec68b5cfba18b0f25ba804be88a80 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Mon, 12 May 2008 18:32:15 +0000 Subject: console colors --- src/client/chat.cc | 15 ++-- src/client/client.cc | 6 +- src/client/console.cc | 223 ++++++++++++++++++++++++++++++++++++++++---------- src/client/input.cc | 4 +- src/client/video.cc | 4 +- src/client/view.cc | 71 ++-------------- 6 files changed, 200 insertions(+), 123 deletions(-) (limited to 'src/client') diff --git a/src/client/chat.cc b/src/client/chat.cc index 0d1def6..1953390 100644 --- a/src/client/chat.cc +++ b/src/client/chat.cc @@ -79,19 +79,16 @@ void draw() while (input_pos - draw_pos > width) draw_pos += 2; - // draw the console input - gl::color(1.0f, 1.0f, 1.0f, 1.0f); - Text::draw(4 , 5 + Text::fontheight() * (MAXNOTIFYLINES+1), "say"); - gl::color(0.0f, 1.0f, .0f, 1.0f); - Text::draw(4+Text::fontwidth()*3 , 5 + Text::fontheight() * (MAXNOTIFYLINES+1), ":"); + // draw the chat input + float y = video::height * 8.0 / 10.0; - gl::color(1.0f, 1.0f, 1.0f, 1.0f); - Text::draw(4+Text::fontwidth()*5, 5 + Text::fontheight() * (MAXNOTIFYLINES+1), (*history_pos).substr(draw_pos, width)); + Text::draw(4 , y, "^Bsay^F:^B"); + Text::draw(4+Text::fontwidth()*5 , y, (*history_pos).substr(draw_pos, width)); // draw cursor if ((core::application()->time() - ::floorf(core::application()->time())) < 0.5f) { - std::string cursor("_"); - Text::draw(4+Text::fontwidth()*(input_pos - draw_pos+5), 5 + Text::fontheight() * (MAXNOTIFYLINES+1) , cursor); + std::string cursor("^B_"); + Text::draw(4+Text::fontwidth()*(input_pos - draw_pos+5), y, cursor); } } diff --git a/src/client/client.cc b/src/client/client.cc index c607c64..6a4d23e 100644 --- a/src/client/client.cc +++ b/src/client/client.cc @@ -82,7 +82,7 @@ void Client::quit(int status) void Client::init(int count, char **arguments) { - con_print << "Initializing client..." << std::endl; + con_print << "^BInitializing client..." << std::endl; // initialize core core::Cvar::sv_dedicated = core::Cvar::set("sv_private", "0"); @@ -123,7 +123,7 @@ void Client::init(int count, char **arguments) void Client::run() { - con_print << "Running client..." << std::endl; + con_print << "^BRunning client..." << std::endl; Uint32 client_framerate = (Uint32)(1000/120); Uint32 elapsed = 0; @@ -154,7 +154,7 @@ void Client::run() void Client::shutdown() { - con_print << "Shutting down client..." << std::endl; + con_print << "^BShutting down client..." << std::endl; console::flush(); // remove engine functions diff --git a/src/client/console.cc b/src/client/console.cc index 914d32f..b60e179 100644 --- a/src/client/console.cc +++ b/src/client/console.cc @@ -4,8 +4,9 @@ the terms and conditions of the GNU General Public License version 2 */ -#include "filesystem/filesystem.h" +#include "auxiliary/functions.h" #include "core/core.h" +#include "filesystem/filesystem.h" #include "render/render.h" #include "render/textures.h" #include "client/console.h" @@ -65,25 +66,25 @@ size_t notify_pos = 0; std::string notify_text[MAXNOTIFYLINES]; float notify_time[MAXNOTIFYLINES]; - //--- engine functions -------------------------------------------- void func_con_toggle(std::string const &args) { + std::istringstream argstream(args); int i; if (argstream >> i) { - if (i) console_visible = true; else console_visible = false; - } else - console_visible = !console_visible; + if (i) console_visible = false; else console_visible = true; + } + toggle(); } //--- public ------------------------------------------------------ void init() { - con_print << "Initializing console..." << std::endl; + con_print << "^BInitializing console..." << std::endl; console_visible = false; @@ -103,7 +104,7 @@ void init() void shutdown() { - con_print << "Shutting down console..." << std::endl; + con_print << "^BShutting down console..." << std::endl; save_history(); @@ -117,26 +118,125 @@ void shutdown() input_pos = 0; } -void draw() +void clear_notify() +{ + for (size_t i=0; i < MAXNOTIFYLINES; i++) + notify_time[i] = 0; +} + +void draw_notify() +{ + using namespace render; + + // draw notifications + Text::setcolor('N'); + size_t width = (size_t) ((video::width - 8) / Text::fontwidth()); + size_t n = notify_pos % MAXNOTIFYLINES; + float h = 4 + 2*Text::fontheight(); + for (size_t l = 0; l < MAXNOTIFYLINES; l++) { + if (notify_text[n].size() > 2 && notify_time[n] + 4 > core::application()->time()) { + std::string linedata(notify_text[n]); + linedata += '\n'; + + std::string word; + size_t word_length = 0; + + std::string line; + size_t line_length = 0; + + const char *c = linedata.c_str(); + char pen = 'N'; + + while (*c) { + + // color code + if (aux::is_color_code(c)) { + c++; + pen = *c; + word += '^'; + word += pen; + } + + // new word, wrap if necessary + else if ((*c == '\n' ) || ( *c == ' ')) { + + if (line_length + word_length > width) { + if (line.size()) { + Text::draw(4, h, line); + h += Text::fontheight(); + line.clear(); + line += '^'; + line += pen; + line_length = 0; + } + } + + line.append(word); + line_length += word_length; + + word.clear(); + word_length = 0; + + // new line + if (*c == '\n' ) { + Text::draw(4, h, line); + h += Text::fontheight(); + line.clear(); + line_length = 0; + // new word + } else if (*c == ' ' ) { + line += ' '; + line_length++; + } + } + + // new character + else { + word += *c; + word_length++; + + if (word_length == width) { + if (line.size()) { + Text::draw(4, h, line); + h += Text::fontheight(); + line.clear(); + line += '^'; + line += pen; + line_length = 0; + } + + line.append(word); + line_length = word_length; + + word.clear(); + word_length = 0; + } + } + + c++; + } + + } + n = (n+1) % MAXNOTIFYLINES; + } +} + +void draw_console() { using namespace render; - - if(!console_visible) - return; float con_height = 0.70f; // draw version below the bottom of the console - gl::color(0.0f, 1.0f, 0.0f, 0.5f); std::string version(core::name()); version += ' '; version.append(core::version()); + gl::color(0.0f, 1.0f, 0.0f, 0.5f); Text::draw(video::width-Text::fontwidth()*(version.size()+1), video::height*con_height-Text::fontheight()-4, version); gl::disable(GL_TEXTURE_2D); // draw the transparent console background gl::color(1.0f, 1.0f, 1.0f, 0.02f); - gl::begin(gl::Quads); gl::vertex(0.0f, 0.0f, 0.0f); gl::vertex(video::width, 0.0f,0.0f); @@ -150,23 +250,10 @@ void draw() gl::enable(GL_TEXTURE_2D); - //gl::color(0.7f,0.7f,0.7f, 1.0f); - gl::color(1.0f,1.0f,1.0f, 1.0f); - size_t height = (size_t) (video::height * con_height / Text::fontheight()) -1; size_t width = (size_t) (video::width / Text::fontwidth()) -2; size_t bottom = text.size() - console_scroll; size_t current_line = 0; -/* - if (line[0] == '?') - gl::color(0.7f,0.7f,0.7f, 1.0f); - else if (line[0] == '*') - gl::color(1.0f,1.0f,0.0f, 1.0f); - else if (line[0] == '!') - gl::color(1.0f,0.0f,0.0f, 1.0f); - else - gl::color(1.0f,1.0f,1.0f, 1.0f); -*/ std::deque lines; for (std::deque::iterator it = text.begin(); it != text.end() && current_line < bottom; it++) { @@ -175,41 +262,75 @@ void draw() linedata += '\n'; std::string word; + size_t word_length = 0; + std::string line; + size_t line_length = 0; + const char *c = linedata.c_str(); + char pen = 'N'; while (*c) { + + // color code + if (aux::is_color_code(c)) { + c++; + pen = *c; + word += '^'; + word += pen; + } + // new word, wrap if necessary - if ((*c == '\n' ) || ( *c == ' ')) { + else if ((*c == '\n' ) || ( *c == ' ')) { - if (line.size() + word.size() > width) { + if (line_length + word_length > width) { if (line.size()) { lines.push_back(line); line.clear(); + line += '^'; + line += pen; + line_length = 0; } } line.append(word); + line_length += word_length; + word.clear(); - - // force break words longer than width - while (line.size() > width) { - lines.push_back(line.substr(0, width)); - line.erase(0, width); - } - + word_length = 0; + // new line if (*c == '\n' ) { lines.push_back(line); line.clear(); + line_length = 0; // new word } else if (*c == ' ' ) { line += ' '; + line_length++; } + } + // new character - } else { - + else { word += *c; + word_length++; + + if (word_length == width) { + if (line.size()) { + lines.push_back(line); + line.clear(); + line += '^'; + line += pen; + line_length = 0; + } + + line.append(word); + line_length = word_length; + + word.clear(); + word_length = 0; + } } c++; @@ -220,6 +341,7 @@ void draw() } float y = video::height*con_height-2*Text::fontheight()-4; + Text::setcolor('N'); for (std::deque::reverse_iterator rit = lines.rbegin(); (y >= 4) && (rit != lines.rend()); ++rit) { Text::draw(4, y, (*rit)); y -= Text::fontheight(); @@ -228,20 +350,29 @@ void draw() // draw the console input size_t draw_pos = 0; + y = video::height*con_height - Text::fontheight() - 4; + while (input_pos - draw_pos > width) draw_pos += 2; - gl::color(0.0f, 1.0f, 0.0f, 1.0f); - Text::draw(Text::fontwidth(), video::height*con_height - Text::fontheight() - 4, (*history_pos).substr(draw_pos, width)); + Text::draw(4, y, "^B>"); + Text::draw(4+Text::fontwidth(), y , (*history_pos).substr(draw_pos, width-1)); // draw cursor if ((core::application()->time() - ::floorf(core::application()->time())) < 0.5f) { - std::string cursor("_"); - Text::draw(Text::fontwidth()*(input_pos-draw_pos+1), video::height*con_height - Text::fontheight() - 4 , cursor); + std::string cursor("^B_"); + Text::draw(4+Text::fontwidth()*(input_pos-draw_pos+1), y , cursor); } } +void draw(){ + if (visible()) + draw_console(); + else + draw_notify(); +} + void flush() { char line[MAXCMDSIZE]; @@ -279,6 +410,7 @@ void toggle() } else { SDL_WM_GrabInput(SDL_GRAB_ON); SDL_ShowCursor(SDL_DISABLE); + clear_notify(); } setkeyboardmode(console::visible()); @@ -300,6 +432,7 @@ void keypressed(int key) } core::cmd() << (*history_pos) << std::endl; + con_print << "^B>" << (*history_pos) << std::endl; (*history.rbegin()) = (*history_pos); history.push_back(""); @@ -425,22 +558,22 @@ void Console::flush() std::ostream & Console::messagestream() { - return (buffer << ". "); + return (buffer << "^N"); } std::ostream & Console::warningstream() { - return (buffer << "* "); + return (buffer << "^W"); } std::ostream & Console::errorstream() { - return (buffer << "! "); + return (buffer << "^R"); } std::ostream & Console::debugstream() { - return (buffer << "? "); + return (buffer << "^D"); } } // namespace console diff --git a/src/client/input.cc b/src/client/input.cc index 45c39a9..f40591c 100644 --- a/src/client/input.cc +++ b/src/client/input.cc @@ -48,7 +48,7 @@ const float thruster_offset = 0.05f; void init() { - con_print << "Initializing input..." << std::endl; + con_print << "^BInitializing input..." << std::endl; client::setkeyboardmode(false); SDL_ShowCursor(SDL_DISABLE); SDL_WM_GrabInput(SDL_GRAB_ON); @@ -59,7 +59,7 @@ void init() void shutdown() { - con_print << "Shutting down input..." << std::endl; + con_print << "^BShutting down input..." << std::endl; // SDL_EnableUNICODE(0); } diff --git a/src/client/video.cc b/src/client/video.cc index cd25d19..2253c52 100644 --- a/src/client/video.cc +++ b/src/client/video.cc @@ -54,7 +54,7 @@ void reset() bool init() { - con_print << "Initializing video..." << std::endl; + con_print << "^BInitializing video..." << std::endl; // initialize cvars r_width = core::Cvar::get("r_width", width_default, core::Cvar::Archive); @@ -134,7 +134,7 @@ void frame(float seconds) void shutdown() { - con_print << "Shutting down video..." << std::endl; + con_print << "^BShutting down video..." << std::endl; view::shutdown(); diff --git a/src/client/view.cc b/src/client/view.cc index 7d11df3..0fa47d4 100644 --- a/src/client/view.cc +++ b/src/client/view.cc @@ -129,44 +129,36 @@ void draw_status() return; // print the status in the upper left corner - gl::color(1.0f, 1.0f, 1.0f, 1.0f); std::stringstream status; - - /* - int minutes = (int) floorf(core::application()->time() / 60.0f); - int seconds = (int) floorf(core::application()->time() - (float) minutes* 60.0f); - */ - + if (core::game()) { int minutes = (int) floorf(core::game()->clientframetime() / 60.0f); int seconds = (int) floorf( core::game()->clientframetime() - (float) minutes* 60.0f); - status << "time " << std::setfill('0') << std::setw(2) << minutes << ":" << std::setfill('0') << std::setw(2) << seconds; + status << "^Ntime ^B" << std::setfill('0') << std::setw(2) << minutes << "^N:^B" << std::setfill('0') << std::setw(2) << seconds; Text::draw(4, 4, status); } // print stats if desired if (draw_stats && draw_stats->value()) { std::stringstream stats; - stats << "fps " << std::setw(6) << fps << "\n"; + stats << "^Nfps ^B" << std::setw(6) << fps << "\n"; if (core::application()->connected()) { - stats << "tris " << std::setw(5) << render::Stats::tris << "\n"; - stats << "quads " << std::setw(5) << render::Stats::quads << "\n"; + stats << "^Ntris ^B" << std::setw(5) << render::Stats::tris << "\n"; + stats << "^Nquads ^B" << std::setw(5) << render::Stats::quads << "\n"; } - stats << "tx "<< std::setw(5) << (core::Stats::network_bytes_sent >> 10) << "\n"; - stats << "rx "<< std::setw(5) << (core::Stats::network_bytes_received >> 10) << "\n"; + stats << "^Ntx ^B"<< std::setw(5) << (core::Stats::network_bytes_sent >> 10) << "\n"; + stats << "^Nrx ^B"<< std::setw(5) << (core::Stats::network_bytes_received >> 10) << "\n"; Text::draw(video::width-Text::fontwidth()*12, video::height - Text::fontheight()*8, stats); } // draw a basic HUD if (core::localcontrol()) { - gl::color(1.0f,1.0f,1.0f, 1.0f); - status.str(""); - status << "thrust " << std::setfill(' ') << std::setw(5) << std::fixed + status << "^Nthrust ^B" << std::setfill(' ') << std::setw(5) << std::fixed << std::setprecision(2) << core::localcontrol()->thrust() << " "; - status << "speed " << std::setfill(' ') << std::setw(5) << std::fixed + status << "^Nspeed ^B" << std::setfill(' ') << std::setw(5) << std::fixed << std::setprecision(2) << core::localcontrol()->speed(); Text::draw(4, video::height - Text::fontheight() -4, status); @@ -174,48 +166,6 @@ void draw_status() } -void draw_notify() -{ - using namespace render; - - if (console::visible()) - return; - - // draw notifications - gl::color(1.0f, 1.0f, 1.0f, 1.0f); - size_t width = (size_t) ((video::width - 8) / Text::fontwidth()); - size_t n = console::notify_pos % MAXNOTIFYLINES; - float h = 4 + 2*Text::fontheight(); - for (size_t l = 0; l < MAXNOTIFYLINES; l++) { - if (console::notify_text[n].size() > 2 && console::notify_time[n] + 4 > core::application()->time()) { - std::string line(console::notify_text[n]); - - if (line[0] == '?') - gl::color(0.7f,0.7f,0.7f, 1.0f); - else if (line[0] == '*') - gl::color(1.0f,1.0f,0.0f, 1.0f); - else if (line[0] == '!') - gl::color(1.0f,0.0f,0.0f, 1.0f); - else - gl::color(1.0f,1.0f,1.0f, 1.0f); - line.erase(0,2); - - std::deque lines; - - while (line.size() > width) { - Text::draw(4, h, line.substr(0, width)); - line.erase(0, width); - h += Text::fontheight(); - } - if (line.size()) { - Text::draw(4, h, line); - h += Text::fontheight(); - } - } - n = (n+1) % MAXNOTIFYLINES; - } -} - void draw_cursor() { if (!core::localcontrol() || console::visible()) @@ -309,11 +259,8 @@ void frame(float seconds) } // draw text elements - - // FIXME width and height should be derived from texture size Text::setfont("bitmaps/fonts/console", 12, 18); console::draw(); - draw_notify(); chat::draw(); Text::setfont("bitmaps/fonts/gui", 16, 24); -- cgit v1.2.3