00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef RENDEREFFECT_H
00016 #define RENDEREFFECT_H
00017
00018 #include "pandabase.h"
00019
00020 #include "transformState.h"
00021 #include "renderState.h"
00022
00023 #include "typedWritableReferenceCount.h"
00024 #include "pointerTo.h"
00025 #include "pset.h"
00026 #include "luse.h"
00027
00028 class CullTraverser;
00029 class CullTraverserData;
00030 class PandaNode;
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 class EXPCL_PANDA_PGRAPH RenderEffect : public TypedWritableReferenceCount {
00057 protected:
00058 RenderEffect();
00059 private:
00060 RenderEffect(const RenderEffect ©);
00061 void operator = (const RenderEffect ©);
00062
00063 public:
00064 virtual ~RenderEffect();
00065
00066 virtual bool safe_to_transform() const;
00067 virtual CPT(TransformState) prepare_flatten_transform(const TransformState *net_transform) const;
00068 virtual bool safe_to_combine() const;
00069 virtual CPT(RenderEffect) xform(const LMatrix4 &mat) const;
00070
00071 virtual bool has_cull_callback() const;
00072 virtual void cull_callback(CullTraverser *trav, CullTraverserData &data,
00073 CPT(TransformState) &node_transform,
00074 CPT(RenderState) &node_state) const;
00075
00076 virtual bool has_adjust_transform() const;
00077 virtual void adjust_transform(CPT(TransformState) &net_transform,
00078 CPT(TransformState) &node_transform,
00079 PandaNode *node) const;
00080
00081 PUBLISHED:
00082 INLINE int compare_to(const RenderEffect &other) const;
00083
00084 virtual void output(ostream &out) const;
00085 virtual void write(ostream &out, int indent_level) const;
00086
00087 static int get_num_effects();
00088 static void list_effects(ostream &out);
00089 static bool validate_effects();
00090
00091 protected:
00092 static CPT(RenderEffect) return_new(RenderEffect *effect);
00093
00094 virtual int compare_to_impl(const RenderEffect *other) const;
00095
00096 private:
00097 typedef pset<const RenderEffect *, indirect_compare_to<const RenderEffect *> > Effects;
00098 static Effects *_effects;
00099
00100 Effects::iterator _saved_entry;
00101
00102 public:
00103 virtual void write_datagram(BamWriter *manager, Datagram &dg);
00104 static TypedWritable *change_this(TypedWritable *old_ptr, BamReader *manager);
00105 virtual void finalize(BamReader *manager);
00106
00107 protected:
00108 static TypedWritable *new_from_bam(RenderEffect *effect, BamReader *manager);
00109 void fillin(DatagramIterator &scan, BamReader *manager);
00110
00111 public:
00112 static TypeHandle get_class_type() {
00113 return _type_handle;
00114 }
00115 static void init_type() {
00116 TypedWritableReferenceCount::init_type();
00117 register_type(_type_handle, "RenderEffect",
00118 TypedWritableReferenceCount::get_class_type());
00119 }
00120 virtual TypeHandle get_type() const {
00121 return get_class_type();
00122 }
00123 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00124
00125 private:
00126 static TypeHandle _type_handle;
00127 };
00128
00129 INLINE ostream &operator << (ostream &out, const RenderEffect &effect) {
00130 effect.output(out);
00131 return out;
00132 }
00133
00134 #include "renderEffect.I"
00135
00136 #endif
00137