Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Common.hpp"
- #include "Main.hpp"
- #include "R_TextureCoords.hpp"
- static GfxWorld *NiggerWorld;
- static float __7f7fffff = 3.4028235e38;
- static float __ff7fffff = -3.4028235e38;
- static float __4b000000 = 8388608.0;
- static float __80000000 = -0.0;
- static float __3f000000 = 0.5;
- static float __3f800000 = 1;
- static const int s_extraTexCoordCountForWorldVertexFormat[12] =
- {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};
- static const int s_extraNormalMapCountForWorldVertexFormat[12] =
- {0, 0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2};
- static int g_worldVertexData1StrideDisk[12] =
- {0, 8, 12, 16, 20, 24, 24, 28, 32, 32, 36, 40};
- static int R_GetSurfaceVertexLayerDataStride(GfxSurface * surface)
- {
- auto material = GetZoneObject(surface->material);
- auto result = GetZoneObject(material->techniqueSet.localTechniqueSet);
- if (result)
- {
- auto v2 = result->worldVertFormat;
- if (v2 >= 0xCu)
- SysPanic("invaild format");
- return g_worldVertexData1StrideDisk[v2];
- }
- return 0;
- }
- static int GetVertType(GfxSurface * surface)
- {
- auto material = GetZoneObject(surface->material);
- auto result = GetZoneObject(material->techniqueSet.localTechniqueSet);
- if (result)
- {
- auto v2 = result->worldVertFormat;
- if (v2 >= 0xCu)
- SysPanic("invaild format");
- return v2;
- }
- return 0;
- }
- static void AsmError(int id)
- {
- SysPanic("asm error, branch: %i", id);
- }
- static int NoOpAsm()
- {
- return 0;
- }
- static void R_CalculateTriangleGroupTexCoordExtents(GfxSurface * surface, GfxWorldVertex * vertsMem, char *layerVertsMem, unsigned int vertLayerDataStride, unsigned int extraTexCoordCount, char *triUsed, char *vertUsed, int startTriIndex, vec3_t * mins, vec3_t * maxs)
- {
- uint16_t *v10; // ecx
- int v11; // eax
- vec3_t *v12; // ebx
- signed int v13; // esi
- float v14; // xmm1_4
- int v15; // eax
- float v16; // xmm2_4
- vec2_t *v17; // eax
- float v18; // xmm1_4
- int v19; // ecx
- float v20; // xmm1_4
- float v21; // xmm2_4
- float v22; // xmm1_4
- char *v23; // esi
- unsigned int v24; // edi
- float *v25; // ecx
- float *v26; // edx
- unsigned int v27; // esi
- float *v28; // eax
- char *v29; // ebx
- float v30; // xmm1_4
- float v31; // xmm1_4
- float v32; // xmm1_4
- float v33; // xmm1_4
- float v34; // xmm1_4
- float v35; // xmm1_4
- float v36; // xmm1_4
- float v37; // xmm1_4
- float v38; // xmm1_4
- float v39; // xmm1_4
- float v40; // xmm1_4
- float v41; // xmm1_4
- float v42; // xmm1_4
- float v43; // xmm1_4
- float v44; // xmm1_4
- float v45; // xmm1_4
- vec3_t *v46; // ecx
- int v47; // edx
- float *v48; // eax
- float v49; // xmm1_4
- float v50; // xmm1_4
- float v51; // xmm1_4
- float v52; // xmm1_4
- GfxSurface *v53; // ecx
- int v54; // esi
- int v55; // eax
- int v56; // eax
- int v57; // ecx
- int v58; // edx
- int v59; // eax
- vec2_t *extraTexCoords; // [esp+0h] [ebp-18h]
- int v61; // [esp+8h] [ebp-10h]
- int startIndex2; // [esp+Ch] [ebp-Ch]
- int startIndex0; // [esp+10h] [ebp-8h]
- int startIndex1; // [esp+14h] [ebp-4h]
- unsigned int triCorner; // [esp+3Ch] [ebp+24h]
- unsigned int triCornera; // [esp+3Ch] [ebp+24h]
- triUsed[startTriIndex] = 1;
- v10 = NiggerWorld->draw.indices;
- v61 = 3 * startTriIndex;
- v11 = surface->tris.baseIndex + 3 * startTriIndex;
- v12 = maxs;
- startIndex0 = NiggerWorld->draw.indices[v11];
- startIndex1 = NiggerWorld->draw.indices[v11 + 1];
- startIndex2 = NiggerWorld->draw.indices[v11 + 2];
- triCorner = 0;
- while (1)
- {
- v13 = v10[triCorner + v61 + surface->tris.baseIndex];
- if (v13 >= surface->tris.vertexCount)
- SysPanic("Fuck");
- if (!vertUsed[v13])
- {
- vertUsed[v13] = 1;
- v14 = mins->v[0];
- v15 = v13 + surface->tris.firstVertex;
- v16 = vertsMem[v15].texCoord.v[0];
- v17 = &vertsMem[v15].texCoord;
- if ((float)(mins->v[0] - v16) >= 0.0)
- v14 = v16;
- mins->v[0] = v14;
- v18 = mins->v[1];
- if ((float)(mins->v[1] - v17->v[1]) >= 0.0)
- v18 = v17->v[1];
- mins->v[1] = v18;
- v19 = v13 + surface->tris.firstVertex;
- v20 = vertsMem[v19].texCoord.v[0];
- if ((float)(vertsMem[v19].texCoord.v[0] - v12->v[0]) < 0.0)
- v20 = v12->v[0];
- v21 = v12->v[1];
- v12->v[0] = v20;
- v22 = vertsMem[v19].texCoord.v[1];
- if ((float)(vertsMem[v19].texCoord.v[1] - v21) < 0.0)
- v22 = v21;
- v12->v[1] = v22;
- if (extraTexCoordCount)
- {
- v23 = &layerVertsMem[vertLayerDataStride * v13];
- v24 = 0;
- extraTexCoords = (vec2_t *)v23;
- if ((signed int)extraTexCoordCount >= 4)
- {
- v25 = (float *)(v23 + 20);
- v26 = &mins[3].y;
- v27 = ((extraTexCoordCount - 4) >> 2) + 1;
- v28 = &v12[1].y;
- v29 = (char *)((char *)mins - (char *)v12);
- v24 = 4 * v27;
- do
- {
- v30 = *(v26 - 7);
- if ((float)(*(v26 - 7) - *(v25 - 5)) >= 0.0)
- v30 = *(v25 - 5);
- *(v26 - 7) = v30;
- v31 = *(float *)((char *)v28 + (DWORD)v29);
- if ((float)(*(float *)((char *)v28 + (DWORD)v29) - *(v25 - 4)) >= 0.0)
- v31 = *(v25 - 4);
- *(float *)((char *)v28 + (DWORD)v29) = v31;
- v32 = *(v25 - 5);
- if ((float)(*(v25 - 5) - *(v28 - 1)) < 0.0)
- v32 = *(v28 - 1);
- *(v28 - 1) = v32;
- v33 = *(v25 - 4);
- if ((float)(*(v25 - 4) - *v28) < 0.0)
- v33 = *v28;
- *v28 = v33;
- v34 = *(v26 - 4);
- if ((float)(*(v26 - 4) - *(v25 - 3)) >= 0.0)
- v34 = *(v25 - 3);
- *(v26 - 4) = v34;
- v35 = *(v26 - 3);
- if ((float)(*(v26 - 3) - *(v25 - 2)) >= 0.0)
- v35 = *(v25 - 2);
- *(v26 - 3) = v35;
- v36 = *(v25 - 3);
- if ((float)(*(v25 - 3) - v28[2]) < 0.0)
- v36 = v28[2];
- v28[2] = v36;
- v37 = *(v25 - 2);
- if ((float)(*(v25 - 2) - v28[3]) < 0.0)
- v37 = v28[3];
- v28[3] = v37;
- v38 = *(v26 - 1);
- if ((float)(*(v26 - 1) - *(v25 - 1)) >= 0.0)
- v38 = *(v25 - 1);
- *(v26 - 1) = v38;
- v39 = *v26;
- if ((float)(*v26 - *v25) >= 0.0)
- v39 = *v25;
- *v26 = v39;
- v40 = *(v25 - 1);
- if ((float)(*(v25 - 1) - v28[5]) < 0.0)
- v40 = v28[5];
- v28[5] = v40;
- v41 = *v25;
- if ((float)(*v25 - v28[6]) < 0.0)
- v41 = v28[6];
- v28[6] = v41;
- v42 = v26[2];
- if ((float)(v26[2] - v25[1]) >= 0.0)
- v42 = v25[1];
- v26[2] = v42;
- v43 = v26[3];
- if ((float)(v26[3] - v25[2]) >= 0.0)
- v43 = v25[2];
- v26[3] = v43;
- v44 = v25[1];
- if ((float)(v25[1] - v28[8]) < 0.0)
- v44 = v28[8];
- v28[8] = v44;
- v45 = v25[2];
- if ((float)(v25[2] - v28[9]) < 0.0)
- v45 = v28[9];
- v28[9] = v45;
- v28 += 12;
- v26 += 12;
- v25 += 8;
- --v27;
- } while (v27);
- v12 = maxs;
- v23 = (char *)extraTexCoords;
- }
- if (v24 < extraTexCoordCount)
- {
- v46 = &mins[v24 + 1];
- v47 = (char *)mins - (char *)maxs;
- v48 = &v12[v24 + 1].y;
- do
- {
- v49 = v46->v[0];
- if ((float)(v46->v[0] - *(float *)&v23[8 * v24]) >= 0.0)
- v49 = *(float *)&v23[8 * v24];
- v46->v[0] = v49;
- v50 = *(float *)((char *)v48 + v47);
- if ((float)(*(float *)((char *)v48 + v47) - *(float *)&v23[8 * v24 + 4]) >= 0.0)
- v50 = *(float *)&v23[8 * v24 + 4];
- *(float *)((char *)v48 + v47) = v50;
- v51 = *(float *)&v23[8 * v24];
- if ((float)(*(float *)&v23[8 * v24] - *(v48 - 1)) < 0.0)
- v51 = *(v48 - 1);
- *(v48 - 1) = v51;
- v52 = *(float *)&v23[8 * v24 + 4];
- if ((float)(*(float *)&v23[8 * v24 + 4] - *v48) < 0.0)
- v52 = *v48;
- *v48 = v52;
- ++v24;
- ++v46;
- v48 += 3;
- } while (v24 < extraTexCoordCount);
- v12 = maxs;
- }
- }
- }
- if (++triCorner >= 3)
- break;
- v10 = NiggerWorld->draw.indices;
- }
- v53 = surface;
- v54 = 0;
- if (surface->tris.triCount > 0u)
- {
- v55 = 0;
- triCornera = 0;
- do
- {
- if (!triUsed[v54])
- {
- v56 = v53->tris.baseIndex + v55;
- v57 = NiggerWorld->draw.indices[v56];
- v58 = NiggerWorld->draw.indices[v56 + 1];
- v59 = NiggerWorld->draw.indices[v56 + 2];
- if (v57 == startIndex0
- || v57 == startIndex1
- || v57 == startIndex2
- || v58 == startIndex0
- || v58 == startIndex1
- || v58 == startIndex2
- || v59 == startIndex0
- || v59 == startIndex1
- || v59 == startIndex2)
- {
- R_CalculateTriangleGroupTexCoordExtents(
- surface,
- vertsMem,
- layerVertsMem,
- vertLayerDataStride,
- extraTexCoordCount,
- triUsed,
- vertUsed,
- v54,
- mins,
- v12);
- }
- }
- v53 = surface;
- ++v54;
- v55 = triCornera + 3;
- triCornera += 3;
- } while (v54 < surface->tris.triCount);
- }
- }
- void __declspec(naked) HandleTextCoords()
- {
- // IDA CANT DECOMPILE THIS FUNCTION TO REASONABLE OR EVEN UNSAFE C
- __asm
- {
- push ebp
- mov ebp, esp
- sub esp, 0B4h
- xor eax, ebp
- mov [ebp-4], eax
- mov eax, [ebp+8]
- mov [ebp-0A4h], eax
- ; REMOVED NULL CHECK THAT DOESNT WORK WITH NV IDS
- movzx edx, word ptr [esi+2Ah]
- push ebx
- push edi
- push 17h ; type
- push 420 ;
- push edx ; size
- call ToolAllocate
- movzx ecx, word ptr [esi+2Ah]
- push ecx ; count
- push 0 ; value
- push eax ; dst
- mov [ebp-98h], eax
- call memset
- movzx edx, word ptr [esi+28h]
- push 17h ; type
- push 420 ;
- push edx ; size
- call ToolAllocate
- mov edi, eax
- movzx eax, word ptr [esi+28h]
- push 17h ; type
- push 420 ;
- push eax ; size
- mov [ebp-0A8h], edi
- call ToolAllocate
- movzx ecx, word ptr [esi+28h]
- push ecx ; count
- push 0 ; value
- push eax ; dst
- mov [ebp-90h], eax
- call memset
- ; REMOVED BAD POINTER DEREFERENCE. USE NEVIS ZONES REFERENCE OR RAW OBJECT TO OBTAIN THE VERT TYPE
- push esi; esi
- call GetVertType
- add esp, 4
- ; PATCH
- movzx ecx, eax
- mov ebx, s_extraTexCoordCountForWorldVertexFormat[ecx*4]
- push esi ; esi
- mov [ebp-0B4h] , ebx
- call R_GetSurfaceVertexLayerDataStride
- mov [ebp-0A0h], eax
- mov eax, [esi+1Ch]
- add eax, [ebp-8Ch]
- xor edx, edx
- mov [ebp-0ACh], eax
- xor eax, eax
- add esp, 40h
- mov [ebp-94h], eax
- cmp dx, [esi+2Ah]
- jnb loc_A4CA1C
- movss xmm0, __7f7fffff
- movss xmm1, __ff7fffff
- jmp short loc_A4C760
- ; ---------------------------------------------------------------------------
- loc_A4C760:
- mov ecx, [ebp-98h]
- cmp byte ptr [eax+ecx], 0
- jnz loc_A4CA03
- lea ecx, [ebx+1]
- test ecx, ecx
- jz short loc_A4C7AA
- xor eax, eax
- lea esp, [esp+0]
- loc_A4C780:
- movss dword ptr [ebp+eax-40h], xmm0
- movss dword ptr [ebp+eax-40h+4], xmm0
- movss dword ptr [ebp+eax-40h+8], xmm0
- movss dword ptr [ebp+eax-7Ch], xmm1
- movss dword ptr [ebp+eax-7Ch+4], xmm1
- movss dword ptr [ebp+eax-7Ch+8], xmm1
- add eax, 0Ch
- dec ecx
- jnz short loc_A4C780
- loc_A4C7AA:
- movzx edx, word ptr [esi+28h]
- push edx
- push 0
- push edi
- call memset
- mov edx, [ebp-94h]
- lea eax, [ebp-7Ch]
- push eax
- mov eax, [ebp-98h]
- lea ecx, [ebp-40h]
- push ecx ; mins
- mov ecx, [ebp-0A0h]
- push edx
- mov edx, [ebp-0ACh]
- push edi
- push eax
- mov eax, [ebp-0A4h]
- push ebx
- push ecx ; vertLayerDataStride
- push edx
- push eax
- push esi
- call R_CalculateTriangleGroupTexCoordExtents
- xor edx, edx
- lea eax, [ebx+1]
- add esp, 34h
- mov [ebp-9Ch], edx
- test eax, eax
- jz loc_A4C9F3
- loc_A4C800:
- movss xmm2, __80000000
- movss xmm3, __4b000000
- movss xmm5, __3f800000
- lea eax, [edx+edx*2]
- add eax, eax
- add eax, eax
- movss xmm0, dword ptr [ebp+eax-40h]
- addss xmm0, dword ptr [ebp+eax-7Ch]
- mulss xmm0, __3f000000
- andps xmm2, xmm0
- movss xmm1, dword ptr [ebp+eax-40h+4]
- addss xmm1, dword ptr [ebp+eax-7Ch+4]
- mulss xmm1, __3f000000
- movaps xmm4, xmm2
- lea ecx, [ebp+eax-7Ch]
- movaps xmm2, xmm0
- xorps xmm2, xmm4
- cmpltss xmm2, xmm3
- andps xmm3, xmm2
- lea eax, [ebp+eax-40h]
- movaps xmm2, xmm0
- orps xmm3, xmm4
- addss xmm2, xmm3
- subss xmm2, xmm3
- movaps xmm3, xmm2
- subss xmm3, xmm0
- movss xmm0, __80000000
- andps xmm0, xmm1
- cmpnless xmm3, xmm4
- movss xmm4, __3f800000
- andps xmm3, xmm5
- subss xmm2, xmm3
- movaps xmm3, xmm0
- movaps xmm5, xmm2
- movss xmm2, __4b000000
- movaps xmm0, xmm1
- xorps xmm0, xmm3
- cmpltss xmm0, xmm2
- andps xmm2, xmm0
- orps xmm2, xmm3
- movaps xmm0, xmm1
- addss xmm0, xmm2
- subss xmm0, xmm2
- movaps xmm2, xmm0
- subss xmm2, xmm1
- cmpnless xmm2, xmm3
- xor ecx, ecx
- andps xmm2, xmm4
- xor edi, edi
- subss xmm0, xmm2
- movss dword ptr [ebp - 88h], xmm5
- movss dword ptr [ebp - 88h +4], xmm0
- cmp cx, [esi+28h]
- jnb loc_A4C9DB
- mov eax, [ebp-0A8h]
- sub eax, [ebp-90h]
- mov [ebp-8Ch] , ecx
- mov [ebp-0B0h], eax
- jmp short loc_A4C916
- ; ---------------------------------------------------------------------------
- loc_A4C910:
- mov eax, [ebp-0B0h]
- loc_A4C916:
- mov ebx, [ebp-90h]
- add ebx, edi
- cmp byte ptr [eax+ebx], 0
- jz loc_A4C9BC
- test edx, edx
- jnz short loc_A4C993
- cmp [ebx], dl
- jz short loc_A4C958
- push 420
- push 420
- push edx
- push 0B29h
- push 1
- call AsmError
- add esp, 14h
- test al, al
- jnz short loc_A4C952
- int 3
- loc_A4C952:
- mov edx, [ebp-9Ch]
- loc_A4C958:
- mov ecx, [ebp-0A4h]
- movss xmm5, dword ptr [ebp - 88h]
- mov byte ptr [ebx], 1
- mov eax, [esi+20h]
- add eax, edi
- imul eax, 2Ch
- movss xmm0, dword ptr [eax+ecx+14h]
- lea eax, [eax+ecx+14h]
- mov ecx, [ebp-8Ch]
- subss xmm0, xmm5
- movss dword ptr [eax], xmm0
- movss xmm0, dword ptr [ebp - 88h +4]
- jmp short loc_A4C9AE
- ; ---------------------- -----------------------------------------------------
- loc_A4C993:
- mov ebx, [ebp-0ACh]
- lea eax, [ecx+edx*8]
- movss xmm1, dword ptr [eax+ebx-8]
- lea eax, [eax+ebx-8]
- subss xmm1, xmm5
- movss dword ptr [eax], xmm1
- loc_A4C9AE:
- movss xmm1, dword ptr [eax+4]
- subss xmm1, xmm0
- movss dword ptr [eax+4], xmm1
- loc_A4C9BC:
- movzx eax, word ptr [esi+28h]
- add ecx, [ebp-0A0h]
- inc edi
- mov [ebp-8Ch] , ecx
- cmp edi, eax
- jb loc_A4C910
- mov ebx, [ebp-0B4h]
- loc_A4C9DB:
- inc edx
- lea eax, [ebx+1]
- mov [ebp-9Ch], edx
- cmp edx, eax
- jb loc_A4C800
- mov edi, [ebp-0A8h]
- loc_A4C9F3:
- movss xmm0, __7f7fffff
- movss xmm1, __ff7fffff
- loc_A4CA03:
- mov eax, [ebp-94h]
- movzx ecx, word ptr [esi+2Ah]
- inc eax
- mov [ebp-94h], eax
- cmp eax, ecx
- jb loc_A4C760
- loc_A4CA1C:
- mov edx, [ebp-98h]
- push 18h
- push edx
- call NoOpAsm
- push 18h
- push edi
- call NoOpAsm
- mov eax, [ebp-90h]
- push 18h
- push eax
- call NoOpAsm
- add esp, 18h
- pop edi
- pop ebx
- loc_A4CA45:
- mov ecx, [ebp-4]
- xor ecx, ebp ; cookie
- call NoOpAsm ; __security_check_cookie(x)
- mov esp, ebp
- pop ebp
- retn
- }
- }
- void R_RecenterSurfaceTexCoords(GfxWorld *world, GfxSurface *surface, char *vertLayerDataMem, GfxWorldVertex *vertsMem)
- {
- NiggerWorld = world;
- __asm
- {
- mov esi, surface
- mov ecx, vertLayerDataMem
- push vertsMem
- call HandleTextCoords
- add esp, 4
- }
- }
Add Comment
Please, Sign In to add comment