Panda3D
|
00001 // Filename: eggToDAE.cxx 00002 // Created by: pro-rsoft (04Oct08) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 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 // Useful conversion stuff 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 // Function: EggToDAE::Constructor 00035 // Access: Public 00036 // Description: 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 // Function: EggToDAE::run 00052 // Access: Public 00053 // Description: 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 // Add the contributor part to the asset 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 //contributor->SetSourceData(); 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 // Set coordinate system 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 // Now actually start processing the data. 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 // We're done here. 00093 FCollada::SaveDocument(_document, get_output_filename().to_os_specific().c_str()); 00094 SAFE_DELETE(_document); 00095 FCollada::Release(); 00096 00097 //if (!out) { 00098 // nout << "An error occurred while writing.\n"; 00099 // exit(1); 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 // Set the parameters 00107 scene_node->SetDaeId(node->get_name().c_str()); 00108 scene_node->SetJointFlag(node->is_joint()); 00109 // Apply the transforms 00110 apply_transform(scene_node, node); 00111 // Recursively process sub-nodes 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 // A call to pystub() to force libpystub.so to be linked in. 00176 pystub(); 00177 00178 EggToDAE prog; 00179 prog.parse_command_line(argc, argv); 00180 prog.run(); 00181 return 0; 00182 }