*** empty log message ***

This commit is contained in:
David Rose 2001-05-11 04:36:02 +00:00
parent c275aa7e17
commit 91cd7c0339
4 changed files with 118 additions and 61 deletions

View File

@ -89,27 +89,43 @@ update_internals(PartGroup *parent, bool self_changed, bool) {
net_changed = true;
}
if (net_changed) {
if (net_changed && !_net_transform_arcs.empty()) {
PT(TransformTransition) t = new TransformTransition(_net_transform);
ArcList::const_iterator ai;
for (ai = _net_transform_arcs.begin();
ai != _net_transform_arcs.end();
++ai) {
ArcList::iterator ai;
ai = _net_transform_arcs.begin();
while (ai != _net_transform_arcs.end()) {
NodeRelation *arc = *ai;
arc->set_transition(t);
if (arc->is_attached()) {
arc->set_transition(t);
++ai;
} else {
// The arc is now invalid; its geometry must have been
// removed. Remove the arc from our set.
ArcList::iterator invalid = ai;
++ai;
_net_transform_arcs.erase(invalid);
}
}
}
if (self_changed) {
if (self_changed && !_local_transform_arcs.empty()) {
PT(TransformTransition) t = new TransformTransition(_value);
ArcList::const_iterator ai;
for (ai = _local_transform_arcs.begin();
ai != _local_transform_arcs.end();
++ai) {
ArcList::iterator ai;
ai = _local_transform_arcs.begin();
while (ai != _local_transform_arcs.end()) {
NodeRelation *arc = *ai;
arc->set_transition(t);
if (arc->is_attached()) {
arc->set_transition(t);
++ai;
} else {
// The arc is now invalid; its geometry must have been
// removed. Remove the arc from our set.
ArcList::iterator invalid = ai;
++ai;
_local_transform_arcs.erase(invalid);
}
}
}
}
@ -229,11 +245,39 @@ write_datagram(BamWriter *manager, Datagram &me)
{
ArcList::iterator ai;
// First, make sure all of our arcs are still valid, before we try
// to write them out. Remove any invalid arcs.
ai = _net_transform_arcs.begin();
while (ai != _net_transform_arcs.end()) {
NodeRelation *arc = *ai;
if (arc->is_attached()) {
++ai;
} else {
// The arc is now invalid; its geometry must have been
// removed. Remove the arc from our set.
ArcList::iterator invalid = ai;
++ai;
_net_transform_arcs.erase(invalid);
}
}
ai = _local_transform_arcs.begin();
while (ai != _local_transform_arcs.end()) {
NodeRelation *arc = *ai;
if (arc->is_attached()) {
++ai;
} else {
// The arc is now invalid; its geometry must have been
// removed. Remove the arc from our set.
ArcList::iterator invalid = ai;
++ai;
_local_transform_arcs.erase(invalid);
}
}
MovingPartMatrix::write_datagram(manager, me);
me.add_uint16(_net_transform_arcs.size());
for(ai = _net_transform_arcs.begin(); ai != _net_transform_arcs.end(); ai++)
{
for(ai = _net_transform_arcs.begin(); ai != _net_transform_arcs.end(); ai++) {
manager->write_pointer(me, (*ai));
}

View File

@ -491,31 +491,27 @@ render_frame(const AllAttributesWrapper &initial_state) {
if (_win->is_channel_defined(c)) {
GraphicsChannel *chan = _win->get_channel(c);
if (chan->is_active()) {
int num_layers = chan->get_num_layers();
for (int l = 0; l < num_layers; l++) {
GraphicsLayer *layer = chan->get_layer(l);
if (layer->is_active()) {
int num_drs = layer->get_num_drs();
for (int d = 0; d < num_drs; d++) {
DisplayRegion *dr = layer->get_dr(d);
if (dr == (DisplayRegion*)NULL)
{
cerr << "null camera layer " << endl;
exit(0);
}
Camera *cam = dr->get_camera();
// For each display region, render from the camera's view.
if (dr->is_active() && cam != (Camera *)NULL &&
cam->is_active() && cam->get_scene() != (Node *)NULL) {
DisplayRegionStack old_dr = push_display_region(dr);
prepare_display_region();
render_scene(cam->get_scene(), cam, initial_state);
pop_display_region(old_dr);
}
}
}
}
int num_layers = chan->get_num_layers();
for (int l = 0; l < num_layers; l++) {
GraphicsLayer *layer = chan->get_layer(l);
if (layer->is_active()) {
int num_drs = layer->get_num_drs();
for (int d = 0; d < num_drs; d++) {
DisplayRegion *dr = layer->get_dr(d);
nassertv(dr != (DisplayRegion *)NULL);
Camera *cam = dr->get_camera();
// For each display region, render from the camera's view.
if (dr->is_active() && cam != (Camera *)NULL &&
cam->is_active() && cam->get_scene() != (Node *)NULL) {
DisplayRegionStack old_dr = push_display_region(dr);
prepare_display_region();
render_scene(cam->get_scene(), cam, initial_state);
pop_display_region(old_dr);
}
}
}
}
}
}
}
@ -523,28 +519,28 @@ render_frame(const AllAttributesWrapper &initial_state) {
// Now we're done with the frame processing. Clean up.
if(_lighting_enabled) {
// Let's turn off all the lights we had on, and clear the light
// cache--to force the lights to be reissued next frame, in case
// their parameters or positions have changed between frames.
for (int i = 0; i < _max_lights; i++) {
if (_light_enabled[i]) {
enable_light(i, false);
}
_available_light_ids[i] = NULL;
}
// Also force the lighting state to unlit, so that issue_light()
// will be guaranteed to be called next frame even if we have the
// same set of light pointers we had this frame.
NodeAttributes state;
state.set_attribute(LightTransition::get_class_type(), new LightAttribute);
set_state(state, false);
// All this work to undo the lighting state each frame doesn't seem
// ideal--there may be a better way. Maybe if the lights were just
// more aware of whether their parameters or positions have changed
// at all?
// Let's turn off all the lights we had on, and clear the light
// cache--to force the lights to be reissued next frame, in case
// their parameters or positions have changed between frames.
for (int i = 0; i < _max_lights; i++) {
if (_light_enabled[i]) {
enable_light(i, false);
}
_available_light_ids[i] = NULL;
}
// Also force the lighting state to unlit, so that issue_light()
// will be guaranteed to be called next frame even if we have the
// same set of light pointers we had this frame.
NodeAttributes state;
state.set_attribute(LightTransition::get_class_type(), new LightAttribute);
set_state(state, false);
// All this work to undo the lighting state each frame doesn't seem
// ideal--there may be a better way. Maybe if the lights were just
// more aware of whether their parameters or positions have changed
// at all?
}
#ifndef NDEBUG

View File

@ -81,6 +81,21 @@ get_graph_type() const {
return _graph_type;
}
////////////////////////////////////////////////////////////////////
// Function: NodeRelation::is_attached
// Access: Public
// Description: Returns true if this arc is attached to the scene
// graph, false otherwise. Normally, an arc should
// always be attached; generally you will only see an
// unattached arc if the arc (or some parent of the arc)
// has been disconnected from all nodes via
// remove_arc().
////////////////////////////////////////////////////////////////////
INLINE_GRAPH bool NodeRelation::
is_attached() const {
return _attached;
}
////////////////////////////////////////////////////////////////////
// Function: NodeRelation::change_parent
// Access: Public

View File

@ -80,6 +80,8 @@ PUBLISHED:
INLINE_GRAPH int get_sort() const;
INLINE_GRAPH TypeHandle get_graph_type() const;
INLINE_GRAPH bool is_attached() const;
void ref_parent();
void unref_parent();