Changeset 1499
- Timestamp:
- Jun 19, 2012, 7:33:35 AM (11 years ago)
- Location:
- trunk/neercs
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/neercs/Makefile.am
r1485 r1499 8 8 \ 9 9 video/render.cpp video/render.h \ 10 video/text-render.cpp video/text-render.h \ 10 11 video/blurh.lolfx video/blurv.lolfx video/glow.lolfx \ 11 12 video/postfx.lolfx video/radial.lolfx video/simple.lolfx \ -
trunk/neercs/neercs.vcxproj
r1467 r1499 30 30 <ClInclude Include="neercs.h" /> 31 31 <ClInclude Include="video\render.h" /> 32 <ClInclude Include="video\text-render.h" /> 32 33 </ItemGroup> 33 34 <ItemGroup> 34 35 <ClCompile Include="neercs.cpp" /> 35 36 <ClCompile Include="video\render.cpp" /> 37 <ClCompile Include="video\text-render.cpp" /> 36 38 </ItemGroup> 37 39 <ItemGroup> -
trunk/neercs/neercs.vcxproj.filters
r1467 r1499 6 6 <Filter>video</Filter> 7 7 </ClCompile> 8 <ClCompile Include="video\text-render.cpp"> 9 <Filter>video</Filter> 10 </ClCompile> 8 11 </ItemGroup> 9 12 <ItemGroup> 10 13 <ClInclude Include="neercs.h" /> 11 14 <ClInclude Include="video\render.h"> 15 <Filter>video</Filter> 16 </ClInclude> 17 <ClInclude Include="video\text-render.h"> 12 18 <Filter>video</Filter> 13 19 </ClInclude> -
trunk/neercs/video/render.cpp
r1498 r1499 30 30 #include "../neercs.h" 31 31 #include "render.h" 32 #include "text-render.h" 32 33 33 34 extern char const *lolfx_blurh; … … 37 38 extern char const *lolfx_radial; 38 39 extern char const *lolfx_simple; 39 extern char const *lolfx_text;40 40 41 41 #define DEBUG 1 // debug flag //#if defined(_DEBUG) … … 164 164 FrameBuffer *fbo_blur_h, *fbo_blur_v, *fbo_ping, *fbo_pong; 165 165 166 /*167 * Text rendering interface168 */169 struct TextRender170 {171 TextRender(caca_canvas_t *caca, ivec2 font_size)172 : m_caca(caca),173 m_font_size(font_size),174 m_canvas_size(caca_get_canvas_width(m_caca),175 caca_get_canvas_height(m_caca)),176 m_cells(m_canvas_size.x * m_canvas_size.y)177 {178 for (int j = 0; j < m_canvas_size.y; j++)179 for (int i = 0; i < m_canvas_size.x; i++)180 m_vertices << vec2(i, j);181 }182 183 void Init(ivec2 screen_size)184 {185 m_font = new TileSet("neercs/video/resource/map.png",186 ivec2(256, 256), ivec2(1));187 188 m_shader = Shader::Create(lolfx_text);189 m_coord = m_shader->GetAttribLocation("in_Position",190 VertexUsage::Position, 0);191 m_color = m_shader->GetAttribLocation("in_Attr",192 VertexUsage::Color, 0);193 m_char = m_shader->GetAttribLocation("in_Char",194 VertexUsage::Color, 1);195 m_texture = m_shader->GetUniformLocation("in_Texture");196 m_transform = m_shader->GetUniformLocation("in_Transform");197 m_vdecl198 = new VertexDeclaration(VertexStream<vec2>(VertexUsage::Position),199 VertexStream<uint32_t>(VertexUsage::Color),200 VertexStream<uint32_t>(VertexUsage::Color));201 202 m_vbo1 = new VertexBuffer(m_vertices.Bytes());203 void *vertices = m_vbo1->Lock(0, 0);204 memcpy(vertices, &m_vertices[0], m_vertices.Bytes());205 m_vbo1->Unlock();206 207 m_vbo2 = new VertexBuffer(m_cells * sizeof(int32_t));208 m_vbo3 = new VertexBuffer(m_cells * sizeof(int32_t));209 210 m_fbo = new FrameBuffer(screen_size);211 }212 213 void Render(ivec2 fbo_size)214 {215 /* Transform matrix for the scene:216 * - translate to the centre of the glyph217 * - scale by 2.f * font_size / fbo_size218 * - translate to the upper left corner */219 mat4 xform = mat4::translate(-1.f, 1.f, 0.f)220 * mat4::scale(vec3(2.f * m_font_size / (fbo_size), 1.f)221 * vec3(1.f, -1.f, 1.f))222 * mat4::translate(0.5f, 0.5f, 0.f);223 224 /* Upload libcaca canvas contents to the vertex buffers */225 uint32_t *colors = (uint32_t *)m_vbo2->Lock(0, 0);226 for (int j = 0; j < m_canvas_size.y; j++)227 for (int i = 0; i < m_canvas_size.x; i++)228 {229 uint32_t attr = caca_get_attr(m_caca, i, j);230 uint16_t fg = caca_attr_to_rgb12_fg(attr);231 uint16_t bg = caca_attr_to_rgb12_bg(attr);232 caca_set_color_argb(m_caca, fg, bg);233 attr = caca_get_attr(m_caca, -1, -1);234 caca_put_attr(m_caca, i, j, attr);235 uint32_t a2 = caca_get_attr(m_caca, i, j);236 }237 memcpy(colors, caca_get_canvas_attrs(m_caca),238 m_cells * sizeof(uint32_t));239 m_vbo2->Unlock();240 241 uint32_t *chars = (uint32_t *)m_vbo3->Lock(0, 0);242 memcpy(chars, caca_get_canvas_chars(m_caca),243 m_cells * sizeof(uint32_t));244 m_vbo3->Unlock();245 246 m_fbo->Bind();247 glDisable(GL_DEPTH_TEST);248 glEnable(GL_POINT_SPRITE);249 //glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);250 glDisable(GL_POINT_SMOOTH);251 glPointSize((float)max(m_font_size.x, m_font_size.y));252 m_shader->Bind();253 m_font->Bind();254 m_shader->SetUniform(m_texture, 0);255 m_shader->SetUniform(m_transform, xform);256 m_vdecl->SetStream(m_vbo1, m_coord);257 m_vdecl->SetStream(m_vbo2, m_color);258 m_vdecl->SetStream(m_vbo3, m_char);259 m_vdecl->Bind();260 m_vdecl->DrawElements(MeshPrimitive::Points, 0, m_cells);261 m_vdecl->Unbind();262 m_font->Unbind();263 m_shader->Unbind();264 glDisable(GL_POINT_SPRITE);265 m_fbo->Unbind();266 }267 268 void Blit(ivec2 fbo_size, ivec2 pos, ivec2 size)269 {270 glDisable(GL_BLEND);271 glEnable(GL_TEXTURE_2D);272 glBindTexture(GL_TEXTURE_2D, m_fbo->GetTexture());273 glColor3f(1.0f, 1.0f, 1.0f);274 275 vec2 tc = (vec2)m_canvas_size * m_font_size / fbo_size;276 277 glLoadIdentity();278 glBegin(GL_QUADS);279 glTexCoord2f(tc.x, 1.0f);280 glVertex2i(pos.x + size.x, pos.y);281 glTexCoord2f(0.0f, 1.0f);282 glVertex2i(pos.x, pos.y);283 glTexCoord2f(0.0f, 1.0f - tc.y);284 glVertex2i(pos.x, pos.y + size.y);285 glTexCoord2f(tc.x, 1.0f - tc.y);286 glVertex2i(pos.x + size.x, pos.y + size.y);287 glEnd();288 }289 290 private:291 caca_canvas_t *m_caca;292 ivec2 m_font_size, m_canvas_size;293 int m_cells;294 295 Array<vec2> m_vertices;296 TileSet *m_font;297 Shader *m_shader;298 ShaderAttrib m_coord, m_color, m_char;299 ShaderUniform m_texture, m_transform;300 VertexDeclaration *m_vdecl;301 VertexBuffer *m_vbo1, *m_vbo2, *m_vbo3;302 FrameBuffer *m_fbo;303 };304 305 166 TextRender *text_render; 306 167
Note: See TracChangeset
for help on using the changeset viewer.