Panda3D
 All Classes Functions Variables Enumerations
displayRegion.h
00001 // Filename: displayRegion.h
00002 // Created by:  mike (09Jan97)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #ifndef DISPLAYREGION_H
00016 #define DISPLAYREGION_H
00017 
00018 #include "pandabase.h"
00019 
00020 #include "displayRegionBase.h"
00021 #include "drawableRegion.h"
00022 #include "referenceCount.h"
00023 #include "nodePath.h"
00024 #include "cullResult.h"
00025 #include "sceneSetup.h"
00026 #include "pointerTo.h"
00027 #include "cycleData.h"
00028 #include "cycleDataLockedReader.h"
00029 #include "cycleDataReader.h"
00030 #include "cycleDataWriter.h"
00031 #include "cycleDataStageWriter.h"
00032 #include "pipelineCycler.h"
00033 #include "config_display.h"
00034 #include "lens.h"
00035 #include "deletedChain.h"
00036 #include "plist.h"
00037 #include "pStatCollector.h"
00038 #include "cullTraverser.h"
00039 #include "callbackObject.h"
00040 #include "luse.h"
00041 
00042 class GraphicsOutput;
00043 class GraphicsPipe;
00044 class CullHandler;
00045 class Camera;
00046 class PNMImage;
00047 class CullTraverser;
00048 
00049 ////////////////////////////////////////////////////////////////////
00050 //       Class : DisplayRegion
00051 // Description : A rectangular subregion within a window for rendering
00052 //               into.  Typically, there is one DisplayRegion that
00053 //               covers the whole window, but you may also create
00054 //               smaller DisplayRegions for having different regions
00055 //               within the window that represent different scenes.
00056 //               You may also stack up DisplayRegions like panes of
00057 //               glass, usually for layering 2-d interfaces on top of
00058 //               a 3-d scene.
00059 ////////////////////////////////////////////////////////////////////
00060 class EXPCL_PANDA_DISPLAY DisplayRegion : public DisplayRegionBase, public DrawableRegion {
00061 protected:
00062   DisplayRegion(GraphicsOutput *window, const LVecBase4 &dimensions);
00063 
00064 private:
00065   DisplayRegion(const DisplayRegion &copy);
00066   void operator = (const DisplayRegion &copy);
00067 
00068 public:
00069   virtual ~DisplayRegion();
00070   void cleanup();
00071 
00072   INLINE bool operator < (const DisplayRegion &other) const;
00073 
00074 PUBLISHED:
00075   INLINE void get_dimensions(PN_stdfloat &l, PN_stdfloat &r, PN_stdfloat &b, PN_stdfloat &t) const;
00076   INLINE LVecBase4 get_dimensions() const;
00077   INLINE PN_stdfloat get_left() const;
00078   INLINE PN_stdfloat get_right() const;
00079   INLINE PN_stdfloat get_bottom() const;
00080   INLINE PN_stdfloat get_top() const;
00081   INLINE void set_dimensions(PN_stdfloat l, PN_stdfloat r, PN_stdfloat b, PN_stdfloat t);
00082   virtual void set_dimensions(const LVecBase4 &dimensions);
00083 
00084   INLINE GraphicsOutput *get_window() const;
00085   GraphicsPipe *get_pipe() const;
00086   virtual bool is_stereo() const;
00087 
00088   virtual void set_camera(const NodePath &camera);
00089   INLINE NodePath get_camera(Thread *current_thread = Thread::get_current_thread()) const;
00090 
00091   virtual void set_active(bool active);
00092   INLINE bool is_active() const;
00093 
00094   virtual void set_sort(int sort);
00095   INLINE int get_sort() const;
00096 
00097   virtual void set_stereo_channel(Lens::StereoChannel stereo_channel);
00098   INLINE Lens::StereoChannel get_stereo_channel() const;
00099   virtual void set_tex_view_offset(int tex_view_offset);
00100   INLINE int get_tex_view_offset() const;
00101 
00102   virtual void set_incomplete_render(bool incomplete_render);
00103   INLINE bool get_incomplete_render() const;
00104 
00105   virtual void set_texture_reload_priority(int texture_reload_priority);
00106   INLINE int get_texture_reload_priority() const;
00107 
00108   void set_lens_index(int index);
00109   INLINE int get_lens_index() const;
00110 
00111   virtual void set_cull_traverser(CullTraverser *trav);
00112   CullTraverser *get_cull_traverser();
00113 
00114   virtual void set_cube_map_index(int cube_map_index);
00115   INLINE int get_cube_map_index() const;
00116 
00117   INLINE void set_cull_callback(CallbackObject *object);
00118   INLINE void clear_cull_callback();
00119   INLINE CallbackObject *get_cull_callback() const;
00120 
00121   INLINE void set_draw_callback(CallbackObject *object);
00122   INLINE void clear_draw_callback();
00123   INLINE CallbackObject *get_draw_callback() const;
00124 
00125   INLINE int get_pixel_width() const;
00126   INLINE int get_pixel_height() const;
00127 
00128   virtual void output(ostream &out) const;
00129 
00130   static Filename make_screenshot_filename(
00131     const string &prefix = "screenshot");
00132   Filename save_screenshot_default(const string &prefix = "screenshot");
00133   bool save_screenshot(
00134     const Filename &filename, const string &image_comment = "");
00135   bool get_screenshot(PNMImage &image);
00136   PT(Texture) get_screenshot();
00137 
00138   virtual PT(PandaNode) make_cull_result_graph();
00139 
00140 public:
00141   void compute_pixels();
00142   void compute_pixels_all_stages();
00143   void compute_pixels(int x_size, int y_size);
00144   void compute_pixels_all_stages(int x_size, int y_size);
00145   INLINE void get_pixels(int &pl, int &pr, int &pb, int &pt) const;
00146   INLINE void get_region_pixels(int &xo, int &yo, int &w, int &h) const;
00147   INLINE void get_region_pixels_i(int &xo, int &yo, int &w, int &h) const;
00148 
00149   virtual bool supports_pixel_zoom() const;
00150 
00151   INLINE void set_cull_result(CullResult *cull_result, SceneSetup *scene_setup,
00152                               Thread *current_thread);
00153   INLINE CullResult *get_cull_result(Thread *current_thread) const;
00154   INLINE SceneSetup *get_scene_setup(Thread *current_thread) const;
00155 
00156   INLINE PStatCollector &get_cull_region_pcollector();
00157   INLINE PStatCollector &get_draw_region_pcollector();
00158 
00159 private:
00160   class CData;
00161 
00162   void win_display_regions_changed();
00163   void do_compute_pixels(int x_size, int y_size, CData *cdata);
00164   void set_active_index(int index);
00165 
00166 protected:
00167   virtual void do_cull(CullHandler *cull_handler, SceneSetup *scene_setup,
00168                        GraphicsStateGuardian *gsg, Thread *current_thread);
00169 
00170 protected:
00171   // The associated window is a permanent property of the
00172   // DisplayRegion.  It doesn't need to be cycled.
00173   GraphicsOutput *_window;
00174 
00175   bool _incomplete_render;
00176   int _texture_reload_priority;
00177 
00178   // Ditto for the cull traverser.
00179   PT(CullTraverser) _trav;
00180 
00181 private:
00182   // This is the data that is associated with the DisplayRegion that
00183   // needs to be cycled every frame, but represents the parameters as
00184   // specified by the user, and which probably will not change that
00185   // often.
00186   class EXPCL_PANDA_DISPLAY CData : public CycleData {
00187   public:
00188     CData();
00189     CData(const CData &copy);
00190 
00191     virtual CycleData *make_copy() const;
00192     virtual TypeHandle get_parent_type() const {
00193       return DisplayRegion::get_class_type();
00194     }
00195 
00196     LVecBase4 _dimensions;  // left, right, bottom, top
00197     
00198     int _pl;
00199     int _pr;
00200     int _pb;
00201     int _pt;
00202     int _pbi;
00203     int _pti;
00204     int _lens_index; // index into which lens of a camera is associated with this display region.  0 is default
00205     
00206     NodePath _camera;
00207     Camera *_camera_node;
00208     
00209     bool _active;
00210     int _sort;
00211     Lens::StereoChannel _stereo_channel;
00212     int _tex_view_offset;
00213     int _cube_map_index;
00214 
00215     PT(CallbackObject) _cull_callback;
00216     PT(CallbackObject) _draw_callback;
00217   };
00218 
00219   PipelineCycler<CData> _cycler;
00220   typedef CycleDataLockedReader<CData> CDLockedReader;
00221   typedef CycleDataReader<CData> CDReader;
00222   typedef CycleDataWriter<CData> CDWriter;
00223   typedef CycleDataStageWriter<CData> CDStageWriter;
00224 
00225   // This is a special cycler created to hold the results from the
00226   // cull traversal, for (a) the draw traversal, and (b) the next
00227   // frame's cull traversal.  It needs to be cycled, but it gets its
00228   // own cycler because it will certainly change every frame, so we
00229   // don't need to lump all the heavy data above in with this
00230   // lightweight cycler.
00231   class EXPCL_PANDA_DISPLAY CDataCull : public CycleData {
00232   public:
00233     CDataCull();
00234     CDataCull(const CDataCull &copy);
00235 
00236     virtual CycleData *make_copy() const;
00237     virtual TypeHandle get_parent_type() const {
00238       return DisplayRegion::get_class_type();
00239     }
00240 
00241     PT(CullResult) _cull_result;
00242     PT(SceneSetup) _scene_setup;
00243   };
00244   PipelineCycler<CDataCull> _cycler_cull;
00245   typedef CycleDataReader<CDataCull> CDCullReader;
00246   typedef CycleDataWriter<CDataCull> CDCullWriter;
00247 
00248   PStatCollector _cull_region_pcollector;
00249   PStatCollector _draw_region_pcollector;
00250 
00251 public:
00252   static TypeHandle get_class_type() {
00253     return _type_handle;
00254   }
00255   static void init_type() {
00256     DisplayRegionBase::init_type();
00257     register_type(_type_handle, "DisplayRegion",
00258                   DisplayRegionBase::get_class_type());
00259   }
00260   virtual TypeHandle get_type() const {
00261     return get_class_type();
00262   }
00263   virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00264 
00265 private:
00266   static TypeHandle _type_handle;
00267 
00268   friend class GraphicsEngine;
00269   friend class GraphicsOutput;
00270   friend class DisplayRegionCullCallbackData;
00271   friend class DisplayRegionPipelineReader;
00272 };
00273 
00274 ////////////////////////////////////////////////////////////////////
00275 //       Class : DisplayRegionPipelineReader
00276 // Description : Encapsulates the data from a DisplayRegion,
00277 //               pre-fetched for one stage of the pipeline.
00278 ////////////////////////////////////////////////////////////////////
00279 class EXPCL_PANDA_DISPLAY DisplayRegionPipelineReader {
00280 public:
00281   INLINE DisplayRegionPipelineReader(DisplayRegion *object, Thread *current_thread);
00282 private:
00283   INLINE DisplayRegionPipelineReader(const DisplayRegionPipelineReader &copy);
00284   INLINE void operator = (const DisplayRegionPipelineReader &copy);
00285 
00286 public:
00287   INLINE ~DisplayRegionPipelineReader();
00288   ALLOC_DELETED_CHAIN(DisplayRegionPipelineReader);
00289 
00290   INLINE DisplayRegion *get_object() const;
00291   INLINE Thread *get_current_thread() const;
00292 
00293   INLINE bool is_any_clear_active() const;
00294 
00295   INLINE void get_dimensions(PN_stdfloat &l, PN_stdfloat &r, PN_stdfloat &b, PN_stdfloat &t) const;
00296   INLINE const LVecBase4 &get_dimensions() const;
00297   INLINE PN_stdfloat get_left() const;
00298   INLINE PN_stdfloat get_right() const;
00299   INLINE PN_stdfloat get_bottom() const;
00300   INLINE PN_stdfloat get_top() const;
00301 
00302   INLINE GraphicsOutput *get_window() const;
00303   GraphicsPipe *get_pipe() const;
00304 
00305   INLINE NodePath get_camera() const;
00306   INLINE bool is_active() const;
00307   INLINE int get_sort() const;
00308   INLINE Lens::StereoChannel get_stereo_channel() const;
00309   INLINE int get_tex_view_offset();
00310   INLINE bool get_clear_depth_between_eyes() const;
00311   INLINE int get_cube_map_index() const;
00312   INLINE CallbackObject *get_draw_callback() const;
00313 
00314   INLINE void get_pixels(int &pl, int &pr, int &pb, int &pt) const;
00315   INLINE void get_region_pixels(int &xo, int &yo, int &w, int &h) const;
00316   INLINE void get_region_pixels_i(int &xo, int &yo, int &w, int &h) const;
00317 
00318   INLINE int get_pixel_width() const;
00319   INLINE int get_pixel_height() const;
00320 
00321   INLINE int get_lens_index() const;
00322 
00323 private:
00324   DisplayRegion *_object;
00325   Thread *_current_thread;
00326   const DisplayRegion::CData *_cdata;
00327 
00328 public:
00329   static TypeHandle get_class_type() {
00330     return _type_handle;
00331   }
00332   static void init_type() {
00333     register_type(_type_handle, "DisplayRegionPipelineReader");
00334   }
00335 
00336 private:
00337   static TypeHandle _type_handle;
00338 };
00339 
00340 #include "displayRegion.I"
00341 
00342 #endif /* DISPLAYREGION_H */
 All Classes Functions Variables Enumerations