Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/console.cc')
-rw-r--r--src/client/console.cc127
1 files changed, 103 insertions, 24 deletions
diff --git a/src/client/console.cc b/src/client/console.cc
index 50093f9..a0cc7c5 100644
--- a/src/client/console.cc
+++ b/src/client/console.cc
@@ -40,31 +40,87 @@ std::ostream & Console::debugstream()
void Console::draw()
{
using namespace render;
-
+
+ // flush console messages in the buffer
flush();
float height;
+ bool showloader = false;
if (core::game()) {
- if (!core::game()->ready())
+ if (!core::game()->ready()) {
height = 0.6f;
- else if (visible)
+ showloader = true;
+ } else if (visible)
height = 0.6f;
else
- return;
- } else
+ height = 0.0f;
+ } else {
+ showloader = true;
height = 1.0f;
+ }
+
+ if (showloader) {
+ // draw the loader background
+ gl::color(0.5f, 0.5f, 0.5f, 1.0f);
+
+ gl::begin(gl::Quads);
+ gl::vertex(0,0, 0);
+ gl::vertex(video.width,0,0);
+ gl::vertex(video.width,video.height,0);
+ gl::vertex(0,video.height,0);
+ gl::end();
+ }
+
+ if (height > 0) {
+ // draw version below the bottom of the console
+ gl::color(0.0f, 1.0f, 0.0f, 1.0f);
+ std:: string version = std::string("The Osirion Project ");
+ version.append(PACKAGE_VERSION);
+ draw_text(video.width-CHARSIZE*(version.size()+1), video.height*height-CHARSIZE-4, version);
+
+ // draw the transparent console background
+ gl::color(1, 1, 1, .5);
+
+ gl::enable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, render::textures[0]); // bitmaps/loader.tga
+
+ gl::begin(gl::Quads);
+ glTexCoord2f(0.0f, 0.0f);
+ gl::vertex(0,0, 0);
+
+ glTexCoord2f(1.0f, 0.0f);
+ gl::vertex(video.width,0,0);
+
+ glTexCoord2f(1.0f, 1.0f);
+ gl::vertex(video.width,video.height*height,0);
+
+ glTexCoord2f(0.0f, 1.0f);
+ gl::vertex(0,video.height*height,0);
+
+ gl::end();
+
+ glBindTexture(GL_TEXTURE_2D, render::textures[1]); // bitmaps/conchars.tga
+ gl::enable(GL_BLEND);
+
+ // draw the console text
+ gl::color(1,1,1,1);
+ std::deque<std::string>::reverse_iterator rit = console.text.rbegin();
+ float y = video.height*height-2*CHARSIZE-8;
+ while (y > 0 && rit < console.text.rend()) {
+ draw_text(0, y, *rit);
+ y -= CHARSIZE;
+ ++rit;
+ }
+
+ // draw the console input
+ gl::color(0.0f, 1.0f, 0.0f, 1.0f);
+ draw_text(0, video.height*height - CHARSIZE - 4, input);
+
+ gl::disable(GL_TEXTURE_2D);
+ gl::disable(GL_BLEND);
+ }
- // console background rectangle
- gl::enable(GL_BLEND);
- gl::begin(gl::Quads);
- gl::color(1, 1, 1, .1);
- gl::vertex(-0.5f*video.ratio , 0.5, -1.0f);
- gl::vertex(0.5f*video.ratio ,0.5, -1.0f);
- gl::vertex(0.5f*video.ratio , 0.5-height, -1.0f);
- gl::vertex(-0.5f*video.ratio , 0.5-height, -1.0f);
- gl::end();
- gl::disable(GL_BLEND);
}
void Console::flush()
@@ -72,16 +128,10 @@ void Console::flush()
char line[MAXCMDSIZE];
while(this->buffer.getline(line, MAXCMDSIZE-1)) {
- while (text.size() >= 32765 - MAXCMDSIZE) {
- size_t i = 0;
- while (i+1 < text.size() && text[i] != '\n')
- i++;
- text.erase(0, i+1);
+ while (text.size() >= MAXCONLINES) {
+ text.pop_front();
}
-
- text.append(line);
- text.append("\n");
-
+ text.push_back(std::string(line));
std::cout << line << std::endl;
}
@@ -93,4 +143,33 @@ void Console::toggle()
visible = !visible;
}
+void Console::handle_keyreleased(SDL_keysym* keysym)
+{
+ switch( keysym->sym ) {
+ case '`':
+ case '~':
+ toggle();
+ return;
+ break;
+
+ case SDLK_RETURN:
+ if (input.size()) {
+ core::cmd << input << std::endl;
+ input.clear();
+ }
+ break;
+ case SDLK_BACKSPACE:
+ if (input.size()) {
+ input.erase(input.size()-1, 1);
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (keysym->sym >= 32 && keysym->sym <= 175) {
+ input += (char) keysym->sym;
+ }
+}
+
} // namespace client