Optimize Damping Coefficient (#444)
* Optimize Damping Coefficient * Added Rounding + Moved Constants * Added Comments and Made Rounding not use a magic number * adjust epsilon * Adjusted Documentation
This commit is contained in:
+19
-5
@@ -11,6 +11,14 @@
|
|||||||
#include <tonc.h>
|
#include <tonc.h>
|
||||||
#include <tonc_oam.h>
|
#include <tonc_oam.h>
|
||||||
|
|
||||||
|
// Damping Constants: SPRING_DAMP_NUMERATOR/2^SPRING_DAMP_DENOM_SHIFT ~ 0.699 damping factor
|
||||||
|
//
|
||||||
|
// SPRING_DAMP_ROUNDING = 2^(SPRING_DAMP_DENOM_SHIFT - 1) rounding for fixed-point arithmetic by
|
||||||
|
// adding half the denominator to round instead of truncating
|
||||||
|
#define SPRING_DAMP_NUMERATOR 179
|
||||||
|
#define SPRING_DAMP_DENOM_SHIFT 8
|
||||||
|
#define SPRING_DAMP_ROUNDING (1 << (SPRING_DAMP_DENOM_SHIFT - 1))
|
||||||
|
|
||||||
OBJ_ATTR obj_buffer[MAX_SPRITES];
|
OBJ_ATTR obj_buffer[MAX_SPRITES];
|
||||||
OBJ_AFFINE* obj_aff_buffer = (OBJ_AFFINE*)obj_buffer;
|
OBJ_AFFINE* obj_aff_buffer = (OBJ_AFFINE*)obj_buffer;
|
||||||
|
|
||||||
@@ -211,7 +219,7 @@ void sprite_object_update(SpriteObject* sprite_object)
|
|||||||
sprite_object->vrotation += (sprite_object->trotation - sprite_object->rotation) / 8;
|
sprite_object->vrotation += (sprite_object->trotation - sprite_object->rotation) / 8;
|
||||||
|
|
||||||
// set velocity to 0 if it's close enough to the target
|
// set velocity to 0 if it's close enough to the target
|
||||||
const FIXED epsilon = float2fx(0.01f);
|
const FIXED epsilon = (FIX_ONE >> 6); // = 1/2^6 = 0.015625
|
||||||
if (sprite_object->vx < epsilon && sprite_object->vx > -epsilon &&
|
if (sprite_object->vx < epsilon && sprite_object->vx > -epsilon &&
|
||||||
sprite_object->vy < epsilon && sprite_object->vy > -epsilon)
|
sprite_object->vy < epsilon && sprite_object->vy > -epsilon)
|
||||||
{
|
{
|
||||||
@@ -223,8 +231,10 @@ void sprite_object_update(SpriteObject* sprite_object)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprite_object->vx = (sprite_object->vx * 7) / 10;
|
sprite_object->vx = (sprite_object->vx * SPRING_DAMP_NUMERATOR + SPRING_DAMP_ROUNDING) >>
|
||||||
sprite_object->vy = (sprite_object->vy * 7) / 10;
|
SPRING_DAMP_DENOM_SHIFT;
|
||||||
|
sprite_object->vy = (sprite_object->vy * SPRING_DAMP_NUMERATOR + SPRING_DAMP_ROUNDING) >>
|
||||||
|
SPRING_DAMP_DENOM_SHIFT;
|
||||||
|
|
||||||
sprite_object->x += sprite_object->vx;
|
sprite_object->x += sprite_object->vx;
|
||||||
sprite_object->y += sprite_object->vy;
|
sprite_object->y += sprite_object->vy;
|
||||||
@@ -238,7 +248,9 @@ void sprite_object_update(SpriteObject* sprite_object)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprite_object->vscale = (sprite_object->vscale * 7) / 10;
|
sprite_object->vscale =
|
||||||
|
(sprite_object->vscale * SPRING_DAMP_NUMERATOR + SPRING_DAMP_ROUNDING) >>
|
||||||
|
SPRING_DAMP_DENOM_SHIFT;
|
||||||
sprite_object->scale += sprite_object->vscale;
|
sprite_object->scale += sprite_object->vscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,7 +263,9 @@ void sprite_object_update(SpriteObject* sprite_object)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprite_object->vrotation = (sprite_object->vrotation * 7) / 10;
|
sprite_object->vrotation =
|
||||||
|
(sprite_object->vrotation * SPRING_DAMP_NUMERATOR + SPRING_DAMP_ROUNDING) >>
|
||||||
|
SPRING_DAMP_DENOM_SHIFT;
|
||||||
sprite_object->rotation += sprite_object->vrotation;
|
sprite_object->rotation += sprite_object->vrotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user