Hairs done on GPU now

This commit is contained in:
Montagna Marco 2020-07-07 07:32:33 +02:00
parent e88d24347b
commit 2a1c491c7e
65 changed files with 358 additions and 450 deletions

View file

@ -514,7 +514,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
item = &Items[itemNumber];
if (item->data == NULL)
return FALSE;
return false;
creature = (CREATURE_INFO*)item->data;
LOT = &creature->LOT;
@ -536,7 +536,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
if (item->status == ITEM_DEACTIVATED)
{
CreatureDie(itemNumber, FALSE);
return FALSE;
return false;
}
bounds = GetBoundsAccurate(item);
@ -714,7 +714,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
item->pos.yRot -= BIFF_AVOID_TURN;
else
item->pos.yRot += BIFF_AVOID_TURN;
return TRUE;
return true;
}
if (LOT->fly != NO_FLYING && item->hitPoints > 0)
@ -857,7 +857,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
if (item->roomNumber != roomNumber)
ItemNewRoom(itemNumber, roomNumber);
return TRUE;
return true;
}
void CreatureDie(short itemNumber, int explode)
@ -916,7 +916,7 @@ int BadFloor(int x, int y, int z, int boxHeight, int nextHeight, short roomNumbe
int CreatureCreature(short itemNumber)
{
ITEM_INFO* item, *linked;
ObjectInfo* obj;
OBJECT_INFO* obj;
ROOM_INFO* r;
int x, z, xDistance, zDistance, distance = 0;
short link, radius;
@ -999,8 +999,6 @@ void TargetBox(LOT_INFO* LOT, short boxNumber)
boxNumber &= NO_BOX;
box = &Boxes[boxNumber];
//LOT->target.x = (((((box->bottom - box->top) - 1) * GetRandomControl()) / 32) + (box->top * 1024)) + 512;
//LOT->target.z = (((((box->right - box->left) - 1) * GetRandomControl()) / 32) + (box->left * 1024)) + 512;
LOT->target.x = ((box->top << WALL_SHIFT) + GetRandomControl() * ((box->bottom - box->top) - 1) >> 5) + WALL_SIZE / 2;
LOT->target.z = ((box->left << WALL_SHIFT) + GetRandomControl() * ((box->right - box->left) - 1) >> 5) + WALL_SIZE / 2;
LOT->requiredBox = boxNumber;
@ -1048,14 +1046,14 @@ int SearchLOT(LOT_INFO* LOT, int depth)
searchZone = zone[LOT->head];
if (depth <= 0)
return 1;
return true;
for (int i = 0; i < depth; i++)
{
if (LOT->head == NO_BOX)
{
LOT->tail = NO_BOX;
return FALSE;
return false;
}
node = &LOT->node[LOT->head];
@ -1068,7 +1066,7 @@ int SearchLOT(LOT_INFO* LOT, int depth)
boxNumber = Overlaps[index++];
if (boxNumber & BOX_END_BIT)
{
done = TRUE;
done = true;
boxNumber &= BOX_NUMBER;
}
@ -1117,21 +1115,22 @@ int SearchLOT(LOT_INFO* LOT, int depth)
node->nextExpansion = NO_BOX;
}
return TRUE;
return true;
}
int CreatureActive(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (!(item->flags & IFLAG_KILLED) && item->status & ITEM_INVISIBLE)
if (!(item->flags & IFLAG_KILLED)
&& item->status & ITEM_INVISIBLE)
{
if (!EnableBaddieAI(itemNumber, FALSE))
return FALSE;
if (!EnableBaddieAI(itemNumber, false))
return false;
item->status = ITEM_ACTIVE;
}
return TRUE;
return true;
}
void InitialiseCreature(short itemNumber)
@ -1142,7 +1141,7 @@ void InitialiseCreature(short itemNumber)
int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
{
if (enemy == NULL)
return FALSE;
return false;
BOX_INFO* box;
int x, z, xrange, zrange;
@ -1156,7 +1155,7 @@ int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
z = ((box->left + box->right) << (WALL_SHIFT - 1)) - enemy->pos.zPos;
if (x > xrange || x < -xrange || z > zrange || z < -zrange)
return FALSE;
return false;
enemyQuad = (enemy->pos.yRot >> W2V_SHIFT) + 2;
@ -1167,7 +1166,7 @@ int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
boxQuad = (x > 0) ? 3 : 0;
if (enemyQuad == boxQuad)
return FALSE;
return false;
baddieQuad = 0;
if (item->pos.zPos > enemy->pos.zPos)
@ -1176,9 +1175,9 @@ int StalkBox(ITEM_INFO* item, ITEM_INFO* enemy, short boxNumber)
baddieQuad = (item->pos.xPos > enemy->pos.xPos) ? 3 : 0;
if (enemyQuad == baddieQuad && abs(enemyQuad - boxQuad) == 2)
return FALSE;
return false;
return TRUE;
return true;
}
int CreatureVault(short itemNum, short angle, int vault, int shift)
@ -1458,10 +1457,10 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
if (item->data == NULL)
return;
CREATURE_INFO* creature;
ITEM_INFO* enemy;
ObjectInfo* obj;
ROOM_INFO* r;
CREATURE_INFO * creature;
ITEM_INFO * enemy;
OBJECT_INFO * obj;
ROOM_INFO * r;
short* zone, angle;
int x, y, z;
@ -1520,7 +1519,7 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
}
info->angle = angle - item->pos.yRot;
info->enemyFacing = ANGLE(180) + angle - enemy->pos.yRot;
info->enemyFacing = -ANGLE(180) + angle - enemy->pos.yRot;
x = abs(x);
z = abs(z);
@ -1545,7 +1544,7 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
info->xAngle = phd_atan(z + (x >> 1), y);
info->ahead = (info->angle > -FRONT_ARC && info->angle < FRONT_ARC);
info->bite = (info->ahead && enemy->hitPoints > 0 && abs(enemy->pos.yPos - item->pos.yPos) <= (STEP_SIZE*2));
info->bite = (info->ahead && enemy->hitPoints > 0 && abs(enemy->pos.yPos - item->pos.yPos) <= (STEP_SIZE * 2));
}
void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
@ -1634,6 +1633,8 @@ void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
if (LOT->targetBox == NO_BOX)
TargetBox(LOT, item->boxNumber);
CalculateTarget(&creature->target, item, &creature->LOT);
creature->jumpAhead = false;
creature->monkeyAhead = false;
@ -1656,8 +1657,6 @@ void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
creature->monkeyAhead = true;
}
}
/*Unk_00EEFB6C =*/ CalculateTarget(&creature->target, item, &creature->LOT);
}
void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
@ -1677,7 +1676,8 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
if (creature->LOT.node[item->boxNumber].searchNumber == (creature->LOT.searchNumber | BLOCKED_SEARCH))
creature->LOT.requiredBox = NO_BOX;
if (creature->mood != ATTACK_MOOD && creature->LOT.requiredBox != NO_BOX)
if (creature->mood != ATTACK_MOOD
&& creature->LOT.requiredBox != NO_BOX)
{
if (!ValidBox(item, info->zoneNumber, creature->LOT.targetBox))
{
@ -1720,13 +1720,14 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
break;
}
}
else if (!isViolent)
else
{
switch (creature->mood)
{
case BORED_MOOD:
case STALK_MOOD:
if (creature->alerted && info->zoneNumber != info->enemyZone)
if (creature->alerted
&& info->zoneNumber != info->enemyZone)
{
if (info->distance > 3072)
creature->mood = STALK_MOOD;
@ -1735,7 +1736,9 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
}
else if (info->zoneNumber == info->enemyZone)
{
if (info->distance < ATTACK_RANGE || (creature->mood == STALK_MOOD && LOT->requiredBox == NO_BOX))
if (info->distance < ATTACK_RANGE
|| (creature->mood == STALK_MOOD
&& LOT->requiredBox == NO_BOX))
creature->mood = ATTACK_MOOD;
else
creature->mood = STALK_MOOD;
@ -1743,14 +1746,17 @@ void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
break;
case ATTACK_MOOD:
if (item->hitStatus && (GetRandomControl() < ESCAPE_CHANCE || info->zoneNumber != info->enemyZone))
if (item->hitStatus
&& (GetRandomControl() < ESCAPE_CHANCE
|| info->zoneNumber != info->enemyZone))
creature->mood = STALK_MOOD;
else if (info->zoneNumber != info->enemyZone && info->distance > (WALL_SIZE*6))
creature->mood = BORED_MOOD;
break;
case ESCAPE_MOOD:
if (info->zoneNumber == info->enemyZone && GetRandomControl() < RECOVER_CHANCE)
if (info->zoneNumber == info->enemyZone
&& GetRandomControl() < RECOVER_CHANCE)
creature->mood = STALK_MOOD;
break;
}

View file

@ -70,7 +70,7 @@ void LookAt(CAMERA_INFO* cam, short roll)
Vector3 target = Vector3(cam->target.x, cam->target.y, cam->target.z);
Vector3 up = Vector3(0.0f, -1.0f, 0.0f);
float fov = TO_RAD(CurrentFOV / 1.333333f);
float r = TO_RAD(roll);
float r = 0; TO_RAD(roll);
g_Renderer.UpdateCameraMatrices(cam, r, fov);
}

View file

@ -450,14 +450,14 @@ int FindGridShift(int x, int z)
int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius)
{
if (!(bounds[5] | bounds[4] | bounds[0] | bounds[1] | bounds[2] | bounds[3]))
return FALSE;
return false;
short* frame = GetBestFrame(LaraItem);
if (pos->yPos + bounds[3] <= LaraItem->pos.yPos + frame[2])
return FALSE;
return false;
if (pos->yPos + bounds[2] >= LaraItem->pos.yPos + frame[3])
return FALSE;
return false;
int c, s;
int x, z, dx, dz;
@ -474,11 +474,11 @@ int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius)
&& dz <= radius + bounds[5]
&& dz >= bounds[4] - radius)
{
return TRUE;
return true;
}
else
{
return FALSE;
return false;
}
}
@ -506,7 +506,7 @@ int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO
|| rx >= maxX
|| rz <= minZ
|| rz >= maxZ)
return FALSE;
return false;
left = rx - minX;
top = maxZ - rz;
@ -554,7 +554,7 @@ int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO
Lara.gunStatus = LG_NO_ARMS;
}
return TRUE;
return true;
}
int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, char bigpush)
@ -596,7 +596,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
|| rx >= maxX
|| rz <= minZ
|| rz >= maxZ)
return FALSE;
return false;
left = rx - minX;
top = maxZ - rz;
@ -662,7 +662,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
Lara.gunStatus = LG_NO_ARMS;
}
return TRUE;
return true;
}
void AIPickupCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c)
@ -739,17 +739,17 @@ int TestLaraPosition(short* bounds, ITEM_INFO* item, ITEM_INFO* l)
zRotRel = l->pos.zRot - item->pos.zRot;
if (xRotRel < bounds[6])
return FALSE;
return false;
if (xRotRel > bounds[7])
return FALSE;
return false;
if (yRotRel < bounds[8])
return FALSE;
return false;
if (yRotRel > bounds[9])
return FALSE;
return false;
if (zRotRel < bounds[10])
return FALSE;
return false;
if (zRotRel > bounds[11])
return FALSE;
return false;
Vector3 pos = Vector3(l->pos.xPos - item->pos.xPos, l->pos.yPos - item->pos.yPos, l->pos.zPos - item->pos.zPos);
@ -766,9 +766,9 @@ int TestLaraPosition(short* bounds, ITEM_INFO* item, ITEM_INFO* l)
rz = pos.z;
if (rx < bounds[0] || rx > bounds[1] || ry < bounds[2] || ry > bounds[3] || rz < bounds[4] || rz > bounds[5])
return FALSE;
return false;
return TRUE;
return true;
}
int Move3DPosTo3DPos(PHD_3DPOS* src, PHD_3DPOS* dest, int velocity, short angAdd)
@ -923,7 +923,7 @@ int MoveLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l)
if (abs(height - l->pos.yPos) <= CLICK(2))
{
if (sqrt(SQUARE(dest.xPos - l->pos.xPos) + SQUARE(dest.yPos - l->pos.yPos) + SQUARE(dest.zPos - l->pos.zPos)) < (STEP_SIZE/2))
return TRUE;
return true;
return Move3DPosTo3DPos(&l->pos, &dest, LARA_VELOCITY, ANGLE(2));
}
@ -934,7 +934,7 @@ int MoveLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l)
Lara.gunStatus = LG_NO_ARMS;
}
return FALSE;
return false;
}
int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius)
@ -964,12 +964,12 @@ int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius)
&& dz >= bounds[4] - radius
&& dz <= radius + bounds[5])
{
return TRUE;
return true;
}
}
}
return FALSE;
return false;
}
void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
@ -1372,7 +1372,7 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum
void LaraBaddieCollision(ITEM_INFO* l, COLL_INFO* coll)
{
ITEM_INFO* item;
ObjectInfo* obj;
OBJECT_INFO* obj;
l->hitStatus = false;
Lara.hitDirection = -1;

View file

@ -309,7 +309,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
LaserSight = true;
/*if (!(gfLevelFlags & GF_LVOP_TRAIN))
InfraRed = TRUE;
InfraRed = true;
else*
InfraRed = false;*/
Infrared = true;
@ -322,7 +322,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
if (LaserSight)
{
/*if (!(gfLevelFlags & GF_LVOP_TRAIN))
InfraRed = TRUE;
InfraRed = true;
else
InfraRed = false;*/
Infrared = true;
@ -330,7 +330,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
else
{
/*if ((gfLevelFlags & GF_LVOP_TRAIN) && (inputBusy & IN_ACTION))
InfraRed = TRUE;
InfraRed = true;
else
InfraRed = false;*/
Infrared = false;
@ -446,6 +446,8 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
InItemControlLoop = false;
KillMoveItems();
g_Renderer.UpdateLaraAnimations(true);
// Update Lara's ponytails
HairControl(0, 0, 0);
if (level->LaraType == LARA_YOUNG)
@ -554,7 +556,7 @@ unsigned CALLBACK GameMain(void *)
PostMessage(WindowsHandle, WM_CLOSE, NULL, NULL);
EndThread();
return TRUE;
return true;
}
GAME_STATUS DoTitle(int index)
@ -1627,7 +1629,7 @@ int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z)
int xOff, yOff, trigger;
ITEM_INFO *item;
ObjectInfo *obj;
OBJECT_INFO *obj;
int tilts, t0, t1, t2, t3, t4, dx, dz, h1, h2;
do
@ -2642,7 +2644,7 @@ int DoRayBox(GAME_VECTOR *start, GAME_VECTOR *end, short *box, PHD_3DPOS *itemOr
{
// For items instead we need to test spheres
ITEM_INFO *item = &Items[closesItemNumber];
ObjectInfo *obj = &Objects[item->objectNumber];
OBJECT_INFO *obj = &Objects[item->objectNumber];
// Get the ransformed sphere of meshes
GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);

View file

@ -78,7 +78,7 @@ void SequenceDoorControl(short itemNumber)
OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door);
door->opened = TRUE;
door->opened = true;
item->flags |= 0x3E;
}
}
@ -90,7 +90,7 @@ void SequenceDoorControl(short itemNumber)
ShutThatDoor(&door->d2, door);
ShutThatDoor(&door->d1flip, door);
ShutThatDoor(&door->d2flip, door);
door->opened = FALSE;
door->opened = false;
item->flags &= 0xC1;
}
}
@ -320,7 +320,7 @@ void PushPullKickDoorControl(short itemNumber)
OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door);
door->opened = TRUE;
door->opened = true;
}
AnimateItem(item);
@ -440,7 +440,7 @@ void DoorControl(short itemNumber)
OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door);
door->opened = TRUE;
door->opened = true;
}
}
else
@ -456,7 +456,7 @@ void DoorControl(short itemNumber)
ShutThatDoor(&door->d2, door);
ShutThatDoor(&door->d1flip, door);
ShutThatDoor(&door->d2flip, door);
door->opened = FALSE;
door->opened = false;
}
}
}
@ -479,7 +479,7 @@ void DoorControl(short itemNumber)
OpenThatDoor(&door->d2, door);
OpenThatDoor(&door->d1flip, door);
OpenThatDoor(&door->d2flip, door);
door->opened = TRUE;
door->opened = true;
}
/*if (item->frameNumber == Anims[item->animNumber].frameEnd)
{
@ -536,7 +536,7 @@ void DoorControl(short itemNumber)
ShutThatDoor(&door->d2, door);
ShutThatDoor(&door->d1flip, door);
ShutThatDoor(&door->d2flip, door);
door->opened = FALSE;
door->opened = false;
}
}
else

View file

@ -160,7 +160,7 @@ int Sync()
void DrawAnimatingItem(ITEM_INFO* item)
{
// TODO: to refactor
// Empty stub because actually we disable items drawing when drawRoutine pointer is NULL in ObjectInfo
// Empty stub because actually we disable items drawing when drawRoutine pointer is NULL in OBJECT_INFO
}
void GetLaraJointPosition(PHD_VECTOR* pos, int LM_enum)

View file

@ -82,7 +82,7 @@ void DetatchSpark(int num, SpriteEnumFlag type)// (F) (D)
case SP_FX:
if (sptr->flags & SP_USEFXOBJPOS)
{
sptr->on = FALSE;
sptr->on = false;
}
else
{
@ -96,7 +96,7 @@ void DetatchSpark(int num, SpriteEnumFlag type)// (F) (D)
case SP_ITEM:
if (sptr->flags & SP_USEFXOBJPOS)
{
sptr->on = FALSE;
sptr->on = false;
}
else
{

View file

@ -11,7 +11,7 @@
#include "level.h"
using T5M::Renderer::g_Renderer;
int FirstHair[HAIR_MAX];
HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS];
HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS + 1];
int WindAngle;
int DWindAngle;
int Wind;
@ -29,7 +29,7 @@ void InitialiseHair()
Hairs[h][0].pos.yRot = 0;
Hairs[h][0].pos.xRot = -0x4000;
for (int i = 1; i < HAIR_SEGMENTS; i++, bone += 4)
for (int i = 1; i < HAIR_SEGMENTS + 1; i++, bone += 4)
{
Hairs[h][i].pos.xPos = *(bone + 1);
Hairs[h][i].pos.yPos = *(bone + 2);
@ -46,7 +46,7 @@ void InitialiseHair()
void HairControl(int cutscene, int ponytail, short* framePtr)
{
SPHERE sphere[HAIR_SPHERE];
ObjectInfo* object = &Objects[ID_LARA];
OBJECT_INFO* object = &Objects[ID_LARA];
short* frame;
int spaz;
bool youngLara = g_GameFlow->GetLevel(CurrentLevel)->LaraType == LARA_YOUNG;
@ -179,7 +179,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
Hairs[ponytail][0].pos.yPos = pos.y;
Hairs[ponytail][0].pos.zPos = pos.z;
for (int i = 0; i < HAIR_SEGMENTS - 1; i++, bone += 4)
for (int i = 0; i < HAIR_SEGMENTS; i++, bone += 4)
{
world = Matrix::CreateTranslation(Hairs[ponytail][i].pos.xPos, Hairs[ponytail][i].pos.yPos, Hairs[ponytail][i].pos.zPos);
world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i].pos.yRot), TO_RAD(Hairs[ponytail][i].pos.xRot), 0) * world;
@ -235,7 +235,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
SmokeWindX = (((rcossin_tbl[WindAngle]) * Wind) >> 12);
SmokeWindZ = (((rcossin_tbl[WindAngle + 1]) * Wind) >> 12);
for (int i = 1; i < HAIR_SEGMENTS; i++, bone += 4)
for (int i = 1; i < HAIR_SEGMENTS + 1; i++, bone += 4)
{
Hairs[ponytail][0].hvel.x = Hairs[ponytail][i].pos.xPos;
Hairs[ponytail][0].hvel.y = Hairs[ponytail][i].pos.yPos;
@ -316,7 +316,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
world = Matrix::CreateTranslation(Hairs[ponytail][i - 1].pos.xPos, Hairs[ponytail][i - 1].pos.yPos, Hairs[ponytail][i - 1].pos.zPos);
world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i - 1].pos.yRot), TO_RAD(Hairs[ponytail][i - 1].pos.xRot), 0) * world;
if (i == HAIR_SEGMENTS - 1)
if (i == HAIR_SEGMENTS)
world = Matrix::CreateTranslation(*(bone - 3), *(bone - 2), *(bone - 1)) * world;
else
world = Matrix::CreateTranslation(*(bone + 1), *(bone + 2), *(bone + 3)) * world;

View file

@ -3,7 +3,7 @@
#include "phd_global.h"
constexpr auto HAIR_MAX = 2; // HAIR_NORMAL = 0, HAIR_YOUNG = 1
constexpr auto HAIR_SEGMENTS = 7; // classic = 7, young = 14
constexpr auto HAIR_SEGMENTS = 6; // classic = 7, young = 14
constexpr auto HAIR_SPHERE = 5; // current hair max collision
struct HAIR_STRUCT
@ -12,7 +12,7 @@ struct HAIR_STRUCT
PHD_VECTOR hvel;
PHD_VECTOR unknown;
};
extern HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS];
extern HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS + 1];
void InitialiseHair();
void HairControl(int cutscene, int ponytail, short* framePtr);

View file

@ -483,7 +483,7 @@ int UseSpecialItem(ITEM_INFO* item)
short selectedObject = g_Inventory.GetSelectedObject();
if (item->animNumber != ANIMATION_LARA_STAY_IDLE || Lara.gunStatus || selectedObject == NO_ITEM)
return FALSE;
return false;
if (selectedObject >= ID_WATERSKIN1_EMPTY && selectedObject <= ID_WATERSKIN2_5)
{
@ -521,7 +521,7 @@ int UseSpecialItem(ITEM_INFO* item)
}
else
{
return FALSE;
return false;
}
item->frameNumber = Anims[item->animNumber].frameBase;
@ -531,7 +531,7 @@ int UseSpecialItem(ITEM_INFO* item)
Lara.gunStatus = LG_HANDS_BUSY;
g_Inventory.SetSelectedObject(NO_ITEM);
return TRUE;
return true;
}
void lara_as_stop(ITEM_INFO* item, COLL_INFO* coll)

View file

@ -1425,7 +1425,7 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src)
{
dest->hitStatus = true;
ObjectInfo* obj = &Objects[dest->objectNumber];
OBJECT_INFO* obj = &Objects[dest->objectNumber];
if (!obj->undead)
{
HitTarget(dest, 0, 30, 1);

View file

@ -692,7 +692,7 @@ int WeaponObjectMesh(int weaponType)
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
{
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
item->hitStatus = true;
if (creature != nullptr && item != LaraItem)

View file

@ -106,7 +106,7 @@ void DisableBaddieAI(short itemNumber)
void InitialiseSlot(short itemNum, short slot)
{
ITEM_INFO* item = &Items[itemNum];
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = &BaddieSlots[slot];
item->data = creature;

View file

@ -130,7 +130,7 @@ void ControlMissile(short fxNumber)
void ControlNatlaGun(short fx_number)
{
FX_INFO* fx, *newfx;
ObjectInfo* object;
OBJECT_INFO* object;
FLOOR_INFO* floor;
short roomNumber;
int x, y, z;

View file

@ -1424,7 +1424,7 @@ short* FindPlinth(ITEM_INFO* item)
for (itemNumber = room->itemNumber; itemNumber != NO_ITEM; itemNumber = Items[itemNumber].nextItem)
{
ITEM_INFO* current = &Items[itemNumber];
ObjectInfo* obj = &Objects[current->objectNumber];
OBJECT_INFO* obj = &Objects[current->objectNumber];
if (!obj->isPickup
&& item->pos.xPos == current->pos.xPos

View file

@ -122,7 +122,7 @@ void SaveGame::saveItems()
void SaveGame::saveItem(int itemNumber, int runtimeItem)
{
ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
LEB128::Write(m_stream, itemNumber);
LEB128::Write(m_stream, runtimeItem);
@ -550,7 +550,7 @@ bool SaveGame::readItem()
ITEM_INFO* item = &Items[itemNumber];
item->objectNumber = LEB128::ReadInt16(m_stream);
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
// Runtime items must be initialised
// TODO: test test test!!!
@ -1012,7 +1012,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
{
EnableBaddieAI(itemNumber, 1);
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
creature->jointRotation[0] = LEB128::ReadInt16(m_stream);
@ -1116,7 +1116,7 @@ bool SaveGame::readStatistics()
void SaveGame::saveItemFlags(int arg1, int arg2)
{
ITEM_INFO* item = &Items[arg1];
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
LEB128::Write(m_stream, item->flags);
LEB128::Write(m_stream, item->active);
@ -1140,7 +1140,7 @@ void SaveGame::saveItemFlags(int arg1, int arg2)
void SaveGame::saveItemIntelligentData(int arg1, int arg2)
{
ITEM_INFO* item = &Items[arg1];
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ITEM_INFO* enemy = (ITEM_INFO*)((char*)creature->enemy - (ptrdiff_t)malloc_buffer);

View file

@ -650,7 +650,7 @@ void TurnSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
Lara.torsoXrot = 0;
Lara.gunStatus = LG_HANDS_BUSY;
l->currentAnimState = ANIMATION_LARA_TRY_HANG_SOLID;
UseForcedFixedCamera = TRUE;
UseForcedFixedCamera = true;
ForcedFixedCamera.y = item->pos.yPos - 2048;
ForcedFixedCamera.roomNumber = item->roomNumber;
AddActiveItem(itemNum);

View file

@ -1195,7 +1195,7 @@ void TriggerLaraDrips()// (F)
int ExplodingDeath(short itemNumber, int meshBits, short flags)
{
ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
short* frame = GetBestFrame(item);

View file

@ -152,7 +152,7 @@ void UpdateLocusts(void)
locust->counter--;
if (locust->counter == 0)
{
locust->on = FALSE;
locust->on = false;
break;
}

View file

@ -113,7 +113,7 @@ void BigRatControl(short itemNumber)
return;
ITEM_INFO* item;
ObjectInfo* obj;
OBJECT_INFO* obj;
CREATURE_INFO* big_rat;
AI_INFO info;
short head, angle;
@ -171,7 +171,7 @@ void BigRatControl(short itemNumber)
if ((item->hitStatus || info.distance < BIG_RAT_ALERT_RANGE) || (TargetVisible(item, &info) && info.distance < BIG_RAT_VISIBILITY_RANGE))
{
if (!big_rat->alerted)
big_rat->alerted = TRUE;
big_rat->alerted = true;
AlertAllGuards(itemNumber);
}
@ -213,7 +213,7 @@ void BigRatControl(short itemNumber)
{
CreatureEffect(item, &big_ratBite, DoBloodSplat);
LaraItem->hitPoints -= BIG_RAT_BITE_DAMAGE;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
item->requiredAnimState = BIG_RAT_STOP;
}
break;
@ -223,7 +223,7 @@ void BigRatControl(short itemNumber)
{
CreatureEffect(item, &big_ratBite, DoBloodSplat);
LaraItem->hitPoints -= BIG_RAT_CHARGE_DAMAGE;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
item->requiredAnimState = BIG_RAT_RUN;
}
break;
@ -253,7 +253,7 @@ void BigRatControl(short itemNumber)
{
CreatureEffect(item, &big_ratBite, DoBloodSplat);
LaraItem->hitPoints -= BIG_RAT_BITE_DAMAGE;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
}
item->goalAnimState = BIG_RAT_SWIM;

View file

@ -18,7 +18,7 @@
#include "setup.h"
#include "level.h"
static void StartBaddy(ObjectInfo* obj)
static void StartBaddy(OBJECT_INFO* obj)
{
obj = &Objects[ID_WOLF];
if (obj->loaded)
@ -150,17 +150,17 @@ static void StartBaddy(ObjectInfo* obj)
}
}
static void StartObject(ObjectInfo* obj)
static void StartObject(OBJECT_INFO* obj)
{
}
static void StartTrap(ObjectInfo* obj)
static void StartTrap(OBJECT_INFO* obj)
{
}
static ObjectInfo* objToInit;
static OBJECT_INFO* objToInit;
void InitialiseTR1Objects()
{
StartBaddy(objToInit);

View file

@ -108,7 +108,7 @@ static void SkidooBaddieCollision(short itemNum, ITEM_INFO* skidoo)
ITEM_INFO* target = &Items[itemNum];
if (target->collidable && target->status != ITEM_INVISIBLE && target != LaraItem && target != skidoo)
{
ObjectInfo* object = &Objects[target->objectNumber];
OBJECT_INFO* object = &Objects[target->objectNumber];
if (object->collision && (object->intelligent || target->objectNumber == ID_ROLLINGBALL))
{
int x = skidoo->pos.xPos - target->pos.xPos;

View file

@ -35,7 +35,7 @@
#include "setup.h"
#include "level.h"
static void StartBaddy(ObjectInfo* obj)
static void StartBaddy(OBJECT_INFO* obj)
{
obj = &Objects[ID_SHARK];
if (obj->loaded)
@ -600,12 +600,12 @@ static void StartBaddy(ObjectInfo* obj)
}
}
static void StartObject(ObjectInfo* obj)
static void StartObject(OBJECT_INFO* obj)
{
}
static void StartTrap(ObjectInfo* obj)
static void StartTrap(OBJECT_INFO* obj)
{
obj = &Objects[ID_ROLLING_SPINDLE];
if (obj->loaded)
@ -628,7 +628,7 @@ static void StartTrap(ObjectInfo* obj)
}
// boat, snowmobile, snowmobile gun
static void StartVehicles(ObjectInfo* obj)
static void StartVehicles(OBJECT_INFO* obj)
{
// TODO: fix BoatControl() not using int BoatControl(void)
obj = &Objects[ID_SPEEDBOAT];
@ -654,7 +654,7 @@ static void StartVehicles(ObjectInfo* obj)
}
}
static ObjectInfo* objToInit;
static OBJECT_INFO* objToInit;
void InitialiseTR2Objects()
{
StartBaddy(objToInit);

View file

@ -92,7 +92,7 @@ static void LondonBossDie(short item_number)
{
ITEM_INFO* item;
item = &Items[item_number];
item->collidable = FALSE;
item->collidable = false;
item->hitPoints = -16384;
KillItem(item_number);

View file

@ -98,7 +98,7 @@ static void TriggerTonyFlame(short itemNum, int hand)
return;
sptr = &Sparks[GetFreeSpark()];
sptr->on = TRUE;
sptr->on = true;
sptr->sR = 255;
sptr->sG = 48 + (GetRandomControl() & 31);
sptr->sB = 48;
@ -156,7 +156,7 @@ static void TriggerFireBallFlame(short fxNumber, long type, long xv, long yv, lo
return;
sptr = &Sparks[GetFreeSpark()];
sptr->on = TRUE;
sptr->on = true;
sptr->sR = 255;
sptr->sG = 48 + (GetRandomControl() & 31);
sptr->sB = 48;
@ -424,7 +424,7 @@ void ControlTonyFireBall(short fxNumber)
{
if (ItemNearLara(&fx->pos, 200))
{
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
KillEffect(fxNumber);
LaraItem->hitPoints -= 200;
LaraBurn();
@ -449,7 +449,7 @@ static void TonyBossDie(short itemNum)
{
ITEM_INFO* item;
item = &Items[itemNum];
item->collidable = FALSE;
item->collidable = false;
item->hitPoints = -16384;
KillItem(itemNum);

View file

@ -1097,7 +1097,7 @@ static void KayakToBaddieCollision(ITEM_INFO* kayak)
if (item->collidable && item->status != ITEM_INVISIBLE)
{
ObjectInfo* object;
OBJECT_INFO* object;
object = &Objects[item->objectNumber];

View file

@ -199,7 +199,7 @@ static void CartToBaddieCollision(ITEM_INFO* v)
ITEM_INFO* item = &Items[itemNum];
if (item->collidable && item->status != ITEM_INVISIBLE && item != LaraItem && item != v)
{
ObjectInfo* object = &Objects[item->objectNumber];
OBJECT_INFO* object = &Objects[item->objectNumber];
if (object->collision && (object->intelligent || item->objectNumber == ID_ROLLINGBALL || item->objectNumber == ID_ANIMATING2))
{
int x = v->pos.xPos - item->pos.xPos;

View file

@ -323,7 +323,7 @@ static void QuadBaddieCollision(ITEM_INFO* quad)
ITEM_INFO* item = &Items[itemNum];
if (item->collidable && item->status != ITEM_INVISIBLE && item != LaraItem && item != quad)
{
ObjectInfo* object = &Objects[item->objectNumber];
OBJECT_INFO* object = &Objects[item->objectNumber];
if (object->collision && object->intelligent)
{
int x = quad->pos.xPos - item->pos.xPos;

View file

@ -34,7 +34,7 @@
#include "setup.h"
#include "level.h"
static void StartBaddy(ObjectInfo* obj)
static void StartBaddy(OBJECT_INFO* obj)
{
obj = &Objects[ID_TONY_BOSS];
if (obj->loaded)
@ -350,17 +350,17 @@ static void StartBaddy(ObjectInfo* obj)
}
}
static void StartObject(ObjectInfo* obj)
static void StartObject(OBJECT_INFO* obj)
{
}
static void StartTrap(ObjectInfo* obj)
static void StartTrap(OBJECT_INFO* obj)
{
}
static void StartVehicles(ObjectInfo* obj)
static void StartVehicles(OBJECT_INFO* obj)
{
obj = &Objects[ID_QUAD];
if (obj->loaded)
@ -394,14 +394,14 @@ static void StartVehicles(ObjectInfo* obj)
}
}
static void StartProjectiles(ObjectInfo* obj)
static void StartProjectiles(OBJECT_INFO* obj)
{
obj = &Objects[ID_TONY_BOSS_FLAME];
obj->control = ControlTonyFireBall;
obj->drawRoutine = NULL;
}
static ObjectInfo* objToInit;
static OBJECT_INFO* objToInit;
void InitialiseTR3Objects()
{
StartBaddy(objToInit);

View file

@ -125,7 +125,7 @@ void AhmetControl(short itemNumber)
// dont clear it !
if (item->frameNumber == Anims[item->animNumber].frameEnd)
{
item->collidable = FALSE; // NOTE: not exist in the original game, avoid wreid collision with lara...
item->collidable = false; // NOTE: not exist in the original game, avoid wreid collision with lara...
item->frameNumber = (Anims[item->animNumber].frameEnd - 1);
}
}
@ -269,14 +269,14 @@ void AhmetControl(short itemNumber)
if (!(ahmet->flags & 1) && item->frameNumber > (Anims[item->animNumber].frameBase + 7) && (item->touchBits & AHMET_LEFT_TOUCH))
{
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteLeft, 10, -1, DoBloodSplat);
ahmet->flags |= 1;
}
else if (!(ahmet->flags & 2) && item->frameNumber > (Anims[item->animNumber].frameBase + 32) && (item->touchBits & AHMET_RIGHT_TOUCH))
{
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteRight, 10, -1, DoBloodSplat);
ahmet->flags |= 2;
@ -305,7 +305,7 @@ void AhmetControl(short itemNumber)
{
if (item->frameNumber > (Anims[item->animNumber].frameBase + 11) && (item->touchBits & AHMET_LEFT_TOUCH))
{
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_JAW_DAMAGE;
CreatureEffect2(item, &ahmetBiteJaw, 10, -1, DoBloodSplat);
ahmet->flags |= 1;
@ -334,14 +334,14 @@ void AhmetControl(short itemNumber)
{
if (!(ahmet->flags & 1) && item->frameNumber > (Anims[item->animNumber].frameBase + 14) && (item->touchBits & AHMET_LEFT_TOUCH))
{
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteLeft, 10, -1, DoBloodSplat);
ahmet->flags |= 1;
}
else if (!(ahmet->flags & 2) && item->frameNumber > (Anims[item->animNumber].frameBase + 22) && (item->touchBits & AHMET_RIGHT_TOUCH))
{
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
LaraItem->hitPoints -= AHMET_HAND_DAMAGE;
CreatureEffect2(item, &ahmetBiteRight, 10, -1, DoBloodSplat);
ahmet->flags |= 2;

View file

@ -143,7 +143,7 @@ static bool CheckRespawnedBaboon(short itemNumber)
static void UpdateRespawnedBaboon(short itemNumber)
{
ITEM_INFO* item;
ObjectInfo* obj;
OBJECT_INFO* obj;
BaboonRespawnStruct* baboon;
item = &Items[itemNumber];
@ -177,11 +177,11 @@ static void UpdateRespawnedBaboon(short itemNumber)
if (item->triggerFlags == 1)
return;
else
item->collidable = TRUE;
item->collidable = true;
}
else if (item->triggerFlags == 0)
{
item->collidable = TRUE;
item->collidable = true;
}
}
@ -560,7 +560,7 @@ void BaboonControl(short itemNumber)
|| (item->touchBits & BABOON_JUMP_TOUCHBITS)))
{
LaraItem->hitPoints -= BABOON_DAMAGE;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
CreatureEffect2(item, &baboonBite, 10, -1, DoBloodSplat);
baboon->flags = 1;
}

View file

@ -280,7 +280,7 @@ void BaddyControl(short itemNum)
ITEM_INFO* item = &Items[itemNum];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ITEM_INFO* enemyItem = creature->enemy;
ObjectInfo* obj = &Objects[ID_BADDY1];
OBJECT_INFO* obj = &Objects[ID_BADDY1];
short tilt = 0;
short angle = 0;

View file

@ -65,7 +65,7 @@ void BatControl(short itemNumber)
{
item->goalAnimState = BAT_DEATH;
item->pos.yPos = item->floor;
item->gravityStatus = FALSE;
item->gravityStatus = false;
}
else
{
@ -150,7 +150,7 @@ void BatControl(short itemNumber)
if (bat->enemy == LaraItem)
{
LaraItem->hitPoints -= BAT_DAMAGE;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
}
bat->flags = 1;
}

View file

@ -101,7 +101,7 @@ void CrocodileControl(short itemNumber)
return;
ITEM_INFO* item;
ObjectInfo* obj;
OBJECT_INFO* obj;
CREATURE_INFO* crocodile;
AI_INFO info;
OBJECT_Bones boneRot;
@ -158,7 +158,7 @@ void CrocodileControl(short itemNumber)
if ((item->hitStatus || info.distance < CROC_ALERT_RANGE) || (TargetVisible(item, &info) && info.distance < CROC_VISIBILITY_RANGE))
{
if (!crocodile->alerted)
crocodile->alerted = TRUE;
crocodile->alerted = true;
AlertAllGuards(itemNumber);
}
@ -242,7 +242,7 @@ void CrocodileControl(short itemNumber)
{
CreatureEffect2(item, &crocBite, 10, -1, DoBloodSplat);
LaraItem->hitPoints -= CROC_DAMAGE;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
item->requiredAnimState = CROC_IDLE;
}
}
@ -285,7 +285,7 @@ void CrocodileControl(short itemNumber)
{
CreatureEffect2(item, &crocBite, 10, -1, DoBloodSplat);
LaraItem->hitPoints -= CROC_DAMAGE;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
item->requiredAnimState = WCROC_SWIM;
}
}

View file

@ -35,7 +35,7 @@ static void DemigodThrowEnergyAttack(PHD_3DPOS* pos, short roomNumber, int flags
fx->pos.yRot = pos->yRot + (GetRandomControl() & 0x7FF) - 1024;
}
ObjectInfo* obj = &Objects[ID_ENERGY_BUBBLES];
OBJECT_INFO* obj = &Objects[ID_ENERGY_BUBBLES];
fx->pos.zRot = 0;
fx->roomNumber = roomNumber;

View file

@ -35,7 +35,7 @@ void GuideControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0;
short tilt = 0;

View file

@ -260,7 +260,7 @@ void HarpyControl(short itemNumber)
return;
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0;
short joint0 = 0;

View file

@ -92,7 +92,7 @@ static void HorsemanSparks(PHD_3DPOS* pos, int param1, int num)
void InitialiseHorse(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[ID_HORSE];
OBJECT_INFO* obj = &Objects[ID_HORSE];
item->animNumber = obj->animIndex + 2;
item->frameNumber = Anims[item->animNumber].frameBase;
@ -103,7 +103,7 @@ void InitialiseHorse(short itemNumber)
void InitialiseHorseman(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[ID_HORSEMAN];
OBJECT_INFO* obj = &Objects[ID_HORSEMAN];
ClearItem(itemNumber);

View file

@ -8,7 +8,7 @@
void InitialiseJeanYves(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
item->goalAnimState = 1;
item->currentAnimState = 1;

View file

@ -32,7 +32,7 @@ void KnightTemplarControl(short itemNumber)
return;
ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
if (item->animNumber == obj->animIndex ||
item->animNumber - obj->animIndex == 1 ||

View file

@ -68,7 +68,7 @@ void TriggerMutantRocketEffects(short fxNumber, short xVel, short yVel, short zV
fx = &EffectList[fxNumber];
sptr = &Sparks[GetFreeSpark()];
sptr->on = TRUE;
sptr->on = true;
color = (GetRandomControl() & 0x3F) - 128;
sptr->sB = 0;
sptr->sR = color;

View file

@ -78,7 +78,7 @@ static void WakeUpSkeleton(ITEM_INFO* item)
void InitialiseSkeleton(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
ObjectInfo* obj = &Objects[ID_SKELETON];
OBJECT_INFO* obj = &Objects[ID_SKELETON];
ClearItem(itemNumber);

View file

@ -30,7 +30,7 @@ void SphinxControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
int x = item->pos.xPos + 614 * phd_sin(item->pos.yRot) >> W2V_SHIFT;
int y = item->pos.yPos;

View file

@ -41,7 +41,7 @@ void TroopsControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0;
short tilt = 0;
short joint0 = 0;

View file

@ -537,7 +537,7 @@ static void JeepBaddieCollision(ITEM_INFO* jeep)
}
else
{
ObjectInfo* object = &Objects[item->objectNumber];
OBJECT_INFO* object = &Objects[item->objectNumber];
if (object->collision && object->intelligent ||
item->objectNumber == ID_ROLLINGBALL)
{

View file

@ -231,7 +231,7 @@ static void DrawMotorbikeLight(ITEM_INFO* item)
rnd = (2 * motorbike->lightPower) - (GetRandomControl() & 0xF);
// TODO: Spot Light
/*if (rnd <= 0)
SpotLightEnabled = FALSE;
SpotLightEnabled = false;
else
CreateSpotLight(&start, &target, item->pos.yRot, rnd);*/
}
@ -247,22 +247,22 @@ static BOOL GetOnMotorBike(short itemNumber)
item = &Items[itemNumber];
if (item->flags & ONESHOT || Lara.gunStatus == LG_HANDS_BUSY || LaraItem->gravityStatus)
return FALSE;
return false;
if ((abs(item->pos.yPos - LaraItem->pos.yPos) >= STEP_SIZE || !(TrInput & IN_ACTION)) && g_Inventory.GetSelectedObject() != ID_PUZZLE_ITEM1)
return FALSE;
return false;
dx = LaraItem->pos.xPos - item->pos.xPos;
dz = LaraItem->pos.zPos - item->pos.zPos;
distance = SQUARE(dx) + SQUARE(dz);
if (distance > 170000)
return FALSE;
return false;
room_number = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &room_number);
height = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (height < -32000)
return FALSE;
return false;
angle = phd_atan(item->pos.zPos - LaraItem->pos.zPos, item->pos.xPos - LaraItem->pos.xPos) - item->pos.yRot;
tempangle = angle - item->pos.yRot;
@ -270,15 +270,15 @@ static BOOL GetOnMotorBike(short itemNumber)
{
// left
if (tempangle > -ANGLE(45.0f) && angle < ANGLE(135.0f))
return FALSE;
return false;
}
else
{
// right
if (tempangle > ANGLE(225.0f) && tempangle < ANGLE(315.0f))
return FALSE;
return false;
}
return TRUE;
return true;
}
void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll)
@ -306,7 +306,7 @@ void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll)
{
CreateFlare(ID_FLARE_ITEM, FALSE);
undraw_flare_meshes();
Lara.flareControlLeft = FALSE;
Lara.flareControlLeft = false;
Lara.gunType = WEAPON_NONE;
Lara.requestGunType = WEAPON_NONE;
Lara.flareAge = 0;
@ -343,7 +343,7 @@ void MotorbikeCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll)
Lara.hitDirection = -1;
AnimateItem(laraitem);
motorbike->revs = 0;
item->collidable = TRUE;
item->collidable = true;
}
else
{
@ -500,11 +500,11 @@ static int MotorBikeCheckGetOff(void)
Lara.Vehicle = NO_ITEM;
Lara.gunStatus = LG_NO_ARMS;
DashTimer = 120;
return TRUE;
return true;
}
if (LaraItem->frameNumber != Anims[LaraItem->animNumber].frameEnd)
return TRUE;
return true;
// exit when falling
// if (LaraItem->state_current == BIKE_EMPTY6) {
@ -514,7 +514,7 @@ static int MotorBikeCheckGetOff(void)
// lara death when falling too much
// }
return FALSE;
return false;
}
static int DoMotorBikeDynamics(int height, int fallspeed, int* y, int flags)
@ -705,7 +705,7 @@ static int MotorBikeDynamics(ITEM_INFO* item)
if (anglex < 0)
anglex2 = -anglex;
if (anglex2 > 24)
NoGetOff = TRUE;
NoGetOff = true;
anglex *= 16;
motorbike->velocity -= anglex;
}
@ -714,7 +714,7 @@ static int MotorBikeDynamics(ITEM_INFO* item)
if (abs(anglez) > 32)
{
short ang, angabs;
NoGetOff = TRUE;
NoGetOff = true;
if (anglez >= 0)
ang = item->pos.yRot + 0x4000;
else
@ -814,7 +814,7 @@ static int MotorBikeDynamics(ITEM_INFO* item)
if (&Items[Lara.Vehicle] == item && motorbike->velocity >= 0x8000 && newspeed < (motorbike->velocity - 10))
{
LaraItem->hitPoints -= (motorbike->velocity - newspeed) >> 7;
LaraItem->hitStatus = TRUE;
LaraItem->hitStatus = true;
}
if (motorbike->velocity > 0 && newspeed < motorbike->velocity)
@ -847,17 +847,17 @@ static BOOL MotorbikeCanGetOff(void)
floor = GetFloor(x, y, z, &room_number);
height = GetFloorHeight(floor, x, y, z);
if (HeightType == BIG_SLOPE || HeightType == DIAGONAL || height == -NO_HEIGHT)
return FALSE;
return false;
if (abs(height - item->pos.yPos) > STEP_SIZE)
return FALSE;
return false;
ceiling = GetCeiling(floor, x, y, z);
if ((ceiling - item->pos.yPos) > -LARA_HITE)
return FALSE;
return false;
if ((height - ceiling) < LARA_HITE)
return FALSE;
return false;
return TRUE;
return true;
}
static void AnimateMotorbike(ITEM_INFO* item, int collide, BOOL dead)
@ -1239,7 +1239,7 @@ void SetLaraOnMotorBike(ITEM_INFO* item, ITEM_INFO* laraitem)
laraitem->goalAnimState = BIKE_IDLE;
laraitem->animNumber = Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex + BIKE_IDLE_ANIM;
laraitem->frameNumber = Anims[laraitem->animNumber].frameBase;
laraitem->gravityStatus = FALSE;
laraitem->gravityStatus = false;
item->animNumber = laraitem->animNumber + (Objects[ID_MOTORBIKE].animIndex - Objects[ID_MOTORBIKE_LARA_ANIMS].animIndex);
item->frameNumber = laraitem->frameNumber + (Anims[ID_MOTORBIKE].frameBase - Anims[ID_MOTORBIKE_LARA_ANIMS].frameBase);
item->hitPoints = 1;
@ -1279,11 +1279,11 @@ int MotorbikeControl(void)
if (LaraItem->hitPoints <= 0)
{
TrInput &= ~(IN_LEFT | IN_RIGHT | IN_BACK | IN_FORWARD);
dead = TRUE;
dead = true;
}
else
{
dead = FALSE;
dead = false;
}
if (motorbike->flags)

