Added Vec3d ModelInstance::transform_vector() method

This commit is contained in:
Enrico Turri 2018-09-06 09:16:32 +02:00
parent b9287d51dd
commit c8f1369824
4 changed files with 17 additions and 9 deletions

View File

@ -1016,6 +1016,11 @@ BoundingBoxf3 ModelInstance::transform_bounding_box(const BoundingBoxf3 &bbox, b
return bbox.transformed(world_matrix(dont_translate)); return bbox.transformed(world_matrix(dont_translate));
} }
Vec3d ModelInstance::transform_vector(const Vec3d& v, bool dont_translate) const
{
return world_matrix(dont_translate) * v;
}
void ModelInstance::transform_polygon(Polygon* polygon) const void ModelInstance::transform_polygon(Polygon* polygon) const
{ {
polygon->rotate(this->rotation); // rotate around polygon origin polygon->rotate(this->rotation); // rotate around polygon origin

View File

@ -239,6 +239,8 @@ public:
BoundingBoxf3 transform_mesh_bounding_box(const TriangleMesh* mesh, bool dont_translate = false) const; BoundingBoxf3 transform_mesh_bounding_box(const TriangleMesh* mesh, bool dont_translate = false) const;
// Transform an external bounding box. // Transform an external bounding box.
BoundingBoxf3 transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate = false) const; BoundingBoxf3 transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate = false) const;
// Transform an external vector.
Vec3d transform_vector(const Vec3d& v, bool dont_translate = false) const;
// To be called on an external polygon. It does not translate the polygon, only rotates and scales. // To be called on an external polygon. It does not translate the polygon, only rotates and scales.
void transform_polygon(Polygon* polygon) const; void transform_polygon(Polygon* polygon) const;

View File

@ -5241,12 +5241,15 @@ void GLCanvas3D::_on_move(const std::vector<int>& volume_idxs)
{ {
// Move a regular object. // Move a regular object.
ModelObject* model_object = m_model->objects[obj_idx]; ModelObject* model_object = m_model->objects[obj_idx];
if (model_object != nullptr)
{
const Vec3d& offset = volume->get_offset(); const Vec3d& offset = volume->get_offset();
model_object->instances[instance_idx]->offset = Vec2d(offset(0), offset(1)); model_object->instances[instance_idx]->offset = Vec2d(offset(0), offset(1));
model_object->invalidate_bounding_box(); model_object->invalidate_bounding_box();
update_position_values(); update_position_values();
object_moved = true; object_moved = true;
} }
}
else if (obj_idx == 1000) else if (obj_idx == 1000)
// Move a wipe tower proxy. // Move a wipe tower proxy.
wipe_tower_origin = volume->get_offset(); wipe_tower_origin = volume->get_offset();

View File

@ -1061,8 +1061,6 @@ void GLGizmoFlatten::on_render_for_picking(const BoundingBoxf3& box) const
for (unsigned int i = 0; i < m_planes.size(); ++i) for (unsigned int i = 0; i < m_planes.size(); ++i)
{ {
// FIXME: the color assignement will fail if the planes count is greater than 254
// use the other color components in that case !!
::glColor3f(1.0f, 1.0f, picking_color_component(i)); ::glColor3f(1.0f, 1.0f, picking_color_component(i));
for (const Vec2d& offset : m_instances_positions) { for (const Vec2d& offset : m_instances_positions) {
::glPushMatrix(); ::glPushMatrix();
@ -1240,9 +1238,9 @@ void GLGizmoFlatten::update_planes()
polygon = transform(polygon, m); polygon = transform(polygon, m);
} }
// We'll sort the planes by area and only keep the 255 largest ones (because of the picking pass limitations): // We'll sort the planes by area and only keep the 254 largest ones (because of the picking pass limitations):
std::sort(m_planes.rbegin(), m_planes.rend(), [](const PlaneData& a, const PlaneData& b) { return a.area < b.area; }); std::sort(m_planes.rbegin(), m_planes.rend(), [](const PlaneData& a, const PlaneData& b) { return a.area < b.area; });
m_planes.resize(std::min((int)m_planes.size(), 255)); m_planes.resize(std::min((int)m_planes.size(), 254));
// Planes are finished - let's save what we calculated it from: // Planes are finished - let's save what we calculated it from:
m_source_data.bounding_boxes.clear(); m_source_data.bounding_boxes.clear();