bamInfo recognizes session recordings

This commit is contained in:
David Rose 2004-02-04 00:52:55 +00:00
parent 220c028394
commit 86526ce0b4
3 changed files with 56 additions and 3 deletions

View File

@ -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

View File

@ -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<TypedWritable *> 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<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
// Access: Private

View File

@ -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<TypedWritable *> 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);