From 2f703068952f9e820e17ac8c977d0f3b82a73017 Mon Sep 17 00:00:00 2001
From: rez <chiptune@gmail.com>
Date: Wed, 11 Jul 2012 16:28:16 +0000
Subject: [PATCH] updated border autoresize + canvas resize

---
 neercs/neercs.cpp       |   2 +-
 neercs/video/render.cpp | 150 ++++++++++++++++++----------------------
 neercs/video/render.h   |   2 +-
 3 files changed, 71 insertions(+), 83 deletions(-)

diff --git a/neercs/neercs.cpp b/neercs/neercs.cpp
index b7190a9..572343e 100644
--- a/neercs/neercs.cpp
+++ b/neercs/neercs.cpp
@@ -46,7 +46,7 @@ using namespace lol;
 
 Neercs::Neercs()
   : m_ready(false),
-    m_caca(caca_create_canvas(47, 32)),
+    m_caca(caca_create_canvas(10, 10)),
     m_render(new Render(m_caca)),
     m_time(0.f)
 {
diff --git a/neercs/video/render.cpp b/neercs/video/render.cpp
index eaea2da..54a4335 100644
--- a/neercs/video/render.cpp
+++ b/neercs/video/render.cpp
@@ -81,15 +81,13 @@ float beat_angle = 0;      // angle
 float beat_value = 0;      // value
 float beat_speed = 2.0f;   // speed
 /* window variable */
-ivec2 border;            // margin
-int window_vtx[8];         // vertex array
+ivec2 border;              // border width
 /* text variable */
 ivec2 ratio_2d(2,2);       // 2d ratio
 ivec2 map_size(256,256);   // texture map size
 ivec2 font_size(8,8);      // font size
-ivec2 text_size(0,0);      // text size
-ivec2 blit_top(0,0);       // text blit top position
-ivec2 blit_bottom(0,0);    // text blit bottom position
+ivec2 canvas_char(0,0);    // canvas char number
+ivec2 canvas_size(0,0);    // caca size
 /* common variable */
 float value, angle, radius, scale, speed;
 /* shader variable */
@@ -174,83 +172,73 @@ int Render::InitDraw(void)
     glEnable(GL_CULL_FACE);   // disable cull face
     glCullFace(GL_BACK);      // don't draw front face
 
-    /* Initialise framebuffer objects */
-    fbo_back = new FrameBuffer(screen_size);
-    fbo_front = new FrameBuffer(screen_size);
-    fbo_blur_h = new FrameBuffer(screen_size / glow_fbo_size);
-    fbo_blur_v = new FrameBuffer(screen_size / glow_fbo_size);
-    fbo_ping = new FrameBuffer(screen_size);
-    fbo_pong = new FrameBuffer(screen_size);
-    // shader simple
-    shader_simple = Shader::Create(lolfx_simple);
-    shader_simple_texture = shader_simple->GetUniformLocation("texture");
-    // shader blur horizontal
-    shader_blur_h = Shader::Create(lolfx_blurh);
-    shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture");
-    shader_blur_h_screen_size = shader_blur_h->GetUniformLocation("screen_size");
-    shader_blur_h_time = shader_blur_h->GetUniformLocation("time");
-    shader_blur_h_value = shader_blur_h->GetUniformLocation("value");
-    // shader blur vertical
-    shader_blur_v = Shader::Create(lolfx_blurv);
-    shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture");
-    shader_blur_v_screen_size = shader_blur_v->GetUniformLocation("screen_size");
-    shader_blur_v_time = shader_blur_v->GetUniformLocation("time");
-    shader_blur_v_value = shader_blur_v->GetUniformLocation("value");
-    // shader glow
-    shader_glow = Shader::Create(lolfx_glow);
-    shader_glow_texture = shader_glow->GetUniformLocation("texture");
-    shader_glow_texture_prv = shader_glow->GetUniformLocation("texture_prv");
-    shader_glow_screen_size = shader_glow->GetUniformLocation("screen_size");
-    shader_glow_time = shader_glow->GetUniformLocation("time");
-    shader_glow_step = shader_glow->GetUniformLocation("step");
-    shader_glow_value1 = shader_glow->GetUniformLocation("value1");
-    shader_glow_value2 = shader_glow->GetUniformLocation("value2");
-    // shader radial
-    shader_radial = Shader::Create(lolfx_radial);
-    shader_radial_texture = shader_radial->GetUniformLocation("texture");
-    shader_radial_screen_size = shader_radial->GetUniformLocation("screen_size");
-    shader_radial_time = shader_radial->GetUniformLocation("time");
-    shader_radial_value1 = shader_radial->GetUniformLocation("value1");
-    shader_radial_value2 = shader_radial->GetUniformLocation("value2");
-    shader_radial_color = shader_radial->GetUniformLocation("color");
-    // shader postfx
-    shader_postfx = Shader::Create(lolfx_postfx);
-    shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
-    shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d");
-    shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size");
-    shader_postfx_time = shader_postfx->GetUniformLocation("time");
-    shader_postfx_flash = shader_postfx->GetUniformLocation("flash");
-    shader_postfx_value = shader_postfx->GetUniformLocation("value");
-    shader_postfx_deform = shader_postfx->GetUniformLocation("deform");
-    shader_postfx_scanline = shader_postfx->GetUniformLocation("scanline");
-    shader_postfx_sync = shader_postfx->GetUniformLocation("sync");
+    if (m_shader)
+    {
+        /* Initialise framebuffer objects */
+        fbo_back = new FrameBuffer(screen_size);
+        fbo_front = new FrameBuffer(screen_size);
+        fbo_blur_h = new FrameBuffer(screen_size / glow_fbo_size);
+        fbo_blur_v = new FrameBuffer(screen_size / glow_fbo_size);
+        fbo_ping = new FrameBuffer(screen_size);
+        fbo_pong = new FrameBuffer(screen_size);
+        // shader simple
+        shader_simple = Shader::Create(lolfx_simple);
+        shader_simple_texture = shader_simple->GetUniformLocation("texture");
+        // shader blur horizontal
+        shader_blur_h = Shader::Create(lolfx_blurh);
+        shader_blur_h_texture = shader_blur_h->GetUniformLocation("texture");
+        shader_blur_h_screen_size = shader_blur_h->GetUniformLocation("screen_size");
+        shader_blur_h_time = shader_blur_h->GetUniformLocation("time");
+        shader_blur_h_value = shader_blur_h->GetUniformLocation("value");
+        // shader blur vertical
+        shader_blur_v = Shader::Create(lolfx_blurv);
+        shader_blur_v_texture = shader_blur_v->GetUniformLocation("texture");
+        shader_blur_v_screen_size = shader_blur_v->GetUniformLocation("screen_size");
+        shader_blur_v_time = shader_blur_v->GetUniformLocation("time");
+        shader_blur_v_value = shader_blur_v->GetUniformLocation("value");
+        // shader glow
+        shader_glow = Shader::Create(lolfx_glow);
+        shader_glow_texture = shader_glow->GetUniformLocation("texture");
+        shader_glow_texture_prv = shader_glow->GetUniformLocation("texture_prv");
+        shader_glow_screen_size = shader_glow->GetUniformLocation("screen_size");
+        shader_glow_time = shader_glow->GetUniformLocation("time");
+        shader_glow_step = shader_glow->GetUniformLocation("step");
+        shader_glow_value1 = shader_glow->GetUniformLocation("value1");
+        shader_glow_value2 = shader_glow->GetUniformLocation("value2");
+        // shader radial
+        shader_radial = Shader::Create(lolfx_radial);
+        shader_radial_texture = shader_radial->GetUniformLocation("texture");
+        shader_radial_screen_size = shader_radial->GetUniformLocation("screen_size");
+        shader_radial_time = shader_radial->GetUniformLocation("time");
+        shader_radial_value1 = shader_radial->GetUniformLocation("value1");
+        shader_radial_value2 = shader_radial->GetUniformLocation("value2");
+        shader_radial_color = shader_radial->GetUniformLocation("color");
+        // shader postfx
+        shader_postfx = Shader::Create(lolfx_postfx);
+        shader_postfx_texture = shader_postfx->GetUniformLocation("texture");
+        shader_postfx_texture_2d = shader_postfx->GetUniformLocation("texture_2d");
+        shader_postfx_screen_size = shader_postfx->GetUniformLocation("screen_size");
+        shader_postfx_time = shader_postfx->GetUniformLocation("time");
+        shader_postfx_flash = shader_postfx->GetUniformLocation("flash");
+        shader_postfx_value = shader_postfx->GetUniformLocation("value");
+        shader_postfx_deform = shader_postfx->GetUniformLocation("deform");
+        shader_postfx_scanline = shader_postfx->GetUniformLocation("scanline");
+        shader_postfx_sync = shader_postfx->GetUniformLocation("sync");
+    }
 
     return true;
 }
 
