Support for CollisionBox, InvSphere and Tube in bam2egg

This commit is contained in:
rdb 2016-09-08 22:14:44 +02:00
parent 25cfec3760
commit 206d361f49
1 changed files with 75 additions and 6 deletions

View File

@ -479,7 +479,12 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path,
egg_sphere->set_collide_flags(EggGroup::CF_descend);
egg_group->add_child(egg_sphere);
}
egg_sphere->set_cs_type(EggGroup::CST_sphere);
if (child->is_of_type(CollisionInvSphere::get_class_type())) {
egg_sphere->set_cs_type(EggGroup::CST_inv_sphere);
} else {
egg_sphere->set_cs_type(EggGroup::CST_sphere);
}
EggVertex ev1, ev2;
ev1.set_pos(LCAST(double, (center + offset) * net_mat));
@ -531,13 +536,77 @@ convert_collision_node(CollisionNode *node, const WorkingNodePath &node_path,
egg_poly->add_vertex(cvpool->create_unique_vertex(ev2));
} else if (child->is_of_type(CollisionBox::get_class_type())) {
nout << "Encountered unhandled collsion type: CollisionBox" << "\n";
} else if (child->is_of_type(CollisionInvSphere::get_class_type())) {
nout << "Encountered unhandled collsion type: CollisionInvSphere" << "\n";
CPT(CollisionBox) box = DCAST(CollisionBox, child);
LPoint3 min_point = box->get_min();
LPoint3 max_point = box->get_max();
EggGroup *egg_box;
if (num_solids == 1) {
egg_box = egg_group;
} else {
egg_box = new EggGroup;
egg_box->set_collide_flags(EggGroup::CF_descend);
egg_group->add_child(egg_box);
}
egg_box->set_cs_type(EggGroup::CST_box);
// Just add the min and max points.
EggVertex ev0, ev1;
ev0.set_pos(LCAST(double, min_point * net_mat));
ev1.set_pos(LCAST(double, max_point * net_mat));
EggLine *egg_poly = new EggLine;
egg_box->add_child(egg_poly);
egg_poly->add_vertex(cvpool->create_unique_vertex(ev0));
egg_poly->add_vertex(cvpool->create_unique_vertex(ev1));
} else if (child->is_of_type(CollisionTube::get_class_type())) {
nout << "Encountered unhandled collsion type: CollisionTube" << "\n";
CPT(CollisionTube) tube = DCAST(CollisionTube, child);
LPoint3 point_a = tube->get_point_a();
LPoint3 point_b = tube->get_point_b();
LPoint3 centroid = (point_a + point_b) * 0.5f;
// Also get an arbitrary vector perpendicular to the tube.
LVector3 axis = point_b - point_a;
LVector3 sideways;
if (abs(axis[2]) > abs(axis[1])) {
sideways = axis.cross(LVector3(0, 1, 0));
} else {
sideways = axis.cross(LVector3(0, 0, 1));
}
sideways.normalize();
sideways *= tube->get_radius();
LVector3 extend = axis.normalized() * tube->get_radius();
EggGroup *egg_tube;
if (num_solids == 1) {
egg_tube = egg_group;
} else {
egg_tube = new EggGroup;
egg_tube->set_collide_flags(EggGroup::CF_descend);
egg_group->add_child(egg_tube);
}
egg_tube->set_cs_type(EggGroup::CST_tube);
// Add two points for the endcaps, and then two points around the
// centroid to indicate the radius.
EggVertex ev0, ev1, ev2, ev3;
ev0.set_pos(LCAST(double, (point_a - extend) * net_mat));
ev1.set_pos(LCAST(double, (centroid + sideways) * net_mat));
ev2.set_pos(LCAST(double, (point_b + extend) * net_mat));
ev3.set_pos(LCAST(double, (centroid - sideways) * net_mat));
EggPolygon *egg_poly = new EggPolygon;
egg_tube->add_child(egg_poly);
egg_poly->add_vertex(cvpool->create_unique_vertex(ev0));
egg_poly->add_vertex(cvpool->create_unique_vertex(ev1));
egg_poly->add_vertex(cvpool->create_unique_vertex(ev2));
egg_poly->add_vertex(cvpool->create_unique_vertex(ev3));
} else {
nout << "Encountered unknown CollisionSolid" << "\n";
nout << "Encountered unknown collision solid type " << child->get_type() << "\n";
}
}
}