Panda3D
textureStage.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 textureStage.h
10  * @author drose
11  * @date 2004-07-14
12  */
13 
14 #ifndef TEXTURESTAGE_H
15 #define TEXTURESTAGE_H
16 
17 #include "pandabase.h"
18 
19 #include "internalName.h"
20 #include "pointerTo.h"
22 #include "updateSeq.h"
23 #include "luse.h"
25 
26 class FactoryParams;
27 
28 /**
29  * Defines the properties of a named stage of the multitexture pipeline. The
30  * TextureAttrib will associated a number of these stages with Texture
31  * objects, and the GSG will render geometry by sorting all of the currently
32  * active TextureStages in order and then issuing the appropriate rendering
33  * calls to activate them.
34  */
35 class EXPCL_PANDA_GOBJ TextureStage : public TypedWritableReferenceCount {
36 PUBLISHED:
37  explicit TextureStage(const std::string &name);
38  INLINE TextureStage(const TextureStage &copy);
39  void operator = (const TextureStage &copy);
40 
41  virtual ~TextureStage();
42 
43  enum Mode {
44  // Modes that pertain to the fixed-function pipeline.
45 
46  M_modulate,
47  M_decal,
48  M_blend,
49  M_replace,
50  M_add,
51  M_combine,
52  M_blend_color_scale,
53 
54  M_modulate_glow, // When fixed-function, equivalent to modulate.
55  M_modulate_gloss, // When fixed-function, equivalent to modulate.
56 
57  // Modes that are only relevant to shader-based rendering.
58 
59  M_normal,
60  M_normal_height,
61  M_glow, // Rarely used: modulate_glow is more efficient.
62  M_gloss, // Rarely used: modulate_gloss is more efficient.
63  M_height, // Rarely used: normal_height is more efficient.
64  M_selector,
65  M_normal_gloss,
66 
67  M_emission,
68  };
69 
70  enum CombineMode {
71  CM_undefined,
72  CM_replace,
73  CM_modulate,
74  CM_add,
75  CM_add_signed,
76  CM_interpolate,
77  CM_subtract,
78 
79  // The following are valid only for combine_rgb, not combine_alpha.
80  CM_dot3_rgb,
81  CM_dot3_rgba,
82  };
83 
84  enum CombineSource {
85  CS_undefined,
86  CS_texture,
87  CS_constant,
88  CS_primary_color,
89  CS_previous,
90  CS_constant_color_scale,
91  CS_last_saved_result,
92  };
93 
94  enum CombineOperand {
95  CO_undefined,
96  CO_src_color,
97  CO_one_minus_src_color,
98  CO_src_alpha,
99  CO_one_minus_src_alpha,
100  };
101 
102  INLINE void set_name(const std::string &name);
103  INLINE const std::string &get_name() const;
104 
105  INLINE void set_sort(int sort);
106  INLINE int get_sort() const;
107 
108  INLINE void set_priority(int priority);
109  INLINE int get_priority() const;
110 
111  INLINE void set_texcoord_name(InternalName *name);
112  INLINE void set_texcoord_name(const std::string &texcoord_name);
113  INLINE InternalName *get_texcoord_name() const;
114  INLINE InternalName *get_tangent_name() const;
115  INLINE InternalName *get_binormal_name() const;
116 
117  INLINE void set_mode(Mode mode);
118  INLINE Mode get_mode() const;
119 
120  INLINE bool is_fixed_function() const;
121 
122  INLINE void set_color(const LColor &color);
123  INLINE LColor get_color() const;
124 
125  INLINE void set_rgb_scale(int rgb_scale);
126  INLINE int get_rgb_scale() const;
127 
128  INLINE void set_alpha_scale(int alpha_scale);
129  INLINE int get_alpha_scale() const;
130 
131  INLINE void set_saved_result(bool saved_result);
132  INLINE bool get_saved_result() const;
133 
134  INLINE void set_tex_view_offset(int tex_view_offset);
135  INLINE int get_tex_view_offset() const;
136 
137  INLINE void set_combine_rgb(CombineMode mode,
138  CombineSource source0, CombineOperand operand0);
139  INLINE void set_combine_rgb(CombineMode mode,
140  CombineSource source0, CombineOperand operand0,
141  CombineSource source1, CombineOperand operand1);
142  INLINE void set_combine_rgb(CombineMode mode,
143  CombineSource source0, CombineOperand operand0,
144  CombineSource source1, CombineOperand operand1,
145  CombineSource source2, CombineOperand operand2);
146  INLINE CombineMode get_combine_rgb_mode() const;
147  INLINE int get_num_combine_rgb_operands() const;
148  INLINE CombineSource get_combine_rgb_source0() const;
149  INLINE CombineOperand get_combine_rgb_operand0() const;
150  INLINE CombineSource get_combine_rgb_source1() const;
151  INLINE CombineOperand get_combine_rgb_operand1() const;
152  INLINE CombineSource get_combine_rgb_source2() const;
153  INLINE CombineOperand get_combine_rgb_operand2() const;
154 
155  INLINE void set_combine_alpha(CombineMode mode,
156  CombineSource source0, CombineOperand operand0);
157  INLINE void set_combine_alpha(CombineMode mode,
158  CombineSource source0, CombineOperand operand0,
159  CombineSource source1, CombineOperand operand1);
160  INLINE void set_combine_alpha(CombineMode mode,
161  CombineSource source0, CombineOperand operand0,
162  CombineSource source1, CombineOperand operand1,
163  CombineSource source2, CombineOperand operand2);
164  INLINE CombineMode get_combine_alpha_mode() const;
165  INLINE int get_num_combine_alpha_operands() const;
166  INLINE CombineSource get_combine_alpha_source0() const;
167  INLINE CombineOperand get_combine_alpha_operand0() const;
168  INLINE CombineSource get_combine_alpha_source1() const;
169  INLINE CombineOperand get_combine_alpha_operand1() const;
170  INLINE CombineSource get_combine_alpha_source2() const;
171  INLINE CombineOperand get_combine_alpha_operand2() const;
172 
173  INLINE bool involves_color_scale() const;
174  INLINE bool uses_color() const;
175  INLINE bool uses_primary_color() const;
176  INLINE bool uses_last_saved_result() const;
177 
178  INLINE bool operator == (const TextureStage &other) const;
179  INLINE bool operator != (const TextureStage &other) const;
180  INLINE bool operator < (const TextureStage &other) const;
181 
182  int compare_to(const TextureStage &other) const;
183 
184  void write(std::ostream &out) const;
185  void output(std::ostream &out) const;
186 
187  INLINE static TextureStage *get_default();
188 
189 PUBLISHED:
190  MAKE_PROPERTY(name, get_name, set_name);
191  MAKE_PROPERTY(sort, get_sort, set_sort);
192  MAKE_PROPERTY(priority, get_priority, set_priority);
193 
194  MAKE_PROPERTY(texcoord_name, get_texcoord_name, set_texcoord_name);
195  MAKE_PROPERTY(tangent_name, get_tangent_name);
196  MAKE_PROPERTY(binormal_name, get_binormal_name);
197 
198  MAKE_PROPERTY(mode, get_mode, set_mode);
199 
200  MAKE_PROPERTY(color, get_color, set_color);
201  MAKE_PROPERTY(rgb_scale, get_rgb_scale, set_rgb_scale);
202  MAKE_PROPERTY(alpha_scale, get_alpha_scale, set_alpha_scale);
203  MAKE_PROPERTY(saved_result, get_saved_result, set_saved_result);
204 
205  MAKE_PROPERTY(tex_view_offset, get_tex_view_offset, set_tex_view_offset);
206 
207  MAKE_PROPERTY(default, get_default);
208 
209 public:
210  INLINE static UpdateSeq get_sort_seq();
211 
212  INLINE void mark_used_by_auto_shader() const;
213 
214 private:
215  INLINE void update_color_flags();
216 
217  static int get_expected_num_combine_operands(CombineMode cm);
218  static bool operand_valid_for_rgb(CombineOperand co);
219  static bool operand_valid_for_alpha(CombineOperand co);
220 
221  std::string _name;
222  int _sort;
223  int _priority;
224  PT(InternalName) _texcoord_name;
225  Mode _mode;
226  LColor _color;
227  int _rgb_scale;
228  int _alpha_scale;
229  bool _saved_result;
230  int _tex_view_offset;
231  bool _involves_color_scale;
232  bool _uses_color;
233  bool _uses_primary_color;
234  bool _uses_last_saved_result;
235 
236  CombineMode _combine_rgb_mode;
237  int _num_combine_rgb_operands;
238  CombineSource _combine_rgb_source0;
239  CombineOperand _combine_rgb_operand0;
240  CombineSource _combine_rgb_source1;
241  CombineOperand _combine_rgb_operand1;
242  CombineSource _combine_rgb_source2;
243  CombineOperand _combine_rgb_operand2;
244 
245  CombineMode _combine_alpha_mode;
246  int _num_combine_alpha_operands;
247  CombineSource _combine_alpha_source0;
248  CombineOperand _combine_alpha_operand0;
249  CombineSource _combine_alpha_source1;
250  CombineOperand _combine_alpha_operand1;
251  CombineSource _combine_alpha_source2;
252  CombineOperand _combine_alpha_operand2;
253 
254  static PT(TextureStage) _default_stage;
255  static UpdateSeq _sort_seq;
256 
257  mutable bool _used_by_auto_shader;
258 
259 public:
260  // Datagram stuff
261  static void register_with_read_factory();
262  virtual void write_datagram(BamWriter *manager, Datagram &me);
263  virtual int complete_pointers(TypedWritable **plist, BamReader *manager);
264 
265  static TypedWritable *make_TextureStage(const FactoryParams &params);
266 
267 protected:
268  void fillin(DatagramIterator& scan, BamReader* manager);
269 
270 public:
271  static TypeHandle get_class_type() {
272  return _type_handle;
273  }
274  static void init_type() {
275  TypedWritableReferenceCount::init_type();
276  register_type(_type_handle, "TextureStage",
277  TypedWritableReferenceCount::get_class_type());
278  }
279  virtual TypeHandle get_type() const {
280  return get_class_type();
281  }
282  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
283 
284 private:
285  static TypeHandle _type_handle;
286 };
287 
288 INLINE std::ostream &operator << (std::ostream &out, const TextureStage &ts);
289 
290 EXPCL_PANDA_GOBJ std::ostream &operator << (std::ostream &out, TextureStage::Mode mode);
291 EXPCL_PANDA_GOBJ std::ostream &operator << (std::ostream &out, TextureStage::CombineMode cm);
292 EXPCL_PANDA_GOBJ std::ostream &operator << (std::ostream &out, TextureStage::CombineSource cs);
293 EXPCL_PANDA_GOBJ std::ostream &operator << (std::ostream &out, TextureStage::CombineOperand co);
294 
295 
296 #include "textureStage.I"
297 
298 #endif
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition: bamWriter.h:63
A class to retrieve the individual data elements previously stored in a Datagram.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38
An instance of this class is passed to the Factory when requesting it to do its business and construc...
Definition: factoryParams.h:36
Encodes a string name in a hash table, mapping it to a pointer.
Definition: internalName.h:38
Defines the properties of a named stage of the multitexture pipeline.
Definition: textureStage.h:35
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
A base class for things which need to inherit from both TypedWritable and from ReferenceCount.
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
virtual void fillin(DatagramIterator &scan, BamReader *manager)
This internal function is intended to be called by each class's make_from_bam() method to read in all...
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for shipping out to a Bam file.
virtual int complete_pointers(TypedWritable **p_list, BamReader *manager)
Receives an array of pointers, one for each time manager->read_pointer() was called in fillin().
This is a sequence number that increments monotonically.
Definition: updateSeq.h:37
An STL function object class, this is intended to be used on any ordered collection of class objects ...
Definition: stl_compares.h:73
This is our own Panda specialization on the default STL list.
Definition: plist.h:35
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.