Panda3D
fltTransformScale.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 fltTransformScale.cxx
10  * @author drose
11  * @date 2000-08-30
12  */
13 
14 #include "fltTransformScale.h"
15 #include "fltRecordReader.h"
16 #include "fltRecordWriter.h"
17 
18 TypeHandle FltTransformScale::_type_handle;
19 
20 /**
21  *
22  */
23 FltTransformScale::
24 FltTransformScale(FltHeader *header) : FltTransformRecord(header) {
25  _center.set(0.0, 0.0, 0.0);
26  _scale.set(1.0, 1.0, 1.0);
27 }
28 
29 /**
30  * Defines the scale.
31  */
33 set(const LPoint3d &center, const LVecBase3 &scale) {
34  _center = center;
35  _scale = scale;
36 
37  recompute_matrix();
38 }
39 
40 /**
41  * Returns true if the center is specified, false if it is not. For some
42  * reason, MultiGen stores large negative numbers in for the center if it is
43  * not specified. It is unclear what the purpose of this is.
44  */
46 has_center() const {
47  return
48  _center[0] > -1e+08 &&
49  _center[1] > -1e+08 &&
50  _center[2] > -1e+08;
51 }
52 
53 /**
54  *
55  */
56 const LPoint3d &FltTransformScale::
57 get_center() const {
58  return _center;
59 }
60 
61 /**
62  *
63  */
64 const LVecBase3 &FltTransformScale::
65 get_scale() const {
66  return _scale;
67 }
68 
69 /**
70  *
71  */
72 void FltTransformScale::
73 recompute_matrix() {
74  if (has_center()) {
75  _matrix =
76  LMatrix4d::translate_mat(-_center) *
77  LMatrix4d::scale_mat(LCAST(double, _scale)) *
78  LMatrix4d::translate_mat(_center);
79  } else {
80  _matrix =
81  LMatrix4d::scale_mat(LCAST(double, _scale));
82  }
83 }
84 
85 /**
86  * Fills in the information in this record based on the information given in
87  * the indicated datagram, whose opcode has already been read. Returns true
88  * on success, false if the datagram is invalid.
89  */
90 bool FltTransformScale::
91 extract_record(FltRecordReader &reader) {
92  if (!FltTransformRecord::extract_record(reader)) {
93  return false;
94  }
95 
96  nassertr(reader.get_opcode() == FO_scale, false);
97  DatagramIterator &iterator = reader.get_iterator();
98 
99  iterator.skip_bytes(4);
100 
101  _center[0] = iterator.get_be_float64();
102  _center[1] = iterator.get_be_float64();
103  _center[2] = iterator.get_be_float64();
104  _scale[0] = iterator.get_be_float32();
105  _scale[1] = iterator.get_be_float32();
106  _scale[2] = iterator.get_be_float32();
107 
108  iterator.skip_bytes(4); // Undocumented additional padding.
109 
110  recompute_matrix();
111 
112  check_remaining_size(iterator);
113  return true;
114 }
115 
116 /**
117  * Fills up the current record on the FltRecordWriter with data for this
118  * record, but does not advance the writer. Returns true on success, false if
119  * there is some error.
120  */
121 bool FltTransformScale::
122 build_record(FltRecordWriter &writer) const {
123  if (!FltTransformRecord::build_record(writer)) {
124  return false;
125  }
126 
127  writer.set_opcode(FO_scale);
128  Datagram &datagram = writer.update_datagram();
129 
130  datagram.pad_bytes(4); // Undocumented additional padding.
131 
132  datagram.add_be_float64(_center[0]);
133  datagram.add_be_float64(_center[1]);
134  datagram.add_be_float64(_center[2]);
135  datagram.add_be_float32(_scale[0]);
136  datagram.add_be_float32(_scale[1]);
137  datagram.add_be_float32(_scale[2]);
138 
139  datagram.pad_bytes(4); // Undocumented additional padding.
140 
141  return true;
142 }
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This class writes a sequence of FltRecords to an ostream, handling opcode and size counts properly.
This class turns an istream into a sequence of FltRecords by reading a sequence of Datagrams and extr...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void check_remaining_size(const DatagramIterator &di, const std::string &name=std::string()) const
Checks that the iterator has no bytes left, as it should at the end of a successfully read record.
Definition: fltRecord.cxx:254
DatagramIterator & get_iterator()
Returns an iterator suitable for extracting data from the current record.
void pad_bytes(size_t size)
Adds the indicated number of zero bytes to the datagram.
Definition: datagram.cxx:99
This is the first bead in the file, the top of the bead hierarchy, and the primary interface to readi...
Definition: fltHeader.h:44
void add_be_float64(PN_float64 value)
Adds a 64-bit big-endian floating-point number to the datagram.
Definition: datagram.I:209
void add_be_float32(PN_float32 value)
Adds a 32-bit single-precision big-endian floating-point number to the datagram.
Definition: datagram.I:200
void skip_bytes(size_t size)
Skips over the indicated number of bytes in the datagram.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void set(const LPoint3d &center, const LVecBase3 &scale)
Defines the scale.
FltOpcode get_opcode() const
Returns the opcode associated with the current record.
bool has_center() const
Returns true if the center is specified, false if it is not.
A base class for a number of types of ancillary records that follow beads and indicate some kind of a...
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
void set_opcode(FltOpcode opcode)
Sets the opcode associated with the current record.
Datagram & update_datagram()
Returns a modifiable reference to the datagram associated with the current record.
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38