mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
fix billboards, lod's, etc.
This commit is contained in:
parent
0d5cfa8e1b
commit
aa29e67c84
@ -224,7 +224,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
Solids::iterator si;
|
Solids::iterator si;
|
||||||
for (si = _solids.begin(); si != _solids.end(); ++si) {
|
for (si = _solids.begin(); si != _solids.end(); ++si) {
|
||||||
CollisionSolid *solid = (*si);
|
CollisionSolid *solid = (*si);
|
||||||
PT(PandaNode) node = solid->get_viz(data, false);
|
PT(PandaNode) node = solid->get_viz(trav, data, false);
|
||||||
if (node != (PandaNode *)NULL) {
|
if (node != (PandaNode *)NULL) {
|
||||||
CullTraverserData next_data(data, node);
|
CullTraverserData next_data(data, node);
|
||||||
|
|
||||||
@ -246,12 +246,12 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
|
|
||||||
for (si = _solids.begin(); si != _solids.end(); ++si) {
|
for (si = _solids.begin(); si != _solids.end(); ++si) {
|
||||||
CollisionSolid *solid = (*si);
|
CollisionSolid *solid = (*si);
|
||||||
PT(PandaNode) node = solid->get_viz(data, false);
|
PT(PandaNode) node = solid->get_viz(trav, data, false);
|
||||||
if (node != (PandaNode *)NULL) {
|
if (node != (PandaNode *)NULL) {
|
||||||
CullTraverserData next_data(data, node);
|
CullTraverserData next_data(data, node);
|
||||||
|
|
||||||
next_data._net_transform =
|
next_data._modelview_transform =
|
||||||
next_data._net_transform->compose(transform);
|
next_data._modelview_transform->compose(transform);
|
||||||
next_data._state = get_last_pos_state();
|
next_data._state = get_last_pos_state();
|
||||||
trav->traverse(next_data);
|
trav->traverse(next_data);
|
||||||
}
|
}
|
||||||
|
@ -278,13 +278,14 @@ get_collision_origin() const {
|
|||||||
// made visible.
|
// made visible.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
PT(PandaNode) CollisionPolygon::
|
PT(PandaNode) CollisionPolygon::
|
||||||
get_viz(const CullTraverserData &data, bool bounds_only) const {
|
get_viz(const CullTraverser *trav, const CullTraverserData &data,
|
||||||
|
bool bounds_only) const {
|
||||||
const RenderAttrib *cpa_attrib =
|
const RenderAttrib *cpa_attrib =
|
||||||
data._state->get_attrib(ClipPlaneAttrib::get_class_type());
|
data._state->get_attrib(ClipPlaneAttrib::get_class_type());
|
||||||
if (cpa_attrib == (const RenderAttrib *)NULL) {
|
if (cpa_attrib == (const RenderAttrib *)NULL) {
|
||||||
// Fortunately, the polygon is not clipped. This is the normal,
|
// Fortunately, the polygon is not clipped. This is the normal,
|
||||||
// easy case.
|
// easy case.
|
||||||
return CollisionSolid::get_viz(data, bounds_only);
|
return CollisionSolid::get_viz(trav, data, bounds_only);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collide_cat.is_debug()) {
|
if (collide_cat.is_debug()) {
|
||||||
@ -300,10 +301,10 @@ get_viz(const CullTraverserData &data, bool bounds_only) const {
|
|||||||
// work.
|
// work.
|
||||||
const ClipPlaneAttrib *cpa = DCAST(ClipPlaneAttrib, cpa_attrib);
|
const ClipPlaneAttrib *cpa = DCAST(ClipPlaneAttrib, cpa_attrib);
|
||||||
Points new_points;
|
Points new_points;
|
||||||
if (apply_clip_plane(new_points, cpa, data._net_transform)) {
|
if (apply_clip_plane(new_points, cpa, data.get_net_transform(trav))) {
|
||||||
// All points are behind the clip plane; just draw the original
|
// All points are behind the clip plane; just draw the original
|
||||||
// polygon.
|
// polygon.
|
||||||
return CollisionSolid::get_viz(data, bounds_only);
|
return CollisionSolid::get_viz(trav, data, bounds_only);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_points.empty()) {
|
if (new_points.empty()) {
|
||||||
@ -845,11 +846,11 @@ draw_polygon(GeomNode *viz_geom_node, GeomNode *bounds_viz_geom_node,
|
|||||||
geom2->set_vertex_data(vdata);
|
geom2->set_vertex_data(vdata);
|
||||||
geom2->add_primitive(border);
|
geom2->add_primitive(border);
|
||||||
|
|
||||||
_viz_geom->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_viz_state());
|
viz_geom_node->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_viz_state());
|
||||||
_viz_geom->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_viz_state());
|
viz_geom_node->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_viz_state());
|
||||||
|
|
||||||
_bounds_viz_geom->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_bounds_viz_state());
|
bounds_viz_geom_node->add_geom(geom1, ((CollisionPolygon *)this)->get_solid_bounds_viz_state());
|
||||||
_bounds_viz_geom->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_bounds_viz_state());
|
bounds_viz_geom_node->add_geom(geom2, ((CollisionPolygon *)this)->get_wireframe_bounds_viz_state());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
PTA_Vertexf verts;
|
PTA_Vertexf verts;
|
||||||
|
@ -61,7 +61,8 @@ public:
|
|||||||
virtual void xform(const LMatrix4f &mat);
|
virtual void xform(const LMatrix4f &mat);
|
||||||
virtual LPoint3f get_collision_origin() const;
|
virtual LPoint3f get_collision_origin() const;
|
||||||
|
|
||||||
virtual PT(PandaNode) get_viz(const CullTraverserData &data,
|
virtual PT(PandaNode) get_viz(const CullTraverser *trav,
|
||||||
|
const CullTraverserData &data,
|
||||||
bool bounds_only) const;
|
bool bounds_only) const;
|
||||||
|
|
||||||
virtual void output(ostream &out) const;
|
virtual void output(ostream &out) const;
|
||||||
|
@ -108,7 +108,7 @@ xform(const LMatrix4f &mat) {
|
|||||||
// made visible.
|
// made visible.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
PT(PandaNode) CollisionSolid::
|
PT(PandaNode) CollisionSolid::
|
||||||
get_viz(const CullTraverserData &, bool bounds_only) const {
|
get_viz(const CullTraverser *, const CullTraverserData &, bool bounds_only) const {
|
||||||
if ((_flags & F_viz_geom_stale) != 0) {
|
if ((_flags & F_viz_geom_stale) != 0) {
|
||||||
if (_viz_geom == (GeomNode *)NULL) {
|
if (_viz_geom == (GeomNode *)NULL) {
|
||||||
((CollisionSolid *)this)->_viz_geom = new GeomNode("viz");
|
((CollisionSolid *)this)->_viz_geom = new GeomNode("viz");
|
||||||
|
@ -77,7 +77,8 @@ public:
|
|||||||
|
|
||||||
virtual void xform(const LMatrix4f &mat);
|
virtual void xform(const LMatrix4f &mat);
|
||||||
|
|
||||||
virtual PT(PandaNode) get_viz(const CullTraverserData &data,
|
virtual PT(PandaNode) get_viz(const CullTraverser *trav,
|
||||||
|
const CullTraverserData &data,
|
||||||
bool bounds_only) const;
|
bool bounds_only) const;
|
||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
|
@ -129,7 +129,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
// whatever transforms were above the CollisionVisualizer node; it
|
// whatever transforms were above the CollisionVisualizer node; it
|
||||||
// always renders its objects according to their appropriate net
|
// always renders its objects according to their appropriate net
|
||||||
// transform.
|
// transform.
|
||||||
xform_data._net_transform = TransformState::make_identity();
|
xform_data._modelview_transform = trav->get_world_transform();
|
||||||
xform_data.apply_transform_and_state(trav, net_transform,
|
xform_data.apply_transform_and_state(trav, net_transform,
|
||||||
RenderState::make_empty(),
|
RenderState::make_empty(),
|
||||||
RenderEffects::make_empty());
|
RenderEffects::make_empty());
|
||||||
@ -145,7 +145,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
const CollisionSolid *solid = (*si).first;
|
const CollisionSolid *solid = (*si).first;
|
||||||
const SolidInfo &solid_info = (*si).second;
|
const SolidInfo &solid_info = (*si).second;
|
||||||
bool was_detected = (solid_info._detected_count > 0);
|
bool was_detected = (solid_info._detected_count > 0);
|
||||||
PT(PandaNode) node = solid->get_viz(xform_data, !was_detected);
|
PT(PandaNode) node = solid->get_viz(trav, xform_data, !was_detected);
|
||||||
if (node != (PandaNode *)NULL) {
|
if (node != (PandaNode *)NULL) {
|
||||||
CullTraverserData next_data(xform_data, node);
|
CullTraverserData next_data(xform_data, node);
|
||||||
|
|
||||||
@ -188,7 +188,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CullableObject *object =
|
CullableObject *object =
|
||||||
new CullableObject(sphere, empty_state, xform_data._net_transform);
|
new CullableObject(sphere, empty_state, xform_data._modelview_transform);
|
||||||
|
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
}
|
}
|
||||||
@ -206,7 +206,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
line->set_num_prims(1);
|
line->set_num_prims(1);
|
||||||
|
|
||||||
CullableObject *object =
|
CullableObject *object =
|
||||||
new CullableObject(line, empty_state, xform_data._net_transform);
|
new CullableObject(line, empty_state, xform_data._modelview_transform);
|
||||||
|
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
}
|
}
|
||||||
|
@ -361,7 +361,7 @@ render_thread(CullTraverser *trav, CullTraverserData &data,
|
|||||||
CPT(RenderState) state = data._state->add_attrib(thick);
|
CPT(RenderState) state = data._state->add_attrib(thick);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, state,
|
CullableObject *object = new CullableObject(geom, state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -406,7 +406,7 @@ render_thread(CullTraverser *trav, CullTraverserData &data,
|
|||||||
CPT(RenderState) state = data._state->add_attrib(thick);
|
CPT(RenderState) state = data._state->add_attrib(thick);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, state,
|
CullableObject *object = new CullableObject(geom, state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -451,7 +451,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->add_primitive(strip);
|
geom->add_primitive(strip);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -497,7 +497,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->set_lengths(lengths);
|
geom->set_lengths(lengths);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -515,7 +515,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data,
|
|||||||
void RopeNode::
|
void RopeNode::
|
||||||
render_billboard(CullTraverser *trav, CullTraverserData &data,
|
render_billboard(CullTraverser *trav, CullTraverserData &data,
|
||||||
NurbsCurveResult *result) const {
|
NurbsCurveResult *result) const {
|
||||||
const TransformState *net_transform = data._net_transform;
|
const TransformState *net_transform = data._modelview_transform;
|
||||||
const TransformState *camera_transform = trav->get_camera_transform();
|
const TransformState *camera_transform = trav->get_camera_transform();
|
||||||
|
|
||||||
CPT(TransformState) rel_transform =
|
CPT(TransformState) rel_transform =
|
||||||
@ -549,7 +549,7 @@ render_billboard(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->add_primitive(strip);
|
geom->add_primitive(strip);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -595,7 +595,7 @@ render_billboard(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->set_lengths(lengths);
|
geom->set_lengths(lengths);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -654,7 +654,7 @@ render_tube(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->add_primitive(strip);
|
geom->add_primitive(strip);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -713,7 +713,7 @@ render_tube(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->set_lengths(lengths);
|
geom->set_lengths(lengths);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -333,7 +333,7 @@ render_sheet(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->add_primitive(strip);
|
geom->add_primitive(strip);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -403,7 +403,7 @@ render_sheet(CullTraverser *trav, CullTraverserData &data,
|
|||||||
geom->set_lengths(lengths);
|
geom->set_lengths(lengths);
|
||||||
|
|
||||||
CullableObject *object = new CullableObject(geom, data._state,
|
CullableObject *object = new CullableObject(geom, data._state,
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
trav->get_cull_handler()->record_object(object, trav);
|
trav->get_cull_handler()->record_object(object, trav);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,18 +147,21 @@ void BillboardEffect::
|
|||||||
cull_callback(CullTraverser *trav, CullTraverserData &data,
|
cull_callback(CullTraverser *trav, CullTraverserData &data,
|
||||||
CPT(TransformState) &node_transform,
|
CPT(TransformState) &node_transform,
|
||||||
CPT(RenderState) &) const {
|
CPT(RenderState) &) const {
|
||||||
CPT(TransformState) net_transform = data._net_transform;
|
CPT(TransformState) net_transform = data._modelview_transform;
|
||||||
if (net_transform->is_singular()) {
|
if (net_transform->is_singular()) {
|
||||||
// If we're under a singular transform, never mind.
|
// If we're under a singular transform, never mind.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPT(TransformState) camera_transform = trav->get_camera_transform();
|
// Since the "net" transform from the cull traverser already
|
||||||
|
// includes the inverse camera transform, the camera transform is
|
||||||
|
// identity.
|
||||||
|
CPT(TransformState) camera_transform = TransformState::make_identity();
|
||||||
|
|
||||||
// Determine the relative transform to our camera (or other look_at
|
// But if we're rotating to face something other than the camera, we
|
||||||
// coordinate space).
|
// have to compute the "camera" transform to compensate for that.
|
||||||
if (!_look_at.is_empty()) {
|
if (!_look_at.is_empty()) {
|
||||||
camera_transform = _look_at.get_net_transform();
|
camera_transform = trav->get_camera_transform()->invert_compose(_look_at.get_net_transform());
|
||||||
}
|
}
|
||||||
|
|
||||||
compute_billboard(node_transform, net_transform, camera_transform);
|
compute_billboard(node_transform, net_transform, camera_transform);
|
||||||
|
@ -135,7 +135,7 @@ has_cull_callback() const {
|
|||||||
// level.
|
// level.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CompassEffect::
|
void CompassEffect::
|
||||||
cull_callback(CullTraverser *, CullTraverserData &data,
|
cull_callback(CullTraverser *trav, CullTraverserData &data,
|
||||||
CPT(TransformState) &node_transform,
|
CPT(TransformState) &node_transform,
|
||||||
CPT(RenderState) &) const {
|
CPT(RenderState) &) const {
|
||||||
if (_properties == 0) {
|
if (_properties == 0) {
|
||||||
@ -143,8 +143,8 @@ cull_callback(CullTraverser *, CullTraverserData &data,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPT(TransformState) true_net_transform = data._net_transform;
|
CPT(TransformState) true_net_transform = data.get_net_transform(trav);
|
||||||
CPT(TransformState) want_net_transform = data._net_transform;
|
CPT(TransformState) want_net_transform = true_net_transform;
|
||||||
adjust_transform(want_net_transform, node_transform);
|
adjust_transform(want_net_transform, node_transform);
|
||||||
|
|
||||||
// Now compute the transform that will convert true_net_transform to
|
// Now compute the transform that will convert true_net_transform to
|
||||||
|
@ -59,8 +59,8 @@ add_object(CullableObject *object) {
|
|||||||
DCAST_INTO_V(gbv, &volume);
|
DCAST_INTO_V(gbv, &volume);
|
||||||
|
|
||||||
LPoint3f center = gbv->get_approx_center();
|
LPoint3f center = gbv->get_approx_center();
|
||||||
nassertv(object->_transform != (const TransformState *)NULL);
|
nassertv(object->_modelview_transform != (const TransformState *)NULL);
|
||||||
center = center * object->_transform->get_mat();
|
center = center * object->_modelview_transform->get_mat();
|
||||||
|
|
||||||
float distance = _gsg->compute_distance_to(center);
|
float distance = _gsg->compute_distance_to(center);
|
||||||
_objects.push_back(ObjectData(object, distance));
|
_objects.push_back(ObjectData(object, distance));
|
||||||
|
@ -59,8 +59,8 @@ add_object(CullableObject *object) {
|
|||||||
DCAST_INTO_V(gbv, &volume);
|
DCAST_INTO_V(gbv, &volume);
|
||||||
|
|
||||||
LPoint3f center = gbv->get_approx_center();
|
LPoint3f center = gbv->get_approx_center();
|
||||||
nassertv(object->_transform != (const TransformState *)NULL);
|
nassertv(object->_modelview_transform != (const TransformState *)NULL);
|
||||||
center = center * object->_transform->get_mat();
|
center = center * object->_modelview_transform->get_mat();
|
||||||
|
|
||||||
float distance = _gsg->compute_distance_to(center);
|
float distance = _gsg->compute_distance_to(center);
|
||||||
_objects.push_back(ObjectData(object, distance));
|
_objects.push_back(ObjectData(object, distance));
|
||||||
|
@ -52,8 +52,8 @@ operator < (const ObjectData &other) const {
|
|||||||
|
|
||||||
// Then group objects by transform, since these are supposed to be
|
// Then group objects by transform, since these are supposed to be
|
||||||
// expensive too.
|
// expensive too.
|
||||||
if (_object->_transform != other._object->_transform) {
|
if (_object->_modelview_transform != other._object->_modelview_transform) {
|
||||||
return _object->_transform < other._object->_transform;
|
return _object->_modelview_transform < other._object->_modelview_transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Then, sort by all the other states, in no particular order,
|
// Then, sort by all the other states, in no particular order,
|
||||||
|
@ -29,7 +29,7 @@ draw(CullableObject *object, GraphicsStateGuardianBase *gsg) {
|
|||||||
if (object->_next != (CullableObject *)NULL) {
|
if (object->_next != (CullableObject *)NULL) {
|
||||||
draw_with_decals(object, gsg);
|
draw_with_decals(object, gsg);
|
||||||
} else {
|
} else {
|
||||||
gsg->set_state_and_transform(object->_state, object->_transform);
|
gsg->set_state_and_transform(object->_state, object->_modelview_transform);
|
||||||
object->draw(gsg);
|
object->draw(gsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ CullHandler::
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void CullHandler::
|
void CullHandler::
|
||||||
record_object(CullableObject *object, const CullTraverser *traverser) {
|
record_object(CullableObject *object, const CullTraverser *traverser) {
|
||||||
nout << *object->_geom << " " << *object->_transform << " "
|
nout << *object->_geom << " " << *object->_modelview_transform << " "
|
||||||
<< *object->_state << "\n";
|
<< *object->_state << "\n";
|
||||||
delete object;
|
delete object;
|
||||||
}
|
}
|
||||||
@ -65,7 +65,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->_transform);
|
gsg->set_state_and_transform(base->_state->compose(state), base->_modelview_transform);
|
||||||
base->draw(gsg);
|
base->draw(gsg);
|
||||||
|
|
||||||
base = base->_next;
|
base = base->_next;
|
||||||
@ -77,7 +77,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->_transform);
|
gsg->set_state_and_transform(decal->_state->compose(state), decal->_modelview_transform);
|
||||||
decal->draw(gsg);
|
decal->draw(gsg);
|
||||||
decal = decal->_next;
|
decal = decal->_next;
|
||||||
}
|
}
|
||||||
@ -88,7 +88,7 @@ draw_with_decals(CullableObject *object, GraphicsStateGuardianBase *gsg) {
|
|||||||
if (state != (const RenderState *)NULL) {
|
if (state != (const RenderState *)NULL) {
|
||||||
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->_transform);
|
gsg->set_state_and_transform(base->_state->compose(state), base->_modelview_transform);
|
||||||
base->draw(gsg);
|
base->draw(gsg);
|
||||||
|
|
||||||
base = base->_next;
|
base = base->_next;
|
||||||
|
@ -125,7 +125,7 @@ traverse(const NodePath &root, bool python_cull_control) {
|
|||||||
CPT(TransformState) transform = cull_center.get_transform(root);
|
CPT(TransformState) transform = cull_center.get_transform(root);
|
||||||
|
|
||||||
CullTraverserData my_data(data, portal_viewer._previous);
|
CullTraverserData my_data(data, portal_viewer._previous);
|
||||||
my_data._net_transform = my_data._net_transform->compose(transform);
|
my_data._modelview_transform = my_data._modelview_transform->compose(transform);
|
||||||
traverse(my_data);
|
traverse(my_data);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -273,7 +273,7 @@ show_bounds(CullTraverserData &data, bool tight) {
|
|||||||
_geoms_pcollector.add_level(1);
|
_geoms_pcollector.add_level(1);
|
||||||
CullableObject *outer_viz =
|
CullableObject *outer_viz =
|
||||||
new CullableObject(bounds_viz, get_bounds_outer_viz_state(),
|
new CullableObject(bounds_viz, get_bounds_outer_viz_state(),
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
_cull_handler->record_object(outer_viz, this);
|
_cull_handler->record_object(outer_viz, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,12 +284,12 @@ show_bounds(CullTraverserData &data, bool tight) {
|
|||||||
_geoms_pcollector.add_level(2);
|
_geoms_pcollector.add_level(2);
|
||||||
CullableObject *outer_viz =
|
CullableObject *outer_viz =
|
||||||
new CullableObject(bounds_viz, get_bounds_outer_viz_state(),
|
new CullableObject(bounds_viz, get_bounds_outer_viz_state(),
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
_cull_handler->record_object(outer_viz, this);
|
_cull_handler->record_object(outer_viz, this);
|
||||||
|
|
||||||
CullableObject *inner_viz =
|
CullableObject *inner_viz =
|
||||||
new CullableObject(bounds_viz, get_bounds_inner_viz_state(),
|
new CullableObject(bounds_viz, get_bounds_inner_viz_state(),
|
||||||
data._net_transform);
|
data._modelview_transform);
|
||||||
_cull_handler->record_object(inner_viz, this);
|
_cull_handler->record_object(inner_viz, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,12 +23,12 @@
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
INLINE CullTraverserData::
|
INLINE CullTraverserData::
|
||||||
CullTraverserData(const NodePath &start,
|
CullTraverserData(const NodePath &start,
|
||||||
const TransformState *net_transform,
|
const TransformState *modelview_transform,
|
||||||
const RenderState *state,
|
const RenderState *state,
|
||||||
GeometricBoundingVolume *view_frustum,
|
GeometricBoundingVolume *view_frustum,
|
||||||
GeometricBoundingVolume *guard_band) :
|
GeometricBoundingVolume *guard_band) :
|
||||||
_node_path(start),
|
_node_path(start),
|
||||||
_net_transform(net_transform),
|
_modelview_transform(modelview_transform),
|
||||||
_state(state),
|
_state(state),
|
||||||
_view_frustum(view_frustum),
|
_view_frustum(view_frustum),
|
||||||
_guard_band(guard_band)
|
_guard_band(guard_band)
|
||||||
@ -43,7 +43,7 @@ CullTraverserData(const NodePath &start,
|
|||||||
INLINE CullTraverserData::
|
INLINE CullTraverserData::
|
||||||
CullTraverserData(const CullTraverserData ©) :
|
CullTraverserData(const CullTraverserData ©) :
|
||||||
_node_path(copy._node_path),
|
_node_path(copy._node_path),
|
||||||
_net_transform(copy._net_transform),
|
_modelview_transform(copy._modelview_transform),
|
||||||
_state(copy._state),
|
_state(copy._state),
|
||||||
_view_frustum(copy._view_frustum),
|
_view_frustum(copy._view_frustum),
|
||||||
_guard_band(copy._guard_band)
|
_guard_band(copy._guard_band)
|
||||||
@ -58,7 +58,7 @@ CullTraverserData(const CullTraverserData ©) :
|
|||||||
INLINE void CullTraverserData::
|
INLINE void CullTraverserData::
|
||||||
operator = (const CullTraverserData ©) {
|
operator = (const CullTraverserData ©) {
|
||||||
_node_path = copy._node_path;
|
_node_path = copy._node_path;
|
||||||
_net_transform = copy._net_transform;
|
_modelview_transform = copy._modelview_transform;
|
||||||
_state = copy._state;
|
_state = copy._state;
|
||||||
_view_frustum = copy._view_frustum;
|
_view_frustum = copy._view_frustum;
|
||||||
_guard_band = copy._guard_band;
|
_guard_band = copy._guard_band;
|
||||||
@ -73,7 +73,7 @@ operator = (const CullTraverserData ©) {
|
|||||||
INLINE CullTraverserData::
|
INLINE CullTraverserData::
|
||||||
CullTraverserData(const CullTraverserData &parent, PandaNode *child) :
|
CullTraverserData(const CullTraverserData &parent, PandaNode *child) :
|
||||||
_node_path(parent._node_path, child),
|
_node_path(parent._node_path, child),
|
||||||
_net_transform(parent._net_transform),
|
_modelview_transform(parent._modelview_transform),
|
||||||
_state(parent._state),
|
_state(parent._state),
|
||||||
_view_frustum(parent._view_frustum),
|
_view_frustum(parent._view_frustum),
|
||||||
_guard_band(parent._guard_band)
|
_guard_band(parent._guard_band)
|
||||||
@ -99,6 +99,17 @@ node() const {
|
|||||||
return _node_path.node();
|
return _node_path.node();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: CullTraverserData::get_modelview_transform
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the modelview transform: the relative
|
||||||
|
// transform from the camera to the model.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
INLINE const TransformState *CullTraverserData::
|
||||||
|
get_modelview_transform() const {
|
||||||
|
return _modelview_transform;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CullTraverserData::is_in_view
|
// Function: CullTraverserData::is_in_view
|
||||||
// Access: Public
|
// Access: Public
|
||||||
|
@ -29,6 +29,17 @@
|
|||||||
#include "renderState.h"
|
#include "renderState.h"
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: CullTraverserData::get_net_transform
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the net transform: the relative
|
||||||
|
// transform from the root of the scene to the model.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
CPT(TransformState) CullTraverserData::
|
||||||
|
get_net_transform(const CullTraverser *trav) const {
|
||||||
|
return trav->get_camera_transform()->compose(_modelview_transform);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: CullTraverserData::apply_transform_and_state
|
// Function: CullTraverserData::apply_transform_and_state
|
||||||
// Access: Public
|
// Access: Public
|
||||||
@ -71,7 +82,7 @@ apply_transform_and_state(CullTraverser *trav,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!node_transform->is_identity()) {
|
if (!node_transform->is_identity()) {
|
||||||
_net_transform = _net_transform->compose(node_transform);
|
_modelview_transform = _modelview_transform->compose(node_transform);
|
||||||
|
|
||||||
if ((_view_frustum != (GeometricBoundingVolume *)NULL) ||
|
if ((_view_frustum != (GeometricBoundingVolume *)NULL) ||
|
||||||
(_guard_band != (GeometricBoundingVolume *)NULL)) {
|
(_guard_band != (GeometricBoundingVolume *)NULL)) {
|
||||||
|
@ -48,7 +48,7 @@ class CullTraverser;
|
|||||||
class EXPCL_PANDA CullTraverserData {
|
class EXPCL_PANDA CullTraverserData {
|
||||||
public:
|
public:
|
||||||
INLINE CullTraverserData(const NodePath &start,
|
INLINE CullTraverserData(const NodePath &start,
|
||||||
const TransformState *net_transform,
|
const TransformState *modelview_transform,
|
||||||
const RenderState *state,
|
const RenderState *state,
|
||||||
GeometricBoundingVolume *view_frustum,
|
GeometricBoundingVolume *view_frustum,
|
||||||
GeometricBoundingVolume *guard_band);
|
GeometricBoundingVolume *guard_band);
|
||||||
@ -60,6 +60,9 @@ public:
|
|||||||
|
|
||||||
INLINE PandaNode *node() const;
|
INLINE PandaNode *node() const;
|
||||||
|
|
||||||
|
INLINE const TransformState *get_modelview_transform() const;
|
||||||
|
CPT(TransformState) get_net_transform(const CullTraverser *trav) const;
|
||||||
|
|
||||||
INLINE bool is_in_view(const DrawMask &camera_mask);
|
INLINE bool is_in_view(const DrawMask &camera_mask);
|
||||||
void apply_transform_and_state(CullTraverser *trav);
|
void apply_transform_and_state(CullTraverser *trav);
|
||||||
void apply_transform_and_state(CullTraverser *trav,
|
void apply_transform_and_state(CullTraverser *trav,
|
||||||
@ -68,7 +71,7 @@ public:
|
|||||||
CPT(RenderEffects) node_effects);
|
CPT(RenderEffects) node_effects);
|
||||||
|
|
||||||
WorkingNodePath _node_path;
|
WorkingNodePath _node_path;
|
||||||
CPT(TransformState) _net_transform;
|
CPT(TransformState) _modelview_transform;
|
||||||
CPT(RenderState) _state;
|
CPT(RenderState) _state;
|
||||||
PT(GeometricBoundingVolume) _view_frustum;
|
PT(GeometricBoundingVolume) _view_frustum;
|
||||||
PT(GeometricBoundingVolume) _guard_band;
|
PT(GeometricBoundingVolume) _guard_band;
|
||||||
|
@ -41,7 +41,7 @@ CullableObject(const CullTraverserData &data,
|
|||||||
CullableObject *next) :
|
CullableObject *next) :
|
||||||
_geom(geom_node->get_geom(i)),
|
_geom(geom_node->get_geom(i)),
|
||||||
_state(data._state->compose(geom_node->get_geom_state(i))),
|
_state(data._state->compose(geom_node->get_geom_state(i))),
|
||||||
_transform(data._net_transform),
|
_modelview_transform(data._modelview_transform),
|
||||||
_next(next)
|
_next(next)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -54,11 +54,11 @@ CullableObject(const CullTraverserData &data,
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
INLINE CullableObject::
|
INLINE CullableObject::
|
||||||
CullableObject(const Geom *geom, const RenderState *state,
|
CullableObject(const Geom *geom, const RenderState *state,
|
||||||
const TransformState *transform,
|
const TransformState *modelview_transform,
|
||||||
CullableObject *next) :
|
CullableObject *next) :
|
||||||
_geom(geom),
|
_geom(geom),
|
||||||
_state(state),
|
_state(state),
|
||||||
_transform(transform),
|
_modelview_transform(modelview_transform),
|
||||||
_next(next)
|
_next(next)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -74,7 +74,7 @@ INLINE CullableObject::
|
|||||||
CullableObject(const CullableObject ©) :
|
CullableObject(const CullableObject ©) :
|
||||||
_geom(copy._geom),
|
_geom(copy._geom),
|
||||||
_state(copy._state),
|
_state(copy._state),
|
||||||
_transform(copy._transform),
|
_modelview_transform(copy._modelview_transform),
|
||||||
_next((CullableObject *)NULL)
|
_next((CullableObject *)NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -89,7 +89,7 @@ INLINE void CullableObject::
|
|||||||
operator = (const CullableObject ©) {
|
operator = (const CullableObject ©) {
|
||||||
_geom = copy._geom;
|
_geom = copy._geom;
|
||||||
_state = copy._state;
|
_state = copy._state;
|
||||||
_transform = copy._transform;
|
_modelview_transform = copy._modelview_transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
@ -54,7 +54,7 @@ munge_geom(GraphicsStateGuardianBase *gsg,
|
|||||||
|
|
||||||
int geom_rendering = qpgeom->get_geom_rendering();
|
int geom_rendering = qpgeom->get_geom_rendering();
|
||||||
geom_rendering = _state->get_geom_rendering(geom_rendering);
|
geom_rendering = _state->get_geom_rendering(geom_rendering);
|
||||||
geom_rendering = _transform->get_geom_rendering(geom_rendering);
|
geom_rendering = _modelview_transform->get_geom_rendering(geom_rendering);
|
||||||
|
|
||||||
GraphicsStateGuardianBase *gsg = traverser->get_gsg();
|
GraphicsStateGuardianBase *gsg = traverser->get_gsg();
|
||||||
int gsg_bits = gsg->get_supported_geom_rendering();
|
int gsg_bits = gsg->get_supported_geom_rendering();
|
||||||
@ -235,7 +235,7 @@ munge_points_to_quads(const CullTraverser *traverser) {
|
|||||||
PT(qpGeom) new_geom = new qpGeom();
|
PT(qpGeom) new_geom = new qpGeom();
|
||||||
new_geom->set_vertex_data(new_data);
|
new_geom->set_vertex_data(new_data);
|
||||||
|
|
||||||
const LMatrix4f &modelview = _transform->get_mat();
|
const LMatrix4f &modelview = _modelview_transform->get_mat();
|
||||||
|
|
||||||
SceneSetup *scene = traverser->get_scene();
|
SceneSetup *scene = traverser->get_scene();
|
||||||
const Lens *lens = scene->get_lens();
|
const Lens *lens = scene->get_lens();
|
||||||
@ -350,7 +350,7 @@ munge_points_to_quads(const CullTraverser *traverser) {
|
|||||||
// height in 3-d units. To arrange that, we need to figure
|
// height in 3-d units. To arrange that, we need to figure
|
||||||
// out the appropriate scaling factor based on the current
|
// out the appropriate scaling factor based on the current
|
||||||
// viewport and projection matrix.
|
// viewport and projection matrix.
|
||||||
float scale = _transform->get_scale()[1];
|
float scale = _modelview_transform->get_scale()[1];
|
||||||
LVector3f height(0.0f, point_size * scale, scale);
|
LVector3f height(0.0f, point_size * scale, scale);
|
||||||
height = height * height_projection;
|
height = height * height_projection;
|
||||||
scale_y = height[1] * viewport_height;
|
scale_y = height[1] * viewport_height;
|
||||||
|
@ -49,7 +49,7 @@ public:
|
|||||||
GeomNode *geom_node, int i,
|
GeomNode *geom_node, int i,
|
||||||
CullableObject *next = NULL);
|
CullableObject *next = NULL);
|
||||||
INLINE CullableObject(const Geom *geom, const RenderState *state,
|
INLINE CullableObject(const Geom *geom, const RenderState *state,
|
||||||
const TransformState *transform,
|
const TransformState *modelview_transform,
|
||||||
CullableObject *next = NULL);
|
CullableObject *next = NULL);
|
||||||
|
|
||||||
INLINE CullableObject(const CullableObject ©);
|
INLINE CullableObject(const CullableObject ©);
|
||||||
@ -80,7 +80,7 @@ public:
|
|||||||
PT(qpGeomMunger) _munger;
|
PT(qpGeomMunger) _munger;
|
||||||
CPT(qpGeomVertexData) _munged_data;
|
CPT(qpGeomVertexData) _munged_data;
|
||||||
CPT(RenderState) _state;
|
CPT(RenderState) _state;
|
||||||
CPT(TransformState) _transform;
|
CPT(TransformState) _modelview_transform;
|
||||||
CullableObject *_next;
|
CullableObject *_next;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -250,7 +250,7 @@ is_lod_node() const {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
int LODNode::
|
int LODNode::
|
||||||
compute_child(CullTraverser *trav, CullTraverserData &data) {
|
compute_child(CullTraverser *trav, CullTraverserData &data) {
|
||||||
if (data._net_transform->is_singular()) {
|
if (data._modelview_transform->is_singular()) {
|
||||||
// If we're under a singular transform, we can't compute the LOD;
|
// If we're under a singular transform, we can't compute the LOD;
|
||||||
// select none of them instead.
|
// select none of them instead.
|
||||||
return -1;
|
return -1;
|
||||||
@ -266,10 +266,11 @@ compute_child(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
// CPT(TransformState) rel_transform =
|
// CPT(TransformState) rel_transform =
|
||||||
// trav->get_camera_transform()->invert_compose(data._net_transform);
|
// trav->get_camera_transform()->invert_compose(data._net_transform);
|
||||||
|
|
||||||
CPT(TransformState) rel_transform =
|
// CPT(TransformState) rel_transform =
|
||||||
trav->get_scene()->get_cull_center().get_net_transform()->
|
// trav->get_scene()->get_cull_center().get_net_transform()->
|
||||||
invert_compose(data._net_transform);
|
// invert_compose(data._net_transform);
|
||||||
|
|
||||||
|
CPT(TransformState) rel_transform = data._modelview_transform;
|
||||||
LPoint3f center = cdata->_center * rel_transform->get_mat();
|
LPoint3f center = cdata->_center * rel_transform->get_mat();
|
||||||
|
|
||||||
// Determine which child to traverse
|
// Determine which child to traverse
|
||||||
|
@ -182,7 +182,8 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
|
|||||||
PGCullTraverser *pg_trav;
|
PGCullTraverser *pg_trav;
|
||||||
DCAST_INTO_R(pg_trav, trav, true);
|
DCAST_INTO_R(pg_trav, trav, true);
|
||||||
|
|
||||||
const LMatrix4f &transform = data._net_transform->get_mat();
|
CPT(TransformState) net_transform = data.get_net_transform(trav);
|
||||||
|
const LMatrix4f &transform = net_transform->get_mat();
|
||||||
|
|
||||||
// Consider the cull bin this object is in. Since the binning
|
// Consider the cull bin this object is in. Since the binning
|
||||||
// affects the render order, we want bins that render later to
|
// affects the render order, we want bins that render later to
|
||||||
|
Loading…
x
Reference in New Issue
Block a user