View file

@ -57,7 +57,7 @@
#include "setup.h"
#include "level.h"
static void StartBaddy(ObjectInfo* obj)
static void StartBaddy(OBJECT_INFO* obj)
{
obj = &Objects[ID_SMALL_SCORPION];
if (obj->loaded)
@ -558,12 +558,12 @@ static void StartBaddy(ObjectInfo* obj)
obj->hitPoints = NOT_TARGETABLE;
obj->pivotLength = 50;
obj->radius = 128;
obj->intelligent = TRUE;
obj->saveAnim = TRUE;
obj->saveFlags = TRUE;
obj->saveMesh = TRUE;
obj->savePosition = TRUE;
obj->undead = TRUE;
obj->intelligent = true;
obj->saveAnim = true;
obj->saveFlags = true;
obj->saveMesh = true;
obj->savePosition = true;
obj->undead = true;
obj->hitEffect = HIT_SMOKE;
obj->zoneType = ZONE_WATER;
Bones[obj->boneIndex + 6 * 4] |= ROT_Y | ROT_X;
@ -576,7 +576,7 @@ static void StartBaddy(ObjectInfo* obj)
obj->initialise = InitialiseLocust;
obj->control = LocustControl;
obj->drawRoutine = NULL;
obj->saveFlags = TRUE;
obj->saveFlags = true;
obj->zoneType = ZONE_BASIC;
}
@ -587,7 +587,7 @@ static void StartBaddy(ObjectInfo* obj)
}
}
static void StartObject(ObjectInfo* obj)
static void StartObject(OBJECT_INFO* obj)
{
obj = &Objects[ID_SARCOPHAGUS];
if (obj->loaded)
@ -599,7 +599,7 @@ static void StartObject(ObjectInfo* obj)
}
}
static void StartTrap(ObjectInfo* obj)
static void StartTrap(OBJECT_INFO* obj)
{
obj = &Objects[ID_CHAIN];
if (obj->loaded)
@ -757,7 +757,7 @@ static void StartTrap(ObjectInfo* obj)
}
}
static void StartVehicles(ObjectInfo* obj)
static void StartVehicles(OBJECT_INFO* obj)
{
obj = &Objects[ID_JEEP];
if (obj->loaded)
@ -782,12 +782,12 @@ static void StartVehicles(ObjectInfo* obj)
}
}
static void StartSwitch(ObjectInfo* obj)
static void StartSwitch(OBJECT_INFO* obj)
{
}
static ObjectInfo* objToInit;
static OBJECT_INFO* objToInit;
void InitialiseTR4Objects()
{
StartBaddy(objToInit);

View file

@ -83,7 +83,7 @@ void HitmanControl(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
short angle = 0;
short joint2 = 0;

View file

@ -36,7 +36,7 @@ void Tr5DogControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
if (item->hitPoints <= 0)
{

View file

@ -46,7 +46,7 @@ void LagoonWitchControl(short itemNumber)
ITEM_INFO* item = &Items[itemNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ObjectInfo* obj = &Objects[item->objectNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
if (item->hitPoints <= 0)
{

View file

@ -17,7 +17,7 @@ void InitialiseTwoBlocksPlatform(short itemNumber)
BOOL IsOnTwoBlocksPlatform(ITEM_INFO* item, int x, int z)
{
if (!item->meshBits)
return FALSE;
return false;
short angle = item->pos.yRot;
int xb = x >> WALL_SHIFT;
@ -26,15 +26,15 @@ BOOL IsOnTwoBlocksPlatform(ITEM_INFO* item, int x, int z)
int itemzb = item->pos.zPos >> WALL_SHIFT;
if (!angle && (xb == itemxb || xb == itemxb - 1) && (zb == itemzb || zb == itemzb + 1))
return TRUE;
return true;
if (angle == -ANGLE(180) && (xb == itemxb || xb == itemxb + 1) && (zb == itemzb || zb == itemzb - 1))
return TRUE;
return true;
if (angle == ANGLE(90) && (zb == itemzb || zb == itemzb - 1) && (xb == itemxb || xb == itemxb + 1))
return TRUE;
return true;
if (angle == -ANGLE(90) && (zb == itemzb || zb == itemzb - 1) && (xb == itemxb || xb == itemxb - 1))
return TRUE;
return true;
return FALSE;
return false;
}
void TwoBlocksPlatformFloor(ITEM_INFO* item, int x, int y, int z, int* height)

View file

@ -65,7 +65,7 @@
/// register objects
#include "object_helper.h"
static void StartBaddy(ObjectInfo* obj)
static void StartBaddy(OBJECT_INFO* obj)
{
obj = &Objects[ID_LARA];
if (obj->loaded)
@ -869,13 +869,13 @@ static void StartBaddy(ObjectInfo* obj)
obj->saveAnim = true;
obj->zoneType = ZONE_BASIC;
obj->hitEffect = HIT_BLOOD;
obj->castShadows = TRUE;
obj->castShadows = true;
obj->hitPoints = 100;
}
}
static void StartObject(ObjectInfo* obj)
static void StartObject(OBJECT_INFO* obj)
{
InitPickupItem(obj, FlareControl, ID_FLARE_ITEM);
InitPickupItem(obj, TorchControl, ID_BURNING_TORCH_ITEM, true);
@ -1024,7 +1024,7 @@ static void StartObject(ObjectInfo* obj)
}
}
static void StartTrap(ObjectInfo* obj)
static void StartTrap(OBJECT_INFO* obj)
{
obj = &Objects[ID_ZIPLINE_HANDLE];
if (obj->loaded)
@ -1144,7 +1144,7 @@ static void StartTrap(ObjectInfo* obj)
}
}
static void StartSwitch(ObjectInfo* obj)
static void StartSwitch(OBJECT_INFO* obj)
{
obj = &Objects[ID_COG_SWITCH];
if (obj->loaded)
@ -1166,13 +1166,13 @@ static void StartSwitch(ObjectInfo* obj)
}
}
static void StartShatter(ObjectInfo* obj)
static void StartShatter(OBJECT_INFO* obj)
{
for (int i = ID_SMASH_OBJECT1; i <= ID_SMASH_OBJECT16; i++)
InitSmashObject(obj, i);
}
static void StartProjectiles(ObjectInfo* obj)
static void StartProjectiles(OBJECT_INFO* obj)
{
InitProjectile(obj, BubblesControl, ID_ENERGY_BUBBLES, true);
InitProjectile(obj, MissileControl, ID_BUBBLES, true);
@ -1183,7 +1183,7 @@ static void StartProjectiles(ObjectInfo* obj)
InitProjectile(obj, ControlCrossbowBolt, ID_CROSSBOW_BOLT);
}
static void StartPickup(ObjectInfo* obj)
static void StartPickup(OBJECT_INFO* obj)
{
for (int objNumber = ID_PUZZLE_ITEM1; objNumber <= ID_EXAMINE8_COMBO2; objNumber++)
{
@ -1229,7 +1229,7 @@ static void StartPickup(ObjectInfo* obj)
InitPickup(obj, ID_GOLDROSE_ITEM);
}
static ObjectInfo* objToInit;
static OBJECT_INFO* objToInit;
void InitialiseTR5Objects()
{
StartBaddy(objToInit);

View file

@ -7,7 +7,7 @@
#include "tr5_smashobject.h"
#include "tr5_pushableblock.h"
using std::function;
void InitSmashObject(ObjectInfo* obj, int objectNumber)
void InitSmashObject(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -21,7 +21,7 @@ void InitSmashObject(ObjectInfo* obj, int objectNumber)
}
}
void InitKeyHole(ObjectInfo* obj, int objectNumber)
void InitKeyHole(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -31,7 +31,7 @@ void InitKeyHole(ObjectInfo* obj, int objectNumber)
}
}
void InitPuzzleHole(ObjectInfo* obj, int objectNumber)
void InitPuzzleHole(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -44,7 +44,7 @@ void InitPuzzleHole(ObjectInfo* obj, int objectNumber)
}
}
void InitPuzzleDone(ObjectInfo* obj, int objectNumber)
void InitPuzzleDone(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -56,7 +56,7 @@ void InitPuzzleDone(ObjectInfo* obj, int objectNumber)
}
}
void InitAnimating(ObjectInfo* obj, int objectNumber)
void InitAnimating(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -72,7 +72,7 @@ void InitAnimating(ObjectInfo* obj, int objectNumber)
}
}
void InitPickup(ObjectInfo* obj, int objectNumber)
void InitPickup(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -86,7 +86,7 @@ void InitPickup(ObjectInfo* obj, int objectNumber)
}
}
void InitPickupItem(ObjectInfo* obj, function<InitFunction> func, int objectNumber, bool useDrawAnimItem)
void InitPickupItem(OBJECT_INFO* obj, function<InitFunction> func, int objectNumber, bool useDrawAnimItem)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -109,7 +109,7 @@ void InitPickupItem(ObjectInfo* obj, function<InitFunction> func, int objectNumb
}
}
void InitProjectile(ObjectInfo* obj, function<InitFunction> func, int objectNumber, bool noLoad)
void InitProjectile(OBJECT_INFO* obj, function<InitFunction> func, int objectNumber, bool noLoad)
{
obj = &Objects[objectNumber];
if (obj->loaded || noLoad)
@ -123,7 +123,7 @@ void InitProjectile(ObjectInfo* obj, function<InitFunction> func, int objectNumb
}
}
void InitSearchObject(ObjectInfo* obj, int objectNumber)
void InitSearchObject(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)
@ -135,7 +135,7 @@ void InitSearchObject(ObjectInfo* obj, int objectNumber)
}
}
void InitPushableObject(ObjectInfo* obj, int objectNumber)
void InitPushableObject(OBJECT_INFO* obj, int objectNumber)
{
obj = &Objects[objectNumber];
if (obj->loaded)

View file

@ -3,13 +3,13 @@
#define InitFunction void(short itemNumber)
void InitSmashObject(ObjectInfo* obj, int objectNumber);
void InitKeyHole(ObjectInfo* obj, int objectNumber);
void InitPuzzleHole(ObjectInfo* obj, int objectNumber);
void InitPuzzleDone(ObjectInfo* obj, int objectNumber);
void InitAnimating(ObjectInfo* obj, int objectNumber);
void InitPickup(ObjectInfo* obj, int objectNumber);
void InitPickupItem(ObjectInfo* obj, std::function<InitFunction> func, int objectNumber, bool useDrawAnimItem = false);
void InitProjectile(ObjectInfo* obj, std::function<InitFunction> func, int objectNumber, bool noLoad = false);
void InitSearchObject(ObjectInfo* obj, int objectNumber);
void InitPushableObject(ObjectInfo* obj, int objectNumber);
void InitSmashObject(OBJECT_INFO* obj, int objectNumber);
void InitKeyHole(OBJECT_INFO* obj, int objectNumber);
void InitPuzzleHole(OBJECT_INFO* obj, int objectNumber);
void InitPuzzleDone(OBJECT_INFO* obj, int objectNumber);
void InitAnimating(OBJECT_INFO* obj, int objectNumber);
void InitPickup(OBJECT_INFO* obj, int objectNumber);
void InitPickupItem(OBJECT_INFO* obj, std::function<InitFunction> func, int objectNumber, bool useDrawAnimItem = false);
void InitProjectile(OBJECT_INFO* obj, std::function<InitFunction> func, int objectNumber, bool noLoad = false);
void InitSearchObject(OBJECT_INFO* obj, int objectNumber);
void InitPushableObject(OBJECT_INFO* obj, int objectNumber);

View file

@ -128,7 +128,7 @@ namespace T5M::Renderer
// Update waterfalls textures
/*for (int i = ID_WATERFALL1; i <= ID_WATERFALLSS2; i++) {
ObjectInfo* obj = &Objects[i];
OBJECT_INFO* obj = &Objects[i];
if (obj->loaded) {
RendererObject* waterfall = m_moveableObjects[i];
@ -262,7 +262,7 @@ namespace T5M::Renderer
if (!force && itemToDraw->DoneAnimations)
return;
ObjectInfo *obj = &Objects[item->objectNumber];
OBJECT_INFO *obj = &Objects[item->objectNumber];
RendererObject &moveableObj = *m_moveableObjects[item->objectNumber];
// Update animation matrices
@ -458,9 +458,10 @@ namespace T5M::Renderer
vertex.Color.w = 1.0f;
vertex.Bone = meshPtr->bones[v];
vertex.OriginalIndex = v;
//vertex.Bone = boneIndex;
if (isHairs)
vertex.Bone = v;
/*if (isHairs)
vertex.Bone = v;*/
bucket->Vertices.push_back(vertex);
}

