summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-08-15 15:25:13 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-08-15 15:25:13 (GMT)
commit98445721fd8151381bb6fab07b9a35c2367867ae (patch)
tree102602942546cab397433a39831f5ac99d3df52d /src
parent2f0e67433c624cd3e006ca3f789e36edc64a894f (diff)
downloadpowder-98445721fd8151381bb6fab07b9a35c2367867ae.zip
powder-98445721fd8151381bb6fab07b9a35c2367867ae.tar.gz
xor_bitmap drawing for renderer
Diffstat (limited to 'src')
-rw-r--r--src/graphics/OpenGLDrawMethods.inl20
-rw-r--r--src/graphics/Renderer.cpp94
-rw-r--r--src/graphics/Renderer.h1
3 files changed, 85 insertions, 30 deletions
diff --git a/src/graphics/OpenGLDrawMethods.inl b/src/graphics/OpenGLDrawMethods.inl
index 02e0378..519515f 100644
--- a/src/graphics/OpenGLDrawMethods.inl
+++ b/src/graphics/OpenGLDrawMethods.inl
@@ -228,16 +228,16 @@ void PIXELMETHODS_CLASS::xor_rect(int x, int y, int width, int height)
void PIXELMETHODS_CLASS::xor_bitmap(unsigned char * bitmap, int x, int y, int w, int h)
{
- /* Rewriting until better method can be found */
//glEnable(GL_COLOR_LOGIC_OP);
//glLogicOp(GL_XOR);
+
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textTexture);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, w, h, 0, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap);
glBegin(GL_QUADS);
glTexCoord2d(0, 0);
@@ -254,22 +254,6 @@ void PIXELMETHODS_CLASS::xor_bitmap(unsigned char * bitmap, int x, int y, int w,
glDisable(GL_TEXTURE_2D);
//glDisable(GL_COLOR_LOGIC_OP);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
-
- /*float old_size;
- glGetFloatv(GL_POINT_SIZE,&old_size);
-
- glPointSize(1.0);
- glBegin(GL_POINTS);
- glColor4f(1.0f,1.0f,1.0f,1.0f);
- for(int i =0; i < w*h; i++)
- {
- if(bitmap[i]==255)
- {
- glVertex2f(x+i%w,y+i/w);
- }
- }
- glEnd();
- glPointSize(old_size);*/
}
void PIXELMETHODS_CLASS::draw_line(int x, int y, int x2, int y2, int r, int g, int b, int a)
diff --git a/src/graphics/Renderer.cpp b/src/graphics/Renderer.cpp
index a2261f8..7467493 100644
--- a/src/graphics/Renderer.cpp
+++ b/src/graphics/Renderer.cpp
@@ -34,7 +34,20 @@ extern "C"
void Renderer::RenderBegin()
{
-#ifndef OGLR
+#ifdef OGLI
+#ifdef OGLR
+ draw_air();
+ draw_grav();
+ render_parts();
+ render_fire();
+ DrawWalls();
+ draw_grav_zones();
+ DrawSigns();
+
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prevFbo);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, partsFbo);
+ glTranslated(0, MENUSIZE, 0);
+#else
if(display_mode & DISPLAY_PERS)
{
std::copy(persistentVid, persistentVid+(VIDXRES*YRES), vid);
@@ -46,12 +59,12 @@ void Renderer::RenderBegin()
vid = warpVid;
std::fill(warpVid, warpVid+(VIDXRES*VIDYRES), 0);
}
-#endif
- //draw_air();
- //draw_grav();
+
+ draw_air();
+ draw_grav();
render_parts();
- //render_fire();
-#ifndef OGLR
+ render_fire();
+
if(display_mode & DISPLAY_PERS)
{
int i,r,g,b;
@@ -69,17 +82,59 @@ void Renderer::RenderBegin()
persistentVid[i] = PIXRGB(r,g,b);
}
}
-#endif
+
DrawWalls();
- //draw_grav_zones();
- //DrawSigns();
-#ifndef OGLR
+ draw_grav_zones();
+ DrawSigns();
if(display_mode & DISPLAY_WARP)
{
vid = oldVid;
}
#endif
-#ifndef OGLI
+#else
+ if(display_mode & DISPLAY_PERS)
+ {
+ std::copy(persistentVid, persistentVid+(VIDXRES*YRES), vid);
+ }
+ pixel * oldVid;
+ if(display_mode & DISPLAY_WARP)
+ {
+ oldVid = vid;
+ vid = warpVid;
+ std::fill(warpVid, warpVid+(VIDXRES*VIDYRES), 0);
+ }
+
+ draw_air();
+ draw_grav();
+ render_parts();
+ render_fire();
+ if(display_mode & DISPLAY_PERS)
+ {
+ int i,r,g,b;
+ for (i = 0; i < VIDXRES*YRES; i++)
+ {
+ r = PIXR(vid[i]);
+ g = PIXG(vid[i]);
+ b = PIXB(vid[i]);
+ if (r>0)
+ r--;
+ if (g>0)
+ g--;
+ if (b>0)
+ b--;
+ persistentVid[i] = PIXRGB(r,g,b);
+ }
+ }
+
+ DrawWalls();
+ draw_grav_zones();
+ DrawSigns();
+
+ if(display_mode & DISPLAY_WARP)
+ {
+ vid = oldVid;
+ }
+
FinaliseParts();
#endif
}
@@ -88,6 +143,8 @@ void Renderer::RenderEnd()
{
#ifdef OGLI
#ifdef OGLR
+ glTranslated(0, -MENUSIZE, 0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, prevFbo);
FinaliseParts();
RenderZoom();
#else
@@ -348,7 +405,7 @@ void Renderer::RenderZoom()
glGetIntegerv(GL_BLEND_SRC, &origBlendSrc);
glGetIntegerv(GL_BLEND_DST, &origBlendDst);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//glBlendFunc(GL_ONE, GL_ZERO);
+ glBlendFunc(GL_ONE, GL_ZERO);
glEnable( GL_TEXTURE_2D );
//glReadBuffer(GL_AUX0);
@@ -2393,6 +2450,19 @@ Renderer::Renderer(Graphics * g, Simulation * sim):
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
+ //Temptexture
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, &textTexture);
+ glBindTexture(GL_TEXTURE_2D, textTexture);
+
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
loadShaders();
#endif
prepare_alpha(CELL, 1.0f);
diff --git a/src/graphics/Renderer.h b/src/graphics/Renderer.h
index 6e814cc..2f9f404 100644
--- a/src/graphics/Renderer.h
+++ b/src/graphics/Renderer.h
@@ -85,6 +85,7 @@ public:
void checkProgram(GLuint program, char * progname);
void loadShaders();
GLuint vidBuf,textTexture;
+ GLint prevFbo;
#endif
pixel * vid;
pixel * persistentVid;