117 lines
4.4 KiB
Plaintext
117 lines
4.4 KiB
Plaintext
// Filename: compose_matrix_src.I
|
|
// Created by: drose (21Feb99)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://www.panda3d.org/license.txt .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d@yahoogroups.com .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: compose_matrix
|
|
// Description: Computes the 4x4 matrix according to scale, rotation,
|
|
// and translation.
|
|
////////////////////////////////////////////////////////////////////
|
|
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);
|
|
}
|
|
|
|
INLINE_LINMATH void
|
|
compose_matrix(FLOATNAME(LMatrix4) &mat,
|
|
const FLOATTYPE components[9],
|
|
CoordinateSystem cs) {
|
|
FLOATNAME(LVector3) scale(components[0],
|
|
components[1],
|
|
components[2]);
|
|
FLOATNAME(LVector3) hpr(components[3],
|
|
components[4],
|
|
components[5]);
|
|
FLOATNAME(LVector3) translate(components[6],
|
|
components[7],
|
|
components[8]);
|
|
compose_matrix(mat, scale, hpr, translate, cs);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: decompose_matrix
|
|
// Description: Extracts out the components of an affine matrix.
|
|
// Returns true if the scale, hpr, translate
|
|
// completely describe the matrix, or false if there is
|
|
// also a shear component or if the matrix is not
|
|
// affine.
|
|
////////////////////////////////////////////////////////////////////
|
|
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);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: decompose_matrix
|
|
// Description: Extracts out the components of an affine matrix.
|
|
// Returns true if the scale, hpr, translate
|
|
// completely describe the matrix, or false if there is
|
|
// also a shear component or if the matrix is not
|
|
// affine.
|
|
//
|
|
// This flavor of the function accepts an expected roll
|
|
// amount. This amount will be used as the roll
|
|
// component, rather than attempting to determine roll
|
|
// by examining the matrix; this helps alleviate roll
|
|
// instability due to roundoff errors or gimbal lock.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE_LINMATH bool
|
|
decompose_matrix(const FLOATNAME(LMatrix4) &mat,
|
|
FLOATNAME(LVecBase3) &scale,
|
|
FLOATNAME(LVecBase3) &hpr,
|
|
FLOATNAME(LVecBase3) &translate,
|
|
FLOATTYPE roll,
|
|
CoordinateSystem cs) {
|
|
// Get the translation first.
|
|
mat.get_row3(translate,3);
|
|
return decompose_matrix(mat.get_upper_3(), scale, hpr, roll, cs);
|
|
}
|
|
|
|
INLINE_LINMATH bool
|
|
decompose_matrix(const FLOATNAME(LMatrix4) &mat,
|
|
FLOATTYPE components[9],
|
|
CoordinateSystem cs) {
|
|
FLOATNAME(LVector3) scale, hpr, translate;
|
|
if (!decompose_matrix(mat, scale, hpr, translate, cs)) {
|
|
return false;
|
|
}
|
|
components[0] = scale[0];
|
|
components[1] = scale[1];
|
|
components[2] = scale[2];
|
|
components[3] = hpr[0];
|
|
components[4] = hpr[1];
|
|
components[5] = hpr[2];
|
|
components[6] = translate[0];
|
|
components[7] = translate[1];
|
|
components[8] = translate[2];
|
|
return true;
|
|
}
|