Mercurial > mm7
diff Render.cpp @ 1178:f7ad7bd0a806
Слияние
author | Ritor1 |
---|---|
date | Tue, 04 Jun 2013 09:44:53 +0600 |
parents | dac817fbf85a 29a8defbad9e |
children | fa30ea497e94 |
line wrap: on
line diff
--- a/Render.cpp Tue Jun 04 09:35:16 2013 +0600 +++ b/Render.cpp Tue Jun 04 09:44:53 2013 +0600 @@ -1,3 +1,7 @@ +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + #include <assert.h> #include "VideoPlayer.h" @@ -1830,7 +1834,7 @@ 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[v8->uTileBitmapID].pName, "wtrdr", 5)) // all shore tile filenames are wtrdrXXX + if (!_strnicmp(pBitmaps_LOD->pTextures[v8->uTileBitmapID].pName, "wtrdr", 5)) // all shore tile filenames are wtrdrXXX { pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, FALSE); // no Z writing: the shore tile will be draw in the same place, so taking care about z-fighting pRenderer->DrawTerrainPolygon(v8->uNumVertices, v8, pBitmaps_LOD->pHardwareTextures[pRenderer->pHDWaterBitmapIDs[pRenderer->hd_water_current_frame]], false, true); @@ -6517,7 +6521,7 @@ bool Render::LockSurface_DDraw2(IDirectDrawSurface2 *pSurface, DDSURFACEDESC *pDesc, unsigned int uLockFlags) { IDirectDrawSurface2 *v4; // esi@1 - bool v5; // eax@1 + HRESULT v5; // eax@1 HRESULT v6; // eax@2 int v7; // [sp-8h] [bp-10h]@8 unsigned int v8; // [sp-4h] [bp-Ch]@8 @@ -8436,116 +8440,83 @@ //----- (004A49D0) -------------------------------------------------------- void Render::DrawProjectile(float srcX, float srcY, float a3, float a4, float dstX, float dstY, float a7, float a8, IDirect3DTexture2 *a9) { - int v10; // eax@1 - unsigned int v11; // ebx@1 - unsigned int v12; // ecx@1 - int v13; // edx@2 - int v14; // edx@4 - unsigned int v15; // edx@6 + int absXDifference; // eax@1 + int absYDifference; // eax@1 + unsigned int smallerabsdiff; // ebx@1 + unsigned int largerabsdiff; double v16; // st7@7 double v17; // st7@7 double v18; // st6@7 - double v19; // st4@7 double v20; // st4@8 double v21; // st4@10 double v22; // st4@10 double v23; // st4@10 - double v24; // st4@10 double v25; // st4@11 double v26; // st4@13 - double v27; // st5@13 double v28; // st4@13 RenderVertexD3D3 v29[4]; // [sp+0h] [bp-94h]@7 - double v30; // [sp+80h] [bp-14h]@1 - int v31; // [sp+88h] [bp-Ch]@1 + int xDifference; // [sp+88h] [bp-Ch]@1 signed int v32; // [sp+8Ch] [bp-8h]@1 - int X; // [sp+90h] [bp-4h]@1 - float a3a; // [sp+A4h] [bp+10h]@10 - float a4a; // [sp+A8h] [bp+14h]@10 - - *(float *)&X = dstX - srcX; - v30 = *(float *)&X + 6.7553994e15; - v31 = LODWORD(v30); - *(float *)&v32 = dstY - srcY; - v30 = *(float *)&v32 + 6.7553994e15; - X = LODWORD(v30); - HIDWORD(v30) = abs(COERCE_UNSIGNED_INT64(*(float *)&v32 + 6.7553994e15)); - v10 = abs(v31); - v32 = v10; - v11 = HIDWORD(v30); - v12 = 0; - if ( v10 < SHIDWORD(v30) ) - { - v13 = v10; - v10 = HIDWORD(v30); - v11 = v13; - } - if ( v10 < 0 ) - { - v14 = v10; - v10 = 0; - v12 = v14; - } - if ( (signed int)v11 < (signed int)v12 ) - { - v15 = v12; - v12 = v11; - v11 = v15; - } - v32 = (11 * v11 >> 5) + (v12 >> 2) + v10; + int yDifference; // [sp+90h] [bp-4h]@1 + + xDifference = bankersRounding(dstX - srcX); + yDifference = bankersRounding(dstY - srcY); + absYDifference = abs(yDifference); + absXDifference = abs(xDifference); + smallerabsdiff = min(absXDifference, absYDifference); + largerabsdiff = max(absXDifference, absYDifference); + v32 = (11 * smallerabsdiff >> 5) + largerabsdiff; v16 = 1.0 / (double)v32; - *(float *)&v31 = (double)v31 * v16; - *(float *)&X = (double)X * v16; - v17 = *(float *)&X * a4; + v17 = (double)yDifference * v16 * a4; + v18 = (double)xDifference * v16 * a4; + if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor ) + { + v20 = a3 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist; + v25 = a7 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist; + } + else + { + v20 = a3 * 0.061758894; + v25 = a7 * 0.061758894; + } + v21 = 1.0 / a3; + v22 = (double)yDifference * v16 * a8; + v23 = (double)xDifference * v16 * a8; + v26 = 1.0 - 1.0 / v25; + v28 = 1.0 / a7; v29[0].pos.x = srcX + v17; - v18 = *(float *)&v31 * a4; v29[0].pos.y = srcY - v18; - v19 = a3; - if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor ) - v20 = v19 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist; - else - v20 = v19 * 0.061758894; + v29[0].pos.z = 1.0 - 1.0 / v20; + v29[0].rhw = v21; v29[0].diffuse = -1; v29[0].specular = 0; - v29[0].pos.z = 1.0 - 1.0 / v20; - v21 = 1.0 / a3; - *((float *)&v30 + 1) = v21; - v29[0].rhw = v21; v29[0].texcoord.x = 1.0; v29[0].texcoord.y = 0.0; - v22 = *(float *)&X * a8; - a3a = v22; + v29[1].pos.x = v22 + dstX; - v23 = *(float *)&v31 * a8; - a4a = v23; v29[1].pos.y = dstY - v23; - v24 = a7; - if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor ) - v25 = v24 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist; - else - v25 = v24 * 0.061758894; - v29[2].diffuse = -1; - v29[3].diffuse = -1; - *(_QWORD *)&v29[3].pos.z = __PAIR__(HIDWORD(v30), LODWORD(v29[0].pos.z)); + v29[1].pos.z = v26; + v29[1].rhw = v28; v29[1].diffuse = -16711936; v29[1].specular = 0; - v29[2].specular = 0; - v29[3].specular = 0; - v26 = 1.0 - 1.0 / v25; - v29[1].pos.z = v26; - v27 = v26; - v28 = 1.0 / a7; - v29[1].rhw = v28; v29[1].texcoord.x = 1.0; v29[1].texcoord.y = 1.0; - v29[2].pos.x = dstX - a3a; - v29[2].pos.y = a4a + dstY; - v29[2].pos.z = v27; + + v29[2].pos.x = dstX - v22; + v29[2].pos.y = v23 + dstY; + v29[2].pos.z = v26; v29[2].rhw = v28; + v29[2].diffuse = -1; + v29[2].specular = 0; v29[2].texcoord.x = 0.0; v29[2].texcoord.y = 1.0; + v29[3].pos.x = srcX - v17; v29[3].pos.y = v18 + srcY; + v29[3].pos.z = v29[0].pos.z; + v29[3].rhw = v21; + v29[3].diffuse = -1; + v29[3].specular = 0; v29[3].texcoord.x = 0.0; v29[3].texcoord.y = 0.0; ErrD3D(pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE)); @@ -10587,27 +10558,19 @@ void Render::ChangeBetweenWinFullscreenModes() { float v0; // ST14_4@17 - bool v1; // edx@24 - signed int v2; // ecx@24 - int v3; // esi@25 int v4; // edx@26 ObjectDesc *v5; // eax@26 RGBTexture *v6; // esi@33 - const char *v7; // eax@34 const char *v8; // [sp-4h] [bp-28h]@33 - int v9; // [sp+0h] [bp-24h]@33 struct tagRECT Rect; // [sp+14h] [bp-10h]@15 - if ( pRenderer->bWindowMode ) - goto LABEL_52; - if ( dword_6BE364_game_settings_1 & 2 ) + if ( !pRenderer->bWindowMode && (dword_6BE364_game_settings_1 & 2) ) { ModalWindow(pGlobalTXT_LocalizationStrings[62], 0);// "Might and Magic VII requires your desktop to be in 16bit (32k or 65k) Color mode in order to operate in a window." return; } - if ( !pRenderer->pRenderD3D || pRenderer->pRenderD3D->pAvailableDevices->bIsDeviceCompatible ) - { -LABEL_52: + if ( pRenderer->bWindowMode || !pRenderer->pRenderD3D || pRenderer->pRenderD3D->pAvailableDevices->bIsDeviceCompatible ) + { if ( pEventTimer->bPaused ) BYTE1(dword_6BE364_game_settings_1) |= 8u; else @@ -10650,59 +10613,49 @@ pBitmaps_LOD->_410423_move_textures_to_device(); pSprites_LOD->MoveSpritesToVideoMemory(); } - if ( pPaletteManager->uNumTargetBBits == pRenderer->uTargetBBits + if (!( pPaletteManager->uNumTargetBBits == pRenderer->uTargetBBits && pPaletteManager->uNumTargetGBits == pRenderer->uTargetGBits - && pPaletteManager->uNumTargetRBits == pRenderer->uTargetRBits ) - goto LABEL_38; - pPaletteManager->SetColorChannelInfo(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); - pPaletteManager->RecalculateAll(); - pBitmaps_LOD->SetupPalettes(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); - pIcons_LOD->SetupPalettes(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); - v2 = 0; - if ( (signed int)pObjectList->uNumObjects > 0 ) - { - v3 = 0; - do + && pPaletteManager->uNumTargetRBits == pRenderer->uTargetRBits )) + { + pPaletteManager->SetColorChannelInfo(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); + pPaletteManager->RecalculateAll(); + pBitmaps_LOD->SetupPalettes(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); + pIcons_LOD->SetupPalettes(pRenderer->uTargetRBits, pRenderer->uTargetGBits, pRenderer->uTargetBBits); + for (int i = 0; i < pObjectList->uNumObjects; i++) { BYTE3(v4) = 0; - v5 = &pObjectList->pObjects[v3]; - ++v3; + v5 = &pObjectList->pObjects[i]; *(short *)((char *)&v4 + 1) = v5->uParticleTrailColorR; LOBYTE(v4) = v5->uParticleTrailColorG; v5->uParticleTrailColor = v5->uParticleTrailColorB | (v4 << 8); - ++v2; - } - while ( v2 < (signed int)pObjectList->uNumObjects ); - } - LOBYTE(v1) = 1; - SetUserInterface(pParty->alignment, v1); - if ( pVideoPlayer->pVideoFrame.pPixels ) - pVideoPlayer->pVideoFrame.Load(pVideoPlayer->pVideoFrameTextureFilename, 1); - if ( uCurrentMenuID ) - { + } + SetUserInterface(pParty->alignment, true); + if ( pVideoPlayer->pVideoFrame.pPixels ) + pVideoPlayer->pVideoFrame.Load(pVideoPlayer->pVideoFrameTextureFilename, 1); if ( uCurrentMenuID != 6 ) { if ( uCurrentMenuID == 8 ) - dword_A74C88 = 1; - goto LABEL_38; - } - v6 = &pTexture_PCX; - pTexture_PCX.Release(); - v9 = 0; - v8 = "makeme.pcx"; - } - else - { - v6 = &pTexture_PCX; - pTexture_PCX.Release(); - v7 = "title.pcx"; - if ( uCurrentMenuID ) - v7 = "lsave640.pcx"; - v9 = 0; - v8 = v7; - } - v6->Load(v8, v9); -LABEL_38: + dword_A74C88 = 1; + } + else + { + if ( uCurrentMenuID ) + { + v6 = &pTexture_PCX; + pTexture_PCX.Release(); + v8 = "makeme.pcx"; + } + else + { + v6 = &pTexture_PCX; + pTexture_PCX.Release(); + v8 = "title.pcx"; + if ( uCurrentMenuID ) + v8 = "lsave640.pcx"; + } + v6->Load(v8, 0); + } + } viewparams->bRedrawGameUI = 1; viewparams->InitGrayPalette(); pMouse->SetCurrentCursorBitmap(); @@ -10737,28 +10690,14 @@ //----- (0040DBD3) -------------------------------------------------------- void __fastcall Render::SetPixel(Vec2_int_ *pTargetXY, unsigned __int16 uColor) { - Vec2_int_ *pTargetXY_; // esi@1 - unsigned __int16 v3; // di@1 - signed int v4; // ecx@2 - signed int v5; // eax@4 - - pTargetXY_ = pTargetXY; - v3 = uColor; pRenderer->BeginScene(); if ( pRenderer->uNumSceneBegins ) { - v4 = pTargetXY_->x; - if ( pTargetXY_->x >= 0 ) - { - if ( v4 <= 639 ) - { - v5 = pTargetXY_->y; - if ( v5 >= 0 ) - { - if ( v5 <= 479 ) - pRenderer->pTargetSurface[v4 + pRenderer->uTargetSurfacePitch * v5] = v3; - } - } + int xVal = pTargetXY->x; + int yVal = pTargetXY->y; + if ( xVal >= 0 && xVal <= 639 && yVal >= 0 && yVal <= 479) + { + pRenderer->pTargetSurface[xVal + pRenderer->uTargetSurfacePitch * yVal] = uColor; } pRenderer->EndScene(); } @@ -10799,7 +10738,7 @@ { auto i = idx1 + (idx2 - idx1) / 2; - auto res = strcmpi(pName, pSpriteNames[i]); + auto res = _stricmp(pName, pSpriteNames[i]); if (!res) { fseek(pFile, pSpriteOffsets[i], SEEK_SET); @@ -10842,7 +10781,7 @@ else fread(pTex->pPixels, 2, pTex->uWidth * pTex->uHeight, pFile); - if ( field_61A94_scale_hwls_to_half ) + if ( field_61A94_scale_hwls_to_half ) //is it even possible to ever get here? field_61A94_scale_hwls_to_half is only set to zero { v11 = pTex->uHeight / 2; v12 = pTex->uWidth / 2; @@ -10899,59 +10838,34 @@ //----- (0045271F) -------------------------------------------------------- bool RenderHWLContainer::Release() { - RenderHWLContainer *v1; // esi@1 - int v2; // ebx@1 - void **v3; // edi@3 __int32 v4; // eax@6 FILE *v5; // ST24_4@6 - size_t *v6; // edi@6 - int v7; // ebx@7 - signed int v9; // [sp+0h] [bp-8h]@6 FILE *File; // [sp+4h] [bp-4h]@6 - v1 = this; - v2 = 0; - if ( this->bDumpDebug ) + if ( this->bDumpDebug) { File = fopen("logd3d.txt", "w"); - v4 = ftell(v1->pFile); - v5 = v1->pFile; - v6 = &v1->uNumItems; - v1->uDataOffset = v4; - fwrite(&v1->uNumItems, 4u, 1u, v5); - v9 = 0; - if ( (signed int)v1->uNumItems > 0 ) - { - v7 = (int)v1->pSpriteNames; - do - { - fwrite(*(const void **)v7, 1u, 0x14u, v1->pFile); - fprintf(File, "D3D texture name: %s\t\toffset: %x\n", *(unsigned int *)v7, *(unsigned int *)(v7 + 200000)); - ++v9; - v7 += 4; - } - while ( v9 < (signed int)*v6 ); - v2 = 0; - } - fwrite(v1->pSpriteOffsets, 4u, *v6, v1->pFile); - fseek(v1->pFile, 4, v2); - fwrite(&v1->uDataOffset, 4u, 1u, v1->pFile); - fclose(v1->pFile); + v4 = ftell(this->pFile); + v5 = this->pFile; + this->uDataOffset = v4; + fwrite(&this->uNumItems, 4u, 1u, v5); + for (int i = 0; i < this->uNumItems; i++) + { + fwrite(this->pSpriteNames[i], 1u, 0x14u, this->pFile); + fprintf(File, "D3D texture name: %s\t\toffset: %x\n", this->pSpriteNames[i], *(unsigned int *)(&(this->pSpriteNames[i]) + 200000/sizeof(char*))); + } + fwrite(this->pSpriteOffsets, 4u, this->uNumItems, this->pFile); + fseek(this->pFile, 4, 0); + fwrite(&this->uDataOffset, 4u, 1u, this->pFile); + fclose(this->pFile); fclose(File); } else { fclose(this->pFile); - if ( (signed int)v1->uNumItems > 0 ) - { - v3 = (void **)v1->pSpriteNames; - do - { - free(*v3); - ++v2; - ++v3; - } - while ( v2 < (signed int)v1->uNumItems ); + for (int i = 0; i < this->uNumItems; i++) + { + free(this->pSpriteNames[i]); } } return true; @@ -10961,15 +10875,12 @@ RenderHWLContainer::RenderHWLContainer(): bDumpDebug(false) { - RenderHWLContainer *v1; // esi@1 - - v1 = this; this->pFile = 0; uSignature = 0; - v1->uDataOffset = 0; - memset(&v1->uNumItems, 0, 0x61A84u); - v1->uNumItems = 0; - v1->field_61A94_scale_hwls_to_half = 0; + this->uDataOffset = 0; + memset(&this->uNumItems, 0, 0x61A84u); + this->uNumItems = 0; + this->field_61A94_scale_hwls_to_half = 0; } //----- (0045237F) --------------------------------------------------------