Panda3D
eggToDAE.cxx
Go to the documentation of this file.
1 /**
2  * PANDA 3D SOFTWARE
3  * Copyright (c) Carnegie Mellon University. All rights reserved.
4  *
5  * All use of this software is subject to the terms of the revised BSD
6  * license. You should have received a copy of this license along
7  * with this source code in a file named "LICENSE."
8  *
9  * @file eggToDAE.cxx
10  * @author rdb
11  * @date 2008-10-04
12  */
13 
14 #include "eggToDAE.h"
15 #include "dcast.h"
16 #include "pandaVersion.h"
17 
18 #include <FCDocument/FCDocument.h>
19 #include <FCDocument/FCDAsset.h>
20 #include <FCDocument/FCDTransform.h>
21 
22 // Useful conversion stuff
23 #define TO_VEC3(v) (LVecBase3d(v[0], v[1], v[2]))
24 #define TO_VEC4(v) (LVecBase4d(v[0], v[1], v[2], v[3]))
25 #define TO_COLOR(v) (LColor(v[0], v[1], v[2], v[3]))
26 #define FROM_VEC3(v) (FMVector3(v[0], v[1], v[2]))
27 #define FROM_VEC4(v) (FMVector4(v[0], v[1], v[2], v[3]))
28 #define FROM_MAT4(v) (FMMatrix44(v.get_data()))
29 #define FROM_FSTRING(fs) (fs.c_str())
30 
31 using std::cerr;
32 
33 /**
34  *
35  */
36 EggToDAE::
37 EggToDAE() :
38  EggToSomething("COLLADA", ".dae", true, false)
39 {
40  set_binary_output(false);
41  set_program_brief("convert .egg files into COLLADA asset files");
42  set_program_description
43  ("This program converts files from the egg format to the COLLADA "
44  ".dae (Digital Asset Exchange) format.");
45 
46  _document = nullptr;
47 }
48 
49 /**
50  *
51  */
52 void EggToDAE::
53 run() {
54  nassertv(has_output_filename());
55  nassertv(_data != nullptr);
56 
57  FCollada::Initialize();
58  _document = FCollada::NewTopDocument();
59 
60  // Add the contributor part to the asset
61  FCDAssetContributor* contributor = _document->GetAsset()->AddContributor();
62  const char* user_name = getenv("USER");
63  if (user_name == nullptr) user_name = getenv("USERNAME");
64  if (user_name != nullptr) contributor->SetAuthor(TO_FSTRING(user_name));
65  // contributor->SetSourceData();
66  char authoring_tool[1024];
67  snprintf(authoring_tool, 1024, "Panda3D %s eggToDAE converter | FCollada v%d.%02d", PANDA_VERSION_STR, FCOLLADA_VERSION >> 16, FCOLLADA_VERSION & 0xFFFF);
68  authoring_tool[1023] = 0;
69  contributor->SetAuthoringTool(TO_FSTRING(authoring_tool));
70 
71  // Set coordinate system
72  switch (_data->get_coordinate_system()) {
73  case CS_zup_right:
74  _document->GetAsset()->SetUpAxis(FMVector3::ZAxis);
75  break;
76  case CS_yup_right:
77  _document->GetAsset()->SetUpAxis(FMVector3::YAxis);
78  break;
79  }
80 
81  // Now actually start processing the data.
82  FCDSceneNode* visual_scene = _document->AddVisualScene();
83  for (EggGroupNode::iterator it = _data->begin(); it != _data->end(); ++it) {
84  if ((*it)->is_of_type(EggGroup::get_class_type())) {
85  process_node(visual_scene, DCAST(EggGroup, *it));
86  }
87  }
88 
89  // We're done here.
90  FCollada::SaveDocument(_document, get_output_filename().to_os_specific().c_str());
91  SAFE_DELETE(_document);
92  FCollada::Release();
93 
94  // if (!out) { nout << "An error occurred while writing.\n"; exit(1); }
95 }
96 
97 void EggToDAE::process_node(FCDSceneNode* parent, const PT(EggGroup) node) {
98  assert(node != nullptr);
99  FCDSceneNode* scene_node = parent->AddChildNode();
100  // Set the parameters
101  scene_node->SetDaeId(node->get_name().c_str());
102  scene_node->SetJointFlag(node->is_joint());
103  // Apply the transforms
104  apply_transform(scene_node, node);
105  // Recursively process sub-nodes
106  for (EggGroupNode::iterator it = node->begin(); it != node->end(); ++it) {
107  if ((*it)->is_of_type(EggGroup::get_class_type())) {
108  process_node(scene_node, DCAST(EggGroup, *it));
109  }
110  }
111 }
112 
113 void EggToDAE::apply_transform(FCDSceneNode* to, const PT(EggGroup) from) {
114  assert(to != nullptr);
115  assert(from != nullptr);
116  for (int co = 0; co < from->get_num_components(); ++co) {
117  switch (from->get_component_type(co)) {
118  case EggTransform::CT_translate2d:
119  cerr << "Warning: ignoring non-supported 2d translation\n";
120  break;
121  case EggTransform::CT_rotate2d:
122  cerr << "Warning: ignoring non-supported 2d rotation\n";
123  break;
124  case EggTransform::CT_scale2d:
125  cerr << "Warning: ignoring non-supported 2d scaling\n";
126  break;
127  case EggTransform::CT_matrix3:
128  cerr << "Warning: ignoring non-supported 2d matrix\n";
129  break;
130  case EggTransform::CT_translate3d: {
131  FCDTTranslation* new_transform = (FCDTTranslation*) to->AddTransform(FCDTransform::TRANSLATION);
132  new_transform->SetTranslation(FROM_VEC3(from->get_component_vec3(co)));
133  break; }
134  case EggTransform::CT_rotate3d: {
135  FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
136  new_transform->SetRotation(FROM_VEC3(from->get_component_vec3(co)), from->get_component_number(co));
137  break; }
138  case EggTransform::CT_scale3d: {
139  FCDTScale* new_transform = (FCDTScale*) to->AddTransform(FCDTransform::SCALE);
140  new_transform->SetScale(FROM_VEC3(from->get_component_vec3(co)));
141  break; }
142  case EggTransform::CT_matrix4: {
143  FCDTMatrix* new_transform = (FCDTMatrix*) to->AddTransform(FCDTransform::MATRIX);
144  new_transform->SetTransform(FROM_MAT4(from->get_component_mat4(co)));
145  break; }
146  case EggTransform::CT_rotx: {
147  FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
148  new_transform->SetRotation(FMVector3::XAxis, from->get_component_number(co));
149  break; }
150  case EggTransform::CT_roty: {
151  FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
152  new_transform->SetRotation(FMVector3::YAxis, from->get_component_number(co));
153  break; }
154  case EggTransform::CT_rotz: {
155  FCDTRotation* new_transform = (FCDTRotation*) to->AddTransform(FCDTransform::ROTATION);
156  new_transform->SetRotation(FMVector3::ZAxis, from->get_component_number(co));
157  break; }
158  case EggTransform::CT_uniform_scale: {
159  FCDTScale* new_transform = (FCDTScale*) to->AddTransform(FCDTransform::SCALE);
160  new_transform->SetScale(from->get_component_number(co), from->get_component_number(co), from->get_component_number(co));
161  break; }
162  default:
163  cerr << "Warning: ignoring invalid transform\n";
164  }
165  }
166 }
167 
168 int main(int argc, char *argv[]) {
169  EggToDAE prog;
170  prog.parse_command_line(argc, argv);
171  prog.run();
172  return 0;
173 }
const LVecBase3d & get_component_vec3(int n) const
Returns the 3-component vector associated with the nth component.
Definition: eggTransform.I:272
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
double get_component_number(int n) const
Returns the solitary number associated with the nth component.
Definition: eggTransform.I:249
virtual bool is_joint() const
Returns true if this particular node represents a <Joint> entry or not.
Definition: eggGroup.cxx:468
virtual void parse_command_line(int argc, char **argv)
Dispatches on each of the options on the command line, and passes the remaining parameters to handle_...
int get_num_components() const
Returns the number of components that make up the transform.
Definition: eggTransform.I:229
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ComponentType get_component_type(int n) const
Returns the type of the nth component.
Definition: eggTransform.I:237
Filename get_output_filename() const
If has_output_filename() returns true, this is the filename that the user specified.
bool has_output_filename() const
Returns true if the user specified an output filename, false otherwise (e.g.
The main glue of the egg hierarchy, this corresponds to the <Group>, <Instance>, and <Joint> type nod...
Definition: eggGroup.h:34
A program to read an egg file and write a DAE file.
Definition: eggToDAE.h:29
This is the general base class for a file-converter program that reads some model file format and gen...
const LMatrix4d & get_component_mat4(int n) const
Returns the 4x4 matrix associated with the nth component.
Definition: eggTransform.I:294