00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SHADERATTRIB_H
00019 #define SHADERATTRIB_H
00020
00021 #include "pandabase.h"
00022 #include "renderAttrib.h"
00023 #include "pointerTo.h"
00024 #include "shaderInput.h"
00025 #include "shader.h"
00026 #include "pta_float.h"
00027 #include "pta_double.h"
00028 #include "pta_LMatrix4.h"
00029 #include "pta_LMatrix3.h"
00030 #include "pta_LVecBase4.h"
00031 #include "pta_LVecBase3.h"
00032 #include "pta_LVecBase2.h"
00033
00034
00035
00036
00037
00038
00039 class EXPCL_PANDA_PGRAPH ShaderAttrib: public RenderAttrib {
00040
00041 private:
00042 INLINE ShaderAttrib();
00043 INLINE ShaderAttrib(const ShaderAttrib ©);
00044
00045 PUBLISHED:
00046 static CPT(RenderAttrib) make();
00047 static CPT(RenderAttrib) make_off();
00048 static CPT(RenderAttrib) make_default();
00049
00050 enum {
00051 F_disable_alpha_write = 0,
00052 F_subsume_alpha_test = 1,
00053 };
00054
00055 INLINE bool has_shader() const;
00056 INLINE bool auto_shader() const;
00057 INLINE int get_shader_priority() const;
00058 INLINE int get_instance_count() const;
00059 INLINE bool auto_normal_on() const;
00060 INLINE bool auto_glow_on() const;
00061 INLINE bool auto_gloss_on() const;
00062 INLINE bool auto_ramp_on() const;
00063 INLINE bool auto_shadow_on() const;
00064
00065 CPT(RenderAttrib) set_shader(const Shader *s, int priority=0) const;
00066 CPT(RenderAttrib) set_shader_off(int priority=0) const;
00067 CPT(RenderAttrib) set_shader_auto(int priority=0) const;
00068
00069 CPT(RenderAttrib) set_shader_auto(BitMask32 shader_switch, int priority=0) const;
00070
00071 CPT(RenderAttrib) clear_shader() const;
00072
00073 CPT(RenderAttrib) set_shader_input(const ShaderInput *inp) const;
00074
00075
00076 CPT(RenderAttrib) set_shader_input(const InternalName *id, Texture *tex, int priority=0) const;
00077 CPT(RenderAttrib) set_shader_input(const InternalName *id, const NodePath &np, int priority=0) const;
00078 CPT(RenderAttrib) set_shader_input(const InternalName *id, const PTA_float &v, int priority=0) const;
00079 CPT(RenderAttrib) set_shader_input(const InternalName *id, const PTA_double &v, int priority=0) const;
00080 CPT(RenderAttrib) set_shader_input(const InternalName *id, const PTA_LMatrix4 &v, int priority=0) const;
00081 CPT(RenderAttrib) set_shader_input(const InternalName *id, const PTA_LMatrix3 &v, int priority=0) const;
00082 CPT(RenderAttrib) set_shader_input(const InternalName *id, const PTA_LVecBase4 &v, int priority=0) const;
00083 CPT(RenderAttrib) set_shader_input(const InternalName *id, const PTA_LVecBase3 &v, int priority=0) const;
00084 CPT(RenderAttrib) set_shader_input(const InternalName *id, const PTA_LVecBase2 &v, int priority=0) const;
00085 CPT(RenderAttrib) set_shader_input(const InternalName *id, const LVecBase4 &v, int priority=0) const;
00086 CPT(RenderAttrib) set_shader_input(const InternalName *id, const LVecBase3 &v, int priority=0) const;
00087 CPT(RenderAttrib) set_shader_input(const InternalName *id, const LVecBase2 &v, int priority=0) const;
00088 CPT(RenderAttrib) set_shader_input(const InternalName *id, const LMatrix4 &v, int priority=0) const;
00089 CPT(RenderAttrib) set_shader_input(const InternalName *id, const LMatrix3 &v, int priority=0) const;
00090 CPT(RenderAttrib) set_shader_input(const InternalName *id, double n1=0, double n2=0, double n3=0, double n4=1,
00091 int priority=0) const;
00092
00093 CPT(RenderAttrib) set_instance_count(int instance_count) const;
00094
00095 CPT(RenderAttrib) set_flag(int flag, bool value) const;
00096 CPT(RenderAttrib) clear_flag(int flag) const;
00097
00098 CPT(RenderAttrib) clear_shader_input(const InternalName *id) const;
00099 CPT(RenderAttrib) clear_shader_input(const string &id) const;
00100
00101 CPT(RenderAttrib) clear_all_shader_inputs() const;
00102
00103 INLINE bool get_flag(int flag) const;
00104
00105 const Shader *get_shader() const;
00106 const ShaderInput *get_shader_input(const InternalName *id) const;
00107 const ShaderInput *get_shader_input(const string &id) const;
00108
00109 const NodePath &get_shader_input_nodepath(const InternalName *id) const;
00110 const LVecBase4 &get_shader_input_vector(InternalName *id) const;
00111 Texture *get_shader_input_texture(const InternalName *id) const;
00112 const Shader::ShaderPtrData *get_shader_input_ptr(const InternalName *id) const;
00113
00114 static void register_with_read_factory();
00115
00116 public:
00117
00118 protected:
00119 virtual int compare_to_impl(const RenderAttrib *other) const;
00120 virtual size_t get_hash_impl() const;
00121 virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const;
00122 virtual CPT(RenderAttrib) get_auto_shader_attrib_impl(const RenderState *state) const;
00123
00124 private:
00125
00126 CPT(Shader) _shader;
00127 int _shader_priority;
00128 bool _auto_shader;
00129 bool _has_shader;
00130 int _flags;
00131 int _has_flags;
00132 int _instance_count;
00133
00134 bool _auto_normal_on;
00135 bool _auto_glow_on;
00136 bool _auto_gloss_on;
00137 bool _auto_ramp_on;
00138 bool _auto_shadow_on;
00139
00140 typedef pmap < CPT(InternalName), CPT(ShaderInput) > Inputs;
00141 Inputs _inputs;
00142
00143 PUBLISHED:
00144 static int get_class_slot() {
00145 return _attrib_slot;
00146 }
00147 virtual int get_slot() const {
00148 return get_class_slot();
00149 }
00150
00151 public:
00152 static TypeHandle get_class_type() {
00153 return _type_handle;
00154 }
00155 static void init_type() {
00156 RenderAttrib::init_type();
00157 register_type(_type_handle, "ShaderAttrib",
00158 RenderAttrib::get_class_type());
00159 _attrib_slot = register_slot(_type_handle, 10, make_default);
00160 }
00161 virtual TypeHandle get_type() const {
00162 return get_class_type();
00163 }
00164 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00165
00166 private:
00167 static TypeHandle _type_handle;
00168 static int _attrib_slot;
00169 };
00170
00171
00172 #include "shaderAttrib.I"
00173
00174 #endif // SHADERATTRIB_H
00175
00176
00177