46 _compose_transforms =
false;
47 _flt_units = DU_invalid;
56 _compose_transforms(copy._compose_transforms)
64 ~FltToEggConverter() {
114 nout <<
"Reading " << filename <<
"\n";
115 FltError result = header->read_flt(filename);
116 if (result != FE_ok) {
117 nout <<
"Unable to read: " << result <<
"\n";
121 header->check_version();
123 _flt_units = header->get_units();
144 if (_egg_data->get_coordinate_system() == CS_default) {
145 _egg_data->set_coordinate_system(CS_zup_right);
149 _flt_header = flt_header;
153 _egg_data->add_child(_main_egg_vpool.p());
161 state._egg_parent = _egg_data;
162 convert_record(_flt_header, state);
164 if (_main_egg_vpool->empty()) {
167 _egg_data->remove_child(_main_egg_vpool.p());
179 void FltToEggConverter::
182 _main_egg_vpool.clear();
189 void FltToEggConverter::
193 for (
int i = 0; i < num_children; i++) {
195 dispatch_record(child, state);
203 void FltToEggConverter::
205 if (flt_record->
is_of_type(FltLOD::get_class_type())) {
206 convert_lod(DCAST(
FltLOD, flt_record), state);
208 }
else if (flt_record->
is_of_type(FltGroup::get_class_type())) {
209 convert_group(DCAST(
FltGroup, flt_record), state);
211 }
else if (flt_record->
is_of_type(FltObject::get_class_type())) {
212 convert_object(DCAST(
FltObject, flt_record), state);
214 }
else if (flt_record->
is_of_type(FltFace::get_class_type())) {
215 convert_face(DCAST(
FltFace, flt_record), state);
217 }
else if (flt_record->
is_of_type(FltExternalReference::get_class_type())) {
221 }
else if (flt_record->
is_of_type(FltBeadID::get_class_type())) {
222 convert_bead_id(DCAST(
FltBeadID, flt_record), state);
224 }
else if (flt_record->
is_of_type(FltBead::get_class_type())) {
225 convert_bead(DCAST(
FltBead, flt_record), state);
228 convert_record(flt_record, state);
235 void FltToEggConverter::
241 (flt_lod->_switch_in, flt_lod->_switch_out,
242 LPoint3d(flt_lod->_center_x, flt_lod->_center_y, flt_lod->_center_z),
243 flt_lod->_transition_range);
244 egg_group->set_lod(lod);
247 parse_comment(flt_lod, egg_group);
250 next_state._egg_parent = egg_group;
251 convert_record(flt_lod, next_state);
257 void FltToEggConverter::
262 if ((flt_group->_flags & FltGroup::F_forward_animation) != 0) {
264 egg_group->set_switch_flag(
true);
265 egg_group->set_switch_fps(24.0);
269 parse_comment(flt_group, egg_group);
274 next_state._egg_parent = egg_group;
275 convert_record(flt_group, next_state);
281 void FltToEggConverter::
287 parse_comment(flt_object, egg_group);
290 next_state._flt_object = flt_object;
291 next_state._egg_parent = egg_group;
292 convert_record(flt_object, next_state);
298 void FltToEggConverter::
300 nout <<
"Don't know how to convert beads of type " << flt_bead->get_type()
306 parse_comment(flt_bead, egg_group);
309 next_state._egg_parent = egg_group;
310 convert_record(flt_bead, next_state);
316 void FltToEggConverter::
318 nout <<
"Don't know how to convert beads of type " << flt_bead->get_type()
324 parse_comment(flt_bead, egg_group);
327 next_state._egg_parent = egg_group;
328 convert_record(flt_bead, next_state);
334 void FltToEggConverter::
337 switch (flt_face->_draw_type) {
338 case FltGeometry::DT_omni_light:
339 case FltGeometry::DT_uni_light:
340 case FltGeometry::DT_bi_light:
360 for (
int i = 0; i < num_children && vlist ==
nullptr; i++) {
362 if (child->
is_of_type(FltVertexList::get_class_type())) {
367 if (vlist !=
nullptr) {
368 int num_vertices = vlist->get_num_vertices();
369 for (
int i = 0; i < num_vertices; i++) {
370 FltVertex *flt_vertex = vlist->get_vertex(i);
371 vertices.push_back(make_egg_vertex(flt_vertex));
375 setup_geometry(flt_face, state, egg_prim, _main_egg_vpool, vertices);
381 void FltToEggConverter::
396 void FltToEggConverter::
404 flt_geom->_billboard_type);
408 next_state._egg_parent = egg_parent;
411 convert_subfaces(flt_geom, next_state);
414 next_state._egg_parent->add_child(egg_prim);
417 EggVertices::const_iterator vi;
419 bool use_vertex_color =
true;
420 bool keep_normals =
true;
421 switch (flt_geom->_light_mode) {
422 case FltGeometry::LM_face_no_normal:
423 use_vertex_color =
false;
424 keep_normals =
false;
427 case FltGeometry::LM_vertex_no_normal:
428 use_vertex_color =
true;
429 keep_normals =
false;
432 case FltGeometry::LM_face_with_normal:
433 use_vertex_color =
false;
437 case FltGeometry::LM_vertex_with_normal:
438 use_vertex_color =
true;
443 LColor face_color = flt_geom->
get_color();
445 if (state._flt_object !=
nullptr) {
448 PN_stdfloat alpha = 1.0 - (state._flt_object->_transparency / 65535.0);
449 face_color[3] *= alpha;
452 egg_prim->set_color(face_color);
458 if (flt_geom->_texwhite) {
461 use_vertex_color =
false;
465 if (use_vertex_color) {
468 egg_prim->clear_color();
471 for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
473 if (vertex->has_color()) {
474 LColor vertex_color = vertex->
get_color();
475 vertex_color[3] = face_color[3];
476 vertex->set_color(vertex_color);
481 vertex->set_color(face_color);
489 for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
490 (*vi)->clear_color();
496 for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
497 (*vi)->clear_normal();
501 if (flt_geom->_draw_type == FltGeometry::DT_solid_no_cull) {
506 for (vi = vertices.begin(); vi != vertices.end(); ++vi) {
511 parse_comment(flt_geom, egg_prim);
522 void FltToEggConverter::
525 if (num_subfaces == 0) {
533 state._egg_parent = egg_group;
535 egg_group->set_decal_flag(
true);
540 egg_group = decal_group;
543 next_state._egg_parent = decal_group;
545 for (
int i = 0; i < num_subfaces; i++) {
547 dispatch_record(subface, next_state);
556 bool FltToEggConverter::
566 bool FltToEggConverter::
568 return parse_comment(flt_bead->
get_comment(),
"anonymous", egg_node);
576 bool FltToEggConverter::
587 bool FltToEggConverter::
588 parse_comment(
const string &comment,
const string &name,
590 if (comment.empty()) {
596 static const string egg_str =
"<egg>";
600 while (p < comment.length() &&
601 cmp_nocase(comment.substr(p, 5), egg_str) != 0) {
605 if (p >= comment.length()) {
612 while (p < comment.length() && isspace(comment[p])) {
615 if (p >= comment.length() || comment[p] !=
'{') {
616 nout <<
"No opening brace in comment for "
625 size_t q = comment.length() - 1;
626 while (q > p && comment[q] !=
'}') {
630 nout <<
"No closing brace in comment for "
636 string egg_syntax = comment.substr(p, q - p);
639 nout <<
"Syntax error in comment for "
653 PT_EggVertex FltToEggConverter::
654 make_egg_vertex(
const FltVertex *flt_vertex) {
656 egg_vertex->
set_pos(flt_vertex->_pos);
658 if (flt_vertex->_has_normal) {
659 egg_vertex->set_normal(LCAST(
double, flt_vertex->_normal));
662 if (flt_vertex->_has_uv) {
663 egg_vertex->set_uv(LCAST(
double, flt_vertex->_uv));
667 egg_vertex->set_color(flt_vertex->
get_color());
677 PT_EggTexture FltToEggConverter::
678 make_egg_texture(
const FltTexture *flt_texture) {
679 Textures::const_iterator ti;
680 ti = _textures.find(flt_texture);
681 if (ti != _textures.end()) {
687 string tref_name = format_string(flt_texture->_pattern_index);
690 PT_EggTexture egg_texture =
new EggTexture(tref_name, filename);
692 _textures.insert(Textures::value_type(flt_texture, egg_texture));
696 switch (flt_texture->_min_filter) {
697 case FltTexture::MN_point:
698 egg_texture->set_minfilter(EggTexture::FT_nearest);
701 case FltTexture::MN_bilinear:
702 egg_texture->set_minfilter(EggTexture::FT_linear);
705 case FltTexture::MN_mipmap_point:
706 egg_texture->set_minfilter(EggTexture::FT_nearest_mipmap_nearest);
709 case FltTexture::MN_mipmap_linear:
710 egg_texture->set_minfilter(EggTexture::FT_nearest_mipmap_linear);
713 case FltTexture::MN_mipmap_bilinear:
714 egg_texture->set_minfilter(EggTexture::FT_linear_mipmap_nearest);
717 case FltTexture::MN_mipmap_trilinear:
718 case FltTexture::MN_OB_mipmap:
719 egg_texture->set_minfilter(EggTexture::FT_linear_mipmap_linear);
722 case FltTexture::MN_bicubic:
723 case FltTexture::MN_bilinear_gequal:
724 case FltTexture::MN_bilinear_lequal:
725 case FltTexture::MN_bicubic_gequal:
726 case FltTexture::MN_bicubic_lequal:
731 switch (flt_texture->_mag_filter) {
732 case FltTexture::MG_point:
733 egg_texture->set_magfilter(EggTexture::FT_nearest);
736 case FltTexture::MG_bilinear:
737 egg_texture->set_magfilter(EggTexture::FT_linear);
740 case FltTexture::MG_bicubic:
741 case FltTexture::MG_sharpen:
742 case FltTexture::MG_add_detail:
743 case FltTexture::MG_modulate_detail:
744 case FltTexture::MG_bilinear_gequal:
745 case FltTexture::MG_bilinear_lequal:
746 case FltTexture::MG_bicubic_gequal:
747 case FltTexture::MG_bicubic_lequal:
752 switch (flt_texture->_repeat) {
753 case FltTexture::RT_repeat:
754 egg_texture->set_wrap_mode(EggTexture::WM_repeat);
757 case FltTexture::RT_clamp:
758 egg_texture->set_wrap_mode(EggTexture::WM_clamp);
762 switch (flt_texture->_repeat_u) {
763 case FltTexture::RT_repeat:
764 egg_texture->set_wrap_u(EggTexture::WM_repeat);
767 case FltTexture::RT_clamp:
768 egg_texture->set_wrap_u(EggTexture::WM_clamp);
772 switch (flt_texture->_repeat_v) {
773 case FltTexture::RT_repeat:
774 egg_texture->set_wrap_v(EggTexture::WM_repeat);
777 case FltTexture::RT_clamp:
778 egg_texture->set_wrap_v(EggTexture::WM_clamp);
782 switch (flt_texture->_env_type) {
783 case FltTexture::ET_modulate:
784 egg_texture->set_env_type(EggTexture::ET_modulate);
787 case FltTexture::ET_decal:
788 egg_texture->set_env_type(EggTexture::ET_decal);
791 case FltTexture::ET_blend:
792 case FltTexture::ET_color:
797 switch (flt_texture->_internal_format) {
798 case FltTexture::IF_default:
801 case FltTexture::IF_i_12a_4:
802 case FltTexture::IF_ia_12:
803 case FltTexture::IF_ia_8:
804 egg_texture->set_format(EggTexture::F_luminance_alpha);
807 case FltTexture::IF_rgb_5:
808 egg_texture->set_format(EggTexture::F_rgb5);
811 case FltTexture::IF_rgba_4:
812 egg_texture->set_format(EggTexture::F_rgba4);
816 case FltTexture::IF_rgba_8:
817 egg_texture->set_format(EggTexture::F_rgba8);
820 case FltTexture::IF_rgba_12:
821 egg_texture->set_format(EggTexture::F_rgba12);
824 case FltTexture::IF_i_16:
825 if (flt_texture->_intensity_is_alpha) {
826 egg_texture->set_format(EggTexture::F_alpha);
828 egg_texture->set_format(EggTexture::F_luminance);
832 case FltTexture::IF_rgb_12:
833 egg_texture->set_format(EggTexture::F_rgb12);
837 parse_comment(flt_texture, egg_texture);