mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 17:35:34 -04:00
properly support a different coordinate system per camera (or lens)
This commit is contained in:
parent
19ddfa1ba2
commit
9a93914d58
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user