Added Doxygen documentation, removed using namespace std, some other minor changes.
This commit is contained in:
parent
fa4061a630
commit
2eb3337caa
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.3 2007/06/12 08:58:08 benedetti
|
||||||
|
Minor fix in DrawUglyCylinderMode()
|
||||||
|
|
||||||
Revision 1.2 2007/05/28 08:10:47 fiorin
|
Revision 1.2 2007/05/28 08:10:47 fiorin
|
||||||
Removed type cast warnings
|
Removed type cast warnings
|
||||||
|
|
||||||
|
@ -47,13 +50,23 @@ Utility functions for the trackmodes, first version
|
||||||
#include <wrap/gl/space.h>
|
#include <wrap/gl/space.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
namespace vcg {
|
namespace vcg {
|
||||||
|
|
||||||
|
/*!
|
||||||
|
This namespace contains some support functions used by TrackMode subclassess.
|
||||||
|
|
||||||
|
\warning Many of these functions shouldn't be here and are supposed to be moved to some appropriate place by the library administrator.
|
||||||
|
\warning The \e DrawUgly series of functions is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
*/
|
||||||
namespace trackutils {
|
namespace trackutils {
|
||||||
|
|
||||||
/// Compute the plane perpedicular to view dir and passing through manip center
|
/*!
|
||||||
|
@brief Compute the plane perpedicular to view dir and passing through the manipulator center.
|
||||||
|
|
||||||
|
@param camera the camera of the manipulator.
|
||||||
|
@param center the center of the manipulator.
|
||||||
|
@return the plane perpedicular to view dir and passing through the manipulator center.
|
||||||
|
*/
|
||||||
Plane3f GetViewPlane (const View < float >&camera, const Point3f & center)
|
Plane3f GetViewPlane (const View < float >&camera, const Point3f & center)
|
||||||
{
|
{
|
||||||
Point3f vp = camera.ViewPoint ();
|
Point3f vp = camera.ViewPoint ();
|
||||||
|
@ -64,24 +77,36 @@ Plane3f GetViewPlane (const View < float >&camera, const Point3f & center)
|
||||||
return pl;
|
return pl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Convert a line to a normalized ray.
|
||||||
|
|
||||||
|
@param l the line to be converted.
|
||||||
|
@return the normalized ray.
|
||||||
|
*/
|
||||||
Ray3f line2ray(const Line3f &l){
|
Ray3f line2ray(const Line3f &l){
|
||||||
Ray3f r(l.Origin(),l.Direction());
|
Ray3f r(l.Origin(),l.Direction());
|
||||||
r.Normalize();
|
r.Normalize();
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given a point p in window coordinate it compute the point where the lie p
|
|
||||||
// over the plane paralell the viewplane and passing through the center of the trackball
|
/*!
|
||||||
|
@brief Project a window coordinate point on the plane perpedicular to view dir and passing through the manipulator center.
|
||||||
|
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param p the window coordinate point.
|
||||||
|
@return p's projection on plane perpedicular to view dir and passing through the manipulator center.
|
||||||
|
*/
|
||||||
Point3f HitViewPlane (Trackball * tb, const Point3f & p)
|
Point3f HitViewPlane (Trackball * tb, const Point3f & p)
|
||||||
{
|
{
|
||||||
// plane perpedicular to view direction and passing through manip center
|
|
||||||
Plane3f vp = GetViewPlane (tb->camera, tb->center);
|
Plane3f vp = GetViewPlane (tb->camera, tb->center);
|
||||||
Line3fN ln = tb->camera.ViewLineFromWindow (Point3f (p[0], p[1], 0));
|
Line3fN ln = tb->camera.ViewLineFromWindow (Point3f (p[0], p[1], 0));
|
||||||
Point3f PonVP;
|
Point3f PonVP;
|
||||||
/*bool res = */ IntersectionLinePlane < float >(vp, ln, PonVP);
|
IntersectionLinePlane < float >(vp, ln, PonVP);
|
||||||
return PonVP;
|
return PonVP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dato un punto in coordinate di schermo e.g. in pixel stile opengl
|
dato un punto in coordinate di schermo e.g. in pixel stile opengl
|
||||||
calcola il punto di intersezione tra la viewline che passa per viewpoint e per hitplane e l'iperboloide.
|
calcola il punto di intersezione tra la viewline che passa per viewpoint e per hitplane e l'iperboloide.
|
||||||
|
@ -104,6 +129,19 @@ y = --- * (r^2 /2.0)
|
||||||
viewpoint.x
|
viewpoint.x
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
// nota: non ho scritto io questa funzione,
|
||||||
|
// quindi la documentazione doxy potrebbe non essere accurata al 100%.
|
||||||
|
/*!
|
||||||
|
@brief Project a window coordinate point on the rotational hyperboloid relative to the manipulator.
|
||||||
|
|
||||||
|
@param center the center of the manipulator.
|
||||||
|
@param radius the radius of the manipulator.
|
||||||
|
@param viewpoint the view point.
|
||||||
|
@param vp the view plane.
|
||||||
|
@param hitplane the projection of the window coordinate point on the view plane.
|
||||||
|
@param hit the projection of hitplane on the rotational hyperboloid relative to the manipulator.
|
||||||
|
@return true if and only if hit is valid.
|
||||||
|
*/
|
||||||
bool HitHyper (Point3f center, float radius, Point3f viewpoint, Plane3f vp,
|
bool HitHyper (Point3f center, float radius, Point3f viewpoint, Plane3f vp,
|
||||||
Point3f hitplane, Point3f & hit)
|
Point3f hitplane, Point3f & hit)
|
||||||
{
|
{
|
||||||
|
@ -149,7 +187,15 @@ bool HitHyper (Point3f center, float radius, Point3f viewpoint, Plane3f vp,
|
||||||
eq cono y=x+sqrt(2);
|
eq cono y=x+sqrt(2);
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
// nota: non ho scritto io questa funzione,
|
||||||
|
// quindi la documentazione doxy potrebbe non essere accurata al 100%.
|
||||||
|
/*!
|
||||||
|
@brief Project a window coordinate point on the sphere relative to the manipulator.
|
||||||
|
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param p the window coordinate point.
|
||||||
|
@return the projection of p on the sphere relative to the manipulator.
|
||||||
|
*/
|
||||||
Point3f HitSphere (Trackball * tb, const Point3f & p)
|
Point3f HitSphere (Trackball * tb, const Point3f & p)
|
||||||
{
|
{
|
||||||
// const float Thr = tb->radius/math::Sqrt(2.0f);
|
// const float Thr = tb->radius/math::Sqrt(2.0f);
|
||||||
|
@ -225,16 +271,25 @@ Point3f HitSphere (Trackball * tb, const Point3f & p)
|
||||||
// return hit;
|
// return hit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*!
|
||||||
calculates the minimal distance between 2 lines.
|
@brief Calculates the minimal distance between 2 lines.
|
||||||
|
|
||||||
P and Q are the lines, P_s and Q_t are set to be the closest points on these lines.
|
P and Q are the lines, P_s and Q_t are set to be the closest points on these lines.
|
||||||
|
|
||||||
it's returned the distance from P_s and Q_t, and a boolean value which is true
|
it's returned the distance from P_s and Q_t, and a boolean value which is true
|
||||||
if the lines are parallel enough.
|
if the lines are parallel enough.
|
||||||
|
|
||||||
if P and Q are parallel P_s and Q_t aren't set.
|
if P and Q are parallel P_s and Q_t aren't set.
|
||||||
|
|
||||||
the formula is taken from pages 81-83 of
|
the formula is taken from pages 81-83 of
|
||||||
"Eric Lengyel - Mathematics for 3D Game Programming & Computer Graphics"
|
<em>"Eric Lengyel - Mathematics for 3D Game Programming & Computer Graphics"</em>
|
||||||
|
@param P the first line.
|
||||||
|
@param Q the second line.
|
||||||
|
@param P_s the point on P closest to Q.
|
||||||
|
@param Q_t the point on Q closest to P.
|
||||||
|
@return a std::pair made with the distance from P_s to Q_t and a boolean value, true if and only if P and Q are almost parallel.
|
||||||
*/
|
*/
|
||||||
pair< float, bool > LineLineDistance(const Line3f & P,const Line3f & Q,Point3f & P_s, Point3f & Q_t){
|
std::pair< float, bool > LineLineDistance(const Line3f & P,const Line3f & Q,Point3f & P_s, Point3f & Q_t){
|
||||||
Point3f p0 = P.Origin (), Vp = P.Direction ();
|
Point3f p0 = P.Origin (), Vp = P.Direction ();
|
||||||
Point3f q0 = Q.Origin (), Vq = Q.Direction ();
|
Point3f q0 = Q.Origin (), Vq = Q.Direction ();
|
||||||
float VPVP = Vp * Vp;
|
float VPVP = Vp * Vp;
|
||||||
|
@ -243,7 +298,7 @@ pair< float, bool > LineLineDistance(const Line3f & P,const Line3f & Q,Point3f &
|
||||||
const float det = ( VPVP * VQVQ ) - ( VPVQ * VPVQ );
|
const float det = ( VPVP * VQVQ ) - ( VPVQ * VPVQ );
|
||||||
const float EPSILON = 0.00001f;
|
const float EPSILON = 0.00001f;
|
||||||
if ( fabs(det) < EPSILON ) {
|
if ( fabs(det) < EPSILON ) {
|
||||||
return make_pair(Distance(P,q0), true);
|
return std::make_pair(Distance(P,q0), true);
|
||||||
}
|
}
|
||||||
float b1= (q0 - p0) * Vp;
|
float b1= (q0 - p0) * Vp;
|
||||||
float b2= (p0 - q0) * Vq;
|
float b2= (p0 - q0) * Vq;
|
||||||
|
@ -251,18 +306,26 @@ pair< float, bool > LineLineDistance(const Line3f & P,const Line3f & Q,Point3f &
|
||||||
float t = ( (VPVQ * b1) + (VPVP * b2) ) / det;
|
float t = ( (VPVQ * b1) + (VPVP * b2) ) / det;
|
||||||
P_s = p0 + (Vp * s);
|
P_s = p0 + (Vp * s);
|
||||||
Q_t = q0 + (Vq * t);
|
Q_t = q0 + (Vq * t);
|
||||||
return make_pair(Distance(P_s,Q_t),false);
|
return std::make_pair(Distance(P_s,Q_t),false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*!
|
||||||
calculates the minimal distance between a ray and a line
|
@brief Calculates the minimal distance between a ray and a line.
|
||||||
|
|
||||||
R is the ray and Q is the line, R_s and Q_t are set to be the closest points on
|
R is the ray and Q is the line, R_s and Q_t are set to be the closest points on
|
||||||
the ray and the line.
|
the ray and the line.
|
||||||
|
|
||||||
it's returned the distance from R_s and Q_t, and a boolean value which is true
|
it's returned the distance from R_s and Q_t, and a boolean value which is true
|
||||||
if the ray and the line are parallel enough.
|
if the ray and the line are parallel enough.
|
||||||
|
|
||||||
if R and Q are parallel R_s and Q_t aren't set.
|
if R and Q are parallel R_s and Q_t aren't set.
|
||||||
|
@param R the ray.
|
||||||
|
@param Q the line.
|
||||||
|
@param R_s the point on R closest to Q.
|
||||||
|
@param Q_t the point on Q closest to R.
|
||||||
|
@return a std::pair made with the distance from R_s to Q_t and a boolean value, true if and only if P and Q are almost parallel.
|
||||||
*/
|
*/
|
||||||
pair< float, bool > RayLineDistance(const Ray3f & R,const Line3f & Q,Point3f & R_s, Point3f & Q_t){
|
std::pair< float, bool > RayLineDistance(const Ray3f & R,const Line3f & Q,Point3f & R_s, Point3f & Q_t){
|
||||||
Point3f r0 = R.Origin (), Vr = R.Direction ();
|
Point3f r0 = R.Origin (), Vr = R.Direction ();
|
||||||
Point3f q0 = Q.Origin (), Vq = Q.Direction ();
|
Point3f q0 = Q.Origin (), Vq = Q.Direction ();
|
||||||
float VRVR = Vr * Vr;
|
float VRVR = Vr * Vr;
|
||||||
|
@ -271,7 +334,7 @@ pair< float, bool > RayLineDistance(const Ray3f & R,const Line3f & Q,Point3f & R
|
||||||
const float det = ( VRVR * VQVQ ) - ( VRVQ * VRVQ );
|
const float det = ( VRVR * VQVQ ) - ( VRVQ * VRVQ );
|
||||||
const float EPSILON = 0.00001f;
|
const float EPSILON = 0.00001f;
|
||||||
if ( ( det >= 0.0f ? det : -det) < EPSILON ) {
|
if ( ( det >= 0.0f ? det : -det) < EPSILON ) {
|
||||||
return make_pair(Distance(Q,r0), true);
|
return std::make_pair(Distance(Q,r0), true);
|
||||||
}
|
}
|
||||||
float b1= (q0 - r0) * Vr;
|
float b1= (q0 - r0) * Vr;
|
||||||
float b2= (r0 - q0) * Vq;
|
float b2= (r0 - q0) * Vq;
|
||||||
|
@ -284,30 +347,37 @@ pair< float, bool > RayLineDistance(const Ray3f & R,const Line3f & Q,Point3f & R
|
||||||
R_s = r0 + (Vr * s);
|
R_s = r0 + (Vr * s);
|
||||||
Q_t = q0 + (Vq * t);
|
Q_t = q0 + (Vq * t);
|
||||||
}
|
}
|
||||||
return make_pair(Distance(R_s,Q_t),false);
|
return std::make_pair(Distance(R_s,Q_t),false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*!
|
||||||
calculates the minimal distance between 2 segments
|
@brief Calculates the minimal distance between 2 segments.
|
||||||
|
|
||||||
R e Q are the segments, R_s and Q_t are set to be the closest points on
|
R e Q are the segments, R_s and Q_t are set to be the closest points on
|
||||||
the segments
|
the segments.
|
||||||
|
|
||||||
it's returned the distance from R_s and Q_t, and a boolean value which is true
|
it's returned the distance from R_s and Q_t, and a boolean value which is true
|
||||||
if the segments are parallel enough.
|
if the segments are parallel enough.
|
||||||
|
@param R the first segment.
|
||||||
|
@param Q the second segment.
|
||||||
|
@param R_s the point on R closest to Q.
|
||||||
|
@param Q_t the point on Q closest to R.
|
||||||
|
@return a std::pair made with the distance from R_s to Q_t and a boolean value, true if and only if P and Q are almost parallel.
|
||||||
*/
|
*/
|
||||||
pair< float, bool > SegmentSegmentDistance(const Segment3f & R, const Segment3f & Q, Point3f & R_s, Point3f & Q_t)
|
std::pair< float, bool > SegmentSegmentDistance(const Segment3f & R, const Segment3f & Q, Point3f & R_s, Point3f & Q_t)
|
||||||
{
|
{
|
||||||
float R_len=Distance(R.P0(),R.P1());
|
float R_len=Distance(R.P0(),R.P1());
|
||||||
float Q_len=Distance(Q.P0(),Q.P1());
|
float Q_len=Distance(Q.P0(),Q.P1());
|
||||||
const float EPSILON_LENGTH = max(R_len,Q_len)*0.0001f;
|
const float EPSILON_LENGTH = std::max(R_len,Q_len)*0.0001f;
|
||||||
if(R_len < EPSILON_LENGTH){
|
if(R_len < EPSILON_LENGTH){
|
||||||
R_s=R.P0();
|
R_s=R.P0();
|
||||||
Q_t=ClosestPoint(Q,R_s);
|
Q_t=ClosestPoint(Q,R_s);
|
||||||
return make_pair(Distance(R_s,Q_t),true);
|
return std::make_pair(Distance(R_s,Q_t),true);
|
||||||
}
|
}
|
||||||
if( Q_len < EPSILON_LENGTH){
|
if( Q_len < EPSILON_LENGTH){
|
||||||
Q_t=Q.P0();
|
Q_t=Q.P0();
|
||||||
R_s=ClosestPoint(R,Q_t);
|
R_s=ClosestPoint(R,Q_t);
|
||||||
return make_pair(Distance(R_s,Q_t),true);
|
return std::make_pair(Distance(R_s,Q_t),true);
|
||||||
}
|
}
|
||||||
Point3f r0 = R.P0(), Vr = (R.P1()-R.P0()).Normalize();
|
Point3f r0 = R.P0(), Vr = (R.P1()-R.P0()).Normalize();
|
||||||
Point3f q0 = Q.P0(), Vq = (Q.P1()-Q.P0()).Normalize();
|
Point3f q0 = Q.P0(), Vq = (Q.P1()-Q.P0()).Normalize();
|
||||||
|
@ -342,7 +412,7 @@ pair< float, bool > SegmentSegmentDistance(const Segment3f & R, const Segment3f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return make_pair(Distance(R_s,Q_t),true);
|
return std::make_pair(Distance(R_s,Q_t),true);
|
||||||
}
|
}
|
||||||
float b1= (q0 - r0) * Vr;
|
float b1= (q0 - r0) * Vr;
|
||||||
float b2= (r0 - q0) * Vq;
|
float b2= (r0 - q0) * Vq;
|
||||||
|
@ -362,22 +432,42 @@ pair< float, bool > SegmentSegmentDistance(const Segment3f & R, const Segment3f
|
||||||
}else{
|
}else{
|
||||||
Q_t = q0 + (Vq * t);
|
Q_t = q0 + (Vq * t);
|
||||||
}
|
}
|
||||||
return make_pair(Distance(R_s,Q_t),false);
|
return std::make_pair(Distance(R_s,Q_t),false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Compute the point on a line closest to the ray projection of a window coordinate point.
|
||||||
|
|
||||||
pair< Point3f,bool > HitNearestPointOnAxis (Trackball * tb,Line3f axis, Point3f point)
|
Given a window coordinate point, computes a ray starting from the manipulator
|
||||||
|
camera eye and passing through the point's projection on the viewplane, then uses RayLineDistance()
|
||||||
|
to get the closest point to ray on a given line.
|
||||||
|
@see RayLineDistance(const Ray3f & R,const Line3f & Q,Point3f & R_s, Point3f & Q_t)
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param axis the axis.
|
||||||
|
@param point the window coordinate point.
|
||||||
|
@return a std::pair made with the point on axis closest to the ray projection of point and a boolean true if and only if the ray doesn't diverges respect to the axis.
|
||||||
|
*/
|
||||||
|
std::pair< Point3f,bool > HitNearestPointOnAxis (Trackball * tb,Line3f axis, Point3f point)
|
||||||
{
|
{
|
||||||
Ray3fN ray = line2ray(tb->camera.ViewLineFromWindow (point));
|
Ray3fN ray = line2ray(tb->camera.ViewLineFromWindow (point));
|
||||||
Point3f axis_p(0,0,0), ray_p(0,0,0);
|
Point3f axis_p(0,0,0), ray_p(0,0,0);
|
||||||
pair< float, bool > resp=RayLineDistance(ray,axis,ray_p,axis_p);
|
std::pair< float, bool > resp=RayLineDistance(ray,axis,ray_p,axis_p);
|
||||||
if(resp.second || (ray_p == ray.Origin())){
|
if(resp.second || (ray_p == ray.Origin())){
|
||||||
return make_pair(Point3f(0,0,0),false);
|
return std::make_pair(Point3f(0,0,0),false);
|
||||||
}
|
}
|
||||||
return make_pair(axis_p,true);
|
return std::make_pair(axis_p,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Project a line into a plane.
|
||||||
|
|
||||||
|
Given a line and a plane, returns the line projection on the plane.
|
||||||
|
|
||||||
|
The line returned is \e not normalized.
|
||||||
|
@param ln the line.
|
||||||
|
@param pl the plane.
|
||||||
|
@return the (non normalized) line projected.
|
||||||
|
*/
|
||||||
Line3f ProjectLineOnPlane(const Line3f & ln, const Plane3f & pl)
|
Line3f ProjectLineOnPlane(const Line3f & ln, const Plane3f & pl)
|
||||||
{
|
{
|
||||||
Point3f l0=ln.Origin();
|
Point3f l0=ln.Origin();
|
||||||
|
@ -389,6 +479,15 @@ Line3f ProjectLineOnPlane(const Line3f & ln, const Plane3f & pl)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief Computes a signed line-point distance.
|
||||||
|
|
||||||
|
Given a line, a point and a positivity direction, computes the signed distance between the line and the point.
|
||||||
|
@param line the line.
|
||||||
|
@param pt the point.
|
||||||
|
@param positive_dir the positivity direction.
|
||||||
|
@return the signed distance.
|
||||||
|
*/
|
||||||
float signedDistance(Line3f line,Point3f pt,Point3f positive_dir)
|
float signedDistance(Line3f line,Point3f pt,Point3f positive_dir)
|
||||||
{
|
{
|
||||||
return Distance(line,pt) * ((((pt-ClosestPoint(line,pt)) * positive_dir) >= 0.0f )? 1.0f: -1.0f);
|
return Distance(line,pt) * ((((pt-ClosestPoint(line,pt)) * positive_dir) >= 0.0f )? 1.0f: -1.0f);
|
||||||
|
@ -400,7 +499,14 @@ float getDeltaY(Trackball * tb, Point3f new_point)
|
||||||
return (new_point[1] - tb->last_point[1]) / ScreenHeight;
|
return (new_point[1] - tb->last_point[1]) / ScreenHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// intersection between RAY and plane
|
/*!
|
||||||
|
@brief Computes the intersection between a ray and a plane.
|
||||||
|
|
||||||
|
@param pl the plane.
|
||||||
|
@param ray the ray.
|
||||||
|
@param po the intersection point.
|
||||||
|
@return true if and only if there is intersection (po is valid).
|
||||||
|
*/
|
||||||
template<class T>
|
template<class T>
|
||||||
inline bool IntersectionRayPlane( const Plane3<T> & pl, const Ray3<T> & ray, Point3<T> &po){
|
inline bool IntersectionRayPlane( const Plane3<T> & pl, const Ray3<T> & ray, Point3<T> &po){
|
||||||
const T epsilon = T(1e-8);
|
const T epsilon = T(1e-8);
|
||||||
|
@ -415,19 +521,46 @@ template<class T>
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
pair< Point3f, bool > HitPlane (Trackball * tb, Point3f point, Plane3f plane)
|
/*!
|
||||||
|
@brief Project a window coordinate point on a plane.
|
||||||
|
|
||||||
|
Given a window coordinate point, computes a ray starting from the manipulator
|
||||||
|
camera eye and passing through the point's projection on the viewplane, then uses IntersectionRayPlane()
|
||||||
|
to get the ray intersection with a given plane.
|
||||||
|
|
||||||
|
@see IntersectionRayPlane( const Plane3<T> & pl, const Ray3<T> & ray, Point3<T> &po)
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param point the window coordinate point.
|
||||||
|
@param plane the plane.
|
||||||
|
@return a std::pair made with p's projection on the.plane and a boolean true if and only if the ray doesn't diverges respect to the plane.
|
||||||
|
*/
|
||||||
|
std::pair< Point3f, bool > HitPlane (Trackball * tb, Point3f point, Plane3f plane)
|
||||||
{
|
{
|
||||||
Ray3fN ray = line2ray(tb->camera.ViewLineFromWindow (point));
|
Ray3fN ray = line2ray(tb->camera.ViewLineFromWindow (point));
|
||||||
Point3f p(0,0,0);
|
Point3f p(0,0,0);
|
||||||
bool res = IntersectionRayPlane < float >(plane, ray, p);
|
bool res = IntersectionRayPlane < float >(plane, ray, p);
|
||||||
return make_pair(p,res);
|
return std::make_pair(p,res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// drawing section
|
// drawing section
|
||||||
|
|
||||||
|
// nota: non ho scritto io questa classe,
|
||||||
|
// quindi la documentazione doxy potrebbe non essere accurata al 100%.
|
||||||
|
/*!
|
||||||
|
@brief Drawing hints for manipulators
|
||||||
|
|
||||||
|
This class is an holder for drawing-related variables.
|
||||||
|
|
||||||
|
It's mainly used for SphereMode and InactiveMode drawings.
|
||||||
|
*/
|
||||||
class DrawingHint {
|
class DrawingHint {
|
||||||
public:
|
public:
|
||||||
|
/*!
|
||||||
|
@brief Drawing hints constructor
|
||||||
|
|
||||||
|
assign the drawing-related variables.
|
||||||
|
*/
|
||||||
DrawingHint () {
|
DrawingHint () {
|
||||||
CircleStep = 64;
|
CircleStep = 64;
|
||||||
HideStill = false;
|
HideStill = false;
|
||||||
|
@ -436,15 +569,28 @@ public:
|
||||||
LineWidthMoving = 1.5f;
|
LineWidthMoving = 1.5f;
|
||||||
color = Color4b::LightBlue;
|
color = Color4b::LightBlue;
|
||||||
}
|
}
|
||||||
|
/// The circles resolution.
|
||||||
int CircleStep;
|
int CircleStep;
|
||||||
bool HideStill, DrawTrack;
|
/// currently not in use.
|
||||||
|
bool HideStill;
|
||||||
|
/// currently not in use.
|
||||||
|
bool DrawTrack;
|
||||||
|
/// circle color
|
||||||
Color4b color;
|
Color4b color;
|
||||||
|
/// circle line width when inactive.
|
||||||
float LineWidthStill;
|
float LineWidthStill;
|
||||||
|
/// circle line width when active.
|
||||||
float LineWidthMoving;
|
float LineWidthMoving;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// the drawing hint used by the manipulators
|
||||||
DrawingHint DH;
|
DrawingHint DH;
|
||||||
|
|
||||||
|
// nota: non ho scritto io questa funzione,
|
||||||
|
// quindi la documentazione doxy potrebbe non essere accurata al 100%.
|
||||||
|
/*!
|
||||||
|
@brief Draw 2 squares, used by DrawCircle().
|
||||||
|
*/
|
||||||
void DrawPlaneHandle ()
|
void DrawPlaneHandle ()
|
||||||
{
|
{
|
||||||
float r = 1.0;
|
float r = 1.0;
|
||||||
|
@ -466,6 +612,11 @@ void DrawPlaneHandle ()
|
||||||
glEnd ();
|
glEnd ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nota: non ho scritto io questa funzione,
|
||||||
|
// quindi la documentazione doxy potrebbe non essere accurata al 100%.
|
||||||
|
/*!
|
||||||
|
@brief Draw a circle with 2 squares, used by DrawSphereIcon().
|
||||||
|
*/
|
||||||
void DrawCircle ()
|
void DrawCircle ()
|
||||||
{
|
{
|
||||||
int nside = DH.CircleStep;
|
int nside = DH.CircleStep;
|
||||||
|
@ -479,6 +630,13 @@ void DrawCircle ()
|
||||||
DrawPlaneHandle ();
|
DrawPlaneHandle ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nota: non ho scritto io questa funzione.
|
||||||
|
/*!
|
||||||
|
@brief Draw a spherical manipulator icon.
|
||||||
|
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param active boolean to be set to true if the icon is active.
|
||||||
|
*/
|
||||||
void DrawSphereIcon (Trackball * tb,bool active)
|
void DrawSphereIcon (Trackball * tb,bool active)
|
||||||
{
|
{
|
||||||
glPushMatrix ();
|
glPushMatrix ();
|
||||||
|
@ -524,7 +682,13 @@ void DrawSphereIcon (Trackball * tb,bool active)
|
||||||
// Disclaimer: the following code is of VERY POOR quality
|
// Disclaimer: the following code is of VERY POOR quality
|
||||||
// feel free to delete and rewrite everything
|
// feel free to delete and rewrite everything
|
||||||
|
|
||||||
void prepara_attrib()
|
/*!
|
||||||
|
@brief Support function for the \e DrawUgly series of functions
|
||||||
|
|
||||||
|
Prepare the OpenGL attributes.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
*/
|
||||||
|
void prepare_attrib()
|
||||||
{
|
{
|
||||||
float amb[4] = { .3f, .3f, .3f, 1.0f };
|
float amb[4] = { .3f, .3f, .3f, 1.0f };
|
||||||
float col[4] = { .5f, .5f, .8f, 1.0f };
|
float col[4] = { .5f, .5f, .8f, 1.0f };
|
||||||
|
@ -537,20 +701,28 @@ void prepara_attrib()
|
||||||
glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, col);
|
glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawUglyLetter(Trackball * tb,vector<Point3f> ugly_letter)
|
/*!
|
||||||
|
@brief Support function for the \e DrawUgly series of functions.
|
||||||
|
|
||||||
|
Draw a coordinate vector, usually a letter, near the manipulator icon in a user readable oriantation.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param ugly_letter the coordinate vector.
|
||||||
|
*/
|
||||||
|
void DrawUglyLetter(Trackball * tb,std::vector<Point3f> ugly_letter)
|
||||||
{
|
{
|
||||||
Point3f center=tb->camera.Project(tb->center);
|
Point3f center=tb->camera.Project(tb->center);
|
||||||
float offset=0;
|
float offset=0;
|
||||||
offset=max(offset,Distance(center,tb->camera.Project(tb->center+(Point3f(1,0,0) * tb->radius))));
|
offset=std::max(offset,Distance(center,tb->camera.Project(tb->center+(Point3f(1,0,0) * tb->radius))));
|
||||||
offset=max(offset,Distance(center,tb->camera.Project(tb->center+(Point3f(0,1,0) * tb->radius))));
|
offset=std::max(offset,Distance(center,tb->camera.Project(tb->center+(Point3f(0,1,0) * tb->radius))));
|
||||||
offset=max(offset,Distance(center,tb->camera.Project(tb->center+(Point3f(0,0,1) * tb->radius))));
|
offset=std::max(offset,Distance(center,tb->camera.Project(tb->center+(Point3f(0,0,1) * tb->radius))));
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glPushAttrib (GL_ALL_ATTRIB_BITS);
|
glPushAttrib (GL_ALL_ATTRIB_BITS);
|
||||||
// go to world coords
|
// go to world coords
|
||||||
glTranslate (tb->center);
|
glTranslate (tb->center);
|
||||||
glMultMatrix (tb->track.InverseMatrix ());
|
glMultMatrix (tb->track.InverseMatrix ());
|
||||||
glTranslate (-tb->center);
|
glTranslate (-tb->center);
|
||||||
prepara_attrib();
|
prepare_attrib();
|
||||||
glColor3f(1,1,1);
|
glColor3f(1,1,1);
|
||||||
glLineWidth(4.0);
|
glLineWidth(4.0);
|
||||||
|
|
||||||
|
@ -565,9 +737,16 @@ void DrawUglyLetter(Trackball * tb,vector<Point3f> ugly_letter)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief PanMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw a PanMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
*/
|
||||||
void DrawUglyPanMode(Trackball * tb)
|
void DrawUglyPanMode(Trackball * tb)
|
||||||
{
|
{
|
||||||
vector<Point3f> ugly_p;
|
std::vector<Point3f> ugly_p;
|
||||||
ugly_p.push_back(Point3f(-1,-1,0));
|
ugly_p.push_back(Point3f(-1,-1,0));
|
||||||
ugly_p.push_back(Point3f(-1,1,0));
|
ugly_p.push_back(Point3f(-1,1,0));
|
||||||
ugly_p.push_back(Point3f(1,1,0));
|
ugly_p.push_back(Point3f(1,1,0));
|
||||||
|
@ -577,9 +756,16 @@ void DrawUglyPanMode(Trackball * tb)
|
||||||
DrawUglyLetter(tb,ugly_p);
|
DrawUglyLetter(tb,ugly_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief ZMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw a ZMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
*/
|
||||||
void DrawUglyZMode(Trackball * tb)
|
void DrawUglyZMode(Trackball * tb)
|
||||||
{
|
{
|
||||||
vector<Point3f> ugly_z;
|
std::vector<Point3f> ugly_z;
|
||||||
ugly_z.push_back(Point3f(-1,1,0));
|
ugly_z.push_back(Point3f(-1,1,0));
|
||||||
ugly_z.push_back(Point3f(1,1,0));
|
ugly_z.push_back(Point3f(1,1,0));
|
||||||
ugly_z.push_back(Point3f(-1,-1,0));
|
ugly_z.push_back(Point3f(-1,-1,0));
|
||||||
|
@ -587,9 +773,16 @@ void DrawUglyZMode(Trackball * tb)
|
||||||
DrawUglyLetter(tb,ugly_z);
|
DrawUglyLetter(tb,ugly_z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief ScaleMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw a ScaleMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
*/
|
||||||
void DrawUglyScaleMode(Trackball * tb)
|
void DrawUglyScaleMode(Trackball * tb)
|
||||||
{
|
{
|
||||||
vector<Point3f> ugly_s;
|
std::vector<Point3f> ugly_s;
|
||||||
ugly_s.push_back(Point3f(1,1,0));
|
ugly_s.push_back(Point3f(1,1,0));
|
||||||
ugly_s.push_back(Point3f(-1,1,0));
|
ugly_s.push_back(Point3f(-1,1,0));
|
||||||
ugly_s.push_back(Point3f(-1,0,0));
|
ugly_s.push_back(Point3f(-1,0,0));
|
||||||
|
@ -599,6 +792,14 @@ void DrawUglyScaleMode(Trackball * tb)
|
||||||
DrawUglyLetter(tb,ugly_s);
|
DrawUglyLetter(tb,ugly_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief AxisMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw an AxisMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param axis AxisMode's axis.
|
||||||
|
*/
|
||||||
void DrawUglyAxisMode(Trackball * tb,Line3f axis)
|
void DrawUglyAxisMode(Trackball * tb,Line3f axis)
|
||||||
{
|
{
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
@ -607,7 +808,7 @@ void DrawUglyAxisMode(Trackball * tb,Line3f axis)
|
||||||
glTranslate (tb->center);
|
glTranslate (tb->center);
|
||||||
glMultMatrix (tb->track.InverseMatrix ());
|
glMultMatrix (tb->track.InverseMatrix ());
|
||||||
glTranslate (-tb->center);
|
glTranslate (-tb->center);
|
||||||
prepara_attrib();
|
prepare_attrib();
|
||||||
glColor3f(0.9f, 0.9f, 0.2f);
|
glColor3f(0.9f, 0.9f, 0.2f);
|
||||||
glLineWidth(2.0);
|
glLineWidth(2.0);
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
|
@ -623,6 +824,14 @@ void DrawUglyAxisMode(Trackball * tb,Line3f axis)
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief PlaneMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw a PlaneMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param plane PlaneMode's plane.
|
||||||
|
*/
|
||||||
void DrawUglyPlaneMode(Trackball * tb,Plane3f plane)
|
void DrawUglyPlaneMode(Trackball * tb,Plane3f plane)
|
||||||
{
|
{
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
@ -631,7 +840,7 @@ void DrawUglyPlaneMode(Trackball * tb,Plane3f plane)
|
||||||
glTranslate (tb->center);
|
glTranslate (tb->center);
|
||||||
glMultMatrix (tb->track.InverseMatrix ());
|
glMultMatrix (tb->track.InverseMatrix ());
|
||||||
glTranslate (-tb->center);
|
glTranslate (-tb->center);
|
||||||
prepara_attrib();
|
prepare_attrib();
|
||||||
Point3f p0,d1,d2,norm;
|
Point3f p0,d1,d2,norm;
|
||||||
norm=plane.Direction();
|
norm=plane.Direction();
|
||||||
p0=plane.Projection(Point3f(0,0,0));
|
p0=plane.Projection(Point3f(0,0,0));
|
||||||
|
@ -671,6 +880,14 @@ void DrawUglyPlaneMode(Trackball * tb,Plane3f plane)
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief CylinderMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw a CylinderMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param axis CylinderMode's axis.
|
||||||
|
*/
|
||||||
void DrawUglyCylinderMode(Trackball * tb,Line3f axis)
|
void DrawUglyCylinderMode(Trackball * tb,Line3f axis)
|
||||||
{
|
{
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
@ -679,7 +896,7 @@ void DrawUglyCylinderMode(Trackball * tb,Line3f axis)
|
||||||
glTranslate (tb->center);
|
glTranslate (tb->center);
|
||||||
glMultMatrix (tb->track.InverseMatrix ());
|
glMultMatrix (tb->track.InverseMatrix ());
|
||||||
glTranslate (-tb->center);
|
glTranslate (-tb->center);
|
||||||
prepara_attrib();
|
prepare_attrib();
|
||||||
Plane3f plane;
|
Plane3f plane;
|
||||||
plane.Init(axis.Origin(),axis.Direction());
|
plane.Init(axis.Origin(),axis.Direction());
|
||||||
Point3f p0,d1,d2,norm;
|
Point3f p0,d1,d2,norm;
|
||||||
|
@ -723,7 +940,20 @@ void DrawUglyCylinderMode(Trackball * tb,Line3f axis)
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawUglyPathMode(Trackball * tb,const vector < Point3f > &points,
|
/*!
|
||||||
|
@brief PathMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw a PathMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param points PathMode's points.
|
||||||
|
@param current_point PathMode's current point.
|
||||||
|
@param prev_point PathMode's prev point.
|
||||||
|
@param next_point PathMode's next point.
|
||||||
|
@param old_hitpoint PathMode's old hitpoint.
|
||||||
|
@param wrap PathMode's wrap.
|
||||||
|
*/
|
||||||
|
void DrawUglyPathMode(Trackball * tb,const std::vector < Point3f > &points,
|
||||||
Point3f current_point,Point3f prev_point,
|
Point3f current_point,Point3f prev_point,
|
||||||
Point3f next_point,Point3f old_hitpoint,bool wrap)
|
Point3f next_point,Point3f old_hitpoint,bool wrap)
|
||||||
{
|
{
|
||||||
|
@ -733,14 +963,14 @@ void DrawUglyPathMode(Trackball * tb,const vector < Point3f > &points,
|
||||||
glTranslate (tb->center);
|
glTranslate (tb->center);
|
||||||
glMultMatrix (tb->track.InverseMatrix ());
|
glMultMatrix (tb->track.InverseMatrix ());
|
||||||
glTranslate (-tb->center);
|
glTranslate (-tb->center);
|
||||||
prepara_attrib();
|
prepare_attrib();
|
||||||
glColor3f(0.9f, 0.9f, 0.2f);
|
glColor3f(0.9f, 0.9f, 0.2f);
|
||||||
glLineWidth(2.0);
|
glLineWidth(2.0);
|
||||||
if(wrap)
|
if(wrap)
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
else
|
else
|
||||||
glBegin(GL_LINE_STRIP);
|
glBegin(GL_LINE_STRIP);
|
||||||
for (vector < Point3f >::const_iterator i = points.begin (); i != points.end (); ++i){
|
for (std::vector < Point3f >::const_iterator i = points.begin (); i != points.end (); ++i){
|
||||||
glVertex(*i);
|
glVertex(*i);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
@ -764,9 +994,22 @@ void DrawUglyPathMode(Trackball * tb,const vector < Point3f > &points,
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawUglyAreaMode(Trackball * tb,const vector < Point3f > &points,
|
/*!
|
||||||
|
@brief AreaMode drawing function, member of the \e DrawUgly series.
|
||||||
|
|
||||||
|
Draw an AreaMode manipulator in an ugly way.
|
||||||
|
\warning this method is part of the \e DrawUgly series of functions, which is a \b TEMPORARY solution, used while waiting for the \e DrawBeautiful series...
|
||||||
|
@param tb the manipulator.
|
||||||
|
@param points AreaMode's points.
|
||||||
|
@param status AreaMode's status.
|
||||||
|
@param old_status AreaMode's old status.
|
||||||
|
@param plane AreaMode's plane.
|
||||||
|
@param path AreaMode's path.
|
||||||
|
@param rubberband_handle AreaMode's rubberband handle.
|
||||||
|
*/
|
||||||
|
void DrawUglyAreaMode(Trackball * tb,const std::vector < Point3f > &points,
|
||||||
Point3f status,Point3f old_status,Plane3f plane,
|
Point3f status,Point3f old_status,Plane3f plane,
|
||||||
const vector < Point3f > &path,Point3f rubberband_handle)
|
const std::vector < Point3f > &path,Point3f rubberband_handle)
|
||||||
{
|
{
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glPushAttrib (GL_ALL_ATTRIB_BITS);
|
glPushAttrib (GL_ALL_ATTRIB_BITS);
|
||||||
|
@ -774,18 +1017,18 @@ void DrawUglyAreaMode(Trackball * tb,const vector < Point3f > &points,
|
||||||
glTranslate (tb->center);
|
glTranslate (tb->center);
|
||||||
glMultMatrix (tb->track.InverseMatrix ());
|
glMultMatrix (tb->track.InverseMatrix ());
|
||||||
glTranslate (-tb->center);
|
glTranslate (-tb->center);
|
||||||
prepara_attrib();
|
prepare_attrib();
|
||||||
glColor3f(0.9f, 0.9f, 0.2f);
|
glColor3f(0.9f, 0.9f, 0.2f);
|
||||||
glLineWidth(2.0);
|
glLineWidth(2.0);
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
for (vector < Point3f >::const_iterator i = points.begin (); i != points.end (); ++i){
|
for (std::vector < Point3f >::const_iterator i = points.begin (); i != points.end (); ++i){
|
||||||
glVertex(*i);
|
glVertex(*i);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
glColor3f(0.0f, 0.9f, 0.2f);
|
glColor3f(0.0f, 0.9f, 0.2f);
|
||||||
glLineWidth(1.2f);
|
glLineWidth(1.2f);
|
||||||
glBegin(GL_LINE_STRIP);
|
glBegin(GL_LINE_STRIP);
|
||||||
for (vector < Point3f >::const_iterator i = path.begin (); i != path.end (); ++i){
|
for (std::vector < Point3f >::const_iterator i = path.begin (); i != path.end (); ++i){
|
||||||
glVertex(*i);
|
glVertex(*i);
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
Loading…
Reference in New Issue