1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-02-25 07:52:43 +01:00

Lara's joints names and masks refactoring

This commit is contained in:
XProger 2018-10-15 04:23:05 +03:00
parent 9b40610cef
commit bedc0df6ca

View File

@ -56,25 +56,6 @@
#define DESCENT_SPEED 2048.0f #define DESCENT_SPEED 2048.0f
#define TARGET_MAX_DIST (8.0f * 1024.0f) #define TARGET_MAX_DIST (8.0f * 1024.0f)
enum {
LARA_JOINT_HIPS = 0,
LARA_JOINT_THIGH_L,
LARA_JOINT_CALF_L,
LARA_JOINT_FOOT_L,
LARA_JOINT_THIGH_R,
LARA_JOINT_CALF_R,
LARA_JOINT_FOOT_R,
LARA_JOINT_CHEST,
LARA_JOINT_UPPER_ARM_R,
LARA_JOINT_LOWER_ARM_R,
LARA_JOINT_HAND_R,
LARA_JOINT_UPPER_ARM_L,
LARA_JOINT_LOWER_ARM_L,
LARA_JOINT_HAND_L,
LARA_JOINT_HEAD,
LARA_JOINT_COUNT
};
struct Lara : Character { struct Lara : Character {
// http://www.tombraiderforums.com/showthread.php?t=148859 // http://www.tombraiderforums.com/showthread.php?t=148859
@ -210,28 +191,47 @@ struct Lara : Character {
#define LARA_LGUN_OFFSET vec3( 10, -50, 0) #define LARA_LGUN_OFFSET vec3( 10, -50, 0)
enum { enum {
BODY_HIP = 0x0001, JOINT_HIPS = 0,
BODY_LEG_L1 = 0x0002, JOINT_LEG_L1,
BODY_LEG_L2 = 0x0004, JOINT_LEG_L2,
BODY_LEG_L3 = 0x0008, JOINT_LEG_L3,
BODY_LEG_R1 = 0x0010, JOINT_LEG_R1,
BODY_LEG_R2 = 0x0020, JOINT_LEG_R2,
BODY_LEG_R3 = 0x0040, JOINT_LEG_R3,
BODY_CHEST = 0x0080, JOINT_CHEST,
BODY_ARM_R1 = 0x0100, JOINT_ARM_R1,
BODY_ARM_R2 = 0x0200, JOINT_ARM_R2,
BODY_ARM_R3 = 0x0400, JOINT_ARM_R3,
BODY_ARM_L1 = 0x0800, JOINT_ARM_L1,
BODY_ARM_L2 = 0x1000, JOINT_ARM_L2,
BODY_ARM_L3 = 0x2000, JOINT_ARM_L3,
BODY_HEAD = 0x4000, JOINT_HEAD,
BODY_ARM_L = BODY_ARM_L1 | BODY_ARM_L2 | BODY_ARM_L3, JOINT_MAX
BODY_ARM_R = BODY_ARM_R1 | BODY_ARM_R2 | BODY_ARM_R3, };
BODY_LEG_L = BODY_LEG_L1 | BODY_LEG_L2 | BODY_LEG_L3,
BODY_LEG_R = BODY_LEG_R1 | BODY_LEG_R2 | BODY_LEG_R3, enum {
BODY_UPPER = BODY_CHEST | BODY_ARM_L | BODY_ARM_R, // without head JOINT_MASK_HIPS = 1 << JOINT_HIPS,
BODY_LOWER = BODY_HIP | BODY_LEG_L | BODY_LEG_R, JOINT_MASK_LEG_L1 = 1 << JOINT_LEG_L1,
BODY_BRAID_MASK = BODY_HEAD | BODY_CHEST | BODY_ARM_L1 | BODY_ARM_L2 | BODY_ARM_R1 | BODY_ARM_R2, JOINT_MASK_LEG_L2 = 1 << JOINT_LEG_L2,
JOINT_MASK_LEG_L3 = 1 << JOINT_LEG_L3,
JOINT_MASK_LEG_R1 = 1 << JOINT_LEG_R1,
JOINT_MASK_LEG_R2 = 1 << JOINT_LEG_R2,
JOINT_MASK_LEG_R3 = 1 << JOINT_LEG_R3,
JOINT_MASK_CHEST = 1 << JOINT_CHEST,
JOINT_MASK_ARM_R1 = 1 << JOINT_ARM_R1,
JOINT_MASK_ARM_R2 = 1 << JOINT_ARM_R2,
JOINT_MASK_ARM_R3 = 1 << JOINT_ARM_R3,
JOINT_MASK_ARM_L1 = 1 << JOINT_ARM_L1,
JOINT_MASK_ARM_L2 = 1 << JOINT_ARM_L2,
JOINT_MASK_ARM_L3 = 1 << JOINT_ARM_L3,
JOINT_MASK_HEAD = 1 << JOINT_HEAD,
JOINT_MASK_ARM_L = JOINT_MASK_ARM_L1 | JOINT_MASK_ARM_L2 | JOINT_MASK_ARM_L3,
JOINT_MASK_ARM_R = JOINT_MASK_ARM_R1 | JOINT_MASK_ARM_R2 | JOINT_MASK_ARM_R3,
JOINT_MASK_LEG_L = JOINT_MASK_LEG_L1 | JOINT_MASK_LEG_L2 | JOINT_MASK_LEG_L3,
JOINT_MASK_LEG_R = JOINT_MASK_LEG_R1 | JOINT_MASK_LEG_R2 | JOINT_MASK_LEG_R3,
JOINT_MASK_UPPER = JOINT_MASK_CHEST | JOINT_MASK_ARM_L | JOINT_MASK_ARM_R, // without head
JOINT_MASK_LOWER = JOINT_MASK_HIPS | JOINT_MASK_LEG_L | JOINT_MASK_LEG_R,
JOINT_MASK_BRAID = JOINT_MASK_HEAD | JOINT_MASK_CHEST | JOINT_MASK_ARM_L1 | JOINT_MASK_ARM_L2 | JOINT_MASK_ARM_R1 | JOINT_MASK_ARM_R2,
}; };
bool dozy; bool dozy;
@ -377,7 +377,7 @@ struct Lara : Character {
lara->updateJoints(); lara->updateJoints();
for (int i = 0; i < model->mCount; i++) { for (int i = 0; i < model->mCount; i++) {
if (!(BODY_BRAID_MASK & (1 << i))) continue; if (!(JOINT_MASK_BRAID & (1 << i))) continue;
int offset = level->meshOffsets[model->mStart + i]; int offset = level->meshOffsets[model->mStart + i];
TR::Mesh *mesh = (TR::Mesh*)&level->meshes[offset]; TR::Mesh *mesh = (TR::Mesh*)&level->meshes[offset];
@ -462,8 +462,8 @@ struct Lara : Character {
if (level->extra.laraSkin > -1) if (level->extra.laraSkin > -1)
level->entities[entity].modelIndex = level->extra.laraSkin + 1; level->entities[entity].modelIndex = level->extra.laraSkin + 1;
jointChest = LARA_JOINT_CHEST; jointChest = JOINT_CHEST;
jointHead = LARA_JOINT_HEAD; jointHead = JOINT_HEAD;
rangeChest = vec4(-0.50f, 0.50f, -0.95f, 0.95f) * PI; rangeChest = vec4(-0.50f, 0.50f, -0.95f, 0.95f) * PI;
rangeHead = vec4(-0.30f, 0.30f, -0.55f, 0.55f) * PI; rangeHead = vec4(-0.30f, 0.30f, -0.55f, 0.55f) * PI;
@ -482,7 +482,7 @@ struct Lara : Character {
if (level->isHome()) { if (level->isHome()) {
if (level->version & TR::VER_TR1) if (level->version & TR::VER_TR1)
meshSwap(1, TR::MODEL_LARA_SPEC, BODY_UPPER | BODY_LOWER); meshSwap(1, TR::MODEL_LARA_SPEC, JOINT_MASK_UPPER | JOINT_MASK_LOWER);
} else { } else {
if (level->id == TR::LVL_TR2_HOUSE) if (level->id == TR::LVL_TR2_HOUSE)
wpnSet(TR::Entity::SHOTGUN); wpnSet(TR::Entity::SHOTGUN);
@ -629,7 +629,7 @@ struct Lara : Character {
wpnDraw(true); wpnDraw(true);
if (itemHolster != TR::Entity::NONE) if (itemHolster != TR::Entity::NONE)
meshSwap(1, level->extra.weapons[itemHolster], BODY_LEG_L1 | BODY_LEG_R1); meshSwap(1, level->extra.weapons[itemHolster], JOINT_MASK_LEG_L1 | JOINT_MASK_LEG_R1);
} }
int getRoomByPos(const vec3 &pos) { int getRoomByPos(const vec3 &pos) {
@ -742,16 +742,16 @@ struct Lara : Character {
case TR::Entity::MAGNUMS : case TR::Entity::MAGNUMS :
case TR::Entity::UZIS : case TR::Entity::UZIS :
switch (wState) { switch (wState) {
case Weapon::IS_HIDDEN : mask = BODY_LEG_L1 | BODY_LEG_R1; break; case Weapon::IS_HIDDEN : mask = JOINT_MASK_LEG_L1 | JOINT_MASK_LEG_R1; break;
case Weapon::IS_ARMED : mask = BODY_ARM_L3 | BODY_ARM_R3; break; case Weapon::IS_ARMED : mask = JOINT_MASK_ARM_L3 | JOINT_MASK_ARM_R3; break;
case Weapon::IS_FIRING : mask = BODY_ARM_L3 | BODY_ARM_R3 | BODY_HEAD; break; case Weapon::IS_FIRING : mask = JOINT_MASK_ARM_L3 | JOINT_MASK_ARM_R3 | JOINT_MASK_HEAD; break;
} }
break; break;
case TR::Entity::SHOTGUN : case TR::Entity::SHOTGUN :
switch (wState) { switch (wState) {
case Weapon::IS_HIDDEN : mask = BODY_CHEST; break; case Weapon::IS_HIDDEN : mask = JOINT_MASK_CHEST; break;
case Weapon::IS_ARMED : mask = BODY_ARM_L3 | BODY_ARM_R3; break; case Weapon::IS_ARMED : mask = JOINT_MASK_ARM_L3 | JOINT_MASK_ARM_R3; break;
case Weapon::IS_FIRING : mask = BODY_ARM_L3 | BODY_ARM_R3 | BODY_HEAD; break; case Weapon::IS_FIRING : mask = JOINT_MASK_ARM_L3 | JOINT_MASK_ARM_R3 | JOINT_MASK_HEAD; break;
} }
break; break;
default : ; default : ;
@ -770,14 +770,14 @@ struct Lara : Character {
if (wpnCurrent != TR::Entity::SHOTGUN) { if (wpnCurrent != TR::Entity::SHOTGUN) {
meshSwap(1, level->extra.weapons[wpnCurrent], mask); meshSwap(1, level->extra.weapons[wpnCurrent], mask);
// have a shotgun in inventory place it on the back if another weapon is in use // have a shotgun in inventory place it on the back if another weapon is in use
meshSwap(2, level->extra.weapons[TR::Entity::SHOTGUN], game->invCount(TR::Entity::INV_SHOTGUN) ? BODY_CHEST : 0); meshSwap(2, level->extra.weapons[TR::Entity::SHOTGUN], game->invCount(TR::Entity::INV_SHOTGUN) ? JOINT_MASK_CHEST : 0);
itemHolster = (wState == Weapon::IS_HIDDEN) ? wpnCurrent : TR::Entity::NONE; itemHolster = (wState == Weapon::IS_HIDDEN) ? wpnCurrent : TR::Entity::NONE;
} else { } else {
meshSwap(2, level->extra.weapons[wpnCurrent], mask); meshSwap(2, level->extra.weapons[wpnCurrent], mask);
} }
// mesh swap to angry Lara's head while firing (from uzis model) // mesh swap to angry Lara's head while firing (from uzis model)
meshSwap(3, level->extra.weapons[TR::Entity::UZIS], (wState == Weapon::IS_FIRING) ? BODY_HEAD : 0); meshSwap(3, level->extra.weapons[TR::Entity::UZIS], (wState == Weapon::IS_FIRING) ? JOINT_MASK_HEAD : 0);
wpnState = wState; wpnState = wState;
} }
@ -1124,12 +1124,12 @@ struct Lara : Character {
void updateOverrides() { void updateOverrides() {
// Copy all current animation joints // Copy all current animation joints
for (int i = 0; i < LARA_JOINT_COUNT; i++) for (int i = 0; i < JOINT_MAX; i++)
animation.overrides[i] = animation.getJointRot(i); animation.overrides[i] = animation.getJointRot(i);
int overrideMask = 0; int overrideMask = 0;
// head & chest // head & chest
overrideMask |= BODY_CHEST | BODY_HEAD; overrideMask |= JOINT_MASK_CHEST | JOINT_MASK_HEAD;
// update hit anim // update hit anim
if (hitDir >= 0) { if (hitDir >= 0) {
@ -1144,8 +1144,8 @@ struct Lara : Character {
hitAnim.time = hitTime; hitAnim.time = hitTime;
hitAnim.updateInfo(); hitAnim.updateInfo();
overrideMask &= ~(BODY_CHEST | BODY_HEAD); overrideMask &= ~(JOINT_MASK_CHEST | JOINT_MASK_HEAD);
int hitMask = (BODY_UPPER | BODY_LOWER | BODY_HEAD) & ~overrideMask; int hitMask = (JOINT_MASK_UPPER | JOINT_MASK_LOWER | JOINT_MASK_HEAD) & ~overrideMask;
int index = 0; int index = 0;
while (hitMask) { while (hitMask) {
if (hitMask & 1) if (hitMask & 1)
@ -1155,27 +1155,26 @@ struct Lara : Character {
} }
hitTime += Core::deltaTime; hitTime += Core::deltaTime;
overrideMask = BODY_UPPER | BODY_LOWER | BODY_HEAD; overrideMask = JOINT_MASK_UPPER | JOINT_MASK_LOWER | JOINT_MASK_HEAD;
} }
// arms // arms
if (!emptyHands()) { if (!emptyHands()) {
// right arm // right arm
Arm *arm = &arms[0]; Arm *arm = &arms[0];
animation.overrides[LARA_JOINT_UPPER_ARM_R] = animation.overrides[LARA_JOINT_CHEST].inverse() * animation.overrides[LARA_JOINT_HIPS].inverse() * arm->animation.getJointRot(LARA_JOINT_UPPER_ARM_R); animation.overrides[JOINT_ARM_R1] = animation.overrides[JOINT_CHEST].inverse() * animation.overrides[JOINT_HIPS].inverse() * arm->animation.getJointRot(JOINT_ARM_R1);
animation.overrides[LARA_JOINT_LOWER_ARM_R] = arm->animation.getJointRot(LARA_JOINT_LOWER_ARM_R); animation.overrides[JOINT_ARM_R2] = arm->animation.getJointRot(JOINT_ARM_R2);
animation.overrides[LARA_JOINT_HAND_R] = arm->animation.getJointRot(LARA_JOINT_HAND_R); animation.overrides[JOINT_ARM_R3] = arm->animation.getJointRot(JOINT_ARM_R3);
// left arm // left arm
if (wpnCurrent != TR::Entity::SHOTGUN) arm = &arms[1]; if (wpnCurrent != TR::Entity::SHOTGUN) arm = &arms[1];
animation.overrides[LARA_JOINT_UPPER_ARM_L] = animation.overrides[LARA_JOINT_CHEST].inverse() * animation.overrides[LARA_JOINT_HIPS].inverse() * arm->animation.getJointRot(LARA_JOINT_UPPER_ARM_L); animation.overrides[JOINT_ARM_L1] = animation.overrides[JOINT_CHEST].inverse() * animation.overrides[JOINT_HIPS].inverse() * arm->animation.getJointRot(JOINT_ARM_L1);
animation.overrides[LARA_JOINT_LOWER_ARM_L] = arm->animation.getJointRot(LARA_JOINT_LOWER_ARM_L); animation.overrides[JOINT_ARM_L2] = arm->animation.getJointRot(JOINT_ARM_L2);
animation.overrides[LARA_JOINT_HAND_L] = arm->animation.getJointRot(LARA_JOINT_HAND_L); animation.overrides[JOINT_ARM_L3] = arm->animation.getJointRot(JOINT_ARM_L3);
overrideMask |= (BODY_ARM_R | BODY_ARM_L); overrideMask |= (JOINT_MASK_ARM_R | JOINT_MASK_ARM_L);
} } else
else overrideMask &= ~(JOINT_MASK_ARM_R | JOINT_MASK_ARM_L);
overrideMask &= ~(BODY_ARM_R | BODY_ARM_L);
animation.overrideMask = overrideMask; animation.overrideMask = overrideMask;
jointsFrame = -1; jointsFrame = -1;
@ -1225,20 +1224,20 @@ struct Lara : Character {
void aimShotgun() { void aimShotgun() {
float speed = 8.0f * Core::deltaTime; float speed = 8.0f * Core::deltaTime;
int joints[2] = { LARA_JOINT_UPPER_ARM_R, LARA_JOINT_UPPER_ARM_L }; int joints[2] = { JOINT_ARM_R1, JOINT_ARM_L1 };
bool hasAim = true; bool hasAim = true;
quat rot; quat rot;
Arm &arm = arms[0]; Arm &arm = arms[0];
if (!aim(arm.target, LARA_JOINT_UPPER_ARM_R, vec4(-PI * 0.4f, PI * 0.4f, -PI * 0.25f, PI * 0.25f), rot, &arm.rotAbs)) { if (!aim(arm.target, JOINT_ARM_R1, vec4(-PI * 0.4f, PI * 0.4f, -PI * 0.25f, PI * 0.25f), rot, &arm.rotAbs)) {
rot = quat(0, 0, 0, 1); rot = quat(0, 0, 0, 1);
arm.target = NULL; arm.target = NULL;
hasAim = false; hasAim = false;
} }
if (hasAim) if (hasAim)
rot = animation.getJointRot(LARA_JOINT_HIPS) * animation.getJointRot(LARA_JOINT_CHEST) * rot; rot = animation.getJointRot(JOINT_HIPS) * animation.getJointRot(JOINT_CHEST) * rot;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
int j = joints[i]; int j = joints[i];
@ -1251,7 +1250,7 @@ struct Lara : Character {
void aimPistols() { void aimPistols() {
float speed = 8.0f * Core::deltaTime; float speed = 8.0f * Core::deltaTime;
int joints[2] = { LARA_JOINT_UPPER_ARM_R, LARA_JOINT_UPPER_ARM_L }; int joints[2] = { JOINT_ARM_R1, JOINT_ARM_L1 };
vec4 ranges[2] = { vec4 ranges[2] = {
vec4(-PI * 0.4f, PI * 0.4f, -PI * 0.2f, PI * 0.5f), vec4(-PI * 0.4f, PI * 0.4f, -PI * 0.2f, PI * 0.5f),
@ -1274,7 +1273,7 @@ struct Lara : Character {
} }
if (hasAim) if (hasAim)
rot = animation.getJointRot(LARA_JOINT_HIPS) * animation.getJointRot(LARA_JOINT_CHEST) * rot; rot = animation.getJointRot(JOINT_HIPS) * animation.getJointRot(JOINT_CHEST) * rot;
arm.rot = arm.rot.slerp(rot, speed); arm.rot = arm.rot.slerp(rot, speed);
animation.overrides[j] = arm.rot * animation.overrides[j]; animation.overrides[j] = arm.rot * animation.overrides[j];
@ -1457,9 +1456,9 @@ struct Lara : Character {
} }
void drawGun(int right) { void drawGun(int right) {
int mask = (right ? BODY_ARM_R3 : BODY_ARM_L3); // unholster int mask = (right ? JOINT_MASK_ARM_R3 : JOINT_MASK_ARM_L3); // unholster
if (layers[1].mask & mask) if (layers[1].mask & mask)
mask = (layers[1].mask & ~mask) | (right ? BODY_LEG_R1 : BODY_LEG_L1); // holster mask = (layers[1].mask & ~mask) | (right ? JOINT_MASK_LEG_R1 : JOINT_MASK_LEG_L1); // holster
else else
mask |= layers[1].mask; mask |= layers[1].mask;
meshSwap(1, level->extra.weapons[wpnCurrent], mask); meshSwap(1, level->extra.weapons[wpnCurrent], mask);
@ -1570,7 +1569,7 @@ struct Lara : Character {
pos = enemy->pos; pos = enemy->pos;
angle = enemy->angle; angle = enemy->angle;
meshSwap(1, TR::MODEL_LARA_SPEC, BODY_UPPER | BODY_LOWER); meshSwap(1, TR::MODEL_LARA_SPEC, JOINT_MASK_UPPER | JOINT_MASK_LOWER);
meshSwap(2, level->extra.weapons[TR::Entity::SHOTGUN], 0); meshSwap(2, level->extra.weapons[TR::Entity::SHOTGUN], 0);
meshSwap(3, level->extra.weapons[TR::Entity::UZIS], 0); meshSwap(3, level->extra.weapons[TR::Entity::UZIS], 0);
@ -3374,30 +3373,30 @@ struct Lara : Character {
uint32 getMidasMask() { uint32 getMidasMask() {
if (state == STATE_MIDAS_USE) if (state == STATE_MIDAS_USE)
return BODY_ARM_L3 | BODY_ARM_R3; return JOINT_MASK_ARM_L3 | JOINT_MASK_ARM_R3;
uint32 mask = 0; uint32 mask = 0;
int frame = animation.frameIndex; int frame = animation.frameIndex;
if (frame > 4 ) mask |= BODY_LEG_L3 | BODY_LEG_R3; if (frame > 4 ) mask |= JOINT_MASK_LEG_L3 | JOINT_MASK_LEG_R3;
if (frame > 69 ) mask |= BODY_LEG_L2; if (frame > 69 ) mask |= JOINT_MASK_LEG_L2;
if (frame > 79 ) mask |= BODY_LEG_L1; if (frame > 79 ) mask |= JOINT_MASK_LEG_L1;
if (frame > 99 ) mask |= BODY_LEG_R2; if (frame > 99 ) mask |= JOINT_MASK_LEG_R2;
if (frame > 119) mask |= BODY_LEG_R1 | BODY_HIP; if (frame > 119) mask |= JOINT_MASK_LEG_R1 | JOINT_MASK_HIPS;
if (frame > 134) mask |= BODY_CHEST; if (frame > 134) mask |= JOINT_MASK_CHEST;
if (frame > 149) mask |= BODY_ARM_L1; if (frame > 149) mask |= JOINT_MASK_ARM_L1;
if (frame > 162) mask |= BODY_ARM_L2; if (frame > 162) mask |= JOINT_MASK_ARM_L2;
if (frame > 173) mask |= BODY_ARM_L3; if (frame > 173) mask |= JOINT_MASK_ARM_L3;
if (frame > 185) mask |= BODY_ARM_R1; if (frame > 185) mask |= JOINT_MASK_ARM_R1;
if (frame > 194) mask |= BODY_ARM_R2; if (frame > 194) mask |= JOINT_MASK_ARM_R2;
if (frame > 217) mask |= BODY_ARM_R3; if (frame > 217) mask |= JOINT_MASK_ARM_R3;
if (frame > 224) mask |= BODY_HEAD; if (frame > 224) mask |= JOINT_MASK_HEAD;
return mask; return mask;
} }
virtual void render(Frustum *frustum, MeshBuilder *mesh, Shader::Type type, bool caustics) { virtual void render(Frustum *frustum, MeshBuilder *mesh, Shader::Type type, bool caustics) {
uint32 visMask = visibleMask; uint32 visMask = visibleMask;
if (Core::pass != Core::passShadow && camera->firstPerson && camera->viewIndex == -1 && game->getCamera() == camera) // hide head in first person view // TODO: fix for firstPerson with viewIndex always == -1 if (Core::pass != Core::passShadow && camera->firstPerson && camera->viewIndex == -1 && game->getCamera() == camera) // hide head in first person view // TODO: fix for firstPerson with viewIndex always == -1
visibleMask &= ~BODY_HEAD; visibleMask &= ~JOINT_MASK_HEAD;
Controller::render(frustum, mesh, type, caustics); Controller::render(frustum, mesh, type, caustics);
visibleMask = visMask; visibleMask = visMask;