Merge pull request #5542 from ZappoMan/RenderableModelEntityItemOptimization

Renderable model entity item optimizations
This commit is contained in:
Seth Alves 2015-08-10 15:10:12 -07:00
commit b26d6d2b9c
4 changed files with 17 additions and 10 deletions

View file

@ -230,11 +230,13 @@ void JointState::setRotationInConstrainedFrame(glm::quat targetRotation, float p
} }
void JointState::setRotationInConstrainedFrameInternal(const glm::quat& targetRotation) { void JointState::setRotationInConstrainedFrameInternal(const glm::quat& targetRotation) {
glm::quat parentRotation = computeParentRotation(); if (_rotationInConstrainedFrame != targetRotation) {
_rotationInConstrainedFrame = targetRotation; glm::quat parentRotation = computeParentRotation();
_transformChanged = true; _rotationInConstrainedFrame = targetRotation;
// R' = Rp * Rpre * r' * Rpost _transformChanged = true;
_rotation = parentRotation * _preRotation * _rotationInConstrainedFrame * _postRotation; // R' = Rp * Rpre * r' * Rpost
_rotation = parentRotation * _preRotation * _rotationInConstrainedFrame * _postRotation;
}
} }
void JointState::setVisibleRotationInConstrainedFrame(const glm::quat& targetRotation) { void JointState::setVisibleRotationInConstrainedFrame(const glm::quat& targetRotation) {

View file

@ -275,9 +275,12 @@ void RenderableModelEntityItem::render(RenderArgs* args) {
} }
if (jointsMapped()) { if (jointsMapped()) {
auto frameData = getAnimationFrame(); bool newFrame;
for (int i = 0; i < frameData.size(); i++) { auto frameData = getAnimationFrame(newFrame);
_model->setJointState(i, true, frameData[i]); if (newFrame) {
for (int i = 0; i < frameData.size(); i++) {
_model->setJointState(i, true, frameData[i]);
}
} }
} }
} }

View file

@ -218,7 +218,8 @@ void ModelEntityItem::mapJoints(const QStringList& modelJointNames) {
} }
} }
const QVector<glm::quat>& ModelEntityItem::getAnimationFrame() { const QVector<glm::quat>& ModelEntityItem::getAnimationFrame(bool& newFrame) {
newFrame = false;
if (!hasAnimation() || !_jointMappingCompleted) { if (!hasAnimation() || !_jointMappingCompleted) {
return _lastKnownFrameData; return _lastKnownFrameData;
@ -238,6 +239,7 @@ const QVector<glm::quat>& ModelEntityItem::getAnimationFrame() {
if (animationFrameIndex != _lastKnownFrameIndex) { if (animationFrameIndex != _lastKnownFrameIndex) {
_lastKnownFrameIndex = animationFrameIndex; _lastKnownFrameIndex = animationFrameIndex;
newFrame = true;
const QVector<glm::quat>& rotations = frames[animationFrameIndex].rotations; const QVector<glm::quat>& rotations = frames[animationFrameIndex].rotations;

View file

@ -106,7 +106,7 @@ public:
float getAnimationLastFrame() const { return _animationLoop.getLastFrame(); } float getAnimationLastFrame() const { return _animationLoop.getLastFrame(); }
void mapJoints(const QStringList& modelJointNames); void mapJoints(const QStringList& modelJointNames);
const QVector<glm::quat>& getAnimationFrame(); const QVector<glm::quat>& getAnimationFrame(bool& newFrame);
bool jointsMapped() const { return _jointMappingCompleted; } bool jointsMapped() const { return _jointMappingCompleted; }
bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); } bool getAnimationIsPlaying() const { return _animationLoop.isRunning(); }