Panda3D

eggToDAE.cxx

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 }
 All Classes Functions Variables Enumerations