Panda3D
Loading...
Searching...
No Matches
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
31using std::cerr;
32
33/**
34 *
35 */
36EggToDAE::
37EggToDAE() :
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 */
52void EggToDAE::
53run() {
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
97void 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
113void 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
168int main(int argc, char *argv[]) {
169 EggToDAE prog;
170 prog.parse_command_line(argc, argv);
171 prog.run();
172 return 0;
173}
The main glue of the egg hierarchy, this corresponds to the <Group>, <Instance>, and <Joint> type nod...
Definition eggGroup.h:34
virtual bool is_joint() const
Returns true if this particular node represents a <Joint> entry or not.
Definition eggGroup.cxx:468
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 LVecBase3d & get_component_vec3(int n) const
Returns the 3-component vector associated with the nth component.
ComponentType get_component_type(int n) const
Returns the type of the nth component.
int get_num_components() const
Returns the number of components that make up the transform.
const LMatrix4d & get_component_mat4(int n) const
Returns the 4x4 matrix associated with the nth component.
double get_component_number(int n) const
Returns the solitary number associated with the nth component.
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_...
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.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.