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
|
#include "ManipulationPivot.h"
namespace selection
{
ManipulationPivot::ManipulationPivot() :
_needsRecalculation(true),
_operationActive(false),
_userLocked(false)
{}
// Returns the pivot-to-world transform
const Matrix4& ManipulationPivot::getMatrix4()
{
if (_needsRecalculation && !_operationActive && !_userLocked)
{
updateFromSelection();
}
return _pivot2World;
}
// Returns the position of the pivot point relative to origin
Vector3 ManipulationPivot::getVector3()
{
if (_needsRecalculation && !_operationActive && !_userLocked)
{
updateFromSelection();
}
return _pivot2World.translation();
}
void ManipulationPivot::setFromMatrix(const Matrix4& newPivot2World)
{
_pivot2World = newPivot2World;
}
void ManipulationPivot::setNeedsRecalculation(bool needsRecalculation)
{
_needsRecalculation = needsRecalculation;
}
void ManipulationPivot::setUserLocked(bool locked)
{
_userLocked = locked;
}
// Call this before an operation is started, such that later
// transformations can be applied on top of the correct starting point
void ManipulationPivot::beginOperation()
{
_pivot2WorldStart = _pivot2World;
_operationActive = true;
}
// Reverts the matrix to the state it had at the beginning of the operation
void ManipulationPivot::revertToStart()
{
_pivot2World = _pivot2WorldStart;
}
void ManipulationPivot::endOperation()
{
_pivot2WorldStart = _pivot2World;
_operationActive = false;
}
void ManipulationPivot::cancelOperation()
{
revertToStart();
_operationActive = false;
}
void ManipulationPivot::applyTranslation(const Vector3& translation)
{
// We apply translations on top of the starting point
revertToStart();
_pivot2World.translateBy(translation);
}
}
|