Mercurial > might-and-magic-trilogy
diff LightmapBuilder.cpp @ 45:bcc051713d20
BLV render & seffects
author | Nomad |
---|---|
date | Mon, 22 Oct 2012 20:45:14 +0200 |
parents | e62134245ab0 |
children | fde5c5acb66e |
line wrap: on
line diff
--- a/LightmapBuilder.cpp Sun Oct 21 23:26:23 2012 +0600 +++ b/LightmapBuilder.cpp Mon Oct 22 20:45:14 2012 +0200 @@ -2,6 +2,7 @@ #include "Game.h" #include "stru314.h" #include "Outdoor.h" +#include "Log.h" #include "mm7_data.h" @@ -203,7 +204,7 @@ } //----- (0045BE86) -------------------------------------------------------- -char LightmapBuilder::_45BE86_build_light_polygon(int arg0, float a4, int arg8, float a5, int uLightType, stru314 *a7, signed int a2, RenderVertexSoft *a9, char uClipFlag) +char LightmapBuilder::_45BE86_build_light_polygon(int arg0, float a4, unsigned int uColorMask, float a5, int uLightType, stru314 *a7, signed int a2, RenderVertexSoft *a9, char uClipFlag) { LightmapBuilder *v10; // esi@1 Lightmap *v11; // edi@3 @@ -279,13 +280,13 @@ v10->flt_3C8C28 = v13; v14 = a7; v66 = 1.0 / a4; - v10->flt_3C8C2C = 1.0 - (a4 - v13) * v66; + v10->flt_3C8C2C_lightmaps_brightness = 1.0 - (a4 - v13) * v66; v11->field_C08 = (signed __int64)((double)*(signed int *)arg0 - a5 * v14->field_4.x); v11->field_C0A = (signed __int64)((double)*(signed int *)(arg0 + 4) - a5 * v14->field_4.y); v15 = a4; v11->field_C0C = (signed __int64)((double)*(signed int *)(arg0 + 8) - a5 * v14->field_4.z); pLightmapVertices = v11->pVertices; - v17 = v15 * v10->flt_3C8C2C; + v17 = v15 * v10->flt_3C8C2C_lightmaps_brightness; pLightmapVertices_ = (int)v11->pVertices; v10->flt_3C8C30 = v17; v10->flt_3C8C0C = v17 * v14->field_10.x; @@ -337,7 +338,7 @@ *((float *)v19 - 11) = *((float *)v19 - 11) - v24 * v14->field_4.z; } while ( v22 ); - v11->field_C10 = arg8; + v11->uColorMask = uColorMask; v11->uNumVertices = 4; if ( pGame->uFlags2 & 4 ) { @@ -347,16 +348,16 @@ LODWORD(a5) = v11->field_C0A; v27 = v11->field_C08; a5 = (double)SLODWORD(a5); - arg8 = v27; + uColorMask = v27; v28 = (double)v27; v61 = a5; v60 = v28; v62 = v26; - *(float *)&arg8 = (double)*(signed int *)(arg0 + 8); + *(float *)&uColorMask = (double)*(signed int *)(arg0 + 8); arg0b = (double)*(signed int *)(arg0 + 4); v29 = (double)*(signed int *)v25 - v28; v30 = arg0b - a5; - a5 = *(float *)&arg8 - v26; + a5 = *(float *)&uColorMask - v26; a1.x = v29; a1.z = a5; a1.y = v30; @@ -369,10 +370,10 @@ arg0c = floorf(v61 + 0.5f); //v64 = v60 + 6.7553994e15; //arg8 = LODWORD(v64); - arg8 = floorf(v60 + 0.5f); + uColorMask = floorf(v60 + 0.5f); auto v64 /*HIDWORD(v64)*/ = abs(*(int *)(v25 + 8) - (signed)LODWORD(a5)); arg0a = abs(*(int *)(v25 + 4) - arg0c); - v31 = abs(*(int *)v25 - arg8); + v31 = abs(*(int *)v25 - (int)uColorMask); LODWORD(a5) = v31; v32 = arg0a; v33 = v64;//HIDWORD(v64); @@ -422,11 +423,11 @@ } v14 = a7; pLightmapVertices = (RenderVertexSoft *)pLightmapVertices_; - v11->flt_C14 = v40 - a4 * v40; + v11->fBrightness = v40 - a4 * v40; } else { - v11->flt_C14 = v10->flt_3C8C2C; + v11->fBrightness = v10->flt_3C8C2C_lightmaps_brightness; } v41 = v14->field_4.z; v42 = pGame->pStru9Instance; @@ -1783,7 +1784,7 @@ char v3; // zf@1 IDirect3DDevice3 *v4; // eax@2 HRESULT v5; // eax@2 - char *v6; // eax@2 + //char *v6; // eax@2 struct IDirect3DTexture2 *v7; // edi@4 HRESULT v8; // eax@8 HRESULT v9; // eax@8 @@ -1800,13 +1801,13 @@ HRESULT v20; // eax@21 IDirect3DDevice3 *v21; // eax@21 HRESULT v22; // eax@21 - IDirect3DDevice3 *v23; // eax@23 + //IDirect3DDevice3 *v23; // eax@23 std::string v25; // [sp+44h] [bp-44h]@12 signed int v26; // [sp+48h] [bp-40h]@21 signed int v27; // [sp+4Ch] [bp-3Ch]@21 Lightmap *v28; // [sp+50h] [bp-38h]@2 int v29; // [sp+54h] [bp-34h]@2 - float v30; // [sp+58h] [bp-30h]@2 + //float v30; // [sp+58h] [bp-30h]@2 int arg4; // [sp+68h] [bp-20h]@8 float v32; // [sp+6Ch] [bp-1Ch]@8 float v33; // [sp+70h] [bp-18h]@8 @@ -1820,13 +1821,13 @@ LODWORD(v38) = (int)this; if ( !v3 ) { - v30 = 0.0; + //v30 = 0.0; //v4 = pRenderer->pRenderD3D->pDevice; ErrD3D(v4->SetTextureStageState(0, D3DTSS_ADDRESS, 3u)); - v6 = (char *)stru_69BD44.c_str(); - if ( !stru_69BD44.c_str() ) - v6 = (char *)&dword_4D86F0; - v7 = pGame->pIndoorCameraD3D->LoadTextureAndGetHardwarePtr(v6); + //v6 = (char *)stru_69BD44.c_str(); + //if ( !stru_69BD44.c_str() ) + // v6 = (char *)&dword_4D86F0; + v7 = pGame->pIndoorCameraD3D->LoadTextureAndGetHardwarePtr("effpar03"); if ( pRenderer->bUsingSpecular ) pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 0); if ( !byte_4D864C || !(pGame->uFlags & 1) ) @@ -1892,253 +1893,134 @@ //LODWORD(v30) = 1; //v29 = 28; //v28 = (Lightmap *)pRenderer->pRenderD3D->pDevice; - pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 1); - v30 = pRenderer->uFogColor; - v23 = pRenderer->pRenderD3D->pDevice; + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 1)); + //v30 = pRenderer->uFogColor; + //v23 = pRenderer->pRenderD3D->pDevice; //v29 = 34; //v28 = (Lightmap *)v23; - v23->SetRenderState(D3DRENDERSTATE_FOGCOLOR, LODWORD(pRenderer->uFogColor)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, pRenderer->uFogColor)); //v28 = (Lightmap *)pRenderer->pRenderD3D->pDevice; - pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, false); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, false)); } } return 1; } -// 4D864C: using guessed type char byte_4D864C; -// 4D86F0: using guessed type int dword_4D86F0; + //----- (0045DA56) -------------------------------------------------------- -bool LightmapBuilder::DrawLightmaps2(float a2) +bool LightmapBuilder::DrawLightmaps2(float z_bias) { - LightmapBuilder *v2; // esi@1 - bool result; // eax@1 - signed int v4; // edi@2 - std::string v5; // [sp-14h] [bp-3Ch]@5 - const char *v6; // [sp-4h] [bp-2Ch]@5 - int v7; // [sp+0h] [bp-28h]@5 Vec3_float_ v; // [sp+Ch] [bp-1Ch]@2 - std::string *v9; // [sp+18h] [bp-10h]@5 - unsigned int v10; // [sp+1Ch] [bp-Ch]@5 - Lightmap *a1; // [sp+20h] [bp-8h]@3 - int a3; // [sp+27h] [bp-1h]@5 + v.z = 1.0; + v.y = 1.0; + v.x = 1.0; + + for (uint i = 0; i < std__vector_183808_size; ++i) + if (!DrawLightmap(std__vector_183808 + i, &v, z_bias)) + MessageBoxW(nullptr, L"Invalid lightmap detected!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Light.cpp:1288", 0); - v2 = this; - result = this->std__vector_183808_size; - if ( result ) - { - v4 = 0; - v.z = 1.0; - v.y = 1.0; - v.x = 1.0; - if ( result > 0 ) - { - a1 = this->std__vector_183808; - do - { - result = DrawLightmap(a1, &v, a2); - if ( !result ) - { - MessageBoxW(nullptr, L"Invalid lightmap detected!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Light.cpp:1288", 0); - v10 = 0x4D86ECu; - } - ++a1; - ++v4; - } - while ( v4 < (signed int)v2->std__vector_183808_size); - } - } - LOBYTE(result) = 1; - return result; + return true; } //----- (0045DAE8) -------------------------------------------------------- -bool LightmapBuilder::DrawLightmap(Lightmap *a1, Vec3_float_ *arg4, float thisa) +bool LightmapBuilder::DrawLightmap(Lightmap *pLightmap, Vec3_float_ *pColorMult, float z_bias) { - Lightmap *v4; // edx@1 - bool result; // eax@2 - double v6; // st7@3 - Vec3_float_ *v7; // ecx@3 - LEVEL_TYPE v8; // edi@3 - int v9; // esi@3 double v10; // st7@4 - unsigned int v11; // ebx@6 - char *v12; // ecx@7 - int v13; // edx@7 double v14; // st7@7 __int16 v15; // fps@8 - unsigned __int8 v16; // c2@8 - unsigned __int8 v17; // c3@8 double v18; // st3@8 - int v19; // eax@11 - double v20; // st3@11 - int v21; // eax@11 - char v22; // zf@11 - HRESULT v23; // eax@15 signed int v24; // [sp-1Ch] [bp-670h]@13 const char *v25; // [sp-18h] [bp-66Ch]@13 int v26; // [sp-14h] [bp-668h]@13 - HRESULT a2; // [sp+0h] [bp-654h]@15 - char v28; // [sp+4h] [bp-650h]@7 - double v29; // [sp+640h] [bp-14h]@3 - __int64 v30; // [sp+648h] [bp-Ch]@3 - float v31; // [sp+650h] [bp-4h]@3 - signed int a1b; // [sp+65Ch] [bp+8h]@3 - float a1c; // [sp+65Ch] [bp+8h]@3 - float a1d; // [sp+65Ch] [bp+8h]@3 - float a1e; // [sp+65Ch] [bp+8h]@3 - unsigned int a1a; // [sp+65Ch] [bp+8h]@7 - int arg4a; // [sp+660h] [bp+Ch]@3 + RenderVertexD3D3 a2[32]; // [sp+0h] [bp-654h]@7 - v4 = a1; - if ( (signed int)a1->uNumVertices >= 3 ) + + if (pLightmap->uNumVertices < 3) { - v6 = (double)BYTE1(a1->field_C10) * a1->flt_C14; - v30 = a1->field_C10 & 0xFFi64; - a1b = BYTE2(a1->field_C10); - v7 = arg4; - //v31 = v6; - *((float *)&v30 + 1) = (double)v30 * v4->flt_C14; - a1c = (double)a1b * v4->flt_C14 * arg4->x; - //v29 = a1c + 6.7553994e15; - //arg4a = LODWORD(v29); - arg4a = floorf(a1c + 0.5f); + Log::Warning(L"Lightmap uNumVertices < 3"); + return false; + } - a1d = v6 * v7->y; - v29 = a1d + 6.7553994e15; - LODWORD(v31) = LODWORD(v29); - - a1e = *((float *)&v30 + 1) * v7->z; - - v29 = a1e + 6.7553994e15; - HIDWORD(v30) = LODWORD(v29); + uint uLightmapColorMaskR = (pLightmap->uColorMask >> 16) & 0xFF; + uint uLightmapColorR = floorf(uLightmapColorMaskR * pLightmap->fBrightness * pColorMult->x + 0.5f); + + uint uLightmapColorMaskG = (pLightmap->uColorMask >> 8) & 0xFF; + uint uLightmapColorG = floorf(uLightmapColorMaskG * pLightmap->fBrightness * pColorMult->y + 0.5f); + + uint uLightmapColorMaskB = pLightmap->uColorMask & 0xFF; + uint uLightmapColorB = floorf(uLightmapColorMaskB * pLightmap->fBrightness * pColorMult->z + 0.5f); + + uint uLightmapColor = uLightmapColorB | (uLightmapColorMaskG << 8) | (uLightmapColorMaskR << 16); - v8 = uCurrentlyLoadedLevelType; - v9 = LODWORD(v29) | ((LODWORD(v31) | (arg4a << 8)) << 8); - if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) - v10 = (double)pOutdoorCamera->shading_dist_mist; - else - v10 = 16192.0; - v11 = v4->uNumVertices; - if ( (signed int)v11 > 0 ) + if (uCurrentlyLoadedLevelType == LEVEL_Outdoor) + v10 = (double)pOutdoorCamera->shading_dist_mist; + else + v10 = 16192.0; + v14 = 1.0 / v10; + + for (uint i = 0; i < pLightmap->uNumVertices; ++i) + { + v18 = 1.0 - 1.0 / (v14 * pLightmap->pVertices[i].vWorldViewPosition.x * 1000.0); + if (fabsf(z_bias) < 1e-5f) { - v12 = &v28; - v13 = (int)&v4->pVertices[0].vWorldViewPosition; - v14 = 1.0 / v10; - a1a = v11; - do - { - //UNDEF(v15); - v18 = 1.0 - 1.0 / (v14 * *(float *)v13 * 1000.0); - if ( !(v17 | v16) ) - { - v18 = v18 - thisa; - if ( v18 < 0.000099999997 ) - v18 = 0.000099999997; - } - *((float *)v12 + 1) = v18; - v19 = *(unsigned int *)(v13 + 12); - *((unsigned int *)v12 + 4) = 0; - v20 = 1.0 / *(float *)v13; - *((unsigned int *)v12 - 1) = v19; - *(unsigned int *)v12 = *(unsigned int *)(v13 + 16); - *((unsigned int *)v12 + 5) = *(unsigned int *)(v13 + 24); - v21 = *(unsigned int *)(v13 + 28); - *((unsigned int *)v12 + 3) = v9; - *((unsigned int *)v12 + 6) = v21; - v13 += 48; - v12 += 32; - v22 = a1a-- == 1; - *((float *)v12 - 6) = v20; - } - while ( !v22 ); + v18 = v18 - z_bias; + if (v18 < 0.000099999997) + v18 = 0.000099999997; } - if ( v8 == 1 ) - { - v26 = 1346; - v25 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Light.cpp"; - v24 = 28; - } - else - { - v26 = 1354; - v25 = "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Light.cpp"; - v24 = 16; - } - v23 = pRenderer->pRenderD3D->pDevice->DrawPrimitive( - D3DPT_TRIANGLEFAN, - 452, - &a2, - v11, - v24); - //CheckHRESULT((CheckHRESULT_stru0 *)&thisa, v23, v25, v26, 0); - LOBYTE(result) = 1; + + a2[i].pos.x = pLightmap->pVertices[i].vWorldViewProjX; + a2[i].pos.z = v18; + a2[i].pos.y = pLightmap->pVertices[i].vWorldViewProjY; + a2[i].rhw = 1.0 / pLightmap->pVertices[i].vWorldViewPosition.x; + a2[i].diffuse = uLightmapColor; + a2[i].specular = 0; + a2[i].texcoord.x = pLightmap->pVertices[i].u; + a2[i].texcoord.y = pLightmap->pVertices[i].v; } - else - { - LOBYTE(result) = 0; - } - return result; + + if (uCurrentlyLoadedLevelType == LEVEL_Indoor) + v24 = D3DDP_DONOTLIGHT | D3DDP_DONOTCLIP | D3DDP_DONOTUPDATEEXTENTS; + else + v24 = D3DDP_DONOTLIGHT; + + ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, + D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1, + a2, + pLightmap->uNumVertices, + v24)); + + return true; } //----- (0045DCA9) -------------------------------------------------------- void LightmapBuilder::DoDrawLightmaps() { - const char *v1; // ebx@0 - int v2; // ebp@0 - int v3; // edi@0 - int v4; // esi@0 - HRESULT v5; // eax@4 - HRESULT v6; // eax@4 - HRESULT v7; // eax@4 - char *v8; // eax@4 - //IDirect3DDevice3Vtbl *v9; // ebp@6 - struct IDirect3DTexture2 *v10; // ST90_4@6 - //IDirect3DDevice3 *v11; // ST88_4@6 - HRESULT v12; // eax@6 - HRESULT v13; // eax@6 - HRESULT v14; // eax@6 - HRESULT v15; // eax@6 - HRESULT v16; // eax@6 - HRESULT v17; // eax@6 - HRESULT v18; // eax@6 - HRESULT v19; // eax@6 - LightmapBuilder *v20; // [sp+98h] [bp-8h]@1 - LightmapBuilder *v21; // [sp+9Ch] [bp-4h]@1 - LightmapBuilder *thisa; // [sp+A4h] [bp+4h]@0 - //CheckHRESULT_stru0 a8; // [sp+A8h] [bp+8h]@0 - //CheckHRESULT_stru0 thisaa; // [sp+B4h] [bp+14h]@0 + if (!std__vector_183808_size) + return; + + if (pRenderer->bUsingSpecular) + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 0)); + + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 0)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, 0)); + + auto pTex = pGame->pIndoorCameraD3D->LoadTextureAndGetHardwarePtr("effpar03"); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, pTex)); - v21 = this; - v20 = this; - if ( this->std__vector_183808_size ) - { - if ( pRenderer->bUsingSpecular ) - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 0)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 2u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 2u)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 0)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1u)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, 0)); + DrawLightmaps2(0.00050000002); - v8 = (char *)stru_69BD44.c_str(); - if ( !stru_69BD44.size() ) - v8 = (char *)&dword_4D86F0; - //v9 = pRenderer->pRenderD3D->pDevice->lpVtbl; - v10 = pGame->pIndoorCameraD3D->LoadTextureAndGetHardwarePtr(v8); - //v11 = pRenderer->pRenderD3D->pDevice; - ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, v10)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 2u)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 2u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 2u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 0)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 1u)); + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 2)); - DrawLightmaps2(0.00050000002); - - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 2u)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 1u)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 0)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, 1u)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 1u)); - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 2)); - if ( pRenderer->bUsingSpecular ) - ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 1u)); - } + if (pRenderer->bUsingSpecular) + ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 1u)); } \ No newline at end of file