panda3d/panda/src/display/graphicsBuffer.cxx
2006-06-07 21:16:37 +00:00

155 lines
5.3 KiB
C++

// Filename: graphicsBuffer.cxx
// Created by: drose (06Feb04)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#include "graphicsBuffer.h"
TypeHandle GraphicsBuffer::_type_handle;
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::Constructor
// Access: Protected
// Description: Normally, the GraphicsBuffer constructor is not
// called directly; these are created instead via the
// GraphicsEngine::make_buffer() function.
////////////////////////////////////////////////////////////////////
GraphicsBuffer::
GraphicsBuffer(GraphicsPipe *pipe,
const string &name,
const FrameBufferProperties &properties,
int x_size, int y_size, int flags,
GraphicsStateGuardian *gsg,
GraphicsOutput *host) :
GraphicsOutput(pipe, name, properties, x_size, y_size, flags, gsg, host)
{
#ifdef DO_MEMORY_USAGE
MemoryUsage::update_type(this, this);
#endif
if (display_cat.is_debug()) {
display_cat.debug()
<< "Creating new offscreen buffer " << get_name() << "\n";
}
_default_display_region->compute_pixels(_x_size, _y_size);
_open_request = OR_none;
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::Destructor
// Access: Published, Virtual
// Description:
////////////////////////////////////////////////////////////////////
GraphicsBuffer::
~GraphicsBuffer() {
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::request_open
// Access: Public, Virtual
// Description: This is called by the GraphicsEngine to request that
// the buffer (or whatever) open itself or, in general,
// make itself valid, at the next call to
// process_events().
////////////////////////////////////////////////////////////////////
void GraphicsBuffer::
request_open() {
_open_request = OR_open;
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::request_close
// Access: Public, Virtual
// Description: This is called by the GraphicsEngine to request that
// the buffer (or whatever) close itself or, in general,
// make itself invalid, at the next call to
// process_events(). By that time we promise the gsg
// pointer will be cleared.
////////////////////////////////////////////////////////////////////
void GraphicsBuffer::
request_close() {
_open_request = OR_none;
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::set_close_now
// Access: Public, Virtual
// Description: This is called by the GraphicsEngine to insist that
// the buffer be closed immediately. This is only
// called from the buffer thread.
////////////////////////////////////////////////////////////////////
void GraphicsBuffer::
set_close_now() {
_open_request = OR_none;
close_buffer();
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::process_events
// Access: Public, Virtual
// Description: Honor any requests recently made via request_open()
// or request_close().
//
// This function is called only within the window
// thread.
////////////////////////////////////////////////////////////////////
void GraphicsBuffer::
process_events() {
// Save the current request and reset it immediately, in case we end
// up calling recursively back into this function.
OpenRequest this_request = _open_request;
_open_request = OR_none;
switch (this_request) {
case OR_none:
return;
case OR_open:
open_buffer();
set_inverted(_gsg->get_copy_texture_inverted());
break;
case OR_close:
close_buffer();
break;
}
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::close_buffer
// Access: Protected, Virtual
// Description: Closes the buffer right now. Called from the window
// thread.
////////////////////////////////////////////////////////////////////
void GraphicsBuffer::
close_buffer() {
display_cat.info()
<< "Closing " << get_type() << "\n";
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsBuffer::open_buffer
// Access: Protected, Virtual
// Description: Opens the buffer right now. Called from the window
// thread. Returns true if the buffer is successfully
// opened, or false if there was a problem.
////////////////////////////////////////////////////////////////////
bool GraphicsBuffer::
open_buffer() {
return false;
}