151 lines
4.8 KiB
Text
151 lines
4.8 KiB
Text
/**
|
|
* PANDA 3D SOFTWARE
|
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
*
|
|
* All use of this software is subject to the terms of the revised BSD
|
|
* license. You should have received a copy of this license along
|
|
* with this source code in a file named "LICENSE."
|
|
*
|
|
* @file compose_matrix_src.I
|
|
* @author drose
|
|
* @date 1999-02-21
|
|
*/
|
|
|
|
/**
|
|
* Computes the 4x4 matrix according to scale, shear, rotation, and
|
|
* translation.
|
|
*/
|
|
INLINE_LINMATH void
|
|
compose_matrix(FLOATNAME(LMatrix4) &mat,
|
|
const FLOATNAME(LVecBase3) &scale,
|
|
const FLOATNAME(LVecBase3) &shear,
|
|
const FLOATNAME(LVecBase3) &hpr,
|
|
const FLOATNAME(LVecBase3) &translate,
|
|
CoordinateSystem cs) {
|
|
FLOATNAME(LMatrix3) upper3;
|
|
compose_matrix(upper3, scale, shear, hpr, cs);
|
|
mat = FLOATNAME(LMatrix4)(upper3, translate);
|
|
}
|
|
|
|
/**
|
|
* Computes the 4x4 matrix according to scale, shear, rotation, and
|
|
* translation.
|
|
*/
|
|
INLINE_LINMATH void
|
|
compose_matrix(FLOATNAME(LMatrix4) &mat,
|
|
const FLOATTYPE components[num_matrix_components],
|
|
CoordinateSystem cs) {
|
|
FLOATNAME(LVector3) scale(components[0],
|
|
components[1],
|
|
components[2]);
|
|
FLOATNAME(LVector3) shear(components[3],
|
|
components[4],
|
|
components[5]);
|
|
FLOATNAME(LVector3) hpr(components[6],
|
|
components[7],
|
|
components[8]);
|
|
FLOATNAME(LVector3) translate(components[9],
|
|
components[10],
|
|
components[11]);
|
|
compose_matrix(mat, scale, shear, hpr, translate, cs);
|
|
}
|
|
|
|
/**
|
|
* Extracts out the components of an affine matrix. Returns true if the
|
|
* scale, shear, hpr, and translate completely describe the matrix, or false
|
|
* if the matrix is not affine.
|
|
*/
|
|
INLINE_LINMATH bool
|
|
decompose_matrix(const FLOATNAME(LMatrix4) &mat,
|
|
FLOATNAME(LVecBase3) &scale,
|
|
FLOATNAME(LVecBase3) &shear,
|
|
FLOATNAME(LVecBase3) &hpr,
|
|
FLOATNAME(LVecBase3) &translate,
|
|
CoordinateSystem cs) {
|
|
// Get the translation first.
|
|
mat.get_row3(translate, 3);
|
|
if (!decompose_matrix(mat.get_upper_3(), scale, shear, hpr, cs)) {
|
|
return false;
|
|
}
|
|
#ifndef NDEBUG
|
|
return mat.get_col(3).almost_equal(FLOATNAME(LVecBase4)(0.0, 0.0, 0.0, 1.0));
|
|
#else
|
|
return true;
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* Extracts out the components of an affine matrix. Returns true if the
|
|
* scale, shear, hpr, and translate completely describe the matrix, or false
|
|
* if the matrix is not affine.
|
|
*/
|
|
INLINE_LINMATH bool
|
|
decompose_matrix(const FLOATNAME(LMatrix4) &mat,
|
|
FLOATTYPE components[num_matrix_components],
|
|
CoordinateSystem cs) {
|
|
FLOATNAME(LVector3) scale, shear, hpr, translate;
|
|
bool result = decompose_matrix(mat, scale, shear, hpr, translate, cs);
|
|
components[0] = scale[0];
|
|
components[1] = scale[1];
|
|
components[2] = scale[2];
|
|
components[3] = shear[0];
|
|
components[4] = shear[1];
|
|
components[5] = shear[2];
|
|
components[6] = hpr[0];
|
|
components[7] = hpr[1];
|
|
components[8] = hpr[2];
|
|
components[9] = translate[0];
|
|
components[10] = translate[1];
|
|
components[11] = translate[2];
|
|
return result;
|
|
}
|
|
|
|
// The following functions are deprecated; they have been replaced with new
|
|
// versions, above, that accept a shear component as well.
|
|
|
|
|
|
// Deprecated function.
|
|
INLINE_LINMATH void
|
|
compose_matrix(FLOATNAME(LMatrix3) &mat,
|
|
const FLOATNAME(LVecBase3) &scale,
|
|
const FLOATNAME(LVecBase3) &hpr,
|
|
CoordinateSystem cs) {
|
|
compose_matrix(mat, scale, FLOATNAME(LVecBase3)(0, 0, 0), hpr, cs);
|
|
}
|
|
|
|
// Deprecated function.
|
|
INLINE_LINMATH void
|
|
compose_matrix(FLOATNAME(LMatrix4) &mat,
|
|
const FLOATNAME(LVecBase3) &scale,
|
|
const FLOATNAME(LVecBase3) &hpr,
|
|
const FLOATNAME(LVecBase3) &translate,
|
|
CoordinateSystem cs) {
|
|
FLOATNAME(LMatrix3) upper3;
|
|
compose_matrix(upper3, scale, hpr, cs);
|
|
mat = FLOATNAME(LMatrix4)(upper3, translate);
|
|
}
|
|
|
|
// Deprecated function.
|
|
INLINE_LINMATH bool
|
|
decompose_matrix(const FLOATNAME(LMatrix3) &mat,
|
|
FLOATNAME(LVecBase3) &scale,
|
|
FLOATNAME(LVecBase3) &hpr,
|
|
CoordinateSystem cs) {
|
|
FLOATNAME(LVecBase3) shear;
|
|
if (!decompose_matrix(mat, scale, shear, hpr, cs)) {
|
|
return false;
|
|
}
|
|
return shear.almost_equal(FLOATNAME(LVecBase3)::zero());
|
|
}
|
|
|
|
// Deprecated function.
|
|
INLINE_LINMATH bool
|
|
decompose_matrix(const FLOATNAME(LMatrix4) &mat,
|
|
FLOATNAME(LVecBase3) &scale,
|
|
FLOATNAME(LVecBase3) &hpr,
|
|
FLOATNAME(LVecBase3) &translate,
|
|
CoordinateSystem cs) {
|
|
// Get the translation first.
|
|
mat.get_row3(translate,3);
|
|
return decompose_matrix(mat.get_upper_3(), scale, hpr, cs);
|
|
}
|