87 if (_data ==
nullptr) {
99 _data->add_child(_vpool);
105 if (_vpool->empty()) {
106 _data->remove_child(_vpool);
119 _data->add_child(_vpool);
122 recurse_nodes(root_path, _data,
false,
nullptr);
125 if (_vpool->empty()) {
126 _data->remove_child(_vpool);
137 bool has_decal, CharacterJointMap *joint_map) {
140 convert_geom_node(DCAST(
GeomNode, node), node_path, egg_parent, has_decal, joint_map);
142 }
else if (node->
is_of_type(LODNode::get_class_type())) {
143 convert_lod_node(DCAST(
LODNode, node), node_path, egg_parent, has_decal, joint_map);
145 }
else if (node->
is_of_type(SequenceNode::get_class_type())) {
146 convert_sequence_node(DCAST(
SequenceNode, node), node_path, egg_parent, has_decal, joint_map);
148 }
else if (node->
is_of_type(SwitchNode::get_class_type())) {
149 convert_switch_node(DCAST(
SwitchNode, node), node_path, egg_parent, has_decal, joint_map);
151 }
else if (node->
is_of_type(CollisionNode::get_class_type())) {
152 convert_collision_node(DCAST(
CollisionNode, node), node_path, egg_parent, has_decal, joint_map);
154 }
else if (node->
is_of_type(AnimBundleNode::get_class_type())) {
155 convert_anim_node(DCAST(
AnimBundleNode, node), node_path, egg_parent, has_decal);
157 }
else if (node->
is_of_type(Character::get_class_type())) {
158 convert_character_node(DCAST(
Character, node), node_path, egg_parent, has_decal);
164 apply_node_properties(egg_group, node);
166 recurse_nodes(node_path, egg_group, has_decal, joint_map);
176 CharacterJointMap *joint_map) {
181 apply_node_properties(egg_group, node);
186 num_children = std::min(num_children, num_switches);
188 for (
int i = 0; i < num_children; i++) {
193 convert_node(
WorkingNodePath(node_path, child), next_group, has_decal, joint_map);
195 if (next_group->size() == 1) {
198 EggNode *child_node = *next_group->begin();
199 if (child_node->
is_of_type(EggGroup::get_class_type())) {
201 next_group->remove_child(child.p());
207 PN_stdfloat in = node->
get_in(i);
208 PN_stdfloat out = node->
get_out(i);
211 next_group->set_lod(dist);
222 CharacterJointMap *joint_map) {
227 apply_node_properties(egg_group, node);
230 egg_group->set_switch_flag(
true);
231 egg_group->set_switch_fps(node->get_frame_rate());
235 for (
int i = 0; i < num_children; i++) {
240 convert_node(
WorkingNodePath(node_path, child), next_group, has_decal, joint_map);
253 CharacterJointMap *joint_map) {
258 apply_node_properties(egg_group, node);
261 egg_group->set_switch_flag(
true);
265 for (
int i = 0; i < num_children; i++) {
270 convert_node(
WorkingNodePath(node_path, child), next_group, has_decal, joint_map);
284 if (animGroup->
is_of_type(AnimBundle::get_class_type())) {
286 eggTable ->set_table_type(EggTable::TT_bundle);
288 }
else if (animGroup->
is_of_type(AnimGroup::get_class_type())) {
290 eggTable ->set_table_type(EggTable::TT_table);
294 if (animGroup->
is_of_type(AnimChannelMatrixXfmTable::get_class_type())) {
297 egg_anim->set_fps(fps);
298 for (
int i = 0; i < num_matrix_components; i++) {
299 string componentName(1, matrix_component_letters[i]);
300 char table_id = matrix_component_letters[i];
304 for (
unsigned int j = 0; j < table.size(); j++) {
311 for (
int i = 0; i < num_children; i++) {
313 EggGroupNode *eggChildNode = convert_animGroup_node(animChild, fps);
314 if (eggChildNode!=
nullptr) {
315 nassertr(eggNode!=
nullptr,
nullptr);
333 _data->add_child(eggTable);
347 convert_character_bundle(
PartGroup *bundleNode,
EggGroupNode *egg_parent, CharacterJointMap *joint_map) {
351 if (bundleNode->
is_of_type(CharacterJoint::get_class_type())) {
356 LMatrix4d transformd(LCAST(
double, transformf));
359 joint->set_group_type(EggGroup::GT_joint);
362 if (joint_map !=
nullptr) {
363 CharacterJointMap::iterator mi = joint_map->find(character_joint);
364 if (mi != joint_map->end()) {
367 for (vi = joint_vertices.begin(); vi != joint_vertices.end(); ++vi) {
374 for (
int i = 0; i < num_children ; i++) {
376 convert_character_bundle(partGroup, joint_group, joint_map);
394 egg_group->set_dart_type(EggGroup::DT_structured);
396 apply_node_properties(egg_group, node);
398 CharacterJointMap joint_map;
399 recurse_nodes(node_path, egg_group, has_decal, &joint_map);
403 int num_bundles = node->get_num_bundles();
404 for (
int i = 0; i < num_bundles; ++i) {
406 convert_character_bundle(bundle, egg_group, &joint_map);
417 CharacterJointMap *joint_map) {
422 apply_node_properties(egg_group, node,
false);
429 if (from_mask == into_mask) {
430 egg_group->set_collide_mask(into_mask);
432 egg_group->set_from_collide_mask(from_mask);
433 egg_group->set_into_collide_mask(into_mask);
438 egg_group->set_collide_flags(EggGroup::CF_descend);
442 LMatrix4 net_mat = net_transform->
get_mat();
444 net_mat = net_mat * inv;
446 int num_solids = node->get_num_solids();
448 if (num_solids > 0) {
454 for (
int i = 0; i < num_solids; i++) {
456 int flags = EggGroup::CF_descend;
458 if (!child->is_tangible()) {
459 flags |= EggGroup::CF_intangible;
462 if (child->has_effective_normal() &&
463 child->get_effective_normal() == LVector3::up()) {
464 flags |= EggGroup::CF_level;
467 if (child->
is_of_type(CollisionPolygon::get_class_type())) {
468 egg_group->set_cs_type(EggGroup::CST_polyset);
469 egg_group->set_collide_flags(flags);
475 int num_points = poly->get_num_points();
476 for (
int j = 0; j < num_points; j++) {
478 egg_vert.
set_pos(LCAST(
double, poly->get_point(j) * net_mat));
479 egg_vert.set_normal(LCAST(
double, poly->get_normal() * net_mat));
485 }
else if (child->
is_of_type(CollisionSphere::get_class_type())) {
487 LPoint3 center = sphere->get_center();
488 PN_stdfloat radius = sphere->get_radius();
491 if (num_solids == 1) {
492 egg_sphere = egg_group;
498 if (child->
is_of_type(CollisionInvSphere::get_class_type())) {
499 egg_sphere->set_cs_type(EggGroup::CST_inv_sphere);
501 egg_sphere->set_cs_type(EggGroup::CST_sphere);
503 egg_sphere->set_collide_flags(flags);
506 ev1.
set_pos(LCAST(
double, (center + LVector3(radius, 0, 0)) * net_mat));
507 ev2.
set_pos(LCAST(
double, (center + LVector3(0, radius, 0)) * net_mat));
508 ev3.
set_pos(LCAST(
double, (center + LVector3(-radius, 0, 0)) * net_mat));
509 ev4.
set_pos(LCAST(
double, (center + LVector3(0, -radius, 0)) * net_mat));
519 }
else if (child->
is_of_type(CollisionPlane::get_class_type())) {
521 LPoint3 origin = plane.get_point();
522 LVector3 normal = plane.get_normal();
527 if (std::fabs(normal[2]) > std::fabs(normal[1])) {
528 vec1 = normal.cross(LVector3(0, 1, 0));
530 vec1 = normal.cross(LVector3(0, 0, 1));
534 LVector3 vec2 = normal.cross(vec1);
537 if (num_solids == 1) {
538 egg_plane = egg_group;
543 egg_plane->set_cs_type(EggGroup::CST_plane);
544 egg_plane->set_collide_flags(flags);
547 ev0.
set_pos(LCAST(
double, origin * net_mat));
548 ev1.
set_pos(LCAST(
double, (origin + vec1) * net_mat));
549 ev2.
set_pos(LCAST(
double, (origin + vec2) * net_mat));
558 }
else if (child->
is_of_type(CollisionBox::get_class_type())) {
560 LPoint3 min_point = box->get_min();
561 LPoint3 max_point = box->get_max();
564 if (num_solids == 1) {
570 egg_box->set_cs_type(EggGroup::CST_box);
571 egg_box->set_collide_flags(flags);
575 ev0.
set_pos(LCAST(
double, min_point * net_mat));
576 ev1.
set_pos(LCAST(
double, max_point * net_mat));
584 }
else if (child->
is_of_type(CollisionCapsule::get_class_type())) {
586 LPoint3 point_a = capsule->get_point_a();
587 LPoint3 point_b = capsule->get_point_b();
588 LPoint3 centroid = (point_a + point_b) * 0.5f;
591 LVector3 axis = point_b - point_a;
593 if (std::fabs(axis[2]) > std::fabs(axis[1])) {
594 sideways = axis.cross(LVector3(0, 1, 0));
596 sideways = axis.cross(LVector3(0, 0, 1));
598 sideways.normalize();
599 sideways *= capsule->get_radius();
600 LVector3 extend = axis.normalized() * capsule->get_radius();
603 if (num_solids == 1) {
604 egg_capsule = egg_group;
609 egg_capsule->set_cs_type(EggGroup::CST_tube);
610 egg_capsule->set_collide_flags(flags);
615 ev0.
set_pos(LCAST(
double, (point_a - extend) * net_mat));
616 ev1.
set_pos(LCAST(
double, (centroid + sideways) * net_mat));
617 ev2.
set_pos(LCAST(
double, (point_b + extend) * net_mat));
618 ev3.
set_pos(LCAST(
double, (centroid - sideways) * net_mat));
629 nout <<
"Encountered unknown collision solid type " << child->get_type() <<
"\n";
635 recurse_nodes(node_path, egg_group, has_decal, joint_map);
643 EggGroupNode *egg_parent,
bool has_decal, CharacterJointMap *joint_map) {
645 bool fancy_attributes = apply_node_properties(egg_group, node);
647 if (node->get_effects()->has_decal()) {
652 egg_group->set_decal_flag(
true);
655 if (fancy_attributes || has_decal || !node->get_name().empty()) {
660 egg_parent = egg_group;
666 LMatrix4 net_mat = net_transform->
get_mat();
668 net_mat = net_mat * inv;
672 for (
int i = 0; i < num_geoms; ++i) {
674 CPT(
RenderState) geom_net_state = net_state->compose(geom_state);
679 if (num_geoms == 1 && node->
get_num_children() == 0 && egg_parent == egg_group &&
680 !geom_state->is_empty() && node->get_state()->is_empty()) {
681 apply_state_properties(egg_group, geom_state);
682 geom_state = RenderState::make_empty();
685 const Geom *geom = node->get_geom(i);
686 int num_primitives = geom->get_num_primitives();
687 for (
int j = 0; j < num_primitives; ++j) {
692 convert_primitive(vdata, simple, geom_state, geom_net_state,
693 net_mat, egg_parent, joint_map);
697 recurse_nodes(node_path, egg_parent, has_decal, joint_map);
708 CharacterJointMap *joint_map) {
713 if (primitive->
is_of_type(GeomTriangles::get_class_type())) {
715 }
else if (primitive->
is_of_type(GeomPatches::get_class_type())) {
717 }
else if (primitive->
is_of_type(GeomPoints::get_class_type())) {
719 }
else if (primitive->
is_of_type(GeomLines::get_class_type())) {
727 apply_state_properties(egg_prim, geom_state);
730 LVecBase4 color_scale(1.0f, 1.0f, 1.0f, 1.0f);
732 if (net_state->get_attrib(csa)) {
737 bool has_color_override =
false;
738 bool has_color_off =
false;
739 LColor color_override;
741 if (net_state->get_attrib(ca)) {
743 has_color_override =
true;
745 color_override.set(color_override[0] * color_scale[0],
746 color_override[1] * color_scale[1],
747 color_override[2] * color_scale[2],
748 color_override[3] * color_scale[3]);
751 has_color_off =
true;
758 if (net_state->get_attrib(ma)) {
760 if (egg_mat !=
nullptr) {
761 egg_prim->set_material(egg_mat);
767 if (net_state->get_attrib(ta)) {
770 if (egg_tex !=
nullptr) {
772 if (tex_stage !=
nullptr) {
774 case TextureStage::M_modulate:
775 if (has_color_off ==
true) {
776 egg_tex->set_env_type(EggTexture::ET_replace);
778 egg_tex->set_env_type(EggTexture::ET_modulate);
781 case TextureStage::M_decal:
782 egg_tex->set_env_type(EggTexture::ET_decal);
784 case TextureStage::M_blend:
785 egg_tex->set_env_type(EggTexture::ET_blend);
787 case TextureStage::M_replace:
788 egg_tex->set_env_type(EggTexture::ET_replace);
790 case TextureStage::M_add:
791 egg_tex->set_env_type(EggTexture::ET_add);
793 case TextureStage::M_blend_color_scale:
794 egg_tex->set_env_type(EggTexture::ET_blend_color_scale);
801 egg_prim->set_texture(egg_tex);
807 if (net_state->get_attrib(cfa)) {
809 egg_prim->set_bface_flag(
true);
815 if (net_state->get_attrib(rma)) {
816 if (egg_prim->is_of_type(EggPoint::get_class_type())) {
821 }
else if (egg_prim->is_of_type(EggLine::get_class_type())) {
832 for (
int i = 0; i < num_primitives; ++i) {
836 for (
int j = 0; j < num_vertices; j++) {
840 reader.set_row(primitive->
get_vertex(i * num_vertices + j));
842 reader.set_column(InternalName::get_vertex());
843 LVertex vertex = reader.get_data3();
844 egg_vert.
set_pos(LCAST(
double, vertex * net_mat));
846 if (vertex_data->
has_column(InternalName::get_normal())) {
847 reader.set_column(InternalName::get_normal());
848 LNormal normal = reader.get_data3();
849 egg_vert.set_normal(LCAST(
double, normal * net_mat));
851 if (has_color_override) {
852 egg_vert.set_color(color_override);
854 }
else if (!has_color_off) {
855 LColor color(1.0f, 1.0f, 1.0f, 1.0f);
856 if (vertex_data->
has_column(InternalName::get_color())) {
857 reader.set_column(InternalName::get_color());
858 color = reader.get_data4();
860 egg_vert.set_color(LColor(color[0] * color_scale[0],
861 color[1] * color_scale[1],
862 color[2] * color_scale[2],
863 color[3] * color_scale[3]));
866 if (vertex_data->
has_column(InternalName::get_texcoord())) {
867 reader.set_column(InternalName::get_texcoord());
868 LTexCoord uv = reader.get_data2();
869 egg_vert.
set_uv(LCAST(
double, uv));
872 EggVertex *new_egg_vert = _vpool->create_unique_vertex(egg_vert);
874 if (vertex_data->
has_column(InternalName::get_transform_blend()) &&
875 joint_map !=
nullptr && transformBlendTable !=
nullptr) {
876 reader.set_column(InternalName::get_transform_blend());
877 int idx = reader.get_data1i();
880 for (
int k = 0; k < num_weights; ++k) {
884 if (vertex_transform->
is_of_type(JointVertexTransform::get_class_type())) {
887 CharacterJointMap::iterator mi = joint_map->find(joint_vertex_transform->
get_joint());
888 if (mi == joint_map->end()) {
889 mi = joint_map->insert(CharacterJointMap::value_type(joint_vertex_transform->
get_joint(),
pvector<pair<EggVertex*,PN_stdfloat> >())).first;
892 joint_vertices.push_back(pair<EggVertex*,PN_stdfloat>(new_egg_vert, weight));
898 egg_child->add_vertex(new_egg_vert);
908 bool has_decal, CharacterJointMap *joint_map) {
912 for (
int i = 0; i < num_children; i++) {
914 convert_node(
WorkingNodePath(node_path, child), egg_parent, has_decal, joint_map);
923 apply_node_properties(
EggGroup *egg_group,
PandaNode *node,
bool allow_backstage) {
924 bool any_applied =
false;
930 egg_group->add_object_type(
"backstage");
933 if (node->has_tags()) {
934 if (apply_tags(egg_group, node)) {
939 if (node->
is_of_type(ModelNode::get_class_type())) {
942 case ModelNode::PT_none:
943 egg_group->set_model_flag(
true);
946 case ModelNode::PT_drop_node:
949 case ModelNode::PT_net:
950 egg_group->set_dcs_type(EggGroup::DC_net);
953 case ModelNode::PT_local:
954 egg_group->set_dcs_type(EggGroup::DC_local);
957 case ModelNode::PT_no_touch:
958 egg_group->set_dcs_type(EggGroup::DC_no_touch);
963 if (node->
is_of_type(UvScrollNode::get_class_type())) {
965 egg_group->set_scroll_u(scroll_node->get_u_speed());
966 egg_group->set_scroll_v(scroll_node->get_v_speed());
967 egg_group->set_scroll_w(scroll_node->get_w_speed());
968 egg_group->set_scroll_r(scroll_node->get_r_speed());
973 if (effect !=
nullptr) {
976 egg_group->set_billboard_type(EggGroup::BT_axis);
980 egg_group->set_billboard_type(EggGroup::BT_point_camera_relative);
984 egg_group->set_billboard_type(EggGroup::BT_point_world_relative);
994 const LVecBase3 &scale = transform->
get_scale();
995 const LQuaternion &quat = transform->
get_quat();
996 const LVecBase3 &pos = transform->
get_pos();
997 if (!scale.almost_equal(LVecBase3(1.0f, 1.0f, 1.0f))) {
1000 if (!quat.is_identity()) {
1003 if (!pos.almost_equal(LVecBase3::zero())) {
1007 }
else if (transform->
has_mat()) {
1009 const LMatrix4 &mat = transform->
get_mat();
1016 if (apply_state_properties(egg_group, state)) {
1033 bool any_applied =
false;
1037 if (state->get_attrib(tra)) {
1038 EggRenderMode::AlphaMode tex_trans = EggRenderMode::AM_unspecified;
1040 case TransparencyAttrib::M_none:
1041 tex_trans = EggRenderMode::AM_off;
1043 case TransparencyAttrib::M_alpha:
1044 tex_trans = EggRenderMode::AM_blend;
1046 case TransparencyAttrib::M_premultiplied_alpha:
1047 tex_trans = EggRenderMode::AM_premultiplied;
1049 case TransparencyAttrib::M_multisample:
1050 tex_trans = EggRenderMode::AM_ms;
1052 case TransparencyAttrib::M_multisample_mask:
1053 tex_trans = EggRenderMode::AM_ms_mask;
1055 case TransparencyAttrib::M_binary:
1056 tex_trans = EggRenderMode::AM_binary;
1058 case TransparencyAttrib::M_dual:
1059 tex_trans = EggRenderMode::AM_dual;
1068 if (state->get_attrib(dwa)) {
1069 if (dwa->
get_mode() != DepthWriteAttrib::M_off) {
1072 }
else if (egg_render_mode->
get_alpha_mode() == EggRenderMode::AM_blend) {
1074 egg_render_mode->
set_alpha_mode(EggRenderMode::AM_blend_no_occlude);
1083 if (state->get_attrib(dta)) {
1084 RenderAttrib::PandaCompareFunc mode = dta->
get_mode();
1085 if (mode == DepthTestAttrib::M_none || mode == DepthTestAttrib::M_always) {
1094 if (state->get_attrib(doa)) {
1100 if (state->get_attrib(cba)) {
1115 std::ostringstream strm;
1116 char delimiter =
'\n';
1117 string delimiter_str(1, delimiter);
1120 string data = strm.str();
1125 bool any_applied =
false;
1128 size_t q = data.find(delimiter);
1129 while (q != string::npos) {
1130 string tag = data.substr(p, q);
1131 if (apply_tag(egg_group, node, tag)) {
1135 q = data.find(delimiter, p);
1138 string tag = data.substr(p);
1139 if (apply_tag(egg_group, node, tag)) {
1151 if (!node->has_tag(tag)) {
1155 string value = node->get_tag(tag);
1156 egg_group->
set_tag(tag, value);
1165 if (mat !=
nullptr) {
1167 if (mat->has_base_color()) {
1168 temp.set_base(mat->get_base_color());
1171 if (mat->has_ambient()) {
1172 temp.set_amb(mat->get_ambient());
1175 if (mat->has_diffuse()) {
1176 temp.set_diff(mat->get_diffuse());
1179 if (mat->has_specular()) {
1180 temp.set_spec(mat->get_specular());
1183 if (mat->has_emission()) {
1184 temp.set_emit(mat->get_emission());
1187 if (mat->has_roughness()) {
1188 temp.set_roughness(mat->get_roughness());
1190 temp.set_shininess(mat->get_shininess());
1193 if (mat->has_metallic()) {
1194 temp.set_metallic(mat->get_metallic());
1197 if (mat->has_refractive_index()) {
1198 temp.set_ior(mat->get_refractive_index());
1201 temp.set_local(mat->get_local());
1213 get_egg_texture(
Texture *tex) {
1214 if (tex !=
nullptr) {
1220 temp.set_alpha_filename(alpha);
1224 case SamplerState::FT_nearest:
1225 temp.set_minfilter(EggTexture::FT_nearest);
1227 case SamplerState::FT_linear:
1228 temp.set_minfilter(EggTexture::FT_linear);
1230 case SamplerState::FT_nearest_mipmap_nearest:
1231 temp.set_minfilter(EggTexture::FT_nearest_mipmap_nearest);
1233 case SamplerState::FT_linear_mipmap_nearest:
1234 temp.set_minfilter(EggTexture::FT_linear_mipmap_nearest);
1236 case SamplerState::FT_nearest_mipmap_linear:
1237 temp.set_minfilter(EggTexture::FT_nearest_mipmap_linear);
1239 case SamplerState::FT_linear_mipmap_linear:
1240 temp.set_minfilter(EggTexture::FT_linear_mipmap_linear);
1248 case SamplerState::FT_nearest:
1249 temp.set_magfilter(EggTexture::FT_nearest);
1251 case SamplerState::FT_linear:
1252 temp.set_magfilter(EggTexture::FT_linear);
1260 case SamplerState::WM_clamp:
1261 temp.set_wrap_u(EggTexture::WM_clamp);
1263 case SamplerState::WM_repeat:
1264 temp.set_wrap_u(EggTexture::WM_repeat);
1274 case SamplerState::WM_clamp:
1275 temp.set_wrap_v(EggTexture::WM_clamp);
1277 case SamplerState::WM_repeat:
1278 temp.set_wrap_v(EggTexture::WM_repeat);
1288 case Texture::F_red:
1289 temp.set_format(EggTexture::F_red);
1291 case Texture::F_green:
1292 temp.set_format(EggTexture::F_green);
1294 case Texture::F_blue:
1295 temp.set_format(EggTexture::F_blue);
1297 case Texture::F_alpha:
1298 temp.set_format(EggTexture::F_alpha);
1300 case Texture::F_rgb:
1301 temp.set_format(EggTexture::F_rgb);
1303 case Texture::F_rgb5:
1304 temp.set_format(EggTexture::F_rgb5);
1306 case Texture::F_rgb8:
1307 temp.set_format(EggTexture::F_rgb8);
1309 case Texture::F_rgb12:
1310 temp.set_format(EggTexture::F_rgb12);
1312 case Texture::F_rgb332:
1313 temp.set_format(EggTexture::F_rgb332);
1315 case Texture::F_rgba:
1316 temp.set_format(EggTexture::F_rgba);
1318 case Texture::F_rgbm:
1319 temp.set_format(EggTexture::F_rgbm);
1321 case Texture::F_rgba4:
1322 temp.set_format(EggTexture::F_rgba4);
1324 case Texture::F_rgba5:
1325 temp.set_format(EggTexture::F_rgba5);
1327 case Texture::F_rgba8:
1328 temp.set_format(EggTexture::F_rgba8);
1330 case Texture::F_rgba12:
1331 temp.set_format(EggTexture::F_rgba12);
1333 case Texture::F_luminance:
1334 temp.set_format(EggTexture::F_luminance);
1336 case Texture::F_luminance_alpha:
1337 temp.set_format(EggTexture::F_luminance_alpha);
1339 case Texture::F_luminance_alphamask:
1340 temp.set_format(EggTexture::F_luminance_alphamask);