00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "eggJointData.h"
00020 #include "eggJointNodePointer.h"
00021 #include "eggMatrixTablePointer.h"
00022
00023 #include "dcast.h"
00024 #include "eggGroup.h"
00025 #include "eggTable.h"
00026 #include "indent.h"
00027
00028
00029
00030
00031
00032
00033
00034 EggJointData::
00035 EggJointData(EggCharacterCollection *collection,
00036 EggCharacterData *char_data) :
00037 EggComponentData(collection, char_data)
00038 {
00039 _parent = (EggJointData *)NULL;
00040 }
00041
00042
00043
00044
00045
00046
00047
00048 EggJointData *EggJointData::
00049 find_joint(const string &name) {
00050 Children::const_iterator ci;
00051 for (ci = _children.begin(); ci != _children.end(); ++ci) {
00052 EggJointData *child = (*ci);
00053 if (child->get_name() == name) {
00054 return child;
00055 }
00056 EggJointData *result = child->find_joint(name);
00057 if (result != (EggJointData *)NULL) {
00058 return result;
00059 }
00060 }
00061
00062 return (EggJointData *)NULL;
00063 }
00064
00065
00066
00067
00068
00069
00070
00071 int EggJointData::
00072 get_num_frames(int model_index) const {
00073 EggBackPointer *back = get_model(model_index);
00074 if (back == (EggBackPointer *)NULL) {
00075 return 0;
00076 }
00077
00078 EggJointPointer *joint;
00079 DCAST_INTO_R(joint, back, 0);
00080
00081 return joint->get_num_frames();
00082 }
00083
00084
00085
00086
00087
00088
00089
00090
00091 LMatrix4d EggJointData::
00092 get_frame(int model_index, int n) const {
00093 EggBackPointer *back = get_model(model_index);
00094 if (back == (EggBackPointer *)NULL) {
00095 return LMatrix4d::ident_mat();
00096 }
00097
00098 EggJointPointer *joint;
00099 DCAST_INTO_R(joint, back, LMatrix4d::ident_mat());
00100
00101 return joint->get_frame(n);
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111 LMatrix4d EggJointData::
00112 get_net_frame(int model_index, int n) const {
00113 LMatrix4d mat = get_frame(model_index, n);
00114 if (_parent != (EggJointData *)NULL) {
00115 mat = mat * _parent->get_net_frame(model_index, n);
00116 }
00117 return mat;
00118 }
00119
00120
00121
00122
00123
00124
00125
00126
00127 bool EggJointData::
00128 do_rebuild() {
00129 bool all_ok = true;
00130
00131 BackPointers::iterator bpi;
00132 for (bpi = _back_pointers.begin(); bpi != _back_pointers.end(); ++bpi) {
00133 EggBackPointer *back = (*bpi);
00134 if (back != (EggBackPointer *)NULL) {
00135 EggJointPointer *joint;
00136 DCAST_INTO_R(joint, back, false);
00137 if (!joint->do_rebuild()) {
00138 all_ok = false;
00139 }
00140 }
00141 }
00142
00143 Children::iterator ci;
00144 for (ci = _children.begin(); ci != _children.end(); ++ci) {
00145 EggJointData *child = (*ci);
00146 if (!child->do_rebuild()) {
00147 all_ok = false;
00148 }
00149 }
00150
00151 return all_ok;
00152 }
00153
00154
00155
00156
00157
00158
00159
00160 void EggJointData::
00161 optimize() {
00162 BackPointers::iterator bpi;
00163 for (bpi = _back_pointers.begin(); bpi != _back_pointers.end(); ++bpi) {
00164 EggBackPointer *back = (*bpi);
00165 if (back != (EggBackPointer *)NULL) {
00166 EggJointPointer *joint;
00167 DCAST_INTO_V(joint, back);
00168 joint->optimize();
00169 }
00170 }
00171
00172 Children::iterator ci;
00173 for (ci = _children.begin(); ci != _children.end(); ++ci) {
00174 EggJointData *child = (*ci);
00175 child->optimize();
00176 }
00177 }
00178
00179
00180
00181
00182
00183
00184
00185 void EggJointData::
00186 add_back_pointer(int model_index, EggObject *egg_object) {
00187 if (egg_object->is_of_type(EggGroup::get_class_type())) {
00188
00189 EggJointNodePointer *joint = new EggJointNodePointer(egg_object);
00190 set_model(model_index, joint);
00191
00192 } else if (egg_object->is_of_type(EggTable::get_class_type())) {
00193
00194 EggMatrixTablePointer *xform = new EggMatrixTablePointer(egg_object);
00195 set_model(model_index, xform);
00196
00197 } else {
00198 nout << "Invalid object added to joint for back pointer.\n";
00199 }
00200 }
00201
00202
00203
00204
00205
00206
00207 void EggJointData::
00208 write(ostream &out, int indent_level) const {
00209 indent(out, indent_level)
00210 << "Joint " << get_name()
00211 << " (models:";
00212 int num_models = get_num_models();
00213 for (int model_index = 0; model_index < num_models; model_index++) {
00214 if (has_model(model_index)) {
00215 out << " " << model_index;
00216 }
00217 }
00218 out << ") {\n";
00219
00220 Children::const_iterator ci;
00221 for (ci = _children.begin(); ci != _children.end(); ++ci) {
00222 (*ci)->write(out, indent_level + 2);
00223 }
00224
00225 indent(out, indent_level) << "}\n";
00226 }