More progress, but still not working

This commit is contained in:
Josh Yelon 2006-02-18 05:25:06 +00:00
parent 39820708dd
commit 4535cdfbba
2 changed files with 129 additions and 79 deletions

View File

@ -44,7 +44,7 @@ CLP(GraphicsBuffer)::
}
////////////////////////////////////////////////////////////////////
// Function: glGraphicsBuffer::begin_frame
// Function: wglGraphicsBuffer::begin_frame
// Access: Public, Virtual
// Description: This function will be called within the draw thread
// before beginning rendering for a given frame. It
@ -52,77 +52,68 @@ CLP(GraphicsBuffer)::
// if the frame should be rendered, or false if it
// should be skipped.
////////////////////////////////////////////////////////////////////
bool CLP(GraphicsBuffer)::
begin_frame() {
bool wglGraphicsBuffer::
begin_frame(FrameMode mode) {
PStatTimer timer(_make_current_pcollector);
begin_frame_spam();
if (_gsg == (GraphicsStateGuardian *)NULL) {
return false;
}
return GraphicsBuffer::begin_frame();
if (!_host->begin_frame(FM_parasite)) {
return false;
}
if (_track_host_size) {
if ((_host->get_x_size() != _x_size)||
(_host->get_y_size() != _y_size)) {
set_size_and_recalc(_host->get_x_size(),
_host->get_y_size());
}
}
// This function also contains the code to *reopen* the window
// in the event that configuration parameters (ie, size, texture
// bindings) have changed.
open_window();
// bind the FBO
if (mode == FM_render) {
begin_render_texture();
clear_cube_map_selection();
}
}
////////////////////////////////////////////////////////////////////
// Function: glGraphicsStateGuardian::begin_render_texture
// Function: wglGraphicsBuffer::end_frame
// Access: Public, Virtual
// Description: If the GraphicsOutput supports direct render-to-texture,
// and if any setup needs to be done during begin_frame,
// then the setup code should go here. Any textures that
// can not be rendered to directly should be reflagged
// as RTM_copy_to_texture.
// Description: This function will be called within the draw thread
// after rendering is completed for a given frame. It
// should do whatever finalization is required.
////////////////////////////////////////////////////////////////////
void CLP(GraphicsBuffer)::
begin_render_texture() {
// glGraphicsStateGuardian *glgsg;
// DCAST_INTO_V(glgsg, _gsg);
void wglGraphicsBuffer::
end_frame(FrameMode mode) {
end_frame_spam();
nassertv(_gsg != (GraphicsStateGuardian *)NULL);
// Find the color texture, if there is one. That one can be bound to
// the framebuffer. All others must be marked RTM_copy_to_texture.
// int tex_index = -1;
// for (int i=0; i<count_textures(); i++) {
// if (get_rtm_mode(i) == RTM_bind_or_copy) {
// if ((get_texture(i)->get_format() != Texture::F_depth_component)&&
// (get_texture(i)->get_format() != Texture::F_stencil_index)&&
// (tex_index < 0)) {
// tex_index = i;
// } else {
// _textures[i]._rtm_mode = RTM_copy_texture;
// }
// }
// }
//
// if (tex_index >= 0) {
// Texture *tex = get_texture(tex_index);
// TextureContext *tc = tex->prepare_now(_gsg->get_prepared_objects(), _gsg);
// nassertv(tc != (TextureContext *)NULL);
// CLP(TextureContext) *gtc = DCAST(CLP(TextureContext), tc);
// GLenum target = glgsg->get_texture_target(tex->get_texture_type());
// if (target == GL_NONE) {
// _textures[tex_index]._rtm_mode = RTM_copy_texture;
// return;
// }
// GLP(BindTexture)(target, gtc->_index);
// if (_gsg->get_properties().is_single_buffered()) {
// glgsg->_glBindTexImageARB(_pbuffer, GL_FRONT_LEFT_ARB);
// } else {
// glgsg->_glBindTexImageARB(_pbuffer, GL_BACK_LEFT_ARB);
// }
// }
}
if (mode == FM_render) {
end_render_texture();
copy_to_textures();
}
// Unbind the FBO
_host->end_frame(FM_parasite);
////////////////////////////////////////////////////////////////////
// Function: GraphicsOutput::end_render_texture
// Access: Public, Virtual
// Description: If the GraphicsOutput supports direct render-to-texture,
// and if any setup needs to be done during end_frame,
// then the setup code should go here. Any textures that
// could not be rendered to directly should be reflagged
// as RTM_copy_texture.
////////////////////////////////////////////////////////////////////
void CLP(GraphicsBuffer)::
end_render_texture() {
// glGraphicsStateGuardian *glgsg;
// DCAST_INTO_V(glgsg, _gsg);
if (mode == FM_render) {
trigger_flip();
if (_one_shot) {
prepare_for_deletion();
}
clear_cube_map_selection();
}
}
////////////////////////////////////////////////////////////////////
@ -136,22 +127,68 @@ end_render_texture() {
////////////////////////////////////////////////////////////////////
void CLP(GraphicsBuffer)::
select_cube_map(int cube_map_index) {
// glGraphicsStateGuardian *glgsg;
// DCAST_INTO_V(glgsg, _gsg);
open_buffer();
}
////////////////////////////////////////////////////////////////////
// Function: glGraphicsBuffer::make_current
// Access: Public, Virtual
// Description: This function will be called within the draw thread
// during begin_frame() to ensure the graphics context
// is ready for drawing.
// Function: wglGraphicsBuffer::open_buffer
// Access: Protected, Virtual
// Description: Opens the window right now. Called from the window
// thread. Returns true if the window is successfully
// opened, or false if there was a problem.
//
// This particular version of open_buffer is also
// capable of reopening the buffer, which is necessary
// if the texture bindings, size, or cube face has
// changed. Caution: since this function is called
// at every cube-map switch, it needs to be reasonably
// fast in the case that little is changing.
////////////////////////////////////////////////////////////////////
void CLP(GraphicsBuffer)::
make_current() {
PStatTimer timer(_make_current_pcollector);
bool wglGraphicsBuffer::
open_buffer() {
// Make sure the FBO is allocated.
// Figure out the desired size of the FBO
int desired_x = _x_size;
int desired_y = _y_size;
if (!_gsg->get_supports_tex_non_pow2()) {
desired_x = Texture::up_to_power_2(desired_x);
desired_y = Texture::up_to_power_2(desired_y);
}
// How to implement this is not obvious.
// Scan the textures list to see which textures should be attached.
Texture *attach_color = 0;
Texture *attach_depth = 0;
Texture *attach_stencil = 0;
// For all slots containing textures, detach if:
// - they aren't supposed to be attached any more, or
// - there is a size mismatch, or
// - there is a cube-face mismatch
// For all renderbuffers, detach and deallocate if:
// - there is a size mismatch, or,
// - there is a texture to be attached at that point
// For all to-be-attached textures, attach if not already
// attached. During attachment process, resize and reformat
// if needed.
// For all unfilled slots, allocate and attach render buffers.
}
////////////////////////////////////////////////////////////////////
// Function: wglGraphicsBuffer::close_buffer
// Access: Protected, Virtual
// Description: Closes the buffer right now. Called from the window
// thread.
////////////////////////////////////////////////////////////////////
void wglGraphicsBuffer::
close_buffer() {
// Detach all renderbuffers
// Detach all textures
// Deallocate the FBO itself.
}
////////////////////////////////////////////////////////////////////

View File

@ -43,7 +43,6 @@
//
// EXT_framebuffer_object
// ARB_draw_buffers
// ARB_texture_non_power_of_two
//
// If any of these extensions is missing, then
// glGraphicsBuffer is not available (although it may
@ -59,16 +58,30 @@ public:
int x_size, int y_size);
virtual ~CLP(GraphicsBuffer)();
virtual bool begin_frame(FrameMode mode);
virtual void end_frame(FrameMode mode);
virtual void select_cube_map(int cube_map_index);
private:
void make_current();
void begin_render_texture();
void end_render_texture();
// HPBUFFERARB _pbuffer;
// HDC _pbuffer_dc;
protected:
virtual void close_buffer();
virtual bool open_buffer();
private:
PT(GraphicsOutput) _host;
bool _track_host_size;
int _fbo;
int _fbo_size_x;
int _fbo_size_y;
int _attached_cube_face;
Texture *_attached_color;
Texture *_attached_depth;
Texture *_attached_stencil;
int _attached_color_rb;
int _attached_depth_rb;
int _attached_stencil_rb;
public:
static TypeHandle get_class_type() {
return _type_handle;