00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "daeCharacter.h"
00016 #include "config_daeegg.h"
00017 #include "fcollada_utils.h"
00018 #include "pt_EggVertex.h"
00019 #include "eggXfmSAnim.h"
00020
00021 #include "FCDocument/FCDocument.h"
00022 #include "FCDocument/FCDController.h"
00023 #include "FCDocument/FCDSceneNodeTools.h"
00024
00025 TypeHandle DaeCharacter::_type_handle;
00026
00027
00028
00029
00030
00031
00032 DaeCharacter::
00033 DaeCharacter(const string name, const FCDControllerInstance* controller_instance) {
00034 _controller_instance = (FCDControllerInstance*) controller_instance;
00035 _name = name;
00036 _frame_rate = 0;
00037 _skin_controller = NULL;
00038
00039 FCDController* controller = (FCDController*) controller_instance->GetEntity();
00040 if (controller == NULL) return;
00041 if (controller->IsSkin()) {
00042 _skin_controller = controller->GetSkinController();
00043 if (_skin_controller == NULL) return;
00044 for (size_t j = 0; j < _skin_controller->GetJointCount(); ++j) {
00045 _controller_joints[FROM_FSTRING(_skin_controller->GetJoint(j)->GetId())] = (FCDSkinControllerJoint*) _skin_controller->GetJoint(j);
00046 }
00047 }
00048 }
00049
00050
00051
00052
00053
00054
00055
00056 PT(EggTable) DaeCharacter::
00057 as_egg_bundle() {
00058 PT(EggTable) bundle = new EggTable(_name);
00059 bundle->set_table_type(EggTable::TT_bundle);
00060 PT(EggTable) skeleton = new EggTable("<skeleton>");
00061 skeleton->set_table_type(EggTable::TT_table);
00062 bundle->add_child(skeleton);
00063
00064 #if FCOLLADA_VERSION < 0x00030005
00065 FCDSceneNodeList roots = _controller_instance->FindSkeletonNodes();
00066 #else
00067 FCDSceneNodeList roots;
00068 _controller_instance->FindSkeletonNodes(roots);
00069 #endif
00070 for (FCDSceneNodeList::iterator it = roots.begin(); it != roots.end(); ++it) {
00071 process_joint(skeleton, *it);
00072 }
00073 return bundle;
00074 }
00075
00076
00077
00078
00079
00080
00081 void DaeCharacter::
00082 process_joint(PT(EggTable) parent, FCDSceneNode* node) {
00083 nassertv(node != NULL);
00084 string node_id = FROM_FSTRING(node->GetDaeId());
00085 PT(EggTable) joint = new EggTable(node_id);
00086 joint->set_table_type(EggTable::TT_table);
00087 parent->add_child(joint);
00088 PT(EggXfmSAnim) xform = new EggXfmSAnim("xform");
00089 joint->add_child(xform);
00090 xform->set_fps(_frame_rate);
00091
00092 FCDSceneNodeTools::GenerateSampledAnimation(node);
00093 FMMatrix44List matrices = FCDSceneNodeTools::GetSampledAnimationMatrices();
00094 for (FMMatrix44List::const_iterator it = matrices.begin(); it != matrices.end(); ++it) {
00095 LMatrix4d matr = DAEToEggConverter::convert_matrix(*it);
00096 assert(xform->add_data(matr));
00097 }
00098
00099 for (size_t ch = 0; ch < node->GetChildrenCount(); ++ch) {
00100 if (node->GetChild(ch)->IsJoint()) {
00101 process_joint(joint, node->GetChild(ch));
00102 }
00103 }
00104 }