Cleanup CustomModel packet reading code, pretty sure this doesn't break anything

This commit is contained in:
UnknownShadow200 2020-06-23 17:06:27 +10:00
parent 2f4dae3295
commit 730eadf47b

View File

@ -99,6 +99,12 @@ static String UNSAFE_GetString(cc_uint8* data) {
return String_Init((char*)data, length, STRING_SIZE); return String_Init((char*)data, length, STRING_SIZE);
} }
static float GetFloat(cc_uint8* data) {
union IntAndFloat raw;
raw.u = Stream_GetU32_BE(data);
return raw.f;
}
static void ReadString(cc_uint8** ptr, String* str) { static void ReadString(cc_uint8** ptr, String* str) {
int i, length = 0; int i, length = 0;
cc_uint8* data = *ptr; cc_uint8* data = *ptr;
@ -1391,75 +1397,44 @@ static void CPE_SpawnEffect(cc_uint8* data) {
Particles_CustomEffect(data[0], x, y, z, originX, originY, originZ); Particles_CustomEffect(data[0], x, y, z, originX, originY, originZ);
} }
/* CustomModels */
static float ReadFloat(cc_uint8* data) {
union IntAndFloat raw;
raw.u = Stream_GetU32_BE(data);
return raw.f;
}
static void CPE_DefineModel(cc_uint8* data) { static void CPE_DefineModel(cc_uint8* data) {
/* 115 = 1 + 64 + 1 + 2*4 + 3*4 + 2*3*4 + 2*2 + 1 */ cc_uint8 id = data[0];
cc_uint8 id = *data++; struct CustomModel* cm = &custom_models[id];
struct CustomModel* customModel = &custom_models[id];
String name; String name;
cc_uint8 flags; cc_uint8 flags;
cc_uint8 numParts; cc_uint8 numParts;
if (id >= MAX_CUSTOM_MODELS) return; if (id >= MAX_CUSTOM_MODELS) return;
CustomModel_Undefine(customModel); CustomModel_Undefine(cm);
Model_Init(&customModel->model); Model_Init(&cm->model);
/* read name */ name = UNSAFE_GetString(data + 1);
name = UNSAFE_GetString(data); String_CopyToRawArray(cm->name, &name);
data += STRING_SIZE;
String_CopyToRawArray(customModel->name, &name);
/* read bool flags */ flags = data[65];
flags = *data++; cm->model.bobbing = flags & 0x01;
customModel->model.bobbing = (flags >> 0) & 1; cm->model.pushes = flags & 0x02;
customModel->model.pushes = (flags >> 1) & 1; cm->model.usesHumanSkin = flags & 0x04;
customModel->model.usesHumanSkin = (flags >> 2) & 1; cm->model.calcHumanAnims = flags & 0x08;
customModel->model.calcHumanAnims = (flags >> 3) & 1;
/* read nameY, eyeY */ cm->nameY = GetFloat(data + 66);
customModel->nameY = ReadFloat(data); cm->eyeY = GetFloat(data + 70);
data += 4;
customModel->eyeY = ReadFloat(data);
data += 4;
/* read collisionBounds */ cm->collisionBounds.X = GetFloat(data + 74);
customModel->collisionBounds.X = ReadFloat(data); cm->collisionBounds.Y = GetFloat(data + 78);
data += 4; cm->collisionBounds.Z = GetFloat(data + 82);
customModel->collisionBounds.Y = ReadFloat(data);
data += 4;
customModel->collisionBounds.Z = ReadFloat(data);
data += 4;
/* read pickingBoundsAABB */ cm->pickingBoundsAABB.Min.X = GetFloat(data + 86);
customModel->pickingBoundsAABB.Min.X = ReadFloat(data); cm->pickingBoundsAABB.Min.Y = GetFloat(data + 90);
data += 4; cm->pickingBoundsAABB.Min.Z = GetFloat(data + 94);
customModel->pickingBoundsAABB.Min.Y = ReadFloat(data);
data += 4;
customModel->pickingBoundsAABB.Min.Z = ReadFloat(data);
data += 4;
customModel->pickingBoundsAABB.Max.X = ReadFloat(data); cm->pickingBoundsAABB.Max.X = GetFloat(data + 98);
data += 4; cm->pickingBoundsAABB.Max.Y = GetFloat(data + 102);
customModel->pickingBoundsAABB.Max.Y = ReadFloat(data); cm->pickingBoundsAABB.Max.Z = GetFloat(data + 106);
data += 4;
customModel->pickingBoundsAABB.Max.Z = ReadFloat(data);
data += 4;
/* read uScale, vScale */ cm->uScale = Stream_GetU16_BE(data + 110);
customModel->uScale = Stream_GetU16_BE(data); cm->vScale = Stream_GetU16_BE(data + 112);
data += 2; numParts = data[114];
customModel->vScale = Stream_GetU16_BE(data);
data += 2;
/* read # CustomModelParts */
numParts = *data++;
if (numParts > MAX_CUSTOM_MODEL_PARTS) { if (numParts > MAX_CUSTOM_MODEL_PARTS) {
String msg; char msgBuffer[256]; String msg; char msgBuffer[256];
@ -1474,14 +1449,13 @@ static void CPE_DefineModel(cc_uint8* data) {
return; return;
} }
customModel->numParts = numParts; cm->numParts = numParts;
customModel->vertices = Mem_AllocCleared( cm->vertices = Mem_AllocCleared(
numParts * MODEL_BOX_VERTICES, numParts * MODEL_BOX_VERTICES,
sizeof(struct ModelVertex), sizeof(struct ModelVertex),
"CustomModel vertices" "CustomModel vertices"
); );
cm->defined = true;
customModel->defined = true;
} }
static void CPE_DefineModelPart(cc_uint8* data) { static void CPE_DefineModelPart(cc_uint8* data) {
@ -1504,18 +1478,18 @@ static void CPE_DefineModelPart(cc_uint8* data) {
customModel->curPartIndex++; customModel->curPartIndex++;
/* read min, max vec3 coords */ /* read min, max vec3 coords */
part->min.X = ReadFloat(data); part->min.X = GetFloat(data);
data += 4; data += 4;
part->min.Y = ReadFloat(data); part->min.Y = GetFloat(data);
data += 4; data += 4;
part->min.Z = ReadFloat(data); part->min.Z = GetFloat(data);
data += 4; data += 4;
part->max.X = ReadFloat(data); part->max.X = GetFloat(data);
data += 4; data += 4;
part->max.Y = ReadFloat(data); part->max.Y = GetFloat(data);
data += 4; data += 4;
part->max.Z = ReadFloat(data); part->max.Z = GetFloat(data);
data += 4; data += 4;
/* read u, v coords for our 6 faces */ /* read u, v coords for our 6 faces */
@ -1532,26 +1506,26 @@ static void CPE_DefineModelPart(cc_uint8* data) {
} }
/* read rotation origin point */ /* read rotation origin point */
part->rotationOrigin.X = ReadFloat(data); part->rotationOrigin.X = GetFloat(data);
data += 4; data += 4;
part->rotationOrigin.Y = ReadFloat(data); part->rotationOrigin.Y = GetFloat(data);
data += 4; data += 4;
part->rotationOrigin.Z = ReadFloat(data); part->rotationOrigin.Z = GetFloat(data);
data += 4; data += 4;
/* read rotation angles */ /* read rotation angles */
part->rotation.X = ReadFloat(data); part->rotation.X = GetFloat(data);
data += 4; data += 4;
part->rotation.Y = ReadFloat(data); part->rotation.Y = GetFloat(data);
data += 4; data += 4;
part->rotation.Z = ReadFloat(data); part->rotation.Z = GetFloat(data);
data += 4; data += 4;
/* read anim */ /* read anim */
part->anim = *data++; part->anim = *data++;
/* read animModifier */ /* read animModifier */
part->animModifier = ReadFloat(data); part->animModifier = GetFloat(data);
data += 4; data += 4;
/* read bool flags */ /* read bool flags */
@ -1756,34 +1730,6 @@ static void BlockDefs_DefineBlockExt(cc_uint8* data) {
BlockDefs_DefineBlockCommonEnd(data, 1, block); BlockDefs_DefineBlockCommonEnd(data, 1, block);
} }
#if 0
void HandleDefineModel(cc_uint8* data) {
int start = reader.index - 1;
cc_uint8 id = *data++;
cc_uint8 type = *data++;
CustomModel model = null;
switch (type) {
case 0:
model = new CustomModel(game);
model.ReadSetupPacket(reader);
game.ModelCache.CustomModels[id] = model;
break;
case 1:
model = game.ModelCache.CustomModels[id];
if (model != null) model.ReadMetadataPacket(reader);
break;
case 2:
model = game.ModelCache.CustomModels[id];
if (model != null) model.ReadDefinePartPacket(reader);
break;
case 3:
model = game.ModelCache.CustomModels[id];
if (model != null) model.ReadRotationPacket(reader);
break;
}
}
#endif
static void BlockDefs_Reset(void) { static void BlockDefs_Reset(void) {
if (!Game_UseCPE || !Game_AllowCustomBlocks) return; if (!Game_UseCPE || !Game_AllowCustomBlocks) return;
Net_Set(OPCODE_DEFINE_BLOCK, BlockDefs_DefineBlock, 80); Net_Set(OPCODE_DEFINE_BLOCK, BlockDefs_DefineBlock, 80);