diff options
author | Stijn Buys <ingar@osirion.org> | 2008-10-12 14:55:10 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-10-12 14:55:10 +0000 |
commit | b417df720584c101f3799874a0c836a543a8d0a8 (patch) | |
tree | fb7105ed662f13753a6ab8d3efb047bad04f2316 /src/render/render.cc | |
parent | 18383a5fc596bf9546f14d7393ee66c57720b116 (diff) |
user interface updates, work-in-progress
Diffstat (limited to 'src/render/render.cc')
-rw-r--r-- | src/render/render.cc | 207 |
1 files changed, 179 insertions, 28 deletions
diff --git a/src/render/render.cc b/src/render/render.cc index 3ba7e92..fbbaba1 100644 --- a/src/render/render.cc +++ b/src/render/render.cc @@ -9,15 +9,15 @@ #include <sstream> #include <iomanip> +#include "auxiliary/functions.h" +#include "core/core.h" +#include "filesystem/filesystem.h" +#include "model/model.h" #include "render/gl.h" #include "render/dust.h" #include "render/textures.h" #include "render/tga.h" #include "render/render.h" -#include "model/model.h" - -#include "core/core.h" -#include "filesystem/filesystem.h" #include "sys/sys.h" namespace render { @@ -28,6 +28,10 @@ core::Cvar *r_grid = 0; core::Cvar *r_radius = 0; core::Cvar *r_sky = 0; core::Cvar *r_wireframe = 0; +core::Cvar *screenshotformat = 0; +core::Cvar *screenshotquality = 0; + +int screenshot_number = 0; using model::VertexArray; VertexArray *vertexarray = 0; @@ -37,6 +41,62 @@ void func_list_textures(std::string const &args) Textures::list(); } +void reset_gl() +{ + // setup our viewport. + gl::viewport(0, 0, Camera::width(), Camera::height()); + + // set clear color + gl::clearcolor(0.0f, 0.0f, 0.0f, 1.0f); + + // load identity matrices + gl::matrixmode(GL_MODELVIEW); + gl::loadidentity(); + + gl::matrixmode(GL_MODELVIEW); + gl::loadidentity(); + + // shading model: Gouraud (smooth, the default) + gl::shademodel(GL_SMOOTH); + //gl::shademodel(GL_FLAT); + + // lighting settings for the default light GL_LIGHT0 + GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 }; + GLfloat ambient_light[] = { 0.01f, 0.01f, 0.01f, 1.0f }; + GLfloat diffuse_light[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + GLfloat specular_light[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + + glLightfv(GL_LIGHT0, GL_POSITION, light_position); + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_light); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular_light); + + // GL_LIGHT0 is always enabled + gl::enable(GL_LIGHT0); + + // color tracking + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + + // material settings + GLfloat specular_reflectance[] = { 0.2f, 0.2f, 0.2f, 1.0f }; + glMaterialfv(GL_FRONT, GL_SPECULAR, specular_reflectance); + glMateriali(GL_FRONT, GL_SHININESS, 128); // shininess 1-128 + + // alpha blending function + gl::blendfunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + gl::disable(GL_LIGHTING); + gl::disable(GL_COLOR_MATERIAL); + + gl::cullface(GL_BACK); + gl::frontface(GL_CCW); + gl::disable(GL_CULL_FACE); + gl::disable(GL_DEPTH_TEST); + gl::disable(GL_BLEND); + + gl::disable(GL_TEXTURE_2D); +} + void init() { con_print << "^BInitializing renderer..." << std::endl; @@ -72,6 +132,14 @@ void init() r_sky = core::Cvar::get("r_sky", "1", core::Cvar::Archive); r_sky->set_info("[bool] render the sky globe"); + screenshotformat = core::Cvar::get("screenshotformat", "jpg", core::Cvar::Archive); + screenshotformat->set_info("[string] screenshot format: jpg png tga"); + + screenshotquality = core::Cvar::get("screenshotquality", "85", core::Cvar::Archive); + screenshotquality->set_info("[int] screenshot jpg quality"); + + reset_gl(); + Camera::init(); Textures::init(); @@ -84,6 +152,32 @@ void init() func->set_info("list loaded textures"); } +// unload game assets (zone change) +void unload() +{ + // clear zone sky textures + for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) { + core::Zone *zone = (*it).second; + if (zone->sky_texture()) { + render::Textures::unload(zone->sky_texture()); + zone->set_sky_texture(0); + } + } + + for (core::Entity::Registry::iterator it = core::Entity::registry().begin(); it != core::Entity::registry().end(); it++) { + core:: Entity *entity = (*it).second; + + if (entity->type() == core::Entity::Globe) { + core::EntityGlobe *globe = static_cast<core::EntityGlobe *>(entity); + if (globe->render_texture) { + render::Textures::unload(globe->render_texture); + globe->render_texture = 0; + } + } + } +} + +// clear all assets void clear() { // clear zone sky textures @@ -113,30 +207,7 @@ void clear() vertexarray = 0; } -void unload() -{ - // clear zone sky textures - for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) { - core::Zone *zone = (*it).second; - if (zone->sky_texture()) { - render::Textures::unload(zone->sky_texture()); - zone->set_sky_texture(0); - } - } - - for (core::Entity::Registry::iterator it = core::Entity::registry().begin(); it != core::Entity::registry().end(); it++) { - core:: Entity *entity = (*it).second; - - if (entity->type() == core::Entity::Globe) { - core::EntityGlobe *globe = static_cast<core::EntityGlobe *>(entity); - if (globe->render_texture) { - render::Textures::unload(globe->render_texture); - globe->render_texture = 0; - } - } - } -} - +// reset render subsystem void reset() { clear(); @@ -151,6 +222,8 @@ void reset() (*r_arraysize) = (float) mb; vertexarray = new VertexArray(mb); + reset_gl(); + Dust::reset(); } void shutdown() @@ -170,5 +243,83 @@ void shutdown() Dust::shutdown(); } + +void screenshot() +{ + bool available = false; + std::string shortname; + std::string filename; + const int TYPETGA = 0; + const int TYPEPNG = 1; + const int TYPEJPG = 2; + int filetype = TYPETGA; + + // make sure the screenshots folder exists + filename.assign(filesystem::writedir()); + filename.append("screenshots/"); + sys::mkdir(filename); + + aux::lowercase(screenshotformat->str()); + + if ((screenshotformat->str().compare("jpg") == 0) || (screenshotformat->str().compare("jpeg") == 0)) { + filetype = TYPEJPG; + if (screenshotquality->value() < 10) { + (*screenshotquality) = 10; + } else if (screenshotquality->value() > 100) { + (*screenshotquality) = 100; + } + + } else if (screenshotformat->str().compare("png") == 0) { + filetype = TYPEPNG; + + } else if (screenshotformat->str().compare("tga") == 0) { + filetype = TYPETGA; + + } else { + filetype = TYPETGA; + (*screenshotformat) = "tga"; + } + + // find the first available screenshotxxxx + do { + std::stringstream nstr; + nstr << screenshot_number; + shortname.assign(nstr.str()); + + while(shortname.size() < 4) + shortname.insert(0, 1, '0'); + + shortname.insert(0, "screenshots/osirion"); + shortname.append("."); + shortname.append(screenshotformat->str()); + + filename.assign(filesystem::writedir()); + filename.append(shortname); + + FILE *handle = fopen(filename.c_str(), "r"); + if (handle) { + fclose(handle); + } else { + available = true; + } + screenshot_number++; + } while (!available); + + render::Image image(Camera::width(), Camera::height(), 3); + + glReadPixels(0, 0, (GLsizei) Camera::width(), (GLsizei) Camera::height(), + GL_RGB, GL_UNSIGNED_BYTE, (void *) image.data()); + + image.flip(); + + if (filetype == TYPEPNG) { + render::PNG::save(filename.c_str(), image); + } else if (filetype == TYPEJPG) { + render::JPG::save(filename.c_str(), image, (int) screenshotquality->value()); + } else if (filetype == TYPETGA) { + render::TGA::save(filename.c_str(), image); + } +} + } |