Panda3D
 All Classes Functions Variables Enumerations
scissorEffect.h
00001 // Filename: scissorEffect.h
00002 // Created by:  drose (30Jul08)
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 SCISSOREFFECT_H
00016 #define SCISSOREFFECT_H
00017 
00018 #include "pandabase.h"
00019 
00020 #include "renderEffect.h"
00021 #include "luse.h"
00022 #include "nodePath.h"
00023 
00024 ////////////////////////////////////////////////////////////////////
00025 //       Class : ScissorEffect
00026 // Description : This provides a higher-level wrapper around
00027 //               ScissorAttrib.  It allows for the scissor region to
00028 //               be defined via points relative to the current node,
00029 //               and also performs culling based on the scissor
00030 //               region.
00031 ////////////////////////////////////////////////////////////////////
00032 class EXPCL_PANDA_PGRAPH ScissorEffect : public RenderEffect {
00033 private:
00034   class PointDef {
00035   public:
00036     LPoint3 _p;
00037     NodePath _node;
00038   };
00039 
00040   ScissorEffect(bool screen, const LVecBase4 &frame,
00041                 const PointDef *points, int num_points, bool clip);
00042   ScissorEffect(const ScissorEffect &copy);
00043 
00044 PUBLISHED:
00045   static CPT(RenderEffect) make_screen(const LVecBase4 &frame, bool clip = true);
00046   static CPT(RenderEffect) make_node(bool clip = true);
00047   static CPT(RenderEffect) make_node(const LPoint3 &a, const LPoint3 &b, const NodePath &node = NodePath());
00048   static CPT(RenderEffect) make_node(const LPoint3 &a, const LPoint3 &b, const LPoint3 &c, const LPoint3 &d, const NodePath &node = NodePath());
00049   CPT(RenderEffect) add_point(const LPoint3 &point, const NodePath &node = NodePath()) const;
00050 
00051   INLINE bool is_screen() const;
00052   INLINE const LVecBase4 &get_frame() const;
00053 
00054   INLINE int get_num_points() const;
00055   INLINE const LPoint3 &get_point(int n) const;
00056   MAKE_SEQ(get_points, get_num_points, get_point);
00057   INLINE NodePath get_node(int n) const;
00058   MAKE_SEQ(get_nodes, get_num_points, get_node);
00059 
00060   INLINE bool get_clip() const;
00061 
00062 public:
00063   virtual CPT(RenderEffect) xform(const LMatrix4 &mat) const;
00064   virtual void output(ostream &out) const;
00065 
00066   virtual bool has_cull_callback() const;
00067   virtual void cull_callback(CullTraverser *trav, CullTraverserData &data,
00068                              CPT(TransformState) &node_transform,
00069                              CPT(RenderState) &node_state) const;
00070 
00071 protected:
00072   virtual int compare_to_impl(const RenderEffect *other) const;
00073 
00074 private:
00075   PT(GeometricBoundingVolume) make_frustum(const Lens *lens, const LVecBase4 &frame) const;
00076 
00077 private:
00078   bool _screen;
00079   LVecBase4 _frame;
00080   typedef pvector<PointDef> Points;
00081   Points _points;
00082   bool _clip;
00083 
00084 public:
00085   static void register_with_read_factory();
00086   virtual void write_datagram(BamWriter *manager, Datagram &dg);
00087 
00088 protected:
00089   static TypedWritable *make_from_bam(const FactoryParams &params);
00090   void fillin(DatagramIterator &scan, BamReader *manager);
00091   
00092 public:
00093   static TypeHandle get_class_type() {
00094     return _type_handle;
00095   }
00096   static void init_type() {
00097     RenderEffect::init_type();
00098     register_type(_type_handle, "ScissorEffect",
00099                   RenderEffect::get_class_type());
00100   }
00101   virtual TypeHandle get_type() const {
00102     return get_class_type();
00103   }
00104   virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00105 
00106 private:
00107   static TypeHandle _type_handle;
00108 };
00109 
00110 #include "scissorEffect.I"
00111 
00112 #endif
00113 
 All Classes Functions Variables Enumerations