TWINE: synced lerp methods with the original source

This commit is contained in:
Martin Gerhardy 2022-06-14 20:53:52 +02:00
parent 5c1ad5c786
commit 2a707b3dc9
9 changed files with 25 additions and 25 deletions

@ -54,7 +54,7 @@ void Sound::setSamplePosition(int32 channelIdx, int32 x, int32 y, int32 z) {
const int32 camY = _engine->_grid->_newCamera.y * SIZE_BRICK_Y;
const int32 camZ = _engine->_grid->_newCamera.z * SIZE_BRICK_XZ;
int32 distance = getDistance3D(camX, camY, camZ, x, y, z);
distance = _engine->_collision->getAverageValue(0, distance, 10000, 255);
distance = _engine->_collision->clampedLerp(0, distance, 10000, 255);
const byte targetVolume = CLIP<byte>(255 - distance, 0, 255);
_engine->_system->getMixer()->setChannelVolume(samplesPlaying[channelIdx], targetVolume);
}

@ -595,8 +595,8 @@ void Holomap::processHolomap() {
if (rotate) {
const int32 dt = _engine->_lbaTime - time;
xRot = _engine->_collision->getAverageValue(ClampAngle(xRot), _locations[currentLocation].angleX, 75, dt);
yRot = _engine->_collision->getAverageValue(ClampAngle(yRot), _locations[currentLocation].angleY, 75, dt);
xRot = _engine->_collision->clampedLerp(ClampAngle(xRot), _locations[currentLocation].angleX, 75, dt);
yRot = _engine->_collision->clampedLerp(ClampAngle(yRot), _locations[currentLocation].angleY, 75, dt);
redraw = true;
}

@ -571,7 +571,7 @@ void Redraw::renderOverlays() {
break;
}
case OverlayType::koNumberRange: {
const int32 range = _engine->_collision->getAverageValue(overlay->info1, overlay->info0, 100, overlay->lifeTime - _engine->_lbaTime - 50);
const int32 range = _engine->_collision->clampedLerp(overlay->info1, overlay->info0, 100, overlay->lifeTime - _engine->_lbaTime - 50);
char text[10];
sprintf(text, "%d", range);

@ -136,11 +136,11 @@ void Screens::fadeOut(const uint32 *pal) {
fadeToBlack(pal);
}
int32 Screens::lerp(int32 value, int32 start, int32 end, int32 t) {
if (!end) {
return start;
int32 Screens::lerp(int32 val1, int32 val2, int32 nbstep, int32 step) { // RegleTrois32
if (nbstep < 0) {
return val2;
}
return (((start - value) * t) / end) + value;
return (((val2 - val1) * step) / nbstep) + val1;
}
void Screens::adjustPalette(uint8 r, uint8 g, uint8 b, const uint32 *rgbaPal, int32 intensity) {

@ -82,20 +82,20 @@ bool Collision::standingOnActor(int32 actorIdx1, int32 actorIdx2) const {
return true;
}
int32 Collision::getAverageValue(int32 start, int32 end, int32 maxDelay, int32 delay) const { // BoundRegleTrois
if (delay <= 0) {
return start;
int32 Collision::clampedLerp(int32 val1, int32 val2, int32 nbstep, int32 step) const { // BoundRegleTrois
if (step <= 0) {
return val1;
}
if (delay >= maxDelay) {
return end;
if (step >= nbstep) {
return val2;
}
return (((end - start) * delay) / maxDelay) + start;
return val1 + (((val2 - val1) * step) / nbstep);
}
void Collision::reajustPos(IVec3 &processActor, ShapeType brickShape) const {
if (brickShape == ShapeType::kNone) {
if (brickShape <= ShapeType::kSolid) {
return;
}
@ -167,16 +167,16 @@ void Collision::reajustPos(IVec3 &processActor, ShapeType brickShape) const {
switch (brickShape) {
case ShapeType::kStairsTopLeft:
processActor.y = yw + getAverageValue(0, SIZE_BRICK_Y, SIZE_BRICK_XZ, processActor.x - xw);
processActor.y = yw + clampedLerp(0, SIZE_BRICK_Y, SIZE_BRICK_XZ, processActor.x - xw);
break;
case ShapeType::kStairsTopRight:
processActor.y = yw + getAverageValue(0, SIZE_BRICK_Y, SIZE_BRICK_XZ, processActor.z - zw);
processActor.y = yw + clampedLerp(0, SIZE_BRICK_Y, SIZE_BRICK_XZ, processActor.z - zw);
break;
case ShapeType::kStairsBottomLeft:
processActor.y = yw + getAverageValue(SIZE_BRICK_Y, 0, SIZE_BRICK_XZ, processActor.z - zw);
processActor.y = yw + clampedLerp(SIZE_BRICK_Y, 0, SIZE_BRICK_XZ, processActor.z - zw);
break;
case ShapeType::kStairsBottomRight:
processActor.y = yw + getAverageValue(SIZE_BRICK_Y, 0, SIZE_BRICK_XZ, processActor.x - xw);
processActor.y = yw + clampedLerp(SIZE_BRICK_Y, 0, SIZE_BRICK_XZ, processActor.x - xw);
break;
default:
break;

@ -54,7 +54,7 @@ public:
*/
bool standingOnActor(int32 actorIdx1, int32 actorIdx2) const;
int32 getAverageValue(int32 start, int32 end, int32 maxDelay, int32 delay) const;
int32 clampedLerp(int32 start, int32 end, int32 maxDelay, int32 delay) const;
/**
* Reajust actor position in scene according with brick shape bellow actor

@ -544,7 +544,7 @@ void Extra::processExtras() { // GereExtras
const int32 deltaT = _engine->_lbaTime - extra->spawnTime;
if (extra->type & ExtraType::EXPLOSION) {
extra->sprite = _engine->_collision->getAverageValue(SPRITEHQR_EXPLOSION_FIRST_FRAME, 100, 30, deltaT);
extra->sprite = _engine->_collision->clampedLerp(SPRITEHQR_EXPLOSION_FIRST_FRAME, 100, 30, deltaT);
continue;
}
// process extra moving

@ -510,11 +510,11 @@ void GameState::processGameoverAnimation() {
return;
}
const int32 avg = _engine->_collision->getAverageValue(40000, 3200, 500, _engine->_lbaTime - startLbaTime);
const int32 cdot = _engine->_screens->lerp(1, ANGLE_360, 100, (_engine->_lbaTime - startLbaTime) % 100);
const int32 zoom = _engine->_collision->clampedLerp(40000, 3200, TO_SECONDS(10), _engine->_lbaTime - startLbaTime);
const int32 angle = _engine->_screens->lerp(1, ANGLE_360, TO_SECONDS(2), (_engine->_lbaTime - startLbaTime) % TO_SECONDS(2));
_engine->blitWorkToFront(rect);
_engine->_renderer->setCameraAngle(0, 0, 0, 0, -cdot, 0, avg);
_engine->_renderer->setCameraAngle(0, 0, 0, 0, -angle, 0, zoom);
_engine->_renderer->renderIsoModel(0, 0, 0, ANGLE_0, ANGLE_0, ANGLE_0, gameOverPtr, dummy);
_engine->_lbaTime++;

@ -952,7 +952,7 @@ static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, LifeScriptContext &ctx) {
for (int16 i = 0; i < OVERLAY_MAX_ENTRIES; i++) {
OverlayListStruct *overlay = &engine->_redraw->overlayList[i];
if (overlay->info0 != -1 && overlay->type == OverlayType::koNumberRange) {
overlay->info0 = engine->_collision->getAverageValue(overlay->info1, overlay->info0, 100, overlay->lifeTime - engine->_lbaTime - TO_SECONDS(1));
overlay->info0 = engine->_collision->clampedLerp(overlay->info1, overlay->info0, TO_SECONDS(2), overlay->lifeTime - engine->_lbaTime - TO_SECONDS(1));
overlay->info1 = engine->_gameState->_inventoryNumKashes;
overlay->lifeTime = engine->_lbaTime + TO_SECONDS(3);
hideRange = true;