00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "eggToDAE.h"
00016 #include "dcast.h"
00017 #include "pystub.h"
00018 #include "pandaVersion.h"
00019
00020 #include "FCDocument/FCDocument.h"
00021 #include "FCDocument/FCDAsset.h"
00022 #include "FCDocument/FCDTransform.h"
00023
00024
00025 #define TO_VEC3(v) (LVecBase3d(v[0], v[1], v[2]))
00026 #define TO_VEC4(v) (LVecBase4d(v[0], v[1], v[2], v[3]))
00027 #define TO_COLOR(v) (LColor(v[0], v[1], v[2], v[3]))
00028 #define FROM_VEC3(v) (FMVector3(v[0], v[1], v[2]))
00029 #define FROM_VEC4(v) (FMVector4(v[0], v[1], v[2], v[3]))
00030 #define FROM_MAT4(v) (FMMatrix44(v.get_data()))
00031 #define FROM_FSTRING(fs) (fs.c_str())
00032
00033
00034
00035
00036
00037
00038 EggToDAE::
00039 EggToDAE() :
00040 EggToSomething("COLLADA", ".dae", true, false)
00041 {
00042 set_binary_output(false);
00043 set_program_description
00044 ("This program converts files from the egg format to the COLLADA "
00045 ".dae (Digital Asset Exchange) format.");
00046
00047 _document = NULL;
00048 }
00049
00050
00051
00052
00053
00054
00055 void EggToDAE::
00056 run() {
00057 nassertv(has_output_filename());
00058 nassertv(_data != NULL);
00059
00060 FCollada::Initialize();
00061 _document = FCollada::NewTopDocument();
00062
00063
00064 FCDAssetContributor* contributor = _document->GetAsset()->AddContributor();
00065 const char* user_name = getenv("USER");
00066 if (user_name == NULL) user_name = getenv("USERNAME");
00067 if (user_name != NULL) contributor->SetAuthor(TO_FSTRING(user_name));
00068
00069 char authoring_tool[1024];
00070 snprintf(authoring_tool, 1024, "Panda3D %s eggToDAE converter | FCollada v%d.%02d", PANDA_VERSION_STR, FCOLLADA_VERSION >> 16, FCOLLADA_VERSION & 0xFFFF);
00071 authoring_tool[1023] = 0;
00072 contributor->SetAuthoringTool(TO_FSTRING(authoring_tool));
00073
00074
00075 switch (_data->get_coordinate_system()) {
00076 case CS_zup_right:
00077 _document->GetAsset()->SetUpAxis(FMVector3::ZAxis);
00078 break;
00079 case CS_yup_right:
00080 _document->GetAsset()->SetUpAxis(FMVector3::YAxis);
00081 break;
00082 }
00083
00084
00085 FCDSceneNode* visual_scene = _document->AddVisualScene();
00086 for (EggGroupNode::iterator it = _data->begin(); it != _data->end(); ++it) {
00087 if ((*it)->is_of_type(EggGroup::get_class_type())) {
00088 process_node(visual_scene, DCAST(EggGroup, *it));
00089 }
00090 }
00091
00092
00093 FCollada::SaveDocument(_document, get_output_filename().to_os_specific().c_str());
00094 SAFE_DELETE(_document);
00095 FCollada::Release();
00096
00097
00098
00099
00100
00101 }
00102
00103 void EggToDAE::process_node(FCDSceneNode* parent, const PT(EggGroup) node) {
00104 assert(node != NULL);
00105 FCDSceneNode* scene_node = parent->AddChildNode();
00106
00107 scene_node->SetDaeId(node->get_name().c_str());
00108 scene_node->SetJointFlag(node->is_joint());
00109
00110 apply_transform(scene_node, node);
00111
00112 for (EggGroupNode::iterator it = node->begin(); it != node->end(); ++it) {
00113 if ((*it)->is_of_type(EggGroup::get_class_type())) {
00114 process_node(scene_node, DCAST(EggGroup, *it));
00115 }
00116 }
00117 }
00118
00119 void EggToDAE::apply_transform(FCDSceneNode* to, const PT(EggGroup) from) {
00120 assert(to != NULL);
00121 assert(from != NULL);
00122 for (int co = 0; co < from->get_num_components(); ++co) {
00123 switch (from->get_component_type(co)) {
00124 case EggTransform::CT_translate2d:
00125 cerr << "Warning: ignoring non-supported 2d translation\n";
00126 break;
00127 case EggTransform::CT_rotate2d:
00128 cerr << "Warning: ignoring non-supported 2d rotation\n";
00129 break;
00130 case EggTransform::CT_scale2d:
00131 cerr << "Warning: ignoring non-supported 2d scaling\n";
00132 break;
00133 case EggTransform::CT_matrix3:
00134 cerr << "Warning: ignoring non-supported 2d matrix\n";
00135 break;
00136 case EggTransform::CT_translate3d: {
00137 FCDTTranslation* new_transform = (FCDTTranslation*) to->AddTransform(FCDTransform::TRANSLATION);
00138 new_transform->SetTranslation(FROM_VEC3(from->get_component_vec3(co)));
00139 break; }
00140 case EggTransform::CT_rotate3d: {
00141 FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
00142 new_transform->SetRotation(FROM_VEC3(from->get_component_vec3(co)), from->get_component_number(co));
00143 break; }
00144 case EggTransform::CT_scale3d: {
00145 FCDTScale* new_transform = (FCDTScale*) to->AddTransform(FCDTransform::SCALE);
00146 new_transform->SetScale(FROM_VEC3(from->get_component_vec3(co)));
00147 break; }
00148 case EggTransform::CT_matrix4: {
00149 FCDTMatrix* new_transform = (FCDTMatrix*) to->AddTransform(FCDTransform::MATRIX);
00150 new_transform->SetTransform(FROM_MAT4(from->get_component_mat4(co)));
00151 break; }
00152 case EggTransform::CT_rotx: {
00153 FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
00154 new_transform->SetRotation(FMVector3::XAxis, from->get_component_number(co));
00155 break; }
00156 case EggTransform::CT_roty: {
00157 FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
00158 new_transform->SetRotation(FMVector3::YAxis, from->get_component_number(co));
00159 break; }
00160 case EggTransform::CT_rotz: {
00161 FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
00162 new_transform->SetRotation(FMVector3::ZAxis, from->get_component_number(co));
00163 break; }
00164 case EggTransform::CT_uniform_scale: {
00165 FCDTScale* new_transform = (FCDTScale*) to->AddTransform(FCDTransform::SCALE);
00166 new_transform->SetScale(from->get_component_number(co), from->get_component_number(co), from->get_component_number(co));
00167 break; }
00168 default:
00169 cerr << "Warning: ignoring invalid transform\n";
00170 }
00171 }
00172 }
00173
00174 int main(int argc, char *argv[]) {
00175
00176 pystub();
00177
00178 EggToDAE prog;
00179 prog.parse_command_line(argc, argv);
00180 prog.run();
00181 return 0;
00182 }