Panda3D
Classes | Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
NonlinearImager Class Reference

This class object combines the rendered output of a 3-d from one or more linear (e.g. More...

#include "nonlinearImager.h"

Public Member Functions

int add_screen (ProjectionScreen *screen)
 This version of this method is deprecated and will soon be removed. More...
 
int add_screen (const NodePath &screen, const std::string &name)
 Adds a new ProjectionScreen to the list of screens that will be processed by the NonlinearImager. More...
 
int add_viewer (DisplayRegion *dr)
 Adds the indicated DisplayRegion as a viewer into the NonlinearImager room. More...
 
int find_screen (const NodePath &screen) const
 Returns the index number of the first appearance of the indicated screen within the imager's list, or -1 if it does not appear. More...
 
int find_viewer (DisplayRegion *dr) const
 Returns the index number of the indicated DisplayRegion within the list of viewers, or -1 if it is not found. More...
 
GraphicsOutputget_buffer (int index) const
 
NodePath get_dark_room () const
 Returns the NodePath to the root of the dark room scene. More...
 
GraphicsEngineget_graphics_engine () const
 Returns the GraphicsEngine that all of the viewers added to the NonlinearImager have in common. More...
 
int get_num_screens () const
 
int get_num_viewers () const
 
NodePath get_screen (int index) const
 
bool get_screen_active (int index) const
 Returns the active flag on the indicated screen. More...
 
DisplayRegionget_viewer (int index) const
 
NodePath get_viewer_camera (int index) const
 Returns the NodePath to the LensNode that is to serve as nth viewer for this screen. More...
 
NodePath get_viewer_scene (int index) const
 Returns a pointer to the root node of the internal scene graph for the nth viewer, which is used to render all of the screen meshes for this viewer. More...
 
void recompute ()
 Forces a regeneration of all the mesh objects, etc. More...
 
void recompute_if_stale ()
 Calls recompute() if it needs to be called. More...
 
void remove_all_screens ()
 Removes all screens from the imager. More...
 
void remove_all_viewers ()
 Removes all viewers from the imager. More...
 
void remove_screen (int index)
 Removes the screen with the indicated index number from the imager. More...
 
void remove_viewer (int index)
 Removes the viewer with the indicated index number from the imager. More...
 
void set_screen_active (int index, bool active)
 Sets the active flag on the indicated screen. More...
 
void set_source_camera (int index, const NodePath &source_camera)
 Specifies the camera that will be used to render the image for this particular screen. More...
 
void set_texture_size (int index, int width, int height)
 Sets the width and height of the texture used to render the scene for the indicated screen. More...
 
void set_viewer_camera (int index, const NodePath &viewer_camera)
 Specifies the LensNode that is to serve as the viewer for this screen. More...
 

Static Public Member Functions

static AsyncTask::DoneStatus recompute_callback (GenericAsyncTask *task, void *data)
 This function is added as a task, to ensure that all frames are up-to-date. More...
 

Public Attributes

 get_buffer
 Returns the offscreen buffer that is automatically created for the nth projection screen. More...
 
 get_num_screens
 Returns the number of screens that have been added to the imager. More...
 
 get_num_viewers
 Returns the number of viewers that have been added to the imager. More...
 
 get_screen
 Returns the nth screen that has been added to the imager. More...
 
 get_viewer
 Returns the nth viewer's DisplayRegion that has been added to the imager. More...
 

Detailed Description

This class object combines the rendered output of a 3-d from one or more linear (e.g.

perspective) cameras, as seen through a single, possibly nonlinear camera.

This can be used to generate real-time imagery of a 3-d scene using a nonlinear camera, for instance a fisheye camera, even though the underlying graphics engine may only support linear cameras. It can also pre-distort imagery to compensate for off-axis projectors, and/or curved screens of any complexity.

A NonlinearImager may be visualized as a dark room into which a number of projection screens have been placed, of arbitrary size and shape and at any arbitrary position and orientation to each other. Onto each of these screens is projected the view as seen by a normal perspective camera that exists in the world (that is, under render).

There also exist in the room one or more (possibly nonlinear) cameras, called viewers, that observe these screens. The image of the projection screens seen by each viewer is finally displayed on the viewer's associated DisplayRegion. By placing the viewer(s) appropriately relative to the screens, and by choosing suitable lens properties for the viewer(s), you can achieve a wide variety of distortion effects.

There are several different LensNode (Camera) objects involved at each stage in the process. To help keep them all straight, different words are used to refer to each different kind of Camera used within this object. The camera(s) under render, that capture the original view of the world to be projected onto the screens, are called source cameras, and are set per screen via set_source_camera(). The LensNode that is associated with each screen to project the image as seen from the screen's source camera is called a projector; these are set via the ProjectionScreen::set_projector() interface. Finally, the cameras that view the whole configuration of screens are called viewers; each of these is associated with a DisplayRegion, and they are set via set_viewer_camera().

Of all these lenses, only the source cameras must use linear (that is, perspective or orthographic) lenses. The projectors and viewers may be any arbitrary lens, linear or otherwise.

Definition at line 81 of file nonlinearImager.h.

Member Function Documentation

◆ add_screen() [1/2]

int NonlinearImager::add_screen ( ProjectionScreen screen)

This version of this method is deprecated and will soon be removed.

Use the version that takes two parameters instead.

Definition at line 54 of file nonlinearImager.cxx.

◆ add_screen() [2/2]

int NonlinearImager::add_screen ( const NodePath screen,
const std::string &  name 
)

Adds a new ProjectionScreen to the list of screens that will be processed by the NonlinearImager.

Each ProjectionScreen represents a view into the world. It must be based on a linear camera (or whatever kind of camera is respected by the graphics engine).

Each ProjectionScreen object should already have some screen geometry created.

As each frame is rendered, an offscreen image will be rendered from the source camera associated with each ProjectionScreen, and the resulting image will be applied to the screen geometry.

The return value is the index number of the new screen.

Definition at line 74 of file nonlinearImager.cxx.

◆ add_viewer()

int NonlinearImager::add_viewer ( DisplayRegion dr)

Adds the indicated DisplayRegion as a viewer into the NonlinearImager room.

The camera associated with the DisplayRegion at the time add_viewer() is called is used as the initial viewer camera; it may have a nonlinear lens, like a fisheye or cylindrical lens.

This sets up a special scene graph for this DisplayRegion alone and sets up the DisplayRegion with a specialty camera. If future changes to the camera are desired, you should use the set_viewer_camera() interface.

All viewers must share the same GraphicsEngine.

The return value is the index of the new viewer.

Definition at line 277 of file nonlinearImager.cxx.

References DisplayRegion::get_window.

◆ find_screen()

int NonlinearImager::find_screen ( const NodePath screen) const

Returns the index number of the first appearance of the indicated screen within the imager's list, or -1 if it does not appear.

Definition at line 113 of file nonlinearImager.cxx.

◆ find_viewer()

int NonlinearImager::find_viewer ( DisplayRegion dr) const

Returns the index number of the indicated DisplayRegion within the list of viewers, or -1 if it is not found.

Definition at line 357 of file nonlinearImager.cxx.

◆ get_dark_room()

NodePath NonlinearImager::get_dark_room ( ) const

Returns the NodePath to the root of the dark room scene.

This is the scene in which all of the ProjectionScreens and the viewer cameras reside. It's a standalone scene with a few projection screens arranged artfully around one or more viewers; it's so named because it's a little virtual theater.

Normally this scene is not rendered directly; it only exists as an abstract concept, and to define the relation between the ProjectionScreens and the viewers. But it may be rendered to help visualize the NonlinearImager's behavior.

Definition at line 482 of file nonlinearImager.cxx.

◆ get_graphics_engine()

GraphicsEngine * NonlinearImager::get_graphics_engine ( ) const

Returns the GraphicsEngine that all of the viewers added to the NonlinearImager have in common.

Definition at line 491 of file nonlinearImager.cxx.

◆ get_screen_active()

bool NonlinearImager::get_screen_active ( int  index) const

Returns the active flag on the indicated screen.

Definition at line 256 of file nonlinearImager.cxx.

◆ get_viewer_camera()

NodePath NonlinearImager::get_viewer_camera ( int  index) const

Returns the NodePath to the LensNode that is to serve as nth viewer for this screen.

Definition at line 433 of file nonlinearImager.cxx.

◆ get_viewer_scene()

NodePath NonlinearImager::get_viewer_scene ( int  index) const

Returns a pointer to the root node of the internal scene graph for the nth viewer, which is used to render all of the screen meshes for this viewer.

This is the scene graph in which the screen meshes within the dark room have been flattened into the appropriate transformation according to the viewer's lens properties (and position relative to the screens). It is this scene graph that is finally rendered to the window.

Definition at line 448 of file nonlinearImager.cxx.

◆ recompute()

void NonlinearImager::recompute ( )

Forces a regeneration of all the mesh objects, etc.

Definition at line 499 of file nonlinearImager.cxx.

Referenced by recompute_if_stale().

◆ recompute_callback()

AsyncTask::DoneStatus NonlinearImager::recompute_callback ( GenericAsyncTask task,
void *  data 
)
static

This function is added as a task, to ensure that all frames are up-to-date.

Definition at line 526 of file nonlinearImager.cxx.

◆ recompute_if_stale()

void NonlinearImager::recompute_if_stale ( )

Calls recompute() if it needs to be called.

Definition at line 536 of file nonlinearImager.cxx.

References recompute().

◆ remove_all_screens()

void NonlinearImager::remove_all_screens ( )

Removes all screens from the imager.

Definition at line 140 of file nonlinearImager.cxx.

References remove_screen().

◆ remove_all_viewers()

void NonlinearImager::remove_all_viewers ( )

Removes all viewers from the imager.

Definition at line 393 of file nonlinearImager.cxx.

References remove_viewer().

◆ remove_screen()

void NonlinearImager::remove_screen ( int  index)

Removes the screen with the indicated index number from the imager.

Definition at line 127 of file nonlinearImager.cxx.

Referenced by remove_all_screens().

◆ remove_viewer()

void NonlinearImager::remove_viewer ( int  index)

Removes the viewer with the indicated index number from the imager.

Definition at line 371 of file nonlinearImager.cxx.

Referenced by remove_all_viewers().

◆ set_screen_active()

void NonlinearImager::set_screen_active ( int  index,
bool  active 
)

Sets the active flag on the indicated screen.

If the active flag is true, the screen will be used; otherwise, it will not appear.

Definition at line 220 of file nonlinearImager.cxx.

◆ set_source_camera()

void NonlinearImager::set_source_camera ( int  index,
const NodePath source_camera 
)

Specifies the camera that will be used to render the image for this particular screen.

The parameter must be a NodePath whose node is a Camera. The camera itself indicates the scene that is to be rendered.

Definition at line 208 of file nonlinearImager.cxx.

◆ set_texture_size()

void NonlinearImager::set_texture_size ( int  index,
int  width,
int  height 
)

Sets the width and height of the texture used to render the scene for the indicated screen.

This must be less than or equal to the window size, and it should be a power of two.

In general, the larger the texture, the greater the detail of the rendered scene.

Definition at line 183 of file nonlinearImager.cxx.

◆ set_viewer_camera()

void NonlinearImager::set_viewer_camera ( int  index,
const NodePath viewer_camera 
)

Specifies the LensNode that is to serve as the viewer for this screen.

The relative position of the LensNode to the NonlinearImager, as well as the properties of the lens associated with the LensNode, determines the UV's that will be assigned to the geometry within the NonlinearImager.

It is not necessary to call this except to change the camera after a viewer has been added, since the default is to use whatever camera is associated with the DisplayRegion at the time the viewer is added.

The NodePath must refer to a LensNode (or a Camera).

Definition at line 412 of file nonlinearImager.cxx.

Member Data Documentation

◆ get_buffer

GraphicsOutput * NonlinearImager::get_buffer

Returns the offscreen buffer that is automatically created for the nth projection screen.

This may return NULL if the screen is inactive or if it has not been rendered yet.

Definition at line 96 of file nonlinearImager.h.

◆ get_num_screens

int NonlinearImager::get_num_screens

Returns the number of screens that have been added to the imager.

Definition at line 94 of file nonlinearImager.h.

◆ get_num_viewers

int NonlinearImager::get_num_viewers

Returns the number of viewers that have been added to the imager.

Definition at line 115 of file nonlinearImager.h.

◆ get_screen

NodePath NonlinearImager::get_screen

Returns the nth screen that has been added to the imager.

Definition at line 94 of file nonlinearImager.h.

◆ get_viewer

DisplayRegion * NonlinearImager::get_viewer

Returns the nth viewer's DisplayRegion that has been added to the imager.

Definition at line 115 of file nonlinearImager.h.


The documentation for this class was generated from the following files: