[Scummvm-git-logs] scummvm master -> 02254235a0eab1a7c9dffe4ee16b44e51b655f10
mgerhardy
martin.gerhardy at gmail.com
Sat Feb 20 16:14:44 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
02254235a0 TWINE: optimized verifyAnimAtKeyframe
Commit: 02254235a0eab1a7c9dffe4ee16b44e51b655f10
https://github.com/scummvm/scummvm/commit/02254235a0eab1a7c9dffe4ee16b44e51b655f10
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-20T17:14:30+01:00
Commit Message:
TWINE: optimized verifyAnimAtKeyframe
... by not parsing the AnimData each time
Changed paths:
engines/twine/parser/anim.h
engines/twine/resources/resources.cpp
engines/twine/resources/resources.h
engines/twine/scene/animations.cpp
engines/twine/scene/animations.h
diff --git a/engines/twine/parser/anim.h b/engines/twine/parser/anim.h
index ac64081828..1c859fbf7a 100644
--- a/engines/twine/parser/anim.h
+++ b/engines/twine/parser/anim.h
@@ -61,10 +61,15 @@ public:
const KeyFrame* getKeyframe(uint index) const;
const Common::Array<KeyFrame>& getKeyframes() const;
+ uint getNumKeyframes() const;
uint16 getLoopFrame() const;
uint16 getNumBoneframes() const;
};
+inline uint AnimData::getNumKeyframes() const {
+ return getKeyframes().size();
+}
+
} // End of namespace TwinE
#endif
diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index d0a9cf7254..da3e742648 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -93,6 +93,7 @@ void Resources::preloadAnimations() {
debug("preload %i animations", numEntries);
for (int32 i = 0; i < numEntries; i++) {
animSizeTable[i] = HQR::getAllocEntry(&animTable[i], Resources::HQR_ANIM_FILE, i);
+ animData[i].loadFromBuffer(animTable[i], animSizeTable[i]);
}
}
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 93fe88c597..96992cf85d 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -170,6 +170,7 @@ public:
uint8 *animTable[NUM_ANIMS]{nullptr};
/** Table with all loaded animations sizes */
uint32 animSizeTable[NUM_ANIMS]{0};
+ AnimData animData[NUM_ANIMS];
/** Table with all loaded samples */
uint8 *samplesTable[NUM_SAMPLES]{nullptr};
diff --git a/engines/twine/scene/animations.cpp b/engines/twine/scene/animations.cpp
index f845e5a66a..8618b8e093 100644
--- a/engines/twine/scene/animations.cpp
+++ b/engines/twine/scene/animations.cpp
@@ -283,9 +283,7 @@ void Animations::stockAnimation(const uint8 *bodyPtr, AnimTimerDataStruct *animT
}
}
-bool Animations::verifyAnimAtKeyframe(int32 keyframeIdx, const uint8 *animPtr, AnimTimerDataStruct *animTimerDataPtr) {
- AnimData animData;
- animData.loadFromBuffer(animPtr, 100000);
+bool Animations::verifyAnimAtKeyframe(int32 keyframeIdx, const AnimData &animData, const uint8 *animPtr, AnimTimerDataStruct *animTimerDataPtr) {
const KeyFrame *keyFrame = animData.getKeyframe(keyframeIdx);
const int32 keyFrameLength = keyFrame->length;
@@ -306,7 +304,6 @@ bool Animations::verifyAnimAtKeyframe(int32 keyframeIdx, const uint8 *animPtr, A
if (deltaTime >= keyFrameLength) {
animTimerDataPtr->ptr = getKeyFrameData(keyframeIdx, animPtr);
- ;
animTimerDataPtr->time = _engine->lbaTime;
return true;
}
@@ -622,11 +619,12 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
}
} else { // 3D actor
if (actor->previousAnimIdx != -1) {
+ const AnimData &animData = _engine->_resources->animData[actor->previousAnimIdx];
const uint8 *animPtr = _engine->_resources->animTable[actor->previousAnimIdx];
bool keyFramePassed = false;
if (Model::isAnimated(_engine->_actor->bodyTable[actor->entity])) {
- keyFramePassed = verifyAnimAtKeyframe(actor->animPosition, animPtr, &actor->animTimerData);
+ keyFramePassed = verifyAnimAtKeyframe(actor->animPosition, animData, animPtr, &actor->animTimerData);
}
if (processRotationByAnim) {
@@ -661,11 +659,11 @@ void Animations::processActorAnimations(int32 actorIdx) { // DoAnim
processAnimActions(actorIdx);
int16 numKeyframe = actor->animPosition;
- if (numKeyframe == getNumKeyframes(animPtr)) {
+ if (numKeyframe == (int16)animData.getNumKeyframes()) {
actor->dynamicFlags.bIsHitting = 0;
if (actor->animType == kAnimationTypeLoop) {
- actor->animPosition = getStartKeyframe(animPtr);
+ actor->animPosition = animData.getLoopFrame();
} else {
actor->anim = (AnimationTypes)actor->animExtra;
actor->previousAnimIdx = getBodyAnimIndex(actor->anim, actorIdx);
diff --git a/engines/twine/scene/animations.h b/engines/twine/scene/animations.h
index dab05e546a..c9e451948c 100644
--- a/engines/twine/scene/animations.h
+++ b/engines/twine/scene/animations.h
@@ -41,10 +41,11 @@ private:
/**
* Verify animation at keyframe
* @param keyframeIdx Animation key frame index
+ * @param animData Animation data
* @param animPtr Animation pointer
* @param animTimerDataPtr Animation time data
*/
- bool verifyAnimAtKeyframe(int32 keyframeIdx, const uint8 *animPtr, AnimTimerDataStruct *animTimerDataPtr);
+ bool verifyAnimAtKeyframe(int32 keyframeIdx, const AnimData &animData, const uint8 *animPtr, AnimTimerDataStruct *animTimerDataPtr);
uint8 *const animBuffer;
uint8 *animBufferPos = nullptr;
More information about the Scummvm-git-logs
mailing list