Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/render.cc')
-rw-r--r--src/render/render.cc207
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);
+ }
+}
+
}