00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef EGGGROUPNODE_H
00016 #define EGGGROUPNODE_H
00017
00018 #include "pandabase.h"
00019
00020 #include "eggNode.h"
00021 #include "eggVertexPool.h"
00022
00023 #include "coordinateSystem.h"
00024 #include "typedObject.h"
00025 #include "pointerTo.h"
00026 #include "luse.h"
00027 #include "globPattern.h"
00028 #include "plist.h"
00029
00030 class EggTextureCollection;
00031 class EggMaterialCollection;
00032 class EggPolygon;
00033 class EggVertex;
00034 class EggVertexPool;
00035 class DSearchPath;
00036 class BamCacheRecord;
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 class EXPCL_PANDAEGG EggGroupNode : public EggNode {
00052
00053
00054
00055
00056
00057 private:
00058
00059
00060
00061 typedef plist< PT(EggNode) > Children;
00062
00063
00064
00065 PUBLISHED:
00066 EggGroupNode(const string &name = "") : EggNode(name) { }
00067 EggGroupNode(const EggGroupNode ©);
00068 EggGroupNode &operator = (const EggGroupNode ©);
00069 virtual ~EggGroupNode();
00070
00071 virtual void write(ostream &out, int indent_level) const;
00072
00073
00074
00075
00076
00077 public:
00078 #if defined(WIN32_VC) || defined(WIN64_VC)
00079 typedef const PT(EggNode) *pointer;
00080 typedef const PT(EggNode) *const_pointer;
00081 #else
00082 typedef Children::const_pointer pointer;
00083 typedef Children::const_pointer const_pointer;
00084 #endif
00085 typedef Children::const_reference reference;
00086 typedef Children::const_reference const_reference;
00087 typedef Children::const_iterator iterator;
00088 typedef Children::const_iterator const_iterator;
00089 typedef Children::const_reverse_iterator reverse_iterator;
00090 typedef Children::const_reverse_iterator const_reverse_iterator;
00091 typedef Children::size_type size_type;
00092 typedef Children::difference_type difference_type;
00093
00094 iterator begin() const;
00095 iterator end() const;
00096 reverse_iterator rbegin() const;
00097 reverse_iterator rend() const;
00098
00099 iterator insert(iterator position, PT(EggNode) x);
00100 iterator erase(iterator position);
00101 iterator erase(iterator first, iterator last);
00102 void replace(iterator position, PT(EggNode) x);
00103
00104 PUBLISHED:
00105 bool empty() const;
00106 size_type size() const;
00107 void clear();
00108
00109
00110
00111
00112
00113 EggNode *get_first_child();
00114 EggNode *get_next_child();
00115
00116 EggNode *add_child(EggNode *node);
00117 PT(EggNode) remove_child(EggNode *node);
00118 void steal_children(EggGroupNode &other);
00119
00120 EggNode *find_child(const string &name) const;
00121
00122 bool has_absolute_pathnames() const;
00123 void resolve_filenames(const DSearchPath &searchpath);
00124 void force_filenames(const Filename &directory);
00125 void reverse_vertex_ordering();
00126
00127 void recompute_vertex_normals(double threshold, CoordinateSystem cs = CS_default);
00128 void recompute_polygon_normals(CoordinateSystem cs = CS_default);
00129 void strip_normals();
00130
00131 bool recompute_tangent_binormal(const GlobPattern &uv_name);
00132 bool recompute_tangent_binormal(const vector_string &names);
00133 bool recompute_tangent_binormal_auto();
00134
00135 enum TriangulateFlags {
00136 T_polygon = 0x001,
00137 T_convex = 0x002,
00138 T_composite = 0x004,
00139 T_recurse = 0x008,
00140 T_flat_shaded = 0x010,
00141 };
00142
00143 int triangulate_polygons(int flags);
00144 void mesh_triangles(int flags);
00145 void make_point_primitives();
00146
00147 int rename_nodes(vector_string strip_prefix, bool recurse);
00148
00149 int remove_unused_vertices(bool recurse);
00150 int remove_invalid_primitives(bool recurse);
00151 void clear_connected_shading();
00152 void get_connected_shading();
00153 void unify_attributes(bool use_connected_shading, bool allow_per_primitive,
00154 bool recurse);
00155 void apply_last_attribute(bool recurse);
00156 void apply_first_attribute(bool recurse);
00157 void post_apply_flat_attribute(bool recurse);
00158 virtual bool has_primitives() const;
00159 virtual bool joint_has_primitives() const;
00160 virtual bool has_normals() const;
00161
00162 public:
00163 void rebuild_vertex_pools(EggVertexPools &vertex_pools,
00164 unsigned int max_vertices,
00165 bool recurse);
00166
00167 protected:
00168 virtual void update_under(int depth_offset);
00169
00170 virtual void r_transform(const LMatrix4d &mat, const LMatrix4d &inv,
00171 CoordinateSystem to_cs);
00172 virtual void r_transform_vertices(const LMatrix4d &mat);
00173 virtual void r_mark_coordsys(CoordinateSystem cs);
00174 virtual void r_flatten_transforms();
00175 virtual void r_apply_texmats(EggTextureCollection &textures);
00176
00177
00178 CoordinateSystem find_coordsys_entry();
00179 int find_textures(EggTextureCollection *collection);
00180 int find_materials(EggMaterialCollection *collection);
00181 bool r_load_externals(const DSearchPath &searchpath,
00182 CoordinateSystem coordsys,
00183 BamCacheRecord *record);
00184
00185 PUBLISHED:
00186 INLINE static bool is_right(const LVector2d &v1, const LVector2d &v2);
00187
00188 private:
00189 Children _children;
00190 const_iterator _gnc_iterator;
00191
00192
00193
00194
00195 void prepare_add_child(EggNode *node);
00196 void prepare_remove_child(EggNode *node);
00197
00198
00199 class NVertexReference {
00200 public:
00201 EggPolygon *_polygon;
00202 LNormald _normal;
00203 size_t _vertex;
00204 };
00205 typedef pvector<NVertexReference> NVertexGroup;
00206 typedef pmap<LVertexd, NVertexGroup> NVertexCollection;
00207
00208 void r_collect_vertex_normals(NVertexCollection &collection,
00209 double threshold, CoordinateSystem cs);
00210 void do_compute_vertex_normals(const NVertexGroup &group);
00211
00212
00213 class TBNVertexReference {
00214 public:
00215 EggPolygon *_polygon;
00216 size_t _vertex;
00217 LVector3d _sdir;
00218 LVector3d _tdir;
00219 };
00220 class TBNVertexValue {
00221 public:
00222 INLINE bool operator < (const TBNVertexValue &other) const;
00223 LVertexd _pos;
00224 LNormald _normal;
00225 string _uv_name;
00226 LTexCoordd _uv;
00227 bool _facing;
00228 };
00229 typedef pvector<TBNVertexReference> TBNVertexGroup;
00230 typedef pmap<TBNVertexValue, TBNVertexGroup> TBNVertexCollection;
00231
00232 void r_collect_tangent_binormal(const GlobPattern &uv_name,
00233 TBNVertexCollection &collection);
00234 void do_compute_tangent_binormal(const TBNVertexValue &value,
00235 const TBNVertexGroup &group);
00236
00237 public:
00238 static TypeHandle get_class_type() {
00239 return _type_handle;
00240 }
00241 static void init_type() {
00242 EggNode::init_type();
00243 register_type(_type_handle, "EggGroupNode",
00244 EggNode::get_class_type());
00245 }
00246 virtual TypeHandle get_type() const {
00247 return get_class_type();
00248 }
00249 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00250
00251 private:
00252 static TypeHandle _type_handle;
00253
00254 friend class EggTextureCollection;
00255 friend class EggMaterialCollection;
00256 };
00257
00258 #include "eggGroupNode.I"
00259
00260 #endif
00261