diff --git a/pandatool/src/bam/Sources.pp b/pandatool/src/bam/Sources.pp index e794e0d8b8..9f83a72c66 100644 --- a/pandatool/src/bam/Sources.pp +++ b/pandatool/src/bam/Sources.pp @@ -3,7 +3,7 @@ #define LOCAL_LIBS \ progbase #define OTHER_LIBS \ - parametrics:c collide:c chan:c char:c \ + recorder:c parametrics:c collide:c chan:c char:c \ egg:c pnmimagetypes:c pgraph:c gobj:c \ putil:c linmath:c event:c express:c pandaegg:m panda:m pandaexpress:m \ interrogatedb:c dtoolutil:c dtoolbase:c dconfig:c dtoolconfig:m dtool:m pystub diff --git a/pandatool/src/bam/bamInfo.cxx b/pandatool/src/bam/bamInfo.cxx index 294fa366e3..80b28cd93d 100644 --- a/pandatool/src/bam/bamInfo.cxx +++ b/pandatool/src/bam/bamInfo.cxx @@ -21,6 +21,9 @@ #include "bamFile.h" #include "pandaNode.h" #include "geomNode.h" +#include "recorderHeader.h" +#include "recorderFrame.h" +#include "recorderTable.h" #include "dcast.h" #include "pvector.h" @@ -125,7 +128,6 @@ get_info(const Filename &filename) { nout << filename << " : Bam version " << bam_file.get_file_major_ver() << "." << bam_file.get_file_minor_ver() << "\n"; - typedef pvector Objects; Objects objects; TypedWritable *object = bam_file.read_object(); while (object != (TypedWritable *)NULL || !bam_file.is_eof()) { @@ -134,13 +136,18 @@ get_info(const Filename &filename) { } object = bam_file.read_object(); } - bam_file.resolve(); + if (!bam_file.resolve()) { + nout << "Unable to fully resolve file.\n"; + } bam_file.close(); if (objects.size() == 1 && objects[0]->is_of_type(PandaNode::get_class_type())) { describe_scene_graph(DCAST(PandaNode, objects[0])); + } else if (!objects.empty() && objects[0]->is_of_type(RecorderHeader::get_class_type())) { + describe_session(DCAST(RecorderHeader, objects[0]), objects); + } else { for (int i = 0; i < (int)objects.size(); i++) { describe_general_object(objects[i]); @@ -182,6 +189,48 @@ describe_scene_graph(PandaNode *node) { } } +//////////////////////////////////////////////////////////////////// +// Function: BamInfo::describe_session +// Access: Private +// Description: Called for Bam files that contain a recorded session +// table. +//////////////////////////////////////////////////////////////////// +void BamInfo:: +describe_session(RecorderHeader *header, const BamInfo::Objects &objects) { + char time_buffer[1024]; + strftime(time_buffer, 1024, "%c", + localtime(&header->_start_time)); + + pset recorders; + double last_timestamp = 0.0; + + for (size_t i = 1; i < objects.size(); i++) { + if (objects[i]->is_of_type(RecorderFrame::get_class_type())) { + RecorderFrame *frame = DCAST(RecorderFrame, objects[i]); + if (frame->_table_changed) { + RecorderTable::Recorders::const_iterator ri; + for (ri = frame->_table->_recorders.begin(); + ri != frame->_table->_recorders.end(); + ++ri) { + recorders.insert((*ri).first); + } + } + last_timestamp = frame->_timestamp; + } + } + + nout << "Session, " << last_timestamp + << " secs, " << objects.size() - 1 << " frames, " + << time_buffer << ".\n" + << "Recorders:"; + for (pset::iterator ni = recorders.begin(); + ni != recorders.end(); + ++ni) { + nout << " " << (*ni); + } + nout << "\n"; +} + //////////////////////////////////////////////////////////////////// // Function: BamInfo::describe_general_object // Access: Private diff --git a/pandatool/src/bam/bamInfo.h b/pandatool/src/bam/bamInfo.h index 3c42024bbd..218dc63d6b 100644 --- a/pandatool/src/bam/bamInfo.h +++ b/pandatool/src/bam/bamInfo.h @@ -28,6 +28,7 @@ #include "pvector.h" class TypedWritable; +class RecorderHeader; //////////////////////////////////////////////////////////////////// // Class : BamInfo @@ -43,8 +44,11 @@ protected: virtual bool handle_args(Args &args); private: + typedef pvector Objects; + bool get_info(const Filename &filename); void describe_scene_graph(PandaNode *node); + void describe_session(RecorderHeader *header, const Objects &objects); void describe_general_object(TypedWritable *object); void list_hierarchy(PandaNode *node, int indent_level);