mirror of
https://github.com/XProger/OpenLara.git
synced 2025-02-24 15:32:30 +01:00
#3 tilt control
This commit is contained in:
parent
ff6e3f8ece
commit
f9324e6543
@ -31,7 +31,7 @@ struct Controller {
|
|||||||
DEATH = 1 << 9 };
|
DEATH = 1 << 9 };
|
||||||
|
|
||||||
float animTime;
|
float animTime;
|
||||||
int animIndex;
|
int animIndex, animPrev;
|
||||||
int animPrevFrame;
|
int animPrevFrame;
|
||||||
|
|
||||||
vec3 pos, velocity;
|
vec3 pos, velocity;
|
||||||
@ -61,6 +61,7 @@ struct Controller {
|
|||||||
angle = vec3(0.0f, e.rotation, 0.0f);
|
angle = vec3(0.0f, e.rotation, 0.0f);
|
||||||
stand = STAND_GROUND;
|
stand = STAND_GROUND;
|
||||||
animIndex = e.modelIndex > 0 ? getModel().animation : 0;
|
animIndex = e.modelIndex > 0 ? getModel().animation : 0;
|
||||||
|
animPrev = animIndex;
|
||||||
state = level->anims[animIndex].state;
|
state = level->anims[animIndex].state;
|
||||||
TR::Model &model = getModel();
|
TR::Model &model = getModel();
|
||||||
}
|
}
|
||||||
@ -92,6 +93,11 @@ struct Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getFramesCount(int animIndex) {
|
||||||
|
TR::Animation &anim = level->anims[animIndex];
|
||||||
|
return (anim.frameEnd - anim.frameStart) / anim.frameRate + 1;
|
||||||
|
}
|
||||||
|
|
||||||
int getFrameIndex(int animIndex, float t) {
|
int getFrameIndex(int animIndex, float t) {
|
||||||
TR::Animation &anim = level->anims[animIndex];
|
TR::Animation &anim = level->anims[animIndex];
|
||||||
return int(t * 30.0f / anim.frameRate) % ((anim.frameEnd - anim.frameStart) / anim.frameRate + 1);
|
return int(t * 30.0f / anim.frameRate) % ((anim.frameEnd - anim.frameStart) / anim.frameRate + 1);
|
||||||
@ -214,6 +220,7 @@ struct Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int setAnimation(int index, int frame = 0) {
|
int setAnimation(int index, int frame = 0) {
|
||||||
|
animPrev = animIndex;
|
||||||
animIndex = index;
|
animIndex = index;
|
||||||
TR::Animation &anim = level->anims[animIndex];
|
TR::Animation &anim = level->anims[animIndex];
|
||||||
animTime = (frame <= 0 ? -frame : (frame - anim.frameStart)) / 30.0f;
|
animTime = (frame <= 0 ? -frame : (frame - anim.frameStart)) / 30.0f;
|
||||||
|
86
src/lara.h
86
src/lara.h
@ -6,13 +6,12 @@
|
|||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
#include "trigger.h"
|
#include "trigger.h"
|
||||||
|
|
||||||
#define FAST_TURN_TIME 1.0f
|
|
||||||
|
|
||||||
#define TURN_FAST PI
|
#define TURN_FAST PI
|
||||||
#define TURN_FAST_BACK PI * 3.0f / 4.0f
|
#define TURN_FAST_BACK PI * 3.0f / 4.0f
|
||||||
#define TURN_NORMAL PI / 2.0f
|
#define TURN_NORMAL PI / 2.0f
|
||||||
#define TURN_SLOW PI / 3.0f
|
#define TURN_SLOW PI / 3.0f
|
||||||
#define TURN_TILT PI / 18.0f
|
#define TILT_MAX (PI / 18.0f)
|
||||||
|
#define TILT_SPEED TILT_MAX
|
||||||
#define TURN_WATER_FAST PI * 3.0f / 4.0f
|
#define TURN_WATER_FAST PI * 3.0f / 4.0f
|
||||||
#define TURN_WATER_SLOW PI * 2.0f / 3.0f
|
#define TURN_WATER_SLOW PI * 2.0f / 3.0f
|
||||||
#define GLIDE_SPEED 50.0f
|
#define GLIDE_SPEED 50.0f
|
||||||
@ -196,9 +195,9 @@ struct Lara : Controller {
|
|||||||
quat rotHead, rotChest;
|
quat rotHead, rotChest;
|
||||||
|
|
||||||
int health;
|
int health;
|
||||||
float turnTime;
|
float tilt;
|
||||||
|
|
||||||
Lara(TR::Level *level, int entity) : Controller(level, entity), wpnCurrent(Weapon::EMPTY), wpnNext(Weapon::EMPTY), chestOffset(pos), target(-1), health(100), turnTime(0.0f) {
|
Lara(TR::Level *level, int entity) : Controller(level, entity), wpnCurrent(Weapon::EMPTY), wpnNext(Weapon::EMPTY), chestOffset(pos), target(-1), health(100), tilt(0.0f) {
|
||||||
initMeshOverrides();
|
initMeshOverrides();
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
arms[i].shotTimer = MUZZLE_FLASH_TIME + 1.0f;
|
arms[i].shotTimer = MUZZLE_FLASH_TIME + 1.0f;
|
||||||
@ -1176,18 +1175,6 @@ struct Lara : Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// hit test
|
|
||||||
if (animIndex != ANIM_HIT_FRONT)
|
|
||||||
for (int i = 0; i < level->entitiesCount; i++) {
|
|
||||||
TR::Entity &e = level->entities[i];
|
|
||||||
if (e.id != ENTITY_ENEMY_WOLF) continue;
|
|
||||||
vec3 v = vec3(e.x, e.y, e.z) - pos;
|
|
||||||
if (v.length2() < 128 * 128) {
|
|
||||||
return setAnimation(ANIM_HIT_FRONT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if ( (mask & (FORTH | BACK)) == (FORTH | BACK) && (state == STATE_STOP || state == STATE_RUN) )
|
if ( (mask & (FORTH | BACK)) == (FORTH | BACK) && (state == STATE_STOP || state == STATE_RUN) )
|
||||||
return setAnimation(ANIM_STAND_ROLL_BEGIN);
|
return setAnimation(ANIM_STAND_ROLL_BEGIN);
|
||||||
|
|
||||||
@ -1239,8 +1226,14 @@ struct Lara : Controller {
|
|||||||
// only dpad buttons pressed
|
// only dpad buttons pressed
|
||||||
if (mask & FORTH) return STATE_RUN;
|
if (mask & FORTH) return STATE_RUN;
|
||||||
if (mask & BACK) return STATE_FAST_BACK;
|
if (mask & BACK) return STATE_FAST_BACK;
|
||||||
if (mask & LEFT) return turnTime < FAST_TURN_TIME ? STATE_TURN_LEFT : STATE_FAST_TURN;
|
if (mask & (LEFT | RIGHT)) {
|
||||||
if (mask & RIGHT) return turnTime < FAST_TURN_TIME ? STATE_TURN_RIGHT : STATE_FAST_TURN;
|
if (state == STATE_FAST_TURN)
|
||||||
|
return state;
|
||||||
|
|
||||||
|
if (mask & LEFT) return (state == STATE_TURN_LEFT && animPrev == animIndex) ? STATE_FAST_TURN : STATE_TURN_LEFT;
|
||||||
|
if (mask & RIGHT) return (state == STATE_TURN_RIGHT && animPrev == animIndex) ? STATE_FAST_TURN : STATE_TURN_RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
return STATE_STOP;
|
return STATE_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1411,44 +1404,49 @@ struct Lara : Controller {
|
|||||||
lState = false;
|
lState = false;
|
||||||
#endif
|
#endif
|
||||||
// calculate turn tilt
|
// calculate turn tilt
|
||||||
if (state == STATE_RUN && (mask & (LEFT | RIGHT))) {
|
if (state == STATE_RUN && (mask & (LEFT | RIGHT)) && (tilt == 0.0f || (tilt < 0.0f && (mask & LEFT)) || (tilt > 0.0f && (mask & RIGHT)))) {
|
||||||
if (mask & LEFT) angle.z -= Core::deltaTime * TURN_TILT;
|
if (mask & LEFT) tilt -= TILT_SPEED * Core::deltaTime;
|
||||||
if (mask & RIGHT) angle.z += Core::deltaTime * TURN_TILT;
|
if (mask & RIGHT) tilt += TILT_SPEED * Core::deltaTime;
|
||||||
angle.z = clamp(angle.z, -TURN_TILT, TURN_TILT);
|
|
||||||
} else
|
} else
|
||||||
angle.z -= angle.z * min(Core::deltaTime * 8.0f, 1.0f);
|
if (fabsf(tilt) > 0.01f)
|
||||||
|
tilt -= sign(tilt) * TILT_SPEED * 4.0f * Core::deltaTime;
|
||||||
|
else
|
||||||
|
tilt = 0.0f;
|
||||||
|
tilt = clamp(tilt, -TILT_MAX, TILT_MAX);
|
||||||
|
|
||||||
|
angle.z = tilt;
|
||||||
|
|
||||||
if (state == STATE_TURN_LEFT || state == STATE_TURN_RIGHT || state == STATE_FAST_TURN)
|
|
||||||
turnTime += Core::deltaTime;
|
|
||||||
else
|
|
||||||
turnTime = 0.0f;
|
|
||||||
|
|
||||||
// get turning angle
|
// get turning angle
|
||||||
float w = 0.0f;
|
float w = (mask & LEFT) ? -1.0f : ((mask & RIGHT) ? 1.0f : 0.0f);
|
||||||
|
|
||||||
if (state == STATE_SWIM || state == STATE_GLIDE)
|
if (state == STATE_SWIM || state == STATE_GLIDE)
|
||||||
w = TURN_WATER_FAST;
|
w *= TURN_WATER_FAST;
|
||||||
else if (state == STATE_TREAD || state == STATE_SURF_TREAD || state == STATE_SURF_SWIM || state == STATE_SURF_BACK)
|
else if (state == STATE_TREAD || state == STATE_SURF_TREAD || state == STATE_SURF_SWIM || state == STATE_SURF_BACK)
|
||||||
w = TURN_WATER_SLOW;
|
w *= TURN_WATER_SLOW;
|
||||||
else if (state == STATE_RUN || state == STATE_FAST_TURN)
|
else if (state == STATE_RUN)
|
||||||
w = TURN_FAST; // TODO: modulate angular speed by turnTime factor
|
w *= sign(w) != sign(tilt) ? 0.0f : w * TURN_FAST * tilt / TILT_MAX;
|
||||||
|
else if (state == STATE_FAST_TURN)
|
||||||
|
w *= TURN_FAST;
|
||||||
else if (state == STATE_FAST_BACK)
|
else if (state == STATE_FAST_BACK)
|
||||||
w = TURN_FAST_BACK;
|
w *= TURN_FAST_BACK;
|
||||||
else if (state == STATE_TURN_LEFT || state == STATE_TURN_RIGHT || state == STATE_WALK)
|
else if (state == STATE_TURN_LEFT || state == STATE_TURN_RIGHT || state == STATE_WALK)
|
||||||
w = TURN_NORMAL;
|
w *= TURN_NORMAL;
|
||||||
else if (state == STATE_FORWARD_JUMP || state == STATE_BACK)
|
else if (state == STATE_FORWARD_JUMP || state == STATE_BACK)
|
||||||
w = TURN_SLOW;
|
w *= TURN_SLOW;
|
||||||
|
else
|
||||||
|
w = 0.0f;
|
||||||
|
|
||||||
if (w != 0.0f) {
|
if (w != 0.0f) {
|
||||||
w *= Core::deltaTime;
|
w *= Core::deltaTime;
|
||||||
// yaw
|
angle.y += w;
|
||||||
if (mask & LEFT) { angle.y -= w; velocity = velocity.rotateY(+w); }
|
velocity = velocity.rotateY(-w);
|
||||||
if (mask & RIGHT) { angle.y += w; velocity = velocity.rotateY(-w); }
|
}
|
||||||
// pitch (underwater only)
|
|
||||||
if (stand == STAND_UNDERWATER && (mask & (FORTH | BACK)) ) {
|
// pitch (underwater only)
|
||||||
angle.x += ((mask & FORTH) ? -w : w) * 0.5f;
|
if (stand == STAND_UNDERWATER && (mask & (FORTH | BACK)) ) {
|
||||||
angle.x = clamp(angle.x, -PI * 0.5f, PI * 0.5f);
|
angle.x += ((mask & FORTH) ? -TURN_WATER_SLOW : TURN_WATER_SLOW) * 0.5f * Core::deltaTime;
|
||||||
}
|
angle.x = clamp(angle.x, -PI * 0.5f, PI * 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get animation direction
|
// get animation direction
|
||||||
|
Loading…
x
Reference in New Issue
Block a user