From 9447dabd21e7b3812a8f86bf6bec07370904d962 Mon Sep 17 00:00:00 2001 From: ABelliqueux Date: Tue, 13 Jul 2021 13:23:02 +0200 Subject: [PATCH] Move camAngletoAct to scratchpad, use dz for dualshock --- include/camera.h | 2 +- include/defines.h | 5 ++-- include/physics.h | 2 +- src/camera.c | 22 ++++++++-------- src/graphics.c | 25 +++++++++--------- src/main.c | 65 ++++++++++++++++++++++++++--------------------- src/physics.c | 22 ++++++++-------- 7 files changed, 75 insertions(+), 68 deletions(-) diff --git a/include/camera.h b/include/camera.h index 13980f1..c551065 100644 --- a/include/camera.h +++ b/include/camera.h @@ -29,4 +29,4 @@ void getCameraZY( int * z, int * y, int actorZ, int actorY, int angleX, int dist void applyCamera(CAMERA * cam); void setCameraPos(CAMERA * camera, SVECTOR * pos, SVECTOR * rot); -void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECTOR * posToActor, VECTOR * angle, VECTOR * angleCam, short curCamAngle, int camMode, int * lerping); +void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * posToActor, VECTOR * angle, VECTOR * angleCam, short curCamAngle, int camMode, int * lerping); diff --git a/include/defines.h b/include/defines.h index dbcafc1..dce3185 100644 --- a/include/defines.h +++ b/include/defines.h @@ -1,5 +1,5 @@ #define VMODE 0 // 0 == NTSC, 1 == PAL -#define VSYNC 1 +#define VSYNC 0 #define SCREENXRES 320 #define SCREENYRES 240 #define CENTERX SCREENXRES/2 @@ -45,7 +45,8 @@ asm(\ #define dc_wrklvector ((VECTOR*) getScratchAddr(34)) #define dc_camMat ((MATRIX*) getScratchAddr(38)) #define dc_camRot ((SVECTOR*) getScratchAddr(46)) -#define dc_camPos ((SVECTOR*) getScratchAddr(54)) +#define dc_camPos ((SVECTOR*) getScratchAddr(48)) +#define dc_actorRot ((VECTOR*) getScratchAddr(50)) //~ #define dc_sxytbl ((DVECTOR*) getScratchAddr(15)) // 6 DVEC == 12 //~ #define dc_verts ((SVECTOR*) getScratchAddr(27)) // store verts here diff --git a/include/physics.h b/include/physics.h index b46e651..ead7e40 100644 --- a/include/physics.h +++ b/include/physics.h @@ -15,4 +15,4 @@ void checkBodyCol(BODY * one, BODY * two); void applyAngMom(LEVEL curLvl ); void ResolveCollision( BODY * one, BODY * two ); VECTOR angularMom(BODY body); -void applyAcceleration(BODY * actor, ulong oldTime); +void applyAcceleration(BODY * actor); diff --git a/src/camera.c b/src/camera.c index 6e9ab05..1b41290 100644 --- a/src/camera.c +++ b/src/camera.c @@ -31,14 +31,14 @@ void applyCamera( CAMERA * cam ) { gte_SetTransMatrix(dc_camMat); // Set Transform matrix }; void setCameraPos( CAMERA * camera, SVECTOR * pos, SVECTOR * rot ) { - copyVector(camera->pos, pos); - copyVector(camera->rot, rot); + copyVector(dc_camPos, pos); + copyVector(dc_camRot, rot); }; -void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECTOR * posToActor, VECTOR * angle, VECTOR * angleCam, short curCamAngle, int camMode, int * lerping){ +void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * posToActor, VECTOR * angle, VECTOR * angleCam, short curCamAngle, int camMode, int * lerping){ int dist = 0; short cameraSpeed = 40; - //~ if(camMode != 2) { + //~ if(camMode != 2) { //~ camera->rot->vy = camAngleToAct->vy; //~ // using csin/ccos, no need for theta //~ camera->rot->vx = camAngleToAct->vx; @@ -50,7 +50,7 @@ void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECT // Camera follows actor case 0 : dist = 200; - setVector(camera->pos, -(camera->x/ONE), -(camera->y/ONE), -(camera->z/ONE)); + setVector(dc_camPos, -(camera->x/ONE), -(camera->y/ONE), -(camera->z/ONE)); angle->vy = -(curLvl->actorPtr->rot.vy / 2) + angleCam->vy; // Camera horizontal and vertical position getCameraZY(&camera->z, &camera->y, curLvl->actorPtr->pos.vz, curLvl->actorPtr->pos.vy, angle->vx, dist); @@ -62,7 +62,7 @@ void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECT // Set distance between cam and actor dist = 150; // Set camera position - setVector(camera->pos, -(camera->x/ONE), 100, -(camera->z/ONE)); + setVector(dc_camPos, -(camera->x/ONE), 100, -(camera->z/ONE)); // Find new camera position getCameraXZ(&camera->x, &camera->z, curLvl->actorPtr->pos.vx, curLvl->actorPtr->pos.vz, angle->vy, dist); // Set rotation amount @@ -70,7 +70,7 @@ void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECT break; // Fixed Camera angle - case 2 : + case 2 : // If BG images exist if (curLvl->camPtr->tim_data){ checkLineW( &curLvl->camAngles[ curCamAngle ]->fw.v3, &curLvl->camAngles[ curCamAngle ]->fw.v2, curLvl->actorPtr); @@ -109,7 +109,7 @@ void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECT // Using precalc sqrt dist = psqrt( (posToActor->vx * posToActor->vx ) + (posToActor->vz * posToActor->vz) ); // Set camera position - setVector(camera->pos, 190, 100, 180); + setVector(dc_camPos, 190, 100, 180); break; // Flyby mode with LERP from camStart to camEnd case 4 : @@ -158,7 +158,7 @@ void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECT // Lerping sequence has not begun if (!lerping){ // Set cam start position ( first key pos ) - copyVector(camera->pos, &curLvl->camPath->points[curLvl->camPath->cursor]); + copyVector(dc_camPos, &curLvl->camPath->points[curLvl->camPath->cursor]); // Lerping sequence is starting *lerping = 1; // Set cam pos index to 0 @@ -174,11 +174,11 @@ void setCameraMode(LEVEL * curLvl, CAMERA * camera, VECTOR * camAngleToAct, VECT lerpD(curLvl->camPath->points[curLvl->camPath->cursor].vz << precision, curLvl->camPath->points[curLvl->camPath->cursor+1].vz << precision, curLvl->camPath->pos << precision) >> precision ); // Ony move cam if position is between first curLvl->camPath->vx and last curLvl->camPath->vx - if ( camAngleToAct->vy < -50 && camera->pos->vx > curLvl->camPath->points[curLvl->camPath->len - 1].vx ) { + if ( dc_actorRot->vy < -50 && dc_camPos->vx > curLvl->camPath->points[curLvl->camPath->len - 1].vx ) { // Clamp curLvl->camPath position to cameraSpeed curLvl->camPath->pos += dist < cameraSpeed ? 0 : cameraSpeed ; } - if ( camAngleToAct->vy > 50 && camera->pos->vx > curLvl->camPath->points[curLvl->camPath->cursor].vx ) { + if ( dc_actorRot->vy > 50 && dc_camPos->vx > curLvl->camPath->points[curLvl->camPath->cursor].vx ) { curLvl->camPath->pos -= dist < cameraSpeed ? 0 : cameraSpeed; } // If camera has reached next key pos, reset pos index, move cursor to next key pos diff --git a/src/graphics.c b/src/graphics.c index 587d083..a655aa0 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -163,23 +163,22 @@ void set3Prism(POLY_GT3 * poly, MESH * mesh, DRAWENV * draw, char * db, int i){ //~ if (fixed_BGS){ //~ ( (POLY_GT3 *) poly )->tpage = getTPage( 0, 0, 320, 0 ); //~ } - ( (POLY_GT3 *) poly )->tpage = getTPage( 2, 0, - draw[*db].clip.x, - draw[*db].clip.y - ); + setTPage( poly, 2, 0, 0, !(*db)<<8); + //~ SetShadeTex( poly, 1 ); + // Use projected coordinates (results from RotAverage...) as UV coords and clamp them to 0-255,0-224 -> 240 - 16 setUV3( poly, - (poly->x0 < 0 ? 0 : poly->x0 > 255 ? 255 : poly->x0), - (poly->y0 < 0 ? 0 : poly->y0 > 224 ? 224 : poly->y0), - (poly->x1 < 0 ? 0 : poly->x1 > 255 ? 255 : poly->x1), - (poly->y1 < 0 ? 0 : poly->y1 > 224 ? 224 : poly->y1), - (poly->x2 < 0 ? 0 : poly->x2 > 255 ? 255 : poly->x2), - (poly->y2 < 0 ? 0 : poly->y2 > 224 ? 224 : poly->y2) + (poly->x0 < 0 ? 0 : (poly->x0 + 4) > 255 ? 255 : (poly->x0 + 4) ), + (poly->y0 < 0 ? 0 : (poly->y0 + 4) > 224 ? 224 : (poly->y0 + 4) ), + (poly->x1 < 0 ? 0 : (poly->x1 + 4) > 255 ? 255 : (poly->x1 + 4) ), + (poly->y1 < 0 ? 0 : (poly->y1 + 4) > 224 ? 224 : (poly->y1 + 4) ), + (poly->x2 < 0 ? 0 : (poly->x2 + 4) > 255 ? 255 :( poly->x2 + 4) ), + (poly->y2 < 0 ? 0 :( poly->y2 + 4) > 224 ? 224 : (poly->y2 + 4) ) ); - setRGB0(poly, mesh->tmesh->c[i].r, mesh->tmesh->c[i].g, mesh->tmesh->c[i].b); - setRGB1(poly, mesh->tmesh->c[i+2].r, mesh->tmesh->c[i+2].g, mesh->tmesh->c[i+2].b); - setRGB2(poly, mesh->tmesh->c[i+1].r, mesh->tmesh->c[i+1].g, mesh->tmesh->c[i+1].b); + //~ setRGB0(poly, mesh->tmesh->c[i].r, mesh->tmesh->c[i].g, mesh->tmesh->c[i].b); + //~ setRGB1(poly, mesh->tmesh->c[i+2].r, mesh->tmesh->c[i+2].g, mesh->tmesh->c[i+2].b); + //~ setRGB2(poly, mesh->tmesh->c[i+1].r, mesh->tmesh->c[i+1].g, mesh->tmesh->c[i+1].b); }; void set4Prism(POLY_GT4 * poly4, MESH * mesh, DRAWENV * draw, char * db, int i){ ( (POLY_GT4 *) poly4)->tpage = getTPage( 2, 0, diff --git a/src/main.c b/src/main.c index 3bee72e..5ddbf66 100644 --- a/src/main.c +++ b/src/main.c @@ -25,7 +25,7 @@ #include "../include/graphics.h" #include "../include/space.h" -//~ #define USECD +#define USECD // START OVERLAY extern u_long load_all_overlays_here; @@ -74,7 +74,7 @@ int camMode = ACTOR; // Cam mode, see defines.h, l.6 VECTOR angle = {250,0,0,0}; VECTOR angleCam = {0,0,0,0}; VECTOR posToActor = {0, 0, 0, 0}; // position of camera relative to actor -VECTOR camAngleToAct = {0, 0, 0, 0}; // rotation angles for the camera to point at actor +VECTOR * camAngleToAct; // rotation angles for the camera to point at actor int dist = 150; int lerping = 0; short curCamAngle = 0; @@ -93,6 +93,7 @@ short forceApplied = 0; void callback(); // variable FPS ulong oldTime = 0; +int dt = 0; // Physics/collisions short physics = 1; VECTOR col = {0}; @@ -107,6 +108,7 @@ int main() { camera.mat = dc_camMat; camera.pos = dc_camPos; camera.rot = dc_camRot; + camAngleToAct = dc_actorRot; // Load level file according to level, l.39 if ( level == 0 ){ overlayFile = "\\level0.bin;1"; @@ -164,10 +166,13 @@ int main() { curCamAngle = 1; } } + oldTime = GetRCnt(RCntCNT1); // Main loop while ( VSync(VSYNC) ) { - oldTime = VSync(-1); - //~ timeS = VSync(-1) / 60; + + dt = GetRCnt(RCntCNT1) - oldTime; + oldTime = GetRCnt(RCntCNT1); + // Check if level has changed // TODO : Proper level system / loader if ( levelWas != level ){ @@ -198,14 +203,14 @@ int main() { setLightEnv(draw, curLvl.BGc, curLvl.BKc); levelWas = level; } - FntPrint("Ovl:%s\nLvl : %x\nLvl: %d %d \n%x", overlayFile, &level, level, levelWas, loadLvl); + //~ FntPrint("Ovl:%s\nLvl : %x\nLvl: %d %d \n%x", overlayFile, &level, level, levelWas, loadLvl); // atime is used for animations timing timediv = 1; // If timediv is > 1, animation time will be slower if (time % timediv == 0){ atime ++; } - // Spatial partitioning + // Spatial partitioning if (curLvl.curNode){ for ( int msh = 0; msh < curLvl.curNode->siblings->index; msh ++ ) { // Actor @@ -228,7 +233,7 @@ int main() { // if(time%1 == 0){ for ( int k = 0; k < *curLvl.meshes_length; k ++ ) { if ( curLvl.meshes[k]->isRigidBody == 1 ) { - applyAcceleration( curLvl.meshes[k]->body , oldTime); + applyAcceleration( curLvl.meshes[k]->body); // Get col between actor and level if ( curLvl.meshes[k]->isActor ){ checkBodyCol( curLvl.meshes[k]->body , curLvl.levelPtr->body ); @@ -264,19 +269,22 @@ int main() { // Clear Secondary OT ClearOTagR(ot[db], OTLEN); // Set camera according to mode - setCameraMode(&curLvl, &camera, &camAngleToAct, &posToActor, &angle, &angleCam, curCamAngle, camMode, &lerping); + setCameraMode(&curLvl, &camera, &posToActor, &angle, &angleCam, curCamAngle, camMode, &lerping); // Render scene renderScene(&curLvl, &camera, &camMode, &nextpri, ot[db], otdisc[db], &db, &draw[db], curCamAngle, atime); // Set camera // Get position of cam relative to actor addVector2(&curLvl.actorPtr->pos, camera.pos, &posToActor); // Angle between camera and actor - // using atantable (faster) - camAngleToAct.vy = (patan(-posToActor.vx, -posToActor.vz) / 16) - 3076 ; - camAngleToAct.vx = (patan(dist, posToActor.vy) >> 4 ) - 256; - camera.rot->vy = camAngleToAct.vy; - // using csin/ccos, no need for theta - camera.rot->vx = camAngleToAct.vx; + applyVector( dc_actorRot, + (patan(dist, posToActor.vy) >> 4 ) - 256, + (patan(-posToActor.vx, -posToActor.vz) / 16) - 3076, + 0, + = + ); + // Point camera at actor unless camMode == FIXED + if (camMode!=2){ copyVector(dc_camRot, dc_actorRot); } + // applyCamera(&camera); // Find Actor's forward vector @@ -290,9 +298,8 @@ int main() { AddPrims(otdisc[db], ot[db] + OTLEN - 1, ot[db]); FntPrint("\nTime : %d\n", time); - //~ FntPrint("Ticks : %d %d \n", oldTime, VSync(-1)-oldTime); - FntPrint("cam : %d \n", camMode); FntPrint("#Tri : %d\n", triCount); + FntPrint("#RCnt : %d %d\n", oldTime, dt); FntFlush(-1); display( &disp[db], &draw[db], otdisc[db], primbuff[db], &nextpri, &db); } @@ -390,29 +397,29 @@ void callback() { } if (theControllers[0].type == 0x73){ // Analog stick L up - if ( theControllers[0].analog3 >= 0 && theControllers[0].analog3 < 108 ) { + if ( theControllers[0].analog3 >= 0 && theControllers[0].analog3 < (128 - DS_DZ/2)) { curLvl.actorPtr->body->gForce.vz = getVectorTo(fVecActor, curLvl.actorPtr->pos).vz * (128 - theControllers[0].analog3 ) >> 14 ; curLvl.actorPtr->body->gForce.vx = -getVectorTo(fVecActor, curLvl.actorPtr->pos).vx * (128 - theControllers[0].analog3 ) >> 14 ; lastPad = PADL; } // Analog stick L down - if ( theControllers[0].analog3 > 168 && theControllers[0].analog3 <= 255 ) { + if ( theControllers[0].analog3 > (128 + DS_DZ/2) && theControllers[0].analog3 <= 255 ) { curLvl.actorPtr->body->gForce.vz = -getVectorTo(fVecActor, curLvl.actorPtr->pos).vz * ( theControllers[0].analog3 - 128 ) >> 14 ; curLvl.actorPtr->body->gForce.vx = getVectorTo(fVecActor, curLvl.actorPtr->pos).vx * ( theControllers[0].analog3 - 128 ) >> 14 ; lastPad = PADL; } // Analog stick L dead zone - if ( theControllers[0].analog3 > 108 && theControllers[0].analog3 < 148 ) { + if ( theControllers[0].analog3 > (128 - DS_DZ/2) && theControllers[0].analog3 < (128 + DS_DZ/2) ) { curLvl.actorPtr->body->gForce.vz = 0; curLvl.actorPtr->body->gForce.vx = 0; } // Analog stick L left - if ( theControllers[0].analog2 >= 0 && theControllers[0].analog2 < 108 ) { - curLvl.actorPtr->rot.vy -= ( 40 * ( 128 - theControllers[0].analog2 ) ) >> 7 ; + if ( theControllers[0].analog2 >= 0 && theControllers[0].analog2 < (128 - DS_DZ/2) ) { + curLvl.actorPtr->rot.vy -= ( 64 * ( 128 - theControllers[0].analog2 ) ) >> 7 ; } // Analog stick L right - if ( theControllers[0].analog2 > 148 && theControllers[0].analog2 <= 255 ) { - curLvl.actorPtr->rot.vy += ( 40 * ( theControllers[0].analog2 - 128 ) ) >> 7 ; + if ( theControllers[0].analog2 > (128 + DS_DZ/2) && theControllers[0].analog2 <= 255 ) { + curLvl.actorPtr->rot.vy += ( 64 * ( theControllers[0].analog2 - 128 ) ) >> 7 ; } } if ( PADL & PadUp ) { @@ -436,11 +443,11 @@ void callback() { lastPad = PADL; } if ( PADL & PadLeft ) { - curLvl.actorPtr->rot.vy -= 32; + curLvl.actorPtr->rot.vy -= 64; lastPad = PADL; } if ( PADL & PadRight ) { - curLvl.actorPtr->rot.vy += 32; + curLvl.actorPtr->rot.vy += 64; lastPad = PADL; } if ( PADL & PadSelect && !timer ) { @@ -460,19 +467,19 @@ void callback() { if( theControllers[0].type == 0x73 && camMode == 0){ // Cam control - horizontal if ( theControllers[0].analog0 >= 0 && theControllers[0].analog0 < (128 - DS_DZ/2) ) { - angleCam.vy -= ( 16 * ( 128 - theControllers[0].analog0 ) ) >> 7 ; + angleCam.vy += ( 16 * ( 128 - theControllers[0].analog0 ) ) >> 7 ; angleCamTimer = 120; } if ( theControllers[0].analog0 > (128 + DS_DZ/2) && theControllers[0].analog0 <= 255 ) { - angleCam.vy += ( 16 * ( theControllers[0].analog0 - 128 ) ) >> 7 ; + angleCam.vy -= ( 16 * ( theControllers[0].analog0 - 128 ) ) >> 7 ; angleCamTimer = 120; } if ( theControllers[0].analog0 >= 0 && theControllers[0].analog0 < (128 - DS_DZ/2) ) { - angleCam.vy -= ( 16 * ( 128 - theControllers[0].analog0 ) ) >> 7 ; + angleCam.vy += ( 16 * ( 128 - theControllers[0].analog0 ) ) >> 7 ; angleCamTimer = 120; } if ( theControllers[0].analog0 > (128 + DS_DZ/2) && theControllers[0].analog0 <= 255) { - angleCam.vy += ( 16 * ( theControllers[0].analog0 - 128 ) ) >> 7 ; + angleCam.vy -= ( 16 * ( theControllers[0].analog0 - 128 ) ) >> 7 ; angleCamTimer = 120; } // Timer to lerp cam back behind actor diff --git a/src/physics.c b/src/physics.c index 31d2b18..93eabb9 100644 --- a/src/physics.c +++ b/src/physics.c @@ -126,19 +126,19 @@ void applyAngMom(LEVEL curLvl ){ } } }; -void applyAcceleration(BODY * actor, ulong oldTime){ - short dt = VSync(-1) - oldTime ; - //~ short dt = 3; - if (dt < 1) { dt = 1; } - VECTOR acceleration = {actor->invMass * actor->gForce.vx , (actor->invMass * actor->gForce.vy) + (GRAVITY * ONE), actor->invMass * actor->gForce.vz}; +void applyAcceleration(BODY * actor){ + //~ short dt = VSync(-1) - oldTime ; + short dt = 1; + //~ if (dt < 1) { dt = 1; } + VECTOR acceleration = {actor->invMass * actor->gForce.vx , (actor->invMass * actor->gForce.vy) + (GRAVITY * ONE), actor->invMass * actor->gForce.vz}; //~ FntPrint("acc: %d %d %d\n", acceleration.vx, acceleration.vy, acceleration.vz ); - actor->velocity.vx += (acceleration.vx * (ONE / dt) ) >> 24; - actor->velocity.vy += (acceleration.vy * (ONE / dt) ) >> 24; - actor->velocity.vz += (acceleration.vz * (ONE / dt) ) >> 24; + actor->velocity.vx += (acceleration.vx * dt) >> 12; + actor->velocity.vy += (acceleration.vy * dt) >> 12; + actor->velocity.vz += (acceleration.vz * dt) >> 12; //~ FntPrint("acc: %d %d %d\n", acceleration.vx / ONE, acceleration.vy / ONE, acceleration.vz / ONE ); - actor->position.vx += (actor->velocity.vx * (ONE / dt) ) >> 12; - actor->position.vy += (actor->velocity.vy * (ONE / dt) ) >> 12; - actor->position.vz += (actor->velocity.vz * (ONE / dt) ) >> 12; + actor->position.vx += (actor->velocity.vx * dt); + actor->position.vy += (actor->velocity.vy * dt); + actor->position.vz += (actor->velocity.vz * dt); //~ FntPrint("vel: %d %d %d\n", actor->velocity.vx, actor->velocity.vy, actor->velocity.vz ); }; //~ // https://gamedevelopment.tutsplus.com/tutorials/how-to-create-a-custom-2d-physics-engine-the-basics-and-impulse-resolution--gamedev-6331