00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef SCENEGRAPHANALYZER_H
00016 #define SCENEGRAPHANALYZER_H
00017
00018 #include "pandabase.h"
00019 #include "typedObject.h"
00020 #include "luse.h"
00021 #include "pmap.h"
00022 #include "pset.h"
00023 #include "bitArray.h"
00024 #include "indirectCompareTo.h"
00025
00026 class PandaNode;
00027 class GeomNode;
00028 class Geom;
00029 class GeomVertexData;
00030 class GeomVertexFormat;
00031 class GeomVertexArrayData;
00032 class Texture;
00033
00034
00035
00036
00037
00038
00039 class EXPCL_PANDA_PGRAPHNODES SceneGraphAnalyzer {
00040 PUBLISHED:
00041 SceneGraphAnalyzer();
00042 ~SceneGraphAnalyzer();
00043
00044 enum LodMode {
00045 LM_lowest,
00046 LM_highest,
00047 LM_all,
00048 LM_none,
00049 };
00050
00051 INLINE void set_lod_mode(LodMode lod_mode);
00052 INLINE LodMode get_lod_mode(LodMode lod_mode) const;
00053
00054 void clear();
00055 void add_node(PandaNode *node);
00056
00057 void write(ostream &out, int indent_level = 0) const;
00058
00059 INLINE int get_num_nodes() const;
00060 INLINE int get_num_instances() const;
00061 INLINE int get_num_transforms() const;
00062 INLINE int get_num_nodes_with_attribs() const;
00063 INLINE int get_num_lod_nodes() const;
00064 INLINE int get_num_geom_nodes() const;
00065 INLINE int get_num_geoms() const;
00066 INLINE int get_num_geom_vertex_datas() const;
00067 INLINE int get_num_geom_vertex_formats() const;
00068 INLINE int get_vertex_data_size() const;
00069
00070 INLINE int get_num_vertices() const;
00071 INLINE int get_num_normals() const;
00072 INLINE int get_num_colors() const;
00073 INLINE int get_num_texcoords() const;
00074 INLINE int get_num_tris() const;
00075 INLINE int get_num_lines() const;
00076 INLINE int get_num_points() const;
00077
00078 INLINE int get_num_individual_tris() const;
00079 INLINE int get_num_tristrips() const;
00080 INLINE int get_num_triangles_in_strips() const;
00081 INLINE int get_num_trifans() const;
00082 INLINE int get_num_triangles_in_fans() const;
00083
00084 INLINE int get_texture_bytes() const;
00085
00086 INLINE int get_num_long_normals() const;
00087 INLINE int get_num_short_normals() const;
00088 INLINE PN_stdfloat get_total_normal_length() const;
00089
00090 private:
00091 void collect_statistics(PandaNode *node, bool under_instance);
00092 void collect_statistics(GeomNode *geom_node);
00093 void collect_statistics(const Geom *geom);
00094 void collect_statistics(Texture *texture);
00095 void collect_statistics(const GeomVertexArrayData *vadata);
00096 void collect_prim_statistics(const GeomVertexArrayData *vadata);
00097
00098 class VDataTracker {
00099 public:
00100 BitArray _referenced_vertices;
00101 };
00102
00103 typedef pmap<PandaNode *, int> Nodes;
00104 typedef pmap<CPT(GeomVertexData), VDataTracker> VDatas;
00105 typedef pset<CPT(GeomVertexFormat) > VFormats;
00106 typedef pset<CPT(GeomVertexArrayData) > VADatas;
00107 typedef pmap<const GeomVertexData *, int, IndirectCompareTo<GeomVertexData> > UniqueVDatas;
00108 typedef pmap<const GeomVertexArrayData *, int, IndirectCompareTo<GeomVertexArrayData> > UniqueVADatas;
00109 typedef pmap<Texture *, int> Textures;
00110
00111 LodMode _lod_mode;
00112
00113 Nodes _nodes;
00114 VDatas _vdatas;
00115 VFormats _vformats;
00116 VADatas _vadatas;
00117 VADatas _prim_vadatas;
00118 UniqueVDatas _unique_vdatas;
00119 UniqueVADatas _unique_vadatas;
00120 UniqueVADatas _unique_prim_vadatas;
00121 Textures _textures;
00122
00123 private:
00124 int _num_nodes;
00125 int _num_instances;
00126 int _num_transforms;
00127 int _num_nodes_with_attribs;
00128 int _num_lod_nodes;
00129 int _num_geom_nodes;
00130 int _num_geoms;
00131 int _num_geom_vertex_datas;
00132 int _num_geom_vertex_formats;
00133 size_t _vertex_data_size;
00134 size_t _prim_data_size;
00135
00136 int _num_vertices;
00137 int _num_vertices_64;
00138 int _num_normals;
00139 int _num_colors;
00140 int _num_texcoords;
00141 int _num_tris;
00142 int _num_lines;
00143 int _num_points;
00144
00145 int _num_individual_tris;
00146 int _num_tristrips;
00147 int _num_triangles_in_strips;
00148 int _num_trifans;
00149 int _num_triangles_in_fans;
00150
00151 int _texture_bytes;
00152
00153 int _num_long_normals;
00154 int _num_short_normals;
00155 PN_stdfloat _total_normal_length;
00156 };
00157
00158 #include "sceneGraphAnalyzer.I"
00159
00160 #endif