Panda3D
shader.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 shader.h
10  * @author jyelon
11  * @date 2005-09-01
12  * @author fperazzi, PandaSE
13  * @date 2010-04-29
14  */
15 
16 #ifndef SHADER_H
17 #define SHADER_H
18 
19 #include "pandabase.h"
20 #include "config_gobj.h"
22 #include "namable.h"
24 #include "internalName.h"
25 #include "pta_int.h"
26 #include "pta_float.h"
27 #include "pta_double.h"
28 #include "pta_stdfloat.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 "epvector.h"
35 #include "asyncFuture.h"
36 #include "bamCacheRecord.h"
37 
38 #ifdef HAVE_CG
39 // I don't want to include the Cg header file into panda as a whole. Instead,
40 // I'll just excerpt some opaque declarations.
41 typedef struct _CGcontext *CGcontext;
42 typedef struct _CGprogram *CGprogram;
43 typedef struct _CGparameter *CGparameter;
44 #endif
45 
46 /**
47 
48  */
49 class EXPCL_PANDA_GOBJ Shader : public TypedWritableReferenceCount {
50 PUBLISHED:
51  enum ShaderLanguage {
52  SL_none,
53  SL_Cg,
54  SL_GLSL,
55  SL_HLSL,
56  SL_SPIR_V,
57  };
58 
59  enum ShaderType {
60  ST_none = 0,
61  ST_vertex,
62  ST_fragment,
63  ST_geometry,
64  ST_tess_control,
65  ST_tess_evaluation,
66  ST_compute,
67  ST_COUNT
68  };
69 
70  enum AutoShaderSwitch {
71  AS_normal = 0x01,
72  AS_glow = 0x02,
73  AS_gloss = 0x04,
74  AS_ramp = 0x08,
75  AS_shadow = 0x10,
76  };
77 
78  enum AutoShaderBit {
79  bit_AutoShaderNormal = 0, // bit for AS_normal
80  bit_AutoShaderGlow = 1, // bit for AS_glow
81  bit_AutoShaderGloss = 2, // bit for AS_gloss
82  bit_AutoShaderRamp = 3, // bit for AS_ramp
83  bit_AutoShaderShadow = 4, // bit for AS_shadow
84  };
85 
86  static PT(Shader) load(const Filename &file, ShaderLanguage lang = SL_none);
87  static PT(Shader) make(std::string body, ShaderLanguage lang = SL_none);
88  static PT(Shader) load(ShaderLanguage lang,
89  const Filename &vertex, const Filename &fragment,
90  const Filename &geometry = "",
91  const Filename &tess_control = "",
92  const Filename &tess_evaluation = "");
93  static PT(Shader) load_compute(ShaderLanguage lang, const Filename &fn);
94  static PT(Shader) make(ShaderLanguage lang,
95  std::string vertex, std::string fragment,
96  std::string geometry = "",
97  std::string tess_control = "",
98  std::string tess_evaluation = "");
99  static PT(Shader) make_compute(ShaderLanguage lang, std::string body);
100 
101  INLINE Filename get_filename(ShaderType type = ST_none) const;
102  INLINE void set_filename(ShaderType type, const Filename &filename);
103  INLINE const std::string &get_text(ShaderType type = ST_none) const;
104  INLINE bool get_error_flag() const;
105  INLINE ShaderLanguage get_language() const;
106 
107  INLINE bool has_fullpath() const;
108  INLINE const Filename &get_fullpath() const;
109 
110  INLINE bool get_cache_compiled_shader() const;
111  INLINE void set_cache_compiled_shader(bool flag);
112 
113  PT(AsyncFuture) prepare(PreparedGraphicsObjects *prepared_objects);
114  bool is_prepared(PreparedGraphicsObjects *prepared_objects) const;
115  bool release(PreparedGraphicsObjects *prepared_objects);
116  int release_all();
117 
118  ShaderContext *prepare_now(PreparedGraphicsObjects *prepared_objects,
120 
121 public:
122  enum ShaderMatInput {
123  SMO_identity,
124 
125  SMO_window_size,
126  SMO_pixel_size,
127  SMO_texpad_x,
128  SMO_texpix_x,
129 
130  SMO_attr_material,
131  SMO_attr_color,
132  SMO_attr_colorscale,
133 
134  SMO_alight_x,
135  SMO_dlight_x,
136  SMO_plight_x,
137  SMO_slight_x,
138  SMO_satten_x,
139  SMO_texmat_i,
140  SMO_plane_x,
141  SMO_clipplane_x,
142 
143  SMO_mat_constant_x,
144  SMO_vec_constant_x,
145 
146  SMO_world_to_view,
147  SMO_view_to_world,
148 
149  SMO_model_to_view,
150  SMO_view_to_model,
151 
152  SMO_apiview_to_view,
153  SMO_view_to_apiview,
154 
155  SMO_clip_to_view,
156  SMO_view_to_clip,
157 
158  SMO_apiclip_to_view,
159  SMO_view_to_apiclip,
160 
161  SMO_view_x_to_view,
162  SMO_view_to_view_x,
163 
164  SMO_apiview_x_to_view,
165  SMO_view_to_apiview_x,
166 
167  SMO_clip_x_to_view,
168  SMO_view_to_clip_x,
169 
170  SMO_apiclip_x_to_view,
171  SMO_view_to_apiclip_x,
172 
173  SMO_attr_fog,
174  SMO_attr_fogcolor,
175 
176  SMO_frame_number,
177  SMO_frame_time,
178  SMO_frame_delta,
179 
180  SMO_mat_constant_x_attrib,
181  SMO_vec_constant_x_attrib,
182 
183  SMO_light_ambient,
184  SMO_light_source_i_attrib,
185 
186  SMO_light_product_i_ambient,
187  SMO_light_product_i_diffuse,
188  SMO_light_product_i_specular,
189 
190  // SMO_clipplane_x is world coords, GLSL needs eye coords
191  SMO_apiview_clipplane_i,
192 
193  SMO_model_to_apiview,
194  SMO_apiview_to_model,
195  SMO_apiview_to_apiclip,
196  SMO_apiclip_to_apiview,
197 
198  SMO_inv_texmat_i,
199 
200  // Additional properties for PBR materials
201  SMO_attr_material2,
202 
203  // Hack for text rendering. Don't use in user shaders.
204  SMO_tex_is_alpha_i,
205 
206  SMO_transform_i,
207  SMO_slider_i,
208 
209  SMO_light_source_i_packed,
210 
211  // Texture scale component of texture matrix.
212  SMO_texscale_i,
213 
214  // Color of an M_blend texture stage.
215  SMO_texcolor_i,
216 
217  SMO_INVALID
218  };
219 
220  enum ShaderTexInput {
221  STO_INVALID,
222 
223  STO_named_input,
224  STO_named_stage,
225 
226  STO_stage_i,
227  STO_light_i_shadow_map,
228  };
229 
230  enum ShaderArgClass {
231  SAC_scalar,
232  SAC_vector,
233  SAC_matrix,
234  SAC_sampler,
235  SAC_array,
236  SAC_unknown,
237  };
238 
239  enum ShaderArgType {
240  SAT_scalar,
241  SAT_vec1,
242  SAT_vec2,
243  SAT_vec3,
244  SAT_vec4,
245  SAT_mat1x1,
246  SAT_mat1x2,
247  SAT_mat1x3,
248  SAT_mat1x4,
249  SAT_mat2x1,
250  SAT_mat2x2,
251  SAT_mat2x3,
252  SAT_mat2x4,
253  SAT_mat3x1,
254  SAT_mat3x2,
255  SAT_mat3x3,
256  SAT_mat3x4,
257  SAT_mat4x1,
258  SAT_mat4x2,
259  SAT_mat4x3,
260  SAT_mat4x4,
261  SAT_sampler1d,
262  SAT_sampler2d,
263  SAT_sampler3d,
264  SAT_sampler2d_array,
265  SAT_sampler_cube,
266  SAT_sampler_buffer,
267  SAT_sampler_cube_array,
268  SAT_unknown
269 };
270 
271  enum ShaderArgDir {
272  SAD_in,
273  SAD_out,
274  SAD_inout,
275  SAD_unknown,
276  };
277 
278  enum ShaderMatPiece {
279  SMP_whole,
280  SMP_transpose,
281  SMP_row0,
282  SMP_row1,
283  SMP_row2,
284  SMP_row3,
285  SMP_col0,
286  SMP_col1,
287  SMP_col2,
288  SMP_col3,
289  SMP_row3x1,
290  SMP_row3x2,
291  SMP_row3x3,
292  SMP_upper3x3,
293  SMP_transpose3x3,
294  SMP_cell15,
295  SMP_cell14,
296  SMP_cell13,
297  };
298 
299  enum ShaderStateDep {
300  SSD_NONE = 0x000,
301  SSD_general = 0x001,
302  SSD_transform = 0x2002,
303  SSD_color = 0x004,
304  SSD_colorscale = 0x008,
305  SSD_material = 0x010,
306  SSD_shaderinputs = 0x020,
307  SSD_fog = 0x040,
308  SSD_light = 0x080,
309  SSD_clip_planes = 0x100,
310  SSD_tex_matrix = 0x200,
311  SSD_frame = 0x400,
312  SSD_projection = 0x800,
313  SSD_texture = 0x1000,
314  SSD_view_transform= 0x2000,
315  };
316 
317  enum ShaderBug {
318  SBUG_ati_draw_buffers,
319  };
320 
321  enum ShaderMatFunc {
322  SMF_compose,
323  SMF_transform_dlight,
324  SMF_transform_plight,
325  SMF_transform_slight,
326  SMF_first,
327  };
328 
329  struct ShaderArgId {
330  std::string _name;
331  ShaderType _type;
332  int _seqno;
333  };
334 
335  enum ShaderPtrType {
336  SPT_float,
337  SPT_double,
338  SPT_int,
339  SPT_uint,
340  SPT_unknown
341  };
342 
343  struct ShaderArgInfo {
344  ShaderArgId _id;
345  ShaderArgClass _class;
346  ShaderArgClass _subclass;
347  ShaderArgType _type;
348  ShaderArgDir _direction;
349  bool _varying;
350  ShaderPtrType _numeric_type;
351  NotifyCategory *_cat;
352  };
353 
354  // Container structure for data of parameters ShaderPtrSpec.
355  struct ShaderPtrData {
356  private:
357  PT(ReferenceCount) _pta;
358 
359  public:
360  void *_ptr;
361  ShaderPtrType _type;
362  bool _updated;
363  size_t _size; //number of elements vec3[4]=12
364 
365  public:
366  INLINE ShaderPtrData();
367  INLINE ShaderPtrData(const PTA_float &ptr);
368  INLINE ShaderPtrData(const PTA_LVecBase4f &ptr);
369  INLINE ShaderPtrData(const PTA_LVecBase3f &ptr);
370  INLINE ShaderPtrData(const PTA_LVecBase2f &ptr);
371  INLINE ShaderPtrData(const PTA_LMatrix4f &mat);
372  INLINE ShaderPtrData(const PTA_LMatrix3f &mat);
373  INLINE ShaderPtrData(const LVecBase4f &vec);
374  INLINE ShaderPtrData(const LVecBase3f &vec);
375  INLINE ShaderPtrData(const LVecBase2f &vec);
376  INLINE ShaderPtrData(const LMatrix4f &mat);
377  INLINE ShaderPtrData(const LMatrix3f &mat);
378 
379  INLINE ShaderPtrData(const PTA_double &ptr);
380  INLINE ShaderPtrData(const PTA_LVecBase4d &ptr);
381  INLINE ShaderPtrData(const PTA_LVecBase3d &ptr);
382  INLINE ShaderPtrData(const PTA_LVecBase2d &ptr);
383  INLINE ShaderPtrData(const PTA_LMatrix4d &mat);
384  INLINE ShaderPtrData(const PTA_LMatrix3d &mat);
385  INLINE ShaderPtrData(const LVecBase4d &vec);
386  INLINE ShaderPtrData(const LVecBase3d &vec);
387  INLINE ShaderPtrData(const LVecBase2d &vec);
388  INLINE ShaderPtrData(const LMatrix4d &mat);
389  INLINE ShaderPtrData(const LMatrix3d &mat);
390 
391  INLINE ShaderPtrData(const PTA_int &ptr);
392  INLINE ShaderPtrData(const PTA_LVecBase4i &ptr);
393  INLINE ShaderPtrData(const PTA_LVecBase3i &ptr);
394  INLINE ShaderPtrData(const PTA_LVecBase2i &ptr);
395  INLINE ShaderPtrData(const LVecBase4i &vec);
396  INLINE ShaderPtrData(const LVecBase3i &vec);
397  INLINE ShaderPtrData(const LVecBase2i &vec);
398 
399  INLINE void write_datagram(Datagram &dg) const;
400  INLINE void read_datagram(DatagramIterator &source);
401  };
402 
403  struct ShaderMatSpec {
404  LMatrix4 _cache[2];
405  LMatrix4 _value;
406  ShaderArgId _id;
407  ShaderMatFunc _func;
408  ShaderMatInput _part[2];
409  PT(InternalName) _arg[2];
410  int _dep[2];
411  int _index;
412  ShaderMatPiece _piece;
413  };
414 
415  struct ShaderTexSpec {
416  ShaderArgId _id;
417  PT(InternalName) _name;
418  ShaderTexInput _part;
419  int _stage;
420  int _desired_type;
421  PT(InternalName) _suffix;
422  };
423 
424  struct ShaderVarSpec {
425  ShaderArgId _id;
426  PT(InternalName) _name;
427  int _append_uv;
428  int _elements;
429  ShaderPtrType _numeric_type;
430  };
431 
432  struct ShaderPtrSpec {
433  ShaderArgId _id;
434  int _dim[3]; //n_elements,rows,cols
435  int _dep[2];
436  PT(InternalName) _arg;
437  ShaderArgInfo _info;
438  ShaderPtrType _type;
439  };
440 
441  class EXPCL_PANDA_GOBJ ShaderCaps {
442  public:
443  void clear();
444  INLINE bool operator == (const ShaderCaps &other) const;
445  INLINE ShaderCaps();
446 
447  public:
448  bool _supports_glsl;
449 
450 #ifdef HAVE_CG
451  int _active_vprofile;
452  int _active_fprofile;
453  int _active_gprofile;
454  int _active_tprofile;
455 
456  int _ultimate_vprofile;
457  int _ultimate_fprofile;
458  int _ultimate_gprofile;
459  int _ultimate_tprofile;
460 
461  pset <ShaderBug> _bug_list;
462 #endif
463  };
464 
465  class ShaderFile : public ReferenceCount {
466  public:
467  INLINE ShaderFile() {};
468  INLINE ShaderFile(std::string shared);
469  INLINE ShaderFile(std::string vertex, std::string fragment, std::string geometry,
470  std::string tess_control, std::string tess_evaluation);
471 
472  INLINE void write_datagram(Datagram &dg) const;
473  INLINE void read_datagram(DatagramIterator &source);
474 
475  INLINE bool operator < (const ShaderFile &other) const;
476 
477  public:
478  bool _separate;
479  std::string _shared;
480  std::string _vertex;
481  std::string _fragment;
482  std::string _geometry;
483  std::string _tess_control;
484  std::string _tess_evaluation;
485  std::string _compute;
486  };
487 
488 public:
489  // These routines help split the shader into sections, for those shader
490  // implementations that need to do so. Don't use them when you use separate
491  // shader programs.
492  void parse_init();
493  void parse_line(std::string &result, bool rt, bool lt);
494  void parse_upto(std::string &result, std::string pattern, bool include);
495  void parse_rest(std::string &result);
496  bool parse_eof();
497 
498  void cp_report_error(ShaderArgInfo &arg, const std::string &msg);
499  bool cp_errchk_parameter_words(ShaderArgInfo &arg, int len);
500  bool cp_errchk_parameter_in(ShaderArgInfo &arg);
501  bool cp_errchk_parameter_ptr(ShaderArgInfo &p);
502  bool cp_errchk_parameter_varying(ShaderArgInfo &arg);
503  bool cp_errchk_parameter_uniform(ShaderArgInfo &arg);
504  bool cp_errchk_parameter_float(ShaderArgInfo &arg, int lo, int hi);
505  bool cp_errchk_parameter_sampler(ShaderArgInfo &arg);
506  bool cp_parse_eol(ShaderArgInfo &arg,
507  vector_string &pieces, int &next);
508  bool cp_parse_delimiter(ShaderArgInfo &arg,
509  vector_string &pieces, int &next);
510  std::string cp_parse_non_delimiter(vector_string &pieces, int &next);
511  bool cp_parse_coord_sys(ShaderArgInfo &arg,
512  vector_string &pieces, int &next,
513  ShaderMatSpec &spec, bool fromflag);
514  int cp_dependency(ShaderMatInput inp);
515  void cp_optimize_mat_spec(ShaderMatSpec &spec);
516 
517 #ifdef HAVE_CG
518  void cg_recurse_parameters(CGparameter parameter,
519  const ShaderType &type,
520  bool &success);
521 #endif
522 
523  bool compile_parameter(ShaderArgInfo &p, int *arg_dim);
524 
525  void clear_parameters();
526 
527  void set_compiled(unsigned int format, const char *data, size_t length);
528  bool get_compiled(unsigned int &format, std::string &binary) const;
529 
530  static void set_default_caps(const ShaderCaps &caps);
531 
532 private:
533 #ifdef HAVE_CG
534  ShaderArgClass cg_parameter_class(CGparameter p);
535  ShaderArgType cg_parameter_type(CGparameter p);
536  ShaderArgDir cg_parameter_dir(CGparameter p);
537 
538  CGprogram cg_compile_entry_point(const char *entry, const ShaderCaps &caps,
539  CGcontext context, ShaderType type);
540 
541  bool cg_analyze_entry_point(CGprogram prog, ShaderType type);
542 
543  bool cg_analyze_shader(const ShaderCaps &caps);
544  bool cg_compile_shader(const ShaderCaps &caps, CGcontext context);
545  void cg_release_resources();
546  void cg_report_errors();
547 
548  // Determines the appropriate cg profile settings and stores them in the
549  // active shader caps based on any profile settings stored in the shader's
550  // header
551  void cg_get_profile_from_header(ShaderCaps &caps);
552 
553  ShaderCaps _cg_last_caps;
554  static CGcontext _cg_context;
555  CGprogram _cg_vprogram;
556  CGprogram _cg_fprogram;
557  CGprogram _cg_gprogram;
558 
559  int _cg_vprofile;
560  int _cg_fprofile;
561  int _cg_gprofile;
562 
563  CGprogram cg_program_from_shadertype(ShaderType type);
564 
565 public:
566  bool cg_compile_for(const ShaderCaps &caps, CGcontext context,
567  CGprogram &combined_program, pvector<CGparameter> &map);
568 
569 #endif
570 
571 public:
572  pvector<ShaderPtrSpec> _ptr_spec;
573  epvector<ShaderMatSpec> _mat_spec;
574  pvector<ShaderTexSpec> _tex_spec;
575  pvector<ShaderVarSpec> _var_spec;
576  int _mat_deps;
577 
578  bool _error_flag;
579  ShaderFile _text;
580 
581 protected:
582  ShaderFile _filename;
583  Filename _fullpath;
584  int _parse;
585  bool _loaded;
586  ShaderLanguage _language;
587 
589  Filenames _included_files;
590 
591  // Stores full paths, and includes the fullpaths of the shaders themselves
592  // as well as the includes.
593  Filenames _source_files;
594  time_t _last_modified;
595 
596  PT(BamCacheRecord) _record;
597  bool _cache_compiled_shader;
598  unsigned int _compiled_format;
599  std::string _compiled_binary;
600 
601  static ShaderCaps _default_caps;
602  static int _shaders_generated;
603 
604  typedef pmap<ShaderFile, PT(Shader)> ShaderTable;
605 
606  static ShaderTable _load_table;
607  static ShaderTable _make_table;
608 
609  friend class ShaderContext;
610  friend class PreparedGraphicsObjects;
611 
613  Contexts _contexts;
614 
615 private:
616  void clear_prepared(PreparedGraphicsObjects *prepared_objects);
617 
618  Shader(ShaderLanguage lang);
619 
620  bool read(const ShaderFile &sfile, BamCacheRecord *record = nullptr);
621  bool load(const ShaderFile &sbody, BamCacheRecord *record = nullptr);
622  bool do_read_source(std::string &into, const Filename &fn, BamCacheRecord *record);
623  bool do_load_source(std::string &into, const std::string &source, BamCacheRecord *record);
624  bool r_preprocess_include(std::ostream &out, const Filename &fn,
625  const Filename &source_dir,
626  std::set<Filename> &open_files,
627  BamCacheRecord *record, int depth);
628  bool r_preprocess_source(std::ostream &out, std::istream &in,
629  const Filename &fn, const Filename &full_fn,
630  std::set<Filename> &open_files,
631  BamCacheRecord *record,
632  int fileno = 0, int depth = 0);
633 
634  bool check_modified() const;
635 
636 public:
637  ~Shader();
638 
639  Filename get_filename_from_index(int index, ShaderType type) const;
640 
641 public:
642  static void register_with_read_factory();
643  virtual void write_datagram(BamWriter *manager, Datagram &dg);
644 
645 protected:
646  static TypedWritable *make_from_bam(const FactoryParams &params);
647  void fillin(DatagramIterator &scan, BamReader *manager);
648 
649 public:
650  static TypeHandle get_class_type() {
651  return _type_handle;
652  }
653  static void init_type() {
654  TypedWritableReferenceCount::init_type();
655  register_type(_type_handle, "Shader",
656  TypedWritableReferenceCount::get_class_type());
657  }
658  virtual TypeHandle get_type() const {
659  return get_class_type();
660  }
661  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
662 
663 private:
664  static TypeHandle _type_handle;
665 };
666 
667 #include "shader.I"
668 
669 #endif
This is our own Panda specialization on the default STL map.
Definition: pmap.h:49
This class represents a thread-safe handle to a promised future result of an asynchronous operation,...
Definition: asyncFuture.h:61
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
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.
Definition: shader.h:49
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition: bamWriter.h:63
A table of objects that are saved within the graphics context for reference by handle later.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
The ShaderContext is meant to contain the compiled version of a shader string.
Definition: shaderContext.h:31
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A particular category of error messages.
This is our own Panda specialization on the default STL vector.
Definition: pvector.h:42
The name of a file, such as a texture file or an Egg file.
Definition: filename.h:39
An instance of this class is written to the front of a Bam or Txo file to make the file a cached inst...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
An instance of this class is passed to the Factory when requesting it to do its business and construc...
Definition: factoryParams.h:36
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A base class for things which need to inherit from both TypedWritable and from ReferenceCount.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Encodes a string name in a hash table, mapping it to a pointer.
Definition: internalName.h:38
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A base class for all things that want to be reference-counted.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is a base class for the GraphicsStateGuardian class, which is itself a base class for the variou...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is our own Panda specialization on the default STL set.
Definition: pset.h:49
A class to retrieve the individual data elements previously stored in a Datagram.
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.