void CustomMetric::updateTexture(MeshPtr model, Transform3D rMrr) { if (!model) return; if (!this->getTextureFollowTool() || !model->hasTexture()) return; // special case: // Project tool position down to the model, then set that position as // the texture x pos. Transform3D rMt = mSpaceProvider->getActiveToolTipTransform(CoordinateSystem::reference()); Transform3D rMd = rMrr * model->get_rMd(); Vector3D t_r = rMt.coord(Vector3D::Zero()); Vector3D td_r = rMt.vector(Vector3D::UnitZ()); DoubleBoundingBox3D bb_d = model->boundingBox(); Vector3D bl = bb_d.bottomLeft(); Vector3D tr = bb_d.topRight(); Vector3D c = (bl+tr)/2; Vector3D x_min_r(c[0], bl[1], c[2]); Vector3D x_max_r(c[0], tr[1], c[2]); x_min_r = rMd.coord(x_min_r); x_max_r = rMd.coord(x_max_r); double t_x = dot(t_r, td_r); double bbmin_x = dot(x_min_r, td_r); double bbmax_x = dot(x_max_r, td_r); double range = bbmax_x-bbmin_x; if (similar(range, 0.0)) range = 1.0E-6; double s = (t_x-bbmin_x)/range; model->getTextureData().getPositionY()->setValue(s); }