1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#include "ClipPoint.h"
#include "igl.h"
#include "math/Vector2.h"
#include "string/convert.h"
#include "iradiant.h"
ClipPoint::ClipPoint() {
reset();
};
void ClipPoint::reset() {
_coords[0] = _coords[1] = _coords[2] = 0.0;
m_bSet = false;
}
bool ClipPoint::isSet() const {
return m_bSet;
}
void ClipPoint::Set(bool b) {
m_bSet = b;
}
ClipPoint::operator Vector3&() {
return _coords;
}
/* Drawing clip points */
void ClipPoint::Draw(int num, float scale) {
Draw(string::to_string(num), scale);
}
void ClipPoint::Draw(const std::string& label, float scale)
{
// draw point
glBegin(GL_POINTS);
glVertex3dv(_coords);
glEnd();
double offset = 2.0 / scale;
// draw label
glRasterPos3d(_coords[0] + offset, _coords[1] + offset, _coords[2] + offset);
GlobalOpenGL().drawString(label);
}
namespace
{
template<typename T>
T fDiff(T f1, T f2)
{
if (f1 > f2)
return f1 - f2;
else
return f2 - f1;
}
}
double ClipPoint::intersect(const Vector3& point, OrthoOrientation viewtype, float scale)
{
int nDim1 = (viewtype == OrthoOrientation::YZ) ? 1 : 0;
int nDim2 = (viewtype == OrthoOrientation::XY) ? 1 : 2;
double screenDistanceSquared = Vector2(
fDiff(_coords[nDim1], point[nDim1]) * scale,
fDiff(_coords[nDim2], point[nDim2]) * scale).getLengthSquared();
if (screenDistanceSquared < 8*8)
{
return screenDistanceSquared;
}
return FLT_MAX;
}
void ClipPoint::testSelect(const Vector3& point, OrthoOrientation viewtype, float scale, double& bestDistance, ClipPoint*& bestClip) {
if (isSet()) {
double distance = intersect(point, viewtype, scale);
if (distance < bestDistance) {
bestDistance = distance;
bestClip = this;
}
}
}
|