Panda3D
|
00001 // Filename: projectionScreen.h 00002 // Created by: drose (11Dec01) 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 PROJECTIONSCREEN_H 00016 #define PROJECTIONSCREEN_H 00017 00018 #include "pandabase.h" 00019 00020 #include "pandaNode.h" 00021 #include "lensNode.h" 00022 #include "geomNode.h" 00023 #include "nodePath.h" 00024 #include "internalName.h" 00025 #include "pointerTo.h" 00026 00027 class Geom; 00028 class WorkingNodePath; 00029 00030 //////////////////////////////////////////////////////////////////// 00031 // Class : ProjectionScreen 00032 // Description : A ProjectionScreen implements a simple system for 00033 // projective texturing. The ProjectionScreen node is 00034 // the parent of a hierarchy of geometry that is 00035 // considered a "screen"; the ProjectionScreen will 00036 // automatically recompute all the UV's (for a 00037 // particular texture stage) on its subordinate geometry 00038 // according to the relative position and lens 00039 // parameters of the indicated LensNode. 00040 // 00041 // All this does is recompute UV's; the caller is 00042 // responsible for applying the appropriate texture(s) 00043 // to the geometry. 00044 // 00045 // This does not take advantage of any hardware-assisted 00046 // projective texturing; all of the UV's are computed in 00047 // the CPU. (Use NodePath::project_texture() to enable 00048 // hardware-assisted projective texturing.) However, 00049 // the ProjectionScreen interface does support any kind 00050 // of lens, linear or nonlinear, that might be defined 00051 // using the Lens interface, including fisheye and 00052 // cylindrical lenses. 00053 //////////////////////////////////////////////////////////////////// 00054 class EXPCL_PANDAFX ProjectionScreen : public PandaNode { 00055 PUBLISHED: 00056 ProjectionScreen(const string &name = ""); 00057 virtual ~ProjectionScreen(); 00058 00059 protected: 00060 ProjectionScreen(const ProjectionScreen ©); 00061 00062 public: 00063 virtual PandaNode *make_copy() const; 00064 virtual bool cull_callback(CullTraverser *trav, CullTraverserData &data); 00065 00066 PUBLISHED: 00067 void set_projector(const NodePath &projector); 00068 INLINE const NodePath &get_projector() const; 00069 00070 PT(GeomNode) generate_screen(const NodePath &projector, 00071 const string &screen_name, 00072 int num_x_verts, int num_y_verts, 00073 PN_stdfloat distance, PN_stdfloat fill_ratio); 00074 void regenerate_screen(const NodePath &projector, const string &screen_name, 00075 int num_x_verts, int num_y_verts, PN_stdfloat distance, 00076 PN_stdfloat fill_ratio); 00077 PT(PandaNode) make_flat_mesh(const NodePath &this_np, const NodePath &camera); 00078 00079 INLINE void set_texcoord_name(const string &texcoord_name); 00080 INLINE string get_texcoord_name() const; 00081 00082 INLINE void set_invert_uvs(bool invert_uvs); 00083 INLINE bool get_invert_uvs() const; 00084 00085 INLINE void set_vignette_on(bool vignette_on); 00086 INLINE bool get_vignette_on() const; 00087 00088 INLINE void set_vignette_color(const LColor &vignette_color); 00089 INLINE const LColor &get_vignette_color() const; 00090 INLINE void set_frame_color(const LColor &frame_color); 00091 INLINE const LColor &get_frame_color() const; 00092 00093 INLINE void set_auto_recompute(bool auto_recompute); 00094 INLINE bool get_auto_recompute() const; 00095 00096 void recompute(); 00097 INLINE const UpdateSeq &get_last_screen() const; 00098 bool recompute_if_stale(); 00099 bool recompute_if_stale(const NodePath &this_np); 00100 00101 private: 00102 void do_recompute(const NodePath &this_np); 00103 void recompute_node(const WorkingNodePath &np, LMatrix4 &rel_mat, bool &computed_rel_mat); 00104 void recompute_child(const WorkingNodePath &np, LMatrix4 &rel_mat, bool &computed_rel_mat); 00105 void recompute_geom_node(const WorkingNodePath &np, LMatrix4 &rel_mat, bool &computed_rel_mat); 00106 void recompute_geom(Geom *geom, const LMatrix4 &rel_mat); 00107 00108 PandaNode * 00109 make_mesh_node(PandaNode *result_parent, const WorkingNodePath &np, 00110 const NodePath &camera, 00111 LMatrix4 &rel_mat, bool &computed_rel_mat); 00112 void make_mesh_children(PandaNode *new_node, const WorkingNodePath &np, 00113 const NodePath &camera, 00114 LMatrix4 &rel_mat, bool &computed_rel_mat); 00115 PT(GeomNode) make_mesh_geom_node(const WorkingNodePath &np, 00116 const NodePath &camera, 00117 LMatrix4 &rel_mat, 00118 bool &computed_rel_mat); 00119 PT(Geom) make_mesh_geom(const Geom *geom, Lens *lens, LMatrix4 &rel_mat); 00120 00121 00122 NodePath _projector; 00123 PT(LensNode) _projector_node; 00124 PT(InternalName) _texcoord_name; 00125 bool _invert_uvs; 00126 bool _vignette_on; 00127 LColor _vignette_color; 00128 LColor _frame_color; 00129 00130 LMatrix4 _rel_top_mat; 00131 bool _computed_rel_top_mat; 00132 bool _stale; 00133 UpdateSeq _projector_lens_change; 00134 UpdateSeq _last_screen; 00135 bool _auto_recompute; 00136 00137 public: 00138 static TypeHandle get_class_type() { 00139 return _type_handle; 00140 } 00141 static void init_type() { 00142 PandaNode::init_type(); 00143 register_type(_type_handle, "ProjectionScreen", 00144 PandaNode::get_class_type()); 00145 } 00146 virtual TypeHandle get_type() const { 00147 return get_class_type(); 00148 } 00149 virtual TypeHandle force_init_type() {init_type(); return get_class_type();} 00150 00151 private: 00152 static TypeHandle _type_handle; 00153 }; 00154 00155 #include "projectionScreen.I" 00156 00157 #endif