Panda3D
animPreloadTable.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file animPreloadTable.cxx
10  * @author drose
11  * @date 2008-08-05
12  */
13 
14 #include "animPreloadTable.h"
15 
16 #include "indent.h"
17 #include "datagram.h"
18 #include "datagramIterator.h"
19 #include "bamReader.h"
20 #include "bamWriter.h"
21 
22 TypeHandle AnimPreloadTable::_type_handle;
23 
24 /**
25  * Required to implement CopyOnWriteObject.
26  */
27 PT(CopyOnWriteObject) AnimPreloadTable::
28 make_cow_copy() {
29  return new AnimPreloadTable(*this);
30 }
31 
32 /**
33  *
34  */
35 AnimPreloadTable::
36 AnimPreloadTable() {
37  _needs_sort = false;
38 }
39 
40 /**
41  *
42  */
43 AnimPreloadTable::
44 ~AnimPreloadTable() {
45 }
46 
47 /**
48  * Returns the number of animation records in the table.
49  */
51 get_num_anims() const {
52  return (int)_anims.size();
53 }
54 
55 /**
56  * Returns the index number in the table of the animation record with the
57  * indicated name, or -1 if the name is not present. By convention, the
58  * basename is the filename of the egg or bam file, without the directory part
59  * and without the extension. That is, it is
60  * Filename::get_basename_wo_extension().
61  */
63 find_anim(const std::string &basename) const {
64  consider_sort();
65  AnimRecord record;
66  record._basename = basename;
67  Anims::const_iterator ai = _anims.find(record);
68  if (ai != _anims.end()) {
69  return int(ai - _anims.begin());
70  }
71  return -1;
72 }
73 
74 /**
75  * Removes all animation records from the table.
76  */
79  _anims.clear();
80  _needs_sort = false;
81 }
82 
83 /**
84  * Removes the nth animation records from the table. This renumbers indexes
85  * for following animations.
86  */
88 remove_anim(int n) {
89  nassertv(n >= 0 && n < (int)_anims.size());
90  _anims.erase(_anims.begin() + n);
91 }
92 
93 /**
94  * Adds a new animation record to the table. If there is already a record of
95  * this name, no operation is performed (the original record is unchanged).
96  * See find_anim(). This will invalidate existing index numbers.
97  */
99 add_anim(const std::string &basename, PN_stdfloat base_frame_rate, int num_frames) {
100  AnimRecord record;
101  record._basename = basename;
102  record._base_frame_rate = base_frame_rate;
103  record._num_frames = num_frames;
104 
105  _anims.push_back(record);
106  _needs_sort = true;
107 }
108 
109 /**
110  * Copies the animation records from the other table into this one. If a
111  * given record name exists in both tables, the record in this one supercedes.
112  */
115  _anims.reserve(_anims.size() + other->_anims.size());
116  Anims::const_iterator ai;
117  for (ai = other->_anims.begin(); ai != other->_anims.end(); ++ai) {
118  _anims.push_back(*ai);
119  }
120  _needs_sort = true;
121 }
122 
123 /**
124  *
125  */
126 void AnimPreloadTable::
127 output(std::ostream &out) const {
128  consider_sort();
129  out << "AnimPreloadTable, " << _anims.size() << " animation records.";
130 }
131 
132 /**
133  *
134  */
135 void AnimPreloadTable::
136 write(std::ostream &out, int indent_level) const {
137  consider_sort();
138  indent(out, indent_level)
139  << "AnimPreloadTable, " << _anims.size() << " animation records:\n";
140  Anims::const_iterator ai;
141  for (ai = _anims.begin(); ai != _anims.end(); ++ai) {
142  const AnimRecord &record = (*ai);
143  indent(out, indent_level + 2)
144  << record._basename << ": " << record._num_frames << " frames at "
145  << record._base_frame_rate << " fps\n";
146  }
147 }
148 
149 /**
150  * Factory method to generate an AnimPreloadTable object
151  */
155 }
156 
157 /**
158  * Function to write the important information in the particular object to a
159  * Datagram
160  */
163  consider_sort();
164 
165  dg.add_uint16(_anims.size());
166  Anims::const_iterator ai;
167  for (ai = _anims.begin(); ai != _anims.end(); ++ai) {
168  const AnimRecord &record = (*ai);
169  dg.add_string(record._basename);
170  dg.add_stdfloat(record._base_frame_rate);
171  dg.add_int32(record._num_frames);
172  }
173 }
174 
175 /**
176  * Factory method to generate an AnimPreloadTable object
177  */
179 make_from_bam(const FactoryParams &params) {
181  DatagramIterator scan;
182  BamReader *manager;
183 
184  parse_params(params, scan, manager);
185  me->fillin(scan, manager);
186  return me;
187 }
188 
189 /**
190  * Function that reads out of the datagram (or asks manager to read) all of
191  * the data that is needed to re-create this object and stores it in the
192  * appropiate place
193  */
194 void AnimPreloadTable::
195 fillin(DatagramIterator &scan, BamReader *manager) {
196  int num_anims = scan.get_uint16();
197  _anims.reserve(num_anims);
198  for (int i = 0; i < num_anims; ++i) {
199  AnimRecord record;
200  record._basename = scan.get_string();
201  record._base_frame_rate = scan.get_stdfloat();
202  record._num_frames = scan.get_int32();
203  _anims.push_back(record);
204  }
205 }
static TypedWritable * make_from_bam(const FactoryParams &params)
Factory method to generate an AnimPreloadTable object.
This table records data about a list of animations for a particular model, such as number of frames a...
PN_stdfloat get_stdfloat()
Extracts either a 32-bit or a 64-bit floating-point number, according to Datagram::set_stdfloat_doubl...
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
size_type_0 size() const
Returns the number of elements in the ordered vector.
void clear()
Removes all elements from the ordered vector.
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
iterator_0 begin()
Returns the iterator that marks the first element in the ordered vector.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition: bamWriter.h:63
iterator_0 end()
Returns the iterator that marks the end of the ordered vector.
int32_t get_int32()
Extracts a signed 32-bit integer.
void reserve(size_type_0 n)
Informs the vector of a planned change in size; ensures that the capacity of the vector is greater th...
std::string get_string()
Extracts a variable-length string.
void add_stdfloat(PN_stdfloat value)
Adds either a 32-bit or a 64-bit floating-point number, according to set_stdfloat_double().
Definition: datagram.I:133
void parse_params(const FactoryParams &params, DatagramIterator &scan, BamReader *&manager)
Takes in a FactoryParams, passed from a WritableFactory into any TypedWritable's make function,...
Definition: bamReader.I:275
void add_uint16(uint16_t value)
Adds an unsigned 16-bit integer to the datagram.
Definition: datagram.I:85
PT(CopyOnWriteObject) AnimPreloadTable
Required to implement CopyOnWriteObject.
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
Definition: indent.cxx:20
void add_anims_from(const AnimPreloadTable *other)
Copies the animation records from the other table into this one.
void add_string(const std::string &str)
Adds a variable-length string to the datagram.
Definition: datagram.I:219
An instance of this class is passed to the Factory when requesting it to do its business and construc...
Definition: factoryParams.h:36
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Function to write the important information in the particular object to a Datagram.
void add_anim(const std::string &basename, PN_stdfloat base_frame_rate, int num_frames)
Adds a new animation record to the table.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void register_factory(TypeHandle handle, CreateFunc *func, void *user_data=nullptr)
Registers a new kind of thing the Factory will be able to create.
Definition: factory.I:73
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void push_back(const value_type_0 &key)
Adds the new element to the end of the vector without regard for proper sorting.
This base class provides basic reference counting, but also can be used with a CopyOnWritePointer to ...
void add_int32(int32_t value)
Adds a signed 32-bit integer to the datagram.
Definition: datagram.I:67
uint16_t get_uint16()
Extracts an unsigned 16-bit integer.
static WritableFactory * get_factory()
Returns the global WritableFactory for generating TypedWritable objects.
Definition: bamReader.I:177
void remove_anim(int n)
Removes the nth animation records from the table.
int find_anim(const std::string &basename) const
Returns the index number in the table of the animation record with the indicated name,...
int get_num_anims() const
Returns the number of animation records in the table.
void clear_anims()
Removes all animation records from the table.
A class to retrieve the individual data elements previously stored in a Datagram.
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
static void register_with_read_factory()
Factory method to generate an AnimPreloadTable object.