[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