mirror of
https://github.com/sampletext32/ParkanPlayground.git
synced 2025-12-11 04:51:21 +04:00
291 lines
10 KiB
C
291 lines
10 KiB
C
|
|
/* returns index into g_MaterialGlobalDescriptors */
|
|
|
|
int __fastcall LoadMaterialByName(char *itemname)
|
|
|
|
{
|
|
char *pcVar1;
|
|
undefined1 *puVar2;
|
|
byte *pbVar3;
|
|
uint uVar4;
|
|
undefined4 *puVar5;
|
|
int iVar6;
|
|
int iVar7;
|
|
MaterialGlobalDescriptor_ptr_4_undefined4 piVar8;
|
|
nres_metadata_item *pnVar8;
|
|
int iVar9;
|
|
MaterialStageWorldDllInternal *pMVar10;
|
|
int iVar11;
|
|
ITexture **ppIVar12;
|
|
MaterialAnimationKey *pMVar13;
|
|
MaterialGlobalDescriptor *pMVar14;
|
|
float unaff_EBX;
|
|
MaterialStageExternal *pfVar16;
|
|
ushort unaff_DI;
|
|
MaterialAnimation *pMVar15;
|
|
uint uVar16;
|
|
int iStack_90;
|
|
uint uStack_8c;
|
|
char acStack_88 [8];
|
|
int iStack_80;
|
|
char acStack_58 [88];
|
|
|
|
iVar6 = (*(*g_material_resfile)->get_index_in_file_by_itemname)(g_material_resfile,itemname);
|
|
if (iVar6 < 0) {
|
|
sprintf(acStack_58,s_Material_%s_not_found._100246f8,itemname);
|
|
/* WARNING: Subroutine does not return */
|
|
write_error_to_file_and_msgbox(acStack_58,(void *)0x0);
|
|
}
|
|
iVar7 = 0;
|
|
if (0 < g_MaterialGlobalDescriptor_count) {
|
|
pMVar14 = g_MaterialGlobalDescriptors;
|
|
do {
|
|
if (pMVar14->index_in_file == iVar6) {
|
|
if (-1 < iVar7) {
|
|
g_MaterialGlobalDescriptors[iVar7].RefCount =
|
|
g_MaterialGlobalDescriptors[iVar7].RefCount + 1;
|
|
return iVar7;
|
|
}
|
|
break;
|
|
}
|
|
iVar7 += 1;
|
|
pMVar14 = pMVar14 + 1;
|
|
} while (iVar7 < g_MaterialGlobalDescriptor_count);
|
|
}
|
|
iVar7 = 0;
|
|
if (0 < g_MaterialGlobalDescriptor_count) {
|
|
piVar8 = &g_MaterialGlobalDescriptors[0].RefCount;
|
|
do {
|
|
if (ADJ(piVar8)->RefCount == 0) break;
|
|
iVar7 += 1;
|
|
piVar8 = piVar8 + 0x5c;
|
|
} while (iVar7 < g_MaterialGlobalDescriptor_count);
|
|
}
|
|
if (iVar7 == g_MaterialGlobalDescriptor_count) {
|
|
g_MaterialGlobalDescriptor_count += 1;
|
|
}
|
|
iStack_80 = iVar7;
|
|
g_currentMaterialFileData_ptr =
|
|
(*(*g_material_resfile)->get_item_data_ptr_by_index)(g_material_resfile,iVar6,1);
|
|
pnVar8 = (*(*g_material_resfile)->get_metadata_ptr)(g_material_resfile);
|
|
uVar16 = 0;
|
|
uVar4 = pnVar8[iVar6].magic1;
|
|
if ((pnVar8[iVar6].element_count_or_version & 1) != 0) {
|
|
uVar16 = 0x200000;
|
|
}
|
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field0_0x0 = 0;
|
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field2_0x8 = 0;
|
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field1_0x4 =
|
|
pnVar8[iVar6].element_count_or_version >> 2 & 0xf;
|
|
iVar9 = g_bumpmapping_enabled_value;
|
|
if (((pnVar8[iVar6].element_count_or_version & 2) != 0) &&
|
|
((g_MaterialGlobalDescriptors[iVar7].extra_meta.field0_0x0 = 1, iVar9 == 0 ||
|
|
(g_supports_texture_mode_6 == 0)))) {
|
|
uVar16 |= 0x80000;
|
|
}
|
|
if ((pnVar8[iVar6].element_count_or_version & 0x40) != 0) {
|
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field2_0x8 = 1;
|
|
}
|
|
iVar9 = 0;
|
|
g_MaterialGlobalDescriptors[iVar7].RefCount = g_MaterialGlobalDescriptors[iVar7].RefCount + 1;
|
|
puVar5 = g_currentMaterialFileData_ptr;
|
|
g_MaterialGlobalDescriptors[iVar7].index_in_file = iVar6;
|
|
iVar6 = 0;
|
|
do {
|
|
pcVar1 = (char *)(iVar9 + (int)puVar5);
|
|
iVar9 += 1;
|
|
acStack_88[iVar6 + -0x1c] = *pcVar1;
|
|
iVar6 += 1;
|
|
} while (iVar6 < 2);
|
|
g_MaterialGlobalDescriptors[iVar7].stageCount = (uint)unaff_DI;
|
|
iVar6 = 0;
|
|
do {
|
|
iVar11 = iVar9;
|
|
iVar9 = iVar11 + 1;
|
|
acStack_88[iVar6 + -0x1c] = *(char *)(iVar11 + (int)puVar5);
|
|
iVar6 += 1;
|
|
} while (iVar6 < 2);
|
|
DAT_10128674 = iVar9;
|
|
g_MaterialGlobalDescriptors[iVar7].animCount = (uint)unaff_DI;
|
|
if (0x13 < unaff_DI) {
|
|
/* WARNING: Subroutine does not return */
|
|
write_error_to_file_and_msgbox(s_Too_many_animations_for_material_100246cc,(void *)0x0);
|
|
}
|
|
g_MaterialGlobalDescriptors[iVar7].field8_0x15c = 1.0;
|
|
g_MaterialGlobalDescriptors[iVar7].field9_0x160 = 0;
|
|
if (uVar4 < 2) {
|
|
g_MaterialGlobalDescriptors[iVar7].field6_0x154 = 0xff;
|
|
g_MaterialGlobalDescriptors[iVar7].field7_0x158 = 0xff;
|
|
}
|
|
else {
|
|
g_MaterialGlobalDescriptors[iVar7].field6_0x154 = (uint)*(byte *)(iVar9 + (int)puVar5);
|
|
iVar6 = iVar11 + 3;
|
|
DAT_10128674 = iVar6;
|
|
g_MaterialGlobalDescriptors[iVar7].field7_0x158 = (uint)*(byte *)(iVar11 + 2 + (int)puVar5);
|
|
if (2 < uVar4) {
|
|
iVar9 = 0;
|
|
do {
|
|
puVar2 = (undefined1 *)(iVar6 + (int)puVar5);
|
|
iVar6 += 1;
|
|
(&stack0xffffff68)[iVar9] = *puVar2;
|
|
iVar9 += 1;
|
|
} while (iVar9 < 4);
|
|
DAT_10128674 = iVar6;
|
|
g_MaterialGlobalDescriptors[iVar7].field8_0x15c = unaff_EBX;
|
|
if (3 < uVar4) {
|
|
iVar9 = 0;
|
|
do {
|
|
puVar2 = (undefined1 *)(iVar6 + (int)puVar5);
|
|
iVar6 += 1;
|
|
(&stack0xffffff68)[iVar9] = *puVar2;
|
|
iVar9 += 1;
|
|
} while (iVar9 < 4);
|
|
DAT_10128674 = iVar6;
|
|
g_MaterialGlobalDescriptors[iVar7].field9_0x160 = unaff_EBX;
|
|
}
|
|
}
|
|
}
|
|
pMVar10 = (MaterialStageWorldDllInternal *)
|
|
_malloc(g_MaterialGlobalDescriptors[iVar7].stageCount * 0x4c);
|
|
g_MaterialGlobalDescriptors[iVar7].stages = pMVar10;
|
|
iVar6 = 0;
|
|
if (0 < g_MaterialGlobalDescriptors[iVar7].stageCount) {
|
|
iVar9 = 0;
|
|
do {
|
|
pfVar16 = (MaterialStageExternal *)
|
|
((int)&((g_MaterialGlobalDescriptors[iVar7].stages)->diffuse).R + iVar9);
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->ambient).R = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->ambient).G = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->ambient).B = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->ambient).A = (float)*pbVar3 * 0.01;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->diffuse).R = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->diffuse).G = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->diffuse).B = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->diffuse).A = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->specular).R = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->specular).G = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->specular).B = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->specular).A = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->emissive).R = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->emissive).G = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->emissive).B = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
(pfVar16->emissive).A = (float)*pbVar3 * 1/255f;
|
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
pfVar16->Power = (float)(uint)*pbVar3;
|
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 = DAT_10128674 + 1;
|
|
pfVar16->current_m_LL_ITexture = (ITexture **)(int)*pcVar1;
|
|
iVar11 = 0;
|
|
do {
|
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
acStack_88[iVar11] = *pcVar1;
|
|
iVar11 += 1;
|
|
} while (iVar11 < 0x10);
|
|
if (acStack_88[0] == '\0') {
|
|
pfVar16->m_LL_ITexture = (ITexture **)0xffffffff;
|
|
pfVar16->current_m_LL_ITexture = (ITexture **)0xffffffff;
|
|
}
|
|
else {
|
|
ppIVar12 = (ITexture **)LoadAndCacheTexture(acStack_88,uVar16);
|
|
pfVar16->m_LL_ITexture = ppIVar12;
|
|
}
|
|
iVar6 += 1;
|
|
iVar9 += 0x4c;
|
|
} while (iVar6 < g_MaterialGlobalDescriptors[iVar7].stageCount);
|
|
}
|
|
iVar6 = 0;
|
|
if (0 < g_MaterialGlobalDescriptors[iVar7].animCount) {
|
|
pMVar15 = g_MaterialGlobalDescriptors[iVar7].animations;
|
|
do {
|
|
puVar5 = g_currentMaterialFileData_ptr;
|
|
iVar9 = 0;
|
|
do {
|
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
acStack_88[iVar9 + -4] = *pcVar1;
|
|
iVar9 += 1;
|
|
} while (iVar9 < 4);
|
|
pMVar15->FieldSelector = (int)uStack_8c >> 3;
|
|
pMVar15->loop_mode = uStack_8c & 7;
|
|
iVar9 = 0;
|
|
do {
|
|
pcVar1 = (char *)(DAT_10128674 + (int)puVar5);
|
|
DAT_10128674 += 1;
|
|
acStack_88[iVar9 + -0x1c] = *pcVar1;
|
|
iVar9 += 1;
|
|
} while (iVar9 < 2);
|
|
pMVar15->keyCount = (uint)unaff_DI;
|
|
pMVar13 = (MaterialAnimationKey *)_malloc((uint)unaff_DI << 3);
|
|
pMVar15->keys = pMVar13;
|
|
iVar9 = 0;
|
|
if (0 < (int)pMVar15->keyCount) {
|
|
do {
|
|
iVar11 = 0;
|
|
do {
|
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
acStack_88[iVar11 + -0x1c] = *pcVar1;
|
|
iVar11 += 1;
|
|
} while (iVar11 < 2);
|
|
pMVar15->keys[iVar9].stage_index = (uint)unaff_DI;
|
|
iVar11 = 0;
|
|
do {
|
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
acStack_88[iVar11 + -0x1c] = *pcVar1;
|
|
iVar11 += 1;
|
|
} while (iVar11 < 2);
|
|
pMVar15->keys[iVar9].duration_ms = unaff_DI;
|
|
iVar11 = 0;
|
|
do {
|
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
|
DAT_10128674 += 1;
|
|
acStack_88[iVar11 + -0x1c] = *pcVar1;
|
|
iVar11 += 1;
|
|
} while (iVar11 < 2);
|
|
pMVar15->keys[iVar9].field2_0x6 = unaff_DI;
|
|
iVar9 += 1;
|
|
} while (iVar9 < (int)pMVar15->keyCount);
|
|
}
|
|
iVar6 += 1;
|
|
pMVar15 = pMVar15 + 1;
|
|
} while (iVar6 < g_MaterialGlobalDescriptors[iVar7].animCount);
|
|
}
|
|
return iStack_90;
|
|
}
|
|
|