Panda3D
Loading...
Searching...
No Matches
eggGroup.I
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 eggGroup.I
10 * @author drose
11 * @date 1999-01-16
12 */
13
14/**
15 *
16 */
17INLINE EggGroup::GroupType EggGroup::
18get_group_type() const {
19 return (GroupType)(_flags & F_group_type);
20}
21
22/**
23 * Returns true if this group is an instance type node; i.e. it begins the
24 * root of a local coordinate space. This is not related to instancing
25 * (multiple copies of a node in a scene graph).
26 *
27 * This also includes the case of the node including a billboard flag without
28 * an explicit center, which implicitly makes the node behave like an
29 * instance.
30 */
31INLINE bool EggGroup::
32is_instance_type() const {
33 return
34 (get_group_type() == GT_instance) ||
35 (get_billboard_type() != BT_none && !has_billboard_center());
36}
37
38/**
39 *
40 */
41INLINE void EggGroup::
42set_billboard_type(BillboardType type) {
43 // Make sure the user didn't give us any stray bits.
44 nassertv((type & ~F_billboard_type)==0);
45 _flags = (_flags & ~F_billboard_type) | type;
46 // This may change the transform space of this node.
47 update_under(0);
48}
49
50/**
51 *
52 */
53INLINE EggGroup::BillboardType EggGroup::
54get_billboard_type() const {
55 return (BillboardType)(_flags & F_billboard_type);
56}
57
58/**
59 * Sets the point around which the billboard will rotate, if this node
60 * contains a billboard specification.
61 *
62 * If a billboard type is given but no billboard_center is specified, then the
63 * group node is treated as an <Instance>, and the billboard rotates around
64 * the origin. If, however, a billboard_center is specified, then the group
65 * node is *not* treated as an <Instance>, and the billboard rotates around
66 * the specified point.
67 *
68 * The point is in the same coordinate system as the vertices of this node:
69 * usually global, but possibly local if there is an <Instance> somewhere
70 * above. Specifically, this is the coordinate system defined by
71 * get_vertex_frame().
72 */
73INLINE void EggGroup::
74set_billboard_center(const LPoint3d &billboard_center) {
75 _billboard_center = billboard_center;
76 _flags2 |= F2_billboard_center;
77 // This may change the transform space of this node.
78 update_under(0);
79}
80
81/**
82 *
83 */
84INLINE void EggGroup::
85clear_billboard_center() {
86 _flags2 &= ~F2_billboard_center;
87 // This may change the transform space of this node.
88 update_under(0);
89}
90
91/**
92 *
93 */
94INLINE bool EggGroup::
95has_billboard_center() const {
96 return (_flags2 & F2_billboard_center) != 0;
97}
98
99/**
100 *
101 */
102INLINE const LPoint3d &EggGroup::
103get_billboard_center() const {
104 nassertr(has_billboard_center(), _billboard_center);
105 return _billboard_center;
106}
107
108/**
109 *
110 */
111INLINE void EggGroup::
112set_cs_type(CollisionSolidType type) {
113 // Make sure the user didn't give us any stray bits.
114 nassertv((type & ~F_cs_type)==0);
115 _flags = (_flags & ~F_cs_type) | type;
116}
117
118/**
119 *
120 */
121INLINE EggGroup::CollisionSolidType EggGroup::
122get_cs_type() const {
123 return (CollisionSolidType)(_flags & F_cs_type);
124}
125
126/**
127 *
128 */
129INLINE void EggGroup::
130set_collision_name(const std::string &collision_name) {
131 _collision_name = collision_name;
132}
133
134/**
135 *
136 */
137INLINE void EggGroup::
138clear_collision_name() {
139 _collision_name = "";
140}
141
142/**
143 *
144 */
145INLINE bool EggGroup::
146has_collision_name() const {
147 return !_collision_name.empty();
148}
149
150/**
151 *
152 */
153INLINE const std::string &EggGroup::
154get_collision_name() const {
155 return _collision_name;
156}
157
158/**
159 *
160 */
161INLINE void EggGroup::
162set_collide_flags(int flags) {
163 // Make sure the user didn't give us any stray bits.
164 nassertv((flags & ~F_collide_flags)==0);
165 _flags = (_flags & ~F_collide_flags) | flags;
166}
167
168/**
169 *
170 */
171INLINE EggGroup::CollideFlags EggGroup::
172get_collide_flags() const {
173 return (EggGroup::CollideFlags)(_flags & F_collide_flags);
174}
175
176/**
177 *
178 */
179INLINE void EggGroup::
180set_dcs_type(EggGroup::DCSType type) {
181 // Make sure the user didn't give us any stray bits.
182 nassertv((type & ~F2_dcs_type)==0);
183 _flags2 = (_flags2 & ~F2_dcs_type) | type;
184}
185
186/**
187 *
188 */
189INLINE EggGroup::DCSType EggGroup::
190get_dcs_type() const {
191 return (DCSType)(_flags2 & F2_dcs_type);
192}
193
194/**
195 * Returns true if the specified DCS type is not DC_none and not
196 * DC_unspecified.
197 */
198INLINE bool EggGroup::
199has_dcs_type() const {
200 DCSType type = get_dcs_type();
201 return (type != DC_none && type != DC_unspecified);
202}
203
204/**
205 *
206 */
207INLINE void EggGroup::
208set_dart_type(EggGroup::DartType type) {
209 // Make sure the user didn't give us any stray bits.
210 nassertv((type & ~F_dart_type)==0);
211 _flags = (_flags & ~F_dart_type) | type;
212}
213
214/**
215 *
216 */
217INLINE EggGroup::DartType EggGroup::
218get_dart_type() const {
219 return (DartType)(_flags & F_dart_type);
220}
221
222/**
223 *
224 */
225INLINE void EggGroup::
226set_switch_flag(bool flag) {
227 if (flag) {
228 _flags |= F_switch_flag;
229 } else {
230 _flags &= ~F_switch_flag;
231 }
232}
233
234/**
235 *
236 */
237INLINE bool EggGroup::
238get_switch_flag() const {
239 return ((_flags & F_switch_flag) != 0);
240}
241
242/**
243 *
244 */
245INLINE void EggGroup::
246set_switch_fps(double fps) {
247 _fps = fps;
248}
249
250/**
251 *
252 */
253INLINE double EggGroup::
254get_switch_fps() const {
255 return _fps;
256}
257
258/**
259 *
260 */
261INLINE void EggGroup::
262add_object_type(const std::string &object_type) {
263 _object_types.push_back(object_type);
264}
265
266/**
267 *
268 */
269INLINE void EggGroup::
270clear_object_types() {
271 _object_types.clear();
272}
273
274/**
275 *
276 */
277INLINE int EggGroup::
278get_num_object_types() const {
279 return _object_types.size();
280}
281
282/**
283 *
284 */
285INLINE std::string EggGroup::
286get_object_type(int index) const {
287 nassertr(index >= 0 && index < (int)_object_types.size(), std::string());
288 return _object_types[index];
289}
290
291/**
292 *
293 */
294INLINE void EggGroup::
295set_model_flag(bool flag) {
296 if (flag) {
297 _flags |= F_model_flag;
298 } else {
299 _flags &= ~F_model_flag;
300 }
301}
302
303/**
304 *
305 */
306INLINE bool EggGroup::
307get_model_flag() const {
308 return ((_flags & F_model_flag) != 0);
309}
310
311/**
312 *
313 */
314INLINE void EggGroup::
315set_texlist_flag(bool flag) {
316 if (flag) {
317 _flags |= F_texlist_flag;
318 } else {
319 _flags &= ~F_texlist_flag;
320 }
321}
322
323/**
324 *
325 */
326INLINE bool EggGroup::
327get_texlist_flag() const {
328 return ((_flags & F_texlist_flag) != 0);
329}
330
331/**
332 *
333 */
334INLINE void EggGroup::
335set_nofog_flag(bool flag) {
336 if (flag) {
337 _flags |= F_nofog_flag;
338 } else {
339 _flags &= ~F_nofog_flag;
340 }
341}
342
343/**
344 *
345 */
346INLINE bool EggGroup::
347get_nofog_flag() const {
348 return ((_flags & F_nofog_flag) != 0);
349}
350
351/**
352 *
353 */
354INLINE void EggGroup::
355set_decal_flag(bool flag) {
356 if (flag) {
357 _flags |= F_decal_flag;
358 } else {
359 _flags &= ~F_decal_flag;
360 }
361}
362
363/**
364 *
365 */
366INLINE bool EggGroup::
367get_decal_flag() const {
368 return ((_flags & F_decal_flag) != 0);
369}
370
371/**
372 *
373 */
374INLINE void EggGroup::
375set_direct_flag(bool flag) {
376 if (flag) {
377 _flags |= F_direct_flag;
378 } else {
379 _flags &= ~F_direct_flag;
380 }
381}
382
383/**
384 *
385 */
386INLINE bool EggGroup::
387get_direct_flag() const {
388 return ((_flags & F_direct_flag) != 0);
389}
390
391
392/**
393 *
394 */
395INLINE void EggGroup::
396set_portal_flag(bool flag) {
397 if (flag) {
398 _flags2 |= F2_portal_flag;
399 } else {
400 _flags2 &= ~F2_portal_flag;
401 }
402}
403
404/**
405 *
406 */
407INLINE bool EggGroup::
408get_portal_flag() const {
409 return ((_flags2 & F2_portal_flag) != 0);
410}
411
412/**
413 *
414 */
415INLINE void EggGroup::
416set_occluder_flag(bool flag) {
417 if (flag) {
418 _flags2 |= F2_occluder_flag;
419 } else {
420 _flags2 &= ~F2_occluder_flag;
421 }
422}
423
424/**
425 *
426 */
427INLINE bool EggGroup::
428get_occluder_flag() const {
429 return ((_flags2 & F2_occluder_flag) != 0);
430}
431
432/**
433 *
434 */
435INLINE void EggGroup::
436set_polylight_flag(bool flag) {
437 if (flag) {
438 _flags2 |= F2_polylight_flag;
439 } else {
440 _flags2 &= ~F2_polylight_flag;
441 }
442}
443
444/**
445 *
446 */
447INLINE bool EggGroup::
448get_polylight_flag() const {
449 return ((_flags2 & F2_polylight_flag) != 0);
450}
451
452/**
453 * If this flag is true, geometry at this node and below will be generated as
454 * indexed geometry.
455 */
456INLINE void EggGroup::
457set_indexed_flag(bool flag) {
458 if (flag) {
459 _flags2 |= F2_indexed_flag;
460 } else {
461 _flags2 &= ~F2_indexed_flag;
462 }
463 _flags2 |= F2_has_indexed_flag;
464}
465
466/**
467 *
468 */
469INLINE void EggGroup::
470clear_indexed_flag() {
471 _flags2 &= ~(F2_indexed_flag | F2_has_indexed_flag);
472}
473
474/**
475 *
476 */
477INLINE bool EggGroup::
478has_indexed_flag() const {
479 return (_flags2 & F2_has_indexed_flag) != 0;
480}
481
482/**
483 *
484 */
485INLINE bool EggGroup::
486get_indexed_flag() const {
487 nassertr(has_indexed_flag(), false);
488 return ((_flags2 & F2_indexed_flag) != 0);
489}
490
491/**
492 *
493 */
494INLINE void EggGroup::
495set_collide_mask(CollideMask mask) {
496 _collide_mask = mask;
497 _flags2 |= F2_collide_mask;
498}
499
500/**
501 *
502 */
503INLINE void EggGroup::
504clear_collide_mask() {
505 _flags2 &= ~F2_collide_mask;
506 _collide_mask = CollideMask::all_off();
507}
508
509/**
510 *
511 */
512INLINE bool EggGroup::
513has_collide_mask() const {
514 return (_flags2 & F2_collide_mask) != 0;
515}
516
517/**
518 *
519 */
520INLINE CollideMask EggGroup::
521get_collide_mask() const {
522 return _collide_mask;
523}
524
525/**
526 *
527 */
528INLINE void EggGroup::
529set_from_collide_mask(CollideMask mask) {
530 _from_collide_mask = mask;
531 _flags2 |= F2_from_collide_mask;
532}
533
534/**
535 *
536 */
537INLINE void EggGroup::
538clear_from_collide_mask() {
539 _flags2 &= ~F2_from_collide_mask;
540 _from_collide_mask = CollideMask::all_off();
541}
542
543/**
544 *
545 */
546INLINE bool EggGroup::
547has_from_collide_mask() const {
548 return (_flags2 & F2_from_collide_mask) != 0;
549}
550
551/**
552 *
553 */
554INLINE CollideMask EggGroup::
555get_from_collide_mask() const {
556 return _from_collide_mask;
557}
558
559/**
560 *
561 */
562INLINE void EggGroup::
563set_into_collide_mask(CollideMask mask) {
564 _into_collide_mask = mask;
565 _flags2 |= F2_into_collide_mask;
566}
567
568/**
569 *
570 */
571INLINE void EggGroup::
572clear_into_collide_mask() {
573 _flags2 &= ~F2_into_collide_mask;
574 _into_collide_mask = CollideMask::all_off();
575}
576
577/**
578 *
579 */
580INLINE bool EggGroup::
581has_into_collide_mask() const {
582 return (_flags2 & F2_into_collide_mask) != 0;
583}
584
585/**
586 *
587 */
588INLINE CollideMask EggGroup::
589get_into_collide_mask() const {
590 return _into_collide_mask;
591}
592
593/**
594 *
595 */
596INLINE void EggGroup::
597set_blend_mode(EggGroup::BlendMode blend_mode) {
598 _blend_mode = blend_mode;
599}
600
601/**
602 *
603 */
604INLINE EggGroup::BlendMode EggGroup::
605get_blend_mode() const {
606 return _blend_mode;
607}
608
609/**
610 *
611 */
612INLINE void EggGroup::
613set_blend_operand_a(EggGroup::BlendOperand blend_operand_a) {
614 _blend_operand_a = blend_operand_a;
615}
616
617/**
618 *
619 */
620INLINE EggGroup::BlendOperand EggGroup::
621get_blend_operand_a() const {
622 return _blend_operand_a;
623}
624
625/**
626 *
627 */
628INLINE void EggGroup::
629set_blend_operand_b(EggGroup::BlendOperand blend_operand_b) {
630 _blend_operand_b = blend_operand_b;
631}
632
633/**
634 *
635 */
636INLINE EggGroup::BlendOperand EggGroup::
637get_blend_operand_b() const {
638 return _blend_operand_b;
639}
640
641/**
642 *
643 */
644INLINE void EggGroup::
645set_blend_color(const LColor &blend_color) {
646 _blend_color = blend_color;
647 _flags2 |= F2_has_blend_color;
648}
649
650/**
651 * Removes the blend color specification.
652 */
653INLINE void EggGroup::
655 _blend_color = LColor::zero();
656 _flags2 &= ~F2_has_blend_color;
657}
658
659/**
660 * Returns true if the blend color has been specified, false otherwise.
661 */
662INLINE bool EggGroup::
663has_blend_color() const {
664 return (_flags2 & F2_has_blend_color) != 0;
665}
666
667/**
668 * Returns the blend color if one has been specified, or (0, 0, 0, 0) if one
669 * has not.
670 */
671INLINE const LColor &EggGroup::
672get_blend_color() const {
673 return _blend_color;
674}
675
676/**
677 *
678 */
679INLINE void EggGroup::
680set_lod(const EggSwitchCondition &lod) {
681 _lod = lod.make_copy();
682}
683
684/**
685 *
686 */
687INLINE void EggGroup::
688clear_lod() {
689 _lod = nullptr;
690}
691
692/**
693 *
694 */
695INLINE bool EggGroup::
696has_lod() const {
697 return (_lod != nullptr);
698}
699
700/**
701 *
702 */
703INLINE const EggSwitchCondition &EggGroup::
704get_lod() const {
705 return *_lod;
706}
707
708/**
709 * Associates a user-defined value with a user-defined key which is stored on
710 * the node. This value has no meaning to Panda; but it is stored
711 * indefinitely on the node until it is requested again. This value will be
712 * copied to the PandaNode that is created for this particular EggGroup if the
713 * egg file is loaded as a scene.
714 *
715 * Each unique key stores a different string value. There is no effective
716 * limit on the number of different keys that may be stored or on the length
717 * of any one key's value.
718 */
719INLINE void EggGroup::
720set_tag(const std::string &key, const std::string &value) {
721 _tag_data[key] = value;
722}
723
724/**
725 * Retrieves the user-defined value that was previously set on this node for
726 * the particular key, if any. If no value has been previously set, returns
727 * the empty string.
728 */
729INLINE std::string EggGroup::
730get_tag(const std::string &key) const {
731 TagData::const_iterator ti;
732 ti = _tag_data.find(key);
733 if (ti != _tag_data.end()) {
734 return (*ti).second;
735 }
736 return std::string();
737}
738
739/**
740 * Returns true if a value has been defined on this node for the particular
741 * key (even if that value is the empty string), or false if no value has been
742 * set.
743 */
744INLINE bool EggGroup::
745has_tag(const std::string &key) const {
746 TagData::const_iterator ti;
747 ti = _tag_data.find(key);
748 return (ti != _tag_data.end());
749}
750
751/**
752 * Removes the value defined for this key on this particular node. After a
753 * call to clear_tag(), has_tag() will return false for the indicated key.
754 */
755INLINE void EggGroup::
756clear_tag(const std::string &key) {
757 _tag_data.erase(key);
758}
759
760/**
761 * Returns a read-only accessor to the initial pose transform. This is the
762 * <DefaultPose> entry for a Joint, and defines only the initial transform
763 * pose for the unanimated joint; it has nothing to do with the group's
764 * <Transform> entry, which defines the (eventual) space of the group's
765 * vertices.
766 */
767INLINE const EggTransform &EggGroup::
768get_default_pose() const {
769 return _default_pose;
770}
771
772/**
773 * Returns a writable accessor to the initial pose transform. This is the
774 * <DefaultPose> entry for a Joint, and defines only the initial transform
775 * pose for the unanimated joint; it has nothing to do with the group's
776 * <Transform> entry, which defines the (eventual) space of the group's
777 * vertices.
778 */
781 return _default_pose;
782}
783
784/**
785 * Replaces the initial pose transform. This is the <DefaultPose> entry for a
786 * Joint, and defines only the initial transform pose for the unanimated
787 * joint; it has nothing to do with the group's <Transform> entry, which
788 * defines the (eventual) space of the group's vertices.
789 */
790INLINE void EggGroup::
791set_default_pose(const EggTransform &transform) {
792 _default_pose = transform;
793}
794
795/**
796 * Removes the initial pose transform. See set_default_pose().
797 */
798INLINE void EggGroup::
800 _default_pose.clear_transform();
801}
802
803/**
804 * Returns an iterator that can, in conjunction with tag_end(), be used to
805 * traverse the entire set of tag keys. Each iterator returns a pair<string,
806 * string>.
807 *
808 * This interface is not safe to use outside of PANDAEGG.DLL.
809 */
810INLINE EggGroup::TagData::const_iterator EggGroup::
811tag_begin() const {
812 return _tag_data.begin();
813}
814
815/**
816 * Returns an iterator that can, in conjunction with tag_begin(), be used to
817 * traverse the entire set of tag keys. Each iterator returns a pair<string,
818 * string>.
819 *
820 * This interface is not safe to use outside of PANDAEGG.DLL.
821 */
822INLINE EggGroup::TagData::const_iterator EggGroup::
823tag_end() const {
824 return _tag_data.end();
825}
826
827/**
828 * Returns the number of elements between tag_begin() and tag_end().
829 *
830 * This interface is not safe to use outside of PANDAEGG.DLL.
831 */
832INLINE EggGroup::TagData::size_type EggGroup::
833tag_size() const {
834 return _tag_data.size();
835}
836
837/**
838 * Returns an iterator that can, in conjunction with vref_end(), be used to
839 * traverse the entire set of referenced vertices. Each iterator returns a
840 * pair<PT(EggVertex), double>.
841 *
842 * This interface is not safe to use outside of PANDAEGG.DLL.
843 */
844INLINE EggGroup::VertexRef::const_iterator EggGroup::
845vref_begin() const {
846 return _vref.begin();
847}
848
849/**
850 * Returns an iterator that can, in conjunction with vref_begin(), be used to
851 * traverse the entire set of referenced vertices. Each iterator returns a
852 * pair<PT(EggVertex), double>.
853 *
854 * This interface is not safe to use outside of PANDAEGG.DLL.
855 */
856INLINE EggGroup::VertexRef::const_iterator EggGroup::
857vref_end() const {
858 return _vref.end();
859}
860
861/**
862 * Returns the number of elements between vref_begin() and vref_end().
863 *
864 * This interface is not safe to use outside of PANDAEGG.DLL.
865 */
866INLINE EggGroup::VertexRef::size_type EggGroup::
867vref_size() const {
868 return _vref.size();
869}
870
871INLINE void EggGroup::
872set_scroll_u(const double u_speed) {
873 _u_speed = u_speed;
874}
875
876INLINE void EggGroup::
877set_scroll_v(const double v_speed) {
878 _v_speed = v_speed;
879}
880
881INLINE void EggGroup::
882set_scroll_w(const double w_speed) {
883 _w_speed = w_speed;
884}
885
886INLINE void EggGroup::
887set_scroll_r(const double r_speed) {
888 _r_speed = r_speed;
889}
890
891INLINE double EggGroup::
892get_scroll_u() const {
893 return _u_speed;
894}
895
896INLINE double EggGroup::
897get_scroll_v() const {
898 return _v_speed;
899}
900
901INLINE double EggGroup::
902get_scroll_w() const {
903 return _w_speed;
904}
905
906INLINE double EggGroup::
907get_scroll_r() const {
908 return _r_speed;
909}
910
911
912INLINE bool EggGroup::
913has_scrolling_uvs() {
914 return (_u_speed != 0) || (_v_speed != 0) || (_w_speed != 0) || (_r_speed != 0);
915}
static BitMask< uint32_t, nbits > all_off()
Returns a BitMask whose bits are all off.
Definition bitMask.I:43
get_blend_color
Returns the blend color if one has been specified, or (0, 0, 0, 0) if one has not.
Definition eggGroup.h:318
void clear_tag(const std::string &key)
Removes the value defined for this key on this particular node.
Definition eggGroup.I:756
TagData::const_iterator tag_begin() const
Returns an iterator that can, in conjunction with tag_end(), be used to traverse the entire set of ta...
Definition eggGroup.I:811
set_billboard_center
Sets the point around which the billboard will rotate, if this node contains a billboard specificatio...
Definition eggGroup.h:290
void clear_default_pose()
Removes the initial pose transform.
Definition eggGroup.I:799
clear_blend_color
Removes the blend color specification.
Definition eggGroup.h:318
std::string get_tag(const std::string &key) const
Retrieves the user-defined value that was previously set on this node for the particular key,...
Definition eggGroup.I:730
VertexRef::size_type vref_size() const
Returns the number of elements between vref_begin() and vref_end().
Definition eggGroup.I:867
bool has_tag(const std::string &key) const
Returns true if a value has been defined on this node for the particular key (even if that value is t...
Definition eggGroup.I:745
EggTransform & modify_default_pose()
Returns a writable accessor to the initial pose transform.
Definition eggGroup.I:780
TagData::const_iterator tag_end() const
Returns an iterator that can, in conjunction with tag_begin(), be used to traverse the entire set of ...
Definition eggGroup.I:823
get_default_pose
Returns a read-only accessor to the initial pose transform.
Definition eggGroup.h:320
bool has_dcs_type() const
Returns true if the specified DCS type is not DC_none and not DC_unspecified.
Definition eggGroup.I:199
void set_tag(const std::string &key, const std::string &value)
Associates a user-defined value with a user-defined key which is stored on the node.
Definition eggGroup.I:720
has_blend_color
Returns true if the blend color has been specified, false otherwise.
Definition eggGroup.h:318
bool is_instance_type() const
Returns true if this group is an instance type node; i.e.
Definition eggGroup.I:32
VertexRef::const_iterator vref_begin() const
Returns an iterator that can, in conjunction with vref_end(), be used to traverse the entire set of r...
Definition eggGroup.I:845
set_indexed_flag
If this flag is true, geometry at this node and below will be generated as indexed geometry.
Definition eggGroup.h:307
TagData::size_type tag_size() const
Returns the number of elements between tag_begin() and tag_end().
Definition eggGroup.I:833
set_default_pose
Replaces the initial pose transform.
Definition eggGroup.h:320
VertexRef::const_iterator vref_end() const
Returns an iterator that can, in conjunction with vref_begin(), be used to traverse the entire set of...
Definition eggGroup.I:857
void transform(const LMatrix4d &mat)
Applies the indicated transformation to the node and all of its descendants.
Definition eggNode.I:253
This corresponds to a <SwitchCondition> entry within a group.
This represents the <Transform> entry of a group or texture node: a list of component transform opera...
void clear_transform()
Resets the transform to empty, identity.