historical/toontown-classic.git/panda/include/recorderBase.h
2024-01-16 11:20:27 -06:00

100 lines
2.8 KiB
C++

/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file recorderBase.h
* @author drose
* @date 2004-01-25
*/
#ifndef RECORDERBASE_H
#define RECORDERBASE_H
#include "pandabase.h"
#include "referenceCount.h"
class BamReader;
class BamWriter;
class Datagram;
class DatagramIterator;
class TypedWritable;
/**
* This is the base class to a number of objects that record particular kinds
* of user input (like a MouseRecorder) to use in conjunction with a
* RecorderController to record the user's inputs for a session.
*
* Note that RecorderBase does not actually inherit from TypedObject, even
* though it defines get_type(). The assumption is that the classes that
* derive from RecorderBase might also inherit independently from TypedObject.
*
* It also does not inherit from TypedWritable, but it defines a method called
* write_recorder() which is very similar to a TypedWritable's
* write_datagram(). Classes that derive from RecorderBase and also inherit
* from TypedWritable may choose to remap write_recorder() to do exactly the
* same thing as write_datagram(), or they may choose to write something
* slightly different.
*
* Most types of recorders should derive from Recorder, as it derives from
* ReferenceCount, except for MouseRecorder, which would otherwise doubly
* inherit from ReferenceCount.
*/
class EXPCL_PANDA_RECORDER RecorderBase {
protected:
RecorderBase();
PUBLISHED:
virtual ~RecorderBase();
INLINE bool is_recording() const;
INLINE bool is_playing() const;
public:
virtual void record_frame(BamWriter *manager, Datagram &dg);
virtual void play_frame(DatagramIterator &scan, BamReader *manager);
virtual void write_recorder(BamWriter *manager, Datagram &dg);
// We can't let RecorderBase inherit from ReferenceCount, so we define these
// so we can still manage the reference count.
virtual int get_ref_count() const=0;
virtual void ref() const=0;
virtual bool unref() const=0;
protected:
void fillin_recorder(DatagramIterator &scan, BamReader *manager);
private:
enum Flags {
F_recording = 0x0001,
F_playing = 0x0002,
};
short _flags;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
ReferenceCount::init_type();
register_type(_type_handle, "RecorderBase",
ReferenceCount::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
private:
static TypeHandle _type_handle;
friend class RecorderController;
friend class RecorderTable;
};
#include "recorderBase.I"
#endif