mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-05 03:15:07 -04:00
more factoring of Thread::get_current_thread
This commit is contained in:
parent
988ae7410f
commit
ffc92f23c8
@ -93,17 +93,17 @@ finish_cull(SceneSetup *) {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CullBinBackToFront::draw
|
// Function: CullBinBackToFront::draw
|
||||||
// Access: Public
|
// Access: Public, Virtual
|
||||||
// Description: Draws all the geoms in the bin, in the appropriate
|
// Description: Draws all the geoms in the bin, in the appropriate
|
||||||
// order.
|
// order.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullBinBackToFront::
|
void CullBinBackToFront::
|
||||||
draw() {
|
draw(Thread *current_thread) {
|
||||||
PStatTimer timer(_draw_this_pcollector);
|
PStatTimer timer(_draw_this_pcollector);
|
||||||
Objects::const_iterator oi;
|
Objects::const_iterator oi;
|
||||||
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
||||||
CullableObject *object = (*oi)._object;
|
CullableObject *object = (*oi)._object;
|
||||||
CullHandler::draw(object, _gsg);
|
CullHandler::draw(object, _gsg, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ public:
|
|||||||
|
|
||||||
virtual void add_object(CullableObject *object);
|
virtual void add_object(CullableObject *object);
|
||||||
virtual void finish_cull(SceneSetup *scene_setup);
|
virtual void finish_cull(SceneSetup *scene_setup);
|
||||||
virtual void draw();
|
virtual void draw(Thread *current_thread);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class ObjectData {
|
class ObjectData {
|
||||||
|
@ -81,17 +81,17 @@ finish_cull(SceneSetup *) {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CullBinFixed::draw
|
// Function: CullBinFixed::draw
|
||||||
// Access: Public
|
// Access: Public, Virtual
|
||||||
// Description: Draws all the geoms in the bin, in the appropriate
|
// Description: Draws all the geoms in the bin, in the appropriate
|
||||||
// order.
|
// order.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullBinFixed::
|
void CullBinFixed::
|
||||||
draw() {
|
draw(Thread *current_thread) {
|
||||||
PStatTimer timer(_draw_this_pcollector);
|
PStatTimer timer(_draw_this_pcollector);
|
||||||
Objects::const_iterator oi;
|
Objects::const_iterator oi;
|
||||||
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
||||||
CullableObject *object = (*oi)._object;
|
CullableObject *object = (*oi)._object;
|
||||||
CullHandler::draw(object, _gsg);
|
CullHandler::draw(object, _gsg, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ public:
|
|||||||
|
|
||||||
virtual void add_object(CullableObject *object);
|
virtual void add_object(CullableObject *object);
|
||||||
virtual void finish_cull(SceneSetup *scene_setup);
|
virtual void finish_cull(SceneSetup *scene_setup);
|
||||||
virtual void draw();
|
virtual void draw(Thread *current_thread);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class ObjectData {
|
class ObjectData {
|
||||||
|
@ -98,12 +98,12 @@ finish_cull(SceneSetup *) {
|
|||||||
// order.
|
// order.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullBinFrontToBack::
|
void CullBinFrontToBack::
|
||||||
draw() {
|
draw(Thread *current_thread) {
|
||||||
PStatTimer timer(_draw_this_pcollector);
|
PStatTimer timer(_draw_this_pcollector);
|
||||||
Objects::const_iterator oi;
|
Objects::const_iterator oi;
|
||||||
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
||||||
CullableObject *object = (*oi)._object;
|
CullableObject *object = (*oi)._object;
|
||||||
CullHandler::draw(object, _gsg);
|
CullHandler::draw(object, _gsg, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ public:
|
|||||||
|
|
||||||
virtual void add_object(CullableObject *object);
|
virtual void add_object(CullableObject *object);
|
||||||
virtual void finish_cull(SceneSetup *scene_setup);
|
virtual void finish_cull(SceneSetup *scene_setup);
|
||||||
virtual void draw();
|
virtual void draw(Thread *current_thread);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class ObjectData {
|
class ObjectData {
|
||||||
|
@ -195,7 +195,7 @@ finish_cull(SceneSetup *scene_setup) {
|
|||||||
// order.
|
// order.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullBinOcclusionTest::
|
void CullBinOcclusionTest::
|
||||||
draw() {
|
draw(Thread *current_thread) {
|
||||||
PStatTimer timer(_draw_this_pcollector);
|
PStatTimer timer(_draw_this_pcollector);
|
||||||
|
|
||||||
// We'll want to know the near plane distance.
|
// We'll want to know the near plane distance.
|
||||||
@ -205,7 +205,7 @@ draw() {
|
|||||||
int num_drawn_previous;
|
int num_drawn_previous;
|
||||||
{
|
{
|
||||||
MutexHolder holder(_prev_draw->_visible_lock);
|
MutexHolder holder(_prev_draw->_visible_lock);
|
||||||
num_drawn_previous = _root.draw_previous(*this);
|
num_drawn_previous = _root.draw_previous(*this, current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cull_cat.is_spam()) {
|
if (cull_cat.is_spam()) {
|
||||||
@ -215,9 +215,9 @@ draw() {
|
|||||||
|
|
||||||
// Now draw the objects that may or may not remain.
|
// Now draw the objects that may or may not remain.
|
||||||
int num_drawn;
|
int num_drawn;
|
||||||
num_drawn = _root.draw(*this);
|
num_drawn = _root.draw(*this, current_thread);
|
||||||
if (show_octree) {
|
if (show_octree) {
|
||||||
_root.draw_wireframe(*this);
|
_root.draw_wireframe(*this, current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!_pending_nodes.empty()) {
|
while (!_pending_nodes.empty()) {
|
||||||
@ -239,9 +239,9 @@ draw() {
|
|||||||
if (num_fragments != 0) {
|
if (num_fragments != 0) {
|
||||||
// The octree cell is at least partially visible. Draw it, and
|
// The octree cell is at least partially visible. Draw it, and
|
||||||
// continue recursion.
|
// continue recursion.
|
||||||
num_drawn += pending._octree_node->draw(*this);
|
num_drawn += pending._octree_node->draw(*this, current_thread);
|
||||||
if (show_octree) {
|
if (show_octree) {
|
||||||
pending._octree_node->draw_wireframe(*this);
|
pending._octree_node->draw_wireframe(*this, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_pending_nodes.pop_front();
|
_pending_nodes.pop_front();
|
||||||
@ -475,7 +475,7 @@ compute_distance(const LMatrix4f &world_mat,
|
|||||||
// occlusion query object representing this test.
|
// occlusion query object representing this test.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
PT(OcclusionQueryContext) CullBinOcclusionTest::OctreeNode::
|
PT(OcclusionQueryContext) CullBinOcclusionTest::OctreeNode::
|
||||||
occlusion_test(CullBinOcclusionTest &bin) {
|
occlusion_test(CullBinOcclusionTest &bin, Thread *current_thread) {
|
||||||
// Draw the bounding volume for visualization. This is
|
// Draw the bounding volume for visualization. This is
|
||||||
// complicated because we're doing this at such a low level, here
|
// complicated because we're doing this at such a low level, here
|
||||||
// in the middle of the draw task--we've already completed the
|
// in the middle of the draw task--we've already completed the
|
||||||
@ -500,7 +500,7 @@ occlusion_test(CullBinOcclusionTest &bin) {
|
|||||||
|
|
||||||
PStatTimer timer(bin._draw_occlusion_pcollector);
|
PStatTimer timer(bin._draw_occlusion_pcollector);
|
||||||
bin._gsg->begin_occlusion_query();
|
bin._gsg->begin_occlusion_query();
|
||||||
viz->draw(bin._gsg, munger, munged_data);
|
viz->draw(bin._gsg, munger, munged_data, current_thread);
|
||||||
return bin._gsg->end_occlusion_query();
|
return bin._gsg->end_occlusion_query();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,7 +512,7 @@ occlusion_test(CullBinOcclusionTest &bin) {
|
|||||||
// objects drawn.
|
// objects drawn.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
int CullBinOcclusionTest::OctreeNode::
|
int CullBinOcclusionTest::OctreeNode::
|
||||||
draw_previous(CullBinOcclusionTest &bin) {
|
draw_previous(CullBinOcclusionTest &bin, Thread *current_thread) {
|
||||||
int num_drawn = 0;
|
int num_drawn = 0;
|
||||||
|
|
||||||
if (!_objects.empty()) {
|
if (!_objects.empty()) {
|
||||||
@ -523,7 +523,7 @@ draw_previous(CullBinOcclusionTest &bin) {
|
|||||||
VisibleGeom vg(object->_geom, object->_net_transform);
|
VisibleGeom vg(object->_geom, object->_net_transform);
|
||||||
if (bin._prev_draw->_visible_geoms.find(vg) != bin._prev_draw->_visible_geoms.end()) {
|
if (bin._prev_draw->_visible_geoms.find(vg) != bin._prev_draw->_visible_geoms.end()) {
|
||||||
// This object is visible.
|
// This object is visible.
|
||||||
CullHandler::draw(object, bin._gsg);
|
CullHandler::draw(object, bin._gsg, current_thread);
|
||||||
object->_already_drawn = true;
|
object->_already_drawn = true;
|
||||||
++num_drawn;
|
++num_drawn;
|
||||||
}
|
}
|
||||||
@ -536,7 +536,7 @@ draw_previous(CullBinOcclusionTest &bin) {
|
|||||||
// farthest.
|
// farthest.
|
||||||
int index = bin._corners_front_to_back[i];
|
int index = bin._corners_front_to_back[i];
|
||||||
if (_corners[index] != (OctreeNode *)NULL) {
|
if (_corners[index] != (OctreeNode *)NULL) {
|
||||||
num_drawn += _corners[index]->draw_previous(bin);
|
num_drawn += _corners[index]->draw_previous(bin, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,7 +551,7 @@ draw_previous(CullBinOcclusionTest &bin) {
|
|||||||
// nested nodes. Returns the number of objects drawn.
|
// nested nodes. Returns the number of objects drawn.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
int CullBinOcclusionTest::OctreeNode::
|
int CullBinOcclusionTest::OctreeNode::
|
||||||
draw(CullBinOcclusionTest &bin) {
|
draw(CullBinOcclusionTest &bin, Thread *current_thread) {
|
||||||
// If the node is being drawn, it must have passed the occlusion
|
// If the node is being drawn, it must have passed the occlusion
|
||||||
// test. Flag it as such.
|
// test. Flag it as such.
|
||||||
_is_visible = true;
|
_is_visible = true;
|
||||||
@ -568,7 +568,7 @@ draw(CullBinOcclusionTest &bin) {
|
|||||||
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
||||||
CullableObject *object = (*oi)._object;
|
CullableObject *object = (*oi)._object;
|
||||||
if (!object->_already_drawn) {
|
if (!object->_already_drawn) {
|
||||||
CullHandler::draw(object, bin._gsg);
|
CullHandler::draw(object, bin._gsg, current_thread);
|
||||||
object->_already_drawn = true;
|
object->_already_drawn = true;
|
||||||
++num_drawn;
|
++num_drawn;
|
||||||
}
|
}
|
||||||
@ -588,7 +588,7 @@ draw(CullBinOcclusionTest &bin) {
|
|||||||
// some or all of the cube would be clipped), but it's not
|
// some or all of the cube would be clipped), but it's not
|
||||||
// likely that anything will be occluding something so close
|
// likely that anything will be occluding something so close
|
||||||
// to the camera anyway.
|
// to the camera anyway.
|
||||||
_corners[index]->draw(bin);
|
_corners[index]->draw(bin, current_thread);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, if the entire cube is in front of the near
|
// Otherwise, if the entire cube is in front of the near
|
||||||
@ -597,7 +597,7 @@ draw(CullBinOcclusionTest &bin) {
|
|||||||
// through the depth test.
|
// through the depth test.
|
||||||
PendingNode pending;
|
PendingNode pending;
|
||||||
pending._octree_node = _corners[index];
|
pending._octree_node = _corners[index];
|
||||||
pending._query = _corners[index]->occlusion_test(bin);
|
pending._query = _corners[index]->occlusion_test(bin, current_thread);
|
||||||
|
|
||||||
// We push it onto the list of nodes that are awaiting
|
// We push it onto the list of nodes that are awaiting
|
||||||
// feedback from the graphics pipe. This way we can go work
|
// feedback from the graphics pipe. This way we can go work
|
||||||
@ -617,7 +617,7 @@ draw(CullBinOcclusionTest &bin) {
|
|||||||
// for debugging and visualization purposes.
|
// for debugging and visualization purposes.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullBinOcclusionTest::OctreeNode::
|
void CullBinOcclusionTest::OctreeNode::
|
||||||
draw_wireframe(CullBinOcclusionTest &bin) {
|
draw_wireframe(CullBinOcclusionTest &bin, Thread *current_thread) {
|
||||||
// As above, this is complicated because we're doing this at such a
|
// As above, this is complicated because we're doing this at such a
|
||||||
// low level.
|
// low level.
|
||||||
CPT(TransformState) net_transform = TransformState::make_pos_hpr_scale
|
CPT(TransformState) net_transform = TransformState::make_pos_hpr_scale
|
||||||
@ -635,7 +635,7 @@ draw_wireframe(CullBinOcclusionTest &bin) {
|
|||||||
munger->munge_geom(viz, munged_data);
|
munger->munge_geom(viz, munged_data);
|
||||||
|
|
||||||
bin._gsg->set_state_and_transform(state, internal_transform);
|
bin._gsg->set_state_and_transform(state, internal_transform);
|
||||||
viz->draw(bin._gsg, munger, munged_data);
|
viz->draw(bin._gsg, munger, munged_data, current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
@ -59,7 +59,7 @@ public:
|
|||||||
|
|
||||||
virtual void add_object(CullableObject *object);
|
virtual void add_object(CullableObject *object);
|
||||||
virtual void finish_cull(SceneSetup *scene_setup);
|
virtual void finish_cull(SceneSetup *scene_setup);
|
||||||
virtual void draw();
|
virtual void draw(Thread *current_thread);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void draw_next();
|
void draw_next();
|
||||||
@ -121,10 +121,11 @@ private:
|
|||||||
void compute_distance(const LMatrix4f &world_mat,
|
void compute_distance(const LMatrix4f &world_mat,
|
||||||
CullBinOcclusionTest &bin);
|
CullBinOcclusionTest &bin);
|
||||||
|
|
||||||
PT(OcclusionQueryContext) occlusion_test(CullBinOcclusionTest &bin);
|
PT(OcclusionQueryContext) occlusion_test(CullBinOcclusionTest &bin,
|
||||||
int draw_previous(CullBinOcclusionTest &bin);
|
Thread *current_thread);
|
||||||
int draw(CullBinOcclusionTest &bin);
|
int draw_previous(CullBinOcclusionTest &bin, Thread *current_thread);
|
||||||
void draw_wireframe(CullBinOcclusionTest &bin);
|
int draw(CullBinOcclusionTest &bin, Thread *current_thread);
|
||||||
|
void draw_wireframe(CullBinOcclusionTest &bin, Thread *current_thread);
|
||||||
void record_visible_geoms(VisibleGeoms &visible_geoms);
|
void record_visible_geoms(VisibleGeoms &visible_geoms);
|
||||||
INLINE void initial_assign(const ObjectData &object_data);
|
INLINE void initial_assign(const ObjectData &object_data);
|
||||||
|
|
||||||
|
@ -80,17 +80,17 @@ finish_cull(SceneSetup *) {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CullBinStateSorted::draw
|
// Function: CullBinStateSorted::draw
|
||||||
// Access: Public
|
// Access: Public, Virtual
|
||||||
// Description: Draws all the geoms in the bin, in the appropriate
|
// Description: Draws all the geoms in the bin, in the appropriate
|
||||||
// order.
|
// order.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullBinStateSorted::
|
void CullBinStateSorted::
|
||||||
draw() {
|
draw(Thread *current_thread) {
|
||||||
PStatTimer timer(_draw_this_pcollector);
|
PStatTimer timer(_draw_this_pcollector);
|
||||||
Objects::const_iterator oi;
|
Objects::const_iterator oi;
|
||||||
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
||||||
CullableObject *object = (*oi)._object;
|
CullableObject *object = (*oi)._object;
|
||||||
CullHandler::draw(object, _gsg);
|
CullHandler::draw(object, _gsg, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ public:
|
|||||||
|
|
||||||
virtual void add_object(CullableObject *object);
|
virtual void add_object(CullableObject *object);
|
||||||
virtual void finish_cull(SceneSetup *scene_setup);
|
virtual void finish_cull(SceneSetup *scene_setup);
|
||||||
virtual void draw();
|
virtual void draw(Thread *current_thread);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class ObjectData {
|
class ObjectData {
|
||||||
|
@ -61,17 +61,17 @@ add_object(CullableObject *object) {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CullBinUnsorted::draw
|
// Function: CullBinUnsorted::draw
|
||||||
// Access: Public
|
// Access: Public, Virtual
|
||||||
// Description: Draws all the objects in the bin, in the appropriate
|
// Description: Draws all the objects in the bin, in the appropriate
|
||||||
// order.
|
// order.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullBinUnsorted::
|
void CullBinUnsorted::
|
||||||
draw() {
|
draw(Thread *current_thread) {
|
||||||
PStatTimer timer(_draw_this_pcollector);
|
PStatTimer timer(_draw_this_pcollector);
|
||||||
Objects::iterator oi;
|
Objects::iterator oi;
|
||||||
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
for (oi = _objects.begin(); oi != _objects.end(); ++oi) {
|
||||||
CullableObject *object = (*oi);
|
CullableObject *object = (*oi);
|
||||||
CullHandler::draw(object, _gsg);
|
CullHandler::draw(object, _gsg, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ public:
|
|||||||
static CullBin *make_bin(const string &name, GraphicsStateGuardianBase *gsg);
|
static CullBin *make_bin(const string &name, GraphicsStateGuardianBase *gsg);
|
||||||
|
|
||||||
virtual void add_object(CullableObject *object);
|
virtual void add_object(CullableObject *object);
|
||||||
virtual void draw();
|
virtual void draw(Thread *current_thread);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef pvector<CullableObject *> Objects;
|
typedef pvector<CullableObject *> Objects;
|
||||||
|
@ -38,6 +38,6 @@ record_object(CullableObject *object, const CullTraverser *traverser) {
|
|||||||
object->munge_geom(_gsg, _gsg->get_geom_munger(object->_state), traverser);
|
object->munge_geom(_gsg, _gsg->get_geom_munger(object->_state), traverser);
|
||||||
|
|
||||||
// And draw the object, then dispense with it.
|
// And draw the object, then dispense with it.
|
||||||
draw(object, _gsg);
|
draw(object, _gsg, Thread::get_current_thread());
|
||||||
delete object;
|
delete object;
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,99 @@ operator < (const DisplayRegion &other) const {
|
|||||||
return get_sort() < other.get_sort();
|
return get_sort() < other.get_sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_dimensions
|
||||||
|
// Access: Published
|
||||||
|
// Description: Retrieves the coordinates of the DisplayRegion's
|
||||||
|
// rectangle within its GraphicsOutput. These numbers
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegion::
|
||||||
|
get_dimensions(float &l, float &r, float &b, float &t) const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
l = cdata->_l;
|
||||||
|
r = cdata->_r;
|
||||||
|
b = cdata->_b;
|
||||||
|
t = cdata->_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_left
|
||||||
|
// Access: Published
|
||||||
|
// Description: Retrieves the x coordinate of the left edge of the
|
||||||
|
// rectangle within its GraphicsOutput. This number
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegion::
|
||||||
|
get_left() const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
return cdata->_l;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_right
|
||||||
|
// Access: Published
|
||||||
|
// Description: Retrieves the x coordinate of the right edge of the
|
||||||
|
// rectangle within its GraphicsOutput. This number
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegion::
|
||||||
|
get_right() const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
return cdata->_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_bottom
|
||||||
|
// Access: Published
|
||||||
|
// Description: Retrieves the y coordinate of the bottom edge of
|
||||||
|
// the rectangle within its GraphicsOutput. This
|
||||||
|
// number will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegion::
|
||||||
|
get_bottom() const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
return cdata->_b;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_top
|
||||||
|
// Access: Published
|
||||||
|
// Description: Retrieves the y coordinate of the top edge of the
|
||||||
|
// rectangle within its GraphicsOutput. This number
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegion::
|
||||||
|
get_top() const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
return cdata->_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_window
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns the GraphicsOutput that this DisplayRegion is
|
||||||
|
// ultimately associated with, or NULL if no window is
|
||||||
|
// associated.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE GraphicsOutput *DisplayRegion::
|
||||||
|
get_window() const {
|
||||||
|
return _window;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_camera
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns the camera associated with this
|
||||||
|
// DisplayRegion, or an empty NodePath if no camera is
|
||||||
|
// associated.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE NodePath DisplayRegion::
|
||||||
|
get_camera() const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
return cdata->_camera;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DisplayRegion::is_active
|
// Function: DisplayRegion::is_active
|
||||||
// Access: Published
|
// Access: Published
|
||||||
@ -130,6 +223,76 @@ get_cube_map_index() const {
|
|||||||
return cdata->_cube_map_index;
|
return cdata->_cube_map_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_pixels
|
||||||
|
// Access: Published
|
||||||
|
// Description: Retrieves the coordinates of the DisplayRegion within
|
||||||
|
// its window, in pixels.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegion::
|
||||||
|
get_pixels(int &pl, int &pr, int &pb, int &pt) const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
pl = cdata->_pl;
|
||||||
|
pr = cdata->_pr;
|
||||||
|
pb = cdata->_pb;
|
||||||
|
pt = cdata->_pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_region_pixels
|
||||||
|
// Access: Published
|
||||||
|
// Description: Retrieves the coordinates of the DisplayRegion within
|
||||||
|
// its window, as the pixel location of its bottom-left
|
||||||
|
// corner, along with a pixel width and height.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegion::
|
||||||
|
get_region_pixels(int &xo, int &yo, int &w, int &h) const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
xo = cdata->_pl;
|
||||||
|
yo = cdata->_pb;
|
||||||
|
w = cdata->_pr - cdata->_pl;
|
||||||
|
h = cdata->_pt - cdata->_pb;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_region_pixels_i
|
||||||
|
// Access: Published
|
||||||
|
// Description: Similar to get_region_pixels(), but returns the upper
|
||||||
|
// left corner, and the pixel numbers are numbered from
|
||||||
|
// the top-left corner down, in the DirectX way of
|
||||||
|
// things.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegion::
|
||||||
|
get_region_pixels_i(int &xo, int &yo, int &w, int &h) const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
xo = cdata->_pl;
|
||||||
|
yo = cdata->_pti;
|
||||||
|
w = cdata->_pr - cdata->_pl;
|
||||||
|
h = cdata->_pbi - cdata->_pti;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_pixel_width
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns the width of the DisplayRegion in pixels.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int DisplayRegion::
|
||||||
|
get_pixel_width() const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
return cdata->_pr - cdata->_pl;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegion::get_pixel_height
|
||||||
|
// Access: Published
|
||||||
|
// Description: Returns the height of the DisplayRegion in pixels.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int DisplayRegion::
|
||||||
|
get_pixel_height() const {
|
||||||
|
CDReader cdata(_cycler);
|
||||||
|
return cdata->_pt - cdata->_pb;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DisplayRegion::set_cull_result
|
// Function: DisplayRegion::set_cull_result
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -199,6 +362,308 @@ CDataCull(const DisplayRegion::CDataCull ©) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE DisplayRegionPipelineReader::
|
||||||
|
DisplayRegionPipelineReader(DisplayRegion *object, Thread *current_thread) :
|
||||||
|
_object(object),
|
||||||
|
_current_thread(current_thread),
|
||||||
|
_cdata(object->_cycler.read(current_thread))
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
nassertv(_object->test_ref_count_nonzero());
|
||||||
|
#ifdef DO_PIPELINING
|
||||||
|
nassertv(_cdata->test_ref_count_nonzero());
|
||||||
|
#endif // DO_PIPELINING
|
||||||
|
#endif // _DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::Copy Constructor
|
||||||
|
// Access: Private
|
||||||
|
// Description: Don't attempt to copy these objects.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE DisplayRegionPipelineReader::
|
||||||
|
DisplayRegionPipelineReader(const DisplayRegionPipelineReader &) {
|
||||||
|
nassertv(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::Copy Assignment Operator
|
||||||
|
// Access: Private
|
||||||
|
// Description: Don't attempt to copy these objects.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegionPipelineReader::
|
||||||
|
operator = (const DisplayRegionPipelineReader &) {
|
||||||
|
nassertv(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::Destructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE DisplayRegionPipelineReader::
|
||||||
|
~DisplayRegionPipelineReader() {
|
||||||
|
#ifdef _DEBUG
|
||||||
|
nassertv(_object->test_ref_count_nonzero());
|
||||||
|
#ifdef DO_PIPELINING
|
||||||
|
nassertv(_cdata->test_ref_count_nonzero());
|
||||||
|
#endif // DO_PIPELINING
|
||||||
|
#endif // _DEBUG
|
||||||
|
_object->_cycler.release_read(_cdata);
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
_object = NULL;
|
||||||
|
_cdata = NULL;
|
||||||
|
#endif // _DEBUG
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_object
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE DisplayRegion *DisplayRegionPipelineReader::
|
||||||
|
get_object() const {
|
||||||
|
return _object;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_current_thread
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE Thread *DisplayRegionPipelineReader::
|
||||||
|
get_current_thread() const {
|
||||||
|
return _current_thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::is_any_clear_active
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE bool DisplayRegionPipelineReader::
|
||||||
|
is_any_clear_active() const {
|
||||||
|
return _object->is_any_clear_active();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_dimensions
|
||||||
|
// Access: Public
|
||||||
|
// Description: Retrieves the coordinates of the DisplayRegion's
|
||||||
|
// rectangle within its GraphicsOutput. These numbers
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegionPipelineReader::
|
||||||
|
get_dimensions(float &l, float &r, float &b, float &t) const {
|
||||||
|
l = _cdata->_l;
|
||||||
|
r = _cdata->_r;
|
||||||
|
b = _cdata->_b;
|
||||||
|
t = _cdata->_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_left
|
||||||
|
// Access: Public
|
||||||
|
// Description: Retrieves the x coordinate of the left edge of the
|
||||||
|
// rectangle within its GraphicsOutput. This number
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegionPipelineReader::
|
||||||
|
get_left() const {
|
||||||
|
return _cdata->_l;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_right
|
||||||
|
// Access: Public
|
||||||
|
// Description: Retrieves the x coordinate of the right edge of the
|
||||||
|
// rectangle within its GraphicsOutput. This number
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegionPipelineReader::
|
||||||
|
get_right() const {
|
||||||
|
return _cdata->_r;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_bottom
|
||||||
|
// Access: Public
|
||||||
|
// Description: Retrieves the y coordinate of the bottom edge of
|
||||||
|
// the rectangle within its GraphicsOutput. This
|
||||||
|
// number will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegionPipelineReader::
|
||||||
|
get_bottom() const {
|
||||||
|
return _cdata->_b;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_top
|
||||||
|
// Access: Public
|
||||||
|
// Description: Retrieves the y coordinate of the top edge of the
|
||||||
|
// rectangle within its GraphicsOutput. This number
|
||||||
|
// will be in the range [0..1].
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE float DisplayRegionPipelineReader::
|
||||||
|
get_top() const {
|
||||||
|
return _cdata->_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_window
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the GraphicsOutput that this DisplayRegion is
|
||||||
|
// ultimately associated with, or NULL if no window is
|
||||||
|
// associated.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE GraphicsOutput *DisplayRegionPipelineReader::
|
||||||
|
get_window() const {
|
||||||
|
return _object->_window;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_camera
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the camera associated with this
|
||||||
|
// DisplayRegion, or an empty NodePath if no camera is
|
||||||
|
// associated.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE NodePath DisplayRegionPipelineReader::
|
||||||
|
get_camera() const {
|
||||||
|
return _cdata->_camera;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::is_active
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the active flag associated with the
|
||||||
|
// DisplayRegion.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE bool DisplayRegionPipelineReader::
|
||||||
|
is_active() const {
|
||||||
|
return _cdata->_active;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_sort
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the sort value associated with the
|
||||||
|
// DisplayRegion.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int DisplayRegionPipelineReader::
|
||||||
|
get_sort() const {
|
||||||
|
return _cdata->_sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_stereo_channel
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns whether the DisplayRegion is specified as the
|
||||||
|
// left or right channel of a stereo pair, or whether it
|
||||||
|
// is a normal, monocular image. See
|
||||||
|
// set_stereo_channel().
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE Lens::StereoChannel DisplayRegionPipelineReader::
|
||||||
|
get_stereo_channel() {
|
||||||
|
return _cdata->_stereo_channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_clear_depth_between_eyes
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns whether the depth buffer is cleared again
|
||||||
|
// between the left and right eyes of a stereo
|
||||||
|
// DisplayRegion. See set_clear_depth_between_eyes().
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE bool DisplayRegionPipelineReader::
|
||||||
|
get_clear_depth_between_eyes() const {
|
||||||
|
return _object->_clear_depth_between_eyes;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_cube_map_index
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the cube map face index associated with this
|
||||||
|
// particular DisplayRegion, or -1 if it is not
|
||||||
|
// associated with a cube map. See
|
||||||
|
// set_cube_map_index().
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int DisplayRegionPipelineReader::
|
||||||
|
get_cube_map_index() const {
|
||||||
|
return _cdata->_cube_map_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_pixels
|
||||||
|
// Access: Public
|
||||||
|
// Description: Retrieves the coordinates of the DisplayRegion within
|
||||||
|
// its window, in pixels.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegionPipelineReader::
|
||||||
|
get_pixels(int &pl, int &pr, int &pb, int &pt) const {
|
||||||
|
pl = _cdata->_pl;
|
||||||
|
pr = _cdata->_pr;
|
||||||
|
pb = _cdata->_pb;
|
||||||
|
pt = _cdata->_pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_region_pixels
|
||||||
|
// Access: Public
|
||||||
|
// Description: Retrieves the coordinates of the DisplayRegion within
|
||||||
|
// its window, as the pixel location of its bottom-left
|
||||||
|
// corner, along with a pixel width and height.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegionPipelineReader::
|
||||||
|
get_region_pixels(int &xo, int &yo, int &w, int &h) const {
|
||||||
|
xo = _cdata->_pl;
|
||||||
|
yo = _cdata->_pb;
|
||||||
|
w = _cdata->_pr - _cdata->_pl;
|
||||||
|
h = _cdata->_pt - _cdata->_pb;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_region_pixels_i
|
||||||
|
// Access: Public
|
||||||
|
// Description: Similar to get_region_pixels(), but returns the upper
|
||||||
|
// left corner, and the pixel numbers are numbered from
|
||||||
|
// the top-left corner down, in the DirectX way of
|
||||||
|
// things.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE void DisplayRegionPipelineReader::
|
||||||
|
get_region_pixels_i(int &xo, int &yo, int &w, int &h) const {
|
||||||
|
xo = _cdata->_pl;
|
||||||
|
yo = _cdata->_pti;
|
||||||
|
w = _cdata->_pr - _cdata->_pl;
|
||||||
|
h = _cdata->_pbi - _cdata->_pti;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_pixel_width
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the width of the DisplayRegion in pixels.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int DisplayRegionPipelineReader::
|
||||||
|
get_pixel_width() const {
|
||||||
|
return _cdata->_pr - _cdata->_pl;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_pixel_height
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the height of the DisplayRegion in pixels.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE int DisplayRegionPipelineReader::
|
||||||
|
get_pixel_height() const {
|
||||||
|
return _cdata->_pt - _cdata->_pb;
|
||||||
|
}
|
||||||
|
|
||||||
INLINE ostream &operator << (ostream &out, const DisplayRegion &dr) {
|
INLINE ostream &operator << (ostream &out, const DisplayRegion &dr) {
|
||||||
dr.output(out);
|
dr.output(out);
|
||||||
return out;
|
return out;
|
||||||
|
@ -105,74 +105,6 @@ cleanup() {
|
|||||||
cdata->_cull_result = NULL;
|
cdata->_cull_result = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_dimensions
|
|
||||||
// Access: Published
|
|
||||||
// Description: Retrieves the coordinates of the DisplayRegion's
|
|
||||||
// rectangle within its GraphicsOutput. These numbers
|
|
||||||
// will be in the range [0..1].
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void DisplayRegion::
|
|
||||||
get_dimensions(float &l, float &r, float &b, float &t) const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
l = cdata->_l;
|
|
||||||
r = cdata->_r;
|
|
||||||
b = cdata->_b;
|
|
||||||
t = cdata->_t;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_left
|
|
||||||
// Access: Published
|
|
||||||
// Description: Retrieves the x coordinate of the left edge of the
|
|
||||||
// rectangle within its GraphicsOutput. This number
|
|
||||||
// will be in the range [0..1].
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
float DisplayRegion::
|
|
||||||
get_left() const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
return cdata->_l;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_right
|
|
||||||
// Access: Published
|
|
||||||
// Description: Retrieves the x coordinate of the right edge of the
|
|
||||||
// rectangle within its GraphicsOutput. This number
|
|
||||||
// will be in the range [0..1].
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
float DisplayRegion::
|
|
||||||
get_right() const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
return cdata->_r;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_bottom
|
|
||||||
// Access: Published
|
|
||||||
// Description: Retrieves the y coordinate of the bottom edge of
|
|
||||||
// the rectangle within its GraphicsOutput. This
|
|
||||||
// number will be in the range [0..1].
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
float DisplayRegion::
|
|
||||||
get_bottom() const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
return cdata->_b;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_top
|
|
||||||
// Access: Published
|
|
||||||
// Description: Retrieves the y coordinate of the top edge of the
|
|
||||||
// rectangle within its GraphicsOutput. This number
|
|
||||||
// will be in the range [0..1].
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
float DisplayRegion::
|
|
||||||
get_top() const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
return cdata->_t;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DisplayRegion::set_dimensions
|
// Function: DisplayRegion::set_dimensions
|
||||||
// Access: Published
|
// Access: Published
|
||||||
@ -198,18 +130,6 @@ set_dimensions(float l, float r, float b, float t) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_window
|
|
||||||
// Access: Published
|
|
||||||
// Description: Returns the GraphicsOutput that this DisplayRegion is
|
|
||||||
// ultimately associated with, or NULL if no window is
|
|
||||||
// associated.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
GraphicsOutput *DisplayRegion::
|
|
||||||
get_window() const {
|
|
||||||
return _window;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DisplayRegion::get_pipe
|
// Function: DisplayRegion::get_pipe
|
||||||
// Access: Published
|
// Access: Published
|
||||||
@ -264,19 +184,6 @@ set_camera(const NodePath &camera) {
|
|||||||
cdata->_camera = camera;
|
cdata->_camera = camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_camera
|
|
||||||
// Access: Published
|
|
||||||
// Description: Returns the camera associated with this
|
|
||||||
// DisplayRegion, or an empty NodePath if no camera is
|
|
||||||
// associated.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
NodePath DisplayRegion::
|
|
||||||
get_camera() const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
return cdata->_camera;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DisplayRegion::set_active
|
// Function: DisplayRegion::set_active
|
||||||
// Access: Published
|
// Access: Published
|
||||||
@ -425,76 +332,6 @@ compute_pixels_all_stages(int x_size, int y_size) {
|
|||||||
CLOSE_ITERATE_ALL_STAGES(_cycler);
|
CLOSE_ITERATE_ALL_STAGES(_cycler);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_pixels
|
|
||||||
// Access: Published
|
|
||||||
// Description: Retrieves the coordinates of the DisplayRegion within
|
|
||||||
// its window, in pixels.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void DisplayRegion::
|
|
||||||
get_pixels(int &pl, int &pr, int &pb, int &pt) const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
pl = cdata->_pl;
|
|
||||||
pr = cdata->_pr;
|
|
||||||
pb = cdata->_pb;
|
|
||||||
pt = cdata->_pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_region_pixels
|
|
||||||
// Access: Published
|
|
||||||
// Description: Retrieves the coordinates of the DisplayRegion within
|
|
||||||
// its window, as the pixel location of its bottom-left
|
|
||||||
// corner, along with a pixel width and height.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void DisplayRegion::
|
|
||||||
get_region_pixels(int &xo, int &yo, int &w, int &h) const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
xo = cdata->_pl;
|
|
||||||
yo = cdata->_pb;
|
|
||||||
w = cdata->_pr - cdata->_pl;
|
|
||||||
h = cdata->_pt - cdata->_pb;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_region_pixels_i
|
|
||||||
// Access: Published
|
|
||||||
// Description: Similar to get_region_pixels(), but returns the upper
|
|
||||||
// left corner, and the pixel numbers are numbered from
|
|
||||||
// the top-left corner down, in the DirectX way of
|
|
||||||
// things.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void DisplayRegion::
|
|
||||||
get_region_pixels_i(int &xo, int &yo, int &w, int &h) const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
xo = cdata->_pl;
|
|
||||||
yo = cdata->_pti;
|
|
||||||
w = cdata->_pr - cdata->_pl;
|
|
||||||
h = cdata->_pbi - cdata->_pti;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_pixel_width
|
|
||||||
// Access: Published
|
|
||||||
// Description: Returns the width of the DisplayRegion in pixels.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
int DisplayRegion::
|
|
||||||
get_pixel_width() const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
return cdata->_pr - cdata->_pl;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: DisplayRegion::get_pixel_height
|
|
||||||
// Access: Published
|
|
||||||
// Description: Returns the height of the DisplayRegion in pixels.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
int DisplayRegion::
|
|
||||||
get_pixel_height() const {
|
|
||||||
CDReader cdata(_cycler);
|
|
||||||
return cdata->_pt - cdata->_pb;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DisplayRegion::output
|
// Function: DisplayRegion::output
|
||||||
// Access: Published
|
// Access: Published
|
||||||
@ -773,3 +610,15 @@ CycleData *DisplayRegion::CDataCull::
|
|||||||
make_copy() const {
|
make_copy() const {
|
||||||
return new CDataCull(*this);
|
return new CDataCull(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: DisplayRegionPipelineReader::get_pipe
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the GraphicsPipe that this DisplayRegion is
|
||||||
|
// ultimately associated with, or NULL if no pipe is
|
||||||
|
// associated.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
GraphicsPipe *DisplayRegionPipelineReader::
|
||||||
|
get_pipe() const {
|
||||||
|
return (_object->_window != (GraphicsOutput *)NULL) ? _object->_window->get_pipe() : NULL;
|
||||||
|
}
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
#include "pipelineCycler.h"
|
#include "pipelineCycler.h"
|
||||||
#include "config_display.h"
|
#include "config_display.h"
|
||||||
#include "lens.h"
|
#include "lens.h"
|
||||||
|
#include "deletedChain.h"
|
||||||
#include "plist.h"
|
#include "plist.h"
|
||||||
|
|
||||||
class GraphicsOutput;
|
class GraphicsOutput;
|
||||||
@ -70,18 +70,18 @@ public:
|
|||||||
INLINE bool operator < (const DisplayRegion &other) const;
|
INLINE bool operator < (const DisplayRegion &other) const;
|
||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
void get_dimensions(float &l, float &r, float &b, float &t) const;
|
INLINE void get_dimensions(float &l, float &r, float &b, float &t) const;
|
||||||
float get_left() const;
|
INLINE float get_left() const;
|
||||||
float get_right() const;
|
INLINE float get_right() const;
|
||||||
float get_bottom() const;
|
INLINE float get_bottom() const;
|
||||||
float get_top() const;
|
INLINE float get_top() const;
|
||||||
void set_dimensions(float l, float r, float b, float t);
|
void set_dimensions(float l, float r, float b, float t);
|
||||||
|
|
||||||
GraphicsOutput *get_window() const;
|
INLINE GraphicsOutput *get_window() const;
|
||||||
GraphicsPipe *get_pipe() const;
|
GraphicsPipe *get_pipe() const;
|
||||||
|
|
||||||
void set_camera(const NodePath &camera);
|
void set_camera(const NodePath &camera);
|
||||||
NodePath get_camera() const;
|
INLINE NodePath get_camera() const;
|
||||||
|
|
||||||
void set_active(bool active);
|
void set_active(bool active);
|
||||||
INLINE bool is_active() const;
|
INLINE bool is_active() const;
|
||||||
@ -102,12 +102,12 @@ PUBLISHED:
|
|||||||
void compute_pixels_all_stages();
|
void compute_pixels_all_stages();
|
||||||
void compute_pixels(int x_size, int y_size);
|
void compute_pixels(int x_size, int y_size);
|
||||||
void compute_pixels_all_stages(int x_size, int y_size);
|
void compute_pixels_all_stages(int x_size, int y_size);
|
||||||
void get_pixels(int &pl, int &pr, int &pb, int &pt) const;
|
INLINE void get_pixels(int &pl, int &pr, int &pb, int &pt) const;
|
||||||
void get_region_pixels(int &xo, int &yo, int &w, int &h) const;
|
INLINE void get_region_pixels(int &xo, int &yo, int &w, int &h) const;
|
||||||
void get_region_pixels_i(int &xo, int &yo, int &w, int &h) const;
|
INLINE void get_region_pixels_i(int &xo, int &yo, int &w, int &h) const;
|
||||||
|
|
||||||
int get_pixel_width() const;
|
INLINE int get_pixel_width() const;
|
||||||
int get_pixel_height() const;
|
INLINE int get_pixel_height() const;
|
||||||
|
|
||||||
void output(ostream &out) const;
|
void output(ostream &out) const;
|
||||||
|
|
||||||
@ -212,6 +212,57 @@ private:
|
|||||||
static TypeHandle _type_handle;
|
static TypeHandle _type_handle;
|
||||||
|
|
||||||
friend class GraphicsOutput;
|
friend class GraphicsOutput;
|
||||||
|
friend class DisplayRegionPipelineReader;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : DisplayRegionPipelineReader
|
||||||
|
// Description : Encapsulates the data from a DisplayRegion,
|
||||||
|
// pre-fetched for one stage of the pipeline.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class EXPCL_PANDA DisplayRegionPipelineReader {
|
||||||
|
public:
|
||||||
|
INLINE DisplayRegionPipelineReader(DisplayRegion *object, Thread *current_thread);
|
||||||
|
private:
|
||||||
|
INLINE DisplayRegionPipelineReader(const DisplayRegionPipelineReader ©);
|
||||||
|
INLINE void operator = (const DisplayRegionPipelineReader ©);
|
||||||
|
|
||||||
|
public:
|
||||||
|
INLINE ~DisplayRegionPipelineReader();
|
||||||
|
ALLOC_DELETED_CHAIN(DisplayRegionPipelineReader);
|
||||||
|
|
||||||
|
INLINE DisplayRegion *get_object() const;
|
||||||
|
INLINE Thread *get_current_thread() const;
|
||||||
|
|
||||||
|
INLINE bool is_any_clear_active() const;
|
||||||
|
|
||||||
|
INLINE void get_dimensions(float &l, float &r, float &b, float &t) const;
|
||||||
|
INLINE float get_left() const;
|
||||||
|
INLINE float get_right() const;
|
||||||
|
INLINE float get_bottom() const;
|
||||||
|
INLINE float get_top() const;
|
||||||
|
|
||||||
|
INLINE GraphicsOutput *get_window() const;
|
||||||
|
GraphicsPipe *get_pipe() const;
|
||||||
|
|
||||||
|
INLINE NodePath get_camera() const;
|
||||||
|
INLINE bool is_active() const;
|
||||||
|
INLINE int get_sort() const;
|
||||||
|
INLINE Lens::StereoChannel get_stereo_channel();
|
||||||
|
INLINE bool get_clear_depth_between_eyes() const;
|
||||||
|
INLINE int get_cube_map_index() const;
|
||||||
|
|
||||||
|
INLINE void get_pixels(int &pl, int &pr, int &pb, int &pt) const;
|
||||||
|
INLINE void get_region_pixels(int &xo, int &yo, int &w, int &h) const;
|
||||||
|
INLINE void get_region_pixels_i(int &xo, int &yo, int &w, int &h) const;
|
||||||
|
|
||||||
|
INLINE int get_pixel_width() const;
|
||||||
|
INLINE int get_pixel_height() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DisplayRegion *_object;
|
||||||
|
Thread *_current_thread;
|
||||||
|
const DisplayRegion::CData *_cdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
INLINE ostream &operator << (ostream &out, const DisplayRegion &dr);
|
INLINE ostream &operator << (ostream &out, const DisplayRegion &dr);
|
||||||
|
@ -434,6 +434,8 @@ make_output(GraphicsPipe *pipe,
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool GraphicsEngine::
|
bool GraphicsEngine::
|
||||||
remove_window(GraphicsOutput *window) {
|
remove_window(GraphicsOutput *window) {
|
||||||
|
Thread *current_thread = Thread::get_current_thread();
|
||||||
|
|
||||||
// First, make sure we know what this window is.
|
// First, make sure we know what this window is.
|
||||||
PT(GraphicsOutput) ptwin = window;
|
PT(GraphicsOutput) ptwin = window;
|
||||||
size_t count;
|
size_t count;
|
||||||
@ -449,7 +451,7 @@ remove_window(GraphicsOutput *window) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
do_remove_window(window);
|
do_remove_window(window, current_thread);
|
||||||
|
|
||||||
nassertr(count == 1, true);
|
nassertr(count == 1, true);
|
||||||
return true;
|
return true;
|
||||||
@ -464,16 +466,18 @@ remove_window(GraphicsOutput *window) {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
remove_all_windows() {
|
remove_all_windows() {
|
||||||
|
Thread *current_thread = Thread::get_current_thread();
|
||||||
|
|
||||||
Windows::iterator wi;
|
Windows::iterator wi;
|
||||||
for (wi = _windows.begin(); wi != _windows.end(); ++wi) {
|
for (wi = _windows.begin(); wi != _windows.end(); ++wi) {
|
||||||
GraphicsOutput *win = (*wi);
|
GraphicsOutput *win = (*wi);
|
||||||
do_remove_window(win);
|
do_remove_window(win, current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
_windows.clear();
|
_windows.clear();
|
||||||
|
|
||||||
_app.do_close(this);
|
_app.do_close(this, current_thread);
|
||||||
_app.do_pending(this);
|
_app.do_pending(this, current_thread);
|
||||||
terminate_threads();
|
terminate_threads();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,6 +546,8 @@ get_window(int n) const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
render_frame() {
|
render_frame() {
|
||||||
|
Thread *current_thread = Thread::get_current_thread();
|
||||||
|
|
||||||
// Anything that happens outside of GraphicsEngine::render_frame()
|
// Anything that happens outside of GraphicsEngine::render_frame()
|
||||||
// is deemed to be App.
|
// is deemed to be App.
|
||||||
#ifdef DO_PSTATS
|
#ifdef DO_PSTATS
|
||||||
@ -569,7 +575,7 @@ render_frame() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (_flip_state != FS_flip) {
|
if (_flip_state != FS_flip) {
|
||||||
do_flip_frame();
|
do_flip_frame(current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Are any of the windows ready to be deleted?
|
// Are any of the windows ready to be deleted?
|
||||||
@ -579,7 +585,7 @@ render_frame() {
|
|||||||
for (wi = _windows.begin(); wi != _windows.end(); ++wi) {
|
for (wi = _windows.begin(); wi != _windows.end(); ++wi) {
|
||||||
GraphicsOutput *win = (*wi);
|
GraphicsOutput *win = (*wi);
|
||||||
if (win->get_delete_flag()) {
|
if (win->get_delete_flag()) {
|
||||||
do_remove_window(win);
|
do_remove_window(win, current_thread);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
new_windows.push_back(win);
|
new_windows.push_back(win);
|
||||||
@ -612,7 +618,7 @@ render_frame() {
|
|||||||
|
|
||||||
// Now it's time to do any drawing from the main frame--after all of
|
// Now it's time to do any drawing from the main frame--after all of
|
||||||
// the App code has executed, but before we begin the next frame.
|
// the App code has executed, but before we begin the next frame.
|
||||||
_app.do_frame(this);
|
_app.do_frame(this, current_thread);
|
||||||
|
|
||||||
// Grab each thread's mutex again after all windows have flipped,
|
// Grab each thread's mutex again after all windows have flipped,
|
||||||
// and wait for the thread to finish.
|
// and wait for the thread to finish.
|
||||||
@ -756,6 +762,8 @@ render_frame() {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
open_windows() {
|
open_windows() {
|
||||||
|
Thread *current_thread = Thread::get_current_thread();
|
||||||
|
|
||||||
MutexHolder holder(_lock);
|
MutexHolder holder(_lock);
|
||||||
|
|
||||||
if (!_windows_sorted) {
|
if (!_windows_sorted) {
|
||||||
@ -765,8 +773,8 @@ open_windows() {
|
|||||||
// We do it twice, to allow both cull and draw to process the
|
// We do it twice, to allow both cull and draw to process the
|
||||||
// window.
|
// window.
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
_app.do_windows(this);
|
_app.do_windows(this, current_thread);
|
||||||
_app.do_pending(this);
|
_app.do_pending(this, current_thread);
|
||||||
|
|
||||||
PStatTimer timer(_wait_pcollector);
|
PStatTimer timer(_wait_pcollector);
|
||||||
Threads::const_iterator ti;
|
Threads::const_iterator ti;
|
||||||
@ -796,10 +804,11 @@ open_windows() {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
sync_frame() {
|
sync_frame() {
|
||||||
|
Thread *current_thread = Thread::get_current_thread();
|
||||||
MutexHolder holder(_lock);
|
MutexHolder holder(_lock);
|
||||||
|
|
||||||
if (_flip_state == FS_draw) {
|
if (_flip_state == FS_draw) {
|
||||||
do_sync_frame();
|
do_sync_frame(current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -814,10 +823,11 @@ sync_frame() {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
flip_frame() {
|
flip_frame() {
|
||||||
|
Thread *current_thread = Thread::get_current_thread();
|
||||||
MutexHolder holder(_lock);
|
MutexHolder holder(_lock);
|
||||||
|
|
||||||
if (_flip_state != FS_flip) {
|
if (_flip_state != FS_flip) {
|
||||||
do_flip_frame();
|
do_flip_frame(current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -952,7 +962,8 @@ set_window_sort(GraphicsOutput *window, int sort) {
|
|||||||
// threading model begins with the "-" character.
|
// threading model begins with the "-" character.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
cull_and_draw_together(const GraphicsEngine::Windows &wlist) {
|
cull_and_draw_together(const GraphicsEngine::Windows &wlist,
|
||||||
|
Thread *current_thread) {
|
||||||
PStatTimer timer(_cull_pcollector);
|
PStatTimer timer(_cull_pcollector);
|
||||||
|
|
||||||
Windows::const_iterator wi;
|
Windows::const_iterator wi;
|
||||||
@ -960,13 +971,13 @@ cull_and_draw_together(const GraphicsEngine::Windows &wlist) {
|
|||||||
GraphicsOutput *win = (*wi);
|
GraphicsOutput *win = (*wi);
|
||||||
if (win->is_active() && win->get_gsg()->is_active()) {
|
if (win->is_active() && win->get_gsg()->is_active()) {
|
||||||
if (win->begin_frame(GraphicsOutput::FM_render)) {
|
if (win->begin_frame(GraphicsOutput::FM_render)) {
|
||||||
win->clear();
|
win->clear(current_thread);
|
||||||
|
|
||||||
int num_display_regions = win->get_num_active_display_regions();
|
int num_display_regions = win->get_num_active_display_regions();
|
||||||
for (int i = 0; i < num_display_regions; i++) {
|
for (int i = 0; i < num_display_regions; i++) {
|
||||||
DisplayRegion *dr = win->get_active_display_region(i);
|
DisplayRegion *dr = win->get_active_display_region(i);
|
||||||
if (dr != (DisplayRegion *)NULL) {
|
if (dr != (DisplayRegion *)NULL) {
|
||||||
cull_and_draw_together(win, dr);
|
cull_and_draw_together(win, dr, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
win->end_frame(GraphicsOutput::FM_render);
|
win->end_frame(GraphicsOutput::FM_render);
|
||||||
@ -995,30 +1006,40 @@ cull_and_draw_together(const GraphicsEngine::Windows &wlist) {
|
|||||||
// cull_and_draw_together(), above.
|
// cull_and_draw_together(), above.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr) {
|
cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr,
|
||||||
|
Thread *current_thread) {
|
||||||
GraphicsStateGuardian *gsg = win->get_gsg();
|
GraphicsStateGuardian *gsg = win->get_gsg();
|
||||||
nassertv(gsg != (GraphicsStateGuardian *)NULL);
|
nassertv(gsg != (GraphicsStateGuardian *)NULL);
|
||||||
|
|
||||||
win->change_scenes(dr);
|
DisplayRegionPipelineReader *dr_reader =
|
||||||
gsg->prepare_display_region(dr, dr->get_stereo_channel());
|
new DisplayRegionPipelineReader(dr, current_thread);
|
||||||
|
|
||||||
PT(SceneSetup) scene_setup = setup_scene(gsg, dr);
|
win->change_scenes(dr_reader);
|
||||||
|
gsg->prepare_display_region(dr_reader, dr_reader->get_stereo_channel());
|
||||||
|
|
||||||
|
PT(SceneSetup) scene_setup = setup_scene(gsg, dr_reader);
|
||||||
if (!gsg->set_scene(scene_setup)) {
|
if (!gsg->set_scene(scene_setup)) {
|
||||||
// The scene or lens is inappropriate somehow.
|
// The scene or lens is inappropriate somehow.
|
||||||
display_cat.error()
|
display_cat.error()
|
||||||
<< gsg->get_type() << " cannot render scene with specified lens.\n";
|
<< gsg->get_type() << " cannot render scene with specified lens.\n";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (dr->is_any_clear_active()) {
|
if (dr_reader->is_any_clear_active()) {
|
||||||
gsg->clear(dr);
|
gsg->clear(dr);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawCullHandler cull_handler(gsg);
|
DrawCullHandler cull_handler(gsg);
|
||||||
if (gsg->begin_scene()) {
|
if (gsg->begin_scene()) {
|
||||||
do_cull(&cull_handler, scene_setup, gsg);
|
delete dr_reader;
|
||||||
|
dr_reader = NULL;
|
||||||
|
do_cull(&cull_handler, scene_setup, gsg, current_thread);
|
||||||
gsg->end_scene();
|
gsg->end_scene();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dr_reader != (DisplayRegionPipelineReader *)NULL) {
|
||||||
|
delete dr_reader;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -1030,7 +1051,7 @@ cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr) {
|
|||||||
// drawing.
|
// drawing.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
cull_to_bins(const GraphicsEngine::Windows &wlist) {
|
cull_to_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
|
||||||
PStatTimer timer(_cull_pcollector);
|
PStatTimer timer(_cull_pcollector);
|
||||||
|
|
||||||
// Keep track of the cameras we have already used in this thread to
|
// Keep track of the cameras we have already used in this thread to
|
||||||
@ -1046,13 +1067,17 @@ cull_to_bins(const GraphicsEngine::Windows &wlist) {
|
|||||||
for (int i = 0; i < num_display_regions; ++i) {
|
for (int i = 0; i < num_display_regions; ++i) {
|
||||||
DisplayRegion *dr = win->get_active_display_region(i);
|
DisplayRegion *dr = win->get_active_display_region(i);
|
||||||
if (dr != (DisplayRegion *)NULL) {
|
if (dr != (DisplayRegion *)NULL) {
|
||||||
NodePath camera = dr->get_camera();
|
DisplayRegionPipelineReader *dr_reader =
|
||||||
|
new DisplayRegionPipelineReader(dr, current_thread);
|
||||||
|
NodePath camera = dr_reader->get_camera();
|
||||||
AlreadyCulled::iterator aci = already_culled.insert(AlreadyCulled::value_type(camera, NULL)).first;
|
AlreadyCulled::iterator aci = already_culled.insert(AlreadyCulled::value_type(camera, NULL)).first;
|
||||||
if ((*aci).second == NULL) {
|
if ((*aci).second == NULL) {
|
||||||
// We have not used this camera already in this thread.
|
// We have not used this camera already in this thread.
|
||||||
// Perform the cull operation.
|
// Perform the cull operation.
|
||||||
|
delete dr_reader;
|
||||||
|
dr_reader = NULL;
|
||||||
(*aci).second = dr;
|
(*aci).second = dr;
|
||||||
cull_to_bins(win, dr);
|
cull_to_bins(win, dr, current_thread);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// We have already culled a scene using this camera in
|
// We have already culled a scene using this camera in
|
||||||
@ -1064,7 +1089,11 @@ cull_to_bins(const GraphicsEngine::Windows &wlist) {
|
|||||||
// the other DisplayRegion.
|
// the other DisplayRegion.
|
||||||
DisplayRegion *other_dr = (*aci).second;
|
DisplayRegion *other_dr = (*aci).second;
|
||||||
dr->set_cull_result(other_dr->get_cull_result(),
|
dr->set_cull_result(other_dr->get_cull_result(),
|
||||||
setup_scene(win->get_gsg(), dr));
|
setup_scene(win->get_gsg(), dr_reader));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dr_reader != (DisplayRegionPipelineReader *)NULL) {
|
||||||
|
delete dr_reader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1079,7 +1108,7 @@ cull_to_bins(const GraphicsEngine::Windows &wlist) {
|
|||||||
// above.
|
// above.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
cull_to_bins(GraphicsOutput *win, DisplayRegion *dr) {
|
cull_to_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread) {
|
||||||
GraphicsStateGuardian *gsg = win->get_gsg();
|
GraphicsStateGuardian *gsg = win->get_gsg();
|
||||||
nassertv(gsg != (GraphicsStateGuardian *)NULL);
|
nassertv(gsg != (GraphicsStateGuardian *)NULL);
|
||||||
|
|
||||||
@ -1093,12 +1122,13 @@ cull_to_bins(GraphicsOutput *win, DisplayRegion *dr) {
|
|||||||
} else {
|
} else {
|
||||||
cull_result = new CullResult(gsg);
|
cull_result = new CullResult(gsg);
|
||||||
}
|
}
|
||||||
scene_setup = setup_scene(gsg, dr);
|
DisplayRegionPipelineReader dr_reader(dr, current_thread);
|
||||||
|
scene_setup = setup_scene(gsg, &dr_reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scene_setup != (SceneSetup *)NULL) {
|
if (scene_setup != (SceneSetup *)NULL) {
|
||||||
BinCullHandler cull_handler(cull_result);
|
BinCullHandler cull_handler(cull_result);
|
||||||
do_cull(&cull_handler, scene_setup, gsg);
|
do_cull(&cull_handler, scene_setup, gsg, current_thread);
|
||||||
|
|
||||||
{
|
{
|
||||||
PStatTimer timer(_cull_sort_pcollector);
|
PStatTimer timer(_cull_sort_pcollector);
|
||||||
@ -1119,19 +1149,19 @@ cull_to_bins(GraphicsOutput *win, DisplayRegion *dr) {
|
|||||||
// cull_to_bins().
|
// cull_to_bins().
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
draw_bins(const GraphicsEngine::Windows &wlist) {
|
draw_bins(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
|
||||||
Windows::const_iterator wi;
|
Windows::const_iterator wi;
|
||||||
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
||||||
GraphicsOutput *win = (*wi);
|
GraphicsOutput *win = (*wi);
|
||||||
if (win->is_active() && win->get_gsg()->is_active()) {
|
if (win->is_active() && win->get_gsg()->is_active()) {
|
||||||
if (win->begin_frame(GraphicsOutput::FM_render)) {
|
if (win->begin_frame(GraphicsOutput::FM_render)) {
|
||||||
win->clear();
|
win->clear(current_thread);
|
||||||
|
|
||||||
int num_display_regions = win->get_num_active_display_regions();
|
int num_display_regions = win->get_num_active_display_regions();
|
||||||
for (int i = 0; i < num_display_regions; ++i) {
|
for (int i = 0; i < num_display_regions; ++i) {
|
||||||
DisplayRegion *dr = win->get_active_display_region(i);
|
DisplayRegion *dr = win->get_active_display_region(i);
|
||||||
if (dr != (DisplayRegion *)NULL) {
|
if (dr != (DisplayRegion *)NULL) {
|
||||||
draw_bins(win, dr);
|
draw_bins(win, dr, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
win->end_frame(GraphicsOutput::FM_render);
|
win->end_frame(GraphicsOutput::FM_render);
|
||||||
@ -1161,14 +1191,14 @@ draw_bins(const GraphicsEngine::Windows &wlist) {
|
|||||||
// particular DisplayRegion.
|
// particular DisplayRegion.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
draw_bins(GraphicsOutput *win, DisplayRegion *dr) {
|
draw_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread) {
|
||||||
GraphicsStateGuardian *gsg = win->get_gsg();
|
GraphicsStateGuardian *gsg = win->get_gsg();
|
||||||
nassertv(gsg != (GraphicsStateGuardian *)NULL);
|
nassertv(gsg != (GraphicsStateGuardian *)NULL);
|
||||||
|
|
||||||
PT(CullResult) cull_result = dr->get_cull_result();
|
PT(CullResult) cull_result = dr->get_cull_result();
|
||||||
PT(SceneSetup) scene_setup = dr->get_scene_setup();
|
PT(SceneSetup) scene_setup = dr->get_scene_setup();
|
||||||
if (cull_result != (CullResult *)NULL && scene_setup != (SceneSetup *)NULL) {
|
if (cull_result != (CullResult *)NULL && scene_setup != (SceneSetup *)NULL) {
|
||||||
do_draw(cull_result, scene_setup, win, dr);
|
do_draw(cull_result, scene_setup, win, dr, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1180,7 +1210,7 @@ draw_bins(GraphicsOutput *win, DisplayRegion *dr) {
|
|||||||
// graphics context both get created.
|
// graphics context both get created.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
make_contexts(const GraphicsEngine::Windows &wlist) {
|
make_contexts(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
|
||||||
Windows::const_iterator wi;
|
Windows::const_iterator wi;
|
||||||
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
||||||
GraphicsOutput *win = (*wi);
|
GraphicsOutput *win = (*wi);
|
||||||
@ -1198,7 +1228,7 @@ make_contexts(const GraphicsEngine::Windows &wlist) {
|
|||||||
// list of windows. This is run in the window thread.
|
// list of windows. This is run in the window thread.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
process_events(const GraphicsEngine::Windows &wlist) {
|
process_events(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
|
||||||
Windows::const_iterator wi;
|
Windows::const_iterator wi;
|
||||||
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
||||||
GraphicsOutput *win = (*wi);
|
GraphicsOutput *win = (*wi);
|
||||||
@ -1214,7 +1244,7 @@ process_events(const GraphicsEngine::Windows &wlist) {
|
|||||||
// the given list. This is run in the draw thread.
|
// the given list. This is run in the draw thread.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
flip_windows(const GraphicsEngine::Windows &wlist) {
|
flip_windows(const GraphicsEngine::Windows &wlist, Thread *current_thread) {
|
||||||
Windows::const_iterator wi;
|
Windows::const_iterator wi;
|
||||||
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
for (wi = wlist.begin(); wi != wlist.end(); ++wi) {
|
||||||
GraphicsOutput *win = (*wi);
|
GraphicsOutput *win = (*wi);
|
||||||
@ -1239,7 +1269,7 @@ flip_windows(const GraphicsEngine::Windows &wlist) {
|
|||||||
// is already held before this method is called.
|
// is already held before this method is called.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
do_sync_frame() {
|
do_sync_frame(Thread *current_thread) {
|
||||||
nassertv(_lock.debug_is_locked());
|
nassertv(_lock.debug_is_locked());
|
||||||
|
|
||||||
// Statistics
|
// Statistics
|
||||||
@ -1266,7 +1296,7 @@ do_sync_frame() {
|
|||||||
// is already held before this method is called.
|
// is already held before this method is called.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
do_flip_frame() {
|
do_flip_frame(Thread *current_thread) {
|
||||||
nassertv(_lock.debug_is_locked());
|
nassertv(_lock.debug_is_locked());
|
||||||
|
|
||||||
// Statistics
|
// Statistics
|
||||||
@ -1291,7 +1321,7 @@ do_flip_frame() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now signal all of our threads to flip the windows.
|
// Now signal all of our threads to flip the windows.
|
||||||
_app.do_flip(this);
|
_app.do_flip(this, current_thread);
|
||||||
|
|
||||||
{
|
{
|
||||||
Threads::const_iterator ti;
|
Threads::const_iterator ti;
|
||||||
@ -1316,7 +1346,7 @@ do_flip_frame() {
|
|||||||
// reason.
|
// reason.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
PT(SceneSetup) GraphicsEngine::
|
PT(SceneSetup) GraphicsEngine::
|
||||||
setup_scene(GraphicsStateGuardian *gsg, DisplayRegion *dr) {
|
setup_scene(GraphicsStateGuardian *gsg, DisplayRegionPipelineReader *dr) {
|
||||||
PStatTimer timer(_cull_setup_pcollector);
|
PStatTimer timer(_cull_setup_pcollector);
|
||||||
|
|
||||||
GraphicsOutput *window = dr->get_window();
|
GraphicsOutput *window = dr->get_window();
|
||||||
@ -1380,7 +1410,7 @@ setup_scene(GraphicsStateGuardian *gsg, DisplayRegion *dr) {
|
|||||||
initial_state = initial_state->compose(get_invert_polygon_state());
|
initial_state = initial_state->compose(get_invert_polygon_state());
|
||||||
}
|
}
|
||||||
|
|
||||||
scene_setup->set_display_region(dr);
|
scene_setup->set_display_region(dr->get_object());
|
||||||
scene_setup->set_viewport_size(dr->get_pixel_width(), dr->get_pixel_height());
|
scene_setup->set_viewport_size(dr->get_pixel_width(), dr->get_pixel_height());
|
||||||
scene_setup->set_scene_root(scene_root);
|
scene_setup->set_scene_root(scene_root);
|
||||||
scene_setup->set_camera_path(camera);
|
scene_setup->set_camera_path(camera);
|
||||||
@ -1400,7 +1430,7 @@ setup_scene(GraphicsStateGuardian *gsg, DisplayRegion *dr) {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
|
do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
|
||||||
GraphicsStateGuardian *gsg) {
|
GraphicsStateGuardian *gsg, Thread *current_thread) {
|
||||||
CullTraverser trav(gsg);
|
CullTraverser trav(gsg);
|
||||||
trav.set_cull_handler(cull_handler);
|
trav.set_cull_handler(cull_handler);
|
||||||
trav.set_depth_offset_decals(depth_offset_decals && gsg->depth_offset_decals());
|
trav.set_depth_offset_decals(depth_offset_decals && gsg->depth_offset_decals());
|
||||||
@ -1439,21 +1469,24 @@ do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
do_draw(CullResult *cull_result, SceneSetup *scene_setup,
|
do_draw(CullResult *cull_result, SceneSetup *scene_setup,
|
||||||
GraphicsOutput *win, DisplayRegion *dr) {
|
GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread) {
|
||||||
// Statistics
|
// Statistics
|
||||||
PStatTimer timer(_draw_pcollector);
|
PStatTimer timer(_draw_pcollector);
|
||||||
|
|
||||||
GraphicsStateGuardian *gsg = win->get_gsg();
|
DisplayRegionPipelineReader *dr_reader =
|
||||||
win->change_scenes(dr);
|
new DisplayRegionPipelineReader(dr, current_thread);
|
||||||
|
|
||||||
if (dr->get_stereo_channel() == Lens::SC_stereo) {
|
GraphicsStateGuardian *gsg = win->get_gsg();
|
||||||
|
win->change_scenes(dr_reader);
|
||||||
|
|
||||||
|
if (dr_reader->get_stereo_channel() == Lens::SC_stereo) {
|
||||||
// A special case. For a stereo DisplayRegion, we render the left
|
// A special case. For a stereo DisplayRegion, we render the left
|
||||||
// eye, followed by the right eye.
|
// eye, followed by the right eye.
|
||||||
if (dr->is_any_clear_active()) {
|
if (dr_reader->is_any_clear_active()) {
|
||||||
gsg->prepare_display_region(dr, Lens::SC_stereo);
|
gsg->prepare_display_region(dr_reader, Lens::SC_stereo);
|
||||||
gsg->clear(dr);
|
gsg->clear(dr_reader->get_object());
|
||||||
}
|
}
|
||||||
gsg->prepare_display_region(dr, Lens::SC_left);
|
gsg->prepare_display_region(dr_reader, Lens::SC_left);
|
||||||
|
|
||||||
if (!gsg->set_scene(scene_setup)) {
|
if (!gsg->set_scene(scene_setup)) {
|
||||||
// The scene or lens is inappropriate somehow.
|
// The scene or lens is inappropriate somehow.
|
||||||
@ -1461,19 +1494,24 @@ do_draw(CullResult *cull_result, SceneSetup *scene_setup,
|
|||||||
<< gsg->get_type() << " cannot render scene with specified lens.\n";
|
<< gsg->get_type() << " cannot render scene with specified lens.\n";
|
||||||
} else {
|
} else {
|
||||||
if (gsg->begin_scene()) {
|
if (gsg->begin_scene()) {
|
||||||
cull_result->draw();
|
delete dr_reader;
|
||||||
|
dr_reader = NULL;
|
||||||
|
cull_result->draw(current_thread);
|
||||||
gsg->end_scene();
|
gsg->end_scene();
|
||||||
|
dr_reader = new DisplayRegionPipelineReader(dr, current_thread);
|
||||||
}
|
}
|
||||||
if (dr->get_clear_depth_between_eyes()) {
|
if (dr_reader->get_clear_depth_between_eyes()) {
|
||||||
DrawableRegion clear_region;
|
DrawableRegion clear_region;
|
||||||
clear_region.set_clear_depth_active(true);
|
clear_region.set_clear_depth_active(true);
|
||||||
clear_region.set_clear_depth(dr->get_clear_depth());
|
clear_region.set_clear_depth(dr->get_clear_depth());
|
||||||
gsg->clear(&clear_region);
|
gsg->clear(&clear_region);
|
||||||
}
|
}
|
||||||
gsg->prepare_display_region(dr, Lens::SC_right);
|
gsg->prepare_display_region(dr_reader, Lens::SC_right);
|
||||||
gsg->set_scene(scene_setup);
|
gsg->set_scene(scene_setup);
|
||||||
if (gsg->begin_scene()) {
|
if (gsg->begin_scene()) {
|
||||||
cull_result->draw();
|
delete dr_reader;
|
||||||
|
dr_reader = NULL;
|
||||||
|
cull_result->draw(current_thread);
|
||||||
gsg->end_scene();
|
gsg->end_scene();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1481,22 +1519,28 @@ do_draw(CullResult *cull_result, SceneSetup *scene_setup,
|
|||||||
} else {
|
} else {
|
||||||
// For a mono DisplayRegion, or a left/right eye only
|
// For a mono DisplayRegion, or a left/right eye only
|
||||||
// DisplayRegion, we just render that.
|
// DisplayRegion, we just render that.
|
||||||
gsg->prepare_display_region(dr, dr->get_stereo_channel());
|
gsg->prepare_display_region(dr_reader, dr_reader->get_stereo_channel());
|
||||||
|
|
||||||
if (!gsg->set_scene(scene_setup)) {
|
if (!gsg->set_scene(scene_setup)) {
|
||||||
// The scene or lens is inappropriate somehow.
|
// The scene or lens is inappropriate somehow.
|
||||||
display_cat.error()
|
display_cat.error()
|
||||||
<< gsg->get_type() << " cannot render scene with specified lens.\n";
|
<< gsg->get_type() << " cannot render scene with specified lens.\n";
|
||||||
} else {
|
} else {
|
||||||
if (dr->is_any_clear_active()) {
|
if (dr_reader->is_any_clear_active()) {
|
||||||
gsg->clear(dr);
|
gsg->clear(dr_reader->get_object());
|
||||||
}
|
}
|
||||||
if (gsg->begin_scene()) {
|
if (gsg->begin_scene()) {
|
||||||
cull_result->draw();
|
delete dr_reader;
|
||||||
|
dr_reader = NULL;
|
||||||
|
cull_result->draw(current_thread);
|
||||||
gsg->end_scene();
|
gsg->end_scene();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dr_reader != (DisplayRegionPipelineReader *)NULL) {
|
||||||
|
delete dr_reader;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -1564,7 +1608,7 @@ do_add_window(GraphicsOutput *window, GraphicsStateGuardian *gsg,
|
|||||||
// _windows list itself.
|
// _windows list itself.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::
|
void GraphicsEngine::
|
||||||
do_remove_window(GraphicsOutput *window) {
|
do_remove_window(GraphicsOutput *window, Thread *current_thread) {
|
||||||
PT(GraphicsPipe) pipe = window->get_pipe();
|
PT(GraphicsPipe) pipe = window->get_pipe();
|
||||||
window->_pipe = (GraphicsPipe *)NULL;
|
window->_pipe = (GraphicsPipe *)NULL;
|
||||||
|
|
||||||
@ -1582,7 +1626,7 @@ do_remove_window(GraphicsOutput *window) {
|
|||||||
|
|
||||||
// If the window happened to be controlled by the app thread, we
|
// If the window happened to be controlled by the app thread, we
|
||||||
// might as well close it now rather than waiting for next frame.
|
// might as well close it now rather than waiting for next frame.
|
||||||
_app.do_pending(this);
|
_app.do_pending(this, current_thread);
|
||||||
|
|
||||||
if (display_cat.is_debug()) {
|
if (display_cat.is_debug()) {
|
||||||
display_cat.debug()
|
display_cat.debug()
|
||||||
@ -1858,16 +1902,16 @@ resort_windows() {
|
|||||||
// the draw list, etc.
|
// the draw list, etc.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::WindowRenderer::
|
void GraphicsEngine::WindowRenderer::
|
||||||
do_frame(GraphicsEngine *engine) {
|
do_frame(GraphicsEngine *engine, Thread *current_thread) {
|
||||||
PStatTimer timer(engine->_do_frame_pcollector);
|
PStatTimer timer(engine->_do_frame_pcollector);
|
||||||
MutexHolder holder(_wl_lock);
|
MutexHolder holder(_wl_lock);
|
||||||
|
|
||||||
do_callbacks(CB_pre_frame);
|
do_callbacks(CB_pre_frame);
|
||||||
|
|
||||||
engine->cull_to_bins(_cull);
|
engine->cull_to_bins(_cull, current_thread);
|
||||||
engine->cull_and_draw_together(_cdraw);
|
engine->cull_and_draw_together(_cdraw, current_thread);
|
||||||
engine->draw_bins(_draw);
|
engine->draw_bins(_draw, current_thread);
|
||||||
engine->process_events(_window);
|
engine->process_events(_window, current_thread);
|
||||||
|
|
||||||
// If any GSG's on the list have no more outstanding pointers, clean
|
// If any GSG's on the list have no more outstanding pointers, clean
|
||||||
// them up. (We are in the draw thread for all of these GSG's.)
|
// them up. (We are in the draw thread for all of these GSG's.)
|
||||||
@ -1902,13 +1946,13 @@ do_frame(GraphicsEngine *engine) {
|
|||||||
// only if you want these things to open immediately.)
|
// only if you want these things to open immediately.)
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::WindowRenderer::
|
void GraphicsEngine::WindowRenderer::
|
||||||
do_windows(GraphicsEngine *engine) {
|
do_windows(GraphicsEngine *engine, Thread *current_thread) {
|
||||||
MutexHolder holder(_wl_lock);
|
MutexHolder holder(_wl_lock);
|
||||||
|
|
||||||
engine->process_events(_window);
|
engine->process_events(_window, current_thread);
|
||||||
|
|
||||||
engine->make_contexts(_cdraw);
|
engine->make_contexts(_cdraw, current_thread);
|
||||||
engine->make_contexts(_draw);
|
engine->make_contexts(_draw, current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -1918,10 +1962,10 @@ do_windows(GraphicsEngine *engine) {
|
|||||||
// thread.
|
// thread.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::WindowRenderer::
|
void GraphicsEngine::WindowRenderer::
|
||||||
do_flip(GraphicsEngine *engine) {
|
do_flip(GraphicsEngine *engine, Thread *current_thread) {
|
||||||
MutexHolder holder(_wl_lock);
|
MutexHolder holder(_wl_lock);
|
||||||
engine->flip_windows(_cdraw);
|
engine->flip_windows(_cdraw, current_thread);
|
||||||
engine->flip_windows(_draw);
|
engine->flip_windows(_draw, current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -1930,7 +1974,7 @@ do_flip(GraphicsEngine *engine) {
|
|||||||
// Description: Closes all the windows on the _window list.
|
// Description: Closes all the windows on the _window list.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::WindowRenderer::
|
void GraphicsEngine::WindowRenderer::
|
||||||
do_close(GraphicsEngine *engine) {
|
do_close(GraphicsEngine *engine, Thread *current_thread) {
|
||||||
MutexHolder holder(_wl_lock);
|
MutexHolder holder(_wl_lock);
|
||||||
Windows::iterator wi;
|
Windows::iterator wi;
|
||||||
for (wi = _window.begin(); wi != _window.end(); ++wi) {
|
for (wi = _window.begin(); wi != _window.end(); ++wi) {
|
||||||
@ -1963,7 +2007,7 @@ do_close(GraphicsEngine *engine) {
|
|||||||
// removed from the WindowRenderer.
|
// removed from the WindowRenderer.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::WindowRenderer::
|
void GraphicsEngine::WindowRenderer::
|
||||||
do_pending(GraphicsEngine *engine) {
|
do_pending(GraphicsEngine *engine, Thread *current_thread) {
|
||||||
MutexHolder holder(_wl_lock);
|
MutexHolder holder(_wl_lock);
|
||||||
|
|
||||||
if (!_pending_close.empty()) {
|
if (!_pending_close.empty()) {
|
||||||
@ -2076,6 +2120,8 @@ RenderThread(const string &name, GraphicsEngine *engine) :
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsEngine::RenderThread::
|
void GraphicsEngine::RenderThread::
|
||||||
thread_main() {
|
thread_main() {
|
||||||
|
Thread *current_thread = Thread::get_current_thread();
|
||||||
|
|
||||||
MutexHolder holder(_cv_mutex);
|
MutexHolder holder(_cv_mutex);
|
||||||
while (true) {
|
while (true) {
|
||||||
nassertv(_cv_mutex.debug_is_locked());
|
nassertv(_cv_mutex.debug_is_locked());
|
||||||
@ -2085,26 +2131,26 @@ thread_main() {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TS_do_frame:
|
case TS_do_frame:
|
||||||
do_pending(_engine);
|
do_pending(_engine, current_thread);
|
||||||
do_frame(_engine);
|
do_frame(_engine, current_thread);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TS_do_flip:
|
case TS_do_flip:
|
||||||
do_flip(_engine);
|
do_flip(_engine, current_thread);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TS_do_release:
|
case TS_do_release:
|
||||||
do_pending(_engine);
|
do_pending(_engine, current_thread);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TS_do_windows:
|
case TS_do_windows:
|
||||||
do_windows(_engine);
|
do_windows(_engine, current_thread);
|
||||||
do_pending(_engine);
|
do_pending(_engine, current_thread);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TS_terminate:
|
case TS_terminate:
|
||||||
do_pending(_engine);
|
do_pending(_engine, current_thread);
|
||||||
do_close(_engine);
|
do_close(_engine, current_thread);
|
||||||
_thread_state = TS_done;
|
_thread_state = TS_done;
|
||||||
_cv_done.signal();
|
_cv_done.signal();
|
||||||
return;
|
return;
|
||||||
|
@ -152,30 +152,32 @@ private:
|
|||||||
|
|
||||||
void set_window_sort(GraphicsOutput *window, int sort);
|
void set_window_sort(GraphicsOutput *window, int sort);
|
||||||
|
|
||||||
void cull_and_draw_together(const Windows &wlist);
|
void cull_and_draw_together(const Windows &wlist, Thread *current_thread);
|
||||||
void cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr);
|
void cull_and_draw_together(GraphicsOutput *win, DisplayRegion *dr,
|
||||||
|
Thread *current_thread);
|
||||||
|
|
||||||
void cull_to_bins(const Windows &wlist);
|
void cull_to_bins(const Windows &wlist, Thread *current_thread);
|
||||||
void cull_to_bins(GraphicsOutput *win, DisplayRegion *dr);
|
void cull_to_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread);
|
||||||
void draw_bins(const Windows &wlist);
|
void draw_bins(const Windows &wlist, Thread *current_thread);
|
||||||
void draw_bins(GraphicsOutput *win, DisplayRegion *dr);
|
void draw_bins(GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread);
|
||||||
void make_contexts(const Windows &wlist);
|
void make_contexts(const Windows &wlist, Thread *current_thread);
|
||||||
|
|
||||||
void process_events(const Windows &wlist);
|
void process_events(const Windows &wlist, Thread *current_thread);
|
||||||
void flip_windows(const Windows &wlist);
|
void flip_windows(const Windows &wlist, Thread *current_thread);
|
||||||
void do_sync_frame();
|
void do_sync_frame(Thread *current_thread);
|
||||||
void do_flip_frame();
|
void do_flip_frame(Thread *current_thread);
|
||||||
INLINE void close_gsg(GraphicsPipe *pipe, GraphicsStateGuardian *gsg);
|
INLINE void close_gsg(GraphicsPipe *pipe, GraphicsStateGuardian *gsg);
|
||||||
|
|
||||||
PT(SceneSetup) setup_scene(GraphicsStateGuardian *gsg, DisplayRegion *dr);
|
PT(SceneSetup) setup_scene(GraphicsStateGuardian *gsg,
|
||||||
|
DisplayRegionPipelineReader *dr);
|
||||||
void do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
|
void do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
|
||||||
GraphicsStateGuardian *gsg);
|
GraphicsStateGuardian *gsg, Thread *current_thread);
|
||||||
void do_draw(CullResult *cull_result, SceneSetup *scene_setup,
|
void do_draw(CullResult *cull_result, SceneSetup *scene_setup,
|
||||||
GraphicsOutput *win, DisplayRegion *dr);
|
GraphicsOutput *win, DisplayRegion *dr, Thread *current_thread);
|
||||||
|
|
||||||
void do_add_window(GraphicsOutput *window, GraphicsStateGuardian *gsg,
|
void do_add_window(GraphicsOutput *window, GraphicsStateGuardian *gsg,
|
||||||
const GraphicsThreadingModel &threading_model);
|
const GraphicsThreadingModel &threading_model);
|
||||||
void do_remove_window(GraphicsOutput *window);
|
void do_remove_window(GraphicsOutput *window, Thread *current_thread);
|
||||||
void do_resort_windows();
|
void do_resort_windows();
|
||||||
void terminate_threads();
|
void terminate_threads();
|
||||||
|
|
||||||
@ -275,12 +277,12 @@ private:
|
|||||||
void add_window(Windows &wlist, GraphicsOutput *window);
|
void add_window(Windows &wlist, GraphicsOutput *window);
|
||||||
void remove_window(GraphicsOutput *window);
|
void remove_window(GraphicsOutput *window);
|
||||||
void resort_windows();
|
void resort_windows();
|
||||||
void do_frame(GraphicsEngine *engine);
|
void do_frame(GraphicsEngine *engine, Thread *current_thread);
|
||||||
void do_windows(GraphicsEngine *engine);
|
void do_windows(GraphicsEngine *engine, Thread *current_thread);
|
||||||
void do_flip(GraphicsEngine *engine);
|
void do_flip(GraphicsEngine *engine, Thread *current_thread);
|
||||||
void do_release(GraphicsEngine *engine);
|
void do_release(GraphicsEngine *engine, Thread *current_thread);
|
||||||
void do_close(GraphicsEngine *engine);
|
void do_close(GraphicsEngine *engine, Thread *current_thread);
|
||||||
void do_pending(GraphicsEngine *engine);
|
void do_pending(GraphicsEngine *engine, Thread *current_thread);
|
||||||
bool any_done_gsgs() const;
|
bool any_done_gsgs() const;
|
||||||
|
|
||||||
bool add_callback(CallbackTime callback_time, const Callback &callback);
|
bool add_callback(CallbackTime callback_time, const Callback &callback);
|
||||||
|
@ -971,7 +971,7 @@ prepare_for_deletion() {
|
|||||||
// This function is called only within the draw thread.
|
// This function is called only within the draw thread.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsOutput::
|
void GraphicsOutput::
|
||||||
clear() {
|
clear(Thread *current_thread) {
|
||||||
if (is_any_clear_active()) {
|
if (is_any_clear_active()) {
|
||||||
if (display_cat.is_spam()) {
|
if (display_cat.is_spam()) {
|
||||||
display_cat.spam()
|
display_cat.spam()
|
||||||
@ -981,7 +981,8 @@ clear() {
|
|||||||
|
|
||||||
nassertv(_gsg != (GraphicsStateGuardian *)NULL);
|
nassertv(_gsg != (GraphicsStateGuardian *)NULL);
|
||||||
|
|
||||||
_gsg->prepare_display_region(_default_display_region, Lens::SC_mono);
|
DisplayRegionPipelineReader dr_reader(_default_display_region, current_thread);
|
||||||
|
_gsg->prepare_display_region(&dr_reader, Lens::SC_mono);
|
||||||
_gsg->clear(this);
|
_gsg->clear(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1049,14 +1050,14 @@ copy_to_textures() {
|
|||||||
// of a cube map.
|
// of a cube map.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsOutput::
|
void GraphicsOutput::
|
||||||
change_scenes(DisplayRegion *new_dr) {
|
change_scenes(DisplayRegionPipelineReader *new_dr) {
|
||||||
int new_cube_map_index = new_dr->get_cube_map_index();
|
int new_cube_map_index = new_dr->get_cube_map_index();
|
||||||
if (new_cube_map_index != -1 &&
|
if (new_cube_map_index != -1 &&
|
||||||
new_cube_map_index != _cube_map_index) {
|
new_cube_map_index != _cube_map_index) {
|
||||||
int old_cube_map_index = _cube_map_index;
|
int old_cube_map_index = _cube_map_index;
|
||||||
DisplayRegion *old_cube_map_dr = _cube_map_dr;
|
DisplayRegion *old_cube_map_dr = _cube_map_dr;
|
||||||
_cube_map_index = new_cube_map_index;
|
_cube_map_index = new_cube_map_index;
|
||||||
_cube_map_dr = new_dr;
|
_cube_map_dr = new_dr->get_object();
|
||||||
|
|
||||||
for (int i=0; i<count_textures(); i++) {
|
for (int i=0; i<count_textures(); i++) {
|
||||||
Texture *texture = get_texture(i);
|
Texture *texture = get_texture(i);
|
||||||
|
@ -208,7 +208,7 @@ public:
|
|||||||
// It is an error to call any of the following methods from any
|
// It is an error to call any of the following methods from any
|
||||||
// thread other than the draw thread. These methods are normally
|
// thread other than the draw thread. These methods are normally
|
||||||
// called by the GraphicsEngine.
|
// called by the GraphicsEngine.
|
||||||
void clear();
|
void clear(Thread *current_thread);
|
||||||
virtual bool begin_frame(FrameMode mode);
|
virtual bool begin_frame(FrameMode mode);
|
||||||
virtual void end_frame(FrameMode mode);
|
virtual void end_frame(FrameMode mode);
|
||||||
|
|
||||||
@ -221,7 +221,7 @@ public:
|
|||||||
// virtual void make_current();
|
// virtual void make_current();
|
||||||
// virtual void auto_resize();
|
// virtual void auto_resize();
|
||||||
|
|
||||||
void change_scenes(DisplayRegion *new_dr);
|
void change_scenes(DisplayRegionPipelineReader *new_dr);
|
||||||
virtual void select_cube_map(int cube_map_index);
|
virtual void select_cube_map(int cube_map_index);
|
||||||
|
|
||||||
// These methods will be called within the app (main) thread.
|
// These methods will be called within the app (main) thread.
|
||||||
|
@ -956,8 +956,9 @@ fetch_specified_part(ShaderContext::ShaderMatInput part, InternalName *name, LMa
|
|||||||
// case, it is Lens::SC_mono.
|
// case, it is Lens::SC_mono.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void GraphicsStateGuardian::
|
void GraphicsStateGuardian::
|
||||||
prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel) {
|
prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
_current_display_region = dr;
|
Lens::StereoChannel stereo_channel) {
|
||||||
|
_current_display_region = dr->get_object();
|
||||||
_current_stereo_channel = stereo_channel;
|
_current_stereo_channel = stereo_channel;
|
||||||
|
|
||||||
_stereo_buffer_mask = ~0;
|
_stereo_buffer_mask = ~0;
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "graphicsThreadingModel.h"
|
#include "graphicsThreadingModel.h"
|
||||||
#include "graphicsPipe.h"
|
#include "graphicsPipe.h"
|
||||||
#include "sceneSetup.h"
|
#include "sceneSetup.h"
|
||||||
|
#include "displayRegion.h"
|
||||||
#include "luse.h"
|
#include "luse.h"
|
||||||
#include "coordinateSystem.h"
|
#include "coordinateSystem.h"
|
||||||
#include "factory.h"
|
#include "factory.h"
|
||||||
@ -174,7 +175,7 @@ public:
|
|||||||
const LMatrix4f *fetch_specified_value(ShaderContext::ShaderMatSpec &spec, bool altered);
|
const LMatrix4f *fetch_specified_value(ShaderContext::ShaderMatSpec &spec, bool altered);
|
||||||
const LMatrix4f *fetch_specified_part(ShaderContext::ShaderMatInput input, InternalName *name, LMatrix4f &t);
|
const LMatrix4f *fetch_specified_part(ShaderContext::ShaderMatInput input, InternalName *name, LMatrix4f &t);
|
||||||
|
|
||||||
virtual void prepare_display_region(DisplayRegion *dr,
|
virtual void prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
Lens::StereoChannel stereo_channel);
|
Lens::StereoChannel stereo_channel);
|
||||||
|
|
||||||
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
||||||
|
@ -556,12 +556,13 @@ do_clear(const RenderBuffer &buffer) {
|
|||||||
// scissor region and viewport)
|
// scissor region and viewport)
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void DXGraphicsStateGuardian8::
|
void DXGraphicsStateGuardian8::
|
||||||
prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel) {
|
prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
nassertv(dr != (DisplayRegion *)NULL);
|
Lens::StereoChannel stereo_channel) {
|
||||||
|
nassertv(dr != (DisplayRegionPipelineReader *)NULL);
|
||||||
GraphicsStateGuardian::prepare_display_region(dr, stereo_channel);
|
GraphicsStateGuardian::prepare_display_region(dr, stereo_channel);
|
||||||
|
|
||||||
int l, u, w, h;
|
int l, u, w, h;
|
||||||
_current_display_region->get_region_pixels_i(l, u, w, h);
|
dr->get_region_pixels_i(l, u, w, h);
|
||||||
|
|
||||||
// Create the viewport
|
// Create the viewport
|
||||||
D3DVIEWPORT8 vp = { l, u, w, h, 0.0f, 1.0f };
|
D3DVIEWPORT8 vp = { l, u, w, h, 0.0f, 1.0f };
|
||||||
|
@ -66,7 +66,8 @@ public:
|
|||||||
|
|
||||||
virtual void do_clear(const RenderBuffer &buffer);
|
virtual void do_clear(const RenderBuffer &buffer);
|
||||||
|
|
||||||
virtual void prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel);
|
virtual void prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
|
Lens::StereoChannel stereo_channel);
|
||||||
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
||||||
virtual bool prepare_lens();
|
virtual bool prepare_lens();
|
||||||
|
|
||||||
|
@ -772,8 +772,9 @@ do_clear(const RenderBuffer &buffer) {
|
|||||||
// scissor region and viewport)
|
// scissor region and viewport)
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void DXGraphicsStateGuardian9::
|
void DXGraphicsStateGuardian9::
|
||||||
prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel) {
|
prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
nassertv(dr != (DisplayRegion *)NULL);
|
Lens::StereoChannel stereo_channel) {
|
||||||
|
nassertv(dr != (DisplayRegionPipelineReader *)NULL);
|
||||||
GraphicsStateGuardian::prepare_display_region(dr, stereo_channel);
|
GraphicsStateGuardian::prepare_display_region(dr, stereo_channel);
|
||||||
|
|
||||||
// DBG_S dxgsg9_cat.debug ( ) << "DXGraphicsStateGuardian9::PRE prepare_display_region\n"; DBG_E
|
// DBG_S dxgsg9_cat.debug ( ) << "DXGraphicsStateGuardian9::PRE prepare_display_region\n"; DBG_E
|
||||||
@ -781,7 +782,7 @@ prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel) {
|
|||||||
// DBG_S dxgsg9_cat.debug ( ) << "DXGraphicsStateGuardian9::prepare_display_region\n"; DBG_E
|
// DBG_S dxgsg9_cat.debug ( ) << "DXGraphicsStateGuardian9::prepare_display_region\n"; DBG_E
|
||||||
|
|
||||||
int l, u, w, h;
|
int l, u, w, h;
|
||||||
_current_display_region->get_region_pixels_i(l, u, w, h);
|
dr->get_region_pixels_i(l, u, w, h);
|
||||||
|
|
||||||
DBG_S dxgsg9_cat.debug ( ) << "display_region " << l << " " << u << " " << w << " " << h << "\n"; DBG_E
|
DBG_S dxgsg9_cat.debug ( ) << "display_region " << l << " " << u << " " << w << " " << h << "\n"; DBG_E
|
||||||
|
|
||||||
|
@ -102,7 +102,8 @@ public:
|
|||||||
|
|
||||||
virtual void do_clear(const RenderBuffer &buffer);
|
virtual void do_clear(const RenderBuffer &buffer);
|
||||||
|
|
||||||
virtual void prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel);
|
virtual void prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
|
Lens::StereoChannel stereo_channel);
|
||||||
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
||||||
virtual bool prepare_lens();
|
virtual bool prepare_lens();
|
||||||
|
|
||||||
|
@ -1146,12 +1146,13 @@ do_clear(const RenderBuffer &buffer) {
|
|||||||
// scissor region and viewport)
|
// scissor region and viewport)
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CLP(GraphicsStateGuardian)::
|
void CLP(GraphicsStateGuardian)::
|
||||||
prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel) {
|
prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
nassertv(dr != (DisplayRegion *)NULL);
|
Lens::StereoChannel stereo_channel) {
|
||||||
|
nassertv(dr != (DisplayRegionPipelineReader *)NULL);
|
||||||
GraphicsStateGuardian::prepare_display_region(dr, stereo_channel);
|
GraphicsStateGuardian::prepare_display_region(dr, stereo_channel);
|
||||||
|
|
||||||
int l, b, w, h;
|
int l, b, w, h;
|
||||||
_current_display_region->get_region_pixels(l, b, w, h);
|
dr->get_region_pixels(l, b, w, h);
|
||||||
_viewport_width = w;
|
_viewport_width = w;
|
||||||
_viewport_height = h;
|
_viewport_height = h;
|
||||||
GLint x = GLint(l);
|
GLint x = GLint(l);
|
||||||
@ -1159,7 +1160,7 @@ prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel) {
|
|||||||
GLsizei width = GLsizei(w);
|
GLsizei width = GLsizei(w);
|
||||||
GLsizei height = GLsizei(h);
|
GLsizei height = GLsizei(h);
|
||||||
|
|
||||||
set_draw_buffer(get_render_buffer(_current_display_region->get_draw_buffer_type(),
|
set_draw_buffer(get_render_buffer(dr->get_object()->get_draw_buffer_type(),
|
||||||
*_current_properties));
|
*_current_properties));
|
||||||
enable_scissor(true);
|
enable_scissor(true);
|
||||||
GLP(Scissor)(x, y, width, height);
|
GLP(Scissor)(x, y, width, height);
|
||||||
|
@ -95,7 +95,8 @@ public:
|
|||||||
|
|
||||||
virtual void do_clear(const RenderBuffer &buffer);
|
virtual void do_clear(const RenderBuffer &buffer);
|
||||||
|
|
||||||
virtual void prepare_display_region(DisplayRegion *dr, Lens::StereoChannel stereo_channel);
|
virtual void prepare_display_region(DisplayRegionPipelineReader *dr,
|
||||||
|
Lens::StereoChannel stereo_channel);
|
||||||
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
virtual CPT(TransformState) calc_projection_mat(const Lens *lens);
|
||||||
virtual bool prepare_lens();
|
virtual bool prepare_lens();
|
||||||
|
|
||||||
|
@ -930,8 +930,7 @@ prepare_now(PreparedGraphicsObjects *prepared_objects,
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void Geom::
|
void Geom::
|
||||||
draw(GraphicsStateGuardianBase *gsg, const GeomMunger *munger,
|
draw(GraphicsStateGuardianBase *gsg, const GeomMunger *munger,
|
||||||
const GeomVertexData *vertex_data) const {
|
const GeomVertexData *vertex_data, Thread *current_thread) const {
|
||||||
Thread *current_thread = Thread::get_current_thread();
|
|
||||||
GeomPipelineReader geom_reader(this, current_thread);
|
GeomPipelineReader geom_reader(this, current_thread);
|
||||||
geom_reader.check_usage_hint();
|
geom_reader.check_usage_hint();
|
||||||
|
|
||||||
|
@ -126,7 +126,8 @@ public:
|
|||||||
|
|
||||||
void draw(GraphicsStateGuardianBase *gsg,
|
void draw(GraphicsStateGuardianBase *gsg,
|
||||||
const GeomMunger *munger,
|
const GeomMunger *munger,
|
||||||
const GeomVertexData *vertex_data) const;
|
const GeomVertexData *vertex_data,
|
||||||
|
Thread *current_thread) const;
|
||||||
|
|
||||||
INLINE void calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point,
|
INLINE void calc_tight_bounds(LPoint3f &min_point, LPoint3f &max_point,
|
||||||
bool &found_any,
|
bool &found_any,
|
||||||
|
@ -74,16 +74,6 @@ void CullBin::
|
|||||||
finish_cull(SceneSetup *) {
|
finish_cull(SceneSetup *) {
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
// Function: CullBin::draw
|
|
||||||
// Access: Public, Virtual
|
|
||||||
// Description: Draws all the geoms in the bin, in the appropriate
|
|
||||||
// order.
|
|
||||||
////////////////////////////////////////////////////////////////////
|
|
||||||
void CullBin::
|
|
||||||
draw() {
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CullBin::check_flash_color
|
// Function: CullBin::check_flash_color
|
||||||
// Access: Private
|
// Access: Private
|
||||||
|
@ -57,7 +57,7 @@ public:
|
|||||||
virtual void add_object(CullableObject *object)=0;
|
virtual void add_object(CullableObject *object)=0;
|
||||||
virtual void finish_cull(SceneSetup *scene_setup);
|
virtual void finish_cull(SceneSetup *scene_setup);
|
||||||
|
|
||||||
virtual void draw()=0;
|
virtual void draw(Thread *current_thread)=0;
|
||||||
|
|
||||||
INLINE bool has_flash_color() const;
|
INLINE bool has_flash_color() const;
|
||||||
INLINE const Colorf &get_flash_color() const;
|
INLINE const Colorf &get_flash_color() const;
|
||||||
|
@ -25,11 +25,12 @@
|
|||||||
// the object.
|
// the object.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
INLINE void CullHandler::
|
INLINE void CullHandler::
|
||||||
draw(CullableObject *object, GraphicsStateGuardianBase *gsg) {
|
draw(CullableObject *object, GraphicsStateGuardianBase *gsg,
|
||||||
|
Thread *current_thread) {
|
||||||
if (object->_next != (CullableObject *)NULL) {
|
if (object->_next != (CullableObject *)NULL) {
|
||||||
draw_with_decals(object, gsg);
|
draw_with_decals(object, gsg, current_thread);
|
||||||
} else {
|
} else {
|
||||||
gsg->set_state_and_transform(object->_state, object->_internal_transform);
|
gsg->set_state_and_transform(object->_state, object->_internal_transform);
|
||||||
object->draw(gsg);
|
object->draw(gsg, current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,8 @@ record_object(CullableObject *object, const CullTraverser *traverser) {
|
|||||||
// attached decals.
|
// attached decals.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullHandler::
|
void CullHandler::
|
||||||
draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) {
|
draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg,
|
||||||
|
Thread *current_thread) {
|
||||||
// We draw with a three-step process.
|
// We draw with a three-step process.
|
||||||
|
|
||||||
// First, render all of the base geometry for the first pass.
|
// First, render all of the base geometry for the first pass.
|
||||||
@ -66,7 +67,7 @@ draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) {
|
|||||||
CullableObject *base = object;
|
CullableObject *base = object;
|
||||||
while (base != (CullableObject *)NULL && base->_geom != (Geom *)NULL) {
|
while (base != (CullableObject *)NULL && base->_geom != (Geom *)NULL) {
|
||||||
gsg->set_state_and_transform(base->_state->compose(state), base->_internal_transform);
|
gsg->set_state_and_transform(base->_state->compose(state), base->_internal_transform);
|
||||||
base->draw(gsg);
|
base->draw(gsg, current_thread);
|
||||||
|
|
||||||
base = base->_next;
|
base = base->_next;
|
||||||
}
|
}
|
||||||
@ -78,7 +79,7 @@ draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) {
|
|||||||
CullableObject *decal = base->_next;
|
CullableObject *decal = base->_next;
|
||||||
while (decal != (CullableObject *)NULL) {
|
while (decal != (CullableObject *)NULL) {
|
||||||
gsg->set_state_and_transform(decal->_state->compose(state), decal->_internal_transform);
|
gsg->set_state_and_transform(decal->_state->compose(state), decal->_internal_transform);
|
||||||
decal->draw(gsg);
|
decal->draw(gsg, current_thread);
|
||||||
decal = decal->_next;
|
decal = decal->_next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,7 +90,7 @@ draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) {
|
|||||||
base = object;
|
base = object;
|
||||||
while (base != (CullableObject *)NULL && base->_geom != (Geom *)NULL) {
|
while (base != (CullableObject *)NULL && base->_geom != (Geom *)NULL) {
|
||||||
gsg->set_state_and_transform(base->_state->compose(state), base->_internal_transform);
|
gsg->set_state_and_transform(base->_state->compose(state), base->_internal_transform);
|
||||||
base->draw(gsg);
|
base->draw(gsg, current_thread);
|
||||||
|
|
||||||
base = base->_next;
|
base = base->_next;
|
||||||
}
|
}
|
||||||
|
@ -40,9 +40,11 @@ public:
|
|||||||
const CullTraverser *traverser);
|
const CullTraverser *traverser);
|
||||||
|
|
||||||
INLINE static void draw(CullableObject *object,
|
INLINE static void draw(CullableObject *object,
|
||||||
GraphicsStateGuardianBase *gsg);
|
GraphicsStateGuardianBase *gsg,
|
||||||
|
Thread *current_thread);
|
||||||
static void draw_with_decals(CullableObject *object,
|
static void draw_with_decals(CullableObject *object,
|
||||||
GraphicsStateGuardianBase *gsg);
|
GraphicsStateGuardianBase *gsg,
|
||||||
|
Thread *current_thread);
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "cullHandler.I"
|
#include "cullHandler.I"
|
||||||
|
@ -248,7 +248,7 @@ finish_cull(SceneSetup *scene_setup) {
|
|||||||
// order.
|
// order.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullResult::
|
void CullResult::
|
||||||
draw() {
|
draw(Thread *current_thread) {
|
||||||
// Ask the bin manager for the correct order to draw all the bins.
|
// Ask the bin manager for the correct order to draw all the bins.
|
||||||
CullBinManager *bin_manager = CullBinManager::get_global_ptr();
|
CullBinManager *bin_manager = CullBinManager::get_global_ptr();
|
||||||
int num_bins = bin_manager->get_num_bins();
|
int num_bins = bin_manager->get_num_bins();
|
||||||
@ -257,7 +257,7 @@ draw() {
|
|||||||
nassertv(bin_index >= 0);
|
nassertv(bin_index >= 0);
|
||||||
|
|
||||||
if (bin_index < (int)_bins.size() && _bins[bin_index] != (CullBin *)NULL) {
|
if (bin_index < (int)_bins.size() && _bins[bin_index] != (CullBin *)NULL) {
|
||||||
_bins[bin_index]->draw();
|
_bins[bin_index]->draw(current_thread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ public:
|
|||||||
|
|
||||||
void add_object(CullableObject *object, const CullTraverser *traverser);
|
void add_object(CullableObject *object, const CullTraverser *traverser);
|
||||||
void finish_cull(SceneSetup *scene_setup);
|
void finish_cull(SceneSetup *scene_setup);
|
||||||
void draw();
|
void draw(Thread *current_thread);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void bin_removed(int bin_index);
|
static void bin_removed(int bin_index);
|
||||||
|
@ -121,8 +121,8 @@ has_decals() const {
|
|||||||
// from the draw thread.
|
// from the draw thread.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
INLINE void CullableObject::
|
INLINE void CullableObject::
|
||||||
draw(GraphicsStateGuardianBase *gsg) {
|
draw(GraphicsStateGuardianBase *gsg, Thread *current_thread) {
|
||||||
_geom->draw(gsg, _munger, _munged_data);
|
_geom->draw(gsg, _munger, _munged_data, current_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
@ -63,7 +63,8 @@ public:
|
|||||||
|
|
||||||
void munge_geom(GraphicsStateGuardianBase *gsg,
|
void munge_geom(GraphicsStateGuardianBase *gsg,
|
||||||
GeomMunger *munger, const CullTraverser *traverser);
|
GeomMunger *munger, const CullTraverser *traverser);
|
||||||
INLINE void draw(GraphicsStateGuardianBase *gsg);
|
INLINE void draw(GraphicsStateGuardianBase *gsg,
|
||||||
|
Thread *current_thread);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~CullableObject();
|
~CullableObject();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user