Panda3D
shaderAttrib.h
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file shaderAttrib.h
10  * @author jyelon
11  * @date 2005-09-01
12  * @author fperazzi, PandaSE
13  * @date 2010-04-06
14  * for set_shader_input)
15  * @author weifengh, PandaSE
16  * @date 2010-04-15
17  */
18 
19 #ifndef SHADERATTRIB_H
20 #define SHADERATTRIB_H
21 
22 #include "pandabase.h"
23 #include "renderAttrib.h"
24 #include "pointerTo.h"
25 #include "shaderInput.h"
26 #include "shader.h"
27 #include "pta_float.h"
28 #include "pta_double.h"
29 #include "pta_LMatrix4.h"
30 #include "pta_LMatrix3.h"
31 #include "pta_LVecBase4.h"
32 #include "pta_LVecBase3.h"
33 #include "pta_LVecBase2.h"
34 #include "extension.h"
35 
36 /**
37  *
38  */
39 class EXPCL_PANDA_PGRAPH ShaderAttrib: public RenderAttrib {
40 private:
41  INLINE ShaderAttrib();
42  INLINE ShaderAttrib(const ShaderAttrib &copy);
43 
44 PUBLISHED:
45  static CPT(RenderAttrib) make(const Shader *shader = nullptr, int priority = 0);
46  static CPT(RenderAttrib) make_off();
47  static CPT(RenderAttrib) make_default();
48 
49  enum {
50  F_disable_alpha_write = 0, // Suppress writes to color buffer alpha channel.
51  F_subsume_alpha_test = 1, // Shader promises to subsume the alpha test using TEXKILL
52  F_hardware_skinning = 2, // Shader needs pre-animated vertices
53  F_shader_point_size = 3, // Shader provides point size, not RenderModeAttrib
54  };
55 
56  INLINE bool has_shader() const;
57  INLINE bool auto_shader() const;
58  INLINE int get_shader_priority() const;
59  INLINE int get_instance_count() const;
60  INLINE bool auto_normal_on() const;
61  INLINE bool auto_glow_on() const;
62  INLINE bool auto_gloss_on() const;
63  INLINE bool auto_ramp_on() const;
64  INLINE bool auto_shadow_on() const;
65 
66  CPT(RenderAttrib) set_shader(const Shader *s, int priority=0) const;
67  CPT(RenderAttrib) set_shader_off(int priority=0) const;
68  CPT(RenderAttrib) set_shader_auto(int priority=0) const;
69 
70  CPT(RenderAttrib) set_shader_auto(BitMask32 shader_switch, int priority=0) const;
71 
72  CPT(RenderAttrib) clear_shader() const;
73  // Shader Inputs
74  CPT(RenderAttrib) set_shader_input(const ShaderInput &input) const;
75  CPT(RenderAttrib) set_shader_input(ShaderInput &&input) const;
76 
77 public:
78  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, Texture *tex, int priority=0) const;
79  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const NodePath &np, int priority=0) const;
80  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_float &v, int priority=0) const;
81  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_double &v, int priority=0) const;
82  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_LMatrix4 &v, int priority=0) const;
83  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_LMatrix3 &v, int priority=0) const;
84  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_LVecBase4 &v, int priority=0) const;
85  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_LVecBase3 &v, int priority=0) const;
86  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const PTA_LVecBase2 &v, int priority=0) const;
87  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const LVecBase4 &v, int priority=0) const;
88  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const LVecBase3 &v, int priority=0) const;
89  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const LVecBase2 &v, int priority=0) const;
90  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const LMatrix4 &v, int priority=0) const;
91  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, const LMatrix3 &v, int priority=0) const;
92  INLINE CPT(RenderAttrib) set_shader_input(CPT_InternalName id, double n1=0, double n2=0, double n3=0, double n4=1,
93  int priority=0) const;
94 
95 PUBLISHED:
96  EXTENSION(CPT(RenderAttrib) set_shader_input(CPT_InternalName, PyObject *, int priority=0) const);
97  EXTENSION(CPT(RenderAttrib) set_shader_inputs(PyObject *args, PyObject *kwargs) const);
98 
99  CPT(RenderAttrib) set_instance_count(int instance_count) const;
100 
101  CPT(RenderAttrib) set_flag(int flag, bool value) const;
102  CPT(RenderAttrib) clear_flag(int flag) const;
103 
104  CPT(RenderAttrib) clear_shader_input(const InternalName *id) const;
105  CPT(RenderAttrib) clear_shader_input(const std::string &id) const;
106 
107  CPT(RenderAttrib) clear_all_shader_inputs() const;
108 
109  INLINE bool get_flag(int flag) const;
110  INLINE bool has_shader_input(CPT_InternalName id) const;
111 
112  const Shader *get_shader() const;
113  const ShaderInput &get_shader_input(const InternalName *id) const;
114  const ShaderInput &get_shader_input(const std::string &id) const;
115 
116  const NodePath &get_shader_input_nodepath(const InternalName *id) const;
117  LVecBase4 get_shader_input_vector(InternalName *id) const;
118  Texture *get_shader_input_texture(const InternalName *id, SamplerState *sampler=nullptr) const;
119  const Shader::ShaderPtrData *get_shader_input_ptr(const InternalName *id) const;
120  const LMatrix4 &get_shader_input_matrix(const InternalName *id, LMatrix4 &matrix) const;
121  ShaderBuffer *get_shader_input_buffer(const InternalName *id) const;
122 
123  static void register_with_read_factory();
124 
125 PUBLISHED:
126  MAKE_PROPERTY(shader, get_shader);
127  MAKE_PROPERTY(instance_count, get_instance_count);
128 
129 public:
130  virtual void output(std::ostream &out) const;
131 
132 protected:
133  virtual int compare_to_impl(const RenderAttrib *other) const;
134  virtual size_t get_hash_impl() const;
135  virtual CPT(RenderAttrib) compose_impl(const RenderAttrib *other) const;
136 
137 private:
138 
139  CPT(Shader) _shader;
140  int _shader_priority;
141  bool _auto_shader;
142  bool _has_shader;
143  int _flags;
144  int _has_flags;
145  int _instance_count;
146 
147  bool _auto_normal_on;
148  bool _auto_glow_on;
149  bool _auto_gloss_on;
150  bool _auto_ramp_on;
151  bool _auto_shadow_on;
152 
153  // We don't keep a reference to the InternalName, since this is also already
154  // stored on the ShaderInput object.
156  Inputs _inputs;
157 
158  friend class Extension<NodePath>;
159  friend class Extension<ShaderAttrib>;
160 
161 PUBLISHED:
162  static int get_class_slot() {
163  return _attrib_slot;
164  }
165  virtual int get_slot() const {
166  return get_class_slot();
167  }
168  MAKE_PROPERTY(class_slot, get_class_slot);
169 
170 public:
171  static TypeHandle get_class_type() {
172  return _type_handle;
173  }
174  static void init_type() {
175  RenderAttrib::init_type();
176  register_type(_type_handle, "ShaderAttrib",
177  RenderAttrib::get_class_type());
178  _attrib_slot = register_slot(_type_handle, 10, new ShaderAttrib);
179  }
180  virtual TypeHandle get_type() const {
181  return get_class_type();
182  }
183  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
184 
185 private:
186  static TypeHandle _type_handle;
187  static int _attrib_slot;
188 };
189 
190 
191 #include "shaderAttrib.I"
192 
193 #endif // SHADERATTRIB_H
This is a const pointer to an InternalName, and should be used in lieu of a CPT(InternalName) in func...
Definition: internalName.h:193
The default class template does not define any methods.
Definition: extension.h:34
Encodes a string name in a hash table, mapping it to a pointer.
Definition: internalName.h:38
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
Definition: nodePath.h:159
This is the base class for a number of render attributes (other than transform) that may be set on sc...
Definition: renderAttrib.h:51
static int register_slot(TypeHandle type_handle, int sort, RenderAttrib *default_attrib)
Adds the indicated TypeHandle to the registry, if it is not there already, and returns a unique slot ...
Definition: renderAttrib.I:101
Represents a set of settings that indicate how a texture is sampled.
Definition: samplerState.h:36
This is a generic buffer object that lives in graphics memory.
Definition: shaderBuffer.h:33
This is a small container class that can hold any one of the value types that can be passed as input ...
Definition: shaderInput.h:40
Definition: shader.h:49
Represents a texture object, which is typically a single 2-d image but may also represent a 1-d or 3-...
Definition: texture.h:71
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
Definition: register_type.I:22
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.