35 static_cast<int>(
std::floor(fontSize * zoomFactor));
36 if (zoomFactor >= 2.0f) scaledFontSize -=
static_cast<int>(zoomFactor);
37 if (scaledFontSize < 1) scaledFontSize = 1;
38 return scaledFontSize;
50 template <
typename iType,
typename oType>
63 template <
typename iType,
typename oType>
98 assert(left != right);
99 assert(bottom != top);
100 assert(znear != zfar);
104 double* matrix = outMatrix.
data();
106 double dX = right - left;
107 double dY = top - bottom;
108 double dZ = znear - zfar;
110 matrix[0] = 2 * znear / dX;
116 matrix[5] = 2 * znear / dY;
120 matrix[8] = (right + left) / dX;
121 matrix[9] = (top + bottom) / dY;
122 matrix[10] = (zfar + znear) / dZ;
127 matrix[14] = 2 * znear * zfar / dZ;
142 double* matrix = outMatrix.
data();
147 double xmax = ymax * aspectRatio;
149 double dZ = zfar - znear;
150 matrix[0] = znear / xmax;
156 matrix[5] = znear / ymax;
162 matrix[10] = -(zfar + znear) / dZ;
167 matrix[14] = -(2.0 * znear * zfar) / dZ;
181 double dx = (right - left);
182 double dy = (top - bottom);
183 double dz = (farVal - nearVal);
184 if (dx != 0 && dy != 0 && dz != 0) {
185 double* mat = matrix.
data();
202 mat[12] = -(right + left) / dx;
203 mat[13] = -(top + bottom) / dy;
204 mat[14] = -(farVal + nearVal) / dz;
216 if (w != 0 && h != 0 && d != 0) {
217 double* mat = matrix.
data();
244 template <
typename iType,
typename oType>
246 const oType* modelview,
247 const oType* projection,
250 bool* inFrustum =
nullptr) {
252 ToDisplayPoint<iType, oType>(input3D, output2D);
259 Pm.
x =
static_cast<oType
>(modelview[0] * input3D.
x +
260 modelview[4] * input3D.
y +
261 modelview[8] * input3D.
z + modelview[12]);
262 Pm.
y =
static_cast<oType
>(modelview[1] * input3D.
x +
263 modelview[5] * input3D.
y +
264 modelview[9] * input3D.
z + modelview[13]);
265 Pm.
z =
static_cast<oType
>(
266 modelview[2] * input3D.
x + modelview[6] * input3D.
y +
267 modelview[10] * input3D.
z + modelview[14]);
268 Pm.
w =
static_cast<oType
>(
269 modelview[3] * input3D.
x + modelview[7] * input3D.
y +
270 modelview[11] * input3D.
z + modelview[15]);
276 Pp.
x =
static_cast<oType
>(
277 projection[0] * Pm.
x + projection[4] * Pm.
y +
278 projection[8] * Pm.
z + projection[12] * Pm.
w);
279 Pp.
y =
static_cast<oType
>(
280 projection[1] * Pm.
x + projection[5] * Pm.
y +
281 projection[9] * Pm.
z + projection[13] * Pm.
w);
282 Pp.
z =
static_cast<oType
>(
283 projection[2] * Pm.
x + projection[6] * Pm.
y +
284 projection[10] * Pm.
z + projection[14] * Pm.
w);
285 Pp.
w =
static_cast<oType
>(
286 projection[3] * Pm.
x + projection[7] * Pm.
y +
287 projection[11] * Pm.
z + projection[15] * Pm.
w);
307 output2D.
x = (1.0 + Pp.
x) / 2 * viewport[2] + viewport[0];
308 output2D.
y = (1.0 + Pp.
y) / 2 * viewport[3] + viewport[1];
310 output2D.
z = (1.0 + Pp.
z) / 2;
315 inline static double MAT(
const double* m,
int r,
int c) {
318 inline static float MAT(
const float* m,
int r,
int c) {
322 inline static double&
MAT(
double* m,
int r,
int c) {
return m[c * 4 + r]; }
323 inline static float&
MAT(
float* m,
int r,
int c) {
return m[c * 4 + r]; }
325 template <
typename Type>
328 Type m0, m1, m2, m3, s;
329 Type *r0, *r1, *r2, *r3;
330 r0 = wtmp[0], r1 = wtmp[1], r2 = wtmp[2], r3 = wtmp[3];
332 r0[0] = MAT(m, 0, 0), r0[1] = MAT(m, 0, 1), r0[2] = MAT(m, 0, 2),
333 r0[3] = MAT(m, 0, 3), r0[4] = 1.0, r0[5] = r0[6] = r0[7] = 0.0,
334 r1[0] = MAT(m, 1, 0), r1[1] = MAT(m, 1, 1), r1[2] = MAT(m, 1, 2),
335 r1[3] = MAT(m, 1, 3), r1[5] = 1.0, r1[4] = r1[6] = r1[7] = 0.0,
336 r2[0] = MAT(m, 2, 0), r2[1] = MAT(m, 2, 1), r2[2] = MAT(m, 2, 2),
337 r2[3] = MAT(m, 2, 3), r2[6] = 1.0, r2[4] = r2[5] = r2[7] = 0.0,
338 r3[0] = MAT(m, 3, 0), r3[1] = MAT(m, 3, 1), r3[2] = MAT(m, 3, 2),
339 r3[3] = MAT(m, 3, 3), r3[7] = 1.0, r3[4] = r3[5] = r3[6] = 0.0;
345 if (0.0 == r0[0])
return false;
391 if (0.0 == r1[1])
return false;
423 if (0.0 == r2[2])
return false;
427 r3[3] -= m3 * r2[3], r3[4] -= m3 * r2[4], r3[5] -= m3 * r2[5],
428 r3[6] -= m3 * r2[6], r3[7] -= m3 * r2[7];
431 if (0.0 == r3[3])
return false;
440 r2[4] = s * (r2[4] - r3[4] * m2), r2[5] = s * (r2[5] - r3[5] * m2),
441 r2[6] = s * (r2[6] - r3[6] * m2), r2[7] = s * (r2[7] - r3[7] * m2);
443 r1[4] -= r3[4] * m1, r1[5] -= r3[5] * m1, r1[6] -= r3[6] * m1,
446 r0[4] -= r3[4] * m0, r0[5] -= r3[5] * m0, r0[6] -= r3[6] * m0,
450 r1[4] = s * (r1[4] - r2[4] * m1), r1[5] = s * (r1[5] - r2[5] * m1),
451 r1[6] = s * (r1[6] - r2[6] * m1), r1[7] = s * (r1[7] - r2[7] * m1);
453 r0[4] -= r2[4] * m0, r0[5] -= r2[5] * m0, r0[6] -= r2[6] * m0,
457 r0[4] = s * (r0[4] - r1[4] * m0), r0[5] = s * (r0[5] - r1[5] * m0),
458 r0[6] = s * (r0[6] - r1[6] * m0), r0[7] = s * (r0[7] - r1[7] * m0);
460 MAT(out, 0, 0) = r0[4];
461 MAT(out, 0, 1) = r0[5], MAT(out, 0, 2) = r0[6];
462 MAT(out, 0, 3) = r0[7], MAT(out, 1, 0) = r1[4];
463 MAT(out, 1, 1) = r1[5], MAT(out, 1, 2) = r1[6];
464 MAT(out, 1, 3) = r1[7], MAT(out, 2, 0) = r2[4];
465 MAT(out, 2, 1) = r2[5], MAT(out, 2, 2) = r2[6];
466 MAT(out, 2, 3) = r2[7], MAT(out, 3, 0) = r3[4];
467 MAT(out, 3, 1) = r3[5], MAT(out, 3, 2) = r3[6];
468 MAT(out, 3, 3) = r3[7];
473 template <
typename iType,
typename oType>
475 const oType* modelview,
476 const oType* projection,
480 ToWorldPoint<iType, oType>(input2D, output3D);
489 if (!InvertMatrix(A.
data(), m.
data())) {
497 in.x =
static_cast<oType
>(
498 (input2D.
x -
static_cast<iType
>(viewport[0])) / viewport[2] *
501 in.y =
static_cast<oType
>(
502 (input2D.
y -
static_cast<iType
>(viewport[1])) / viewport[3] *
505 in.z =
static_cast<oType
>(2 * input2D.
z - 1);
525 double sx = viewport[2] /
width;
526 double sy = viewport[3] /
height;
527 double tx = (viewport[2] + 2.0 * (viewport[0] - x)) /
width;
528 double ty = (viewport[3] + 2.0 * (viewport[1] - y)) /
height;
556 : perspective(false), fov_deg(0.0f), pixelSize(0.0f) {
557 memset(viewport, 0, 4 *
sizeof(
int));
563 bool* inFrustum =
nullptr)
const {
564 return ecvGenericDisplayTools::Project<double, double>(
565 input3D, modelViewMat.
data(), projectionMat.data(), viewport,
566 output2D, inFrustum);
571 bool* inFrustum =
nullptr)
const {
572 return ecvGenericDisplayTools::Project<PointCoordinateType, double>(
573 input3D, modelViewMat.
data(), projectionMat.data(), viewport,
574 output2D, inFrustum);
580 return ecvGenericDisplayTools::Unproject<double, double>(
581 input2D, modelViewMat.
data(), projectionMat.data(), viewport,
587 return ecvGenericDisplayTools::Unproject<PointCoordinateType, double>(
588 input2D, modelViewMat.
data(), projectionMat.data(), viewport,
4-Tuple structure (templated version)
3D Vector (templated version)
A 4x4 'transformation' matrix (column major order)
T * data()
Returns a pointer to internal data.
virtual void toIdentity()
Sets matrix to identity.
Double version of ccGLMatrixTpl.
__host__ __device__ int2 abs(int2 v)
ccGuiPythonInstance * GetInstance() noexcept
MiniVec< float, N > floor(const MiniVec< float, N > &a)
float DegreesToRadians(int degrees)
Convert degrees to radians.
void swap(cloudViewer::core::SmallVectorImpl< T > &LHS, cloudViewer::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
OpenGL camera parameters.
float fov_deg
F.O.V. (in degrees) - perspective mode only.
ccGLMatrixd projectionMat
Projection matrix (GL_PROJECTION)
ccGLMatrixd modelViewMat
Model view matrix (GL_MODELVIEW)
bool unproject(const CCVector3d &input2D, CCVector3d &output3D) const
Unprojects a 2D point (+ normalized 'z' coordinate) in 3D.
float pixelSize
Pixel size (i.e. zoom) - non perspective mode only.
bool perspective
Perspective mode.
bool project(const CCVector3d &input3D, CCVector3d &output2D, bool *inFrustum=nullptr) const
Projects a 3D point in 2D (+ normalized 'z' coordinate)
bool unproject(const CCVector3 &input2D, CCVector3d &output3D) const
Unprojects a 2D point (+ normalized 'z' coordinate) in 3D.
bool project(const CCVector3 &input3D, CCVector3d &output2D, bool *inFrustum=nullptr) const
Projects a 3D point in 2D (+ normalized 'z' coordinate)