319 lines
12 KiB
C++
319 lines
12 KiB
C++
// Filename: stereoDisplayRegion.cxx
|
|
// Created by: drose (19Feb09)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
//
|
|
// All use of this software is subject to the terms of the revised BSD
|
|
// license. You should have received a copy of this license along
|
|
// with this source code in a file named "LICENSE."
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stereoDisplayRegion.h"
|
|
#include "pandaNode.h"
|
|
|
|
TypeHandle StereoDisplayRegion::_type_handle;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::Constructor
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
StereoDisplayRegion::
|
|
StereoDisplayRegion(GraphicsOutput *window,
|
|
const LVecBase4f &dimensions,
|
|
DisplayRegion *left, DisplayRegion *right) :
|
|
DisplayRegion(window, dimensions),
|
|
_left_eye(left),
|
|
_right_eye(right)
|
|
{
|
|
nassertv(window == left->get_window() &&
|
|
window == right->get_window());
|
|
set_stereo_channel(Lens::SC_stereo);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::Destructor
|
|
// Access: Published, Virtual
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
StereoDisplayRegion::
|
|
~StereoDisplayRegion() {
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_clear_active
|
|
// Access: Published, Virtual
|
|
// Description: Sets the clear-active flag for any bitplane.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_clear_active(int n, bool clear_active) {
|
|
// The clear_active flag gets set only on the parent, stereo display
|
|
// region.
|
|
DisplayRegion::set_clear_active(n, clear_active);
|
|
|
|
// Except for depth and stencil buffers. These also get set on the
|
|
// right display region by default, on the assumption that we want
|
|
// to clear these buffers between drawing the eyes, and that the
|
|
// right eye is the second of the pair.
|
|
switch (n) {
|
|
case RTP_stencil:
|
|
case RTP_depth_stencil:
|
|
case RTP_depth:
|
|
_right_eye->set_clear_active(n, clear_active);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_clear_value
|
|
// Access: Published, Virtual
|
|
// Description: Sets the clear value for any bitplane.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_clear_value(int n, const Colorf &clear_value) {
|
|
DisplayRegion::set_clear_value(n, clear_value);
|
|
_left_eye->set_clear_value(n, clear_value);
|
|
_right_eye->set_clear_value(n, clear_value);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::disable_clears
|
|
// Access: Published, Virtual
|
|
// Description: Disables both the color and depth clear. See
|
|
// set_clear_color_active and set_clear_depth_active.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
disable_clears() {
|
|
DisplayRegion::disable_clears();
|
|
_left_eye->disable_clears();
|
|
_right_eye->disable_clears();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_pixel_zoom
|
|
// Access: Published, Virtual
|
|
// Description: Sets the pixel_zoom for left and right eyes.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_pixel_zoom(float pixel_zoom) {
|
|
DisplayRegion::set_pixel_zoom(pixel_zoom);
|
|
_left_eye->set_pixel_zoom(pixel_zoom);
|
|
_right_eye->set_pixel_zoom(pixel_zoom);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_dimensions
|
|
// Access: Published, Virtual
|
|
// Description: Sets both the left and right DisplayRegions to the
|
|
// indicated dimensions.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_dimensions(const LVecBase4f &dimensions) {
|
|
DisplayRegion::set_dimensions(dimensions);
|
|
_left_eye->set_dimensions(dimensions);
|
|
_right_eye->set_dimensions(dimensions);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::is_stereo
|
|
// Access: Published, Virtual
|
|
// Description: Returns true if this is a StereoDisplayRegion, false
|
|
// otherwise.
|
|
////////////////////////////////////////////////////////////////////
|
|
bool StereoDisplayRegion::
|
|
is_stereo() const {
|
|
return true;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_camera
|
|
// Access: Published, Virtual
|
|
// Description: Sets both the left and right DisplayRegions to the
|
|
// indicated camera.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_camera(const NodePath &camera) {
|
|
DisplayRegion::set_camera(camera);
|
|
_left_eye->set_camera(camera);
|
|
_right_eye->set_camera(camera);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_active
|
|
// Access: Published, Virtual
|
|
// Description: Sets the active flag on both the left and right
|
|
// DisplayRegions to the indicated value.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_active(bool active) {
|
|
DisplayRegion::set_active(active);
|
|
_left_eye->set_active(active);
|
|
_right_eye->set_active(active);
|
|
if (active) {
|
|
// Reenable the appropriate eyes according to our stereo_channel
|
|
// setting.
|
|
set_stereo_channel(get_stereo_channel());
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_sort
|
|
// Access: Published, Virtual
|
|
// Description: Sets the indicated sort value on the overall
|
|
// DisplayRegion, the indicated sort value + 1 on the
|
|
// left eye, and the indicated sort value + 2 on the
|
|
// right eye.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_sort(int sort) {
|
|
DisplayRegion::set_sort(sort);
|
|
_left_eye->set_sort(sort + 1);
|
|
_right_eye->set_sort(sort + 2);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_stereo_channel
|
|
// Access: Published, Virtual
|
|
// Description: Sets the stereo channels on the left and right eyes,
|
|
// and also sets the active flags independently on both
|
|
// eyes. For a StereoDisplayRegion, a different action
|
|
// is performed for each different value:
|
|
//
|
|
// SC_stereo - the left eye is set to SC_left, the right
|
|
// eye to SC_right, and both eyes are activated.
|
|
//
|
|
// SC_left - the left eye is set to SC_left and
|
|
// activated; the right eye is deactivated.
|
|
//
|
|
// SC_right - the right eye is set to SC_right and
|
|
// activated; the left eye is deactivated.
|
|
//
|
|
// SC_mono - the left eye is set to SC_mono and
|
|
// activated; the right eye is deactivated.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_stereo_channel(Lens::StereoChannel stereo_channel) {
|
|
DisplayRegion::set_stereo_channel(stereo_channel);
|
|
if (!is_active()) {
|
|
return;
|
|
}
|
|
|
|
switch (stereo_channel) {
|
|
case Lens::SC_stereo:
|
|
_left_eye->set_stereo_channel(Lens::SC_left);
|
|
_left_eye->set_active(true);
|
|
_right_eye->set_stereo_channel(Lens::SC_right);
|
|
_right_eye->set_active(true);
|
|
break;
|
|
|
|
case Lens::SC_left:
|
|
_left_eye->set_stereo_channel(Lens::SC_left);
|
|
_left_eye->set_active(true);
|
|
_right_eye->set_active(false);
|
|
break;
|
|
|
|
case Lens::SC_right:
|
|
_left_eye->set_active(false);
|
|
_right_eye->set_stereo_channel(Lens::SC_right);
|
|
_right_eye->set_active(true);
|
|
break;
|
|
|
|
case Lens::SC_mono:
|
|
_left_eye->set_stereo_channel(Lens::SC_mono);
|
|
_left_eye->set_active(true);
|
|
_right_eye->set_active(false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_incomplete_render
|
|
// Access: Published, Virtual
|
|
// Description: Sets the incomplete_render flag on both the left and
|
|
// right DisplayRegions to the indicated value.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_incomplete_render(bool incomplete_render) {
|
|
DisplayRegion::set_incomplete_render(incomplete_render);
|
|
_left_eye->set_incomplete_render(incomplete_render);
|
|
_right_eye->set_incomplete_render(incomplete_render);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_texture_reload_priority
|
|
// Access: Published, Virtual
|
|
// Description: Sets the texture_reload_priority on both the left and
|
|
// right DisplayRegions to the indicated value.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_texture_reload_priority(int texture_reload_priority) {
|
|
DisplayRegion::set_texture_reload_priority(texture_reload_priority);
|
|
_left_eye->set_texture_reload_priority(texture_reload_priority);
|
|
_right_eye->set_texture_reload_priority(texture_reload_priority);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_cull_traverser
|
|
// Access: Published, Virtual
|
|
// Description: Sets the CullTraverser for both the left and right
|
|
// DisplayRegions.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_cull_traverser(CullTraverser *trav) {
|
|
DisplayRegion::set_cull_traverser(trav);
|
|
_left_eye->set_cull_traverser(trav);
|
|
_right_eye->set_cull_traverser(trav);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::set_cube_map_index
|
|
// Access: Published, Virtual
|
|
// Description: Sets the cube_map_index on both the left and
|
|
// right DisplayRegions to the indicated value.
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
set_cube_map_index(int cube_map_index) {
|
|
DisplayRegion::set_cube_map_index(cube_map_index);
|
|
_left_eye->set_cube_map_index(cube_map_index);
|
|
_right_eye->set_cube_map_index(cube_map_index);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::output
|
|
// Access: Published, Virtual
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
void StereoDisplayRegion::
|
|
output(ostream &out) const {
|
|
out << "StereoDisplayRegion(" << *_left_eye << ")";
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: StereoDisplayRegion::make_cull_result_graph
|
|
// Access: Published, Virtual
|
|
// Description: Returns a special scene graph constructed to
|
|
// represent the results of the last frame's cull
|
|
// operation.
|
|
////////////////////////////////////////////////////////////////////
|
|
PT(PandaNode) StereoDisplayRegion::
|
|
make_cull_result_graph() {
|
|
PT(PandaNode) root = new PandaNode("stereo");
|
|
|
|
PT(PandaNode) left = _left_eye->make_cull_result_graph();
|
|
left->set_name("left");
|
|
root->add_child(left, _left_eye->get_sort());
|
|
|
|
PT(PandaNode) right = _right_eye->make_cull_result_graph();
|
|
right->set_name("right");
|
|
root->add_child(right, _right_eye->get_sort());
|
|
|
|
return root;
|
|
}
|