Browse Source

bamInfo recognizes session recordings

David Rose 22 years ago
parent
commit
86526ce0b4
3 changed files with 56 additions and 3 deletions
  1. 1 1
      pandatool/src/bam/Sources.pp
  2. 51 2
      pandatool/src/bam/bamInfo.cxx
  3. 4 0
      pandatool/src/bam/bamInfo.h

+ 1 - 1
pandatool/src/bam/Sources.pp

@@ -3,7 +3,7 @@
   #define LOCAL_LIBS \
   #define LOCAL_LIBS \
     progbase
     progbase
   #define OTHER_LIBS \
   #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 \
     egg:c pnmimagetypes:c pgraph:c gobj:c \
     putil:c linmath:c event:c express:c pandaegg:m panda:m pandaexpress:m \
     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
     interrogatedb:c dtoolutil:c dtoolbase:c dconfig:c dtoolconfig:m dtool:m pystub

+ 51 - 2
pandatool/src/bam/bamInfo.cxx

@@ -21,6 +21,9 @@
 #include "bamFile.h"
 #include "bamFile.h"
 #include "pandaNode.h"
 #include "pandaNode.h"
 #include "geomNode.h"
 #include "geomNode.h"
+#include "recorderHeader.h"
+#include "recorderFrame.h"
+#include "recorderTable.h"
 #include "dcast.h"
 #include "dcast.h"
 #include "pvector.h"
 #include "pvector.h"
 
 
@@ -125,7 +128,6 @@ get_info(const Filename &filename) {
   nout << filename << " : Bam version " << bam_file.get_file_major_ver()
   nout << filename << " : Bam version " << bam_file.get_file_major_ver()
        << "." << bam_file.get_file_minor_ver() << "\n";
        << "." << bam_file.get_file_minor_ver() << "\n";
 
 
-  typedef pvector<TypedWritable *> Objects;
   Objects objects;
   Objects objects;
   TypedWritable *object = bam_file.read_object();
   TypedWritable *object = bam_file.read_object();
   while (object != (TypedWritable *)NULL || !bam_file.is_eof()) {
   while (object != (TypedWritable *)NULL || !bam_file.is_eof()) {
@@ -134,13 +136,18 @@ get_info(const Filename &filename) {
     }
     }
     object = bam_file.read_object();
     object = bam_file.read_object();
   }
   }
-  bam_file.resolve();
+  if (!bam_file.resolve()) {
+    nout << "Unable to fully resolve file.\n";
+  }
   bam_file.close();
   bam_file.close();
 
 
   if (objects.size() == 1 && 
   if (objects.size() == 1 && 
       objects[0]->is_of_type(PandaNode::get_class_type())) {
       objects[0]->is_of_type(PandaNode::get_class_type())) {
     describe_scene_graph(DCAST(PandaNode, objects[0]));
     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 {
   } else {
     for (int i = 0; i < (int)objects.size(); i++) {
     for (int i = 0; i < (int)objects.size(); i++) {
       describe_general_object(objects[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<string> 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<string>::iterator ni = recorders.begin();
+       ni != recorders.end();
+       ++ni) {
+    nout << " " << (*ni);
+  }
+  nout << "\n";
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: BamInfo::describe_general_object
 //     Function: BamInfo::describe_general_object
 //       Access: Private
 //       Access: Private

+ 4 - 0
pandatool/src/bam/bamInfo.h

@@ -28,6 +28,7 @@
 #include "pvector.h"
 #include "pvector.h"
 
 
 class TypedWritable;
 class TypedWritable;
+class RecorderHeader;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //       Class : BamInfo
 //       Class : BamInfo
@@ -43,8 +44,11 @@ protected:
   virtual bool handle_args(Args &args);
   virtual bool handle_args(Args &args);
 
 
 private:
 private:
+  typedef pvector<TypedWritable *> Objects;
+
   bool get_info(const Filename &filename);
   bool get_info(const Filename &filename);
   void describe_scene_graph(PandaNode *node);
   void describe_scene_graph(PandaNode *node);
+  void describe_session(RecorderHeader *header, const Objects &objects);
   void describe_general_object(TypedWritable *object);
   void describe_general_object(TypedWritable *object);
   void list_hierarchy(PandaNode *node, int indent_level);
   void list_hierarchy(PandaNode *node, int indent_level);