00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef EGGGROUP_H
00016 #define EGGGROUP_H
00017
00018 #include "pandabase.h"
00019
00020 #include "eggGroupNode.h"
00021 #include "eggRenderMode.h"
00022 #include "eggTransform.h"
00023 #include "eggVertex.h"
00024 #include "eggSwitchCondition.h"
00025 #include "pt_EggVertex.h"
00026
00027 #include "luse.h"
00028 #include "collideMask.h"
00029 #include "vector_string.h"
00030
00031
00032
00033
00034
00035
00036 class EXPCL_PANDAEGG EggGroup : public EggGroupNode, public EggRenderMode, public EggTransform {
00037 PUBLISHED:
00038 typedef pmap<PT_EggVertex, double> VertexRef;
00039 typedef pmap<string, string> TagData;
00040
00041
00042 enum GroupType {
00043
00044 GT_invalid = -1,
00045 GT_group = 0x00000000,
00046 GT_instance = 0x00000001,
00047 GT_joint = 0x00000002,
00048 };
00049 enum DCSType {
00050
00051 DC_unspecified = 0x00000000,
00052 DC_none = 0x00000010,
00053 DC_local = 0x00000020,
00054 DC_net = 0x00000030,
00055 DC_no_touch = 0x00000040,
00056 DC_default = 0x00000050,
00057 };
00058 enum BillboardType {
00059
00060 BT_none = 0x00000000,
00061 BT_axis = 0x00000020,
00062 BT_point_camera_relative = 0x00000040,
00063 BT_point_world_relative = 0x00000080,
00064 };
00065 enum CollisionSolidType {
00066
00067
00068 CST_none = 0x00000000,
00069 CST_plane = 0x00010000,
00070 CST_polygon = 0x00020000,
00071 CST_polyset = 0x00030000,
00072 CST_sphere = 0x00040000,
00073 CST_tube = 0x00050000,
00074 CST_inv_sphere = 0x00060000,
00075 CST_floor_mesh = 0x00080000,
00076 };
00077 enum CollideFlags {
00078
00079
00080 CF_none = 0x00000000,
00081 CF_descend = 0x00100000,
00082 CF_event = 0x00200000,
00083 CF_keep = 0x00400000,
00084 CF_solid = 0x00800000,
00085 CF_center = 0x01000000,
00086 CF_turnstile = 0x02000000,
00087 CF_level = 0x04000000,
00088 CF_intangible = 0x08000000,
00089 };
00090
00091 enum DartType {
00092
00093 DT_none = 0x00000000,
00094 DT_structured = 0x10000000,
00095 DT_sync = 0x20000000,
00096 DT_nosync = 0x30000000,
00097 DT_default = 0x40000000,
00098 };
00099
00100
00101
00102 enum BlendMode {
00103 BM_unspecified,
00104 BM_none,
00105 BM_add,
00106 BM_subtract,
00107 BM_inv_subtract,
00108 BM_min,
00109 BM_max
00110 };
00111
00112
00113 enum BlendOperand {
00114 BO_unspecified,
00115 BO_zero,
00116 BO_one,
00117 BO_incoming_color,
00118 BO_one_minus_incoming_color,
00119 BO_fbuffer_color,
00120 BO_one_minus_fbuffer_color,
00121 BO_incoming_alpha,
00122 BO_one_minus_incoming_alpha,
00123 BO_fbuffer_alpha,
00124 BO_one_minus_fbuffer_alpha,
00125 BO_constant_color,
00126 BO_one_minus_constant_color,
00127 BO_constant_alpha,
00128 BO_one_minus_constant_alpha,
00129 BO_incoming_color_saturate,
00130 BO_color_scale,
00131 BO_one_minus_color_scale,
00132 BO_alpha_scale,
00133 BO_one_minus_alpha_scale,
00134 };
00135
00136 EggGroup(const string &name = "");
00137 EggGroup(const EggGroup ©);
00138 EggGroup &operator = (const EggGroup ©);
00139 ~EggGroup();
00140
00141 virtual void write(ostream &out, int indent_level) const;
00142 void write_billboard_flags(ostream &out, int indent_level) const;
00143 void write_collide_flags(ostream &out, int indent_level) const;
00144 void write_model_flags(ostream &out, int indent_level) const;
00145 void write_switch_flags(ostream &out, int indent_level) const;
00146 void write_object_types(ostream &out, int indent_level) const;
00147 void write_decal_flags(ostream &out, int indent_level) const;
00148 void write_tags(ostream &out, int indent_level) const;
00149 void write_render_mode(ostream &out, int indent_level) const;
00150
00151 virtual bool is_joint() const;
00152
00153 virtual EggRenderMode *determine_alpha_mode();
00154 virtual EggRenderMode *determine_depth_write_mode();
00155 virtual EggRenderMode *determine_depth_test_mode();
00156 virtual EggRenderMode *determine_visibility_mode();
00157 virtual EggRenderMode *determine_depth_offset();
00158 virtual EggRenderMode *determine_draw_order();
00159 virtual EggRenderMode *determine_bin();
00160 virtual bool determine_indexed();
00161 virtual bool determine_decal();
00162
00163 void set_group_type(GroupType type);
00164 INLINE GroupType get_group_type() const;
00165 INLINE bool is_instance_type() const;
00166
00167 INLINE void set_billboard_type(BillboardType type);
00168 INLINE BillboardType get_billboard_type() const;
00169
00170 INLINE void set_billboard_center(const LPoint3d &billboard_center);
00171 INLINE void clear_billboard_center();
00172 INLINE bool has_billboard_center() const;
00173 INLINE const LPoint3d &get_billboard_center() const;
00174
00175 INLINE void set_cs_type(CollisionSolidType type);
00176 INLINE CollisionSolidType get_cs_type() const;
00177
00178 INLINE void set_collide_flags(int flags);
00179 INLINE CollideFlags get_collide_flags() const;
00180
00181 INLINE void set_collision_name(const string &collision_name);
00182 INLINE void clear_collision_name();
00183 INLINE bool has_collision_name() const;
00184 INLINE const string &get_collision_name() const;
00185
00186 INLINE void set_dcs_type(DCSType type);
00187 INLINE DCSType get_dcs_type() const;
00188 INLINE bool has_dcs_type() const;
00189
00190 INLINE void set_dart_type(DartType type);
00191 INLINE DartType get_dart_type() const;
00192
00193 INLINE void set_switch_flag(bool flag);
00194 INLINE bool get_switch_flag() const;
00195
00196 INLINE void set_switch_fps(double fps);
00197 INLINE double get_switch_fps() const;
00198
00199 INLINE void add_object_type(const string &object_type);
00200 INLINE void clear_object_types();
00201 INLINE int get_num_object_types() const;
00202 INLINE string get_object_type(int index) const;
00203 MAKE_SEQ(get_object_types, get_num_object_types, get_object_type);
00204 bool has_object_type(const string &object_type) const;
00205 bool remove_object_type(const string &object_type);
00206
00207 INLINE void set_model_flag(bool flag);
00208 INLINE bool get_model_flag() const;
00209
00210 INLINE void set_texlist_flag(bool flag);
00211 INLINE bool get_texlist_flag() const;
00212
00213 INLINE void set_nofog_flag(bool flag);
00214 INLINE bool get_nofog_flag() const;
00215
00216 INLINE void set_decal_flag(bool flag);
00217 INLINE bool get_decal_flag() const;
00218
00219 INLINE void set_direct_flag(bool flag);
00220 INLINE bool get_direct_flag() const;
00221
00222 INLINE void set_portal_flag(bool flag);
00223 INLINE bool get_portal_flag() const;
00224
00225 INLINE void set_occluder_flag(bool flag);
00226 INLINE bool get_occluder_flag() const;
00227
00228 INLINE void set_polylight_flag(bool flag);
00229 INLINE bool get_polylight_flag() const;
00230
00231 INLINE void set_indexed_flag(bool flag);
00232 INLINE void clear_indexed_flag();
00233 INLINE bool has_indexed_flag() const;
00234 INLINE bool get_indexed_flag() const;
00235
00236 INLINE void set_collide_mask(CollideMask mask);
00237 INLINE void clear_collide_mask();
00238 INLINE bool has_collide_mask() const;
00239 INLINE CollideMask get_collide_mask() const;
00240
00241 INLINE void set_from_collide_mask(CollideMask mask);
00242 INLINE void clear_from_collide_mask();
00243 INLINE bool has_from_collide_mask() const;
00244 INLINE CollideMask get_from_collide_mask() const;
00245
00246 INLINE void set_into_collide_mask(CollideMask mask);
00247 INLINE void clear_into_collide_mask();
00248 INLINE bool has_into_collide_mask() const;
00249 INLINE CollideMask get_into_collide_mask() const;
00250
00251 INLINE void set_blend_mode(BlendMode blend_mode);
00252 INLINE BlendMode get_blend_mode() const;
00253 INLINE void set_blend_operand_a(BlendOperand blend_operand_a);
00254 INLINE BlendOperand get_blend_operand_a() const;
00255 INLINE void set_blend_operand_b(BlendOperand blend_operand_b);
00256 INLINE BlendOperand get_blend_operand_b() const;
00257 INLINE void set_blend_color(const LColor &blend_color);
00258 INLINE void clear_blend_color();
00259 INLINE bool has_blend_color() const;
00260 INLINE const LColor &get_blend_color() const;
00261
00262 INLINE void set_lod(const EggSwitchCondition &lod);
00263 INLINE void clear_lod();
00264 INLINE bool has_lod() const;
00265 INLINE const EggSwitchCondition &get_lod() const;
00266
00267 INLINE void set_tag(const string &key, const string &value);
00268 INLINE string get_tag(const string &key) const;
00269 INLINE bool has_tag(const string &key) const;
00270 INLINE void clear_tag(const string &key);
00271
00272 INLINE const EggTransform &get_default_pose() const;
00273 INLINE EggTransform &modify_default_pose();
00274 INLINE void set_default_pose(const EggTransform &transform);
00275 INLINE void clear_default_pose();
00276
00277 INLINE void set_scroll_u(const double u_speed);
00278 INLINE void set_scroll_v(const double v_speed);
00279 INLINE void set_scroll_r(const double r_speed);
00280 INLINE double get_scroll_u() const;
00281 INLINE double get_scroll_v() const;
00282 INLINE double get_scroll_r() const;
00283
00284 INLINE bool has_scrolling_uvs();
00285
00286 public:
00287 INLINE TagData::const_iterator tag_begin() const;
00288 INLINE TagData::const_iterator tag_end() const;
00289 INLINE TagData::size_type tag_size() const;
00290
00291 PUBLISHED:
00292 void ref_vertex(EggVertex *vert, double membership = 1.0);
00293 void unref_vertex(EggVertex *vert);
00294 void unref_all_vertices();
00295 double get_vertex_membership(const EggVertex *vert) const;
00296 void set_vertex_membership(EggVertex *vert, double membership);
00297 void steal_vrefs(EggGroup *other);
00298
00299 public:
00300 INLINE VertexRef::const_iterator vref_begin() const;
00301 INLINE VertexRef::const_iterator vref_end() const;
00302 INLINE VertexRef::size_type vref_size() const;
00303
00304 PUBLISHED:
00305 #ifdef _DEBUG
00306 void test_vref_integrity() const;
00307 #else
00308 void test_vref_integrity() const { }
00309 #endif // _DEBUG
00310
00311 void add_group_ref(EggGroup *group);
00312 int get_num_group_refs() const;
00313 EggGroup *get_group_ref(int n) const;
00314 MAKE_SEQ(get_group_refs, get_num_group_refs, get_group_ref);
00315 void remove_group_ref(int n);
00316 void clear_group_refs();
00317
00318 static GroupType string_group_type(const string &strval);
00319 static DartType string_dart_type(const string &strval);
00320 static DCSType string_dcs_type(const string &strval);
00321 static BillboardType string_billboard_type(const string &strval);
00322 static CollisionSolidType string_cs_type(const string &strval);
00323 static CollideFlags string_collide_flags(const string &strval);
00324 static BlendMode string_blend_mode(const string &strval);
00325 static BlendOperand string_blend_operand(const string &strval);
00326
00327 public:
00328 virtual EggTransform *as_transform();
00329
00330 protected:
00331 void write_vertex_ref(ostream &out, int indent_level) const;
00332 virtual bool egg_start_parse_body();
00333 virtual void adjust_under();
00334 virtual void r_transform(const LMatrix4d &mat, const LMatrix4d &inv,
00335 CoordinateSystem to_cs);
00336 virtual void r_flatten_transforms();
00337
00338 virtual void transform_changed();
00339
00340 private:
00341
00342 enum Flags {
00343 F_group_type = 0x00000003,
00344
00345 F_billboard_type = 0x000000e0,
00346 F_switch_flag = 0x00000100,
00347 F_model_flag = 0x00000400,
00348 F_texlist_flag = 0x00000800,
00349 F_nofog_flag = 0x00001000,
00350 F_decal_flag = 0x00002000,
00351 F_direct_flag = 0x00004000,
00352 F_cs_type = 0x000f0000,
00353 F_collide_flags = 0x0ff00000,
00354 F_dart_type = 0xf0000000,
00355 };
00356 enum Flags2 {
00357 F2_collide_mask = 0x00000001,
00358 F2_from_collide_mask = 0x00000002,
00359 F2_into_collide_mask = 0x00000004,
00360 F2_billboard_center = 0x00000008,
00361
00362 F2_dcs_type = 0x00000070,
00363 F2_portal_flag = 0x00000080,
00364 F2_polylight_flag = 0x00000100,
00365 F2_indexed_flag = 0x00000200,
00366 F2_has_indexed_flag = 0x00000400,
00367 F2_has_blend_color = 0x00000800,
00368 F2_occluder_flag = 0x00001000,
00369 };
00370
00371 int _flags;
00372 int _flags2;
00373 CollideMask _collide_mask, _from_collide_mask, _into_collide_mask;
00374 BlendMode _blend_mode;
00375 BlendOperand _blend_operand_a;
00376 BlendOperand _blend_operand_b;
00377 LColor _blend_color;
00378 LPoint3d _billboard_center;
00379 vector_string _object_types;
00380 string _collision_name;
00381 double _fps;
00382 PT(EggSwitchCondition) _lod;
00383 TagData _tag_data;
00384
00385 double _u_speed;
00386 double _v_speed;
00387 double _r_speed;
00388
00389
00390
00391
00392 EggTransform _default_pose;
00393
00394 VertexRef _vref;
00395
00396 typedef pvector< PT(EggGroup) > GroupRefs;
00397 GroupRefs _group_refs;
00398
00399
00400 public:
00401
00402 static TypeHandle get_class_type() {
00403 return _type_handle;
00404 }
00405 static void init_type() {
00406 EggGroupNode::init_type();
00407 EggRenderMode::init_type();
00408 register_type(_type_handle, "EggGroup",
00409 EggGroupNode::get_class_type(),
00410 EggRenderMode::get_class_type());
00411 }
00412 virtual TypeHandle get_type() const {
00413 return get_class_type();
00414 }
00415 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00416
00417 private:
00418 static TypeHandle _type_handle;
00419 };
00420
00421 ostream &operator << (ostream &out, EggGroup::GroupType t);
00422 ostream &operator << (ostream &out, EggGroup::DartType t);
00423 ostream &operator << (ostream &out, EggGroup::DCSType t);
00424 ostream &operator << (ostream &out, EggGroup::BillboardType t);
00425 ostream &operator << (ostream &out, EggGroup::CollisionSolidType t);
00426 ostream &operator << (ostream &out, EggGroup::CollideFlags t);
00427 ostream &operator << (ostream &out, EggGroup::BlendMode t);
00428 ostream &operator << (ostream &out, EggGroup::BlendOperand t);
00429
00430
00431 #include "eggGroup.I"
00432
00433 #endif
00434