00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "fltTransformRotateAboutPoint.h"
00020 #include "fltRecordReader.h"
00021 #include "fltRecordWriter.h"
00022
00023 TypeHandle FltTransformRotateAboutPoint::_type_handle;
00024
00025
00026
00027
00028
00029
00030 FltTransformRotateAboutPoint::
00031 FltTransformRotateAboutPoint(FltHeader *header) : FltTransformRecord(header) {
00032 _center.set(0.0, 0.0, 0.0);
00033 _axis.set(1.0, 0.0, 0.0);
00034 _angle = 0.0;
00035 }
00036
00037
00038
00039
00040
00041
00042
00043 void FltTransformRotateAboutPoint::
00044 set(const LPoint3d ¢er, const LVector3f &axis, float angle) {
00045 _center = center;
00046 _axis = axis;
00047 _angle = angle;
00048
00049 recompute_matrix();
00050 }
00051
00052
00053
00054
00055
00056
00057 const LPoint3d &FltTransformRotateAboutPoint::
00058 get_center() const {
00059 return _center;
00060 }
00061
00062
00063
00064
00065
00066
00067 const LVector3f &FltTransformRotateAboutPoint::
00068 get_axis() const {
00069 return _axis;
00070 }
00071
00072
00073
00074
00075
00076
00077
00078 float FltTransformRotateAboutPoint::
00079 get_angle() const {
00080 return _angle;
00081 }
00082
00083
00084
00085
00086
00087
00088 void FltTransformRotateAboutPoint::
00089 recompute_matrix() {
00090 if (_axis == LVector3f::zero()) {
00091
00092 _matrix = LMatrix4d::ident_mat();
00093 } else {
00094 LVector3d axis = LCAST(double, _axis);
00095
00096 _matrix =
00097 LMatrix4d::translate_mat(-_center) *
00098 LMatrix4d::rotate_mat(_angle, axis, CS_zup_right) *
00099 LMatrix4d::translate_mat(_center);
00100 }
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 bool FltTransformRotateAboutPoint::
00112 extract_record(FltRecordReader &reader) {
00113 if (!FltTransformRecord::extract_record(reader)) {
00114 return false;
00115 }
00116
00117 nassertr(reader.get_opcode() == FO_rotate_about_point, false);
00118 DatagramIterator &iterator = reader.get_iterator();
00119
00120 iterator.skip_bytes(4);
00121
00122 _center[0] = iterator.get_be_float64();
00123 _center[1] = iterator.get_be_float64();
00124 _center[2] = iterator.get_be_float64();
00125 _axis[0] = iterator.get_be_float32();
00126 _axis[1] = iterator.get_be_float32();
00127 _axis[2] = iterator.get_be_float32();
00128 _angle = iterator.get_be_float32();
00129
00130 recompute_matrix();
00131
00132 check_remaining_size(iterator);
00133 return true;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144 bool FltTransformRotateAboutPoint::
00145 build_record(FltRecordWriter &writer) const {
00146 if (!FltTransformRecord::build_record(writer)) {
00147 return false;
00148 }
00149
00150 writer.set_opcode(FO_rotate_about_point);
00151 Datagram &datagram = writer.update_datagram();
00152
00153 datagram.pad_bytes(4);
00154
00155 datagram.add_be_float64(_center[0]);
00156 datagram.add_be_float64(_center[1]);
00157 datagram.add_be_float64(_center[2]);
00158 datagram.add_be_float32(_axis[0]);
00159 datagram.add_be_float32(_axis[1]);
00160 datagram.add_be_float32(_axis[2]);
00161 datagram.add_be_float32(_angle);
00162
00163 return true;
00164 }
00165