clear viewport

This commit is contained in:
David Rose 2008-05-05 04:04:22 +00:00
parent 9787429186
commit c72cf3f452
4 changed files with 74 additions and 34 deletions

View File

@ -25,6 +25,6 @@ void glopClear(GLContext *c,GLParam *p)
/* TODO : correct value of Z */ /* TODO : correct value of Z */
ZB_clear(c->zb,mask & GL_DEPTH_BUFFER_BIT,z, ZB_clear(c->zb,mask & GL_DEPTH_BUFFER_BIT,z,
mask & GL_COLOR_BUFFER_BIT,r,g,b); mask & GL_COLOR_BUFFER_BIT,r,g,b,0);
} }

View File

@ -677,20 +677,30 @@ clear(DrawableRegion *clearable) {
set_state_and_transform(RenderState::make_empty(), _internal_transform); set_state_and_transform(RenderState::make_empty(), _internal_transform);
int mask = 0; bool clear_color = false;
int r, g, b, a;
if (clearable->get_clear_color_active()) { if (clearable->get_clear_color_active()) {
Colorf v = clearable->get_clear_color(); Colorf v = clearable->get_clear_color();
glClearColor(v[0],v[1],v[2],v[3]); r = (int)(v[0] * 0xffff);
mask |= GL_COLOR_BUFFER_BIT; g = (int)(v[1] * 0xffff);
b = (int)(v[2] * 0xffff);
a = (int)(v[3] * 0xffff);
clear_color = true;
} }
bool clear_z = false;
int z;
if (clearable->get_clear_depth_active()) { if (clearable->get_clear_depth_active()) {
glClearDepth(clearable->get_clear_depth()); // We ignore the specified depth clear value, since we don't
mask |= GL_DEPTH_BUFFER_BIT; // support alternate depth compare functions anyway.
z = 0;
clear_z = true;
} }
glClear(mask); ZB_clear_viewport(_c->zb, clear_z, z,
clear_color, r, g, b, a,
_c->viewport.xmin, _c->viewport.ymin,
_c->viewport.xsize, _c->viewport.ysize);
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -712,24 +722,24 @@ prepare_display_region(DisplayRegionPipelineReader *dr,
int xsize = GLsizei(w); int xsize = GLsizei(w);
int ysize = GLsizei(h); int ysize = GLsizei(h);
int xsize_req=xmin+xsize; int xsize_req = xmin + xsize;
int ysize_req=ymin+ysize; int ysize_req = ymin + ysize;
if (_c->gl_resize_viewport && if (_c->gl_resize_viewport &&
_c->gl_resize_viewport(_c,&xsize_req,&ysize_req) != 0) { _c->gl_resize_viewport(_c, &xsize_req, &ysize_req) != 0) {
gl_fatal_error("glViewport: error while resizing display"); gl_fatal_error("glViewport: error while resizing display");
} }
xsize=xsize_req-xmin; xsize = xsize_req - xmin;
ysize=ysize_req-ymin; ysize = ysize_req - ymin;
if (xsize <= 0 || ysize <= 0) { if (xsize <= 0 || ysize <= 0) {
gl_fatal_error("glViewport: size too small"); gl_fatal_error("glViewport: size too small");
} }
_c->viewport.xmin=xmin; _c->viewport.xmin = xmin;
_c->viewport.ymin=ymin; _c->viewport.ymin = ymin;
_c->viewport.xsize=xsize; _c->viewport.xsize = xsize;
_c->viewport.ysize=ysize; _c->viewport.ysize = ysize;
gl_eval_viewport(_c); gl_eval_viewport(_c);
} }

View File

@ -293,7 +293,7 @@ void memset_RGB24(void *adr,int r, int v, int b,long count)
} }
void ZB_clear(ZBuffer * zb, int clear_z, int z, void ZB_clear(ZBuffer * zb, int clear_z, int z,
int clear_color, int r, int g, int b) int clear_color, int r, int g, int b, int a)
{ {
int color; int color;
int y; int y;
@ -303,11 +303,37 @@ void ZB_clear(ZBuffer * zb, int clear_z, int z,
memset_s(zb->zbuf, z, zb->xsize * zb->ysize); memset_s(zb->zbuf, z, zb->xsize * zb->ysize);
} }
if (clear_color) { if (clear_color) {
color = RGBA_TO_PIXEL(r, g, b, a);
pp = zb->pbuf; pp = zb->pbuf;
for (y = 0; y < zb->ysize; y++) { for (y = 0; y < zb->ysize; y++) {
color = RGB_TO_PIXEL(r, g, b);
memset_l(pp, color, zb->xsize); memset_l(pp, color, zb->xsize);
pp = (PIXEL *) ((char *) pp + zb->linesize); pp = (PIXEL *) ((char *) pp + zb->linesize);
} }
} }
} }
void ZB_clear_viewport(ZBuffer * zb, int clear_z, int z,
int clear_color, int r, int g, int b, int a,
int xmin, int ymin, int xsize, int ysize)
{
int color;
int y;
PIXEL *pp;
unsigned short *zz;
if (clear_z) {
zz = zb->zbuf + xmin;
for (y = ymin; y < ymin + ysize; ++y) {
memset_s(zz, z, xsize);
zz += zb->xsize;
}
}
if (clear_color) {
color = RGBA_TO_PIXEL(r, g, b, a);
pp = zb->pbuf + xmin;
for (y = ymin; y < ymin + ysize; ++y) {
memset_l(pp, color, xsize);
pp = (PIXEL *) ((char *) pp + zb->linesize);
}
}
}

View File

@ -117,7 +117,11 @@ void ZB_close(ZBuffer *zb);
void ZB_resize(ZBuffer *zb,void *frame_buffer,int xsize,int ysize); void ZB_resize(ZBuffer *zb,void *frame_buffer,int xsize,int ysize);
void ZB_clear(ZBuffer *zb,int clear_z,int z, void ZB_clear(ZBuffer *zb,int clear_z,int z,
int clear_color,int r,int g,int b); int clear_color,int r,int g,int b,int a);
void ZB_clear_viewport(ZBuffer * zb, int clear_z, int z,
int clear_color, int r, int g, int b, int a,
int xmin, int ymin, int xsize, int ysize);
/* linesize is in BYTES */ /* linesize is in BYTES */
void ZB_copyFrameBuffer(ZBuffer *zb,void *buf,int linesize); void ZB_copyFrameBuffer(ZBuffer *zb,void *buf,int linesize);