View file

@ -63,7 +63,7 @@ namespace T5M::Renderer
DirectX::SimpleMath::Vector4 Color;
float Bone;
int IndexInPoly;
//int OriginalIndex;
int OriginalIndex;
};

View file

@ -316,7 +316,7 @@ namespace T5M::Renderer
for (int i = 0; i < MoveablesIds.size(); i++)
{
int objNum = MoveablesIds[i];
ObjectInfo *obj = &Objects[objNum];
OBJECT_INFO *obj = &Objects[objNum];
if (obj->nmeshes > 0)
{
@ -516,28 +516,86 @@ namespace T5M::Renderer
}
}
}
if (MoveablesIds[i] == ID_LARA_HAIR)
else if (MoveablesIds[i] == ID_LARA_HAIR && skinPresent)
{
hairsPresent = true;
for (int j = 0; j < moveable.ObjectMeshes.size(); j++)
for (int j = 0; j< obj->nmeshes;j++)
{
RendererMesh *mesh = moveable.ObjectMeshes[j];
for (int n = 0; n < NUM_BUCKETS; n++)
RendererMesh* currentMesh = moveable.ObjectMeshes[j];
RendererBone* currentBone = moveable.LinearizedBones[j];
for (int b1 = 0; b1 < NUM_BUCKETS; b1++)
{
m_numHairVertices += mesh->Buckets[n].Vertices.size();
m_numHairIndices += mesh->Buckets[n].Indices.size();
RendererBucket* currentBucket = &currentMesh->Buckets[b1];
for (int v1 = 0; v1 < currentBucket->Vertices.size(); v1++)
{
RendererVertex* currentVertex = &currentBucket->Vertices[v1];
currentVertex->Bone = j + 1;
if (j == 0)
{
// Mesh 0 must be linked with head
int parentVertices[] = { 37,39,40,38 };
RendererObject& skinObj = *m_moveableObjects[ID_LARA_SKIN];
RendererMesh* parentMesh = skinObj.ObjectMeshes[LM_HEAD];
RendererBone* parentBone = skinObj.LinearizedBones[LM_HEAD];
if (currentVertex->OriginalIndex < 4)
{
for (int b2 = 0; b2 < NUM_BUCKETS; b2++)
{
RendererBucket* parentBucket = &parentMesh->Buckets[b2];
for (int v2 = 0; v2 < parentBucket->Vertices.size(); v2++)
{
RendererVertex* parentVertex = &parentBucket->Vertices[v2];
if (parentVertex->OriginalIndex == parentVertices[currentVertex->OriginalIndex])
{
currentVertex->Bone = 0;
currentVertex->Position = parentVertex->Position;
currentVertex->Normal = parentVertex->Normal;
}
}
}
}
}
else
{
// Meshes > 0 must be linked with hair parent meshes
RendererMesh* parentMesh = moveable.ObjectMeshes[j - 1];
RendererBone* parentBone = moveable.LinearizedBones[j - 1];
m_hairVertices.clear();
m_hairIndices.clear();
for (int b2 = 0; b2 < NUM_BUCKETS; b2++)
{
RendererBucket* parentBucket = &parentMesh->Buckets[b2];
for (int v2 = 0; v2 < parentBucket->Vertices.size(); v2++)
{
RendererVertex* parentVertex = &parentBucket->Vertices[v2];
RendererVertex vertex;
for (int m = 0; m < m_numHairVertices * 2; m++)
m_hairVertices.push_back(vertex);
for (int m = 0; m < m_numHairIndices * 2; m++)
m_hairIndices.push_back(0);
int x1 = currentBucket->Vertices[v1].Position.x + currentBone->GlobalTranslation.x;
int y1 = currentBucket->Vertices[v1].Position.y + currentBone->GlobalTranslation.y;
int z1 = currentBucket->Vertices[v1].Position.z + currentBone->GlobalTranslation.z;
int x2 = parentBucket->Vertices[v2].Position.x + parentBone->GlobalTranslation.x;
int y2 = parentBucket->Vertices[v2].Position.y + parentBone->GlobalTranslation.y;
int z2 = parentBucket->Vertices[v2].Position.z + parentBone->GlobalTranslation.z;
if (abs(x1 - x2) < 2 && abs(y1 - y2) < 2 && abs(z1 - z2) < 2)
{
currentVertex->Bone = j;
currentVertex->Position = parentVertex->Position;
currentVertex->Normal = parentVertex->Normal;
break;
}
}
}
}
}
}
}
}
}
@ -632,7 +690,7 @@ namespace T5M::Renderer
for (int i = 0; i < MoveablesIds.size(); i++)
{
ObjectInfo *obj = &Objects[MoveablesIds[i]];
OBJECT_INFO *obj = &Objects[MoveablesIds[i]];
if (obj->nmeshes < 0)
{

View file

@ -55,7 +55,7 @@ namespace T5M::Renderer
view = Matrix::CreateLookAt(Vector3(0.0f, 0.0f, 2048.0f), Vector3(0.0f, 0.0f, 0.0f), Vector3(0.0f, -1.0f, 0.0f));
projection = Matrix::CreateOrthographic(ScreenWidth, ScreenHeight, -1024.0f, 1024.0f);
ObjectInfo *obj = &Objects[objectNum];
OBJECT_INFO *obj = &Objects[objectNum];
RendererObject &moveableObj = *m_moveableObjects[objectNum];
if (obj->animIndex != -1)
@ -414,7 +414,7 @@ namespace T5M::Renderer
if (gunshell->counter > 0)
{
ObjectInfo *obj = &Objects[gunshell->objectNumber];
OBJECT_INFO *obj = &Objects[gunshell->objectNumber];
RendererObject &moveableObj = *m_moveableObjects[gunshell->objectNumber];
Matrix translation = Matrix::CreateTranslation(gunshell->pos.xPos, gunshell->pos.yPos, gunshell->pos.zPos);
@ -569,7 +569,7 @@ namespace T5M::Renderer
Matrix rotation = Matrix::CreateRotationY(TO_RAD(ring->objects[objectIndex].rotation + 16384 + g_Inventory.GetInventoryObject(inventoryObject)->rotY));
Matrix transform = (scale * rotation) * translation;
ObjectInfo *obj = &Objects[objectNumber];
OBJECT_INFO *obj = &Objects[objectNumber];
if (!m_moveableObjects[objectNumber].has_value())
continue;
RendererObject &moveableObj = *m_moveableObjects[objectNumber];
@ -1389,7 +1389,7 @@ namespace T5M::Renderer
if (Objects[ID_SPIDERS_EMITTER].loaded)
{
ObjectInfo* obj = &Objects[ID_SPIDERS_EMITTER];
OBJECT_INFO* obj = &Objects[ID_SPIDERS_EMITTER];
RendererObject* moveableObj = m_moveableObjects[ID_SPIDERS_EMITTER].get();
short* meshPtr = Meshes[Objects[ID_SPIDERS_EMITTER].meshIndex + ((Wibble >> 2) & 2)];
RendererMesh* mesh = m_meshPointersToMesh[meshPtr];
@ -1462,7 +1462,7 @@ namespace T5M::Renderer
if (Objects[ID_RATS_EMITTER].loaded)
{
ObjectInfo *obj = &Objects[ID_RATS_EMITTER];
OBJECT_INFO *obj = &Objects[ID_RATS_EMITTER];
RendererObject &moveableObj = *m_moveableObjects[ID_RATS_EMITTER];
for (int m = 0; m < 32; m++)
@ -1513,7 +1513,7 @@ namespace T5M::Renderer
if (Objects[ID_BATS_EMITTER].loaded)
{
ObjectInfo *obj = &Objects[ID_BATS_EMITTER];
OBJECT_INFO *obj = &Objects[ID_BATS_EMITTER];
RendererObject& moveableObj = *m_moveableObjects[ID_BATS_EMITTER];
RendererMesh *mesh = getMesh(Objects[ID_BATS_EMITTER].meshIndex + (-GlobalCounter & 3));
@ -2189,7 +2189,7 @@ namespace T5M::Renderer
}
RendererRoom &const room = m_rooms[item->Item->roomNumber];
RendererObject &moveableObj = *m_moveableObjects[item->Item->objectNumber];
ObjectInfo *obj = &Objects[item->Item->objectNumber];
OBJECT_INFO *obj = &Objects[item->Item->objectNumber];
m_stItem.World = item->World;
m_stItem.Position = Vector4(item->Item->pos.xPos, item->Item->pos.yPos, item->Item->pos.zPos, 1.0f);

View file

@ -490,7 +490,7 @@ namespace T5M::Renderer {
RendererObject& laraObj = *m_moveableObjects[ID_LARA];
RendererObject& laraSkin = *m_moveableObjects[ID_LARA_SKIN];
ObjectInfo* obj = &Objects[0];
OBJECT_INFO* obj = &Objects[0];
RendererRoom& const room = m_rooms[LaraItem->roomNumber];
RendererItem* item = &m_items[Lara.itemNumber];
@ -538,7 +538,7 @@ namespace T5M::Renderer {
break;
}
ObjectInfo* flashObj = &Objects[ID_GUN_FLASH];
OBJECT_INFO* flashObj = &Objects[ID_GUN_FLASH];
RendererObject& flashMoveable = *m_moveableObjects[ID_GUN_FLASH];
RendererMesh* flashMesh = flashMoveable.ObjectMeshes[0];
@ -594,7 +594,7 @@ namespace T5M::Renderer {
RendererItem* item = m_itemsToDraw[i];
// Does the item need gunflash?
ObjectInfo* obj = &Objects[item->Item->objectNumber];
OBJECT_INFO* obj = &Objects[item->Item->objectNumber];
if (obj->biteOffset == -1 || !item->Item->firedWeapon)
continue;
@ -931,7 +931,7 @@ namespace T5M::Renderer {
for (int i = 0; i < m_effectsToDraw.size(); i++) {
RendererEffect* effect = m_effectsToDraw[i];
RendererRoom& const room = m_rooms[effect->Effect->roomNumber];
ObjectInfo* obj = &Objects[effect->Effect->objectNumber];
OBJECT_INFO* obj = &Objects[effect->Effect->objectNumber];
if (obj->drawRoutine && obj->loaded)
drawEffect(effect, transparent);

View file

@ -450,7 +450,7 @@ namespace T5M::Renderer
if (fx->objectNumber < 0)
continue;
ObjectInfo *obj = &Objects[fx->objectNumber];
OBJECT_INFO *obj = &Objects[fx->objectNumber];
RendererEffect *newEffect = &m_effects[fxNum];

View file

@ -220,9 +220,9 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h
}
D3D11_BLEND_DESC blendStateDesc{};
blendStateDesc.AlphaToCoverageEnable = FALSE;
blendStateDesc.IndependentBlendEnable = FALSE;
blendStateDesc.RenderTarget[0].BlendEnable = TRUE;
blendStateDesc.AlphaToCoverageEnable = false;
blendStateDesc.IndependentBlendEnable = false;
blendStateDesc.RenderTarget[0].BlendEnable = true;
blendStateDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
blendStateDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
blendStateDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_REV_SUBTRACT;

View file

@ -9,6 +9,7 @@
#include "sphere.h"
#include "level.h"
#include "GameFlowScript.h"
#include <Specific\setup.h>
using namespace T5M::Renderer;
extern GameFlow *g_GameFlow;
@ -135,137 +136,6 @@ void Renderer11::UpdateLaraAnimations(bool force)
for (int m = 0; m < 15; m++)
laraObj.AnimationTransforms[m] = item->AnimationTransforms[m];
// At this point, Lara's matrices are ready. Now let's do ponytails...
// TODO: disabled for now
if (m_moveableObjects[ID_LARA_HAIR].has_value())
{
RendererObject& hairsObj = *m_moveableObjects[ID_LARA_HAIR];
lastMatrix = Matrix::Identity;
identity = Matrix::Identity;
Vector3 parentVertices[6][4];
Matrix headMatrix;
RendererObject& objSkin = *m_moveableObjects[ID_LARA_SKIN];
RendererObject& objLara = *m_moveableObjects[ID_LARA];
RendererMesh* parentMesh = objSkin.ObjectMeshes[LM_HEAD];
RendererBone* parentBone = objSkin.LinearizedBones[LM_HEAD];
world = objLara.AnimationTransforms[LM_HEAD] * m_LaraWorldMatrix;
int lastVertex = 0;
int lastIndex = 0;
GameScriptLevel* level = g_GameFlow->GetLevel(CurrentLevel);
for (int p = 0; p < ((level->LaraType == LARA_YOUNG) ? 2 : 1); p++)
{
// We can't use hardware skinning here, however hairs have just a few vertices so
// it's not so bad doing skinning in software
if (level->LaraType == LARA_YOUNG)
{
if (p == 1)
{
parentVertices[0][0] = Vector3::Transform(parentMesh->Positions[68], world);
parentVertices[0][1] = Vector3::Transform(parentMesh->Positions[69], world);
parentVertices[0][2] = Vector3::Transform(parentMesh->Positions[70], world);
parentVertices[0][3] = Vector3::Transform(parentMesh->Positions[71], world);
}
else
{
parentVertices[0][0] = Vector3::Transform(parentMesh->Positions[78], world);
parentVertices[0][1] = Vector3::Transform(parentMesh->Positions[78], world);
parentVertices[0][2] = Vector3::Transform(parentMesh->Positions[77], world);
parentVertices[0][3] = Vector3::Transform(parentMesh->Positions[76], world);
}
}
else
{
parentVertices[0][0] = Vector3::Transform(parentMesh->Positions[37], world);
parentVertices[0][1] = Vector3::Transform(parentMesh->Positions[39], world);
parentVertices[0][2] = Vector3::Transform(parentMesh->Positions[40], world);
parentVertices[0][3] = Vector3::Transform(parentMesh->Positions[38], world);
}
for (int i = 0; i < 6; i++)
{
RendererMesh* mesh = hairsObj.ObjectMeshes[i];
RendererBucket* bucket = &mesh->Buckets[RENDERER_BUCKET_SOLID];
translation = Matrix::CreateTranslation(Hairs[p][i + 1].pos.xPos, Hairs[p][i + 1].pos.yPos, Hairs[p][i + 1].pos.zPos);
rotation = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[p][i + 1].pos.yRot), TO_RAD(Hairs[p][i + 1].pos.xRot), 0);
m_hairsMatrices[6 * p + i] = rotation * translation;
int baseVertex = lastVertex;
for (int j = 0; j < bucket->Vertices.size(); j++)
{
int oldVertexIndex = (int)bucket->Vertices[j].Bone;
if (oldVertexIndex < 4)
{
m_hairVertices[lastVertex].Position.x = parentVertices[i][oldVertexIndex].x;
m_hairVertices[lastVertex].Position.y = parentVertices[i][oldVertexIndex].y;
m_hairVertices[lastVertex].Position.z = parentVertices[i][oldVertexIndex].z;
m_hairVertices[lastVertex].UV.x = bucket->Vertices[j].UV.x;
m_hairVertices[lastVertex].UV.y = bucket->Vertices[j].UV.y;
Vector3 n = Vector3(bucket->Vertices[j].Normal.x, bucket->Vertices[j].Normal.y, bucket->Vertices[j].Normal.z);
n.Normalize();
n = Vector3::TransformNormal(n, m_hairsMatrices[6 * p + i]);
n.Normalize();
m_hairVertices[lastVertex].Normal.x = n.x;
m_hairVertices[lastVertex].Normal.y = n.y;
m_hairVertices[lastVertex].Normal.z = n.z;
m_hairVertices[lastVertex].Color = Vector4::One * 0.5f;
lastVertex++;
}
else
{
Vector3 in = Vector3(bucket->Vertices[j].Position.x, bucket->Vertices[j].Position.y, bucket->Vertices[j].Position.z);
Vector3 out = Vector3::Transform(in, m_hairsMatrices[6 * p + i]);
if (i < 5)
{
parentVertices[i + 1][oldVertexIndex - 4].x = out.x;
parentVertices[i + 1][oldVertexIndex - 4].y = out.y;
parentVertices[i + 1][oldVertexIndex - 4].z = out.z;
}
m_hairVertices[lastVertex].Position.x = out.x;
m_hairVertices[lastVertex].Position.y = out.y;
m_hairVertices[lastVertex].Position.z = out.z;
m_hairVertices[lastVertex].UV.x = bucket->Vertices[j].UV.x;
m_hairVertices[lastVertex].UV.y = bucket->Vertices[j].UV.y;
Vector3 n = Vector3(bucket->Vertices[j].Normal.x, bucket->Vertices[j].Normal.y, bucket->Vertices[j].Normal.z);
n.Normalize();
n = Vector3::TransformNormal(n, m_hairsMatrices[6 * p + i]);
n.Normalize();
m_hairVertices[lastVertex].Normal.x = n.x;
m_hairVertices[lastVertex].Normal.y = n.y;
m_hairVertices[lastVertex].Normal.z = n.z;
m_hairVertices[lastVertex].Color = Vector4::One * 0.5f;
lastVertex++;
}
}
for (int j = 0; j < bucket->Indices.size(); j++)
{
m_hairIndices[lastIndex] = baseVertex + bucket->Indices[j];
lastIndex++;
}
}
}
}
m_items[Lara.itemNumber].DoneAnimations = true;
}
@ -371,19 +241,21 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap)
}
}
if (!transparent)
if (!transparent && Objects[ID_LARA_HAIR].loaded)
{
/*RendererObject& hairsObj = *m_moveableObjects[ID_LARA_HAIR];
RendererObject& hairsObj = *m_moveableObjects[ID_LARA_HAIR];
Matrix matrices[8];
matrices[0] = (laraObj.AnimationTransforms.data())[LM_HEAD];
// First matrix is Lara's head matrix, then all 6 hairs matrices. Bones are adjusted at load time for accounting this.
m_stItem.World = Matrix::Identity;
Matrix matrices[7];
matrices[0] = laraObj.AnimationTransforms[LM_HEAD] * m_LaraWorldMatrix;
for (int i = 0; i < hairsObj.BindPoseTransforms.size(); i++)
{
HAIR_STRUCT* hairs = &Hairs[0][i];
Matrix world = Matrix::CreateFromYawPitchRoll(TO_RAD(hairs->pos.yRot), TO_RAD(hairs->pos.xRot), TO_RAD(hairs->pos.zRot))* Matrix::CreateTranslation(hairs->pos.xPos-LaraItem->pos.xPos, hairs->pos.yPos - LaraItem->pos.yPos, hairs->pos.zPos - LaraItem->pos.zPos);
matrices[i] = (laraObj.AnimationTransforms.data())[LM_HEAD] * world;
Matrix world = Matrix::CreateFromYawPitchRoll(TO_RAD(hairs->pos.yRot), TO_RAD(hairs->pos.xRot), 0) * Matrix::CreateTranslation(hairs->pos.xPos, hairs->pos.yPos, hairs->pos.zPos);
matrices[i + 1] = world;
}
memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 8);
memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 7);
updateConstantBuffer<CItemBuffer>(m_cbItem, m_stItem);
m_context->VSSetConstantBuffers(1, 1, &m_cbItem);
m_context->PSSetConstantBuffers(1, 1, &m_cbItem);
@ -403,37 +275,6 @@ bool Renderer11::drawLara(bool transparent, bool shadowMap)
m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0);
m_numDrawCalls++;
}
}*/
/*for (int k = 0; k < laraSkin->ObjectMeshes.size(); k++)
{
RendererMesh* mesh = laraSkin.ObjectMeshes[k];
for (int j = 0; j < NUM_BUCKETS; j++)
{
RendererBucket* bucket = &mesh->Buckets[j];
if (bucket->Vertices.size() == 0)
continue;
// Draw vertices
m_context->DrawIndexed(bucket->Indices.size(), bucket->StartIndex, 0);
m_numDrawCalls++;
}
}*/
// Hairs are pre-transformed
Matrix matrices[8] = { Matrix::Identity, Matrix::Identity, Matrix::Identity, Matrix::Identity,
Matrix::Identity, Matrix::Identity, Matrix::Identity, Matrix::Identity };
memcpy(m_stItem.BonesMatrices, matrices, sizeof(Matrix) * 8);
m_stItem.World = Matrix::Identity;
updateConstantBuffer<CItemBuffer>(m_cbItem,m_stItem);
if (m_moveableObjects[ID_LARA_HAIR].has_value())
{
m_primitiveBatch->Begin();
m_primitiveBatch->DrawIndexed(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST, (const uint16_t*)m_hairIndices.data(), m_numHairIndices, m_hairVertices.data(), m_numHairVertices);
m_primitiveBatch->End();
}
}

View file

@ -195,7 +195,7 @@ int LoadItems()
void LoadObjects()
{
memset(Objects, 0, sizeof(ObjectInfo) * ID_NUMBER_OBJECTS);
memset(Objects, 0, sizeof(OBJECT_INFO) * ID_NUMBER_OBJECTS);
memset(StaticObjects, 0, sizeof(StaticInfo) * MAX_STATICS);
int numMeshes = ReadInt32();

View file

@ -36,7 +36,7 @@ extern byte Sequences[3];
extern byte CurrentSequence;
extern int NumRPickups;
ObjectInfo Objects[ID_NUMBER_OBJECTS];
OBJECT_INFO Objects[ID_NUMBER_OBJECTS];
StaticInfo StaticObjects[MAX_STATICS];
void InitialiseGameFlags()
@ -52,7 +52,7 @@ void InitialiseGameFlags()
void ObjectObjects()
{
ObjectInfo* obj;
OBJECT_INFO* obj;
obj = &Objects[ID_CAMERA_TARGET];
if (obj->loaded)
@ -617,7 +617,7 @@ void ObjectObjects()
void TrapObjects()
{
ObjectInfo* obj;
OBJECT_INFO* obj;
obj = &Objects[ID_KILL_ALL_TRIGGERS];
if (obj->loaded)
{
@ -795,7 +795,7 @@ void CustomObjects()
void InitialiseObjects()
{
ObjectInfo* obj;
OBJECT_INFO* obj;
for (int i = 0; i < ID_NUMBER_OBJECTS; i++)
{

View file

@ -12,7 +12,7 @@ typedef enum HitEffectEnum
MAX_HIT_EFFECT
};
typedef struct ObjectInfo
typedef struct OBJECT_INFO
{
short nmeshes;
short meshIndex;
@ -75,7 +75,7 @@ typedef struct StaticInfo
constexpr auto GRAVITY = 6;
constexpr auto SWAMP_GRAVITY = 2;
extern ObjectInfo Objects[ID_NUMBER_OBJECTS];
extern OBJECT_INFO Objects[ID_NUMBER_OBJECTS];
extern StaticInfo StaticObjects[MAX_STATICS];
void InitialiseGameFlags();