From 066bb0f67eee5a16bd19314ba622e05d2c89a51a Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 12 Nov 2023 10:50:29 +1100 Subject: [PATCH] Disable custom models on consoles --- src/Core.h | 1 + src/Entity.c | 18 +++-- src/HeldBlockRenderer.c | 6 ++ src/Model.c | 22 ++++-- src/Protocol.c | 170 ++++++++++++++++++++++------------------ 5 files changed, 129 insertions(+), 88 deletions(-) diff --git a/src/Core.h b/src/Core.h index 7259ac8e6..4193ca3f7 100644 --- a/src/Core.h +++ b/src/Core.h @@ -317,6 +317,7 @@ typedef cc_uint8 cc_bool; #ifndef CC_BUILD_LOWMEM #define EXTENDED_BLOCKS +#define CUSTOM_MODELS #endif #define EXTENDED_TEXTURES diff --git a/src/Entity.c b/src/Entity.c index a68a15cc8..bfb8db79c 100644 --- a/src/Entity.c +++ b/src/Entity.c @@ -440,7 +440,8 @@ struct _EntitiesData Entities; void Entities_Tick(struct ScheduledTask* task) { int i; - for (i = 0; i < ENTITIES_MAX_COUNT; i++) { + for (i = 0; i < ENTITIES_MAX_COUNT; i++) + { if (!Entities.List[i]) continue; Entities.List[i]->VTABLE->Tick(Entities.List[i], task->interval); } @@ -450,7 +451,8 @@ void Entities_RenderModels(double delta, float t) { int i; Gfx_SetAlphaTest(true); - for (i = 0; i < ENTITIES_MAX_COUNT; i++) { + for (i = 0; i < ENTITIES_MAX_COUNT; i++) + { if (!Entities.List[i]) continue; Entities.List[i]->VTABLE->RenderModel(Entities.List[i], delta, t); } @@ -458,12 +460,16 @@ void Entities_RenderModels(double delta, float t) { } static void Entities_ContextLost(void* obj) { + struct Entity* entity; int i; - if (Gfx.ManagedTextures) return; - for (i = 0; i < ENTITIES_MAX_COUNT; i++) { - if (!Entities.List[i]) continue; - DeleteSkin(Entities.List[i]); + for (i = 0; i < ENTITIES_MAX_COUNT; i++) + { + entity = Entities.List[i]; + if (!entity) continue; + Gfx_DeleteDynamicVb(&entity->ModelVB); + + if (!Gfx.ManagedTextures) DeleteSkin(entity); } } /* No OnContextCreated, skin textures remade when needed */ diff --git a/src/HeldBlockRenderer.c b/src/HeldBlockRenderer.c index 83917bc25..7948a23ae 100644 --- a/src/HeldBlockRenderer.c +++ b/src/HeldBlockRenderer.c @@ -225,6 +225,11 @@ void HeldBlockRenderer_Render(double delta) { Gfx_LoadMatrix(MATRIX_PROJECTION, &Gfx.Projection); } + +static void OnContextLost(void* obj) { + Gfx_DeleteDynamicVb(&held_entity.ModelVB); +} + static const struct EntityVTABLE heldEntity_VTABLE = { NULL, NULL, NULL, HeldBlockRenderer_GetCol, NULL, NULL @@ -240,6 +245,7 @@ static void OnInit(void) { Event_Register_(&GfxEvents.ProjectionChanged, NULL, OnProjectionChanged); Event_Register_(&UserEvents.HeldBlockChanged, NULL, DoSwitchBlockAnim); Event_Register_(&UserEvents.BlockChanged, NULL, OnBlockChanged); + Event_Register_(&GfxEvents.ContextLost, NULL, OnContextLost); } struct IGameComponent HeldBlockRenderer_Component = { diff --git a/src/Model.c b/src/Model.c index 749f8bcc7..cd88afbe4 100644 --- a/src/Model.c +++ b/src/Model.c @@ -14,6 +14,8 @@ #include "Options.h" struct _ModelsData Models; +/* NOTE: None of the built in models use more than 12 parts at once, but custom models can use up to 64 parts. */ +#define MODELS_MAX_VERTICES (MODEL_BOX_VERTICES * MAX_CUSTOM_MODEL_PARTS) #define UV_POS_MASK ((cc_uint16)0x7FFF) #define UV_MAX ((cc_uint16)0x8000) @@ -174,13 +176,21 @@ void Model_UpdateVB(void) { /* Need to restore vertices array to keep third party plugins such as MoreModels working */ static struct VertexTextured* real_vertices; +static GfxResourceID modelVB; + void Model_LockVB(struct Entity* entity, int verticesCount) { - real_vertices = Models.Vertices; - Models.Vertices = Gfx_LockDynamicVb(Models.Vb, VERTEX_FORMAT_TEXTURED, verticesCount); + real_vertices = Models.Vertices; + /*if (!entity->ModelVB) { + entity->ModelVB = Gfx_CreateDynamicVb(VERTEX_FORMAT_TEXTURED, Models.Active->maxVertices); + } + modelVB = entity->ModelVB;*/ + modelVB = Models.Vb; + + Models.Vertices = Gfx_LockDynamicVb(modelVB, VERTEX_FORMAT_TEXTURED, verticesCount); } void Model_UnlockVB(void) { - Gfx_UnlockDynamicVb(Models.Vb); + Gfx_UnlockDynamicVb(modelVB); Models.Vertices = real_vertices; } @@ -503,11 +513,10 @@ static void Models_TextureChanged(void* obj, struct Stream* stream, const cc_str } +#ifdef CUSTOM_MODELS /*########################################################################################################################* *------------------------------------------------------Custom Models------------------------------------------------------* *#########################################################################################################################*/ -/* NOTE: None of the built in models use more than 12 parts at once, but custom models can use up to 64 parts. */ -#define MODELS_MAX_VERTICES (MODEL_BOX_VERTICES * MAX_CUSTOM_MODEL_PARTS) struct CustomModel custom_models[MAX_CUSTOM_MODELS]; void CustomModel_BuildPart(struct CustomModel* cm, struct CustomModelPartDef* part) { @@ -878,6 +887,9 @@ static void CustomModel_FreeAll(void) { CustomModel_Undefine(&custom_models[i]); } } +#else +static void CustomModel_FreeAll(void) { } +#endif /*########################################################################################################################* diff --git a/src/Protocol.c b/src/Protocol.c index d3e2362ec..221c5370a 100644 --- a/src/Protocol.c +++ b/src/Protocol.c @@ -96,7 +96,10 @@ static struct CpeExt* cpe_clientExtensions[] = { &messageTypes_Ext, &hackControl_Ext, &playerClick_Ext, &fullCP437_Ext, &longerMessages_Ext, &blockDefs_Ext, &blockDefsExt_Ext, &bulkBlockUpdate_Ext, &textColors_Ext, &envMapAspect_Ext, &entityProperty_Ext, &extEntityPos_Ext, &twoWayPing_Ext, &invOrder_Ext, &instantMOTD_Ext, &fastMap_Ext, &setHotbar_Ext, &setSpawnpoint_Ext, &velControl_Ext, - &customParticles_Ext, &customModels_Ext, &pluginMessages_Ext, &extTeleport_Ext, + &customParticles_Ext, &pluginMessages_Ext, &extTeleport_Ext, +#ifdef CUSTOM_MODELS + &customModels_Ext, +#endif #ifdef EXTENDED_TEXTURES &extTextures_Ext, #endif @@ -1495,6 +1498,88 @@ static void CPE_SpawnEffect(cc_uint8* data) { Particles_CustomEffect(data[0], x, y, z, originX, originY, originZ); } +static void CPE_PluginMessage(cc_uint8* data) { + cc_uint8 channel = data[0]; + Event_RaisePluginMessage(&NetEvents.PluginMessageReceived, channel, data + 1); +} + +static void CPE_ExtEntityTeleport(cc_uint8* data) { + EntityID id = *data++; + cc_uint8 packetFlags = *data++; + cc_uint8 flags = 0; + + /* bit 0 includes position */ + /* bits 1-2 position mode(absolute_instant / absolute_smooth / relative_smooth / relative_seamless) */ + /* bit 3 unused */ + /* bit 4 includes orientation */ + /* bit 5 interpolate ori */ + /* bit 6-7 unused */ + + if (packetFlags & 1) flags |= LU_HAS_POS; + flags |= (packetFlags & 6) << 4; /* bit-and with 00000110 to isolate only pos mode, then left shift by 4 to match client mode offset */ + if (packetFlags & 16) flags |= LU_HAS_PITCH | LU_HAS_YAW; + if (packetFlags & 32) flags |= LU_ORI_INTERPOLATE; + + Classic_ReadAbsoluteLocation(data, id, flags); +} + +static void CPE_Reset(void) { + cpe_serverExtensionsCount = 0; cpe_pingTicks = 0; + CPEExtensions_Reset(); + cpe_needD3Fix = false; + Game_UseCPEBlocks = false; + if (!Game_Version.HasCPE) return; + + Net_Set(OPCODE_EXT_INFO, CPE_ExtInfo, 67); + Net_Set(OPCODE_EXT_ENTRY, CPE_ExtEntry, 69); + Net_Set(OPCODE_SET_REACH, CPE_SetClickDistance, 3); + Net_Set(OPCODE_CUSTOM_BLOCK_LEVEL, CPE_CustomBlockLevel, 2); + Net_Set(OPCODE_HOLD_THIS, CPE_HoldThis, 3); + Net_Set(OPCODE_SET_TEXT_HOTKEY, CPE_SetTextHotkey, 134); + + Net_Set(OPCODE_EXT_ADD_PLAYER_NAME, CPE_ExtAddPlayerName, 196); + Net_Set(OPCODE_EXT_ADD_ENTITY, CPE_ExtAddEntity, 130); + Net_Set(OPCODE_EXT_REMOVE_PLAYER_NAME, CPE_ExtRemovePlayerName, 3); + + Net_Set(OPCODE_ENV_SET_COLOR, CPE_SetEnvCol, 8); + Net_Set(OPCODE_MAKE_SELECTION, CPE_MakeSelection, 86); + Net_Set(OPCODE_REMOVE_SELECTION, CPE_RemoveSelection, 2); + Net_Set(OPCODE_SET_BLOCK_PERMISSION, CPE_SetBlockPermission, 4); + Net_Set(OPCODE_SET_MODEL, CPE_ChangeModel, 66); + Net_Set(OPCODE_ENV_SET_MAP_APPEARANCE, CPE_EnvSetMapAppearance, 69); + Net_Set(OPCODE_ENV_SET_WEATHER, CPE_EnvWeatherType, 2); + Net_Set(OPCODE_HACK_CONTROL, CPE_HackControl, 8); + Net_Set(OPCODE_EXT_ADD_ENTITY2, CPE_ExtAddEntity2, 138); + + Net_Set(OPCODE_BULK_BLOCK_UPDATE, CPE_BulkBlockUpdate, 1282); + Net_Set(OPCODE_SET_TEXT_COLOR, CPE_SetTextColor, 6); + Net_Set(OPCODE_ENV_SET_MAP_URL, CPE_SetMapEnvUrl, 65); + Net_Set(OPCODE_ENV_SET_MAP_PROPERTY, CPE_SetMapEnvProperty, 6); + Net_Set(OPCODE_SET_ENTITY_PROPERTY, CPE_SetEntityProperty, 7); + Net_Set(OPCODE_TWO_WAY_PING, CPE_TwoWayPing, 4); + Net_Set(OPCODE_SET_INVENTORY_ORDER, CPE_SetInventoryOrder, 3); + Net_Set(OPCODE_SET_HOTBAR, CPE_SetHotbar, 3); + Net_Set(OPCODE_SET_SPAWNPOINT, CPE_SetSpawnPoint, 9); + Net_Set(OPCODE_VELOCITY_CONTROL, CPE_VelocityControl, 16); + Net_Set(OPCODE_DEFINE_EFFECT, CPE_DefineEffect, 36); + Net_Set(OPCODE_SPAWN_EFFECT, CPE_SpawnEffect, 26); + Net_Set(OPCODE_PLUGIN_MESSAGE, CPE_PluginMessage, 66); + Net_Set(OPCODE_ENTITY_TELEPORT_EXT, CPE_ExtEntityTeleport, 11); +} + +static cc_uint8* CPE_Tick(cc_uint8* data) { + cpe_pingTicks++; + if (cpe_pingTicks >= 20 && IsSupported(twoWayPing_Ext)) { + data = CPE_WriteTwoWayPing(data, false, Ping_NextPingId()); + cpe_pingTicks = 0; + } + return data; +} + +#ifdef CUSTOM_MODELS +/*########################################################################################################################* +*------------------------------------------------------Custom models------------------------------------------------------* +*#########################################################################################################################*/ static void CPE_DefineModel(cc_uint8* data) { cc_uint8 id = data[0]; struct CustomModel* cm = &custom_models[id]; @@ -1613,86 +1698,16 @@ static void CPE_UndefineModel(cc_uint8* data) { if (id < MAX_CUSTOM_MODELS) CustomModel_Undefine(&custom_models[id]); } -static void CPE_PluginMessage(cc_uint8* data) { - cc_uint8 channel = data[0]; - Event_RaisePluginMessage(&NetEvents.PluginMessageReceived, channel, data + 1); -} - -static void CPE_ExtEntityTeleport(cc_uint8* data) { - EntityID id = *data++; - cc_uint8 packetFlags = *data++; - cc_uint8 flags = 0; - - /* bit 0 includes position */ - /* bits 1-2 position mode(absolute_instant / absolute_smooth / relative_smooth / relative_seamless) */ - /* bit 3 unused */ - /* bit 4 includes orientation */ - /* bit 5 interpolate ori */ - /* bit 6-7 unused */ - - if (packetFlags & 1) flags |= LU_HAS_POS; - flags |= (packetFlags & 6) << 4; /* bit-and with 00000110 to isolate only pos mode, then left shift by 4 to match client mode offset */ - if (packetFlags & 16) flags |= LU_HAS_PITCH | LU_HAS_YAW; - if (packetFlags & 32) flags |= LU_ORI_INTERPOLATE; - - Classic_ReadAbsoluteLocation(data, id, flags); -} - -static void CPE_Reset(void) { - cpe_serverExtensionsCount = 0; cpe_pingTicks = 0; - CPEExtensions_Reset(); - cpe_needD3Fix = false; - Game_UseCPEBlocks = false; +static void CustomModels_Reset(void) { if (!Game_Version.HasCPE) return; - Net_Set(OPCODE_EXT_INFO, CPE_ExtInfo, 67); - Net_Set(OPCODE_EXT_ENTRY, CPE_ExtEntry, 69); - Net_Set(OPCODE_SET_REACH, CPE_SetClickDistance, 3); - Net_Set(OPCODE_CUSTOM_BLOCK_LEVEL, CPE_CustomBlockLevel, 2); - Net_Set(OPCODE_HOLD_THIS, CPE_HoldThis, 3); - Net_Set(OPCODE_SET_TEXT_HOTKEY, CPE_SetTextHotkey, 134); - - Net_Set(OPCODE_EXT_ADD_PLAYER_NAME, CPE_ExtAddPlayerName, 196); - Net_Set(OPCODE_EXT_ADD_ENTITY, CPE_ExtAddEntity, 130); - Net_Set(OPCODE_EXT_REMOVE_PLAYER_NAME, CPE_ExtRemovePlayerName, 3); - - Net_Set(OPCODE_ENV_SET_COLOR, CPE_SetEnvCol, 8); - Net_Set(OPCODE_MAKE_SELECTION, CPE_MakeSelection, 86); - Net_Set(OPCODE_REMOVE_SELECTION, CPE_RemoveSelection, 2); - Net_Set(OPCODE_SET_BLOCK_PERMISSION, CPE_SetBlockPermission, 4); - Net_Set(OPCODE_SET_MODEL, CPE_ChangeModel, 66); - Net_Set(OPCODE_ENV_SET_MAP_APPEARANCE, CPE_EnvSetMapAppearance, 69); - Net_Set(OPCODE_ENV_SET_WEATHER, CPE_EnvWeatherType, 2); - Net_Set(OPCODE_HACK_CONTROL, CPE_HackControl, 8); - Net_Set(OPCODE_EXT_ADD_ENTITY2, CPE_ExtAddEntity2, 138); - - Net_Set(OPCODE_BULK_BLOCK_UPDATE, CPE_BulkBlockUpdate, 1282); - Net_Set(OPCODE_SET_TEXT_COLOR, CPE_SetTextColor, 6); - Net_Set(OPCODE_ENV_SET_MAP_URL, CPE_SetMapEnvUrl, 65); - Net_Set(OPCODE_ENV_SET_MAP_PROPERTY, CPE_SetMapEnvProperty, 6); - Net_Set(OPCODE_SET_ENTITY_PROPERTY, CPE_SetEntityProperty, 7); - Net_Set(OPCODE_TWO_WAY_PING, CPE_TwoWayPing, 4); - Net_Set(OPCODE_SET_INVENTORY_ORDER, CPE_SetInventoryOrder, 3); - Net_Set(OPCODE_SET_HOTBAR, CPE_SetHotbar, 3); - Net_Set(OPCODE_SET_SPAWNPOINT, CPE_SetSpawnPoint, 9); - Net_Set(OPCODE_VELOCITY_CONTROL, CPE_VelocityControl, 16); - Net_Set(OPCODE_DEFINE_EFFECT, CPE_DefineEffect, 36); - Net_Set(OPCODE_SPAWN_EFFECT, CPE_SpawnEffect, 26); - Net_Set(OPCODE_DEFINE_MODEL, CPE_DefineModel, 116); + Net_Set(OPCODE_DEFINE_MODEL, CPE_DefineModel, 116); Net_Set(OPCODE_DEFINE_MODEL_PART, CPE_DefineModelPart, 104); - Net_Set(OPCODE_UNDEFINE_MODEL, CPE_UndefineModel, 2); - Net_Set(OPCODE_PLUGIN_MESSAGE, CPE_PluginMessage, 66); - Net_Set(OPCODE_ENTITY_TELEPORT_EXT, CPE_ExtEntityTeleport, 11); -} - -static cc_uint8* CPE_Tick(cc_uint8* data) { - cpe_pingTicks++; - if (cpe_pingTicks >= 20 && IsSupported(twoWayPing_Ext)) { - data = CPE_WriteTwoWayPing(data, false, Ping_NextPingId()); - cpe_pingTicks = 0; - } - return data; + Net_Set(OPCODE_UNDEFINE_MODEL, CPE_UndefineModel, 2); } +#else +static void CustomModels_Reset(void) { } +#endif /*########################################################################################################################* @@ -1829,6 +1844,7 @@ static void Protocol_Reset(void) { Classic_Reset(); CPE_Reset(); BlockDefs_Reset(); + CustomModels_Reset(); WoM_Reset(); }