-int Render::CreateGLWindow(caca_canvas_t *caca)
+int Render::CreateGLWindow()
 {
     screen_size = Video::GetSize();
-
     border = 12 * ratio_2d;
-    window_vtx[0] = font_size.x * ratio_2d.x / 2.0f;
-    window_vtx[1] = font_size.y * ratio_2d.y / 2.0f;
-    window_vtx[2] = font_size.x * ratio_2d.x / 2.0f;
-    window_vtx[3] = -font_size.y * ratio_2d.y / 2.0f;
-    window_vtx[4] = -font_size.x * ratio_2d.x / 2.0f;
-    window_vtx[5] = -font_size.y * ratio_2d.y / 2.0f;
-    window_vtx[6] = -font_size.x * ratio_2d.x / 2.0f;
-    window_vtx[7] = font_size.y * ratio_2d.y / 2.0f;
-
-    ivec2 current_size = (screen_size - border * 2);
-    text_size = current_size / (font_size * ratio_2d);
-
-    //border
+    canvas_char = (screen_size - border * 2) / (font_size * ratio_2d);
+    canvas_size = canvas_char * font_size * ratio_2d;
 
-    blit_top = border;
-    blit_bottom = screen_size - border * 2;
+    border = (screen_size - canvas_size) / 2;
 
-    caca_set_canvas_size(caca,text_size.x,text_size.y);
+    caca_set_canvas_size(m_caca, canvas_char.x, canvas_char.y);
 
     InitDraw();
     return true;
@@ -286,7 +274,7 @@ void Render::TickDraw(float seconds)
     if (Input::GetButtonState(27/*SDLK_ESCAPE*/))
         Ticker::Shutdown();
     //if (Input::GetButtonState(282/*SDLK_F1*/))
-    //    Pause();
+    //    LEAULE();
     if (Input::GetButtonState(283/*SDLK_F2*/))
         {
         m_polygon=!m_polygon;
@@ -307,7 +295,7 @@ void Render::TickDraw(float seconds)
 
     if (!m_ready)
     {
-        CreateGLWindow(m_caca);
+        CreateGLWindow();
         text_render->Init();
         m_ready = true;
     }
@@ -377,7 +365,7 @@ void Render::Draw2D()
     glClearDepth(1.0f); // set depth buffer
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-    text_render->Blit(blit_top, blit_bottom);
+    text_render->Blit(border, canvas_size);
 
     //if(m_polygon) glEnable(GL_LINE_SMOOTH); else glDisable(GL_LINE_SMOOTH);
     glLineWidth((m_polygon)?2.0f:1.0f);
@@ -388,14 +376,14 @@ void Render::Draw2D()
     mat4 m = mat4::ortho(0, screen_size.x, screen_size.y, 0, -1.f, 1.f);
     glLoadMatrixf(&m[0][0]);
     glMatrixMode(GL_MODELVIEW);
-    // draw window
+    // draw border
     glDisable(GL_TEXTURE_2D);
     glDisable(GL_BLEND);
     glColor3f(1.0f,1.0f,1.0f);
-    rectangle(border.x+ratio_2d.x,border.y,screen_size.x-2*ratio_2d.x-border.x*2,ratio_2d.y);//(font_size.y+2)*ratio_2d.y);
-    rectangle(border.x,border.y+ratio_2d.y,ratio_2d.x,screen_size.y-ratio_2d.y*2-border.y*2);
-    rectangle(screen_size.x-ratio_2d.x-border.x,border.y+ratio_2d.y,ratio_2d.x,screen_size.y-2*ratio_2d.y-border.y*2);
-    rectangle(border.x+ratio_2d.x,screen_size.y-ratio_2d.y-border.y,screen_size.x-2*ratio_2d.x-border.x*2,ratio_2d.y);
+    rectangle(border.x - ratio_2d.x, border.y - ratio_2d.y, canvas_size.x + ratio_2d.x * 2, ratio_2d.y);
+    rectangle(border.x - ratio_2d.x, border.y, ratio_2d.x, canvas_size.y);
+    rectangle(border.x + canvas_size.x, border.y, ratio_2d.x, canvas_size.y);
+    rectangle(border.x - ratio_2d.x, border.y + canvas_size.y, canvas_size.x + ratio_2d.x * 2, ratio_2d.y);
     glEnable(GL_BLEND);
 }
 
diff --git a/neercs/video/render.h b/neercs/video/render.h
index 6c04cc9..c10d7bb 100644
--- a/neercs/video/render.h
+++ b/neercs/video/render.h
@@ -20,7 +20,7 @@ protected:
     void Draw3D();
 
 private:
-    int CreateGLWindow(caca_canvas_t *m_caca);
+    int CreateGLWindow();
     int InitDraw();
     void Pause();
     void Shader();