Mercurial > mm7
diff Render.cpp @ 1439:468f434a8d8a
Слияние
author | Ritor1 |
---|---|
date | Mon, 22 Jul 2013 18:00:58 +0600 |
parents | bc99e1a48bea 8ea496564034 |
children | b67a3e0d6fc3 |
line wrap: on
line diff
--- a/Render.cpp Mon Jul 22 18:00:34 2013 +0600 +++ b/Render.cpp Mon Jul 22 18:00:58 2013 +0600 @@ -221,1459 +221,27 @@ return result; } -//----- (00487389) -------------------------------------------------------- -void Render::ExecOutdoorDrawSW() -{ - unsigned __int16 *v0; // ebx@1 - unsigned int v1; // esi@1 - stru148 *v2; // eax@1 - Span *v3; // edi@6 - stru148 *v4; // esi@9 - Texture *v5; // ebp@10 - int v6; // esi@16 - unsigned int v7; // edx@16 - char *v8; // ecx@17 - unsigned int v9; // edi@22 - int v10; // eax@26 - int v11; // eax@27 - unsigned int v12; // ebp@32 - Span *v13; // esi@33 - int v14; // ecx@37 - int v15; // eax@40 - Texture *v16; // ebp@51 - //unsigned int v17; // eax@51 - int v18; // eax@54 - char v19; // al@56 - unsigned int v20; // eax@57 - int v21; // ecx@57 - unsigned int v22; // eax@57 - stru149 *v23; // eax@65 - int v24; // eax@67 - ODMFace *v25; // eax@78 - signed int v26; // edx@79 - signed int v27; // ecx@79 - unsigned int v28; // eax@106 - unsigned int v29; // ebp@117 - Span *v30; // esi@118 - unsigned int v31; // ST04_4@124 - int v33; // [sp+18h] [bp-44h]@80 - signed int v34; // [sp+1Ch] [bp-40h]@3 - signed int v35; // [sp+20h] [bp-3Ch]@79 - Span **v36; // [sp+24h] [bp-38h]@4 - unsigned int v37; // [sp+28h] [bp-34h]@1 - unsigned __int16 *a1; // [sp+2Ch] [bp-30h]@1 - int a1a; // [sp+2Ch] [bp-30h]@26 - unsigned int a1b; // [sp+2Ch] [bp-30h]@116 - char v41; // [sp+30h] [bp-2Ch]@57 - - v0 = pRenderer->pTargetSurface; - v1 = pOutdoorCamera->numStru148s; - a1 = pRenderer->pTargetSurface; - v2 = array_77EC08.data(); - v37 = pOutdoorCamera->numStru148s; - if ( !(pParty->uFlags & 2) ) - { - v1 = uNumElementsIn80AA28; - v2 = ptr_80AA28[0]; - v37 = uNumElementsIn80AA28; - } - v34 = 0; - if ( (signed int)v1 > 0 ) - { - v36 = &v2->prolly_head; - do - { - if ( pParty->uFlags & 2 ) - v3 = *v36; - else - v3 = ptr_80AA28[v34]->prolly_head; - if ( v3 ) - { - v4 = v3->pParent; - if ( v4 ) - { - v5 = v4->pTexture; - if ( v5 ) - { - if ( v3->field_8 >= (signed int)pViewport->uViewportTL_X || v3->field_C != pViewport->uViewportTL_X ) - { - LOBYTE(v4->field_32) |= 2u; - v14 = *(int *)&v4->flags; - if ( v14 & 0x10 && v4->field_59 != 5 ) - { - dword_80AA20 = (v4->terrain_grid_z - 64) << 25; - dword_80AA1C = dword_80AA20 + 0x1FF0000; - dword_80AA14 = (v4->terrain_grid_x << 25) + 0x7FFF0000; - dword_80AA18 = dword_80AA14 - 0x1FF0000; - byte_80AA10 = ((unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo( - v4->terrain_grid_z, - v4->terrain_grid_x - 1) >> 9) & 1; - if ( *(int *)&v4->flags & 2 || (v15 = *(int *)&v4->flags, BYTE1(v15) & 1) ) - { - if ( *(int *)&v4->flags & 2 ) - { - while ( 1 ) - { - if ( pOutdoorCamera->outdoor_no_wavy_water ) - sr_sub_48408A_prolly_odm_water_no_waves(v3); - else - sr_sub_485407_prolly_odm_water_wavy(v3); - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - } - } - else - { - while ( 1 ) - { - v16 = v4->pTexture; - v4->pTexture = pBitmaps_LOD->LoadTexturePtr("wtrtyl"); - if ( pOutdoorCamera->outdoor_no_wavy_water ) - sr_sub_48408A_prolly_odm_water_no_waves(v3); - else - sr_sub_485407_prolly_odm_water_wavy(v3); - v18 = v4->terrain_grid_z - 64; - v4->pTexture = v16; - dword_80AA20 = v18 << 25; - dword_80AA1C = (v18 << 25) + 0x1FF0000; - dword_80AA14 = (v4->terrain_grid_x << 25) + 0x7FFF0000; - dword_80AA18 = dword_80AA14 - 0x1FF0000; - byte_80AA10 = ((unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo( - v4->terrain_grid_z, - v4->terrain_grid_x - 1) >> 9) & 1; - sr_sub_484442(v3); - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - } - } - } - else - { - while ( sr_sub_48408A_prolly_odm_water_no_waves(v3) ) - { - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - } - } - } - else - { - v19 = v4->field_59; - if ( v19 != 5 ) - { - if ( v14 & 2 ) - { - while ( 1 ) - { - v28 = pBitmaps_LOD->LoadTexture("wtrtyla"); - v4->pTexture = (Texture *)(v28 != -1 ? &pBitmaps_LOD->pTextures[v28] : 0); - if ( !sr_sub_4847EB(v3) ) - break; - v4->pTexture = v5; - if ( !sr_sub_484442(v3) ) - break; - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - v5 = v4->pTexture; - } - } - else - { - if ( v19 == 1 ) - { - dword_80AA20 = (v4->terrain_grid_z - 64) << 25; - dword_80AA1C = dword_80AA20 + 33488896; - dword_80AA14 = (v4->terrain_grid_x << 25) + 0x7FFF0000; - dword_80AA18 = dword_80AA14 - 33488896; - byte_80AA10 = ((unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo( - v4->terrain_grid_z, - v4->terrain_grid_x - 1) >> 9) & 1; - while ( 1 ) - { - if ( !sr_sub_4847EB(v3) ) - sr_sub_48585C_mb_DrawSpan(v3, &pRenderer->pTargetSurface[v3->field_8 + 640 * v3->field_A], 0); - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - } - } - } - goto LABEL_14; - } - v4->ptr_38 = (stru149 *)&v41; - v4->_479295(); - v20 = GetTickCount(); - v21 = *(int *)&v4->flags; - v22 = v20 >> 3; - if ( BYTE1(v21) & 4 ) - { - v4->sTextureDeltaV -= v22 & v4->pTexture->uHeightMinus1; - } - else - { - if ( BYTE1(v21) & 8 ) - v4->sTextureDeltaV += v22 & v4->pTexture->uHeightMinus1; - } - if ( BYTE1(v21) & 0x10 ) - { - v4->sTextureDeltaU -= v22 & v4->pTexture->uWidthMinus1; - } - else - { - if ( BYTE1(v21) & 0x20 ) - v4->sTextureDeltaU += v22 & v4->pTexture->uWidthMinus1; - } - v23 = v4->ptr_38; - v4->field_52 = 32; - v4->field_5A = 5; - if ( (double)abs(v23->field_C) > 52428.8 ) - { - v4->field_52 = 8; - v4->field_5A = 3; - } - v24 = *(int *)&v4->flags; - if ( !(v24 & 0x10000) ) - { - if ( !(v24 & 2) ) - { - v25 = v4->pODMFace; - if ( v25->uPolygonType == 1 ) - { - v26 = v25->pTextureUIDs[0]; - dword_80AA1C = v26; - dword_80AA20 = v26; - v27 = v25->pTextureVIDs[0]; - dword_80AA14 = v27; - dword_80AA18 = v27; - v35 = 1; - if ( v25->uNumVertices > 1u ) - { - v33 = (int)&v25->pTextureVIDs[1]; - do - { - if ( dword_80AA20 > *(short *)(v33 - 40) ) - dword_80AA20 = *(short *)(v33 - 40); - if ( v26 < *(short *)(v33 - 40) ) - { - v26 = *(short *)(v33 - 40); - dword_80AA1C = *(short *)(v33 - 40); - } - if ( dword_80AA18 > *(short *)v33 ) - dword_80AA18 = *(short *)v33; - if ( v27 < *(short *)v33 ) - { - v27 = *(short *)v33; - dword_80AA14 = *(short *)v33; - } - ++v35; - v33 += 2; - } - while ( v35 < v25->uNumVertices ); - v0 = a1; - } - dword_80AA20 = (dword_80AA20 + v4->sTextureDeltaU) << 16; - dword_80AA1C = ((v26 + v4->sTextureDeltaU) << 16) - 65536; - dword_80AA18 = (dword_80AA18 + v4->sTextureDeltaV) << 16; - dword_80AA14 = ((v27 + v4->sTextureDeltaV) << 16) - 65536; - } - while ( 1 ) - { - if ( !sr_sub_482E07(v3, v0) ) - sr_sub_48585C_mb_DrawSpan(v3, &v0[v3->field_8 + 640 * v3->field_A], 0); - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - } - goto LABEL_14; - } - while ( 1 ) - { -LABEL_74: - if ( !sr_sub_4839BD(v3, v0) ) - sr_sub_48585C_mb_DrawSpan(v3, &v0[v3->field_8 + 640 * v3->field_A], 0); - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - } - goto LABEL_14; - } - if ( v24 & 2 ) - goto LABEL_74; - while ( 1 ) - { - if ( !sr_sub_482A94(v3) ) - sr_sub_48585C_mb_DrawSpan(v3, &v0[v3->field_8 + 640 * v3->field_A], 0); - v3->field_E = LOWORD(unnamed_6BE060[1]); - if ( v4->prolly_tail == v3 ) - break; - v3 = v3->pNext; - } - } - } - else - { - v3->field_E = LOWORD(unnamed_6BE060[1]); - } - } - } - } -LABEL_14: - ++v34; - LOWORD(v2) = v34; - v36 += 67; - } - while ( v34 < (signed int)v37 ); - } - if ( pParty->uFlags & 2 ) - { - v6 = pOutdoorCamera->numStru148s; - v7 = 0; - uNumElementsIn80AA28 = 0; - if ( pOutdoorCamera->numStru148s > 0 ) - { - v8 = (char *)&array_77EC08[0].flags; - do - { - v2 = *(stru148 **)v8; - if ( (unsigned int)v2 & 0x20000 ) - { - ++v7; - *(int *)v8 = (unsigned int)v2 & 0xFFFDFFFF; - LOWORD(v2) = (short)v8 - 48; - *(&uNumElementsIn80AA28 + v7) = (unsigned int)(v8 - 48); - } - v8 += 268; - --v6; - } - while ( v6 ); - uNumElementsIn80AA28 = v7; - } - } - v9 = pOutdoorCamera->uNumSpans; - unnamed_6BE060[0] = pOutdoorCamera->uNumSpans; - if (pOutdoorCamera->numStru148s >= 1999) - return; - - array_77EC08[1999]._48607B(&stru_8019C8); - array_77EC08[1999].ptr_38->sky_48694B(); - - if (pOutdoor->uMainTile_BitmapID == -1) - { - array_77EC08[1999].pTexture = nullptr; - return; - } - else - array_77EC08[1999].pTexture = pBitmaps_LOD->GetTexture(pOutdoor->uMainTile_BitmapID); - array_77EC08[1999].dimming_level = 23 - (-20 * pOutdoor->vSunlight.z >> 16); - if ( array_77EC08[1999].dimming_level > 20 ) - array_77EC08[1999].dimming_level = 20; - v10 = stru_5C6E00->Sin(pIndoorCamera->sRotationX); - array_77EC08[1999].v_18.y = 0; - array_77EC08[1999].v_18.x = v10; - array_77EC08[1999].v_18.z = stru_5C6E00->Cos(pIndoorCamera->sRotationX); - array_77EC08[1999].field_24 = 2048 - (pIndoorCamera->pos.z << 16); - a1a = (signed __int64)((double)(pIndoorCamera->pos.z * pOutdoorCamera->int_fov_rad) - / ((double)pOutdoorCamera->int_fov_rad + 8192.0) - + (double)pViewport->uScreenCenterY); - cos((double)pIndoorCamera->sRotationX * 0.0030664064); - sin((double)pIndoorCamera->sRotationX * 0.0030664064); - array_77EC08[1999]._48607B(&stru_8019C8); - array_77EC08[1999].ptr_38->sky_48694B(); - - if (pOutdoor->uSky_TextureID == -1) - { - array_77EC08[1999].pTexture = nullptr; - return; - } - else - array_77EC08[1999].pTexture = pBitmaps_LOD->GetTexture(pOutdoor->uSky_TextureID); - array_77EC08[1999].dimming_level = 0; - v11 = stru_5C6E00->Sin(pIndoorCamera->sRotationX + 16); - array_77EC08[1999].v_18.y = 0; - array_77EC08[1999].v_18.x = -v11; - array_77EC08[1999].v_18.z = -stru_5C6E00->Cos(pIndoorCamera->sRotationX + 16); - LOWORD(v2) = 224 * LOWORD(pMiscTimer->uTotalGameTimeElapsed); - array_77EC08[1999].field_24 = 0x2000000u; - array_77EC08[1999].sTextureDeltaU = 224 * pMiscTimer->uTotalGameTimeElapsed; - array_77EC08[1999].sTextureDeltaV = 224 * pMiscTimer->uTotalGameTimeElapsed; - if ( day_attrib & DAY_ATTRIB_FOG - && (LOWORD(v2) = LOWORD(pParty->uCurrentHour), pParty->uCurrentHour >= 5) - && pParty->uCurrentHour < 0x15 - || bUnderwater ) - { - v2 = (stru148 *)*(short *)PaletteManager::Get_Mist_or_Red_LUT(array_77EC08[1999].pTexture->palette_id2, 31, 1); - a1b = (unsigned int)v2; - if ( (signed int)v9 <= 0 ) - return; - v29 = v9; - while ( 1 ) - { - v30 = &pSpans[v29 - 1]; - v2 = (stru148 *)v30->field_E; - if ( v2 != (stru148 *)unnamed_6BE060[1] ) - { - LOWORD(v2) = LOWORD(pViewport->uViewportTL_X); - if ( v30->field_8 >= (signed int)pViewport->uViewportTL_X ) - goto LABEL_124; - if ( v30->field_C == pViewport->uViewportTL_X ) - { - v30->field_E = LOWORD(unnamed_6BE060[1]); - } - else - { - v30->field_8 = LOWORD(pViewport->uViewportTL_X); - v30->field_C -= LOWORD(pViewport->uViewportTL_X); - if ( v30->field_C >= 0 ) - { -LABEL_124: - v31 = v30->field_C; - v30->pParent = &array_77EC08[1999]; - fill_pixels_fast( - a1b, - &pRenderer->pTargetSurface[v30->field_8 + pRenderer->uTargetSurfacePitch * v30->field_A], - v31); - j_memset32(-65536, &pRenderer->pActiveZBuffer[v30->field_8 + 640 * v30->field_A], v30->field_C); - goto LABEL_125; - } - LOWORD(v2) = LOWORD(unnamed_6BE060[1]); - v30->field_E = LOWORD(unnamed_6BE060[1]); - } - } -LABEL_125: - --v29; - --v9; - if ( !v9 ) - return; - } - } - if ( (signed int)v9 > 0 ) - { - v12 = v9; - do - { - v13 = &pSpans[v12 - 1]; - v2 = (stru148 *)v13->field_E; - if ( v2 != (stru148 *)unnamed_6BE060[1] ) - { - LOWORD(v2) = LOWORD(pViewport->uViewportTL_X); - if ( v13->field_8 >= (signed int)pViewport->uViewportTL_X ) - goto LABEL_109; - if ( v13->field_C != pViewport->uViewportTL_X ) - { - v13->field_8 = LOWORD(pViewport->uViewportTL_X); - v13->field_C -= LOWORD(pViewport->uViewportTL_X); - if ( v13->field_C >= 0 ) - { -LABEL_109: - if ( pOutdoorCamera->bNoSky ) - { - const_1_0(); - } - else - { - v13->pParent = &array_77EC08[1999]; - if ( !Render::DrawSkySW(v13, &array_77EC08[1999], a1a) ) - j_memset32(-65536, &pRenderer->pActiveZBuffer[v13->field_8 + 640 * v13->field_A], v13->field_C); - } - } - LOWORD(v2) = LOWORD(unnamed_6BE060[1]); - v13->field_E = LOWORD(unnamed_6BE060[1]); - goto LABEL_114; - } - v13->field_E = LOWORD(unnamed_6BE060[1]); - } -LABEL_114: - --v12; - --v9; - } - while ( v9 ); - } -} - -//----- (00485044) -------------------------------------------------------- -int Render::DrawSkySW(Span *a1, stru148 *a2, int a3) -{ - stru148 *v3; // esi@1 - Span *v4; // edi@1 - float v5; // ST2C_4@1 - signed int result; // eax@2 - int v7; // ST40_4@3 - stru149 *v8; // eax@3 - int v9; // ebx@3 - int v10; // ecx@3 - int v11; // edx@3 - int v12; // eax@3 - int v13; // ST28_4@5 - int v14; // eax@5 - signed __int64 v15; // qtt@11 - int v16; // ST28_4@11 - int v17; // eax@11 - signed int v18; // ecx@11 - int v19; // ST40_4@11 - int v20; // ST3C_4@11 - int v21; // ST30_4@11 - void *v22; // eax@11 - Texture *v23; // esi@11 - int v24; // ecx@11 - unsigned int v25; // esi@11 - int v26; // edi@11 - unsigned __int16 *v27; // eax@11 - int *v28; // ebx@12 - int v29; // edx@13 - unsigned __int16 v30; // cx@13 - int v31; // edx@14 - unsigned __int16 v32; // cx@14 - unsigned __int8 v33; // sf@15 - unsigned __int8 v34; // of@15 - double v35; // [sp+14h] [bp-38h]@1 - int v36; // [sp+18h] [bp-34h]@3 - signed int v37; // [sp+18h] [bp-34h]@11 - int v38; // [sp+1Ch] [bp-30h]@3 - signed int v39; // [sp+1Ch] [bp-30h]@11 - int v40; // [sp+20h] [bp-2Ch]@3 - void *v41; // [sp+20h] [bp-2Ch]@11 - int v42; // [sp+24h] [bp-28h]@3 - unsigned __int8 *v43; // [sp+24h] [bp-28h]@11 - int v44; // [sp+28h] [bp-24h]@11 - int v45; // [sp+2Ch] [bp-20h]@3 - signed int v46; // [sp+30h] [bp-1Ch]@3 - __int16 v47; // [sp+30h] [bp-1Ch]@11 - signed int v48; // [sp+34h] [bp-18h]@3 - int v49; // [sp+34h] [bp-18h]@11 - int v50; // [sp+38h] [bp-14h]@3 - unsigned __int16 *v51; // [sp+38h] [bp-14h]@11 - int v52; // [sp+3Ch] [bp-10h]@4 - int a1a; // [sp+40h] [bp-Ch]@3 - int v54; // [sp+44h] [bp-8h]@3 - int v55; // [sp+48h] [bp-4h]@3 - int v56; // [sp+54h] [bp+8h]@11 - int *v57; // [sp+54h] [bp+8h]@11 - - v3 = a2; - v4 = a1; - v5 = (double)(pViewport->uViewportBR_X - pViewport->uViewportTL_X) * 0.5 / tan(0.6457717418670654) + 0.5; - v35 = v5 + 6.7553994e15; - if ( LODWORD(v35) ) - { - v55 = 65536 / SLODWORD(v35); - v7 = 65536 / SLODWORD(v35) * (a3 - v4->field_A); - v8 = v3->ptr_38; - v42 = ((unsigned __int64)(v3->ptr_38->field_14 * (signed __int64)v7) >> 16) + v8->field_C; - v40 = ((unsigned __int64)(v8->field_20 * (signed __int64)v7) >> 16) + v3->ptr_38->field_18; - v38 = pOutdoorCamera->camera_rotation_y_int_sine; - HIDWORD(v35) = pOutdoorCamera->camera_rotation_y_int_cosine; - v45 = v4->field_C; - v9 = ((unsigned __int64)(v3->v_18.z * (signed __int64)v7) >> 16) + v3->v_18.x; - v10 = 65536 / SLODWORD(v35) * (pViewport->uScreenCenterX - v4->field_8); - v48 = 0; - v50 = 65536 / SLODWORD(v35) * (pViewport->uScreenCenterX - v4->field_8); - v46 = -v3->field_24; - v11 = v4->field_A - 1; - v54 = v11; - v12 = 65536 / SLODWORD(v35) * (a3 - v11); - a1a = 65536 / SLODWORD(v35) * (a3 - v11); - while ( 1 ) - { - v52 = v9; - if ( v9 ) - { - v13 = abs(v46 >> 14); - v14 = abs(v9); - v11 = v54; - v10 = v50; - if ( v13 <= v14 ) - break; - v12 = a1a; - } - if ( v11 <= (signed int)pViewport->uViewportTL_Y ) - break; - v9 = ((unsigned __int64)(v3->v_18.z * (signed __int64)v12) >> 16) + v3->v_18.x; - --v54; - a1a += v55; - v12 = a1a; - v11 = v54; - v48 = 1; - } - if ( v48 ) - v52 = ((unsigned __int64)(v3->v_18.z * (signed __int64)(v55 * (a3 + (signed int)v4->field_A - 2 * v11))) >> 16) - + v3->v_18.x; - LODWORD(v15) = v46 << 16; - HIDWORD(v15) = v46 >> 16; - v16 = v42 + ((unsigned __int64)(v3->ptr_38->field_10 * (signed __int64)v10) >> 16); - v17 = v40 + ((unsigned __int64)(v3->ptr_38->field_1C * (signed __int64)v10) >> 16); - v18 = v15 / v52; - v43 = v3->pTexture->pLevelOfDetail0_prolly_alpha_mask; - v19 = v3->sTextureDeltaU + ((signed int)((unsigned __int64)(v16 * v15 / v52) >> 16) >> 3); - v56 = v15 / v52; - v20 = v3->sTextureDeltaV + ((signed int)((unsigned __int64)(v17 * v15 / v52) >> 16) >> 3); - v21 = (unsigned __int64)(v55 * (signed __int64)v56) >> 16; - v39 = (signed int)((unsigned __int64)(v21 * (signed __int64)v38) >> 16) >> 3; - v37 = (signed int)((unsigned __int64)(v21 * (signed __int64)v36) >> 16) >> 3; - v22 = sr_sub_47C178(v18, v3, 0, 1); - v23 = v3->pTexture; - v41 = v22; - v47 = 16 - v23->uWidthLn2; - v44 = v23->uTextureWidth - 1; - v49 = (v23->uTextureHeight << 16) - 65536; - v24 = v4->field_8; - v51 = &pRenderer->pTargetSurface[v24 + pRenderer->uTargetSurfacePitch * v4->field_A]; - v57 = &pRenderer->pActiveZBuffer[v24 + 640 * v4->field_A]; - v25 = v19; - v26 = v20; - v27 = v51; - if ( !(v45 & 1) ) - goto LABEL_15; - --v45; - v27 = v51 - 1; - v28 = v57; - ++v57; - while ( 1 ) - { - *v28 = -65536; - v31 = v44 & (v25 >> 16); - v27 += 2; - v25 += v39; - v32 = *((short *)v41 + *(&v43[v31] + ((v49 & (unsigned int)v26) >> v47))); - v26 += v37; - *(v27 - 1) = v32; -LABEL_15: - v34 = __OFSUB__(v45, 2); - v33 = v45 - 2 < 0; - v45 -= 2; - if ( v33 ^ v34 ) - break; - v29 = v44 & (v25 >> 16); - v25 += v39; - v30 = *((short *)v41 + *(&v43[v29] + ((v49 & (unsigned int)v26) >> v47))); - v26 += v37; - v28 = v57; - *v27 = v30; - v57 += 2; - v28[1] = -65536; - } - result = 1; - } - else - { - result = 0; - } - return result; -} - -//----- (0047F5C6) -------------------------------------------------------- -float Render::DrawBezierTerrain() -{ - //__debugbreak();Ritor1: it's temporarily - //return 0; - - unsigned int pDirectionIndicator1; // ebx@1 - unsigned int pDirectionIndicator2; // edi@1 - unsigned int v2; // eax@1 - int v3; // eax@3 - int v4; // edi@3 - int v5; // ebx@3 - int v6; // esi@3 - unsigned int v7; // eax@3 - int v8; // eax@4 - unsigned int v9; // eax@6 - int v10; // eax@7 - //int v11; // ebx@9 - //int v12; // edi@9 - int v13; // eax@21 - int v14; // eax@31 - int v15; // edi@33 - int v16; // eax@34 - int v17; // edx@34 - int v18; // ebx@34 - int v19; // eax@36 - int v20; // eax@39 - int v21; // ecx@43 - //char v22; // zf@44 - int v23; // ecx@47 - //int v24; // edi@52 - int v25; // eax@54 - int v26; // ecx@54 - int v27; // eax@56 - int v28; // edx@60 - int v29; // ecx@61 - int v30; // ecx@64 - int v31; // ecx@68 - int v32; // eax@70 - //int v33; // ecx@71 - int v34; // eax@73 - int v35; // ecx@77 - int v36; // ecx@81 - int v37; // ecx@86 - int v38; // eax@88 - int v39; // ecx@88 - int v40; // eax@90 - int v41; // edx@94 - //int v42; // ecx@95 - int v43; // ecx@98 - int v44; // ecx@102 - int v45; // eax@104 - int v46; // eax@107 - int v47; // ecx@111 - int v48; // ecx@115 - int v49; // edi@120 - int v50; // eax@122 - int v51; // ecx@122 - int v52; // eax@124 - int v53; // edx@128 - int v54; // ecx@129 - int v55; // ecx@132 - int v56; // eax@139 - int v57; // ecx@140 - int v58; // eax@142 - int v59; // ecx@146 - //int v60; // ecx@147 - int v61; // ecx@150 - int v62; // ecx@155 - int v63; // eax@157 - int v64; // ecx@157 - int v65; // eax@159 - int v66; // edx@163 - int v67; // ecx@164 - int v68; // ecx@167 - //int v69; // eax@173 - int v70; // edi@178 - //int v71; // eax@178 - //int v72; // ecx@178 - //int x; // ebx@180 - //int v74; // eax@182 - //int v75; // eax@184 - IndoorCameraD3D *pIndoorCameraD3D_3; // ecx@184 - int uStartZ; // ecx@184 - int v79; // ebx@185 - int v127; // esi@185 - int v86; // edi@196 - //int v87; // eax@196 - //int v88; // ecx@196 - //int v89; // eax@198 - //int v90; // ecx@200 - int v92; // ebx@203 - //int v93; // ST08_4@204 - int v97; // ST08_4@204 - float result; // eax@212 - //struct - //{ - int v106; // [sp+Ch] [bp-68h]@191 - int v103; // [sp+10h] [bp-64h]@190 - int v104; // [sp+12h] [bp-62h]@190 - //} v102; - int v105; // [sp+1Ch] [bp-58h]@1 - int v107; // [sp+20h] [bp-54h]@3 - int uEndZ; // [sp+24h] [bp-50h]@3 - int v108; // [sp+28h] [bp-4Ch]@9 - int v109; // [sp+2Ch] [bp-48h]@9 - int v110; // [sp+30h] [bp-44h]@9 - int v111; // [sp+34h] [bp-40h]@3 - int v112; // [sp+38h] [bp-3Ch]@6 - IndoorCameraD3D *pIndoorCameraD3D_4; // [sp+3Ch] [bp-38h]@9 - int v114; // [sp+40h] [bp-34h]@9 - int v115; // [sp+44h] [bp-30h]@9 - int v116; // [sp+48h] [bp-2Ch]@9 - //int v117; // [sp+4Ch] [bp-28h]@9 - int v118; // [sp+50h] [bp-24h]@9 - int v119; // [sp+54h] [bp-20h]@1 - int v120; // [sp+58h] [bp-1Ch]@1 - int i; // [sp+5Ch] [bp-18h]@1 - int v122; // [sp+60h] [bp-14h]@1 - int v123; // [sp+64h] [bp-10h]@1 - int v124; // [sp+68h] [bp-Ch]@1 - int v125; // [sp+6Ch] [bp-8h]@9 - int v126; // [sp+70h] [bp-4h]@9 - - v105 = pIndoorCamera->sRotationY / ((signed int)stru_5C6E00->uIntegerHalfPi / 2);//2 - pDirectionIndicator1 = stru_5C6E00->uDoublePiMask & (stru_5C6E00->uIntegerDoublePi - pIndoorCamera->sRotationY);//1536 - pDirectionIndicator2 = stru_5C6E00->uDoublePiMask & (stru_5C6E00->uIntegerPi + pDirectionIndicator1);//512 - v124 = ((pIndoorCamera->uMapGridCellX << 16) + 3 * stru_5C6E00->Cos(stru_5C6E00->uDoublePiMask & (stru_5C6E00->uIntegerPi + pDirectionIndicator1))) >> 16;//88 - v123 = ((pIndoorCamera->uMapGridCellZ << 16) + 3 * stru_5C6E00->Sin(pDirectionIndicator2)) >> 16;// 66 - v120 = pOutdoorCamera->outdoor_grid_band_3 + v124;//+- range X - v119 = pOutdoorCamera->outdoor_grid_band_3 + v123; - v2 = pOutdoorCamera->uCameraFovInDegrees + 15;//90 - i = v124 - pOutdoorCamera->outdoor_grid_band_3; - v122 = v123 - pOutdoorCamera->outdoor_grid_band_3; - - if ( v2 > 90 ) - v2 = 90; - v3 = (v2 << 11) / 720; - v4 = stru_5C6E00->uDoublePiMask & (pDirectionIndicator1 - v3); - v5 = stru_5C6E00->uDoublePiMask & (v3 + pDirectionIndicator1); - - v106 = stru_5C6E00->Cos(v4); - uEndZ = stru_5C6E00->Sin(v4); - - v111 = stru_5C6E00->Cos(v5); - v6 = stru_5C6E00->Sin(v5); - - v7 = v4 & stru_5C6E00->uPiMask; - if ( (v4 & stru_5C6E00->uPiMask) >= stru_5C6E00->uIntegerHalfPi ) - v8 = -stru_5C6E00->pTanTable[stru_5C6E00->uIntegerPi - v7]; - else - v8 = stru_5C6E00->pTanTable[v7]; - v112 = abs(v8); - - v9 = v5 & stru_5C6E00->uPiMask; - if ( (v5 & stru_5C6E00->uPiMask) >= stru_5C6E00->uIntegerHalfPi ) - v10 = -stru_5C6E00->pTanTable[stru_5C6E00->uIntegerPi - v9]; - else - v10 = stru_5C6E00->pTanTable[v9]; - v108 = abs(v10); - - //v11 = v124; - //v12 = v123; - v114 = 0; - v115 = 0; - pIndoorCameraD3D_4 = 0; - v125 = 0; - v126 = v124; - v118 = v123; - - v110 = (v106 >= 0 ? 1: -1);//2 * (v106 >= 0) - 1; - v109 = (uEndZ >= 0 ? 1: -1);//2 * (v107 >= 0) - 1; - uEndZ = (v111 >= 0 ? 1: -1);//2 * (v111 >= 0) - 1; - v106 = (v6 >= 0 ? 1: -1);//2 * (v6 >= 0) - 1; - - uint _i = 1; - uint j = 1; - - terrain_76DDC8[0] = -1; - terrain_76DFC8[0] = -1; - terrain_76E1C8[0] = -1; - terrain_76E3C8[0] = -1; - - for( uint _i = 1; _i < 128; _i++) - { - if ( v112 >= 0x10000 ) - { - int v1, v2; - /*v111 = 4294967296i64 / v112; - v114 += v111; - if ( v114 >= 65536 ) - { - v11 += v110; - v114 = (unsigned __int16)v114; - } - v12 += v109;*/ - } - else - { - v124 += v110; - v115 += v112; - if ( v112 + v115 >= 65536 ) - { - v123 += v109; - v115 = (unsigned __int16)v115; - } - } - if ( v124 < _i || v124 > v120 || v123 < v122 || v123 > v119 ) - break; - //v13 = v116++; - terrain_76E3C8[_i] = v124; - terrain_76E1C8[_i] = v123; - } - - for( j = 1; j < 128; j++ ) - { - if ( v108 >= 65536 ) - { - v111 = 4294967296i64 / v108; - v114 += v111;// - if ( v111 + v114 >= 65536 ) - { - v126 += uEndZ; - v114 = (unsigned __int16)v114;// - } - v118 += v106; - } - else - { - v125 += v108; - v126 += uEndZ; - if ( v125 >= 65536 ) - { - v118 += v106; - v125 = (unsigned __int16)v125; - } - } - //if ( v117 >= 128 ) - //break; - if ( v126 < _i ) - break; - if ( v126 > v120 ) - break; - v14 = v118; - if ( v118 < v122 ) - break; - if ( v118 > v119 ) - break; - terrain_76DFC8[j] = v126; - terrain_76DDC8[j] = v14; - } - v16 = 0; - v126 = 0; - v17 = j - 1; - v18 = _i - 1; - - switch ( v105 ) - { - case 0: - case 7: - { - //v116 = terrain_76DFC8[v17]; - if ( v120 > terrain_76DFC8[v17] ) - { - v125 = v120; - memset32(terrain_76D9C8.data(), v119 + 1, 4 * (v120 - terrain_76DFC8[v17] + 1)); - v19 = v120; - do - terrain_76DBC8[v126++] = v19--; - while ( v19 >= terrain_76DFC8[v17] ); - if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 + 127] ) - { - do - v20 = terrain_76DDC8[v17-- -1]; - while ( v20 == terrain_76DDC8[v17 -1] ); - } - v16 = v126; - --v17; - } - if ( v17 < 0 ) - v17 = 0; - v21 = terrain_76DFC8[v17]; - while ( 1 ) - { - v125 = terrain_76DFC8[v17]; - if ( v21 < v124 ) - break; - terrain_76DBC8[v16] = v21; - //v22 = terrain_76DDC8[v17] == 65535; - terrain_76D9C8[v16] = terrain_76DDC8[v17] + 1; - if ( terrain_76DDC8[v17] == 65535 ) - { - terrain_76D9C8[v16] = v123 + 1; - break; - } - if ( !v17 ) - break; - if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 - 1] ) - { - do - v23 = terrain_76DDC8[v17-- -1]; - while ( v23 == terrain_76DDC8[v17 -1] ); - } - --v17; - v21 = v125 - 1; - ++v16; - } - v16 = 0; - //v24 = terrain_76E3C8[v18]; - v126 = 0; - if ( v120 > terrain_76E3C8[v18] ) - { - v125 = v120; - memset32(terrain_76D5C8.data(), v122, 4 * (v120 - terrain_76E3C8[v18] + 1)); - do - { - v25 = v126; - v26 = v125--; - ++v126; - terrain_76D7C8[v25] = v26; - } - while ( v125 >= terrain_76E3C8[v18] ); - if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] ) - { - do - v27 = terrain_76E1C8[v18-- -1]; - while ( v27 == terrain_76E1C8[v18 -1] ); - } - v16 = v126; - --v18; - } - if ( v18 < 0 ) - v18 = 0; - v28 = terrain_76E3C8[v18]; - while ( v28 >= v124 ) - { - v29 = terrain_76E1C8[v18]; - terrain_76D7C8[v16] = v28; - terrain_76D5C8[v16] = v29; - if ( v29 == 65535 ) - { - v31 = v123; - terrain_76D5C8[v16] = v31; - break; - } - if ( !v18 ) - break; - if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] ) - { - do - v30 = terrain_76E1C8[v18-- -1]; - while ( v30 == terrain_76E1C8[v18 -1] ); - } - --v18; - --v28; - ++v16; - } - break; - } - case 1: - case 2: - { - //v116 = terrain_76DDC8[v17]; - if ( v122 < terrain_76DDC8[v17] ) - { - v106 = v122; - memset32(terrain_76DBC8.data(), v120 + 1, 4 * (terrain_76DDC8[v17] - v122 + 1)); - for ( v32 = v122; v32 <= terrain_76DDC8[v17]; v32++) - terrain_76D9C8[v126++] = v32; - if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] ) - { - do - v34 = terrain_76DBC8[v17-- -1]; - while ( v34 == terrain_76DBC8[v17 -1] ); - } - v16 = v126; - --v17; - } - if ( v17 < 0 ) - v17 = 0; - v35 = terrain_76DDC8[v17]; - v125 = terrain_76DDC8[v17]; - while ( v35 <= v123 ) - { - //v22 = terrain_76DFC8[v17] == 65535; - terrain_76DBC8[v16] = terrain_76DFC8[v17] + 1; - terrain_76D9C8[v16] = v125; - if ( terrain_76DFC8[v17] == 65535 ) - { - terrain_76DBC8[v16] = v124 + 1; - break; - } - if ( !v17 ) - break; - if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] ) - { - do - v36 = terrain_76DBC8[v17-- -1]; - while ( v36 == terrain_76DBC8[v17 -1] ); - } - --v17; - ++v125; - v35 = v125; - ++v16; - } - v16 = 0; - v126 = 0; - v37 = terrain_76E1C8[v18]; - if ( v122 < v37 ) - { - v114 = v122; - memset32(terrain_76D7C8.data(), i, 4 * (v37 - v122 + 1)); - do - { - v38 = v126; - v39 = v114; - ++v126; - ++v114; - terrain_76D5C8[v38] = v39; - } - while ( v114 <= terrain_76E1C8[v18] ); - if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] ) - { - do - v40 = terrain_76DFC8[v18-- -1]; - while ( v40 == terrain_76DFC8[v18 -1] ); - } - v16 = v126; - --v18; - } - if ( v18 < 0 ) - v18 = 0; - v41 = terrain_76E1C8[v18]; - while ( v41 <= v123 ) - { - terrain_76D5C8[v16] = v41; - terrain_76D7C8[v16] = terrain_76E3C8[v18]; - if ( terrain_76E3C8[v18] == 65535 ) - { - terrain_76D7C8[v16] = v124; - break; - } - if ( !v18 ) - break; - if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] ) - { - do - v43 = terrain_76DFC8[v18-- -1]; - while ( v43 == terrain_76DFC8[v18 -1] ); - } - --v18; - ++v41; - ++v16; - } - break; - } - case 5: - case 6: - { - //v116 = terrain_76DDC8[v17]; - if ( v119 > terrain_76DDC8[v17] ) - { - v106 = v119; - memset32(terrain_76DBC8.data(), i, 4 * (v119 - terrain_76DDC8[v17] + 1)); - for ( v45 = v119; v45 >= terrain_76DDC8[v17]; v45--) - terrain_76D9C8[v126++] = v45; - if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] ) - { - do - v46 = terrain_76DBC8[v17-- -1]; - while ( v46 == terrain_76DBC8[v17 -1] ); - } - v16 = v126; - --v17; - } - if ( v17 < 0 ) - v17 = 0; - v47 = terrain_76DDC8[v17]; - v125 = terrain_76DDC8[v17]; - while ( v47 >= v123 ) - { - //v22 = terrain_76DFC8[v17] == 65535; - terrain_76DBC8[v16] = terrain_76DFC8[v17]; - terrain_76D9C8[v16] = v125; - if ( terrain_76DFC8[v17] == 65535 ) - { - terrain_76DBC8[v16] = v124; - break; - } - if ( !v17 ) - break; - if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] ) - { - do - v48 = terrain_76DBC8[v17-- -1]; - while ( v48 == terrain_76DBC8[v17 -1] ); - } - --v17; - --v125; - v47 = v125; - ++v16; - } - v16 = 0; - v49 = terrain_76E1C8[v18]; - v126 = 0; - if ( v119 > v49 ) - { - v125 = v119; - memset32(terrain_76D7C8.data(), v120 + 1, 4 * (v119 - v49 + 1)); - do - { - v50 = v126; - v51 = v125--; - ++v126; - terrain_76D5C8[v50] = v51; - } - while ( v125 >= terrain_76E1C8[v18] ); - if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] ) - { - do - v52 = terrain_76DFC8[v18-- -1]; - while ( v52 == terrain_76DFC8[v18 -1] ); - } - v16 = v126; - --v18; - } - if ( v18 < 0 ) - v18 = 0; - v53 = terrain_76E1C8[v18]; - while ( v53 >= v123 ) - { - v54 = terrain_76E3C8[v18]; - terrain_76D5C8[v16] = v53; - terrain_76D7C8[v16] = v54 + 1; - if ( v54 == 65535 ) - { - terrain_76D7C8[v16] = v124 + 1; - break; - } - if ( !v18 ) - break; - if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] ) - { - do - v55 = terrain_76DFC8[v18-- -1]; - while ( v55 == terrain_76DFC8[v18 -1] ); - } - --v18; - --v53; - ++v16; - } - break; - } - case 3: - case 4: - { - //v116 = terrain_76DFC8[v17]; - if ( i < terrain_76DFC8[v17] ) - { - v106 = i; - memset32(terrain_76D9C8.data(), v122, 4 * (terrain_76DFC8[v17] - i + 1)); - v56 = i; - do - { - v57 = v126++; - terrain_76DBC8[v57] = v56++; - } - while ( v56 <= terrain_76DFC8[v17] ); - if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 -1] ) - { - do - v58 = terrain_76DDC8[v17-- -1]; - while ( v58 == terrain_76DDC8[v17 -1] ); - } - v16 = v126; - --v17; - } - if ( v17 < 0 ) - v17 = 0; - v59 = terrain_76DFC8[v17]; - while ( 1 ) - { - v125 = v59; - if ( v59 > v124 ) - break; - terrain_76DBC8[v16] = v59; - //v60 = terrain_76DDC8[v17]; - terrain_76D9C8[v16] = terrain_76DDC8[v17]; - if ( terrain_76DDC8[v17] == 65535 ) - { - terrain_76D9C8[v16] = v123; - break; - } - if ( !v17 ) - break; - if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 -1] ) - { - do - v61 = terrain_76DDC8[v17-- -1]; - while ( v61 == terrain_76DDC8[v17 -1] ); - } - --v17; - v59 = v125 + 1; - ++v16; - } - v16 = 0; - v126 = 0; - v62 = terrain_76E3C8[v18]; - if ( i < v62 ) - { - v114 = i; - memset32(terrain_76D5C8.data(), v119 + 1, 4 * (v62 - i + 1)); - do - { - v63 = v126; - v64 = v114; - ++v126; - ++v114; - terrain_76D7C8[v63] = v64; - } - while ( v114 <= terrain_76E3C8[v18] ); - if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] ) - { - do - v65 = terrain_76E1C8[v18-- -1]; - while ( v65 == terrain_76E1C8[v18 -1] ); - } - v16 = v126; - --v18; - } - if ( v18 < 0 ) - v18 = 0; - v66 = terrain_76E3C8[v18]; - while ( v66 <= v124 ) - { - v67 = terrain_76E1C8[v18]; - terrain_76D7C8[v16] = v66; - terrain_76D5C8[v16] = v67 + 1; - if ( terrain_76E1C8[v18] == 65535 ) - { - v31 = v123 + 1; - terrain_76D5C8[v16] = v31; - break; - } - if ( !v18 ) - break; - if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] ) - { - do - v68 = terrain_76E1C8[v18-- -1]; - while ( v68 == terrain_76E1C8[v18 -1] ); - } - --v18; - ++v66; - ++v16; - } - break; - } - default: - break; - } - //v69 = v16 - 1; - ptr_801A08 = pVerticesSR_806210; - ptr_801A04 = pVerticesSR_801A10; - //v126 = v69; - - if ( v105 && v105 != 7 && v105 != 3 && v105 != 4 )// - { - for ( i = v16 - 1; i >= 1; --i ) - { - //v70 = i; - //v71 = terrain_76D7C8[i];//88 - //v72 = terrain_76DBC8[i];//0 - if ( terrain_76D7C8[i] < terrain_76DBC8[i] )//swap - { - terrain_76DBC8[i] = terrain_76D7C8[i]; - terrain_76D7C8[i] = terrain_76DBC8[i]; - } - //x = terrain_76DBC8[i];//0 - v111 = 0; - if ( terrain_76DBC8[i] <= 0 ) - terrain_76DBC8[i] = -terrain_76DBC8[i]; - //v74 = terrain_76D7C8[i]; - if ( terrain_76D7C8[i] <= 0 ) - terrain_76D7C8[i] = -terrain_76D7C8[i]; - uEndZ = terrain_76D7C8[i] + 2; - //pIndoorCameraD3D_3 = pGame->pIndoorCameraD3D; - //uEndZ = v75; - //pIndoorCameraD3D_4 = pIndoorCameraD3D_3; - uStartZ = terrain_76DBC8[i] - 2; - if ( terrain_76DBC8[i] - 2 < uEndZ ) - { - v127 = 0; - //v79 = (v73 - 66) << 9; - //v116 = v77; - //pHeight = v79; - v111 = uEndZ - uStartZ; - for (int z = uStartZ; z < uEndZ; ++z) - { - ptr_801A08[v127].vWorldPosition.x = (-64 + terrain_76DBC8[i]) * 512;//pTerrainVertices[z * 128 + x].vWorldPosition.x = (-64 + (signed)x) * 512; - ptr_801A08[v127].vWorldPosition.y = (64 - terrain_76D9C8[i]) * 512; - ptr_801A08[v127].vWorldPosition.z = pOutdoor->GetHeightOnTerrain( z, terrain_76D9C8[i]); - - ptr_801A04[v127].vWorldPosition.x = (-64 + terrain_76DBC8[i]) * 512; - ptr_801A04[v127].vWorldPosition.y = (63 - terrain_76D9C8[i]) * 512; - ptr_801A04[v127].vWorldPosition.z = pOutdoor->GetHeightOnTerrain( z, terrain_76D9C8[i] + 1); - - if ( !byte_4D864C || !(pGame->uFlags & 0x80) ) - { - pIndoorCameraD3D_4->ViewTransform(&ptr_801A08[v127], 1); - pIndoorCameraD3D_4->ViewTransform(&ptr_801A04[v127], 1); - - pIndoorCameraD3D_4->Project(&ptr_801A08[v127], 1, 0); - pIndoorCameraD3D_4->Project(&ptr_801A04[v127], 1, 0); - } - //v79 += 512; - v127 ++; - //++v116; - //pHeight = v79; - } - //while ( v116 < v107 ); - } - v103 = abs((int)pIndoorCamera->uMapGridCellZ - terrain_76D9C8[i]); - v104 = abs((int)pIndoorCamera->uMapGridCellX - terrain_76DBC8[i]); - if ( pRenderer->pRenderD3D )//Ritor1: do comment to test - Render::DrawTerrainD3D(v111, 0, v103, v104); - //Render::RenderTerrainD3D(); - else - Render::DrawTerrainSW(v111, 0, v103, v104); - } - } - else - { - for ( i = v16 - 1; i >= 1; --i ) - { - //v86 = i; - //v87 = terrain_76D5C8[i]; - //v88 = terrain_76D9C8[i]; - if ( terrain_76D5C8[i] < terrain_76D9C8[i] ) - { - terrain_76D9C8[i] = terrain_76D5C8[i]; - terrain_76D5C8[i] = terrain_76D9C8[i]; - } - //v89 = terrain_76D9C8[i]; - v111 = 0; - if ( terrain_76D9C8[i] <= 0 ) - terrain_76D9C8[i] = -terrain_76D9C8[i]; - //v90 = terrain_76D5C8[i]; - if ( terrain_76D5C8[i] <= 0 ) - terrain_76D5C8[i] = -terrain_76D5C8[i]; - pIndoorCameraD3D_4 = pGame->pIndoorCameraD3D; - v107 = terrain_76D5C8[i] + 2; - if ( terrain_76D9C8[i] - 2 < terrain_76D5C8[i] + 2 ) - { - v86 = 0; - //v116 = terrain_76D9C8[i] - 2; - v92 = (66 - terrain_76D9C8[i]) << 9; - //pHeight = (66 - terrain_76D9C8[i]) << 9; - v111 = terrain_76D5C8[i] + 2 - (terrain_76D9C8[i] - 2); - //do - for ( v116 = terrain_76D9C8[i] - 2; v116 < v107; ++v116 ) - { - ptr_801A08[v86].vWorldPosition.x = (terrain_76DBC8[v86] - 64) << 9; - ptr_801A08[v86].vWorldPosition.y = v92; - ptr_801A08[v86].vWorldPosition.z = pOutdoor->GetHeightOnTerrain(terrain_76DBC8[v86], v116); - - ptr_801A04[v86].vWorldPosition.x = (terrain_76DBC8[v86] - 63) << 9; - ptr_801A04[v86].vWorldPosition.y = v92; - ptr_801A04[v86].vWorldPosition.z = pOutdoor->GetHeightOnTerrain(terrain_76DBC8[v86] + 1, v116); - if ( !byte_4D864C || !(pGame->uFlags & 0x80) ) - { - pIndoorCameraD3D_4->ViewTransform((RenderVertexSoft *)(char *)ptr_801A08 + v86, 1); - pIndoorCameraD3D_4->ViewTransform((RenderVertexSoft *)(char *)ptr_801A04 + v86, 1); - pIndoorCameraD3D_4->Project((RenderVertexSoft *)(char *)ptr_801A08 + v86, 1, 0); - pIndoorCameraD3D_4->Project((RenderVertexSoft *)(char *)ptr_801A04 + v86, 1, 0); - } - v92 -= 512; - v86 += 48; - //++v116; - //pHeight = v92; - } - //while ( v116 < v107 ); - } - v103 = abs((int)pIndoorCamera->uMapGridCellX - terrain_76DBC8[v86]); - v104 = abs((int)pIndoorCamera->uMapGridCellZ - terrain_76D9C8[v86]); - if ( pRenderer->pRenderD3D ) - Render::DrawTerrainD3D(v111, 1, v103, v104); - else - Render::DrawTerrainSW(v111, 1, v103, v104); - } - } - result = v126; - pOutdoorCamera->field_40 = v126; - return result; -} -// 47FFC4: inconsistent fpu stack -// 4D864C: using guessed type char byte_4D864C; - void Render::RenderTerrainD3D() // New function { - int pTextureID; // ecx@8 - struct stru148 *pTile; // ebx@8 + char result; // al@3 + int v6; // ecx@8 + struct Polygon *pTile; // ebx@8 + struct Polygon *v16; + unsigned int v18; // edi@22 + int v35; // edi@63 + int v37; // eax@73 + int v39; // eax@80 + char v40; // [sp-18h] [bp-70h]@2 + int v41; // [sp-14h] [bp-6Ch]@2 + int v42; // [sp-10h] [bp-68h]@2 + int v43; // [sp-Ch] [bp-64h]@2 + const char *v44; // [sp-8h] [bp-60h]@2 + int v45; // [sp-4h] [bp-5Ch]@2 + int v56; + int v57; // [sp+38h] [bp-20h]@36 + int v64; // [sp+57h] [bp-1h]@2 + int v62; //warning: the game uses CW culling by default, ccw is incosistent pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_CCW); @@ -1711,11 +279,11 @@ //-------------------------------------------------------------------------------------------------------------------- // - for (unsigned int z = 0; z < 128; ++z) - { - for (unsigned int x = 0; x < 128; ++x) - { - pTile = &array_77EC08[pOutdoorCamera->numStru148s]; + for (unsigned int z = 0; z < 127; ++z) + { + for (unsigned int x = 0; x < 127; ++x) + { + pTile = &array_77EC08[pOutdoorCamera->uNumPolygons]; pTile->flags = 0; pTile->field_32 = 0; pTile->uTileBitmapID = pOutdoor->DoGetTileTexture(x, z); @@ -1769,9 +337,9 @@ pTile->dimming_level = 20.0 - floorf(20.0 * _f + 0.5f); //----------------------------------------------------------------------------------------------- - ++pOutdoorCamera->numStru148s; + ++pOutdoorCamera->uNumPolygons; ++pOutdoorCamera->field_44; - assert(pOutdoorCamera->numStru148s < 20000);// numStru148s - (numFaces) + assert(pOutdoorCamera->uNumPolygons < 20000); pTile->uBModelID = 0; pTile->uBModelFaceID = 0; @@ -1789,28 +357,28 @@ if ( pTile->flags & 2 && pTile->uTileBitmapID == pRenderer->hd_water_tile_id) { //transparent = false; - pTextureID = pRenderer->pHDWaterBitmapIDs[pRenderer->hd_water_current_frame]; + v6 = pRenderer->pHDWaterBitmapIDs[pRenderer->hd_water_current_frame]; } else { - pTextureID = pTile->uTileBitmapID; + v6 = pTile->uTileBitmapID; if ( !_strnicmp(pBitmaps_LOD->pTextures[pTile->uTileBitmapID].pName, "wtrdr", 5) ) transparent = true; } - assert(pTextureID < 1000); // many random crashes here + assert(v6 < 1000); // many random crashes here // for all shore tiles - draw a tile water under them since they're half-empty if (!_strnicmp(pBitmaps_LOD->pTextures[pTile->uTileBitmapID].pName, "wtrdr", 5)) // all shore tile filenames are wtrdrXXX pTile->DrawBorderTiles(); - pRenderer->DrawTerrainPolygon(pTile->uNumVertices, pTile, pBitmaps_LOD->pHardwareTextures[pTextureID], transparent, true); + pRenderer->DrawTerrainPolygon(pTile->uNumVertices, pTile, pBitmaps_LOD->pHardwareTextures[v6], transparent, true); } //else // //pTile->DrawBorderTiles(); //-------------------------------------------------------------------------------------------------------------------------------- - --pOutdoorCamera->numStru148s; + --pOutdoorCamera->uNumPolygons; --pOutdoorCamera->field_44; } } @@ -1832,7 +400,7 @@ double v13; // ST2C_8@6 int v14; // eax@6 double v15; // st7@6 - stru148 *pTile; // ebx@12 + struct Polygon *pTile; // ebx@12 unsigned __int16 v17; // ax@12 int v18; // eax@13 signed int v22; // eax@13 @@ -1852,9 +420,9 @@ char v35; // zf@47 unsigned int v36; // eax@50 int v37; // eax@54 - //stru148 *v38; // ecx@55 + //Polygon *v38; // ecx@55 unsigned int v39; // eax@59 - stru148 *v40; // ebx@62 + struct Polygon *v40; // ebx@62 unsigned __int16 pTileBitmapsID; // ax@62 int v42; // eax@63 LightmapBuilder *v43; // ecx@63 @@ -1873,7 +441,7 @@ unsigned int v56; // eax@101 int v57; // eax@105 unsigned int v58; // eax@109 - stru148 *v59; // esi@112 + struct Polygon *v59; // esi@112 unsigned __int16 v60; // ax@112 int v61; // eax@113 signed int v62; // eax@113 @@ -1885,7 +453,7 @@ double v68; // st5@120 double v69; // st7@133 int v70; // edi@138 - stru148 *v71; // esi@147 + struct Polygon *v71; // esi@147 unsigned int v72; // ecx@147 unsigned int v73; // eax@150 int v74; // eax@154 @@ -1996,7 +564,7 @@ if ( v8->vWorldPosition.y != pVertices->vWorldPosition.y || pVertices->vWorldPosition.y != pVertices2->vWorldPosition.y || pVertices2->vWorldPosition.y != v101->vWorldPosition.y ) break;*/ - pTile = &array_77EC08[pOutdoorCamera->numStru148s]; + pTile = &array_77EC08[pOutdoorCamera->uNumPolygons]; pTile->uTileBitmapID = pOutdoor->GetTileTexture(sX, sY); if ( pTile->uTileBitmapID != -1 ) { @@ -2015,16 +583,16 @@ (((float)pOutdoor->vSunlight.y / 65536.0) * norm->y) - (((float)pOutdoor->vSunlight.z / 65536.0) * norm->z)) * 20.0; //v25 = thisf + 6.7553994e15; - //v27 = pOutdoorCamera->numStru148s > 1999; - //v26 = pOutdoorCamera->numStru148s - 1999 < 0; + //v27 = pOutdoorCamera->uNumPolygons > 1999; + //v26 = pOutdoorCamera->uNumPolygons - 1999 < 0; pTile->dimming_level = floorf(thisf + 0.5f); - if ( pOutdoorCamera->numStru148s >= 1999 ) + if ( pOutdoorCamera->uNumPolygons >= 1999 ) return; - ++pOutdoorCamera->numStru148s; + ++pOutdoorCamera->uNumPolygons; //if ( !sub_481FC9(v8, pVertices, v101, v16) )//Ritor1: It's temporary //goto LABEL_126; //{ - //--pOutdoorCamera->numStru148s; + //--pOutdoorCamera->uNumPolygons; //goto LABEL_162; //} memcpy(&array_50AC10[0], v102, 0x30u); @@ -2129,7 +697,7 @@ if ( ++v88 >= v84 ) return; } - /* v40 = &array_77EC08[pOutdoorCamera->numStru148s]; + /* v40 = &array_77EC08[pOutdoorCamera->uNumPolygons]; v40->uTileBitmapID = pOutdoor->GetTileTexture(sX, sY); if ( v40->uTileBitmapID == -1 ) goto LABEL_162; @@ -2157,13 +725,13 @@ v40->dimming_level = LOBYTE(v50); if ( LOBYTE(v50) < 0 ) v40->dimming_level = 0; - if ( pOutdoorCamera->numStru148s >= 1999 ) + if ( pOutdoorCamera->uNumPolygons >= 1999 ) return; - ++pOutdoorCamera->numStru148s; + ++pOutdoorCamera->uNumPolygons; /*if ( !sub_481FC9(pVertices, pVertices2, v8, v40) ) // Ritor1: It's temporary //goto LABEL_77; { - --pOutdoorCamera->numStru148s; + --pOutdoorCamera->uNumPolygons; goto LABEL_112; }*/ /*memcpy(&array_50AC10[0], v102, 0x30u); @@ -2188,7 +756,7 @@ /*if ( !(byte_76D5C0 & 2) ) { byte_76D5C0 |= 2; - stru148(stru_76D590); + Polygon(stru_76D590); atexit(loc_48118F); }*/ /*v96 = pGame->pLightmapBuilder; @@ -2201,7 +769,7 @@ if ( pGame->pIndoorCameraD3D->_4371C3(array_50AC10, &uNumVertices, 0) == 1 && !uNumVertices ) { //LABEL_77: - --pOutdoorCamera->numStru148s; + --pOutdoorCamera->uNumPolygons; goto LABEL_112; } thisb->ViewTransform(array_50AC10, uNumVertices); @@ -2264,8 +832,8 @@ pRenderer->DrawTerrainPolygon(v40->uNumVertices, v40, pBitmaps_LOD->pHardwareTextures[v58], 0, v81); } LABEL_112: - v59 = &array_77EC08[pOutdoorCamera->numStru148s]; - //a8 = (RenderVertexSoft *)&array_77EC08[pOutdoorCamera->numStru148s]; + v59 = &array_77EC08[pOutdoorCamera->uNumPolygons]; + //a8 = (RenderVertexSoft *)&array_77EC08[pOutdoorCamera->uNumPolygons]; v59->uTileBitmapID = pOutdoor->GetTileTexture(sX, sY); if ( v59->uTileBitmapID == -1 ) goto LABEL_162; @@ -2286,13 +854,13 @@ v59->dimming_level = floorf(thish + 0.5f); if ( v59->dimming_level < 0 ) v59->dimming_level = 0; - if ( pOutdoorCamera->numStru148s >= 1999 ) + if ( pOutdoorCamera->uNumPolygons >= 1999 ) return; - ++pOutdoorCamera->numStru148s; + ++pOutdoorCamera->uNumPolygons; if ( !sub_481FC9(v101, v102, pVertices2, v59) ) { //LABEL_126: - --pOutdoorCamera->numStru148s; + --pOutdoorCamera->uNumPolygons; goto LABEL_162; } memcpy(&array_50AC10[0], v102, 0x30u); @@ -2324,7 +892,7 @@ if ( pGame->pIndoorCameraD3D->_4371C3(array_50AC10, (unsigned int *)&v100, 0) == 1 && !v100 ) //goto LABEL_126; { - --pOutdoorCamera->numStru148s; + --pOutdoorCamera->uNumPolygons; goto LABEL_162; } thisc->ViewTransform(array_50AC10, v100); @@ -2382,10 +950,10 @@ //v77 = (int)v71; //v76 = v71->uNumVertices; //goto LABEL_161; - pRenderer->DrawTerrainPolygon(v71->uNumVertices, (stru148 *)v71, v78, 0, v80); + pRenderer->DrawTerrainPolygon(v71->uNumVertices, (Polygon *)v71, v78, 0, v80); goto LABEL_162; } - v38 = (stru148 *)v71; + v38 = (Polygon *)v71; goto LABEL_56; } v73 = sr_424EE0_MakeFanFromTriangle(v72); @@ -2395,508 +963,7 @@ goto LABEL_154; } }*/ -// 47F44B: using guessed type int __stdcall WorldPosToGridCellX(int); -// 47F458: using guessed type int __stdcall WorldPosToGridCellZ(int); -// 4D864C: using guessed type char byte_4D864C; -// 76D5C0: using guessed type char static_sub_0048034E_byte_76D5C0__init_flag; - -//----- (00481212) -------------------------------------------------------- -void Render::DrawTerrainSW(int a1, int a2, int a3, int a4) -{ - int v3; // esi@1 - int v4; // ecx@1 - int v5; // ST10_4@1 - int v6; // edi@1 - int v7; // ebx@2 - int v8; // eax@2 - int v9; // eax@3 - RenderVertexSoft *v10; // edi@3 - RenderVertexSoft *v11; // ebx@4 - RenderVertexSoft *v12; // ecx@4 - float v13; // eax@6 - int v14; // eax@6 - double v15; // st7@6 - double v16; // st7@6 - stru148 *v17; // ebx@12 - unsigned __int16 v18; // ax@12 - int v19; // eax@13 - float v20; // ecx@13 - stru220 *v21; // eax@13 - int v22; // eax@13 - signed int v23; // eax@13 - Vec3_float_ *v24; // eax@15 - double v25; // st7@18 - double v26; // st5@24 - double v27; // st5@24 - double v28; // st5@24 - double v29; // st5@24 - Game *v30; // eax@25 - RenderVertexSoft *v31; // edi@29 - double v32; // st7@31 - int v33; // esi@35 - RenderVertexSoft *v34; // edx@36 - RenderVertexSoft *v35; // ecx@36 - signed int v36; // eax@39 - signed int v37; // esi@40 - stru148 *v38; // ebx@43 - unsigned __int16 v39; // ax@43 - int v40; // eax@44 - float v41; // ecx@44 - stru220 *v42; // eax@44 - int v43; // eax@44 - int v44; // eax@44 - signed int v45; // eax@44 - Vec3_float_ *v46; // eax@46 - double v47; // st7@49 - double v48; // st5@57 - double v49; // st5@57 - double v50; // st5@57 - Game *v51; // eax@58 - RenderVertexSoft *v52; // edi@62 - double v53; // st7@63 - int v54; // esi@66 - signed int v55; // eax@69 - signed int v56; // esi@71 - unsigned __int16 v57; // ax@75 - stru220 *v58; // eax@76 - signed int v59; // eax@76 - Vec3_float_ *v60; // eax@77 - double v61; // st7@80 - double v62; // st5@88 - double v63; // st5@88 - double v64; // st5@88 - Game *v65; // eax@89 - double v66; // st7@94 - RenderVertexSoft *v67; // [sp-Ch] [bp-C4h]@36 - stru148 *v68; // [sp-8h] [bp-C0h]@36 - int v69; // [sp-4h] [bp-BCh]@36 - float v70; // [sp+Ch] [bp-ACh]@88 - double v71; // [sp+10h] [bp-A8h]@6 - double v72; // [sp+18h] [bp-A0h]@82 - double v73; // [sp+20h] [bp-98h]@6 - double v74; // [sp+28h] [bp-90h]@51 - double v75; // [sp+30h] [bp-88h]@6 - double v76; // [sp+38h] [bp-80h]@20 - double v77; // [sp+40h] [bp-78h]@6 - float v78; // [sp+48h] [bp-70h]@57 - float v79; // [sp+4Ch] [bp-6Ch]@6 - float v80; // [sp+50h] [bp-68h]@6 - int v81; // [sp+54h] [bp-64h]@1 - int v82; // [sp+58h] [bp-60h]@6 - int v83; // [sp+5Ch] [bp-5Ch]@82 - int v84; // [sp+60h] [bp-58h]@20 - int v85; // [sp+64h] [bp-54h]@1 - int v86; // [sp+68h] [bp-50h]@1 - int v87; // [sp+6Ch] [bp-4Ch]@51 - float v88; // [sp+70h] [bp-48h]@51 - int v89; // [sp+74h] [bp-44h]@6 - int v90; // [sp+78h] [bp-40h]@1 - float a3a; // [sp+7Ch] [bp-3Ch]@24 - stru220 *v92; // [sp+80h] [bp-38h]@2 - float v93; // [sp+84h] [bp-34h]@44 - int v94; // [sp+88h] [bp-30h]@6 - float v95; // [sp+8Ch] [bp-2Ch]@1 - float v96; // [sp+90h] [bp-28h]@1 - float v97; // [sp+94h] [bp-24h]@1 - int X; // [sp+98h] [bp-20h]@1 - float v99; // [sp+9Ch] [bp-1Ch]@6 - int v100; // [sp+A0h] [bp-18h]@6 - unsigned __int64 v101; // [sp+A4h] [bp-14h]@6 - RenderVertexSoft *v102; // [sp+ACh] [bp-Ch]@6 - RenderVertexSoft *v103; // [sp+B0h] [bp-8h]@6 - RenderVertexSoft *v104; // [sp+B4h] [bp-4h]@3 - float pNormalc; // [sp+C0h] [bp+8h]@6 - float pNormald; // [sp+C0h] [bp+8h]@6 - Vec3_float_ *pNormal; // [sp+C0h] [bp+8h]@17 - Vec3_float_ *pNormala; // [sp+C0h] [bp+8h]@48 - Vec3_float_ *pNormalb; // [sp+C0h] [bp+8h]@77 - - v3 = a1; - //v4 = *(short *)(a3 + 4); - //v5 = *(short *)(a3 + 6); - v85 = a2; - v86 = a3; //v4; - X = abs(a4); //v5 - v6 = 0; - v90 = 0; - v81 = v3 - 1; - v95 = (double)pOutdoor->vSunlight.x / 65536.0; - v96 = (double)pOutdoor->vSunlight.y / 65536.0; - v97 = (double)pOutdoor->vSunlight.z / 65536.0; - if ( v3 - 1 > 0 ) - { - while ( 1 ) - { - v7 = abs(X); - v8 = abs(v86); - --X; - v92 = &stru_76E5C8[(v7 << 7) + v8]; - if ( !v92->field_0 - || ((v9 = v6, v10 = &pVerticesSR_806210[v6], v104 = v10, !v85) ? (v11 = &pVerticesSR_801A10[v9], - v12 = &pVerticesSR_806210[v9 + 1]) : (v11 = &pVerticesSR_806210[v9 + 1], v12 = &pVerticesSR_801A10[v9]), - ((v103 = &pVerticesSR_801A10[v9 + 1], - v13 = v10->vWorldPosition.x, - v102 = v12, - v80 = v13, - v73 = v13 + 6.7553994e15, - v101 = __PAIR__((unsigned int)v11, LODWORD(v73)), - v79 = v10->vWorldPosition.y, - v75 = v79 + 6.7553994e15, - v100 = LODWORD(v75), - pNormalc = (v12->vWorldPosition.x + v10->vWorldPosition.x) * 0.5, - v71 = pNormalc + 6.7553994e15, - v89 = LODWORD(v71), - v14 = WorldPosToGridCellX(COERCE_UNSIGNED_INT64(pNormalc + 6.7553994e15)), - v15 = v11->vWorldPosition.y + v10->vWorldPosition.y, - v94 = v14, - pNormald = v15 * 0.5, - v16 = pNormald + 6.7553994e15, - v77 = v16, - v82 = LODWORD(v77), - LODWORD(v99) = WorldPosToGridCellZ(LODWORD(v16)), - WorldPosToGridCellX(v101), - WorldPosToGridCellZ(v100), - !byte_4D864C) - || !(pGame->uFlags & 0x80)) - && !sub_481EFA(v10, v11, v102, v103, 1)) ) - goto LABEL_105; - if ( v10->vWorldPosition.z != v11->vWorldPosition.z - || v11->vWorldPosition.z != v103->vWorldPosition.z - || v103->vWorldPosition.z != v102->vWorldPosition.z ) - break; - v17 = &array_77EC08[pOutdoorCamera->numStru148s]; - v18 = pOutdoor->GetTileTexture(v101, v100); - v17->uTileBitmapID = v18; - if ( v18 != -1 ) - { - v19 = pOutdoor->GetSomeOtherTileInfo(v101, v100); - LOWORD(v19) = v19 | 0x8010; - v20 = v99; - *(int *)&v17->flags = v19; - v21 = v92; - v17->field_59 = 1; - v17->terrain_grid_x = LOBYTE(v20); - v17->field_34 = v21->distance; - v22 = v94; - v17->terrain_grid_z = v94; - v23 = pTerrainNormalIndices[2 * (LODWORD(v20) + (v22 << 7)) + 1]; - if ( v23 < 0 || v23 > (signed int)(uNumTerrainNormals - 1) ) - v24 = 0; - else - v24 = &pTerrainNormals[v23]; - pNormal = v24; - if ( v24 ) - { - v25 = -(v97 * v24->z + v96 * v24->y + v95 * v24->x); - if ( v25 < 0.0 ) - v25 = 0.0; - v99 = v25 * 31.0; - v76 = v99 + 6.7553994e15; - v84 = LODWORD(v76); - v17->dimming_level = 31 - LOBYTE(v76); - } - else - { - v17->dimming_level = 0; - } - if ( pOutdoorCamera->numStru148s >= 1999 ) - return; - ++pOutdoorCamera->numStru148s; - if ( !sub_481FC9(v10, (RenderVertexSoft *)HIDWORD(v101), v102, v17) ) - goto LABEL_104; - v26 = 1.0 / (v104->vWorldViewPosition.x + 0.0000001); - memcpy(array_50AC10, v104, 0x30u); - array_50AC10[0]._rhw = v26; - array_50AC10[0].u = 0.0; - array_50AC10[0].v = 0.0; - v27 = *(float *)(HIDWORD(v101) + 12) + 0.0000001; - memcpy(&array_50AC10[1], (void *)HIDWORD(v101), sizeof(array_50AC10[1])); - array_50AC10[1]._rhw = 1.0 / v27; - array_50AC10[1].u = 0.0; - array_50AC10[1].v = 1.0; - v28 = v103->vWorldViewPosition.x + 0.0000001; - memcpy(&array_50AC10[2], v103, sizeof(array_50AC10[2])); - array_50AC10[2]._rhw = 1.0 / v28; - array_50AC10[2].u = 1.0; - array_50AC10[2].v = 1.0; - v29 = v102->vWorldViewPosition.x + 0.0000001; - memcpy(&array_50AC10[3], v102, sizeof(array_50AC10[3])); - array_50AC10[3]._rhw = 1.0 / v29; - array_50AC10[3].u = 1.0; - array_50AC10[3].v = 0.0; - pGame->pLightmapBuilder->StackLights_TerrainFace(pNormal, &a3a, array_50AC10, 4u, 1); - if ( stru_F8AD28.uNumLightsApplied <= 0 ) - { - v17->field_108 = 0; - } - else - { - v30 = pGame; - v17->field_108 = 1; - pGame->pLightmapBuilder->_45CA88(&stru_F8AD28, array_50AC10, 4, pNormal); - } - if ( v104->vWorldViewPosition.x < 8.0 - || *(float *)(HIDWORD(v101) + 12) < 8.0 - || (v31 = v102, v102->vWorldViewPosition.x < 8.0) - || v103->vWorldViewPosition.x < 8.0 ) - { - v36 = sr_4250FE(4u); - } - else - { - v32 = (double)pOutdoorCamera->shading_dist_mist; - if ( v32 >= v104->vWorldViewPosition.x - && v32 >= *(float *)(HIDWORD(v101) + 12) - && v32 >= v102->vWorldViewPosition.x - && v32 >= v103->vWorldViewPosition.x ) - { - v33 = sr_4254D2(4); - v17->uNumVertices = v33; - if ( !v33 ) - goto LABEL_104; - v34 = (RenderVertexSoft *)HIDWORD(v101); - v35 = v104; - v69 = 0; - v68 = v17; - v67 = v31; - goto LABEL_37; - } - v36 = sr_4252E8(4u); - } - v37 = v36; - if ( !v36 ) - goto LABEL_104; -LABEL_41: - OutdoorCamera::Project(v37); -LABEL_102: - v33 = sr_4254D2(v37); - v17->uNumVertices = v33; - if ( !v33 ) - goto LABEL_104; - v17->_48276F_sr(); - goto LABEL_38; - } -LABEL_105: - v6 = v90++ + 1; - if ( v90 >= v81 ) - return; - } - v38 = &array_77EC08[pOutdoorCamera->numStru148s]; - v39 = pOutdoor->GetTileTexture(v101, v100); - v38->uTileBitmapID = v39; - if ( v39 == -1 ) - goto LABEL_105; - v40 = pOutdoor->GetSomeOtherTileInfo(v101, v100); - BYTE1(v40) |= 0x80u; - v41 = v99; - *(int *)&v38->flags = v40; - v42 = v92; - v38->field_59 = 1; - v38->terrain_grid_x = LOBYTE(v41); - v38->field_34 = v42->distance; - v43 = v94; - v38->terrain_grid_z = v94; - v44 = 2 * (LODWORD(v41) + (v43 << 7)); - LODWORD(v93) = v44 * 2; - v45 = pTerrainNormalIndices[v44 + 1]; - if ( v45 < 0 || v45 > (signed int)(uNumTerrainNormals - 1) ) - v46 = 0; - else - v46 = &pTerrainNormals[v45]; - pNormala = v46; - if ( v46 ) - { - v47 = -(v97 * v46->z + v96 * v46->y + v95 * v46->x); - if ( v47 < 0.0 ) - v47 = 0.0; - v88 = v47 * 31.0; - v74 = v88 + 6.7553994e15; - v87 = LODWORD(v74); - v38->dimming_level = 31 - LOBYTE(v74); - } - else - { - v38->dimming_level = 0; - } - if ( v38->dimming_level < 0 ) - v38->dimming_level = 0; - if ( pOutdoorCamera->numStru148s >= 1999 ) - return; - ++pOutdoorCamera->numStru148s; - if ( !sub_481FC9((RenderVertexSoft *)HIDWORD(v101), v103, v104, v38) ) - goto LABEL_74; - v48 = 1.0 / (v104->vWorldViewPosition.x + 0.0000001); - memcpy(array_50AC10, v104, 0x30u); - array_50AC10[0]._rhw = v48; - array_50AC10[0].u = 0.0; - array_50AC10[0].v = 0.0; - v49 = *(float *)(HIDWORD(v101) + 12) + 0.0000001; - memcpy(&array_50AC10[1], (void *)HIDWORD(v101), sizeof(array_50AC10[1])); - array_50AC10[1]._rhw = 1.0 / v49; - array_50AC10[1].u = 0.0; - array_50AC10[1].v = 1.0; - v50 = v103->vWorldViewPosition.x + 0.0000001; - memcpy(&array_50AC10[2], v103, sizeof(array_50AC10[2])); - array_50AC10[2]._rhw = 1.0 / v50; - array_50AC10[2].u = 1.0; - array_50AC10[2].v = 1.0; - pGame->pLightmapBuilder->StackLights_TerrainFace(pNormala, &v78, array_50AC10, 3u, 0); - if ( stru_F8AD28.uNumLightsApplied <= 0 ) - { - v38->field_108 = 0; - } - else - { - v51 = pGame; - v38->field_108 = 1; - pGame->pLightmapBuilder->_45CA88(&stru_F8AD28, array_50AC10, 3, pNormala); - } - if ( v104->vWorldViewPosition.x < 8.0 - || *(float *)(HIDWORD(v101) + 12) < 8.0 - || (v52 = v103, v103->vWorldViewPosition.x < 8.0) ) - { - v55 = sr_4250FE(3u); - } - else - { - v53 = (double)pOutdoorCamera->shading_dist_mist; - if ( v53 >= v104->vWorldViewPosition.x - && v53 >= *(float *)(HIDWORD(v101) + 12) - && v53 >= v103->vWorldViewPosition.x ) - { - v54 = sr_4254D2(3); - v38->uNumVertices = v54; - if ( v54 ) - { - sr_sub_4829B9((RenderVertexSoft *)HIDWORD(v101), v52, v104, v38, 0); -LABEL_68: - sr_sub_481DB2(array_508690, v54, v38); -LABEL_75: - v17 = &array_77EC08[pOutdoorCamera->numStru148s]; - v57 = pOutdoor->GetTileTexture(v101, v100); - v17->uTileBitmapID = v57; - if ( v57 == -1 ) - goto LABEL_105; - *(int *)&v17->flags = pOutdoor->GetSomeOtherTileInfo(v101, v100); - v58 = v92; - v17->field_59 = 1; - v17->field_34 = v58->distance; - v17->terrain_grid_z = v94; - v17->terrain_grid_x = LOBYTE(v99); - v59 = *(unsigned __int16 *)((char *)pTerrainNormalIndices.data() + LODWORD(v93)); - if ( v59 > (signed int)(uNumTerrainNormals - 1) ) - { - pNormalb = 0; - v60 = 0; - } - else - { - v60 = &pTerrainNormals[v59]; - pNormalb = v60; - } - if ( v60 ) - { - v61 = -(v97 * v60->z + v96 * v60->y + v95 * v60->x); - if ( v61 < 0.0 ) - v61 = 0.0; - v93 = v61 * 31.0; - v72 = v93 + 6.7553994e15; - v83 = LODWORD(v72); - v17->dimming_level = 31 - LOBYTE(v72); - } - else - { - v17->dimming_level = 0; - } - if ( v17->dimming_level < 0 ) - v17->dimming_level = 0; - if ( pOutdoorCamera->numStru148s >= 1999 ) - return; - ++pOutdoorCamera->numStru148s; - if ( !sub_481FC9(v102, v104, v103, v17) ) - { -LABEL_104: - --pOutdoorCamera->numStru148s; - goto LABEL_105; - } - v62 = 1.0 / (v104->vWorldViewPosition.x + 0.0000001); - memcpy(array_50AC10, v104, 0x30u); - array_50AC10[0]._rhw = v62; - array_50AC10[0].u = 0.0; - array_50AC10[0].v = 0.0; - v63 = v103->vWorldViewPosition.x + 0.0000001; - memcpy(&array_50AC10[1], v103, sizeof(array_50AC10[1])); - array_50AC10[1]._rhw = 1.0 / v63; - array_50AC10[1].u = 1.0; - array_50AC10[1].v = 1.0; - v64 = v102->vWorldViewPosition.x + 0.0000001; - memcpy(&array_50AC10[2], v102, sizeof(array_50AC10[2])); - array_50AC10[2]._rhw = 1.0 / v64; - array_50AC10[2].u = 1.0; - array_50AC10[2].v = 0.0; - pGame->pLightmapBuilder->StackLights_TerrainFace(pNormalb, &v70, array_50AC10, 3u, 1); - if ( stru_F8AD28.uNumLightsApplied <= 0 ) - { - v17->field_108 = 0; - } - else - { - v65 = pGame; - v17->field_108 = 1; - pGame->pLightmapBuilder->_45CA88(&stru_F8AD28, array_50AC10, 3, pNormalb); - } - if ( v104->vWorldViewPosition.x < 8.0 || v103->vWorldViewPosition.x < 8.0 || v102->vWorldViewPosition.x < 8.0 ) - { - v37 = sr_4250FE(3u); - OutdoorCamera::Project(v37); - if ( !v37 ) - goto LABEL_104; - goto LABEL_102; - } - v66 = (double)pOutdoorCamera->shading_dist_mist; - if ( v66 < v104->vWorldViewPosition.x || v66 < v103->vWorldViewPosition.x || v66 < v102->vWorldViewPosition.x ) - { - v37 = sr_4252E8(3u); - if ( !v37 ) - goto LABEL_105; - goto LABEL_41; - } - v33 = sr_4254D2(3); - v17->uNumVertices = v33; - if ( !v33 ) - goto LABEL_104; - v34 = v104; - v35 = v102; - v69 = 0; - v68 = v17; - v67 = v103; -LABEL_37: - sr_sub_4829B9(v35, v34, v67, v68, v69); -LABEL_38: - sr_sub_481DB2(array_508690, v33, v17); - goto LABEL_105; - } - goto LABEL_74; - } - v55 = sr_4252E8(3u); - } - v56 = v55; - if ( v55 ) - { - OutdoorCamera::Project(v55); - v54 = sr_4254D2(v56); - v38->uNumVertices = v54; - if ( v54 ) - { - v38->_48276F_sr(); - goto LABEL_68; - } - } -LABEL_74: - --pOutdoorCamera->numStru148s; - goto LABEL_75; - } -} + //----- (0047BACF) -------------------------------------------------------- void Render::TransformBillboardsAndSetPalettesODM() @@ -3699,9 +1766,9 @@ local_0.x = v3; local_0.y = (double)*(signed int *)v0; local_0.z = (double)*((signed int *)v0 + 1); - local_0.flt_10 = 0.0; - local_0.flt_14 = 0.0; - local_0.flt_18 = 0.0; + local_0.r = 0.0; + local_0.g = 0.0; + local_0.b = 0.0; local_0.flt_28 = 1.0; local_0.timeToLive = (rand() & 0x80) + 128; local_0.uTextureID = pBitmaps_LOD->LoadTexture("effpar01"); @@ -4339,7 +2406,7 @@ } //----- (004A2050) -------------------------------------------------------- -void Render::DrawPolygon(unsigned int uNumVertices, stru148 *a3, ODMFace *a4, IDirect3DTexture2 *pTexture) +void Render::DrawPolygon(unsigned int uNumVertices, struct Polygon *a3, ODMFace *a4, IDirect3DTexture2 *pTexture) { Render *v5; // edi@1 unsigned int v6; // ebx@1 @@ -4406,10 +2473,10 @@ if ( v7->std__vector_000004_size) a2 = 0xFFFFFFFF; pGame->AlterGamma_ODM(a4, &a2); - if ( byte_4D864C && pGame->uFlags & 1 ) + if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_01) { v8 = ::GetActorTintColor(a3->dimming_level, 0, array_50AC10[0].vWorldViewPosition.x, 0, 0); - v7->_45D74F_MessWithLight(v8, 0); + v7->DrawLightmaps(/*v8, 0*/); } else { @@ -4501,7 +2568,7 @@ //v50 = (const char *)v5->pRenderD3D->pDevice; ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE)); //(*(void (**)(void))(*(int *)v50 + 88))(); - v53->_45D74F_MessWithLight(-1, 0); + v53->DrawLightmaps(/*-1, 0*/); for (uint i = 0; i < uNumVertices; ++i) { d3d_vertex_buffer[i].diffuse = a2; @@ -7063,10 +5130,7 @@ pRenderD3D->ClearTarget(true, 0x00F08020, true, 1.0); pRenderer->uNumBillboardsToDraw = 0; pRenderD3D->pDevice->BeginScene(); - if (!pRenderD3D->DoesRaiseExceptions()) - { - MessageBoxW(nullptr, L"Error executing scratch 3D operations", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\screen16_3d.cpp:360", 0); - } + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor ) uFogColor = GetLevelFogColor(); else @@ -7121,7 +5185,7 @@ return ::GetActorTintColor(tint, a4, a2, a5, a6); } -/*void Render::DrawTerrainPolygon_new(stru148 *a3, IDirect3DTexture2 *pTexture)//new function +/*void Render::DrawTerrainPolygon_new(Polygon *a3, IDirect3DTexture2 *pTexture)//new function { int v5; // ebx@1 int v6; // edi@1 @@ -7236,7 +5300,7 @@ }*/ //----- (004A26BC) -------------------------------------------------------- -void Render::DrawTerrainPolygon(unsigned int uNumVertices, stru148 *a4, IDirect3DTexture2 *a5, bool transparent, bool clampAtTextureBorders) +void Render::DrawTerrainPolygon(unsigned int uNumVertices, struct Polygon *a4, IDirect3DTexture2 *a5, bool transparent, bool clampAtTextureBorders) { //RenderVertexSoft *pVertices; // esi@0 //int v7; // edi@1 @@ -7314,10 +5378,10 @@ /* v9 = pGame->pLightmapBuilder; v65 = v9; v10 = v9->std__vector_000004_size;*/ - if ( byte_4D864C && pGame->uFlags & 1 ) + if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_01) { v11 = ::GetActorTintColor(a4->dimming_level, 0, array_50AC10[0].vWorldViewPosition.x, 0, 0); - pGame->pLightmapBuilder->_45D74F_MessWithLight(v11, 0); + pGame->pLightmapBuilder->DrawLightmaps(/*v11, 0*/); } else { @@ -7411,7 +5475,7 @@ //v63 = (const char *)v7->pRenderD3D->pDevice; ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE)); //(*(void (**)(void))(*(int *)v63 + 88))(); - pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0); + pGame->pLightmapBuilder->DrawLightmaps(/*-1, 0*/); for (uint i = 0; i < uNumVertices; ++i) { d3d_vertex_buffer[i].diffuse = -1; @@ -7468,7 +5532,7 @@ // 4D864C: using guessed type char byte_4D864C; //----- (004A2DA3) -------------------------------------------------------- -void Render::DrawSkyPolygon(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *pTexture) +void Render::DrawSkyPolygon(unsigned int uNumVertices, struct Polygon *a3, IDirect3DTexture2 *pTexture) { int v7; // eax@7 float v13; // ST3C_4@8 @@ -7510,7 +5574,7 @@ } //----- (004A2ED5) -------------------------------------------------------- -void Render::_4A2ED5(signed int a2, stru148 *a3, IDirect3DTexture2 *pHwTex) +void Render::_4A2ED5(signed int a2, struct Polygon *a3, IDirect3DTexture2 *pHwTex) { signed int v4; // edi@2 int v5; // eax@3 @@ -7553,6 +5617,433 @@ } } + +//----- (00479A53) -------------------------------------------------------- +void Render::DrawIndoorPolygonNoLight(unsigned int uNumVertices, unsigned int uFaceID) +{ + BLVFace *pFace; // esi@1 + unsigned int v3; // edi@1 + PolygonType v4; // al@1 + double v5; // st7@3 + signed __int64 v6; // qax@3 + PolygonType v7; // cl@3 + int v8; // esi@7 + int v9; // eax@7 + unsigned int v10; // eax@7 + double v11; // st6@7 + int v12; // edx@7 + int v13; // eax@7 + char *v14; // esi@8 + void *v15; // ecx@9 + int v16; // eax@9 + int v17; // edi@9 + double v18; // st7@9 + signed int v19; // ebx@9 + void *v20; // ecx@9 + int v21; // ebx@11 + int v22; // eax@14 + signed __int64 v23; // qtt@16 + double v24; // st7@16 + unsigned __int8 v25; // sf@16 + unsigned __int8 v26; // of@16 + Render *v27; // ecx@17 + double v28; // st7@20 + char *v29; // ebx@20 + char *v30; // edx@20 + unsigned __int8 v31; // c0@21 + unsigned __int8 v32; // c3@21 + double v33; // st6@23 + char *v34; // esi@30 + const void *v35; // ecx@31 + int v36; // eax@31 + const void *v37; // edi@31 + signed __int64 v38; // qax@31 + int v39; // ecx@31 + int v40; // ebx@33 + int v41; // eax@36 + signed __int64 v42; // qtt@39 + int v43; // eax@39 + char v44; // zf@39 + double v45; // st7@39 + double v46; // st7@39 + unsigned int v47; // edx@40 + double v48; // st7@41 + RenderVertexSoft *v49; // ebx@41 + void *v50; // edi@43 + double v51; // st7@46 + RenderVertexSoft *v52; // edx@46 + void *v53; // edi@48 + char *v54; // ebx@52 + unsigned int v55; // eax@53 + unsigned int v56; // eax@55 + int v57; // ST10_4@55 + Texture *v58; // eax@55 + signed int v59; // [sp-4h] [bp-178h]@17 + struct Polygon *v60; // [sp+0h] [bp-174h]@17 + IDirect3DTexture2 *v61; // [sp+4h] [bp-170h]@17 + struct Polygon v62; // [sp+14h] [bp-160h]@6 + unsigned int v63; // [sp+120h] [bp-54h]@7 + double v64; // [sp+124h] [bp-50h]@7 + unsigned int v65; // [sp+128h] [bp-4Ch]@1 + unsigned int v66; // [sp+12Ch] [bp-48h]@7 + float v67; // [sp+130h] [bp-44h]@7 + __int64 v68; // [sp+134h] [bp-40h]@3 + __int64 v69; // [sp+13Ch] [bp-38h]@3 + int v70; // [sp+144h] [bp-30h]@3 + int X; // [sp+148h] [bp-2Ch]@9 + int v72; // [sp+14Ch] [bp-28h]@7 + float v73; // [sp+150h] [bp-24h]@16 + unsigned int v74; // [sp+154h] [bp-20h]@3 + RenderVertexSoft *v75; // [sp+158h] [bp-1Ch]@3 + float v76; // [sp+15Ch] [bp-18h]@9 + int v77; // [sp+160h] [bp-14h]@9 + int v78; // [sp+164h] [bp-10h]@7 + void *v79; // [sp+168h] [bp-Ch]@9 + float v80; // [sp+16Ch] [bp-8h]@3 + const void *v81; // [sp+170h] [bp-4h]@7 + + __debugbreak(); + + pFace = &pIndoor->pFaces[uFaceID]; + v65 = uFaceID; + v3 = uNumVertices; + v4 = pFace->uPolygonType; + if ( v4 == POLYGON_InBetweenFloorAndWall || v4 == POLYGON_Floor ) + { + if ( (signed int)uNumVertices > 0 ) + { + v54 = (char *)&array_507D30[0].u; + LODWORD(v80) = uNumVertices; + do + { + v69 = (GetTickCount() >> 5) - pBLVRenderParams->vPartyPos.x; + *(float *)v54 = (double)v69 + *(float *)v54; + *(float *)v54 = *(float *)v54 * 0.25; + v55 = GetTickCount(); + v54 += 48; + v44 = LODWORD(v80)-- == 1; + v68 = pBLVRenderParams->vPartyPos.y + (v55 >> 5); + *((float *)v54 - 11) = ((double)v68 + *((float *)v54 - 11)) * 0.25; + } + while ( !v44 ); + uFaceID = v65; + } + v56 = 8 * uFaceID; + LOBYTE(v56) = PID(OBJECT_BModel,uFaceID); + v57 = v56; + v58 = pFace->GetTexture(); + pRenderer->DrawIndoorPolygon(v3, pFace, pBitmaps_LOD->pHardwareTextures[pFace->uBitmapID], v58, v57, -1, 0); + return; + } + HIDWORD(v69) = pIndoorCamera->sRotationX; + HIDWORD(v68) = pIndoorCamera->pos.z; + *(float *)&v74 = (double)pBLVRenderParams->uViewportCenterY; + v70 = (signed __int64)((double)(pBLVRenderParams->field_40 * pBLVRenderParams->vPartyPos.z) + / (((double)pBLVRenderParams->field_40 + 16192.0) + * 65536.0) + + *(float *)&v74); + v5 = (double)pIndoorCamera->sRotationX * 0.0030664064; + *(float *)&v75 = v5; + v80 = cos(v5) * 16192.0; + v6 = (signed __int64)(*(float *)&v74 + - (double)pBLVRenderParams->field_40 + / ((v80 + 0.0000001) + * 65535.0) + * (sin(*(float *)&v75) * -16192.0 - (double)SHIDWORD(v68))); + v7 = pFace->uPolygonType; + if ( v7 == 4 || v7 == 3 ) + v70 = v6; + stru_8019C8._48653D(65536, 0, 0, 0, 65536, 0); + v62._48607B(&stru_8019C8); + v62.uTileBitmapID = pFace->uBitmapID; + v62.pTexture = (Texture *)((signed __int16)v62.uTileBitmapID != -1 ? &pBitmaps_LOD->pTextures[(signed __int16)v62.uTileBitmapID] : 0); + if ( !v62.pTexture ) + return; + v8 = pBLVRenderParams->sPartyRotX; + v62.dimming_level = 0; + v62.uNumVertices = v3; + v9 = stru_5C6E00->Sin(pBLVRenderParams->sPartyRotX + 16); + v62.v_18.y = 0; + v62.v_18.x = -v9; + v62.v_18.z = -stru_5C6E00->Cos(v8 + 16); + v10 = pBLVRenderParams->uViewportZ - pBLVRenderParams->uViewportX; + memcpy(&array_507D30[v3], array_507D30, sizeof(array_507D30[v3])); + LODWORD(v80) = v10; + v62.field_24 = 33554432; + v64 = (double)(signed int)v10 * 0.5; + v72 = 65536 / (signed int)(signed __int64)(v64 / tan(0.6457717418670654) + 0.5); + LODWORD(v80) = v62.pTexture->uTextureWidth; + v11 = 1.0 / (double)SLODWORD(v80); + LODWORD(v80) = v62.pTexture->uTextureHeight; + v12 = v62.pTexture->uWidthMinus1; + v13 = v62.pTexture->uHeightMinus1; + v67 = v11; + v63 = 224 * pMiscTimer->uTotalGameTimeElapsed & v13; + v66 = 224 * pMiscTimer->uTotalGameTimeElapsed & v12; + v78 = 0; + v81 = 0; + *((float *)&v68 + 1) = 1.0 / (double)SLODWORD(v80); + if ( (signed int)v62.uNumVertices <= 0 ) + { +LABEL_17: + v61 = pBitmaps_LOD->pHardwareTextures[(signed __int16)v62.uTileBitmapID]; + v27 = pRenderer; + v60 = &v62; + v59 = v62.uNumVertices; + goto LABEL_18; + } + v14 = (char *)&array_507D30[0].vWorldViewProjY; + while ( 2 ) + { + v15 = (void *)(v72 * (v70 - (unsigned __int64)(signed __int64)*(float *)v14)); + LODWORD(v80) = v62.ptr_38->field_14; + v77 = (unsigned __int64)(SLODWORD(v80) * (signed __int64)(signed int)v15) >> 16; + v16 = v77 + v62.ptr_38->field_C; + v77 = (int)v15; + v74 = v16; + LODWORD(v80) = v62.ptr_38->field_20; + v77 = (unsigned __int64)(SLODWORD(v80) * (signed __int64)(signed int)v15) >> 16; + v79 = v15; + v75 = (RenderVertexSoft *)(v77 + v62.ptr_38->field_18); + LODWORD(v80) = v62.v_18.z; + v79 = (void *)((unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v15) >> 16); + v17 = v72 * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)*((float *)v14 - 1)); + v18 = *(float *)v14 - 1.0; + v19 = -v62.field_24; + v77 = -v62.field_24; + X = (int)((char *)v79 + v62.v_18.x); + LODWORD(v76) = (signed __int64)v18; + v20 = (void *)(v72 * (v70 - LODWORD(v76))); + while ( 1 ) + { + v79 = v20; + if ( !X ) + goto LABEL_14; + v21 = abs(v19 >> 14); + if ( v21 <= abs(X) ) + break; + if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y ) + break; + v19 = v77; + v20 = v79; +LABEL_14: + LODWORD(v80) = v62.v_18.z; + v79 = (void *)((unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v20) >> 16); + v22 = (unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v20) >> 16; + --LODWORD(v76); + v20 = (char *)v20 + v72; + X = v22 + v62.v_18.x; + v78 = 1; + } + if ( !v78 ) + { + LODWORD(v23) = v77 << 16; + HIDWORD(v23) = v77 >> 16; + v79 = (void *)(v23 / X); + v77 = v17; + LODWORD(v80) = v62.ptr_38->field_10; + v77 = v17; + LODWORD(v76) = v74 + ((unsigned __int64)(SLODWORD(v80) * (signed __int64)v17) >> 16); + LODWORD(v80) = v62.ptr_38->field_1C; + v75 = (RenderVertexSoft *)((char *)v75 + ((unsigned __int64)(SLODWORD(v80) * (signed __int64)v17) >> 16)); + v77 = (unsigned __int64)(SLODWORD(v76) * v23 / X) >> 16; + LODWORD(v73) = (unsigned __int64)((signed int)v75 * v23 / X) >> 16; + v14 += 48; + LODWORD(v80) = v66 + ((signed int)((unsigned __int64)(SLODWORD(v76) * v23 / X) >> 16) >> 4); + v81 = (char *)v81 + 1; + v24 = (double)SLODWORD(v80) * 0.000015259022; + LODWORD(v80) = v63 + ((signed int)((unsigned __int64)((signed int)v75 * v23 / X) >> 16) >> 4); + v26 = __OFSUB__((int)v81, v62.uNumVertices); + v25 = (signed int)((char *)v81 - v62.uNumVertices) < 0; + *((float *)v14 - 10) = v24 * v67; + *((float *)v14 - 9) = (double)SLODWORD(v80) * 0.000015259022 * *((float *)&v68 + 1); + *((float *)v14 - 11) = 65536.0 / (double)(signed int)v79; + if ( !(v25 ^ v26) ) + goto LABEL_17; + continue; + } + break; + } + LODWORD(v73) = 0; + v80 = v76; + if ( (signed int)v62.uNumVertices > 0 ) + { + v28 = (double)SLODWORD(v76); + LODWORD(v76) = (int)(char *)array_50AC10 + 28; + v29 = (char *)&array_50AC10[0].vWorldViewProjX; + v30 = (char *)&array_507D30[1].vWorldViewProjY; + v79 = array_50AC10; + v81 = array_507D30; + v78 = v62.uNumVertices; + do + { + v31 = v28 < *((float *)v30 - 12); + v32 = v28 == *((float *)v30 - 12); + ++LODWORD(v73); + memcpy(v79, v81, 0x30u); + v79 = (char *)v79 + 48; + LODWORD(v76) += 48; + v29 += 48; + if ( v31 | v32 || v28 >= *(float *)v30 ) + { + if ( v28 >= *((float *)v30 - 12) || v28 <= *(float *)v30 ) + goto LABEL_28; + v33 = (*((float *)v30 - 1) - *((float *)v30 - 13)) * v28 / (*(float *)v30 - *((float *)v30 - 12)) + + *((float *)v30 - 1); + } + else + { + v33 = (*((float *)v30 - 13) - *((float *)v30 - 1)) * v28 / (*((float *)v30 - 12) - *(float *)v30) + + *((float *)v30 - 13); + } + *(float *)v29 = v33; + v79 = (char *)v79 + 48; + v29 += 48; + ++LODWORD(v73); + *(unsigned int *)LODWORD(v76) = v28; + LODWORD(v76) += 48; +LABEL_28: + v81 = (char *)v81 + 48; + v30 += 48; + --v78; + } + while ( v78 ); + } + if ( SLODWORD(v73) <= 0 ) + goto LABEL_40; + v34 = (char *)&array_50AC10[0].vWorldViewProjY; + v65 = v77 >> 14; + HIDWORD(v69) = LODWORD(v73); + do + { + v35 = (const void *)(v72 * (v70 - (unsigned __int64)(signed __int64)*(float *)v34)); + v78 = v62.ptr_38->field_14; + v81 = (const void *)((unsigned __int64)(v78 * (signed __int64)(signed int)v35) >> 16); + v36 = (int)((char *)v81 + v62.ptr_38->field_C); + v81 = v35; + v74 = v36; + v78 = v62.ptr_38->field_20; + v81 = (const void *)((unsigned __int64)(v78 * (signed __int64)(signed int)v35) >> 16); + v78 = (int)v35; + v75 = (RenderVertexSoft *)((char *)v81 + v62.ptr_38->field_18); + v81 = (const void *)v62.v_18.z; + v78 = (unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v35) >> 16; + v37 = (const void *)(v72 + * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)*((float *)v34 - 1))); + v38 = (signed __int64)(*(float *)v34 - 1.0); + v81 = 0; + LODWORD(v76) = v38; + v39 = v72 * (v70 - v38); + while ( 1 ) + { + v78 = v39; + if ( !X ) + goto LABEL_36; + v40 = abs(X); + if ( abs((signed __int64)v65) <= v40 ) + break; + if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y ) + break; + v39 = v78; +LABEL_36: + v78 = v62.v_18.z; + v41 = (unsigned __int64)(v62.v_18.z * (signed __int64)v39) >> 16; + --LODWORD(v76); + v39 += v72; + X = v41 + v62.v_18.x; + v81 = (const void *)1; + } + if ( v81 ) + { + v79 = (void *)v62.v_18.z; + v78 = 2 * LODWORD(v76); + v81 = (const void *)((unsigned __int64)(v62.v_18.z + * (signed __int64)(signed int)(signed __int64)(((double)v70 + - ((double)(2 * LODWORD(v76)) + - *(float *)v34)) + * (double)v72)) >> 16); + X = (int)((char *)v81 + v62.v_18.x); + } + LODWORD(v42) = v77 << 16; + HIDWORD(v42) = v77 >> 16; + v79 = (void *)(v42 / X); + v81 = v37; + v78 = v62.ptr_38->field_10; + v81 = (const void *)((unsigned __int64)(v78 * (signed __int64)(signed int)v37) >> 16); + v43 = v74 + ((unsigned __int64)(v78 * (signed __int64)(signed int)v37) >> 16); + v74 = (unsigned int)v37; + LODWORD(v76) = v43; + v78 = v62.ptr_38->field_1C; + v75 = (RenderVertexSoft *)((char *)v75 + ((unsigned __int64)(v78 * (signed __int64)(signed int)v37) >> 16)); + v74 = (unsigned __int64)(v43 * v42 / X) >> 16; + v81 = (const void *)((unsigned __int64)((signed int)v75 * v42 / X) >> 16); + v34 += 48; + v78 = v66 + ((signed int)v74 >> 4); + v44 = HIDWORD(v69)-- == 1; + v45 = (double)v78 * 0.000015259022; + v78 = v63 + ((signed int)((unsigned __int64)((signed int)v75 * v42 / X) >> 16) >> 4); + *((float *)v34 - 10) = v45 * v67; + *((float *)v34 - 9) = (double)v78 * 0.000015259022 * *((float *)&v68 + 1); + v46 = (double)(signed int)v79; + *((float *)v34 - 16) = 0.000015258789 * v46; + *((float *)v34 - 11) = 65536.0 / v46; + } + while ( !v44 ); +LABEL_40: + v47 = 0; + if ( SLODWORD(v73) > 0 ) + { + v48 = (double)SLODWORD(v80); + v75 = array_507D30; + v49 = array_50AC10; + HIDWORD(v69) = LODWORD(v73); + do + { + if ( v48 >= v49->vWorldViewProjY ) + { + v50 = v75; + ++v47; + ++v75; + memcpy(v50, v49, 0x30u); + } + ++v49; + --HIDWORD(v69); + } + while ( HIDWORD(v69) ); + } + v62.uNumVertices = v47; + pRenderer->_4A2ED5(v47, &v62, pBitmaps_LOD->pHardwareTextures[(signed __int16)v62.uTileBitmapID]); + *(float *)&v74 = 0.0; + if ( SLODWORD(v73) > 0 ) + { + v51 = (double)SLODWORD(v80); + v75 = array_507D30; + v52 = array_50AC10; + v80 = v73; + do + { + if ( v51 <= v52->vWorldViewProjY ) + { + v53 = v75; + ++v74; + ++v75; + memcpy(v53, v52, 0x30u); + } + ++v52; + --LODWORD(v80); + } + while ( v80 != 0.0 ); + } + v62.uNumVertices = v74; + v61 = pBitmaps_LOD->pHardwareTextures[(signed __int16)v62.uTileBitmapID]; + v60 = &v62; + v59 = v74; + v27 = pRenderer; +LABEL_18: + v27->_4A2ED5(v59, v60, v61); +} + + //----- (004A2FC0) -------------------------------------------------------- void Render::DrawIndoorPolygon(unsigned int uNumVertices, BLVFace *pFace, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8) { @@ -7612,7 +6103,7 @@ else uColor = uCorrectedColor = 0xFF109010; } - if (byte_4D864C && pGame->uFlags & 1) + if (byte_4D864C && pGame->uFlags & GAME_FLAGS_1_01) { __debugbreak(); ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, false)); @@ -7637,7 +6128,7 @@ d3d_vertex_buffer, uNumVertices, 28)); - pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0); + pGame->pLightmapBuilder->DrawLightmaps(/*-1, 0*/); } else { @@ -7717,7 +6208,7 @@ 28)); ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE)); - pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0); + pGame->pLightmapBuilder->DrawLightmaps(/*-1, 0*/); for (uint i = 0; i < uNumVertices; ++i) d3d_vertex_buffer[i].diffuse = uCorrectedColor; @@ -7825,54 +6316,54 @@ v12 = ::GetActorTintColor(dimming_level, 0, pSoftBillboard->zbuffer_depth, 0, 0); } //v13 = (double)v25; - pBillboardRenderListD3D[v7].pQuards[0].specular = 0; - pBillboardRenderListD3D[v7].pQuards[0].diffuse = v12; - pBillboardRenderListD3D[v7].pQuards[0].pos.x = pSoftBillboard->uScreenSpaceX - v31 * a1; + pBillboardRenderListD3D[v7].pQuads[0].specular = 0; + pBillboardRenderListD3D[v7].pQuads[0].diffuse = v12; + pBillboardRenderListD3D[v7].pQuads[0].pos.x = pSoftBillboard->uScreenSpaceX - v31 * a1; //v14 = (double)v24; //v32 = v14; - pBillboardRenderListD3D[v7].pQuards[0].pos.y = pSoftBillboard->uScreenSpaceY - v27 * v29; + pBillboardRenderListD3D[v7].pQuads[0].pos.y = pSoftBillboard->uScreenSpaceY - v27 * v29; v15 = 1.0 - 1.0 / (pSoftBillboard->zbuffer_depth * 0.061758894); - pBillboardRenderListD3D[v7].pQuards[0].pos.z = v15; + pBillboardRenderListD3D[v7].pQuads[0].pos.z = v15; v16 = 1.0 / pSoftBillboard->zbuffer_depth; - pBillboardRenderListD3D[v7].pQuards[0].rhw = 1.0 / pSoftBillboard->zbuffer_depth; - pBillboardRenderListD3D[v7].pQuards[0].texcoord.x = 0.0; - pBillboardRenderListD3D[v7].pQuards[0].texcoord.y = 0.0; + pBillboardRenderListD3D[v7].pQuads[0].rhw = 1.0 / pSoftBillboard->zbuffer_depth; + pBillboardRenderListD3D[v7].pQuads[0].texcoord.x = 0.0; + pBillboardRenderListD3D[v7].pQuads[0].texcoord.y = 0.0; v17 = (double)((pSprite->uBufferWidth >> 1) - pSprite->uAreaX); v18 = (double)(pSprite->uBufferHeight - pSprite->uAreaY - pSprite->uAreaHeight); if ( pSoftBillboard->uFlags & 4 ) v17 = v17 * -1.0; - pBillboardRenderListD3D[v7].pQuards[1].specular = 0; - pBillboardRenderListD3D[v7].pQuards[1].diffuse = v12; - pBillboardRenderListD3D[v7].pQuards[1].pos.x = pSoftBillboard->uScreenSpaceX - v17 * a1; - pBillboardRenderListD3D[v7].pQuards[1].pos.y = pSoftBillboard->uScreenSpaceY - v18 * v29; - pBillboardRenderListD3D[v7].pQuards[1].pos.z = v15; - pBillboardRenderListD3D[v7].pQuards[1].rhw = v16; - pBillboardRenderListD3D[v7].pQuards[1].texcoord.x = 0.0; - pBillboardRenderListD3D[v7].pQuards[1].texcoord.y = 1.0; + pBillboardRenderListD3D[v7].pQuads[1].specular = 0; + pBillboardRenderListD3D[v7].pQuads[1].diffuse = v12; + pBillboardRenderListD3D[v7].pQuads[1].pos.x = pSoftBillboard->uScreenSpaceX - v17 * a1; + pBillboardRenderListD3D[v7].pQuads[1].pos.y = pSoftBillboard->uScreenSpaceY - v18 * v29; + pBillboardRenderListD3D[v7].pQuads[1].pos.z = v15; + pBillboardRenderListD3D[v7].pQuads[1].rhw = v16; + pBillboardRenderListD3D[v7].pQuads[1].texcoord.x = 0.0; + pBillboardRenderListD3D[v7].pQuads[1].texcoord.y = 1.0; v19 = pSprite->uBufferHeight - pSprite->uAreaY - pSprite->uAreaHeight; v20 = (double)(pSprite->uAreaX + pSprite->uAreaWidth + (pSprite->uBufferWidth >> 1) - pSprite->uBufferWidth); if ( pSoftBillboard->uFlags & 4 ) v20 = v20 * -1.0; - pBillboardRenderListD3D[v7].pQuards[2].specular = 0; - pBillboardRenderListD3D[v7].pQuards[2].diffuse = v12; - pBillboardRenderListD3D[v7].pQuards[2].pos.x = v20 * a1 + pSoftBillboard->uScreenSpaceX; - pBillboardRenderListD3D[v7].pQuards[2].pos.y = pSoftBillboard->uScreenSpaceY - (double)v19 * v29; - pBillboardRenderListD3D[v7].pQuards[2].pos.z = v15; - pBillboardRenderListD3D[v7].pQuards[2].rhw = v16; - pBillboardRenderListD3D[v7].pQuards[2].texcoord.x = 1.0; - pBillboardRenderListD3D[v7].pQuards[2].texcoord.y = 1.0; + pBillboardRenderListD3D[v7].pQuads[2].specular = 0; + pBillboardRenderListD3D[v7].pQuads[2].diffuse = v12; + pBillboardRenderListD3D[v7].pQuads[2].pos.x = v20 * a1 + pSoftBillboard->uScreenSpaceX; + pBillboardRenderListD3D[v7].pQuads[2].pos.y = pSoftBillboard->uScreenSpaceY - (double)v19 * v29; + pBillboardRenderListD3D[v7].pQuads[2].pos.z = v15; + pBillboardRenderListD3D[v7].pQuads[2].rhw = v16; + pBillboardRenderListD3D[v7].pQuads[2].texcoord.x = 1.0; + pBillboardRenderListD3D[v7].pQuads[2].texcoord.y = 1.0; v21 = pSprite->uBufferHeight - pSprite->uAreaY; v22 = (double)(pSprite->uAreaX + pSprite->uAreaWidth + (pSprite->uBufferWidth >> 1) - pSprite->uBufferWidth); if ( pSoftBillboard->uFlags & 4 ) v22 = v22 * -1.0; - pBillboardRenderListD3D[v7].pQuards[3].specular = 0; - pBillboardRenderListD3D[v7].pQuards[3].diffuse = v12; - pBillboardRenderListD3D[v7].pQuards[3].pos.x = v22 * a1 + pSoftBillboard->uScreenSpaceX; - pBillboardRenderListD3D[v7].pQuards[3].pos.y = pSoftBillboard->uScreenSpaceY - (double)v21 * v29; - pBillboardRenderListD3D[v7].pQuards[3].pos.z = v15; - pBillboardRenderListD3D[v7].pQuards[3].rhw = v16; - pBillboardRenderListD3D[v7].pQuards[3].texcoord.x = 1.0; - pBillboardRenderListD3D[v7].pQuards[3].texcoord.y = 0.0; + pBillboardRenderListD3D[v7].pQuads[3].specular = 0; + pBillboardRenderListD3D[v7].pQuads[3].diffuse = v12; + pBillboardRenderListD3D[v7].pQuads[3].pos.x = v22 * a1 + pSoftBillboard->uScreenSpaceX; + pBillboardRenderListD3D[v7].pQuads[3].pos.y = pSoftBillboard->uScreenSpaceY - (double)v21 * v29; + pBillboardRenderListD3D[v7].pQuads[3].pos.z = v15; + pBillboardRenderListD3D[v7].pQuads[3].rhw = v16; + pBillboardRenderListD3D[v7].pQuads[3].texcoord.x = 1.0; + pBillboardRenderListD3D[v7].pQuads[3].texcoord.y = 0.0; //v23 = pSprite->pTexture; pBillboardRenderListD3D[v7].uNumVertices = 4; pBillboardRenderListD3D[v7].z_order = pSoftBillboard->zbuffer_depth; @@ -7951,7 +6442,7 @@ v19 = stru_5C6E00->Sin(angle); v20 = stru_5C6E00->Sin(angle); v21 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022 + (double)(v18 >> 16)) * v16 - ((double)(unsigned __int16)v19 * 0.000015259022 @@ -7963,20 +6454,20 @@ - 12.0) * v11 + (double)a2->uScreenSpaceY; - pBillboardRenderListD3D[v8].pQuards[0].specular = 0; - pBillboardRenderListD3D[v8].pQuards[0].diffuse = uDiffuse; - pBillboardRenderListD3D[v8].pQuards[0].pos.y = v22; - pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 0.061758894); - pBillboardRenderListD3D[v8].pQuards[0].rhw = 1.0 / a2->zbuffer_depth; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0; + pBillboardRenderListD3D[v8].pQuads[0].specular = 0; + pBillboardRenderListD3D[v8].pQuads[0].diffuse = uDiffuse; + pBillboardRenderListD3D[v8].pQuads[0].pos.y = v22; + pBillboardRenderListD3D[v8].pQuads[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 0.061758894); + pBillboardRenderListD3D[v8].pQuads[0].rhw = 1.0 / a2->zbuffer_depth; + pBillboardRenderListD3D[v8].pQuads[0].texcoord.x = 0.0; + pBillboardRenderListD3D[v8].pQuads[0].texcoord.y = 0.0; v31 = (double)(a2->uScreenSpaceX + 12) - (double) a2->uScreenSpaceX; v32 = (double)a2->uScreenSpaceY - (double)(a2->uScreenSpaceY - 12); v25 = stru_5C6E00->Cos(angle); v26 = stru_5C6E00->Sin(angle); v27 = stru_5C6E00->Sin(angle); v28 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[1].pos.x = (((double)(unsigned __int16)v25 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[1].pos.x = (((double)(unsigned __int16)v25 * 0.000015259022 + (double)(v25 >> 16)) * v31 - ((double)(unsigned __int16)v26 * 0.000015259022 @@ -7988,47 +6479,47 @@ - 12.0) * v11 + (double)a2->uScreenSpaceY; - pBillboardRenderListD3D[v8].pQuards[1].pos.z = pRenderer->pBillboardRenderListD3D[v8].pQuards[0].pos.z; - v30 = pBillboardRenderListD3D[v8].pQuards[0].rhw; - pBillboardRenderListD3D[v8].pQuards[1].pos.y = v29; - pBillboardRenderListD3D[v8].pQuards[1].specular = 0; - pBillboardRenderListD3D[v8].pQuards[1].rhw = v30; - pBillboardRenderListD3D[v8].pQuards[1].diffuse = uDiffuse; - pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0; - pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0; + pBillboardRenderListD3D[v8].pQuads[1].pos.z = pRenderer->pBillboardRenderListD3D[v8].pQuads[0].pos.z; + v30 = pBillboardRenderListD3D[v8].pQuads[0].rhw; + pBillboardRenderListD3D[v8].pQuads[1].pos.y = v29; + pBillboardRenderListD3D[v8].pQuads[1].specular = 0; + pBillboardRenderListD3D[v8].pQuads[1].rhw = v30; + pBillboardRenderListD3D[v8].pQuads[1].diffuse = uDiffuse; + pBillboardRenderListD3D[v8].pQuads[1].texcoord.x = 0.0; + pBillboardRenderListD3D[v8].pQuads[1].texcoord.y = 1.0; v23 = (double)(a2->uScreenSpaceX - 12) - (double) a2->uScreenSpaceX; v24 = (double)a2->uScreenSpaceY - (double)(a2->uScreenSpaceY - 12); v33 = stru_5C6E00->Cos(angle); v34 = stru_5C6E00->Sin(angle); v35 = stru_5C6E00->Sin(angle); v36 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[2].pos.x = (((double)(unsigned __int16)v33 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[2].pos.x = (((double)(unsigned __int16)v33 * 0.000015259022 + (double)(v33 >> 16)) * v23 - ((double)(unsigned __int16)v34 * 0.000015259022 + (double)(v34 >> 16)) * v24) * v11 + (double) a2->uScreenSpaceX; - v37 = pBillboardRenderListD3D[v8].pQuards[0].pos.z; + v37 = pBillboardRenderListD3D[v8].pQuads[0].pos.z; v38 = (((double)(unsigned __int16)v36 * 0.000015259022 + (double)(v36 >> 16)) * v24 + ((double)(unsigned __int16)v35 * 0.000015259022 + (double)(v35 >> 16)) * v23 - 12.0) * v11 + (double)a2->uScreenSpaceY; - pBillboardRenderListD3D[v8].pQuards[2].specular = 0; - pBillboardRenderListD3D[v8].pQuards[2].pos.z = v37; - pBillboardRenderListD3D[v8].pQuards[2].rhw = pBillboardRenderListD3D[v8].pQuards[0].rhw; - pBillboardRenderListD3D[v8].pQuards[2].diffuse = uDiffuse; - pBillboardRenderListD3D[v8].pQuards[2].pos.y = v38; - pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0; - pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0; + pBillboardRenderListD3D[v8].pQuads[2].specular = 0; + pBillboardRenderListD3D[v8].pQuads[2].pos.z = v37; + pBillboardRenderListD3D[v8].pQuads[2].rhw = pBillboardRenderListD3D[v8].pQuads[0].rhw; + pBillboardRenderListD3D[v8].pQuads[2].diffuse = uDiffuse; + pBillboardRenderListD3D[v8].pQuads[2].pos.y = v38; + pBillboardRenderListD3D[v8].pQuads[2].texcoord.x = 1.0; + pBillboardRenderListD3D[v8].pQuads[2].texcoord.y = 1.0; v39 = (double)(a2->uScreenSpaceX + 12) - (double) a2->uScreenSpaceX; v40 = (double)(a2->uScreenSpaceY - 25) - (double)(a2->uScreenSpaceY - 12); v41 = stru_5C6E00->Cos(angle); v42 = stru_5C6E00->Sin(angle); v43 = stru_5C6E00->Sin(angle); v44 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[3].pos.x = (((double)(unsigned __int16)v41 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[3].pos.x = (((double)(unsigned __int16)v41 * 0.000015259022 + (double)(v41 >> 16)) * v39 - ((double)(unsigned __int16)v42 * 0.000015259022 @@ -8040,17 +6531,17 @@ - 12.0) * v11 + (double)a2->uScreenSpaceY; - v46 = pBillboardRenderListD3D[v8].pQuards[0].pos.z; - pBillboardRenderListD3D[v8].pQuards[3].specular = 0; - pBillboardRenderListD3D[v8].pQuards[3].pos.z = v46; - pBillboardRenderListD3D[v8].pQuards[3].rhw = pBillboardRenderListD3D[v8].pQuards[0].rhw; - pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse; + v46 = pBillboardRenderListD3D[v8].pQuads[0].pos.z; + pBillboardRenderListD3D[v8].pQuads[3].specular = 0; + pBillboardRenderListD3D[v8].pQuads[3].pos.z = v46; + pBillboardRenderListD3D[v8].pQuads[3].rhw = pBillboardRenderListD3D[v8].pQuads[0].rhw; + pBillboardRenderListD3D[v8].pQuads[3].diffuse = uDiffuse; pBillboardRenderListD3D[v8].pTexture = a3; pBillboardRenderListD3D[v8].z_order = a2->zbuffer_depth; pBillboardRenderListD3D[v8].uNumVertices = 4; - pBillboardRenderListD3D[v8].pQuards[3].pos.y = v45; - pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; - pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0; + pBillboardRenderListD3D[v8].pQuads[3].pos.y = v45; + pBillboardRenderListD3D[v8].pQuads[3].texcoord.x = 1.0; + pBillboardRenderListD3D[v8].pQuads[3].texcoord.y = 0.0; } } } @@ -8125,7 +6616,7 @@ v20 = stru_5C6E00->Sin(angle); v21 = stru_5C6E00->Sin(angle); v22 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022 + (double)(v18 >> 16)) * v16 - ((double)(unsigned __int16)v20 * 0.000015259022 @@ -8137,22 +6628,22 @@ - 12.0) * v11 + (double)a2->uScreenSpaceY; - pBillboardRenderListD3D[v8].pQuards[0].specular = 0; - pBillboardRenderListD3D[v8].pQuards[0].diffuse = uDiffuse; - pBillboardRenderListD3D[v8].pQuards[0].pos.y = v23; + pBillboardRenderListD3D[v8].pQuads[0].specular = 0; + pBillboardRenderListD3D[v8].pQuads[0].diffuse = uDiffuse; + pBillboardRenderListD3D[v8].pQuads[0].pos.y = v23; v24 = 1.0 - 1.0 / (v6 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); - pBillboardRenderListD3D[v8].pQuards[0].pos.z = v24; + pBillboardRenderListD3D[v8].pQuads[0].pos.z = v24; v25 = 1.0 / v6; - pBillboardRenderListD3D[v8].pQuards[0].rhw = v25; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0; + pBillboardRenderListD3D[v8].pQuads[0].rhw = v25; + pBillboardRenderListD3D[v8].pQuads[0].texcoord.x = 0.0; + pBillboardRenderListD3D[v8].pQuads[0].texcoord.y = 0.0; v26 = (double)(a2->uScreenSpaceX - 12) - v13; v27 = (double)a2->uScreenSpaceY - v15; v28 = stru_5C6E00->Cos(angle); v29 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi); v30 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi); v31 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[1].pos.x = (((double)(unsigned __int16)v28 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[1].pos.x = (((double)(unsigned __int16)v28 * 0.000015259022 + (double)(v28 >> 16)) * v26 - ((double)(unsigned __int16)v29 * 0.000015259022 @@ -8164,20 +6655,20 @@ - 12.0) * v11 + (double)a2->uScreenSpaceY; - pBillboardRenderListD3D[v8].pQuards[1].pos.z = v24; - pBillboardRenderListD3D[v8].pQuards[1].pos.y = v32; - pBillboardRenderListD3D[v8].pQuards[1].specular = 0; - pBillboardRenderListD3D[v8].pQuards[1].rhw = v25; - pBillboardRenderListD3D[v8].pQuards[1].diffuse = uDiffuse; - pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0; - pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0; + pBillboardRenderListD3D[v8].pQuads[1].pos.z = v24; + pBillboardRenderListD3D[v8].pQuads[1].pos.y = v32; + pBillboardRenderListD3D[v8].pQuads[1].specular = 0; + pBillboardRenderListD3D[v8].pQuads[1].rhw = v25; + pBillboardRenderListD3D[v8].pQuads[1].diffuse = uDiffuse; + pBillboardRenderListD3D[v8].pQuads[1].texcoord.x = 0.0; + pBillboardRenderListD3D[v8].pQuads[1].texcoord.y = 1.0; v33 = (double)(a2->uScreenSpaceX + 12) - v13; v34 = (double)a2->uScreenSpaceY - v15; v35 = stru_5C6E00->Cos(angle); v36 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi); v37 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi); v38 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[2].pos.x = (((double)(unsigned __int16)v35 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[2].pos.x = (((double)(unsigned __int16)v35 * 0.000015259022 + (double)(v35 >> 16)) * v33 - ((double)(unsigned __int16)v36 * 0.000015259022 @@ -8189,20 +6680,20 @@ - 12.0) * v11 + (double)a2->uScreenSpaceY; - pBillboardRenderListD3D[v8].pQuards[2].specular = 0; - pBillboardRenderListD3D[v8].pQuards[2].pos.z = v24; - pBillboardRenderListD3D[v8].pQuards[2].rhw = v25; - pBillboardRenderListD3D[v8].pQuards[2].diffuse = uDiffuse; - pBillboardRenderListD3D[v8].pQuards[2].pos.y = v39; - pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0; - pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0; + pBillboardRenderListD3D[v8].pQuads[2].specular = 0; + pBillboardRenderListD3D[v8].pQuads[2].pos.z = v24; + pBillboardRenderListD3D[v8].pQuads[2].rhw = v25; + pBillboardRenderListD3D[v8].pQuads[2].diffuse = uDiffuse; + pBillboardRenderListD3D[v8].pQuads[2].pos.y = v39; + pBillboardRenderListD3D[v8].pQuads[2].texcoord.x = 1.0; + pBillboardRenderListD3D[v8].pQuads[2].texcoord.y = 1.0; v40 = (double)(a2->uScreenSpaceX + 12) - v13; v41 = (double)(a2->uScreenSpaceY - 25) - v15; v42 = stru_5C6E00->Cos(angle); v43 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi); v44 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi); v45 = stru_5C6E00->Cos(angle); - pBillboardRenderListD3D[v8].pQuards[3].pos.x = (((double)(unsigned __int16)v42 * 0.000015259022 + pBillboardRenderListD3D[v8].pQuads[3].pos.x = (((double)(unsigned __int16)v42 * 0.000015259022 + (double)(v42 >> 16)) * v40 - ((double)(unsigned __int16)v43 * 0.000015259022 @@ -8214,16 +6705,16 @@ - 12.0) * v11 + (double)a2->uScreenSpaceY; - pBillboardRenderListD3D[v8].pQuards[3].specular = 0; - pBillboardRenderListD3D[v8].pQuards[3].pos.z = v24; - pBillboardRenderListD3D[v8].pQuards[3].rhw = v25; - pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse; + pBillboardRenderListD3D[v8].pQuads[3].specular = 0; + pBillboardRenderListD3D[v8].pQuads[3].pos.z = v24; + pBillboardRenderListD3D[v8].pQuads[3].rhw = v25; + pBillboardRenderListD3D[v8].pQuads[3].diffuse = uDiffuse; pBillboardRenderListD3D[v8].pTexture = a3; pBillboardRenderListD3D[v8].z_order = v6; pBillboardRenderListD3D[v8].uNumVertices = 4; - pBillboardRenderListD3D[v8].pQuards[3].pos.y = v46; - pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; - pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0; + pBillboardRenderListD3D[v8].pQuads[3].pos.y = v46; + pBillboardRenderListD3D[v8].pQuads[3].texcoord.x = 1.0; + pBillboardRenderListD3D[v8].pQuads[3].texcoord.y = 0.0; } } @@ -8271,53 +6762,53 @@ v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY); if (a2->uFlags & 4) v14 *= -1.0; - pBillboardRenderListD3D[v8].pQuards[0].diffuse = diffuse; - pBillboardRenderListD3D[v8].pQuards[0].pos.x = (double)a2->uScreenSpaceX - v14 * v30; - pBillboardRenderListD3D[v8].pQuards[0].pos.y = (double)a2->uScreenSpaceY - v15 * v29; - pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); - pBillboardRenderListD3D[v8].pQuards[0].rhw = 1.0 / a2->zbuffer_depth; - pBillboardRenderListD3D[v8].pQuards[0].specular = specular; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0; - pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0; + pBillboardRenderListD3D[v8].pQuads[0].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuads[0].pos.x = (double)a2->uScreenSpaceX - v14 * v30; + pBillboardRenderListD3D[v8].pQuads[0].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuads[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuads[0].rhw = 1.0 / a2->zbuffer_depth; + pBillboardRenderListD3D[v8].pQuads[0].specular = specular; + pBillboardRenderListD3D[v8].pQuads[0].texcoord.x = 0.0; + pBillboardRenderListD3D[v8].pQuads[0].texcoord.y = 0.0; v14 = (double)((int)pSprite->uBufferWidth / 2 - pSprite->uAreaX); v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY); if ( a2->uFlags & 4 ) v14 = v14 * -1.0; - pBillboardRenderListD3D[v8].pQuards[1].specular = specular; - pBillboardRenderListD3D[v8].pQuards[1].diffuse = diffuse; - pBillboardRenderListD3D[v8].pQuards[1].pos.x = (double)a2->uScreenSpaceX - v14 * v30; - pBillboardRenderListD3D[v8].pQuards[1].pos.y = (double)a2->uScreenSpaceY - v15 * v29; - pBillboardRenderListD3D[v8].pQuards[1].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); - pBillboardRenderListD3D[v8].pQuards[1].rhw = 1.0 / a2->zbuffer_depth; - pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0; - pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0; + pBillboardRenderListD3D[v8].pQuads[1].specular = specular; + pBillboardRenderListD3D[v8].pQuads[1].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuads[1].pos.x = (double)a2->uScreenSpaceX - v14 * v30; + pBillboardRenderListD3D[v8].pQuads[1].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuads[1].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuads[1].rhw = 1.0 / a2->zbuffer_depth; + pBillboardRenderListD3D[v8].pQuads[1].texcoord.x = 0.0; + pBillboardRenderListD3D[v8].pQuads[1].texcoord.y = 1.0; v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth); v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY); if ( a2->uFlags & 4 ) v14 *= -1.0; - pBillboardRenderListD3D[v8].pQuards[2].diffuse = diffuse; - pBillboardRenderListD3D[v8].pQuards[2].specular = specular; - pBillboardRenderListD3D[v8].pQuards[2].pos.x = (double)a2->uScreenSpaceX + v14 * v30; - pBillboardRenderListD3D[v8].pQuards[2].pos.y = (double)a2->uScreenSpaceY - v15 * v29; - pBillboardRenderListD3D[v8].pQuards[2].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); - pBillboardRenderListD3D[v8].pQuards[2].rhw = 1.0 / a2->zbuffer_depth; - pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0; - pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0; + pBillboardRenderListD3D[v8].pQuads[2].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuads[2].specular = specular; + pBillboardRenderListD3D[v8].pQuads[2].pos.x = (double)a2->uScreenSpaceX + v14 * v30; + pBillboardRenderListD3D[v8].pQuads[2].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuads[2].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuads[2].rhw = 1.0 / a2->zbuffer_depth; + pBillboardRenderListD3D[v8].pQuads[2].texcoord.x = 1.0; + pBillboardRenderListD3D[v8].pQuads[2].texcoord.y = 1.0; v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth); v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY); if ( a2->uFlags & 4 ) v14 *= -1.0; - pBillboardRenderListD3D[v8].pQuards[3].diffuse = diffuse; - pBillboardRenderListD3D[v8].pQuards[3].specular = specular; - pBillboardRenderListD3D[v8].pQuards[3].pos.x = (double)a2->uScreenSpaceX + v14 * v30; - pBillboardRenderListD3D[v8].pQuards[3].pos.y = (double)a2->uScreenSpaceY - v15 * v29; - pBillboardRenderListD3D[v8].pQuards[3].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); - pBillboardRenderListD3D[v8].pQuards[3].rhw = 1.0 / a2->zbuffer_depth; - pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; - pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0; + pBillboardRenderListD3D[v8].pQuads[3].diffuse = diffuse; + pBillboardRenderListD3D[v8].pQuads[3].specular = specular; + pBillboardRenderListD3D[v8].pQuads[3].pos.x = (double)a2->uScreenSpaceX + v14 * v30; + pBillboardRenderListD3D[v8].pQuads[3].pos.y = (double)a2->uScreenSpaceY - v15 * v29; + pBillboardRenderListD3D[v8].pQuads[3].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist); + pBillboardRenderListD3D[v8].pQuads[3].rhw = 1.0 / a2->zbuffer_depth; + pBillboardRenderListD3D[v8].pQuads[3].texcoord.x = 1.0; + pBillboardRenderListD3D[v8].pQuads[3].texcoord.y = 0.0; pBillboardRenderListD3D[v8].uNumVertices = 4; pBillboardRenderListD3D[v8].pTexture = pSprite->pTexture; @@ -8493,79 +6984,54 @@ } //----- (004A4CC9) -------------------------------------------------------- -void Render::_4A4CC9(stru6_stru1_indoor_sw_billboard *a1, int a2) -{ - int v3; // eax@1 - int v4; // edx@3 +void Render::_4A4CC9_AddSomeBillboard(stru6_stru1_indoor_sw_billboard *a1, int diffuse) +{ unsigned int v5; // eax@7 - int v6; // edi@7 char *v7; // edx@8 - char *v8; // ecx@8 - char v9; // zf@9 double v10; // st6@9 double v11; // st6@10 int v12; // ebx@13 - int v13; // ecx@16 - unsigned int v14; // [sp+Ch] [bp-4h]@1 - - auto _this = this; - - *(float *)&v14 = 1000000.0; - v3 = a1->field_10; - if ( v3 >= 3 ) - { - if ( v3 > 0 ) - { - _this = (Render *)&a1->field_14[62]; - v4 = a1->field_10; - do - { - if ( *(float *)&this->bUserDirect3D < (double)*(float *)&v14 ) - v14 = this->bUserDirect3D; - _this = (Render *)((char *)_this + 16); - --v4; - } - while ( v4 ); - } - v5 = Billboard_ProbablyAddToListAndSortByZOrder(v14); - v6 = 0; - pBillboardRenderListD3D[v5].field_90 = 0; - pBillboardRenderListD3D[v5].uParentBillboardID = -1; - pBillboardRenderListD3D[v5].uOpacity = RenderBillboardD3D::Opaque_2; - if ( a1->field_10 > 0 ) - { - v7 = (char *)&a1->field_14[62]; - v8 = (char *)&pBillboardRenderListD3D[v5].pQuards[0].pos.z; - do - { - v9 = uCurrentlyLoadedLevelType == LEVEL_Indoor; - *((int *)v8 - 2) = *((int *)v7 - 2); - *((int *)v8 - 1) = *((int *)v7 - 1); - v10 = *(float *)v7; - if ( v9 ) - v11 = v10 * 0.061758894; - else - v11 = v10 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist; - *(float *)v8 = 1.0 - 1.0 / v11; - *((float *)v8 + 1) = 1.0 / *(float *)v7; - if ( a2 & 0xFF000000 ) - v12 = *((int *)v7 + 1); - else - v12 = a2; - *((int *)v8 + 3) = 0; - *((int *)v8 + 2) = v12; - ++v6; - v7 += 16; - *((float *)v8 + 4) = 0.0; - *((float *)v8 + 5) = 0.0; - v8 += 32; - } - while ( v6 < a1->field_10 ); - } - v13 = a1->field_10; - pBillboardRenderListD3D[v5].pTexture = 0; - pBillboardRenderListD3D[v5].uNumVertices = v13; - LODWORD(pBillboardRenderListD3D[v5].z_order) = v14; + + if (a1->uNumVertices < 3) + return; + + float depth = 1000000.0; + for (uint i = 0; i < a1->uNumVertices; ++i) + { + if (a1->field_104[i].z < depth) + depth = a1->field_104[i * 4].z; + } + + v5 = Billboard_ProbablyAddToListAndSortByZOrder(depth); + pBillboardRenderListD3D[v5].field_90 = 0; + pBillboardRenderListD3D[v5].uParentBillboardID = -1; + pBillboardRenderListD3D[v5].uOpacity = RenderBillboardD3D::Opaque_2; + pBillboardRenderListD3D[v5].pTexture = 0; + pBillboardRenderListD3D[v5].uNumVertices = a1->uNumVertices; + pBillboardRenderListD3D[v5].z_order = depth; + + for (uint i = 0; i < a1->uNumVertices; ++i) + { + pBillboardRenderListD3D[v5].pQuads[i].pos.x = a1->field_104[i].x; + pBillboardRenderListD3D[v5].pQuads[i].pos.y = a1->field_104[i].y; + + v10 = a1->field_104[i].z; + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + v11 = v10 * 0.061758894; + else + v11 = v10 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist; + pBillboardRenderListD3D[v5].pQuads[i].pos.z = 1.0 - 1.0 / v11; + pBillboardRenderListD3D[v5].pQuads[i].rhw = 1.0 / a1->field_104[i].z; + + if (diffuse & 0xFF000000) + v12 = a1->field_104[i].diffuse; + else + v12 = diffuse; + pBillboardRenderListD3D[v5].pQuads[i].diffuse = v12; + pBillboardRenderListD3D[v5].pQuads[i].specular = 0; + + pBillboardRenderListD3D[v5].pQuads[i].texcoord.x = 0.0; + pBillboardRenderListD3D[v5].pQuads[i].texcoord.y = 0.0; } } @@ -8838,6 +7304,8 @@ double v39; // [sp+94h] [bp-Ch]@6 float v40; // [sp+9Ch] [bp-4h]@6 + __debugbreak(); + auto ecx0 = this; v3 = 0; if ( ecx0->pRenderD3D ) @@ -10633,12 +9101,6 @@ // 6BE364: using guessed type int dword_6BE364_game_settings_1; // A74C88: using guessed type int dword_A74C88; -//----- (0044EC20) -------------------------------------------------------- -bool RenderD3D::DoesRaiseExceptions() -{ - return true; -} - //----- (004524D8) -------------------------------------------------------- HWLTexture *RenderHWLContainer::LoadTexture(const char *pName, int bMipMaps) @@ -10865,20 +9327,20 @@ auto p = &pRenderer->pBillboardRenderListD3D[0]; for (int i = 0; i < p->uNumVertices; ++i) { - p->pQuards[i].pos.z -= p->pQuards[i].pos.z * 0.6; - //p->pQuards[i].rhw = + 0.8 * (1.0f - p->pQuards[i].rhw); - } - p->pQuards[0].pos.x = 10; - p->pQuards[0].pos.y = 10; - - p->pQuards[1].pos.x = 10; - p->pQuards[1].pos.y = 200; - - p->pQuards[2].pos.x = 100; - p->pQuards[2].pos.y = 200; - - p->pQuards[3].pos.x = 100; - p->pQuards[3].pos.y = 10; + p->pQuads[i].pos.z -= p->pQuads[i].pos.z * 0.6; + //p->pQuads[i].rhw = + 0.8 * (1.0f - p->pQuads[i].rhw); + } + p->pQuads[0].pos.x = 10; + p->pQuads[0].pos.y = 10; + + p->pQuads[1].pos.x = 10; + p->pQuads[1].pos.y = 200; + + p->pQuads[2].pos.x = 100; + p->pQuads[2].pos.y = 200; + + p->pQuads[3].pos.x = 100; + p->pQuads[3].pos.y = 10; if (p->uOpacity != RenderBillboardD3D::NoBlend) SetBillboardBlendOptions(p->uOpacity); @@ -10886,7 +9348,7 @@ pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture); ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, - p->pQuards, p->uNumVertices, + p->pQuads, p->uNumVertices, D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS)); }*/ @@ -10901,7 +9363,7 @@ pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture); ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, - p->pQuards, p->uNumVertices, + p->pQuads, p->uNumVertices, D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS)); } @@ -10971,3 +9433,11 @@ { pRenderer->Present(); } + + + +//----- (0044EC20) -------------------------------------------------------- +/*bool RenderD3D::DoesRaiseExceptions() +{ + return true; +}*/ \ No newline at end of file