comparison Render.cpp @ 144:8ab4484c22e0

Billboard drawing's up (actors, decorations, misc sprites)
author Nomad
date Tue, 12 Feb 2013 11:59:49 +0200
parents b099dd069171
children 796b79187c27 ee11772d0ad2
comparison
equal deleted inserted replaced
143:b099dd069171 144:8ab4484c22e0
16 #include "ObjectList.h" 16 #include "ObjectList.h"
17 #include "LayingItem.h" 17 #include "LayingItem.h"
18 #include "DecorationList.h" 18 #include "DecorationList.h"
19 #include "Allocator.h" 19 #include "Allocator.h"
20 #include "OSInfo.h" 20 #include "OSInfo.h"
21 #include "Actor.h"
21 #include "Log.h" 22 #include "Log.h"
22 23
23 #include "mm7_data.h" 24 #include "mm7_data.h"
24 25
25 26
195 auto p = pBillboardRenderList + i; 196 auto p = pBillboardRenderList + i;
196 197
197 soft_billboard.uScreenSpaceX = p->uScreenSpaceX; 198 soft_billboard.uScreenSpaceX = p->uScreenSpaceX;
198 soft_billboard.uParentBillboardID = i; 199 soft_billboard.uParentBillboardID = i;
199 soft_billboard.uScreenSpaceY = p->uScreenSpaceY; 200 soft_billboard.uScreenSpaceY = p->uScreenSpaceY;
200 soft_billboard.field_10 = p->field_0; 201 soft_billboard._screenspace_x_scaler_packedfloat = p->_screenspace_x_scaler_packedfloat;
201 soft_billboard.field_14 = p->field_4; 202 soft_billboard._screenspace_y_scaler_packedfloat = p->_screenspace_y_scaler_packedfloat;
202 soft_billboard.sZValue = p->sZValue; 203 soft_billboard.sZValue = p->sZValue;
203 soft_billboard.uFlags = p->field_1E; 204 soft_billboard.uFlags = p->field_1E;
204 soft_billboard.uTintColor = p->uTintColor; 205 soft_billboard.uTintColor = p->uTintColor;
205 v2 = p->uHwSpriteID; 206 v2 = p->uHwSpriteID;
206 if ( v2 != -1 ) 207 if ( v2 != -1 )
2928 LABEL_74: 2929 LABEL_74:
2929 --pOutdoorCamera->numStru148s; 2930 --pOutdoorCamera->numStru148s;
2930 goto LABEL_75; 2931 goto LABEL_75;
2931 } 2932 }
2932 } 2933 }
2933 // 47F44B: using guessed type int __stdcall WorldPosToGridCellX(int);
2934 // 47F458: using guessed type int __stdcall WorldPosToGridCellZ(int);
2935 // 4D864C: using guessed type char byte_4D864C;
2936 2934
2937 2935
2938 //----- (0047BACF) -------------------------------------------------------- 2936 //----- (0047BACF) --------------------------------------------------------
2939 void Render::TransformBillboardsAndSetPalettesODM() 2937 void Render::TransformBillboardsAndSetPalettesODM()
2940 { 2938 {
2941 //int v0; // edi@1 2939 //int v0; // edi@1
2942 char *v1; // esi@2 2940 //char *v1; // esi@2
2943 unsigned int v2; // edx@3 2941 //unsigned int v2; // edx@3
2944 int v3; // eax@3 2942 //int v3; // eax@3
2945 int v4; // edi@3 2943 //int v4; // edi@3
2946 int v5; // eax@3 2944 //int v5; // eax@3
2947 __int16 v6; // di@3 2945 //__int16 v6; // di@3
2948 int v7; // eax@3 2946 //int v7; // eax@3
2949 int v8; // ebx@4 2947 //int v8; // ebx@4
2950 unsigned __int16 *v9; // eax@7 2948 unsigned __int16 *v9; // eax@7
2951 char v10; // zf@9 2949 char v10; // zf@9
2952 DWORD v11; // eax@13 2950 //DWORD v11; // eax@13
2953 int v12; // eax@13 2951 int v12; // eax@13
2954 int v13; // eax@14 2952 int v13; // eax@14
2955 RenderBillboardTransform_local0 billboard; // [sp+4h] [bp-60h]@1 2953 RenderBillboardTransform_local0 billboard; // [sp+4h] [bp-60h]@1
2956 int v15; // [sp+54h] [bp-10h]@13 2954 int v15; // [sp+54h] [bp-10h]@13
2957 //int v16; // [sp+58h] [bp-Ch]@1 2955 //int v16; // [sp+58h] [bp-Ch]@1
2958 int v17; // [sp+5Ch] [bp-8h]@2 2956 //int v17; // [sp+5Ch] [bp-8h]@2
2959 int v18; // [sp+60h] [bp-4h]@13 2957 int v18; // [sp+60h] [bp-4h]@13
2960 2958
2961 billboard.uParentBillboardID = -1; 2959 billboard.uParentBillboardID = -1;
2962 billboard.pTarget = pRenderer->pTargetSurface; 2960 billboard.pTarget = pRenderer->pTargetSurface;
2963 billboard.pTargetZ = pRenderer->pActiveZBuffer; 2961 billboard.pTargetZ = pRenderer->pActiveZBuffer;
2964 billboard.uTargetPitch = pRenderer->uTargetSurfacePitch; 2962 billboard.uTargetPitch = pRenderer->uTargetSurfacePitch;
2965 billboard.uViewportX = pViewport->uViewportX; 2963 billboard.uViewportX = pViewport->uViewportX;
2966 billboard.uViewportY = pViewport->uViewportY; 2964 billboard.uViewportY = pViewport->uViewportY;
2967 billboard.uViewportZ = pViewport->uViewportZ - 1; 2965 billboard.uViewportZ = pViewport->uViewportZ - 1;
2968 billboard.uViewportW = pViewport->uViewportW; 2966 billboard.uViewportW = pViewport->uViewportW;
2969 //v0 = 0;
2970 pOutdoorCamera->uNumBillboards = uNumBillboardsToDraw; 2967 pOutdoorCamera->uNumBillboards = uNumBillboardsToDraw;
2971 2968
2972 //v16 = 0; 2969 for (int i = 0; i < ::uNumBillboardsToDraw; ++i)
2973 for (int i = 0; i < uNumBillboardsToDraw; ++i)
2974 { 2970 {
2975 auto pBillboard = pBillboardRenderList + i; 2971 auto pBillboard = pBillboardRenderList + i;
2976 v17 = 0; 2972
2977 v1 = (char *)&pBillboardRenderList[i].uScreenSpaceY; 2973 billboard.uScreenSpaceX = pBillboard->uScreenSpaceX;
2978 //do 2974 billboard.uScreenSpaceY = pBillboard->uScreenSpaceY;
2979 //{ 2975 billboard.uParentBillboardID = i;
2980 billboard.uScreenSpaceX = pBillboard->uScreenSpaceX; 2976 billboard._screenspace_x_scaler_packedfloat = pBillboard->_screenspace_x_scaler_packedfloat;
2981 v2 = *((short *)v1 - 5); 2977 billboard.uTintColor = pBillboard->uTintColor;
2982 billboard.uScreenSpaceY = pBillboard->uScreenSpaceY; 2978 billboard._screenspace_y_scaler_packedfloat = pBillboard->_screenspace_y_scaler_packedfloat;
2983 v3 = *((int *)v1 - 10); 2979 billboard.sZValue = pBillboard->sZValue;
2984 billboard.uParentBillboardID = i; 2980 billboard.uFlags = pBillboard->field_1E;
2985 v4 = *((int *)v1 + 1); 2981 if (pBillboard->uHwSpriteID != -1)
2986 billboard.field_10 = v3; 2982 {
2987 v5 = *((int *)v1 - 9); 2983 if (pRenderer->pRenderD3D)
2988 billboard.uTintColor = v4; 2984 pRenderer->TransformBillboard(&billboard,
2989 v6 = *((short *)v1 - 8); 2985 &pSprites_LOD->pHardwareSprites[pBillboard->uHwSpriteID],
2990 billboard.field_14 = v5; 2986 pBillboard->uPaletteSubindex, pBillboard);
2991 v7 = *((int *)v1 - 6); 2987 else
2992 billboard.sZValue = *((int *)v1 - 6); 2988 {
2993 billboard.uFlags = v2; 2989 assert(false);
2994 if ( v6 != -1 ) 2990
2995 { 2991 auto v1 = (char *)&pBillboard->uScreenSpaceY;
2996 v8 = *((short *)v1 + 1);
2997 if ( pRenderer->pRenderD3D )
2998 {
2999 billboard.sZValue = v7;
3000 billboard.uFlags = v2;
3001 pRenderer->TransformBillboard(&billboard, &pSprites_LOD->pHardwareSprites[v6], v8, (RenderBillboard *)(v1 - 40));
3002 }
3003 else
3004 {
3005 if ( *(v1 - 10) & 2 ) 2992 if ( *(v1 - 10) & 2 )
3006 v9 = PaletteManager::Get_Dark_or_Red_LUT(*((short *)v1 - 7), 0, 1); 2993 v9 = PaletteManager::Get_Dark_or_Red_LUT(*((short *)v1 - 7), 0, 1);
3007 else 2994 else
3008 v9 = GetBillboardPalette((RenderBillboard *)(v1 - 40), *((short *)v1 - 7), v7, *((short *)v1 + 1)); 2995 v9 = GetBillboardPalette((RenderBillboard *)(v1 - 40), *((short *)v1 - 7), pBillboard->sZValue, *((short *)v1 + 1));
3009 v10 = (*(v1 - 9) & 1) == 0; 2996 v10 = (*(v1 - 9) & 1) == 0;
3010 billboard.pPalette = v9; 2997 billboard.pPalette = v9;
3011 if ( !v10 ) 2998 if ( !v10 )
3012 billboard.pPalette = pPaletteManager->field_261600[*((short *)v1 - 7)]; 2999 billboard.pPalette = pPaletteManager->field_261600[*((short *)v1 - 7)];
3013 if ( !(billboard.uFlags & 0x40) && billboard.uFlags & 0x80 ) 3000 if ( !(billboard.uFlags & 0x40) && billboard.uFlags & 0x80 )
3014 { 3001 {
3015 v11 = GetTickCount(); 3002 v12 = stru_5C6E00->SinCos(i * 5 + GetTickCount());
3016 v12 = stru_5C6E00->SinCos(v17 + v11);
3017 v15 = abs(v12); 3003 v15 = abs(v12);
3018 v18 = (unsigned __int64)(15i64 * v15) >> 16; 3004 v18 = (unsigned __int64)(15i64 * v15) >> 16;
3019 billboard.pPalette2 = PaletteManager::Get_Dark_or_Red_LUT(*((short *)v1 - 7), 15 - v18, 1); 3005 billboard.pPalette2 = PaletteManager::Get_Dark_or_Red_LUT(*((short *)v1 - 7), 15 - v18, 1);
3020 } 3006 }
3021 v13 = *((short *)v1 - 8); 3007 v13 = *((short *)v1 - 8);
3022 if ( v13 >= 0 ) 3008 if ( v13 >= 0 )
3023 pSprites_LOD->pSpriteHeaders[v13]._4ACC38(&billboard, 1); 3009 pSprites_LOD->pSpriteHeaders[v13]._4ACC38(&billboard, 1);
3024 } 3010 }
3025 } 3011 }
3026 v17 += 5;
3027 //v0 = v16 + 1;
3028 v1 += 52;
3029 //++v16;
3030 //}
3031 //while ( v16 < (signed int)uNumBillboardsToDraw );
3032 } 3012 }
3033 } 3013 }
3034 3014
3035 3015
3036 //----- (0047AF11) -------------------------------------------------------- 3016 //----- (0047AF11) --------------------------------------------------------
3037 void Render::DrawLayingItems_Shooting_Magic_ODM() 3017 void Render::DrawLayingItems_Shooting_Magic_ODM()
3038 { 3018 {
3039 char *v0; // edi@2 3019 //char *v0; // edi@2
3040 ObjectDesc *v1; // ebx@4 3020 ObjectDesc *v1; // ebx@4
3041 __int16 v2; // cx@5 3021 __int16 v2; // cx@5
3042 RenderBillboard *v3; // esi@10 3022 RenderBillboard *v3; // esi@10
3043 SpriteFrame *v4; // eax@10 3023 SpriteFrame *v4; // eax@10
3044 SpriteFrame *v5; // ebx@10 3024 SpriteFrame *v5; // ebx@10
3075 int v36; // [sp+1Ch] [bp-24h]@10 3055 int v36; // [sp+1Ch] [bp-24h]@10
3076 int v37; // [sp+1Ch] [bp-24h]@23 3056 int v37; // [sp+1Ch] [bp-24h]@23
3077 int a6; // [sp+20h] [bp-20h]@10 3057 int a6; // [sp+20h] [bp-20h]@10
3078 int a6a; // [sp+20h] [bp-20h]@23 3058 int a6a; // [sp+20h] [bp-20h]@23
3079 int v40; // [sp+24h] [bp-1Ch]@25 3059 int v40; // [sp+24h] [bp-1Ch]@25
3080 signed int v41; // [sp+28h] [bp-18h]@1 3060 //signed int v41; // [sp+28h] [bp-18h]@1
3081 int v42; // [sp+2Ch] [bp-14h]@23 3061 int v42; // [sp+2Ch] [bp-14h]@23
3082 int y; // [sp+30h] [bp-10h]@10 3062 int y; // [sp+30h] [bp-10h]@10
3083 int x; // [sp+34h] [bp-Ch]@10 3063 int x; // [sp+34h] [bp-Ch]@10
3084 int z; // [sp+38h] [bp-8h]@10 3064 int z; // [sp+38h] [bp-8h]@10
3085 signed __int16 v46; // [sp+3Ch] [bp-4h]@12 3065 signed __int16 v46; // [sp+3Ch] [bp-4h]@12
3086 3066
3087 v41 = 0; 3067 //v41 = 0;
3088 if ( (signed int)uNumLayingItems > 0 ) 3068 for (int i = 0; i < uNumLayingItems; ++i)
3089 { 3069 {
3090 v0 = (char *)&pLayingItems[0].uSectorID; 3070 auto v0 = (char *)&pLayingItems[i].uSectorID;
3091 do 3071 //v0 = (char *)&pLayingItems[0].uSectorID;
3092 { 3072 //do
3073 //{
3093 if ( *((short *)v0 - 13) ) 3074 if ( *((short *)v0 - 13) )
3094 { 3075 {
3095 v1 = &pObjectList->pObjects[*((short *)v0 - 13)]; 3076 v1 = &pObjectList->pObjects[*((short *)v0 - 13)];
3096 if ( !(v1->uFlags & 1) ) 3077 if ( !(v1->uFlags & 1) )
3097 { 3078 {
3100 { 3081 {
3101 a5 = *(short *)v0; 3082 a5 = *(short *)v0;
3102 x = *((int *)v0 - 6); 3083 x = *((int *)v0 - 6);
3103 y = *((int *)v0 - 5); 3084 y = *((int *)v0 - 5);
3104 z = *((int *)v0 - 4); 3085 z = *((int *)v0 - 4);
3105 v3 = &pBillboardRenderList[uNumBillboardsToDraw]; 3086 v3 = &pBillboardRenderList[::uNumBillboardsToDraw];
3106 v4 = pSpriteFrameTable->GetFrame(v1->uSpriteID, *((short *)v0 + 1)); 3087 v4 = pSpriteFrameTable->GetFrame(v1->uSpriteID, *((short *)v0 + 1));
3107 v5 = v4; 3088 v5 = v4;
3108 v28 = v4; 3089 v28 = v4;
3109 v36 = v4->uFlags; 3090 v36 = v4->uFlags;
3110 a6 = v4->uGlowRadius * *((short *)v0 + 3); 3091 a6 = v4->uGlowRadius * *((short *)v0 + 3);
3188 HIDWORD(v23) = SLOWORD(pOutdoorCamera->int_fov_rad); 3169 HIDWORD(v23) = SLOWORD(pOutdoorCamera->int_fov_rad);
3189 v35 = pViewport->uScreenCenterX 3170 v35 = pViewport->uScreenCenterX
3190 - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16); 3171 - ((signed int)(((unsigned __int64)(v25 * (signed __int64)v40) >> 16) + 32768) >> 16);
3191 v32 = LOWORD(pViewport->uScreenCenterY) 3172 v32 = LOWORD(pViewport->uScreenCenterY)
3192 - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16); 3173 - (((unsigned int)((unsigned __int64)(v23 / v42 * v31) >> 16) + 32768) >> 16);
3193 if ( (signed int)uNumBillboardsToDraw >= 500 ) 3174 if (::uNumBillboardsToDraw >= 500)
3194 return; 3175 return;
3195 ++uNumBillboardsToDraw; 3176 ++::uNumBillboardsToDraw;
3196 ++uNumSpritesDrawnThisFrame; 3177 ++uNumSpritesDrawnThisFrame;
3197 *(v0 - 2) |= 1u; 3178 *(v0 - 2) |= 1u;
3198 v3->uPalette = v28->uPaletteIndex; 3179 v3->uPalette = v28->uPaletteIndex;
3199 v3->uIndoorSectorID = a5; 3180 v3->uIndoorSectorID = a5;
3200 v3->field_0 = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16; 3181 v3->_screenspace_x_scaler_packedfloat = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16;
3201 v26 = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16; 3182 v26 = (unsigned __int64)(v28->scale * (signed __int64)v24) >> 16;
3202 v3->pSpriteFrame = v28; 3183 v3->pSpriteFrame = v28;
3203 v3->field_4 = v26; 3184 v3->_screenspace_y_scaler_packedfloat = v26;
3204 v3->field_1E = v46; 3185 v3->field_1E = v46;
3205 v3->some_x = x; 3186 v3->some_x = x;
3206 v3->some_y = y; 3187 v3->some_y = y;
3207 v3->some_z = z; 3188 v3->some_z = z;
3208 v3->uScreenSpaceX = v35; 3189 v3->uScreenSpaceX = v35;
3209 v3->uScreenSpaceY = v32; 3190 v3->uScreenSpaceY = v32;
3210 HIWORD(v26) = HIWORD(v42); 3191 HIWORD(v26) = HIWORD(v42);
3211 LOWORD(v26) = 0; 3192 LOWORD(v26) = 0;
3212 v27 = (*(v0 - 2) & 0x20) == 0; 3193 v27 = (*(v0 - 2) & 0x20) == 0;
3213 v3->sZValue = v26 + (8 * v41 | 2); 3194 v3->sZValue = v26 + (8 * i | OBJECT_Item);
3214 v3->uPaletteSubindex = 0; 3195 v3->uPaletteSubindex = 0;
3215 v3->uTintColor = 0; 3196 v3->uTintColor = 0;
3216 if ( !v27 ) 3197 if ( !v27 )
3217 { 3198 {
3218 if ( !pRenderer->pRenderD3D ) 3199 if ( !pRenderer->pRenderD3D )
3224 } 3205 }
3225 } 3206 }
3226 } 3207 }
3227 } 3208 }
3228 LABEL_34: 3209 LABEL_34:
3229 ++v41; 3210 ;
3230 v0 += 112; 3211 //++v41;
3231 } 3212 //v0 += 112;
3232 while ( v41 < (signed int)uNumLayingItems ); 3213 //}
3214 //while ( v41 < (signed int)uNumLayingItems );
3233 } 3215 }
3234 } 3216 }
3235 // 4E94D3: using guessed type char byte_4E94D3; 3217 // 4E94D3: using guessed type char byte_4E94D3;
3236 // 5187E4: using guessed type int uNumSpritesDrawnThisFrame; 3218 // 5187E4: using guessed type int uNumSpritesDrawnThisFrame;
3237 3219
3452 } 3434 }
3453 3435
3454 3436
3455 3437
3456 //----- (0047A95E) -------------------------------------------------------- 3438 //----- (0047A95E) --------------------------------------------------------
3457 void Render::DrawDecorations() 3439 void Render::PrepareDecorationsRenderList_ODM()
3458 { 3440 {
3459 char *v0; // esi@2 3441 //char *v0; // esi@2
3460 DecorationDesc *v1; // ebx@6 3442 DecorationDesc *v1; // ebx@6
3461 __int16 v2; // ax@6 3443 __int16 v2; // ax@6
3462 double v3; // st7@7 3444 double v3; // st7@7
3463 int v4; // eax@9 3445 int v4; // eax@9
3464 int v5; // edx@9 3446 int v5; // edx@9
3489 int v30; // ecx@37 3471 int v30; // ecx@37
3490 int v31; // ebx@37 3472 int v31; // ebx@37
3491 Particle_ local_0; // [sp+Ch] [bp-98h]@7 3473 Particle_ local_0; // [sp+Ch] [bp-98h]@7
3492 int x; // [sp+74h] [bp-30h]@9 3474 int x; // [sp+74h] [bp-30h]@9
3493 int y; // [sp+78h] [bp-2Ch]@9 3475 int y; // [sp+78h] [bp-2Ch]@9
3494 int v35; // [sp+7Ch] [bp-28h]@1 3476 //int v35; // [sp+7Ch] [bp-28h]@1
3495 int v36; // [sp+80h] [bp-24h]@9 3477 int v36; // [sp+80h] [bp-24h]@9
3496 unsigned __int16 *v37; // [sp+84h] [bp-20h]@9 3478 unsigned __int16 *v37; // [sp+84h] [bp-20h]@9
3497 int v38; // [sp+88h] [bp-1Ch]@9 3479 int v38; // [sp+88h] [bp-1Ch]@9
3498 int v39; // [sp+8Ch] [bp-18h]@24 3480 int v39; // [sp+8Ch] [bp-18h]@24
3499 int v40; // [sp+90h] [bp-14h]@24 3481 int v40; // [sp+90h] [bp-14h]@24
3500 int v41; // [sp+94h] [bp-10h]@24 3482 int v41; // [sp+94h] [bp-10h]@24
3501 int v42; // [sp+98h] [bp-Ch]@9 3483 int v42; // [sp+98h] [bp-Ch]@9
3502 int a5; // [sp+9Ch] [bp-8h]@9 3484 int a5; // [sp+9Ch] [bp-8h]@9
3503 int b; // [sp+A0h] [bp-4h]@22 3485 int b; // [sp+A0h] [bp-4h]@22
3504 3486
3505 v35 = 0; 3487 //v35 = 0;
3506 if ( (signed int)uNumLevelDecorations > 0 ) 3488 //if ( (signed int)uNumLevelDecorations > 0 )
3507 { 3489 //{
3508 v0 = (char *)&pLevelDecorations[0].vPosition.y; 3490 //v0 = (char *)&pLevelDecorations[0].vPosition.y;
3509 do 3491 //do
3510 { 3492 for (int i = 0; i < uNumLevelDecorations; ++i)
3493 {
3494 auto v0 = (char *)&pLevelDecorations[i].vPosition.y;
3495
3511 if ( (!(*(v0 - 6) & 0x40) || ((LevelDecoration *)(v0 - 8))->_47A825()) && !(*(v0 - 6) & 0x20) ) 3496 if ( (!(*(v0 - 6) & 0x40) || ((LevelDecoration *)(v0 - 8))->_47A825()) && !(*(v0 - 6) & 0x20) )
3512 { 3497 {
3513 v1 = &pDecorationList->pDecorations[*((short *)v0 - 4)]; 3498 v1 = &pDecorationList->pDecorations[*((short *)v0 - 4)];
3514 v2 = v1->uFlags; 3499 v2 = v1->uFlags;
3515 if ( (char)v2 >= 0 ) 3500 if ( (char)v2 >= 0 )
3623 v42 = pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth >> 1; 3608 v42 = pSprites_LOD->pSpriteHeaders[(signed __int16)*v37].uWidth >> 1;
3624 b = (unsigned __int64)(v42 * (signed __int64)v41) >> 16; 3609 b = (unsigned __int64)(v42 * (signed __int64)v41) >> 16;
3625 } 3610 }
3626 if ( b + v25 >= (signed int)pViewport->uViewportX && v25 - b <= (signed int)pViewport->uViewportZ ) 3611 if ( b + v25 >= (signed int)pViewport->uViewportX && v25 - b <= (signed int)pViewport->uViewportZ )
3627 { 3612 {
3628 if ( (signed int)uNumBillboardsToDraw >= 500 ) 3613 if (::uNumBillboardsToDraw >= 500)
3629 return; 3614 return;
3630 v27 = &pBillboardRenderList[uNumBillboardsToDraw++]; 3615 v27 = &pBillboardRenderList[::uNumBillboardsToDraw++];
3631 ++uNumDecorationsDrawnThisFrame; 3616 ++uNumDecorationsDrawnThisFrame;
3632 v27->uHwSpriteID = *v37; 3617 v27->uHwSpriteID = *v37;
3633 v28 = v9->uPaletteIndex; 3618 v28 = v9->uPaletteIndex;
3634 v27->field_0 = v26; 3619 v27->_screenspace_x_scaler_packedfloat = v26;
3635 v27->field_4 = v26; 3620 v27->_screenspace_y_scaler_packedfloat = v26;
3636 v29 = v38; 3621 v29 = v38;
3637 v27->uScreenSpaceX = v25; 3622 v27->uScreenSpaceX = v25;
3638 HIBYTE(v29) |= 2u; 3623 HIBYTE(v29) |= 2u;
3639 v27->uPalette = v28; 3624 v27->uPalette = v28;
3640 v27->field_1E = v29; 3625 v27->field_1E = v29;
3641 v27->some_x = x; 3626 v27->some_x = x;
3642 v27->some_y = y; 3627 v27->some_y = y;
3643 v27->some_z = v36; 3628 v27->some_z = v36;
3644 v27->uScreenSpaceY = v40; 3629 v27->uScreenSpaceY = v40;
3645 HIWORD(v30) = HIWORD(v39); 3630 HIWORD(v30) = HIWORD(v39);
3646 v31 = 8 * v35 | 5; 3631 v31 = 8 * i | OBJECT_Decoration;
3647 LOWORD(v30) = 0; 3632 LOWORD(v30) = 0;
3648 v27->uIndoorSectorID = 0; 3633 v27->uIndoorSectorID = 0;
3649 v27->sZValue = v30 + v31; 3634 v27->sZValue = v30 + v31;
3650 v27->uPaletteSubindex = 0; 3635 v27->uPaletteSubindex = 0;
3651 v27->pSpriteFrame = v9; 3636 v27->pSpriteFrame = v9;
3692 local_0.uTextureID = pBitmaps_LOD->LoadTexture("effpar01"); 3677 local_0.uTextureID = pBitmaps_LOD->LoadTexture("effpar01");
3693 pGame->pParticleEngine->AddParticle(&local_0); 3678 pGame->pParticleEngine->AddParticle(&local_0);
3694 } 3679 }
3695 } 3680 }
3696 LABEL_38: 3681 LABEL_38:
3697 ++v35; 3682 ;
3698 v0 += 32; 3683 //++v35;
3699 } 3684 //v0 += 32;
3700 while ( v35 < (signed int)uNumLevelDecorations ); 3685 }
3701 } 3686 //while ( v35 < (signed int)uNumLevelDecorations );
3702 } 3687 }
3703 // 4E94D0: using guessed type char byte_4E94D0; 3688 // 4E94D0: using guessed type char byte_4E94D0;
3704 // 5187EC: using guessed type int uNumDecorationsDrawnThisFrame; 3689 // 5187EC: using guessed type int uNumDecorationsDrawnThisFrame;
3705 3690
3706 3691
7024 //----- (004A194A) -------------------------------------------------------- 7009 //----- (004A194A) --------------------------------------------------------
7025 void Render::BltBackToFontFast(int a2, int a3, RECT *a4) 7010 void Render::BltBackToFontFast(int a2, int a3, RECT *a4)
7026 { 7011 {
7027 IDirectDrawSurface *pFront; // eax@3 7012 IDirectDrawSurface *pFront; // eax@3
7028 IDirectDrawSurface *pBack; // [sp-Ch] [bp-Ch]@3 7013 IDirectDrawSurface *pBack; // [sp-Ch] [bp-Ch]@3
7029 RECT *v6; // [sp-8h] [bp-8h]@3
7030 DWORD v7; // [sp-4h] [bp-4h]@3
7031 7014
7032 if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 ) 7015 if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 )
7033 { 7016 {
7034 pFront = (IDirectDrawSurface *)this->pFrontBuffer4; 7017 pFront = (IDirectDrawSurface *)this->pFrontBuffer4;
7035 v7 = DDBLTFAST_WAIT;
7036 v6 = a4;
7037 pBack = (IDirectDrawSurface *)this->pBackBuffer4; 7018 pBack = (IDirectDrawSurface *)this->pBackBuffer4;
7038 } 7019 }
7039 else 7020 else
7040 { 7021 {
7041 pFront = (IDirectDrawSurface *)this->pFrontBuffer2; 7022 pFront = (IDirectDrawSurface *)this->pFrontBuffer2;
7042 v7 = DDBLTFAST_WAIT;
7043 v6 = a4;
7044 pBack = (IDirectDrawSurface *)this->pBackBuffer2; 7023 pBack = (IDirectDrawSurface *)this->pBackBuffer2;
7045 } 7024 }
7046 pFront->BltFast(0, 0, pBack, v6, v7); 7025 pFront->BltFast(0, 0, pBack, a4, DDBLTFAST_WAIT);
7047 } 7026 }
7048 7027
7049 //----- (004A1B22) -------------------------------------------------------- 7028 //----- (004A1B22) --------------------------------------------------------
7050 unsigned int Render::Billboard_ProbablyAddToListAndSortByZOrder(unsigned int a1) 7029 unsigned int Render::Billboard_ProbablyAddToListAndSortByZOrder(float z)
7051 { 7030 {
7052 unsigned int v2; // ebx@1 7031 //unsigned int v2; // ebx@1
7053 double v4; // st7@5 7032 //double v4; // st7@5
7054 unsigned int v5; // esi@5 7033 //unsigned int v5; // esi@5
7055 int v6; // ecx@5 7034 //int v6; // ecx@5
7056 unsigned int v7; // edx@6 7035 unsigned int v7; // edx@6
7057 char *v8; // ecx@12 7036 char *v8; // ecx@12
7058 void *v9; // edi@16 7037 void *v9; // edi@16
7059 unsigned int v10; // eax@16 7038 unsigned int v10; // eax@16
7060 void *v11; // edi@21 7039 void *v11; // edi@21
7061 unsigned int v12; // eax@21 7040 unsigned int v12; // eax@21
7062 7041
7063 v2 = pRenderer->uNumBillboardsToDraw; 7042 //v2 = uNumBillboardsToDraw;
7064 if ( (signed int)pRenderer->uNumBillboardsToDraw >= 999 ) 7043 if (uNumBillboardsToDraw >= 999 )
7065 return 0; 7044 return 0;
7066 if ( !pRenderer->uNumBillboardsToDraw ) 7045 if (!uNumBillboardsToDraw)
7067 { 7046 {
7068 pRenderer->uNumBillboardsToDraw = 1; 7047 uNumBillboardsToDraw = 1;
7069 return 0; 7048 return 0;
7070 } 7049 }
7071 v4 = *(float *)&a1; 7050
7072 v5 = pRenderer->uNumBillboardsToDraw; 7051 //v4 = *(float *)&a1;
7073 v6 = 0; 7052 //v5 = pRenderer->uNumBillboardsToDraw;
7074 if ( (signed int)pRenderer->uNumBillboardsToDraw <= 0 ) 7053 //v6 = 0;
7075 { 7054 for (int left = 0, right = uNumBillboardsToDraw; left < right; ) // binsearch
7076 v7 = a1; 7055 {
7077 } 7056 v7 = left + (right - left) / 2;
7078 else 7057 if (z <= pRenderer->pBillboardRenderListD3D[v7].z_order)
7079 { 7058 right = v7;
7080 do 7059 else
7081 { 7060 left = v7 + 1;
7082 v7 = v6 + (signed int)(v5 - v6) / 2; 7061 }
7083 if ( v4 <= pRenderer->pBillboardRenderListD3D[v6 + (signed int)(v5 - v6) / 2].flt_88 ) 7062
7084 v5 = v6 + (signed int)(v5 - v6) / 2; 7063 v8 = (char *)&pRenderer->pBillboardRenderListD3D[v7].z_order;
7085 else 7064 if (z > *(float *)v8 )
7086 v6 = v7 + 1;
7087 }
7088 while ( v6 < (signed int)v5 );
7089 }
7090 v8 = (char *)&pRenderer->pBillboardRenderListD3D[v7].flt_88;
7091 if ( v4 > *(float *)v8 )
7092 { 7065 {
7093 if ( v7 == pRenderer->uNumBillboardsToDraw - 1 ) 7066 if ( v7 == pRenderer->uNumBillboardsToDraw - 1 )
7094 { 7067 {
7095 v7 = pRenderer->uNumBillboardsToDraw; 7068 v7 = pRenderer->uNumBillboardsToDraw;
7096 } 7069 }
7109 while ( v10 ); 7082 while ( v10 );
7110 } 7083 }
7111 ++v7; 7084 ++v7;
7112 } 7085 }
7113 LABEL_23: 7086 LABEL_23:
7114 pRenderer->uNumBillboardsToDraw = v2 + 1; 7087 uNumBillboardsToDraw++;
7115 return v7; 7088 return v7;
7116 } 7089 }
7117 if ( v4 <= *(float *)v8 ) 7090 if (z <= *(float *)v8 )
7118 { 7091 {
7119 if ( (signed int)pRenderer->uNumBillboardsToDraw > (signed int)v7 ) 7092 if ( (signed int)pRenderer->uNumBillboardsToDraw > (signed int)v7 )
7120 { 7093 {
7121 v11 = &pRenderer->pBillboardRenderListD3D[pRenderer->uNumBillboardsToDraw]; 7094 v11 = &pRenderer->pBillboardRenderListD3D[pRenderer->uNumBillboardsToDraw];
7122 v12 = pRenderer->uNumBillboardsToDraw - v7; 7095 v12 = pRenderer->uNumBillboardsToDraw - v7;
7197 return; 7170 return;
7198 7171
7199 if (pRenderD3D) 7172 if (pRenderD3D)
7200 { 7173 {
7201 pGame->draw_debug_outlines(); 7174 pGame->draw_debug_outlines();
7202 //DoRenderBillboards_D3D(); //Ritor1: it's temporarily 7175 DoRenderBillboards_D3D(); //Ritor1: it's temporarily
7203 pGame->pStru6Instance->RenderSpecialEffects(); 7176 pGame->pStru6Instance->RenderSpecialEffects();
7204 pRenderD3D->pDevice->EndScene(); 7177 pRenderD3D->pDevice->EndScene();
7205 } 7178 }
7206 else 7179 else
7207 pGame->pStru6Instance->RenderSpecialEffects(); 7180 pGame->pStru6Instance->RenderSpecialEffects();
7995 7968
7996 v26 = this; 7969 v26 = this;
7997 if ( this->uNumD3DSceneBegins ) 7970 if ( this->uNumD3DSceneBegins )
7998 { 7971 {
7999 v4 = pSoftBillboard; 7972 v4 = pSoftBillboard;
8000 v5 = (double)HIWORD(pSoftBillboard->sZValue); 7973 v5 = (double)pSoftBillboard->zbuffer_depth;
8001 pSoftBillboarda = v5; 7974 pSoftBillboarda = v5;
8002 v6 = v5; 7975 v6 = v5;
8003 v7 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v6)); 7976 v7 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v6));
8004 v8 = uPaletteSubindex; 7977 v8 = uPaletteSubindex;
8005 v9 = v7; 7978 v9 = v7;
8012 pBillboardRenderListD3D[v9].field_90 = v4->field_44; 7985 pBillboardRenderListD3D[v9].field_90 = v4->field_44;
8013 pBillboardRenderListD3D[v9].sZValue = v4->sZValue; 7986 pBillboardRenderListD3D[v9].sZValue = v4->sZValue;
8014 pBillboardRenderListD3D[v9].uParentBillboardID = v4->uParentBillboardID; 7987 pBillboardRenderListD3D[v9].uParentBillboardID = v4->uParentBillboardID;
8015 v25 = v4->uScreenSpaceX; 7988 v25 = v4->uScreenSpaceX;
8016 v24 = v4->uScreenSpaceY; 7989 v24 = v4->uScreenSpaceY;
8017 a1 = (double)(v4->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v4->field_10); 7990 a1 = (v4->_screenspace_x_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(v4->_screenspace_x_scaler_packedfloat);
8018 v29 = (double)(v4->field_14 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v4->field_14); 7991 v29 = (v4->_screenspace_y_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(v4->_screenspace_y_scaler_packedfloat);
8019 v31 = (double)((v10->uBufferWidth >> 1) - v10->uAreaX); 7992 v31 = (double)((v10->uBufferWidth >> 1) - v10->uAreaX);
8020 v27 = (double)(v10->uBufferHeight - v10->uAreaY); 7993 v27 = (double)(v10->uBufferHeight - v10->uAreaY);
8021 if ( v4->uFlags & 4 ) 7994 if ( v4->uFlags & 4 )
8022 v31 = v31 * -1.0; 7995 v31 = v31 * -1.0;
8023 if ( v4->uTintColor && v26->bTinting ) 7996 if ( v4->uTintColor && v26->bTinting )
8080 pBillboardRenderListD3D[v9].pQuards[3].rhw = v16; 8053 pBillboardRenderListD3D[v9].pQuards[3].rhw = v16;
8081 pBillboardRenderListD3D[v9].pQuards[3].texcoord.x = 1.0; 8054 pBillboardRenderListD3D[v9].pQuards[3].texcoord.x = 1.0;
8082 pBillboardRenderListD3D[v9].pQuards[3].texcoord.y = 0.0; 8055 pBillboardRenderListD3D[v9].pQuards[3].texcoord.y = 0.0;
8083 v23 = v10->pTexture; 8056 v23 = v10->pTexture;
8084 pBillboardRenderListD3D[v9].uNumVertices = 4; 8057 pBillboardRenderListD3D[v9].uNumVertices = 4;
8085 pBillboardRenderListD3D[v9].flt_88 = pSoftBillboarda; 8058 pBillboardRenderListD3D[v9].z_order = pSoftBillboarda;
8086 pBillboardRenderListD3D[v9].pTexture = v23; 8059 pBillboardRenderListD3D[v9].pTexture = v23;
8087 } 8060 }
8088 } 8061 }
8089 8062
8090 8063
8135 double v45; // st6@3 8108 double v45; // st6@3
8136 float v46; // eax@3 8109 float v46; // eax@3
8137 8110
8138 if ( this->uNumD3DSceneBegins ) 8111 if ( this->uNumD3DSceneBegins )
8139 { 8112 {
8140 if ( HIWORD(a2->sZValue) ) 8113 if (a2->zbuffer_depth)
8141 { 8114 {
8142 v5 = (double)HIWORD(a2->sZValue); 8115 v5 = (double)a2->zbuffer_depth;
8143 v6 = v5; 8116 v6 = v5;
8144 v7 = v5; 8117 v7 = v5;
8145 v8 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v7)); 8118 v8 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v7));
8146 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_1; 8119 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_1;
8147 pBillboardRenderListD3D[v8].field_90 = a2->field_44; 8120 pBillboardRenderListD3D[v8].field_90 = a2->field_44;
8148 pBillboardRenderListD3D[v8].sZValue = a2->sZValue; 8121 pBillboardRenderListD3D[v8].sZValue = a2->sZValue;
8149 pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID; 8122 pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID;
8150 v9 = a2->uScreenSpaceX; 8123 v9 = a2->uScreenSpaceX;
8151 v10 = a2->uScreenSpaceY; 8124 v10 = a2->uScreenSpaceY;
8152 v11 = (double)(a2->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(a2->field_10); 8125 v11 = (a2->_screenspace_x_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(a2->_screenspace_x_scaler_packedfloat);
8153 v12 = (double)v9; 8126 v12 = (double)v9;
8154 v13 = v12; 8127 v13 = v12;
8155 v14 = (double)(v10 - 12); 8128 v14 = (double)(v10 - 12);
8156 v15 = v14; 8129 v15 = v14;
8157 v16 = (double)(v9 - 12) - v12; 8130 v16 = (double)(v9 - 12) - v12;
8253 pBillboardRenderListD3D[v8].pQuards[3].specular = 0; 8226 pBillboardRenderListD3D[v8].pQuards[3].specular = 0;
8254 pBillboardRenderListD3D[v8].pQuards[3].pos.z = v46; 8227 pBillboardRenderListD3D[v8].pQuards[3].pos.z = v46;
8255 pBillboardRenderListD3D[v8].pQuards[3].rhw = pBillboardRenderListD3D[v8].pQuards[0].rhw; 8228 pBillboardRenderListD3D[v8].pQuards[3].rhw = pBillboardRenderListD3D[v8].pQuards[0].rhw;
8256 pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse; 8229 pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse;
8257 pBillboardRenderListD3D[v8].pTexture = a3; 8230 pBillboardRenderListD3D[v8].pTexture = a3;
8258 pBillboardRenderListD3D[v8].flt_88 = v6; 8231 pBillboardRenderListD3D[v8].z_order = v6;
8259 pBillboardRenderListD3D[v8].uNumVertices = 4; 8232 pBillboardRenderListD3D[v8].uNumVertices = 4;
8260 pBillboardRenderListD3D[v8].pQuards[3].pos.y = v45; 8233 pBillboardRenderListD3D[v8].pQuards[3].pos.y = v45;
8261 pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; 8234 pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0;
8262 pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0; 8235 pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0;
8263 } 8236 }
8311 signed int v45; // eax@2 8284 signed int v45; // eax@2
8312 double v46; // st6@2 8285 double v46; // st6@2
8313 8286
8314 if ( this->uNumD3DSceneBegins ) 8287 if ( this->uNumD3DSceneBegins )
8315 { 8288 {
8316 v5 = (double)HIWORD(a2->sZValue); 8289 v5 = (double)a2->zbuffer_depth;
8317 v6 = v5; 8290 v6 = v5;
8318 v7 = v5; 8291 v7 = v5;
8319 v8 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v7)); 8292 v8 = Billboard_ProbablyAddToListAndSortByZOrder(LODWORD(v7));
8320 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_1; 8293 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_1;
8321 pBillboardRenderListD3D[v8].field_90 = a2->field_44; 8294 pBillboardRenderListD3D[v8].field_90 = a2->field_44;
8322 pBillboardRenderListD3D[v8].sZValue = a2->sZValue; 8295 pBillboardRenderListD3D[v8].sZValue = a2->sZValue;
8323 pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID; 8296 pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID;
8324 v9 = a2->uScreenSpaceX; 8297 v9 = a2->uScreenSpaceX;
8325 v10 = a2->uScreenSpaceY; 8298 v10 = a2->uScreenSpaceY;
8326 v11 = (double)(a2->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(a2->field_10); 8299 v11 = (a2->_screenspace_x_scaler_packedfloat & 0xFFFF) * 0.000015260186 + HIWORD(a2->_screenspace_x_scaler_packedfloat);
8327 v12 = (double)v9; 8300 v12 = (double)v9;
8328 v13 = v12; 8301 v13 = v12;
8329 v14 = (double)(v10 - 12); 8302 v14 = (double)(v10 - 12);
8330 v15 = v14; 8303 v15 = v14;
8331 v16 = (double)(v9 - 12) - v12; 8304 v16 = (double)(v9 - 12) - v12;
8427 pBillboardRenderListD3D[v8].pQuards[3].specular = 0; 8400 pBillboardRenderListD3D[v8].pQuards[3].specular = 0;
8428 pBillboardRenderListD3D[v8].pQuards[3].pos.z = v24; 8401 pBillboardRenderListD3D[v8].pQuards[3].pos.z = v24;
8429 pBillboardRenderListD3D[v8].pQuards[3].rhw = v25; 8402 pBillboardRenderListD3D[v8].pQuards[3].rhw = v25;
8430 pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse; 8403 pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse;
8431 pBillboardRenderListD3D[v8].pTexture = a3; 8404 pBillboardRenderListD3D[v8].pTexture = a3;
8432 pBillboardRenderListD3D[v8].flt_88 = v6; 8405 pBillboardRenderListD3D[v8].z_order = v6;
8433 pBillboardRenderListD3D[v8].uNumVertices = 4; 8406 pBillboardRenderListD3D[v8].uNumVertices = 4;
8434 pBillboardRenderListD3D[v8].pQuards[3].pos.y = v46; 8407 pBillboardRenderListD3D[v8].pQuards[3].pos.y = v46;
8435 pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; 8408 pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0;
8436 pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0; 8409 pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0;
8437 } 8410 }
8438 } 8411 }
8439 8412
8440 8413
8441 //----- (004A4023) -------------------------------------------------------- 8414 //----- (004A4023) --------------------------------------------------------
8442 void Render::TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int a1a, RenderBillboard *pBillboard) 8415 void Render::TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int paletteSubindex, RenderBillboard *pBillboard)
8443 { 8416 {
8444 RenderBillboardTransform_local0 *v5; // ebx@2
8445 double v6; // st7@2
8446 float v7; // ST08_4@2
8447 unsigned int v8; // esi@2 8417 unsigned int v8; // esi@2
8448 Sprite *v9; // edi@5
8449 signed int v10; // eax@9
8450 signed int v11; // eax@9
8451 int v12; // eax@12
8452 double v13; // st7@12
8453 double v14; // st6@14 8418 double v14; // st6@14
8454 double v15; // st5@14 8419 double v15; // st5@14
8455 unsigned int v16; // ecx@16 8420 //unsigned int v16; // ecx@16
8456 double v17; // st7@16 8421 //double v17; // st7@16
8457 double v18; // st5@16 8422 //double v18; // st5@16
8458 double v19; // st4@16 8423 //double v19; // st4@16
8459 double v20; // st5@18 8424 //double v20; // st5@18
8460 double v21; // st4@18 8425 //double v21; // st4@18
8461 IDirect3DTexture2 *v22; // eax@20 8426 //signed int v23; // [sp+18h] [bp-18h]@5
8462 signed int v23; // [sp+18h] [bp-18h]@5 8427 //signed int v24; // [sp+1Ch] [bp-14h]@5
8463 signed int v24; // [sp+1Ch] [bp-14h]@5 8428 //float v26; // [sp+20h] [bp-10h]@5
8464 float v25; // [sp+1Ch] [bp-14h]@12 8429 //float v27; // [sp+20h] [bp-10h]@12
8465 float v26; // [sp+20h] [bp-10h]@5
8466 float v27; // [sp+20h] [bp-10h]@12
8467 Render *a3; // [sp+24h] [bp-Ch]@1
8468 float v29; // [sp+28h] [bp-8h]@5 8430 float v29; // [sp+28h] [bp-8h]@5
8469 float v30; // [sp+2Ch] [bp-4h]@5 8431 float v30; // [sp+2Ch] [bp-4h]@5
8470 float v31; // [sp+38h] [bp+8h]@2 8432 //float pSpritea; // [sp+3Ch] [bp+Ch]@5
8471 float pSpritea; // [sp+3Ch] [bp+Ch]@5 8433
8472 float a1b; // [sp+40h] [bp+10h]@12 8434 if (!uNumD3DSceneBegins)
8473 float pBillboarda; // [sp+44h] [bp+14h]@12 8435 return;
8474 8436
8475 auto a1 = this; 8437 v8 = Billboard_ProbablyAddToListAndSortByZOrder(a2->zbuffer_depth);
8476 a3 = a1; 8438
8477 if ( a1->uNumD3DSceneBegins ) 8439 v30 = (a2->_screenspace_x_scaler_packedfloat & 0xFFFF) / 65530.0 + HIWORD(a2->_screenspace_x_scaler_packedfloat);
8478 { 8440 v29 = (a2->_screenspace_y_scaler_packedfloat & 0xFFFF) / 65530.0 + HIWORD(a2->_screenspace_y_scaler_packedfloat);
8479 v5 = a2; 8441
8480 v6 = (double)a2->sZValue; 8442 unsigned int diffuse = GetActorTintColor(paletteSubindex, 0, a2->zbuffer_depth, 0, pBillboard);
8481 v31 = v6; 8443 if (a2->uTintColor & 0x00FFFFFF && bTinting)
8482 v7 = v6; 8444 {
8483 v8 = Billboard_ProbablyAddToListAndSortByZOrder(v7); 8445 diffuse = sub_4A19D8(a2->uTintColor, diffuse);
8484 if ( BYTE3(v5->uTintColor) ) 8446 if (a2->uTintColor & 0xFF000000)
8485 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_3; 8447 diffuse = 0x007F7F7F & ((unsigned int)diffuse >> 1);
8486 else 8448 }
8487 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Transparent; 8449
8488 v9 = pSprite; 8450 unsigned int specular = 0;
8489 pBillboardRenderListD3D[v8].field_90 = v5->field_44; 8451 if (bUsingSpecular)
8490 pBillboardRenderListD3D[v8].sZValue = v5->sZValue; 8452 specular = sub_47C3D7_get_fog_related_stuff(0, 0, a2->zbuffer_depth);
8491 pBillboardRenderListD3D[v8].uParentBillboardID = v5->uParentBillboardID; 8453
8492 v24 = v5->uScreenSpaceX; 8454 v14 = (double)((int)pSprite->uBufferWidth / 2 - pSprite->uAreaX);
8493 v23 = v5->uScreenSpaceY; 8455 v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY);
8494 v30 = (double)(v5->field_10 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v5->field_10); 8456 if (a2->uFlags & 4)
8495 v29 = (double)(v5->field_14 & 0xFFFF) * 0.000015260186 + (double)HIWORD(v5->field_14); 8457 v14 *= -1.0;
8496 pSpritea = (double)((v9->uBufferWidth >> 1) - v9->uAreaX); 8458 pBillboardRenderListD3D[v8].pQuards[0].diffuse = diffuse;
8497 v26 = (double)(v9->uBufferHeight - v9->uAreaY); 8459 pBillboardRenderListD3D[v8].pQuards[0].pos.x = (double)a2->uScreenSpaceX - v14 * v30;
8498 if ( v5->uFlags & 4 ) 8460 pBillboardRenderListD3D[v8].pQuards[0].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
8499 pSpritea = pSpritea * -1.0; 8461 pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
8500 if ( v5->uTintColor & 0xFFFFFF && a3->bTinting ) 8462 pBillboardRenderListD3D[v8].pQuards[0].rhw = 1.0 / a2->zbuffer_depth;
8501 { 8463 pBillboardRenderListD3D[v8].pQuards[0].specular = specular;
8502 v10 = GetActorTintColor(a1a, 0, v31, 0, pBillboard); 8464 pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0;
8503 v11 = sub_4A19D8(v5->uTintColor, v10); 8465 pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0;
8504 if ( BYTE3(v5->uTintColor) ) 8466
8505 v11 = (unsigned int)((char *)&array_77EC08[1852].pEdgeList1[17] + 3) & ((unsigned int)v11 >> 1); 8467 v14 = (double)((int)pSprite->uBufferWidth / 2 - pSprite->uAreaX);
8506 } 8468 v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY);
8507 else 8469 if ( a2->uFlags & 4 )
8508 {
8509 v11 = GetActorTintColor(a1a, 0, v31, 0, pBillboard);
8510 }
8511 pBillboardRenderListD3D[v8].pQuards[0].diffuse = v11;
8512 v12 = 0;
8513 pBillboarda = (double)v24;
8514 pBillboardRenderListD3D[v8].pQuards[0].pos.x = pBillboarda - pSpritea * v30;
8515 a1b = (double)v23;
8516 pBillboardRenderListD3D[v8].pQuards[0].pos.y = a1b - v26 * v29;
8517 v27 = v31 * 1000.0;
8518 v13 = 1.0;
8519 pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (v27 / (double)pOutdoorCamera->shading_dist_mist);
8520 v25 = 1.0 / v31;
8521 pBillboardRenderListD3D[v8].pQuards[0].rhw = v25;
8522 if ( a3->bUsingSpecular )
8523 {
8524 v12 = sub_47C3D7_get_fog_related_stuff(0, 0, v31);
8525 v13 = 1.0;
8526 }
8527 pBillboardRenderListD3D[v8].pQuards[0].specular = v12;
8528 pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0;
8529 pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0;
8530 v14 = (double)((v9->uBufferWidth >> 1) - v9->uAreaX);
8531 v15 = (double)(v9->uBufferHeight - v9->uAreaHeight - v9->uAreaY);
8532 if ( v5->uFlags & 4 )
8533 v14 = v14 * -1.0; 8470 v14 = v14 * -1.0;
8534 v16 = pBillboardRenderListD3D[v8].pQuards[0].diffuse; 8471 pBillboardRenderListD3D[v8].pQuards[1].specular = specular;
8535 pBillboardRenderListD3D[v8].pQuards[1].specular = v12; 8472 pBillboardRenderListD3D[v8].pQuards[1].diffuse = diffuse;
8536 pBillboardRenderListD3D[v8].pQuards[1].diffuse = v16; 8473 pBillboardRenderListD3D[v8].pQuards[1].pos.x = (double)a2->uScreenSpaceX - v14 * v30;
8537 pBillboardRenderListD3D[v8].pQuards[1].pos.x = pBillboarda - v14 * v30; 8474 pBillboardRenderListD3D[v8].pQuards[1].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
8538 pBillboardRenderListD3D[v8].pQuards[1].pos.y = a1b - v15 * v29; 8475 pBillboardRenderListD3D[v8].pQuards[1].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
8539 v17 = v13 - v13 / (v27 / (double)pOutdoorCamera->shading_dist_mist); 8476 pBillboardRenderListD3D[v8].pQuards[1].rhw = 1.0 / a2->zbuffer_depth;
8540 pBillboardRenderListD3D[v8].pQuards[1].pos.z = v17;
8541 pBillboardRenderListD3D[v8].pQuards[1].rhw = v25;
8542 pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0; 8477 pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0;
8543 pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0; 8478 pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0;
8544 v18 = (double)(v9->uAreaWidth + v9->uAreaX + (v9->uBufferWidth >> 1) - v9->uBufferWidth); 8479
8545 v19 = (double)(v9->uBufferHeight - v9->uAreaHeight - v9->uAreaY); 8480 v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth);
8546 if ( v5->uFlags & 4 ) 8481 v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY);
8547 v18 = v18 * -1.0; 8482 if ( a2->uFlags & 4 )
8548 pBillboardRenderListD3D[v8].pQuards[2].diffuse = v16; 8483 v14 *= -1.0;
8549 pBillboardRenderListD3D[v8].pQuards[2].specular = v12; 8484 pBillboardRenderListD3D[v8].pQuards[2].diffuse = diffuse;
8550 pBillboardRenderListD3D[v8].pQuards[2].pos.x = v18 * v30 + pBillboarda; 8485 pBillboardRenderListD3D[v8].pQuards[2].specular = specular;
8551 pBillboardRenderListD3D[v8].pQuards[2].pos.y = a1b - v19 * v29; 8486 pBillboardRenderListD3D[v8].pQuards[2].pos.x = (double)a2->uScreenSpaceX + v14 * v30;
8552 pBillboardRenderListD3D[v8].pQuards[2].pos.z = v17; 8487 pBillboardRenderListD3D[v8].pQuards[2].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
8553 pBillboardRenderListD3D[v8].pQuards[2].rhw = v25; 8488 pBillboardRenderListD3D[v8].pQuards[2].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
8489 pBillboardRenderListD3D[v8].pQuards[2].rhw = 1.0 / a2->zbuffer_depth;
8554 pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0; 8490 pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0;
8555 pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0; 8491 pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0;
8556 v20 = (double)(v9->uAreaWidth + v9->uAreaX + (v9->uBufferWidth >> 1) - v9->uBufferWidth); 8492
8557 v21 = (double)(v9->uBufferHeight - v9->uAreaY); 8493 v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth);
8558 if ( v5->uFlags & 4 ) 8494 v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY);
8559 v20 = v20 * -1.0; 8495 if ( a2->uFlags & 4 )
8560 pBillboardRenderListD3D[v8].pQuards[3].diffuse = v16; 8496 v14 *= -1.0;
8561 pBillboardRenderListD3D[v8].pQuards[3].specular = v12; 8497 pBillboardRenderListD3D[v8].pQuards[3].diffuse = diffuse;
8562 pBillboardRenderListD3D[v8].pQuards[3].pos.x = v20 * v30 + pBillboarda; 8498 pBillboardRenderListD3D[v8].pQuards[3].specular = specular;
8563 pBillboardRenderListD3D[v8].pQuards[3].pos.y = a1b - v21 * v29; 8499 pBillboardRenderListD3D[v8].pQuards[3].pos.x = (double)a2->uScreenSpaceX + v14 * v30;
8564 pBillboardRenderListD3D[v8].pQuards[3].pos.z = v17; 8500 pBillboardRenderListD3D[v8].pQuards[3].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
8565 pBillboardRenderListD3D[v8].pQuards[3].rhw = v25; 8501 pBillboardRenderListD3D[v8].pQuards[3].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
8502 pBillboardRenderListD3D[v8].pQuards[3].rhw = 1.0 / a2->zbuffer_depth;
8566 pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0; 8503 pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0;
8567 pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0; 8504 pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0;
8568 v22 = v9->pTexture; 8505
8569 pBillboardRenderListD3D[v8].uNumVertices = 4; 8506 pBillboardRenderListD3D[v8].uNumVertices = 4;
8570 pBillboardRenderListD3D[v8].pTexture = v22; 8507 pBillboardRenderListD3D[v8].pTexture = pSprite->pTexture;
8571 pBillboardRenderListD3D[v8].flt_88 = v31; 8508 pBillboardRenderListD3D[v8].z_order = a2->zbuffer_depth;
8572 } 8509 pBillboardRenderListD3D[v8].field_90 = a2->field_44;
8510 pBillboardRenderListD3D[v8].sZValue = a2->sZValue;
8511 pBillboardRenderListD3D[v8].uParentBillboardID = a2->uParentBillboardID;
8512
8513 if (a2->uTintColor & 0xFF000000)
8514 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Opaque_3;
8515 else
8516 pBillboardRenderListD3D[v8].uOpacity = RenderBillboardD3D::Transparent;
8573 } 8517 }
8574 8518
8575 8519
8576 //----- (004A48E4) -------------------------------------------------------- 8520 //----- (004A48E4) --------------------------------------------------------
8577 int Render::MakeParticleBillboardAndPush_BLV_Software(int screenSpaceX, int screenSpaceY, int z, int lightColor, int a6) 8521 int Render::MakeParticleBillboardAndPush_BLV_Software(int screenSpaceX, int screenSpaceY, int z, int lightColor, int a6)
8838 while ( v6 < a1->field_10 ); 8782 while ( v6 < a1->field_10 );
8839 } 8783 }
8840 v13 = a1->field_10; 8784 v13 = a1->field_10;
8841 pBillboardRenderListD3D[v5].pTexture = 0; 8785 pBillboardRenderListD3D[v5].pTexture = 0;
8842 pBillboardRenderListD3D[v5].uNumVertices = v13; 8786 pBillboardRenderListD3D[v5].uNumVertices = v13;
8843 LODWORD(pBillboardRenderListD3D[v5].flt_88) = v14; 8787 LODWORD(pBillboardRenderListD3D[v5].z_order) = v14;
8844 } 8788 }
8845 } 8789 }
8846 8790
8847 8791
8848 //----- (004A4DE1) -------------------------------------------------------- 8792 //----- (004A4DE1) --------------------------------------------------------
8962 { 8906 {
8963 Sprite *v2; // edi@1 8907 Sprite *v2; // edi@1
8964 Render *v3; // ebx@1 8908 Render *v3; // ebx@1
8965 HWLTexture *result; // eax@1 8909 HWLTexture *result; // eax@1
8966 HWLTexture *v5; // esi@1 8910 HWLTexture *v5; // esi@1
8967 unsigned int v6; // ST18_4@2 8911 //unsigned int v6; // ST18_4@2
8968 RenderD3D *v7; // ecx@2 8912 //RenderD3D *v7; // ecx@2
8969 Sprite *v8; // ebx@4 8913 Sprite *v8; // ebx@4
8970 unsigned __int16 *v9; // edx@5 8914 unsigned __int16 *v9; // edx@5
8971 LPVOID v10; // eax@5 8915 LPVOID v10; // eax@5
8972 signed int v11; // ebx@5 8916 signed int v11; // ebx@5
8973 signed int v12; // ecx@6 8917 signed int v12; // ecx@6
8986 v2->uAreaY = result->field_34; 8930 v2->uAreaY = result->field_34;
8987 v2->uBufferWidth = result->field_18; 8931 v2->uBufferWidth = result->field_18;
8988 v2->uBufferHeight = result->field_1C; 8932 v2->uBufferHeight = result->field_1C;
8989 v2->uAreaWidth = result->field_20; 8933 v2->uAreaWidth = result->field_20;
8990 v2->uAreaHeight = result->field_24; 8934 v2->uAreaHeight = result->field_24;
8991 v6 = v3->uMinDeviceTextureDim; 8935 //v6 = v3->uMinDeviceTextureDim;
8992 v7 = v3->pRenderD3D; 8936 //v7 = v3->pRenderD3D;
8993 if ( !v7->CreateTexture(result->uWidth, result->uHeight, &v2->pTextureSurface, &v2->pTexture, 1u, 0, v6) ) 8937 if (!pRenderD3D->CreateTexture(result->uWidth, result->uHeight, &v2->pTextureSurface, &v2->pTexture, 1u, 0, uMinDeviceTextureDim))
8994 Abortf("HiScreen16::LoadTexture - D3Drend->CreateTexture() failed: %x", 0); 8938 Abortf("HiScreen16::LoadTexture - D3Drend->CreateTexture() failed: %x", 0);
8995 //pSprite = v2->pTextureSurface; 8939 //pSprite = v2->pTextureSurface;
8996 //pSprite = (Sprite *)pSprite->pName; 8940 //pSprite = (Sprite *)pSprite->pName;
8997 //v8 = pSprite; 8941 //v8 = pSprite;
8998 memset(&Dst, 0, 0x7Cu); 8942 memset(&Dst, 0, 0x7Cu);
11333 void DoRenderBillboards_D3D() 11277 void DoRenderBillboards_D3D()
11334 { 11278 {
11335 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, 3u)); 11279 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, 3u));
11336 ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1u)); 11280 ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1u));
11337 ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 0)); 11281 ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 0));
11338 ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1u)); 11282 ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE));
11339 11283
11340 for (uint i = pRenderer->uNumBillboardsToDraw - 1; i != (uint)-1; --i) 11284 /*if (pRenderer->uNumBillboardsToDraw)
11341 { 11285 {
11342 auto p = &pRenderer->pBillboardRenderListD3D[i]; 11286 auto p = &pRenderer->pBillboardRenderListD3D[0];
11343 11287 for (int i = 0; i < p->uNumVertices; ++i)
11344 if (p->uOpacity != RenderBillboardD3D::InvalidOpacity) 11288 {
11289 p->pQuards[i].pos.z -= p->pQuards[i].pos.z * 0.6;
11290 //p->pQuards[i].rhw = + 0.8 * (1.0f - p->pQuards[i].rhw);
11291 }
11292 p->pQuards[0].pos.x = 10;
11293 p->pQuards[0].pos.y = 10;
11294
11295 p->pQuards[1].pos.x = 10;
11296 p->pQuards[1].pos.y = 200;
11297
11298 p->pQuards[2].pos.x = 100;
11299 p->pQuards[2].pos.y = 200;
11300
11301 p->pQuards[3].pos.x = 100;
11302 p->pQuards[3].pos.y = 10;
11303
11304 if (p->uOpacity != RenderBillboardD3D::NoBlend)
11345 SetBillboardBlendOptions(p->uOpacity); 11305 SetBillboardBlendOptions(p->uOpacity);
11346 11306
11347 pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture); 11307 pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture);
11348 ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, 11308 ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,
11349 p->pQuards, p->uNumVertices, D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS)); 11309 D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
11310 p->pQuards, p->uNumVertices,
11311 D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS));
11312
11313 }*/
11314
11315 for (uint i = pRenderer->uNumBillboardsToDraw - 1; i != (uint)-1; --i)
11316 {
11317 auto p = &pRenderer->pBillboardRenderListD3D[i];
11318
11319 if (p->uOpacity != RenderBillboardD3D::NoBlend)
11320 SetBillboardBlendOptions(p->uOpacity);
11321
11322 pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture);
11323 ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,
11324 D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
11325 p->pQuards, p->uNumVertices,
11326 D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS));
11350 } 11327 }
11351 11328
11352 if (pRenderer->bFogEnabled) 11329 if (pRenderer->bFogEnabled)
11353 { 11330 {
11354 pRenderer->bFogEnabled = false; 11331 pRenderer->bFogEnabled = false;
11408 } 11385 }
11409 break; 11386 break;
11410 11387
11411 default: 11388 default:
11412 Log::Warning(L"SetBillboardBlendOptions: invalid opacity type (%u)", a1); 11389 Log::Warning(L"SetBillboardBlendOptions: invalid opacity type (%u)", a1);
11390 assert(false);
11413 break; 11391 break;
11414 } 11392 }
11415 } 11393 }
11416 11394