show-buffers is more useful with cube map

This commit is contained in:
David Rose 2005-07-21 20:32:27 +00:00
parent 314630126f
commit 37bd636290
2 changed files with 45 additions and 6 deletions

View File

@ -80,6 +80,7 @@ GraphicsOutput(GraphicsPipe *pipe, GraphicsStateGuardian *gsg,
_flip_ready = false;
_needs_context = true;
_cube_map_index = -1;
_cube_map_dr = NULL;
_sort = 0;
_internal_sort_index = 0;
_active = true;
@ -590,6 +591,18 @@ make_texture_buffer(const string &name, int x_size, int y_size,
return NULL;
}
struct ShowBuffersCubeMapRegions {
float l, r, b, t;
};
static ShowBuffersCubeMapRegions cube_map_regions[6] = {
{ 0.0, 0.3333, 0.5, 1.0 },
{ 0.0, 0.3333, 0.0, 0.5 },
{ 0.3333, 0.6667, 0.5, 1.0 },
{ 0.3333, 0.6667, 0.0, 0.5 },
{ 0.6667, 1.0, 0.5, 1.0 },
{ 0.6667, 1.0, 0.0, 0.5 },
};
////////////////////////////////////////////////////////////////////
// Function: GraphicsOutput::make_cube_map
// Access: Published
@ -641,7 +654,20 @@ make_cube_map(const string &name, int size, bool to_ram,
tex->setup_cube_map();
tex->set_wrap_u(Texture::WM_clamp);
tex->set_wrap_v(Texture::WM_clamp);
GraphicsOutput *buffer = make_texture_buffer(name, size, size, tex, to_ram);
GraphicsOutput *buffer;
if (show_buffers) {
// If show_buffers is true, we'd like to create a window with the
// six buffers spread out and all visible at once, for the user's
// convenience.
buffer = make_texture_buffer(name, size * 3, size * 2, tex, to_ram);
tex->set_x_size(size);
tex->set_y_size(size);
} else {
// In the normal case, the six buffers are stacked on top of each
// other like pancakes.
buffer = make_texture_buffer(name, size, size, tex, to_ram);
}
// We don't need to clear the overall buffer; instead, we'll clear
// each display region.
@ -658,7 +684,13 @@ make_cube_map(const string &name, int size, bool to_ram,
NodePath camera_np = camera_rig.attach_new_node(camera);
camera_np.look_at(cube_faces[i]._look_at, cube_faces[i]._up);
DisplayRegion *dr = buffer->make_display_region();
DisplayRegion *dr;
if (show_buffers) {
const ShowBuffersCubeMapRegions &r = cube_map_regions[i];
dr = buffer->make_display_region(r.l, r.r, r.b, r.t);
} else {
dr = buffer->make_display_region();
}
dr->set_cube_map_index(i);
dr->copy_clear_settings(*this);
dr->set_camera(camera_np);
@ -765,6 +797,7 @@ begin_frame() {
}
_cube_map_index = -1;
_cube_map_dr = NULL;
return _gsg->begin_frame();
}
@ -844,12 +877,13 @@ end_frame() {
<< "cube_map_index = " << _cube_map_index << "\n";
}
RenderBuffer buffer = _gsg->get_render_buffer(get_draw_buffer_type());
nassertv(_cube_map_dr != (DisplayRegion *)NULL);
if (_rtm_mode == RTM_copy_ram) {
_gsg->framebuffer_copy_to_ram(get_texture(), _cube_map_index,
_default_display_region, buffer);
_cube_map_dr, buffer);
} else {
_gsg->framebuffer_copy_to_texture(get_texture(), _cube_map_index,
_default_display_region, buffer);
_cube_map_dr, buffer);
}
}
}
@ -891,6 +925,7 @@ end_frame() {
}
_cube_map_index = -1;
_cube_map_dr = NULL;
}
////////////////////////////////////////////////////////////////////
@ -908,7 +943,9 @@ change_scenes(DisplayRegion *new_dr) {
if (new_cube_map_index != -1 &&
new_cube_map_index != _cube_map_index) {
int old_cube_map_index = _cube_map_index;
DisplayRegion *old_cube_map_dr = _cube_map_dr;
_cube_map_index = new_cube_map_index;
_cube_map_dr = new_dr;
if (_rtm_mode != RTM_none) {
if (_rtm_mode == RTM_bind_texture) {
@ -921,6 +958,7 @@ change_scenes(DisplayRegion *new_dr) {
} else if (old_cube_map_index != -1) {
// In copy-to-texture mode, copy the just-rendered framebuffer
// to the old cube map face.
nassertv(old_cube_map_dr != (DisplayRegion *)NULL);
if (display_cat.is_debug()) {
display_cat.debug()
<< "Copying texture for " << get_name() << " at scene change.\n";
@ -930,10 +968,10 @@ change_scenes(DisplayRegion *new_dr) {
RenderBuffer buffer = _gsg->get_render_buffer(get_draw_buffer_type());
if (_rtm_mode == RTM_copy_ram) {
_gsg->framebuffer_copy_to_ram(get_texture(), old_cube_map_index,
_default_display_region, buffer);
old_cube_map_dr, buffer);
} else {
_gsg->framebuffer_copy_to_texture(get_texture(), old_cube_map_index,
_default_display_region, buffer);
old_cube_map_dr, buffer);
}
}
}

View File

@ -176,6 +176,7 @@ protected:
bool _flip_ready;
bool _needs_context;
int _cube_map_index;
DisplayRegion *_cube_map_dr;
private:
DisplayRegion *add_display_region(DisplayRegion *display_region);