Refactor animation system
This commit is contained in:
parent
4bc75f43a5
commit
9ae3857fad
3
Makefile
3
Makefile
@ -21,6 +21,9 @@ TIM/bg_camPath_002.tim \
|
||||
TIM/bg_camPath_003.tim \
|
||||
TIM/bg_camPath_004.tim \
|
||||
TIM/bg_camPath_005.tim \
|
||||
TIM/ground.tim \
|
||||
TIM/trees.tim \
|
||||
TIM/woods.tim \
|
||||
VAG/hello.vag \
|
||||
VAG/poly.vag \
|
||||
VAG/0_come.vag \
|
||||
|
BIN
TIM/ground.tim
Normal file
BIN
TIM/ground.tim
Normal file
Binary file not shown.
BIN
TIM/trees.tim
Normal file
BIN
TIM/trees.tim
Normal file
Binary file not shown.
BIN
TIM/woods.tim
Normal file
BIN
TIM/woods.tim
Normal file
Binary file not shown.
@ -5,6 +5,7 @@
|
||||
|
||||
struct BODY;
|
||||
struct VANIM;
|
||||
struct MESH_ANIMS_TRACKS;
|
||||
struct PRIM;
|
||||
struct MESH;
|
||||
struct CAMPOS;
|
||||
@ -37,13 +38,20 @@ typedef struct BODY {
|
||||
typedef struct VANIM {
|
||||
int nframes; // number of frames e.g 20
|
||||
int nvert; // number of vertices e.g 21
|
||||
int cursor; // anim cursor
|
||||
int cursor; // anim cursor : -1 == not playing, n>=0 == current frame number
|
||||
int lerpCursor; // anim cursor
|
||||
int loop; // loop anim : -1 == infinite, n>0 == play n times
|
||||
int dir; // playback direction (1 or -1)
|
||||
int pingpong; // ping pong animation (A>B>A)
|
||||
int interpolate; // use lerp to interpolate keyframes
|
||||
SVECTOR data[]; // vertex pos as SVECTORs e.g 20 * 21 SVECTORS
|
||||
} VANIM;
|
||||
|
||||
typedef struct MESH_ANIMS_TRACKS {
|
||||
u_short index;
|
||||
VANIM * strips[];
|
||||
} MESH_ANIMS_TRACKS;
|
||||
|
||||
typedef struct PRIM {
|
||||
VECTOR order;
|
||||
int code; // Same as POL3/POL4 codes : Code (F3 = 1, FT3 = 2, G3 = 3,
|
||||
@ -73,7 +81,8 @@ typedef struct MESH {
|
||||
long p;
|
||||
long OTz;
|
||||
BODY * body;
|
||||
VANIM * anim;
|
||||
MESH_ANIMS_TRACKS * anim_tracks;
|
||||
VANIM * currentAnim;
|
||||
struct NODE * node;
|
||||
VECTOR pos2D;
|
||||
} MESH;
|
||||
|
@ -25,3 +25,5 @@ long interpolateQuad(POLY_GT4 * poly4, MESH * mesh, long t);
|
||||
void drawBG(CAMANGLE * camPtr, char ** nextpri, u_long * otdisc, char * db);
|
||||
// Rendering
|
||||
void renderScene(LEVEL * curLvl, CAMERA * camera, int * camMode, char ** nextpri, u_long * ot, u_long * otdisc, char * db, DRAWENV * draw, short curCamAngle, int atime);
|
||||
// Animation
|
||||
void playAnim(MESH * mesh, VANIM * anim, int loop);
|
||||
|
@ -33,3 +33,5 @@ long long easeIn(long long i);
|
||||
int easeOut(int i);
|
||||
//~ int easeInOut(int i, int div);
|
||||
VECTOR getVectorTo(VECTOR actor, VECTOR target);
|
||||
|
||||
int32_t round( int32_t n);
|
||||
|
5445
levels/level0.c
5445
levels/level0.c
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,12 @@
|
||||
extern LEVEL level0;
|
||||
extern CVECTOR level0_BGc;
|
||||
extern VECTOR level0_BKc;
|
||||
extern MESH_ANIMS_TRACKS level0_modelCube_001_anims;
|
||||
extern VANIM level0_modelCube_001_anim_KeyAction;
|
||||
extern VANIM level0_modelCube_001_anim_KeyAction_004;
|
||||
extern VANIM level0_modelCube_001_anim_KeyAction_003;
|
||||
extern VANIM level0_modelCube_001_anim_KeyAction_001;
|
||||
extern VANIM level0_modelCube_001_anim_KeyAction_002;
|
||||
extern CAMPOS level0_camPos_Camera;
|
||||
extern CAMPATH level0_camPath;
|
||||
extern MATRIX level0_lgtmat;
|
||||
@ -16,14 +22,58 @@ extern PRIM level0_modelCube_index[];
|
||||
extern BODY level0_modelCube_body;
|
||||
extern TMESH level0_modelCube;
|
||||
extern MESH level0_meshCube;
|
||||
extern SVECTOR modelPlane_mesh[];
|
||||
extern SVECTOR level0_modelPlane_normal[];
|
||||
extern CVECTOR level0_modelPlane_color[];
|
||||
extern PRIM level0_modelPlane_index[];
|
||||
extern BODY level0_modelPlane_body;
|
||||
extern TMESH level0_modelPlane;
|
||||
extern MESH level0_meshPlane;
|
||||
extern MESH * level0_meshes[2];
|
||||
extern SVECTOR modelCube_001_mesh[];
|
||||
extern SVECTOR level0_modelCube_001_normal[];
|
||||
extern CVECTOR level0_modelCube_001_color[];
|
||||
extern PRIM level0_modelCube_001_index[];
|
||||
extern BODY level0_modelCube_001_body;
|
||||
extern TMESH level0_modelCube_001;
|
||||
extern MESH level0_meshCube_001;
|
||||
extern SVECTOR modelPlane_000_mesh[];
|
||||
extern SVECTOR level0_modelPlane_000_normal[];
|
||||
extern SVECTOR level0_modelPlane_000_uv[];
|
||||
extern CVECTOR level0_modelPlane_000_color[];
|
||||
extern PRIM level0_modelPlane_000_index[];
|
||||
extern BODY level0_modelPlane_000_body;
|
||||
extern TMESH level0_modelPlane_000;
|
||||
extern unsigned long _binary_TIM_woods_tim_start[];
|
||||
extern unsigned long _binary_TIM_woods_tim_end[];
|
||||
extern unsigned long _binary_TIM_woods_tim_length;
|
||||
extern TIM_IMAGE level0_tim_woods;
|
||||
extern MESH level0_meshPlane_000;
|
||||
extern SVECTOR modelPlane_001_mesh[];
|
||||
extern SVECTOR level0_modelPlane_001_normal[];
|
||||
extern SVECTOR level0_modelPlane_001_uv[];
|
||||
extern CVECTOR level0_modelPlane_001_color[];
|
||||
extern PRIM level0_modelPlane_001_index[];
|
||||
extern BODY level0_modelPlane_001_body;
|
||||
extern TMESH level0_modelPlane_001;
|
||||
extern MESH level0_meshPlane_001;
|
||||
extern SVECTOR modelPlane_002_mesh[];
|
||||
extern SVECTOR level0_modelPlane_002_normal[];
|
||||
extern SVECTOR level0_modelPlane_002_uv[];
|
||||
extern CVECTOR level0_modelPlane_002_color[];
|
||||
extern PRIM level0_modelPlane_002_index[];
|
||||
extern BODY level0_modelPlane_002_body;
|
||||
extern TMESH level0_modelPlane_002;
|
||||
extern MESH level0_meshPlane_002;
|
||||
extern SVECTOR modelPlane_005_mesh[];
|
||||
extern SVECTOR level0_modelPlane_005_normal[];
|
||||
extern SVECTOR level0_modelPlane_005_uv[];
|
||||
extern CVECTOR level0_modelPlane_005_color[];
|
||||
extern PRIM level0_modelPlane_005_index[];
|
||||
extern BODY level0_modelPlane_005_body;
|
||||
extern TMESH level0_modelPlane_005;
|
||||
extern MESH level0_meshPlane_005;
|
||||
extern SVECTOR modelPlane_006_mesh[];
|
||||
extern SVECTOR level0_modelPlane_006_normal[];
|
||||
extern SVECTOR level0_modelPlane_006_uv[];
|
||||
extern CVECTOR level0_modelPlane_006_color[];
|
||||
extern PRIM level0_modelPlane_006_index[];
|
||||
extern BODY level0_modelPlane_006_body;
|
||||
extern TMESH level0_modelPlane_006;
|
||||
extern MESH level0_meshPlane_006;
|
||||
extern MESH * level0_meshes[7];
|
||||
extern int level0_meshes_length;
|
||||
extern CAMANGLE level0_camAngle_Camera;
|
||||
extern CAMANGLE * level0_camAngles[0];
|
||||
|
3695
levels/level1.c
3695
levels/level1.c
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,10 @@
|
||||
extern LEVEL level1;
|
||||
extern CVECTOR level1_BGc;
|
||||
extern VECTOR level1_BKc;
|
||||
extern MESH_ANIMS_TRACKS level1_modelCube_anims;
|
||||
extern VANIM level1_modelCube_anim_Cube;
|
||||
extern MESH_ANIMS_TRACKS level1_modelCylindre_anims;
|
||||
extern VANIM level1_modelCylindre_anim_Cylindre;
|
||||
extern CAMPOS level1_camPos_camPath;
|
||||
extern CAMPOS level1_camPos_camPath_001;
|
||||
extern CAMPOS level1_camPos_camPath_002;
|
||||
@ -31,7 +35,6 @@ extern SVECTOR level1_modelCylindre_normal[];
|
||||
extern SVECTOR level1_modelCylindre_uv[];
|
||||
extern CVECTOR level1_modelCylindre_color[];
|
||||
extern PRIM level1_modelCylindre_index[];
|
||||
extern VANIM level1_modelCylindre_anim;
|
||||
extern BODY level1_modelCylindre_body;
|
||||
extern TMESH level1_modelCylindre;
|
||||
extern unsigned long _binary_TIM_home_tim_start[];
|
||||
@ -151,6 +154,14 @@ extern MESH * level1_meshes[15];
|
||||
extern int level1_meshes_length;
|
||||
extern CAMANGLE level1_camAngle_camPath_001;
|
||||
extern CAMANGLE * level1_camAngles[0];
|
||||
extern SIBLINGS level1_nodegnd_siblings;
|
||||
extern CHILDREN level1_nodegnd_objects;
|
||||
extern CHILDREN level1_nodegnd_rigidbodies;
|
||||
extern NODE level1_nodegnd;
|
||||
extern SIBLINGS level1_nodegnd_002_siblings;
|
||||
extern CHILDREN level1_nodegnd_002_objects;
|
||||
extern CHILDREN level1_nodegnd_002_rigidbodies;
|
||||
extern NODE level1_nodegnd_002;
|
||||
extern SIBLINGS level1_nodegnd_001_siblings;
|
||||
extern CHILDREN level1_nodegnd_001_objects;
|
||||
extern CHILDREN level1_nodegnd_001_rigidbodies;
|
||||
@ -159,22 +170,12 @@ extern SIBLINGS level1_nodegnd_003_siblings;
|
||||
extern CHILDREN level1_nodegnd_003_objects;
|
||||
extern CHILDREN level1_nodegnd_003_rigidbodies;
|
||||
extern NODE level1_nodegnd_003;
|
||||
extern SIBLINGS level1_nodegnd_002_siblings;
|
||||
extern CHILDREN level1_nodegnd_002_objects;
|
||||
extern CHILDREN level1_nodegnd_002_rigidbodies;
|
||||
extern NODE level1_nodegnd_002;
|
||||
extern SIBLINGS level1_nodegnd_siblings;
|
||||
extern CHILDREN level1_nodegnd_objects;
|
||||
extern CHILDREN level1_nodegnd_rigidbodies;
|
||||
extern NODE level1_nodegnd;
|
||||
extern MESH * level1_actorPtr;
|
||||
extern MESH * level1_levelPtr;
|
||||
extern MESH * level1_propPtr;
|
||||
extern CAMANGLE * level1_camPtr;
|
||||
extern NODE * level1_curNode;
|
||||
extern NODE level1_nodegnd;
|
||||
extern NODE level1_nodegnd_002;
|
||||
extern NODE level1_nodegnd_001;
|
||||
extern NODE level1_nodegnd_003;
|
||||
extern NODE level1_nodegnd_002;
|
||||
extern NODE level1_nodegnd;
|
||||
extern VAGbank VAGBank1;
|
||||
extern XAbank XABank1;
|
||||
|
142
src/graphics.c
142
src/graphics.c
@ -51,40 +51,54 @@ void set3VertexLerPos(MESH * mesh, long t){
|
||||
// TODO : Pre-calculate lerp positions at runtime (for i in nframes, do calc)
|
||||
// Fixed point math precision
|
||||
short precision = 12;
|
||||
// Vertex 1
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vx = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vx].vx << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vx].vx << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vz = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vx].vz << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vx].vz << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vy = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vx].vy << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vx].vy << precision, mesh->anim->cursor << precision) >> precision;
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vx ].vx = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vx].vx << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vx].vx << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vx ].vz = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vx].vz << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vx].vz << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vx ].vy = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vx].vy << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vx].vy << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ // Vertex 2
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vz ].vx = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vz].vx << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vz].vx << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vz ].vz = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vz].vz << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vz].vz << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vz ].vy = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vz].vy << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vz].vy << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ // Vertex 3
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vy ].vx = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vy].vx << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vy].vx << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vy ].vz = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vy].vz << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vy].vz << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
//~ mesh->tmesh->v[ mesh->index[ t ].order.vy ].vy = round(lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vy].vy << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vy].vy << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vx = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vx].vx << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vx].vx << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vz = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vx].vz << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vx].vz << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vy = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vx].vy << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vx].vy << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
// Vertex 2
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vx = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vz].vx << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vz].vx << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vz = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vz].vz << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vz].vz << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vy = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vz].vy << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vz].vy << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vx = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vz].vx << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vz].vx << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vz = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vz].vz << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vz].vz << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vy = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vz].vy << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vz].vy << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
// Vertex 3
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vx = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vy].vx << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vy].vx << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vz = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vy].vz << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vy].vz << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vy = lerpD( mesh->anim->data[mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[t].order.vy].vy << precision , mesh->anim->data[(mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[t].order.vy].vy << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->anim->cursor += 24 * mesh->anim->dir;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vx = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vy].vx << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vy].vx << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vz = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vy].vz << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vy].vz << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vy = (lerpD( mesh->currentAnim->data[mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[t].order.vy].vy << precision , mesh->currentAnim->data[(mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[t].order.vy].vy << precision, mesh->currentAnim->cursor << precision)) >> precision;
|
||||
|
||||
mesh->currentAnim->cursor += 24 * mesh->currentAnim->dir;
|
||||
};
|
||||
void set4VertexLerPos(MESH * mesh, long t){
|
||||
// Find and set 4 interpolated vertex value
|
||||
short precision = 12;
|
||||
// Vertex 1
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vx = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vx ].vx << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vx ].vx << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vz = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vx ].vz << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vx ].vz << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vy = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vx ].vy << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vx ].vy << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vx = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vx ].vx << precision ,
|
||||
mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vx ].vx << precision,
|
||||
mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vz = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vx ].vz << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vx ].vz << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vx ].vy = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vx ].vy << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vx ].vy << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
// Vertex 2
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vx = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vz ].vx << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vz ].vx << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vz = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vz ].vz << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vz ].vz << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vy = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vz ].vy << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vz ].vy << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vx = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vz ].vx << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vz ].vx << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vz = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vz ].vz << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vz ].vz << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vz ].vy = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vz ].vy << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vz ].vy << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
// Vertex 3
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vx = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vy ].vx << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vy ].vx << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vz = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vy ].vz << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vy ].vz << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vy = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.vy ].vy << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.vy ].vy << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vx = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vy ].vx << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vy ].vx << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vz = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vy ].vz << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vy ].vz << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.vy ].vy = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.vy ].vy << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.vy ].vy << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
// Vertex 4
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.pad ].vx = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.pad ].vx << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.pad ].vx << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.pad ].vz = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.pad ].vz << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.pad ].vz << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.pad ].vy = lerpD( mesh->anim->data[ mesh->anim->lerpCursor * mesh->anim->nvert + mesh->index[ t ].order.pad ].vy << precision , mesh->anim->data[ (mesh->anim->lerpCursor + 1) * mesh->anim->nvert + mesh->index[ t ].order.pad ].vy << precision, mesh->anim->cursor << precision) >> precision;
|
||||
mesh->anim->cursor += 2 * mesh->anim->dir;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.pad ].vx = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.pad ].vx << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.pad ].vx << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.pad ].vz = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.pad ].vz << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.pad ].vz << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
mesh->tmesh->v[ mesh->index[ t ].order.pad ].vy = lerpD( mesh->currentAnim->data[ mesh->currentAnim->lerpCursor * mesh->currentAnim->nvert + mesh->index[ t ].order.pad ].vy << precision , mesh->currentAnim->data[ (mesh->currentAnim->lerpCursor + 1) * mesh->currentAnim->nvert + mesh->index[ t ].order.pad ].vy << precision, mesh->currentAnim->cursor << precision) >> precision;
|
||||
|
||||
mesh->currentAnim->cursor += 24 * mesh->currentAnim->dir;
|
||||
}
|
||||
long interpolateTri(POLY_GT3 * poly, MESH * mesh, long t){
|
||||
long Flag, nclip = 0;
|
||||
@ -93,16 +107,16 @@ long interpolateTri(POLY_GT3 * poly, MESH * mesh, long t){
|
||||
//~ // mesh->anim->dir *= -1;
|
||||
//~ //}
|
||||
// Find next keyframe
|
||||
if (mesh->anim->cursor > (1 << 12)) {
|
||||
if (mesh->currentAnim->cursor > (1 << 12)) {
|
||||
// There are still keyframes to interpolate between
|
||||
if ( mesh->anim->lerpCursor < mesh->anim->nframes - 1 ) {
|
||||
mesh->anim->lerpCursor ++;
|
||||
mesh->anim->cursor = 0;
|
||||
if ( mesh->currentAnim->lerpCursor < mesh->currentAnim->nframes - 1 ) {
|
||||
mesh->currentAnim->lerpCursor ++;
|
||||
mesh->currentAnim->cursor = 0;
|
||||
}
|
||||
// We've reached last frame, go back to first frame
|
||||
if ( mesh->anim->lerpCursor == mesh->anim->nframes - 1 ) {
|
||||
mesh->anim->lerpCursor = 0;
|
||||
mesh->anim->cursor = 0;
|
||||
if ( mesh->currentAnim->lerpCursor == mesh->currentAnim->nframes - 1 ) {
|
||||
mesh->currentAnim->lerpCursor = 0;
|
||||
mesh->currentAnim->cursor = 0;
|
||||
}
|
||||
}
|
||||
// Find and set interpolated vertex value
|
||||
@ -127,14 +141,15 @@ long interpolateQuad(POLY_GT4 * poly4, MESH * mesh, long t){
|
||||
//~ mesh->anim->dir *= -1;
|
||||
//~ }
|
||||
short precision = 12;
|
||||
if ( mesh->anim->cursor > 1<<precision ) {
|
||||
if ( mesh->anim->lerpCursor < mesh->anim->nframes - 1 ) {
|
||||
mesh->anim->lerpCursor ++;
|
||||
mesh->anim->cursor = 0;
|
||||
//~ if ( mesh->anim->cursor > 1<<precision ) {
|
||||
if ( mesh->currentAnim->cursor > (1 << 12) ) {
|
||||
if ( mesh->currentAnim->lerpCursor < mesh->currentAnim->nframes - 1 ) {
|
||||
mesh->currentAnim->lerpCursor ++;
|
||||
mesh->currentAnim->cursor = 0;
|
||||
}
|
||||
if ( mesh->anim->lerpCursor == mesh->anim->nframes - 1 ) {
|
||||
mesh->anim->lerpCursor = 0;
|
||||
mesh->anim->cursor = 0;
|
||||
if ( mesh->currentAnim->lerpCursor == mesh->currentAnim->nframes - 1 ) {
|
||||
mesh->currentAnim->lerpCursor = 0;
|
||||
mesh->currentAnim->cursor = 0;
|
||||
}
|
||||
}
|
||||
// Find and set interpolated vertex value
|
||||
@ -346,17 +361,18 @@ long drawQuad(MESH * mesh, int atime, int * camMode, char ** nextpri, u_long * o
|
||||
poly4 = (POLY_GT4 *)*nextpri;
|
||||
|
||||
// Vertex Anim
|
||||
if (mesh->isAnim){
|
||||
if (mesh->isAnim && mesh->currentAnim){
|
||||
// with interpolation
|
||||
if ( mesh->anim->interpolate ){
|
||||
interpolateQuad(poly4, mesh, t);
|
||||
if ( mesh->anim_tracks->strips[0]->interpolate ){
|
||||
nclip = interpolateQuad(poly4, mesh, t);
|
||||
} else {
|
||||
// TODO : write playAnim()
|
||||
// No interpolation, use all vertices coordinates in anim data
|
||||
gte_RotAverageNclip4(
|
||||
&mesh->anim->data[ atime % mesh->anim->nframes * mesh->anim->nvert + mesh->index[t].order.pad ],
|
||||
&mesh->anim->data[ atime % mesh->anim->nframes * mesh->anim->nvert + mesh->index[t].order.vz ],
|
||||
&mesh->anim->data[ atime % mesh->anim->nframes * mesh->anim->nvert + mesh->index[t].order.vx ],
|
||||
&mesh->anim->data[ atime % mesh->anim->nframes * mesh->anim->nvert + mesh->index[t].order.vy ],
|
||||
&mesh->currentAnim->data[ atime % mesh->anim_tracks->strips[0]->nframes * mesh->anim_tracks->strips[0]->nvert + mesh->index[t].order.pad ],
|
||||
&mesh->currentAnim->data[ atime % mesh->anim_tracks->strips[0]->nframes * mesh->anim_tracks->strips[0]->nvert + mesh->index[t].order.vz ],
|
||||
&mesh->currentAnim->data[ atime % mesh->anim_tracks->strips[0]->nframes * mesh->anim_tracks->strips[0]->nvert + mesh->index[t].order.vx ],
|
||||
&mesh->currentAnim->data[ atime % mesh->anim_tracks->strips[0]->nframes * mesh->anim_tracks->strips[0]->nvert + mesh->index[t].order.vy ],
|
||||
( long* )&poly4->x0, ( long* )&poly4->x1, ( long* )&poly4->x2, ( long* )&poly4->x3,
|
||||
&mesh->p,
|
||||
&mesh->OTz,
|
||||
@ -429,17 +445,17 @@ long drawTri(MESH * mesh, int atime, int * camMode, char ** nextpri, u_long * ot
|
||||
if ( !( mesh->isBG ) || *camMode != 2) {
|
||||
poly = (POLY_GT3 *)*nextpri;
|
||||
// If Vertex Anim flag is set, use it
|
||||
if (mesh->isAnim){
|
||||
if (mesh->isAnim && mesh->currentAnim){
|
||||
// If interpolation flag is set, use it
|
||||
if(mesh->anim->interpolate){
|
||||
if(mesh->anim_tracks->strips[0]->interpolate){
|
||||
nclip = interpolateTri(poly, mesh, t);
|
||||
} else {
|
||||
// No interpolation
|
||||
// Use the pre-calculated vertices coordinates from the animation data
|
||||
gte_RotAverageNclip3(
|
||||
&mesh->anim->data[ atime % mesh->anim->nframes * mesh->anim->nvert + mesh->index[t].order.vx ],
|
||||
&mesh->anim->data[ atime % mesh->anim->nframes * mesh->anim->nvert + mesh->index[t].order.vz ],
|
||||
&mesh->anim->data[ atime % mesh->anim->nframes * mesh->anim->nvert + mesh->index[t].order.vy ],
|
||||
&mesh->currentAnim->data[ atime % mesh->currentAnim->nframes * mesh->currentAnim->nvert + mesh->index[t].order.vx ],
|
||||
&mesh->currentAnim->data[ atime % mesh->currentAnim->nframes * mesh->currentAnim->nvert + mesh->index[t].order.vz ],
|
||||
&mesh->currentAnim->data[ atime % mesh->currentAnim->nframes * mesh->currentAnim->nvert + mesh->index[t].order.vy ],
|
||||
( long* ) &poly->x0, ( long* ) &poly->x1, ( long* ) &poly->x2,
|
||||
&mesh->p,
|
||||
&mesh->OTz,
|
||||
@ -599,3 +615,27 @@ void renderScene(LEVEL * curLvl, CAMERA * camera, int * camMode, char ** nextpri
|
||||
}
|
||||
updateLight();
|
||||
};
|
||||
|
||||
void playAnim(MESH * mesh, VANIM * anim, int loop){
|
||||
if (mesh->isAnim){
|
||||
// Set looping (-1 : infinite, n > 0 : loop n times )
|
||||
if (mesh->currentAnim->loop == 0){
|
||||
mesh->currentAnim->loop = loop;
|
||||
}
|
||||
// If anim not is not playing yet
|
||||
if (mesh->currentAnim->cursor == -1){
|
||||
// if cursor is -1, set to 0, start playback
|
||||
mesh->currentAnim->cursor = 0;
|
||||
} else {
|
||||
|
||||
}
|
||||
// Anim is already playing
|
||||
} else if (mesh->currentAnim == anim){
|
||||
// If we're not in an infinite loop (-1)
|
||||
if (mesh->currentAnim->loop > 0){
|
||||
// Add loop iterations ?
|
||||
mesh->currentAnim->loop = loop;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
38
src/main.c
38
src/main.c
@ -37,7 +37,7 @@ u_long overlaySize = 0;
|
||||
#include "../levels/level1.h"
|
||||
|
||||
// Levels
|
||||
u_char level = 1;
|
||||
u_char level = 0;
|
||||
u_short levelWas = 0;
|
||||
u_short levelHasChanged = 0;
|
||||
// Overlay
|
||||
@ -129,7 +129,7 @@ int main() {
|
||||
} else if ( level == 1) {
|
||||
overlayFile = "\\level1.bin;1";
|
||||
overlaySize = __lvl1_end;
|
||||
loadLvl = &level1;
|
||||
//~ loadLvl = &level1;
|
||||
}
|
||||
// Load overlay from cd
|
||||
#ifdef USECD
|
||||
@ -142,7 +142,7 @@ int main() {
|
||||
if ( level == 0 ) {
|
||||
LvlPtrSet( &curLvl, &level0);
|
||||
} else if ( level == 1) {
|
||||
LvlPtrSet( &curLvl, &level1);
|
||||
//~ LvlPtrSet( &curLvl, &level1);
|
||||
}
|
||||
levelWas = level;
|
||||
// Copy light matrices / vector to scratchpad
|
||||
@ -214,7 +214,7 @@ int main() {
|
||||
case 1:
|
||||
overlayFile = "\\level1.bin;1";
|
||||
overlaySize = __lvl1_end;
|
||||
loadLvl = &level1;
|
||||
//~ loadLvl = &level1;
|
||||
// Copy light matrices / vector to scratchpad
|
||||
|
||||
break;
|
||||
@ -250,7 +250,6 @@ int main() {
|
||||
if (time % timediv == 0){
|
||||
atime ++;
|
||||
}
|
||||
// TODO : put in a function
|
||||
// Reset player/prop pos
|
||||
if(curLvl.actorPtr->pos.vy >= 200){
|
||||
playSFX(&voiceAttributes, curLvl.levelSounds->sounds[6]->VAGsample, curLvl.levelSounds->sounds[6]->volumeL, curLvl.levelSounds->sounds[6]->volumeR);
|
||||
@ -388,6 +387,7 @@ int main() {
|
||||
FntPrint("XA: %x\n", curLvl.XA);
|
||||
FntPrint("Ofst: %d\n", curLvl.XA->banks[0]->offset);
|
||||
FntPrint("Vol: %d %d\n", curLvl.levelSounds->sounds[0]->volumeL, curLvl.levelSounds->sounds[0]->volumeR );
|
||||
FntPrint("Curanim : %x", curLvl.meshes[1]->currentAnim);
|
||||
FntFlush(-1);
|
||||
display( &disp[db], &draw[db], otdisc[db], primbuff[db], &nextpri, &db);
|
||||
|
||||
@ -474,6 +474,16 @@ void callback() {
|
||||
}
|
||||
if ( PAD & Square && !( lastPad & Square ) ){
|
||||
playSFX(&voiceAttributes, curLvl.levelSounds->sounds[7]->VAGsample, curLvl.levelSounds->sounds[7]->volumeL, curLvl.levelSounds->sounds[7]->volumeR);
|
||||
if ( curLvl.meshes[1]->currentAnim == 0 ||
|
||||
curLvl.meshes[1]->currentAnim == curLvl.meshes[1]->anim_tracks->strips[0]
|
||||
){
|
||||
if (curLvl.meshes[1]->anim_tracks->index > 1) {
|
||||
curLvl.meshes[1]->currentAnim = curLvl.meshes[1]->anim_tracks->strips[1];
|
||||
}
|
||||
} else {
|
||||
//~ curLvl.meshes[1]->anim_tracks->strips[0]->interpolate = 1;
|
||||
curLvl.meshes[1]->currentAnim = curLvl.meshes[1]->anim_tracks->strips[0];
|
||||
}
|
||||
//~ sample = 0;
|
||||
//~ setXAsample(&XABank.samples[sample], &filter);
|
||||
lastPad = PAD;
|
||||
@ -500,17 +510,13 @@ void callback() {
|
||||
if ( !(PAD & Circle) && lastPad & Circle ) {
|
||||
lastPad = PAD;
|
||||
}
|
||||
if ( PAD & PadLeft && !(lastPad & PadLeft) ) {
|
||||
if (curLvl.actorPtr->anim->interpolate){
|
||||
curLvl.actorPtr->anim->interpolate = 0;
|
||||
} else {
|
||||
curLvl.actorPtr->anim->interpolate = 1;
|
||||
}
|
||||
lastPad = PAD;
|
||||
}
|
||||
if ( !(PAD & PadLeft) && lastPad & PadLeft ) {
|
||||
lastPad = PAD;
|
||||
}
|
||||
//~ if ( PAD & PadLeft && !(lastPad & PadLeft) ) {
|
||||
|
||||
//~ lastPad = PAD;
|
||||
//~ }
|
||||
//~ if ( !(PAD & PadLeft) && lastPad & PadLeft ) {
|
||||
//~ lastPad = PAD;
|
||||
//~ }
|
||||
if (theControllers[0].type == 0x73){
|
||||
// Analog stick L up
|
||||
if ( theControllers[0].analog3 >= 0 && theControllers[0].analog3 < (128 - DS_DZ/2)) {
|
||||
|
44
src/math.c
44
src/math.c
@ -13,9 +13,11 @@ void generateTable(void){
|
||||
m_cosTable[0] = 16777216; // 2^24 * cos(0 * 2pi / 2048) => 2^24 * 1 = 2^24 : here, 2^24 defines the precision we want after the decimal point
|
||||
static const long long C = 16777137; // 2^24 * cos(1 * 2pi / 2048) = C = f(1);
|
||||
m_cosTable[1] = C;
|
||||
for (int i = 2; i < 512; i++){
|
||||
for (int i = 2; i < 511; i++){
|
||||
m_cosTable[i] = ((C * m_cosTable[i - 1]) >> 23) - m_cosTable[i - 2];
|
||||
m_cosTable[511] = 0;
|
||||
}
|
||||
for (int i = 0; i < 512; i++){
|
||||
m_cosTable[i] >>= 12;
|
||||
}
|
||||
};
|
||||
int ncos(unsigned int t) {
|
||||
@ -30,7 +32,7 @@ int ncos(unsigned int t) {
|
||||
} else {
|
||||
r = m_cosTable[DC_2PI - 1 - t];
|
||||
};
|
||||
return r >> 12;
|
||||
return r;
|
||||
};
|
||||
// sin(x) = cos(x - pi / 2)
|
||||
int nsin(unsigned int t) {
|
||||
@ -106,7 +108,8 @@ int32_t lerpS(int32_t start, int32_t dest, unsigned pos) {
|
||||
// precision = 2^24 - 2^x
|
||||
// << x : 0 < pos < precision
|
||||
// https://discord.com/channels/642647820683444236/646765703143227394/811318550978494505
|
||||
// my angles are between 0 and 2048 (full circle), so 2^11 for the range of angles; with numbers on a 8.24 representation, a 1.0 angle (or 2pi) means it's 2^24, so to "convert" my angles from 8.24 to my internal discrete cos, I only have to shift by 13
|
||||
// my angles are between 0 and 2048 (full circle), so 2^11 for the range of angles; with numbers on a 8.24 representation,
|
||||
// a 1.0 angle (or 2pi) means it's 2^24, so to "convert" my angles from 8.24 to my internal discrete cos, I only have to shift by 13
|
||||
int32_t lerpD(int32_t start, int32_t dest, int32_t pos) {
|
||||
return dMul(start, 16777216 - pos) + dMul(dest, pos);
|
||||
};
|
||||
@ -144,3 +147,36 @@ VECTOR getVectorTo( VECTOR actor, VECTOR target ) {
|
||||
VectorNormal(&direction, &Ndirection);
|
||||
return Ndirection ;
|
||||
};
|
||||
|
||||
int32_t round( int32_t n){
|
||||
// GRS - Action
|
||||
// 0xx - round down = do nothing (x means any bit value, 0 or 1)
|
||||
// 100 - this is a tie: round up if the mantissa's bit just before G is 1, else round down=do nothing
|
||||
// 101 - round up
|
||||
// 110 - round up
|
||||
// 111 - round up
|
||||
// source : https://stackoverflow.com/a/8984135
|
||||
// e.g : n == 106 150 == 0000 0000 0000 0001 1001 1110 1010 0110
|
||||
// Get GRS bits
|
||||
// 0xe00 == 0000 1110 0000 0000
|
||||
int8_t grs = ( n & 0xe00) >> 8 ; // 1110 0000 0000 >> 8
|
||||
// GRS == 111(0)
|
||||
// Get G value - 0x8 == 1000
|
||||
if (grs & 0x8){
|
||||
// GRS = 1xx
|
||||
if ( // Get R value - 0x4 == 0100
|
||||
// GRS == 11x ; round up
|
||||
grs & 0x4 ||
|
||||
// Get S value - 0x2 == 0010
|
||||
// GRS == 101 ; round up
|
||||
( !(grs & 0x4) && grs & 0x2)
|
||||
) {
|
||||
n += 0x800;
|
||||
} else if ( !(n & 0x1000) ) {
|
||||
// Get mantissa lsb - 0x1000 == 0001 0000 0000
|
||||
// GRS == 100 ; tie, round up if mantissa lsb is 1
|
||||
n += 0x800;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user