properly support a different coordinate system per camera (or lens)

This commit is contained in:
David Rose 2012-03-14 20:51:58 +00:00
parent 19ddfa1ba2
commit 9a93914d58
20 changed files with 89 additions and 28 deletions

View File

@ -208,7 +208,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
new CullableObject(geom, point_state,
xform_data.get_net_transform(trav),
xform_data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(object, trav);
}
@ -239,7 +239,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
new CullableObject(geom, empty_state,
xform_data.get_net_transform(trav),
xform_data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(object, trav);
}

View File

@ -1884,6 +1884,9 @@ setup_scene(GraphicsStateGuardian *gsg, DisplayRegionPipelineReader *dr) {
scene_setup->set_camera_transform(camera_transform);
scene_setup->set_world_transform(world_transform);
CPT(TransformState) cs_transform = gsg->get_cs_transform_for(lens->get_coordinate_system());
scene_setup->set_cs_transform(cs_transform);
return scene_setup;
}

View File

@ -341,10 +341,15 @@ get_supports_cg_profile(const string &name) const {
// used by the scene graph, external to to GSG.
//
// Normally, this will be the default coordinate system,
// but it might be set differently at runtime.
// but it might be set differently at runtime. It will
// automatically be copied from the current lens's
// coordinate system as each DisplayRegion is rendered.
////////////////////////////////////////////////////////////////////
void GraphicsStateGuardian::
set_coordinate_system(CoordinateSystem cs) {
if (cs == CS_default) {
cs = get_default_coordinate_system();
}
_coordinate_system = cs;
// Changing the external coordinate system changes the cs_transform.
@ -556,6 +561,8 @@ set_scene(SceneSetup *scene_setup) {
return false;
}
set_coordinate_system(_current_lens->get_coordinate_system());
_projection_mat = calc_projection_mat(_current_lens);
if (_projection_mat == 0) {
return false;
@ -1856,6 +1863,27 @@ get_render_buffer(int buffer_type, const FrameBufferProperties &prop) {
return RenderBuffer(this, buffer_type & prop.get_buffer_mask() & _stereo_buffer_mask);
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsStateGuardian::get_cs_transform_for
// Access: Public, Virtual
// Description: Returns what the cs_transform would be set to after a
// call to set_coordinate_system(cs). This is another
// way of saying the cs_transform when rendering the
// scene for a camera with the indicated coordinate
// system.
////////////////////////////////////////////////////////////////////
const TransformState *GraphicsStateGuardian::
get_cs_transform_for(CoordinateSystem cs) const {
if (_internal_coordinate_system == CS_default ||
_internal_coordinate_system == cs) {
return TransformState::make_identity();
} else {
return TransformState::make_mat
(LMatrix4::convert_mat(cs, _internal_coordinate_system));
}
}
////////////////////////////////////////////////////////////////////
// Function: GraphicsStateGuardian::get_cs_transform
// Access: Public, Virtual

View File

@ -296,6 +296,7 @@ public:
INLINE int get_current_tex_view_offset() const;
INLINE const Lens *get_current_lens() const;
virtual const TransformState *get_cs_transform_for(CoordinateSystem cs) const;
virtual const TransformState *get_cs_transform() const;
INLINE const TransformState *get_inv_cs_transform() const;

View File

@ -650,7 +650,7 @@ perform_occlusion_test(const Geom *geom, const TransformState *net_transform,
CullableObject *viz =
new CullableObject(geom, _solid_test_state,
net_transform, modelview_transform, gsg);
net_transform, modelview_transform, get_scene());
static ConfigVariableBool test_occlude("test-occlude", false);
if (test_occlude) {
@ -702,13 +702,13 @@ show_results(int num_fragments, const Geom *geom,
CullableObject *internal_viz =
new CullableObject(geom, state,
net_transform, modelview_transform, gsg);
net_transform, modelview_transform, get_scene());
_internal_cull_handler->record_object(internal_viz, _internal_trav);
// Also render the viz in the main scene.
modelview_transform = get_world_transform()->compose(net_transform);
CullableObject *main_viz =
new CullableObject(geom, state,
net_transform, modelview_transform, gsg);
net_transform, modelview_transform, get_scene());
_true_cull_handler->record_object(main_viz, this);
}

View File

@ -211,6 +211,7 @@ public:
(Texture *tex, int z, const DisplayRegion *dr, const RenderBuffer &rb)=0;
virtual CoordinateSystem get_internal_coordinate_system() const=0;
virtual const TransformState *get_cs_transform_for(CoordinateSystem cs) const=0;
virtual const TransformState *get_cs_transform() const=0;
virtual void bind_light(PointLight *light_obj, const NodePath &light,

View File

@ -384,7 +384,7 @@ render_thread(CullTraverser *trav, CullTraverserData &data,
new CullableObject(geom, state,
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(object, trav);
}
@ -436,7 +436,7 @@ render_tape(CullTraverser *trav, CullTraverserData &data,
new CullableObject(geom, state,
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(object, trav);
}
@ -495,7 +495,7 @@ render_billboard(CullTraverser *trav, CullTraverserData &data,
new CullableObject(geom, state,
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(object, trav);
}
@ -561,7 +561,7 @@ render_tube(CullTraverser *trav, CullTraverserData &data,
new CullableObject(geom, state,
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(object, trav);
}

View File

@ -377,7 +377,7 @@ render_sheet(CullTraverser *trav, CullTraverserData &data,
new CullableObject(geom, state,
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(object, trav);
}

View File

@ -320,12 +320,12 @@ draw_bounding_volume(const BoundingVolume *vol,
_geoms_pcollector.add_level(2);
CullableObject *outer_viz =
new CullableObject(bounds_viz, get_bounds_outer_viz_state(),
net_transform, modelview_transform, get_gsg());
net_transform, modelview_transform, get_scene());
_cull_handler->record_object(outer_viz, this);
CullableObject *inner_viz =
new CullableObject(bounds_viz, get_bounds_inner_viz_state(),
net_transform, modelview_transform, get_gsg());
net_transform, modelview_transform, get_scene());
_cull_handler->record_object(inner_viz, this);
}
}
@ -363,7 +363,7 @@ show_bounds(CullTraverserData &data, bool tight) {
CullableObject *outer_viz =
new CullableObject(bounds_viz, get_bounds_outer_viz_state(),
net_transform, modelview_transform,
get_gsg());
get_scene());
_cull_handler->record_object(outer_viz, this);
}
@ -706,7 +706,7 @@ start_decal(const CullTraverserData &data) {
_geoms_pcollector.add_level(num_geoms);
CPT(TransformState) net_transform = data.get_net_transform(this);
CPT(TransformState) modelview_transform = data.get_modelview_transform(this);
CPT(TransformState) internal_transform = get_gsg()->get_cs_transform()->compose(modelview_transform);
CPT(TransformState) internal_transform = _scene_setup->get_cs_transform()->compose(modelview_transform);
for (int i = num_geoms - 1; i >= 0; i--) {
const Geom *geom = geoms.get_geom(i);
@ -819,7 +819,7 @@ r_get_decals(CullTraverserData &data, CullableObject *decals) {
_geoms_pcollector.add_level(num_geoms);
CPT(TransformState) net_transform = data.get_net_transform(this);
CPT(TransformState) modelview_transform = data.get_modelview_transform(this);
CPT(TransformState) internal_transform = get_gsg()->get_cs_transform()->compose(modelview_transform);
CPT(TransformState) internal_transform = _scene_setup->get_cs_transform()->compose(modelview_transform);
for (int i = num_geoms - 1; i >= 0; i--) {
const Geom *geom = geoms.get_geom(i);

View File

@ -37,12 +37,12 @@ INLINE CullableObject::
CullableObject(const Geom *geom, const RenderState *state,
const TransformState *net_transform,
const TransformState *modelview_transform,
const GraphicsStateGuardianBase *gsg) :
SceneSetup *scene_setup) :
_geom(geom),
_state(state),
_net_transform(net_transform),
_modelview_transform(modelview_transform),
_internal_transform(gsg->get_cs_transform()->compose(modelview_transform)),
_internal_transform(scene_setup->get_cs_transform()->compose(modelview_transform)),
_fancy(false)
{
#ifdef DO_MEMORY_USAGE

View File

@ -29,6 +29,7 @@
#include "pStatCollector.h"
#include "deletedChain.h"
#include "graphicsStateGuardianBase.h"
#include "sceneSetup.h"
#include "lightMutex.h"
#include "callbackObject.h"
@ -51,7 +52,7 @@ public:
INLINE CullableObject(const Geom *geom, const RenderState *state,
const TransformState *net_transform,
const TransformState *modelview_transform,
const GraphicsStateGuardianBase *gsg);
SceneSetup *scene_setup);
INLINE CullableObject(const Geom *geom, const RenderState *state,
const TransformState *net_transform,
const TransformState *modelview_transform,

View File

@ -543,7 +543,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) {
trav->_geoms_pcollector.add_level(num_geoms);
CPT(TransformState) net_transform = data.get_net_transform(trav);
CPT(TransformState) modelview_transform = data.get_modelview_transform(trav);
CPT(TransformState) internal_transform = trav->get_gsg()->get_cs_transform()->compose(modelview_transform);
CPT(TransformState) internal_transform = trav->get_scene()->get_cs_transform()->compose(modelview_transform);
for (int i = 0; i < num_geoms; i++) {
const Geom *geom = geoms.get_geom(i);

View File

@ -168,7 +168,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
new CullableObject(get_occluder_viz(trav, data), get_occluder_viz_state(trav, data),
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(occluder_viz, trav);
// Also get the frame.
@ -177,7 +177,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
new CullableObject(_frame_viz, get_frame_viz_state(trav, data),
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(frame_viz, trav);
// Now carry on to render our child nodes.

View File

@ -170,7 +170,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
new CullableObject(get_viz(trav, data), data._state,
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
trav->get_cull_handler()->record_object(plane_viz, trav);
// Now carry on to render our child nodes.

View File

@ -27,6 +27,7 @@ SceneSetup() {
_initial_state = RenderState::make_empty();
_camera_transform = TransformState::make_identity();
_world_transform = TransformState::make_identity();
_cs_transform = TransformState::make_identity();
}
////////////////////////////////////////////////////////////////////
@ -293,3 +294,25 @@ INLINE const TransformState *SceneSetup::
get_world_transform() const {
return _world_transform;
}
////////////////////////////////////////////////////////////////////
// Function: SceneSetup::set_cs_transform
// Access: Published
// Description: Specifies the transform from the camera's coordinate
// system to the GSG's internal coordinate system.
////////////////////////////////////////////////////////////////////
INLINE void SceneSetup::
set_cs_transform(const TransformState *cs_transform) {
_cs_transform = cs_transform;
}
////////////////////////////////////////////////////////////////////
// Function: SceneSetup::get_cs_transform
// Access: Published
// Description: Returns the transform from the camera's coordinate
// system to the GSG's internal coordinate system.
////////////////////////////////////////////////////////////////////
INLINE const TransformState *SceneSetup::
get_cs_transform() const {
return _cs_transform;
}

View File

@ -71,6 +71,9 @@ PUBLISHED:
INLINE void set_world_transform(const TransformState *world_transform);
INLINE const TransformState *get_world_transform() const;
INLINE void set_cs_transform(const TransformState *cs_transform);
INLINE const TransformState *get_cs_transform() const;
private:
DisplayRegion *_display_region;
int _viewport_width;
@ -83,6 +86,7 @@ private:
CPT(RenderState) _initial_state;
CPT(TransformState) _camera_transform;
CPT(TransformState) _world_transform;
CPT(TransformState) _cs_transform;
public:
static TypeHandle get_class_type() {

View File

@ -162,7 +162,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) {
new CullableObject(NULL, data._state,
data.get_net_transform(trav),
data.get_modelview_transform(trav),
trav->get_gsg());
trav->get_scene());
object->set_draw_callback(cbobj);
trav->get_cull_handler()->record_object(object, trav);
}

View File

@ -59,7 +59,7 @@ upcall() {
new CullableObject(NULL, _data._state,
_data.get_net_transform(_trav),
_data.get_modelview_transform(_trav),
_trav->get_gsg());
_trav->get_scene());
object->set_draw_callback(cbobj);
_trav->get_cull_handler()->record_object(object, _trav);
}

View File

@ -130,7 +130,7 @@ render_geom(const Geom* geom, const RenderState* state, const Rocket::Core::Vect
CullableObject *object =
new CullableObject(geom, _net_state->compose(state),
net_transform, modelview_transform,
_trav->get_gsg());
_trav->get_scene());
_trav->get_cull_handler()->record_object(object, _trav);
}

View File

@ -984,7 +984,7 @@ cull_callback(CullTraverser *trav, CullTraverserData &data) {
// Compute the modelview and camera transforms, to pass to the
// SpeedTree CView structure.
CPT(TransformState) orig_modelview = data.get_modelview_transform(trav);
CPT(TransformState) modelview = gsg->get_cs_transform()->compose(orig_modelview);
CPT(TransformState) modelview = trav->get_scene()->get_cs_transform()->compose(orig_modelview);
CPT(TransformState) camera_transform = modelview->invert_compose(TransformState::make_identity());
LMatrix4f modelview_mat = LCAST(float, modelview->get_mat());
const LPoint3 &camera_pos = camera_transform->get_pos();
@ -1122,7 +1122,7 @@ add_for_draw(CullTraverser *trav, CullTraverserData &data) {
new CullableObject(NULL, data._state,
TransformState::make_identity(),
TransformState::make_identity(),
trav->get_gsg());
trav->get_scene());
object->set_draw_callback(new DrawCallback(this));
trav->get_cull_handler()->record_object(object, trav);
}