comparison Render.cpp @ 2154:9bd7522cdbbb

Render decoupling. Unsorted variables cleaning.
author Nomad
date Thu, 09 Jan 2014 14:36:48 +0200
parents d28d3c006077
children 0a1438c16c2b
comparison
equal deleted inserted replaced
2153:d28d3c006077 2154:9bd7522cdbbb
78 HRESULT __stdcall DDrawDisplayModesEnumerator(DDSURFACEDESC2 *pSurfaceDesc, __int16 *a2); 78 HRESULT __stdcall DDrawDisplayModesEnumerator(DDSURFACEDESC2 *pSurfaceDesc, __int16 *a2);
79 HRESULT __stdcall D3DDeviceEnumerator(const GUID *lpGUID, const char *lpDeviceDesc, const char *lpDeviceName, D3DDEVICEDESC *pHWDesc, D3DDEVICEDESC *pSWDesc, struct RenderD3D_aux *a6); 79 HRESULT __stdcall D3DDeviceEnumerator(const GUID *lpGUID, const char *lpDeviceDesc, const char *lpDeviceName, D3DDEVICEDESC *pHWDesc, D3DDEVICEDESC *pSWDesc, struct RenderD3D_aux *a6);
80 signed int __stdcall RenderD3D__DeviceEnumerator(GUID *lpGUID, const char *lpDevDesc, const char *lpDriverName, RenderD3D__DevInfo *pOut); // idb 80 signed int __stdcall RenderD3D__DeviceEnumerator(GUID *lpGUID, const char *lpDevDesc, const char *lpDriverName, RenderD3D__DevInfo *pOut); // idb
81 81
82 //----- (0049E79F) -------------------------------------------------------- 82 //----- (0049E79F) --------------------------------------------------------
83 bool CheckTextureStages() 83 bool Render::CheckTextureStages()
84 { 84 {
85 bool v0; // edi@1 85 bool v0; // edi@1
86 IDirectDrawSurface4 *pSurface2; // [sp+Ch] [bp-14h]@1 86 IDirectDrawSurface4 *pSurface2; // [sp+Ch] [bp-14h]@1
87 IDirectDrawSurface4 *pSurface1; // [sp+10h] [bp-10h]@1 87 IDirectDrawSurface4 *pSurface1; // [sp+10h] [bp-10h]@1
88 DWORD v4; // [sp+14h] [bp-Ch]@1 88 DWORD v4; // [sp+14h] [bp-Ch]@1
89 IDirect3DTexture2 *pTexture2; // [sp+18h] [bp-8h]@1 89 IDirect3DTexture2 *pTexture2; // [sp+18h] [bp-8h]@1
90 IDirect3DTexture2 *pTexture1; // [sp+1Ch] [bp-4h]@1 90 IDirect3DTexture2 *pTexture1; // [sp+1Ch] [bp-4h]@1
91 91
92 v0 = false; 92 v0 = false;
93 pRenderer->pRenderD3D->CreateTexture(64u, 64u, &pSurface1, &pTexture1, true, false, 32u); 93 pRenderD3D->CreateTexture(64u, 64u, &pSurface1, &pTexture1, true, false, 32u);
94 pRenderer->pRenderD3D->CreateTexture(64u, 64u, &pSurface2, &pTexture2, true, false, 32u); 94 pRenderD3D->CreateTexture(64u, 64u, &pSurface2, &pTexture2, true, false, 32u);
95 95
96 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, pTexture1)); 96 ErrD3D(pRenderD3D->pDevice->SetTexture(0, pTexture1));
97 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, D3DTADDRESS_WRAP)); 97 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, D3DTADDRESS_WRAP));
98 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLOROP, 2u)); 98 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLOROP, 2));
99 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, 2u)); 99 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, 2));
100 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, 2u)); 100 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, 2));
101 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MINFILTER, 2u)); 101 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MINFILTER, 2));
102 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, 1u)); 102 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, 1));
103 103
104 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, pTexture2)); 104 ErrD3D(pRenderD3D->pDevice->SetTexture(0, pTexture2));
105 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_ADDRESS, D3DTADDRESS_CLAMP)); 105 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_ADDRESS, D3DTADDRESS_CLAMP));
106 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1u)); 106 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1));
107 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLOROP, 7u)); 107 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLOROP, 7));
108 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLORARG1, 2u)); 108 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLORARG1, 2));
109 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLORARG2, 1u)); 109 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLORARG2, 1));
110 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_MAGFILTER, 2u)); 110 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_MAGFILTER, 2));
111 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_MINFILTER, 2u)); 111 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_MINFILTER, 2));
112 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_MIPFILTER, 1u)); 112 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_MIPFILTER, 1));
113 113
114 if ( !pRenderer->pRenderD3D->pDevice->ValidateDevice(&v4) && v4 == 1 ) 114 if ( !pRenderD3D->pDevice->ValidateDevice(&v4) && v4 == 1 )
115 v0 = true; 115 v0 = true;
116 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLOROP, 1u)); 116 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(1, D3DTSS_COLOROP, 1u));
117 pTexture1->Release(); 117 pTexture1->Release();
118 pTexture2->Release(); 118 pTexture2->Release();
119 pSurface1->Release(); 119 pSurface1->Release();
120 pSurface2->Release(); 120 pSurface2->Release();
121 return v0; 121 return v0;
198 } 198 }
199 } 199 }
200 } 200 }
201 201
202 //----- (004A16A5) -------------------------------------------------------- 202 //----- (004A16A5) --------------------------------------------------------
203 bool AreRenderSurfacesOk() 203 bool Render::AreRenderSurfacesOk()
204 { 204 {
205 char v0; // zf@4 205 return pFrontBuffer4 && pBackBuffer4;
206 bool result; // eax@8
207
208 if (!pRenderer)
209 return true;
210
211 {
212 if ( !pRenderer->pBackBuffer4 )
213 goto LABEL_9;
214 v0 = pRenderer->pFrontBuffer4 == 0;
215 }
216
217 if ( !v0 )
218 {
219 LOBYTE(result) = 1;
220 return result;
221 }
222 LABEL_9:
223 LOBYTE(result) = 0;
224 return result;
225 } 206 }
226 207
227 208
228 //----- (004A19D8) -------------------------------------------------------- 209 //----- (004A19D8) --------------------------------------------------------
229 unsigned int BlendColors(unsigned int a1, unsigned int a2) 210 unsigned int BlendColors(unsigned int a1, unsigned int a2)
612 v46 |= 0x40u; 593 v46 |= 0x40u;
613 if ( v36 & 0x20000 ) 594 if ( v36 & 0x20000 )
614 LOBYTE(v46) = v46 | 0x80; 595 LOBYTE(v46) = v46 | 0x80;
615 if ( a6 ) 596 if ( a6 )
616 { 597 {
617 //LOBYTE(v11) = byte_4E94D3; 598 //LOBYTE(v11) = _4E94D3_light_type;
618 pMobileLightsStack->AddLight(x, y, z, object->uSectorID, a6, 0xFFu, 0xFFu, 0xFFu, byte_4E94D3); 599 pMobileLightsStack->AddLight(x, y, z, object->uSectorID, a6, 0xFFu, 0xFFu, 0xFFu, _4E94D3_light_type);
619 } 600 }
620 v12 = (x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16; 601 v12 = (x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16;
621 if (pGame->pIndoorCameraD3D->sRotationX) 602 if (pGame->pIndoorCameraD3D->sRotationX)
622 { 603 {
623 v13 = (y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16; 604 v13 = (y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16;
1111 decor->vPosition.z + decor_desc->uDecorationHeight / 2, 1092 decor->vPosition.z + decor_desc->uDecorationHeight / 2,
1112 a5, 1093 a5,
1113 v14, 1094 v14,
1114 v15, 1095 v15,
1115 v16, 1096 v16,
1116 byte_4E94D0); 1097 _4E94D0_light_type);
1117 } 1098 }
1118 v17 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16; 1099 v17 = (decor->vPosition.x - pGame->pIndoorCameraD3D->vPartyPos.x) << 16;
1119 if (pGame->pIndoorCameraD3D->sRotationX) 1100 if (pGame->pIndoorCameraD3D->sRotationX)
1120 { 1101 {
1121 v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16; 1102 v40 = (decor->vPosition.y - pGame->pIndoorCameraD3D->vPartyPos.y) << 16;
1714 { 1695 {
1715 result = 1; 1696 result = 1;
1716 } 1697 }
1717 else 1698 else
1718 { 1699 {
1719 if ( !(halCaps.dpcTriCaps.dwSrcBlendCaps & 0x10) ) 1700 if ( !(halCaps.dpcTriCaps.dwSrcBlendCaps & D3DPBLENDCAPS_SRCALPHA) )
1720 v1 = 2; 1701 v1 = 2;
1721 if ( !(halCaps.dpcTriCaps.dwSrcBlendCaps & 2) ) 1702 if ( !(halCaps.dpcTriCaps.dwSrcBlendCaps & D3DPBLENDCAPS_ONE) )
1722 v1 |= 4u; 1703 v1 |= 4u;
1723 if ( !(halCaps.dpcTriCaps.dwSrcBlendCaps & 1) ) 1704 if ( !(halCaps.dpcTriCaps.dwSrcBlendCaps & D3DPBLENDCAPS_ZERO) )
1724 v1 |= 8u; 1705 v1 |= 8u;
1725 if ( !(halCaps.dpcTriCaps.dwDestBlendCaps & 0x20) ) 1706 if ( !(halCaps.dpcTriCaps.dwDestBlendCaps & D3DPBLENDCAPS_INVSRCALPHA) )
1726 v1 |= 0x10u; 1707 v1 |= 0x10u;
1727 if ( !(halCaps.dpcTriCaps.dwDestBlendCaps & 2) ) 1708 if ( !(halCaps.dpcTriCaps.dwDestBlendCaps & D3DPBLENDCAPS_ONE) )
1728 v1 |= 0x20u; 1709 v1 |= 0x20u;
1729 if ( !(halCaps.dpcTriCaps.dwDestBlendCaps & 4) ) 1710 if ( !(halCaps.dpcTriCaps.dwDestBlendCaps & D3DPBLENDCAPS_SRCCOLOR) )
1730 v1 |= 0x40u; 1711 v1 |= 0x40u;
1731 if ( halCaps.dpcTriCaps.dwTextureCaps & 0x20 ) 1712 if ( halCaps.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_SQUAREONLY )
1732 LOBYTE(v1) = v1 | 0x80; 1713 v1 |= 0x80;
1733 result = v1; 1714 result = v1;
1734 } 1715 }
1735 return result; 1716 return result;
1736 } 1717 }
1737 1718
2117 2098
2118 v1 = this; 2099 v1 = this;
2119 this->pDirectDraw4 = 0; 2100 this->pDirectDraw4 = 0;
2120 this->pFrontBuffer4 = 0; 2101 this->pFrontBuffer4 = 0;
2121 this->pBackBuffer4 = 0; 2102 this->pBackBuffer4 = 0;
2122 this->pColorKeySurface4 = 0; 2103 //this->pColorKeySurface4 = 0;
2123 //this->pDirectDraw2 = 0; 2104 //this->pDirectDraw2 = 0;
2124 //this->pFrontBuffer2 = 0; 2105 //this->pFrontBuffer2 = 0;
2125 //this->pBackBuffer2 = 0; 2106 //this->pBackBuffer2 = 0;
2126 //this->pSomeSurface2 = 0; 2107 //this->pSomeSurface2 = 0;
2127 //RenderHWLContainer::RenderHWLContainer(&this->pD3DBitmaps); 2108 //RenderHWLContainer::RenderHWLContainer(&this->pD3DBitmaps);
2128 //RenderHWLContainer::RenderHWLContainer(&v1->pD3DSprites); 2109 //RenderHWLContainer::RenderHWLContainer(&v1->pD3DSprites);
2129 v1->bWindowMode = 1; 2110 v1->bWindowMode = 1;
2130 v1->field_40054 = 0; 2111 //v1->field_40054 = 0;
2131 v1->field_10 = 640; 2112 //v1->field_10 = 640;
2132 v1->field_14 = 480; 2113 //v1->field_14 = 480;
2133 v1->field_40030 = 0; 2114 //v1->field_40030 = 0;
2134 v1->field_4002C = 0; 2115 //v1->field_4002C = 0;
2135 v1->pActiveZBuffer = 0; 2116 v1->pActiveZBuffer = 0;
2136 v1->pDefaultZBuffer = 0; 2117 v1->pDefaultZBuffer = 0;
2137 v1->raster_clip_y = 0; 2118 v1->raster_clip_y = 0;
2138 v1->raster_clip_x = 0; 2119 v1->raster_clip_x = 0;
2139 v1->raster_clip_z = 639; 2120 v1->raster_clip_z = 639;
2140 v1->raster_clip_w = 479; 2121 v1->raster_clip_w = 479;
2141 v1->field_4003C = (int)&unk_4EED80; 2122 //v1->field_4003C = 0x004EED80;
2142 v1->field_40040 = dword_4EED78; 2123 //v1->field_40040 = dword_4EED78;
2143 v1->uClipZ = 640; 2124 v1->uClipZ = 640;
2144 v1->field_40044 = 2; 2125 //v1->field_40044 = 2;
2145 v1->field_40048 = 6; 2126 //v1->field_40048 = 6;
2146 v1->pFrontBuffer4 = 0; 2127 v1->pFrontBuffer4 = 0;
2147 v1->pBackBuffer4 = 0; 2128 v1->pBackBuffer4 = 0;
2148 v1->pColorKeySurface4 = 0; 2129 //v1->pColorKeySurface4 = 0;
2149 v1->pDirectDraw4 = 0; 2130 v1->pDirectDraw4 = 0;
2150 v1->pRenderD3D = 0; 2131 v1->pRenderD3D = 0;
2151 v1->uNumSceneBegins = 0; 2132 v1->uNumSceneBegins = 0;
2152 v1->uNumD3DSceneBegins = 0; 2133 v1->uNumD3DSceneBegins = 0;
2153 v1->using_software_screen_buffer = 0; 2134 v1->using_software_screen_buffer = 0;
2158 v1->uClipW = 480; 2139 v1->uClipW = 480;
2159 v1->bClip = 1; 2140 v1->bClip = 1;
2160 //v1->bColorKeySupported = 0; 2141 //v1->bColorKeySupported = 0;
2161 v1->bRequiredTextureStagesAvailable = 0; 2142 v1->bRequiredTextureStagesAvailable = 0;
2162 v1->bTinting = 1; 2143 v1->bTinting = 1;
2163 LOBYTE(v1->field_103668) = 0; 2144 //LOBYTE(v1->field_103668) = 0;
2164 uNumBillboardsToDraw = 0; 2145 uNumBillboardsToDraw = 0;
2165 bFogEnabled = false; 2146 bFogEnabled = false;
2166 2147
2167 hd_water_tile_id = -1; 2148 hd_water_tile_id = -1;
2168 hd_water_current_frame = 0; 2149 hd_water_current_frame = 0;
2193 2174
2194 2175
2195 //----- (0049ECC4) -------------------------------------------------------- 2176 //----- (0049ECC4) --------------------------------------------------------
2196 void Render::ClearBlack() 2177 void Render::ClearBlack()
2197 { 2178 {
2198 if (pRenderD3D) 2179 //if (pRenderD3D)
2199 { 2180 {
2200 if (using_software_screen_buffer) 2181 if (using_software_screen_buffer)
2201 pRenderD3D->ClearTarget(true, 0, false, 0.0); 2182 pRenderD3D->ClearTarget(true, 0, false, 0.0);
2202 } 2183 }
2203 else 2184 //else
2204 memset(pRenderer->pTargetSurface, 0, 4 * (field_10 * field_14 / 2)); 2185 //memset(pRenderer->pTargetSurface, 0, 4 * (field_10 * field_14 / 2));
2205 } 2186 }
2206 2187
2207 //----- (0049ED18) -------------------------------------------------------- 2188 //----- (0049ED18) --------------------------------------------------------
2208 void Render::PresentBlackScreen() 2189 void Render::PresentBlackScreen()
2209 { 2190 {
2265 { 2246 {
2266 sprintf(Filename, "screen%0.2i.pcx", ScreenshotFileNumber++ % 100); 2247 sprintf(Filename, "screen%0.2i.pcx", ScreenshotFileNumber++ % 100);
2267 File = fopen(Filename, "wb"); 2248 File = fopen(Filename, "wb");
2268 if ( File ) 2249 if ( File )
2269 { 2250 {
2270 pitch = this->field_10; 2251 pitch = this->GetRenderWidth();
2271 if ( this->field_10 & 1 ) 2252 if ( pitch & 1 )
2272 pitch = this->field_10 + 1; 2253 pitch = pitch + 1;
2273 if ( this->pRenderD3D ) 2254 if ( this->pRenderD3D )
2274 { 2255 {
2275 memset(&Dst, 0, 0x7C); 2256 memset(&Dst, 0, 0x7C);
2276 Dst.dwSize = 124; 2257 Dst.dwSize = 124;
2277 if ( !pRenderer->LockSurface_DDraw4(pRenderer->pBackBuffer4, &Dst, DDLOCK_WAIT) ) 2258 if ( !pRenderer->LockSurface_DDraw4(pRenderer->pBackBuffer4, &Dst, DDLOCK_WAIT) )
2283 { 2264 {
2284 pRenderer->BeginScene(); 2265 pRenderer->BeginScene();
2285 surface = pRenderer->pTargetSurface; 2266 surface = pRenderer->pTargetSurface;
2286 v5 = pRenderer->uTargetSurfacePitch; 2267 v5 = pRenderer->uTargetSurfacePitch;
2287 } 2268 }
2288 header1.right = this->field_10 - 1; 2269 header1.right = GetRenderWidth() - 1;
2289 header1.left = 0; 2270 header1.left = 0;
2290 header1.bottom = this->field_14 - 1; 2271 header1.bottom = this->GetRenderHeight() - 1;
2291 header1.up = 0; 2272 header1.up = 0;
2292 header2.pitch = pitch; 2273 header2.pitch = pitch;
2293 memset(color_map, 0, sizeof(color_map)); 2274 memset(color_map, 0, sizeof(color_map));
2294 memset(v15, 0, sizeof(v15)); 2275 memset(v15, 0, sizeof(v15));
2295 header2.reserved = 0; 2276 header2.reserved = 0;
2316 fwrite(&header2, 1, 1, pOutFile); 2297 fwrite(&header2, 1, 1, pOutFile);
2317 fwrite(&header2.planes, 1, 1, pOutFile); 2298 fwrite(&header2.planes, 1, 1, pOutFile);
2318 fwrite(&header2.pitch, 2, 1, pOutFile); 2299 fwrite(&header2.pitch, 2, 1, pOutFile);
2319 fwrite(&header2.palette_info, 2, 1, pOutFile); 2300 fwrite(&header2.palette_info, 2, 1, pOutFile);
2320 fwrite(v15, 0x3Au, 1, pOutFile); 2301 fwrite(v15, 0x3Au, 1, pOutFile);
2321 lineRGB = (char *)malloc(3 * this->field_10 + 6); 2302 lineRGB = (char *)malloc(3 * GetRenderWidth() + 6);
2322 if ( this->field_14 > 0 ) 2303 if ( this->GetRenderHeight() > 0 )
2323 { 2304 {
2324 image_width = 3 * pitch; 2305 image_width = 3 * pitch;
2325 //v24 = 2 * v5; 2306 //v24 = 2 * v5;
2326 v8 = (unsigned short *)surface; 2307 v8 = (unsigned short *)surface;
2327 for ( int y = 0; y < this->field_14; y++ ) 2308 for ( int y = 0; y < this->GetRenderHeight(); y++ )
2328 { 2309 {
2329 line_picture_data = v8; 2310 line_picture_data = v8;
2330 if ( this->field_10 > 0 ) 2311 if ( GetRenderWidth() > 0 )
2331 { 2312 {
2332 lineG = (char *)lineRGB + pitch; 2313 lineG = (char *)lineRGB + pitch;
2333 lineB = (char *)lineRGB + 2 * pitch; 2314 lineB = (char *)lineRGB + 2 * pitch;
2334 for ( uint x = 0; x < this->field_10; x++ ) 2315 for ( uint x = 0; x < this->GetRenderWidth(); x++ )
2335 { 2316 {
2336 int p = *line_picture_data; //0x2818 2317 int p = *line_picture_data; //0x2818
2337 int for_rad = (pRenderer->uTargetGBits + pRenderer->uTargetBBits );//16 = 8 + 8 2318 int for_rad = (pRenderer->uTargetGBits + pRenderer->uTargetBBits );//16 = 8 + 8
2338 int value = (pRenderer->uTargetRMask & *line_picture_data);//0 = 0xFF0000 & 0x2818 2319 int value = (pRenderer->uTargetRMask & *line_picture_data);//0 = 0xFF0000 & 0x2818
2339 int result = (pRenderer->uTargetRMask & *line_picture_data) >> (pRenderer->uTargetGBits + pRenderer->uTargetBBits ); 2320 int result = (pRenderer->uTargetRMask & *line_picture_data) >> (pRenderer->uTargetGBits + pRenderer->uTargetBBits );
2433 int g_mask = 0x7E0; 2414 int g_mask = 0x7E0;
2434 int b_mask = 0x1F; 2415 int b_mask = 0x1F;
2435 2416
2436 if ( !this->pRenderD3D || this->using_software_screen_buffer ) 2417 if ( !this->pRenderD3D || this->using_software_screen_buffer )
2437 { 2418 {
2438 ++dword_4EFA84; 2419 static int _4EFA84_num_winners_certificates = 0;
2420 ++_4EFA84_num_winners_certificates;
2421
2439 File = fopen(a1, "wb"); 2422 File = fopen(a1, "wb");
2440 if ( File ) 2423 if ( File )
2441 { 2424 {
2442 v25 = this->field_10; 2425 v25 = this->GetRenderWidth();
2443 pitch = this->field_10; 2426 pitch = v25;
2444 if ( this->field_10 & 1 ) 2427 if ( pitch & 1 )
2445 pitch = this->field_10 + 1; 2428 pitch = pitch + 1;
2446 if ( this->pRenderD3D ) 2429 if ( this->pRenderD3D )
2447 { 2430 {
2448 memset(&Dst, 0, 0x7C); 2431 memset(&Dst, 0, 0x7C);
2449 Dst.dwSize = 124; 2432 Dst.dwSize = 124;
2450 if ( !pRenderer->LockSurface_DDraw4(pRenderer->pBackBuffer4, (DDSURFACEDESC2 *)&Dst, DDLOCK_WAIT) ) 2433 if ( !pRenderer->LockSurface_DDraw4(pRenderer->pBackBuffer4, (DDSURFACEDESC2 *)&Dst, DDLOCK_WAIT) )
2456 { 2439 {
2457 pRenderer->BeginScene(); 2440 pRenderer->BeginScene();
2458 surface = pRenderer->pTargetSurface; 2441 surface = pRenderer->pTargetSurface;
2459 v6 = pRenderer->uTargetSurfacePitch; 2442 v6 = pRenderer->uTargetSurfacePitch;
2460 } 2443 }
2461 v33 = this->field_10 - 1; 2444 v33 = this->GetRenderWidth() - 1;
2462 v31 = 0; 2445 v31 = 0;
2463 v34 = (short)this->field_14 - 1; 2446 v34 = (short)this->GetRenderHeight() - 1;
2464 v32 = 0; 2447 v32 = 0;
2465 v39 = pitch; 2448 v39 = pitch;
2466 memset(&color_map, 0, sizeof(color_map)); 2449 memset(&color_map, 0, sizeof(color_map));
2467 memset(&v16, 0, sizeof(v16)); 2450 memset(&v16, 0, sizeof(v16));
2468 v37 = 0; 2451 v37 = 0;
2490 fwrite(&v38, 1, 1, File); 2473 fwrite(&v38, 1, 1, File);
2491 fwrite(&v39, 2, 1, File); 2474 fwrite(&v39, 2, 1, File);
2492 fwrite(&v40, 2, 1, File); 2475 fwrite(&v40, 2, 1, File);
2493 fwrite(&v16, 0x3A, 1, File); 2476 fwrite(&v16, 0x3A, 1, File);
2494 lineRGB = (char *)malloc(3 * (v25 + 2)); 2477 lineRGB = (char *)malloc(3 * (v25 + 2));
2495 if ( (signed int)this->field_14 > 0 ) 2478 if ( (signed int)this->GetRenderHeight() > 0 )
2496 { 2479 {
2497 image_width = 3 * pitch; 2480 image_width = 3 * pitch;
2498 v9 = (unsigned short *)surface; 2481 v9 = (unsigned short *)surface;
2499 for ( uint j = 0; j < this->field_14; j++) 2482 for ( uint j = 0; j < this->GetRenderHeight(); j++)
2500 { 2483 {
2501 a1 = (const char *)v9; 2484 a1 = (const char *)v9;
2502 if ( v25 > 0 ) 2485 if ( v25 > 0 )
2503 { 2486 {
2504 lineG = (char *)lineRGB + pitch; 2487 lineG = (char *)lineRGB + pitch;
2541 free(lineRGB); 2524 free(lineRGB);
2542 fclose(File); 2525 fclose(File);
2543 } 2526 }
2544 } 2527 }
2545 } 2528 }
2546 // 4EFA84: using guessed type int dword_4EFA84;
2547 2529
2548 //----- (0049F5A2) -------------------------------------------------------- 2530 //----- (0049F5A2) --------------------------------------------------------
2549 void Render::PackPCXpicture( unsigned short* picture_data, int wight, int heidth, void *data_buff, int max_buff_size,unsigned int* packed_size ) 2531 void Render::PackPCXpicture( unsigned short* picture_data, int wight, int heidth, void *data_buff, int max_buff_size,unsigned int* packed_size )
2550 { 2532 {
2551 void *v8; // esi@3 2533 void *v8; // esi@3
2810 } 2792 }
2811 2793
2812 //----- (0049FBCD) -------------------------------------------------------- 2794 //----- (0049FBCD) --------------------------------------------------------
2813 void Render::ClearTarget(unsigned int uColor) 2795 void Render::ClearTarget(unsigned int uColor)
2814 { 2796 {
2815 if (pRenderD3D) 2797 //if (pRenderD3D)
2816 { 2798 {
2817 if (using_software_screen_buffer) 2799 if (using_software_screen_buffer)
2818 pRenderD3D->ClearTarget(true, uColor, false, 0.0); 2800 pRenderD3D->ClearTarget(true, uColor, false, 0.0);
2819 } 2801 }
2820 else 2802 //else
2821 memset32(pTargetSurface, uColor, field_10 * field_14 / 2); 2803 //memset32(pTargetSurface, uColor, field_10 * field_14 / 2);
2822 } 2804 }
2823 2805
2824 //----- (0049FC23) -------------------------------------------------------- 2806 //----- (0049FC23) --------------------------------------------------------
2825 void Render::Release2() 2807 void Render::Release2()
2826 { 2808 {
2875 }*/ 2857 }*/
2876 } 2858 }
2877 } 2859 }
2878 2860
2879 //----- (0049FD3A) -------------------------------------------------------- 2861 //----- (0049FD3A) --------------------------------------------------------
2880 void Render::_49FD3A() 2862 void Render::_49FD3A_fullscreen()
2881 { 2863 {
2882 Render *v2; // esi@1 2864 Render *v2; // esi@1
2883 IDirectDrawSurface4 *v3; // eax@6 2865 IDirectDrawSurface4 *v3; // eax@6
2884 IDirectDrawSurface4 *v4; // ST0C_4@6 2866 IDirectDrawSurface4 *v4; // ST0C_4@6
2885 RECT v5; // [sp+8h] [bp-10h]@6 2867 RECT v5; // [sp+8h] [bp-10h]@6
2940 { 2922 {
2941 pRenderD3D->ClearTarget(true, 0, false, 1.0); 2923 pRenderD3D->ClearTarget(true, 0, false, 1.0);
2942 pRenderD3D->Present(0); 2924 pRenderD3D->Present(0);
2943 pRenderD3D->ClearTarget(true, 0, false, 1.0); 2925 pRenderD3D->ClearTarget(true, 0, false, 1.0);
2944 } 2926 }
2945 v1->pColorKeySurface4 = 0; 2927 //v1->pColorKeySurface4 = 0;
2946 v1->pBackBuffer4 = 0; 2928 v1->pBackBuffer4 = 0;
2947 v1->pFrontBuffer4 = 0; 2929 v1->pFrontBuffer4 = 0;
2948 v1->pDirectDraw4 = 0; 2930 v1->pDirectDraw4 = 0;
2949 if (v1->pTargetSurface) 2931 if (v1->pTargetSurface)
2950 { 2932 {
3104 int g_mask = 0x7E0; 3086 int g_mask = 0x7E0;
3105 int b_mask = 0x1F; 3087 int b_mask = 0x1F;
3106 3088
3107 if ( !pRenderer->uNumSceneBegins ) 3089 if ( !pRenderer->uNumSceneBegins )
3108 { 3090 {
3109 if ( pRenderer->using_software_screen_buffer ) 3091 //if ( pRenderer->using_software_screen_buffer )
3110 { 3092 //{
3111 memset(&Dst, 0, 0x7Cu); 3093 memset(&Dst, 0, 0x7Cu);
3112 Dst.dwSize = 124; 3094 Dst.dwSize = 124;
3113 if ( pRenderer->LockSurface_DDraw4(pRenderer->pBackBuffer4, &Dst, DDLOCK_WAIT) ) 3095 if ( pRenderer->LockSurface_DDraw4(pRenderer->pBackBuffer4, &Dst, DDLOCK_WAIT) )
3114 { 3096 {
3115 //v26 = Dst.lpSurface; 3097 //v26 = Dst.lpSurface;
3236 return; 3218 return;
3237 } 3219 }
3238 } 3220 }
3239 }*/ 3221 }*/
3240 } 3222 }
3241 } 3223 //}
3242 } 3224 }
3243 } 3225 }
3244 3226
3245
3246
3247
3248 //----- (0049FFD7) --------------------------------------------------------
3249 void Render::CreateSomeTexture()
3250 {
3251 pRenderD3D->CreateTexture(64, 64, &pSurface, &pTexture, true, false, 32);
3252 }
3253 3227
3254 //----- (0049FFFB) -------------------------------------------------------- 3228 //----- (0049FFFB) --------------------------------------------------------
3255 bool Render::InitializeFullscreen() 3229 bool Render::InitializeFullscreen()
3256 { 3230 {
3257 //Render *v2; // esi@1 3231 //Render *v2; // esi@1
3284 3258
3285 __debugbreak(); // Nomad 3259 __debugbreak(); // Nomad
3286 3260
3287 //v2 = this; 3261 //v2 = this;
3288 this->using_software_screen_buffer = 0; 3262 this->using_software_screen_buffer = 0;
3289 this->pColorKeySurface4 = 0; 3263 //this->pColorKeySurface4 = 0;
3290 this->pBackBuffer4 = 0; 3264 this->pBackBuffer4 = 0;
3291 this->pFrontBuffer4 = 0; 3265 this->pFrontBuffer4 = 0;
3292 this->pDirectDraw4 = 0; 3266 this->pDirectDraw4 = 0;
3293 //this->bColorKeySupported = 0; 3267 //this->bColorKeySupported = 0;
3294 Release(); 3268 Release();
3312 v29 = -1; 3286 v29 = -1;
3313 v7 = pRenderD3D->pAvailableDevices; 3287 v7 = pRenderD3D->pAvailableDevices;
3314 if ( v7[v6].bIsDeviceCompatible ) 3288 if ( v7[v6].bIsDeviceCompatible )
3315 { 3289 {
3316 v8 = pRenderD3D->CreateDevice(v6, /*0*/true, window); 3290 v8 = pRenderD3D->CreateDevice(v6, /*0*/true, window);
3317 uAcquiredDirect3DDevice = uDesiredDirect3DDevice;
3318 } 3291 }
3319 else 3292 else
3320 { 3293 {
3321 if ( v7[1].bIsDeviceCompatible ) 3294 if ( v7[1].bIsDeviceCompatible )
3322 { 3295 {
3323 v8 = pRenderD3D->CreateDevice(1, /*0*/true, window); 3296 v8 = pRenderD3D->CreateDevice(1, /*0*/true, window);
3324 uAcquiredDirect3DDevice = 1;
3325 } 3297 }
3326 else 3298 else
3327 { 3299 {
3328 if ( !v7->bIsDeviceCompatible ) 3300 if ( !v7->bIsDeviceCompatible )
3329 Error("There aren't any D3D devices to create."); 3301 Error("There aren't any D3D devices to create.");
3330 3302
3331 v8 = pRenderD3D->CreateDevice(0, /*0*/true, window); 3303 v8 = pRenderD3D->CreateDevice(0, /*0*/true, window);
3332 uAcquiredDirect3DDevice = 1;
3333 } 3304 }
3334 } 3305 }
3335 if ( !v8 ) 3306 if ( !v8 )
3336 Error("D3Drend->Init failed."); 3307 Error("D3Drend->Init failed.");
3337 3308
3358 if ( pRenderD3D ) 3329 if ( pRenderD3D )
3359 { 3330 {
3360 pRenderD3D->Release(); 3331 pRenderD3D->Release();
3361 delete pRenderD3D; 3332 delete pRenderD3D;
3362 } 3333 }
3363 pColorKeySurface4 = 0; 3334 //pColorKeySurface4 = 0;
3364 pRenderD3D = 0; 3335 pRenderD3D = 0;
3365 pBackBuffer4 = 0; 3336 pBackBuffer4 = 0;
3366 pFrontBuffer4 = 0; 3337 pFrontBuffer4 = 0;
3367 pDirectDraw4 = 0; 3338 pDirectDraw4 = 0;
3368 Error("Direct3D renderer: The device doesn't support the necessary alpha blending modes."); 3339 Error("Direct3D renderer: The device doesn't support the necessary alpha blending modes.");
3378 pBackBuffer4 = 0; 3349 pBackBuffer4 = 0;
3379 pFrontBuffer4 = 0; 3350 pFrontBuffer4 = 0;
3380 pDirectDraw4 = 0; 3351 pDirectDraw4 = 0;
3381 Error("Direct3D renderer: The device doesn't support non-square textures."); 3352 Error("Direct3D renderer: The device doesn't support non-square textures.");
3382 } 3353 }
3383 LOBYTE(field_10365C) = ~(unsigned __int8)(v10 >> 6) & 1; 3354 //LOBYTE(field_10365C) = ~(unsigned __int8)(v10 >> 6) & 1;
3384 bRequiredTextureStagesAvailable = CheckTextureStages(); 3355 bRequiredTextureStagesAvailable = CheckTextureStages();
3385 memset(&halCaps, 0, 0xFCu); 3356 memset(&halCaps, 0, 0xFCu);
3386 halCaps.dwSize = 252; 3357 halCaps.dwSize = 252;
3387 memset(&refCaps, 0, 0xFCu); 3358 memset(&refCaps, 0, 0xFCu);
3388 v11 = pRenderD3D; 3359 v11 = pRenderD3D;
3396 if ( (unsigned int)v14 < halCaps.dwMaxTextureHeight ) 3367 if ( (unsigned int)v14 < halCaps.dwMaxTextureHeight )
3397 v14 = halCaps.dwMaxTextureHeight; 3368 v14 = halCaps.dwMaxTextureHeight;
3398 uMaxDeviceTextureDim = v14; 3369 uMaxDeviceTextureDim = v14;
3399 if ( (unsigned int)v13 < 4 ) 3370 if ( (unsigned int)v13 < 4 )
3400 uMinDeviceTextureDim = 4; 3371 uMinDeviceTextureDim = 4;
3401 CreateSomeTexture();
3402 v15 = 1; 3372 v15 = 1;
3403 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, true)); 3373 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, true));
3404 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, true)); 3374 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, true));
3405 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZFUNC, 2u)); 3375 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZFUNC, 2));
3406 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SPECULARENABLE, false)); 3376 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SPECULARENABLE, false));
3407 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, false)); 3377 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, false));
3408 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE, false)); 3378 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE, false));
3409 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1u)); 3379 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1));
3410 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, 2u)); 3380 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, 2));
3411 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MINFILTER, 2u)); 3381 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MINFILTER, 2));
3412 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, 3u)); 3382 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, 3));
3413 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, 2u)); 3383 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, 2));
3414 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, 0)); 3384 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, 0));
3415 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, 2u)); 3385 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, 2));
3416 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, 2u)); 3386 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, 2));
3417 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, 0)); 3387 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, 0));
3418 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLOROP, 4u)); 3388 ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_COLOROP, 4));
3419 //} 3389 //}
3420 ddpfPrimarySuface.dwSize = 32; 3390 ddpfPrimarySuface.dwSize = 32;
3421 GetTargetPixelFormat(&ddpfPrimarySuface); 3391 GetTargetPixelFormat(&ddpfPrimarySuface);
3422 ParseTargetPixelFormat(); 3392 ParseTargetPixelFormat();
3423 3393
3507 3477
3508 pParty->uFlags |= PARTY_FLAGS_1_0002; 3478 pParty->uFlags |= PARTY_FLAGS_1_0002;
3509 pViewport->SetFOV(flt_6BE3A0 * 65536.0f); 3479 pViewport->SetFOV(flt_6BE3A0 * 65536.0f);
3510 using_software_screen_buffer = 0; 3480 using_software_screen_buffer = 0;
3511 Release(); 3481 Release();
3512 pColorKeySurface4 = 0; 3482 //pColorKeySurface4 = 0;
3513 pBackBuffer4 = 0; 3483 pBackBuffer4 = 0;
3514 pFrontBuffer4 = 0; 3484 pFrontBuffer4 = 0;
3515 pDirectDraw4 = 0; 3485 pDirectDraw4 = 0;
3516 //bColorKeySupported = 0; 3486 //bColorKeySupported = 0;
3517 CreateZBuffer(); 3487 CreateZBuffer();
3542 //v6 = pRenderD3D->pAvailableDevices; 3512 //v6 = pRenderD3D->pAvailableDevices;
3543 if (pRenderD3D->pAvailableDevices[uDesiredDirect3DDevice].bIsDeviceCompatible && 3513 if (pRenderD3D->pAvailableDevices[uDesiredDirect3DDevice].bIsDeviceCompatible &&
3544 uDesiredDirect3DDevice != 1 ) 3514 uDesiredDirect3DDevice != 1 )
3545 { 3515 {
3546 v7 = pRenderD3D->CreateDevice(uDesiredDirect3DDevice, true, window); 3516 v7 = pRenderD3D->CreateDevice(uDesiredDirect3DDevice, true, window);
3547 uAcquiredDirect3DDevice = uDesiredDirect3DDevice;
3548 } 3517 }
3549 else 3518 else
3550 { 3519 {
3551 if ( !pRenderD3D->pAvailableDevices[0].bIsDeviceCompatible ) 3520 if ( !pRenderD3D->pAvailableDevices[0].bIsDeviceCompatible )
3552 Error("There aren't any D3D devices to init."); 3521 Error("There aren't any D3D devices to init.");
3553 3522
3554 v7 = pRenderD3D->CreateDevice(0, true, window); 3523 v7 = pRenderD3D->CreateDevice(0, true, window);
3555 uAcquiredDirect3DDevice = 0;
3556 } 3524 }
3557 if ( !v7 ) 3525 if ( !v7 )
3558 Error("D3Drend->Init failed."); 3526 Error("D3Drend->Init failed.");
3559 3527
3560 //v8 = pRenderD3D; 3528 //v8 = pRenderD3D;
3561 pColorKeySurface4 = 0; 3529 //pColorKeySurface4 = 0;
3562 pBackBuffer4 = pRenderD3D->pBackBuffer; 3530 pBackBuffer4 = pRenderD3D->pBackBuffer;
3563 pFrontBuffer4 = pRenderD3D->pFrontBuffer; 3531 pFrontBuffer4 = pRenderD3D->pFrontBuffer;
3564 pDirectDraw4 = pRenderD3D->pHost; 3532 pDirectDraw4 = pRenderD3D->pHost;
3565 v9 = pRenderD3D->GetDeviceCaps(); 3533 v9 = pRenderD3D->GetDeviceCaps();
3566 if ( v9 & 1 ) 3534 if ( v9 & 1 )
3581 if (pRenderD3D) 3549 if (pRenderD3D)
3582 { 3550 {
3583 pRenderD3D->Release(); 3551 pRenderD3D->Release();
3584 delete pRenderD3D; 3552 delete pRenderD3D;
3585 } 3553 }
3586 pColorKeySurface4 = 0; 3554 //pColorKeySurface4 = 0;
3587 pRenderD3D = 0; 3555 pRenderD3D = 0;
3588 pBackBuffer4 = 0; 3556 pBackBuffer4 = 0;
3589 pFrontBuffer4 = 0; 3557 pFrontBuffer4 = 0;
3590 pDirectDraw4 = 0; 3558 pDirectDraw4 = 0;
3591 Error("Direct3D renderer: The device doesn't support the necessary alpha blending modes."); 3559 Error("Direct3D renderer: The device doesn't support the necessary alpha blending modes.");
3592 } 3560 }
3593 if ( (v9 & 0x80u) != 0 ) 3561 if (v9 & 0x80)
3594 { 3562 {
3595 if (pRenderD3D) 3563 if (pRenderD3D)
3596 { 3564 {
3597 pRenderD3D->Release(); 3565 pRenderD3D->Release();
3598 delete pRenderD3D; 3566 delete pRenderD3D;
3601 pBackBuffer4 = 0; 3569 pBackBuffer4 = 0;
3602 pFrontBuffer4 = 0; 3570 pFrontBuffer4 = 0;
3603 pDirectDraw4 = 0; 3571 pDirectDraw4 = 0;
3604 Error("Direct3D renderer: The device doesn't support non-square textures."); 3572 Error("Direct3D renderer: The device doesn't support non-square textures.");
3605 } 3573 }
3606 LOBYTE(field_10365C) = ~(unsigned __int8)(v9 >> 6) & 1; 3574 //LOBYTE(field_10365C) = ~(unsigned __int8)(v9 >> 6) & 1;
3607 bRequiredTextureStagesAvailable = CheckTextureStages(); 3575 bRequiredTextureStagesAvailable = CheckTextureStages();
3608 memset(&halCaps, 0, 0xFCu); 3576 memset(&halCaps, 0, 0xFCu);
3609 halCaps.dwSize = 252; 3577 halCaps.dwSize = 252;
3610 memset(&refCaps, 0, 0xFCu); 3578 memset(&refCaps, 0, 0xFCu);
3611 //v10 = v2->pRenderD3D; 3579 //v10 = v2->pRenderD3D;
3617 uMinDeviceTextureDim = v12; 3585 uMinDeviceTextureDim = v12;
3618 v13 = halCaps.dwMaxTextureWidth; 3586 v13 = halCaps.dwMaxTextureWidth;
3619 if ( (unsigned int)halCaps.dwMaxTextureWidth < halCaps.dwMaxTextureHeight ) 3587 if ( (unsigned int)halCaps.dwMaxTextureWidth < halCaps.dwMaxTextureHeight )
3620 v13 = halCaps.dwMaxTextureHeight; 3588 v13 = halCaps.dwMaxTextureHeight;
3621 uMaxDeviceTextureDim = v13; 3589 uMaxDeviceTextureDim = v13;
3622 CreateSomeTexture();
3623 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, 1u)); 3590 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, 1u));
3624 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 1u)); 3591 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, 1u));
3625 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZFUNC, 2u)); 3592 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZFUNC, 2u));
3626 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SPECULARENABLE, 0)); 3593 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SPECULARENABLE, 0));
3627 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, 0)); 3594 ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, 0));
3711 }*/ 3678 }*/
3712 pTargetSurface = pTargetSurface_unaligned; 3679 pTargetSurface = pTargetSurface_unaligned;
3713 uTargetSurfacePitch = window->GetWidth(); 3680 uTargetSurfacePitch = window->GetWidth();
3714 pBeforePresentFunction = Present_NoColorKey; 3681 pBeforePresentFunction = Present_NoColorKey;
3715 goto LABEL_45; 3682 goto LABEL_45;
3683 }
3684
3685
3686 //----- (0044F2B2) --------------------------------------------------------
3687 bool Render::IsGammaSupported()
3688 {
3689 bool result; // eax@3
3690 HRESULT v1; // eax@4
3691
3692 //if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 )
3693 {
3694 DDCAPS halCaps; // [sp+0h] [bp-180h]@4
3695 memset(&halCaps, 0, sizeof(DDCAPS));
3696 halCaps.dwSize = sizeof(DDCAPS);
3697
3698 ErrD3D(pDirectDraw4->GetCaps(&halCaps, 0));
3699 return (halCaps.dwCaps2 >> 17) & 1;
3700 }
3701 /*else
3702 return false;*/
3716 } 3703 }
3717 3704
3718 //----- (004A0BEE) -------------------------------------------------------- 3705 //----- (004A0BEE) --------------------------------------------------------
3719 void Render::RasterLine2D(signed int uX, signed int uY, signed int uZ, signed int uW, unsigned __int16 uColor) 3706 void Render::RasterLine2D(signed int uX, signed int uY, signed int uZ, signed int uW, unsigned __int16 uColor)
3720 { 3707 {
4192 4179
4193 //----- (004A139A) -------------------------------------------------------- 4180 //----- (004A139A) --------------------------------------------------------
4194 void Render::CreateDirectDrawPrimarySurface() 4181 void Render::CreateDirectDrawPrimarySurface()
4195 { 4182 {
4196 Render *v1; // esi@1 4183 Render *v1; // esi@1
4197 int v2; // ebx@3 4184 //int v2; // ebx@3
4198 IDirectDraw2 *v3; // eax@3 4185 IDirectDraw2 *v3; // eax@3
4199 HRESULT v4; // eax@3 4186 HRESULT v4; // eax@3
4200 IDirectDrawSurface *pFrontBuffer; // eax@3 4187 IDirectDrawSurface *pFrontBuffer; // eax@3
4201 DDSCAPS2 *v6; // edx@3 4188 DDSCAPS2 *v6; // edx@3
4202 IDirectDraw4 *v7; // eax@4 4189 IDirectDraw4 *v7; // eax@4
4214 4201
4215 v1 = this; 4202 v1 = this;
4216 //if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || 4203 //if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT ||
4217 //pVersion->pVersionInfo.dwMajorVersion != 4 ) 4204 //pVersion->pVersionInfo.dwMajorVersion != 4 )
4218 { 4205 {
4219 v2 = 0; 4206 //v2 = 0;
4220 this->field_4004C = 1; 4207 //this->field_4004C = 1;
4221 memset(&ddsd2, 0, 0x7Cu); 4208 memset(&ddsd2, 0, 0x7Cu);
4222 v7 = v1->pDirectDraw4; 4209 v7 = v1->pDirectDraw4;
4223 ddsd2.dwBackBufferCount = 1; 4210 ddsd2.dwBackBufferCount = 1;
4224 ddsd2.dwSize = 0x7Cu; 4211 ddsd2.dwSize = 0x7Cu;
4225 ddsd2.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; 4212 ddsd2.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
4256 v10 = pFrontBuffer; // BUG 4243 v10 = pFrontBuffer; // BUG
4257 4244
4258 v17.dwCaps = 4; 4245 v17.dwCaps = 4;
4259 ErrD3D(pFrontBuffer->GetAttachedSurface((DDSCAPS *)&v17, ppBackBuffer));// hr = this->pFrontBuffer->GetAttachedSurface(&ddsCaps2, ppBackBuffer); 4246 ErrD3D(pFrontBuffer->GetAttachedSurface((DDSCAPS *)&v17, ppBackBuffer));// hr = this->pFrontBuffer->GetAttachedSurface(&ddsCaps2, ppBackBuffer);
4260 //CheckHRESULT(&thisa, v11, (const char *)v10, v9, (unsigned int)ppBackBuffer); 4247 //CheckHRESULT(&thisa, v11, (const char *)v10, v9, (unsigned int)ppBackBuffer);
4261 v1->field_40030 = v2; 4248 //v1->field_40030 = v2;
4262 v1->field_18_locked_pitch = v2; 4249 //v1->field_18_locked_pitch = v2;
4263 } 4250 }
4264 4251
4265 //----- (004A14F4) -------------------------------------------------------- 4252 //----- (004A14F4) --------------------------------------------------------
4266 void Render::CreateClipper(HWND a2) 4253 void Render::CreateClipper(HWND a2)
4267 { 4254 {
4516 //----- (004A1EB6) -------------------------------------------------------- 4503 //----- (004A1EB6) --------------------------------------------------------
4517 void Render::BeginSceneD3D() 4504 void Render::BeginSceneD3D()
4518 { 4505 {
4519 if (!uNumD3DSceneBegins++) 4506 if (!uNumD3DSceneBegins++)
4520 { 4507 {
4521 if (pRenderD3D) 4508 //if (pRenderD3D)
4522 { 4509 {
4523 pRenderD3D->ClearTarget(true, 0x00F08020, true, 1.0); 4510 pRenderD3D->ClearTarget(true, 0x00F08020, true, 1.0);
4524 pRenderer->uNumBillboardsToDraw = 0; 4511 pRenderer->uNumBillboardsToDraw = 0;
4525 pRenderD3D->pDevice->BeginScene(); 4512 pRenderD3D->pDevice->BeginScene();
4526 4513
4540 { 4527 {
4541 pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 0); 4528 pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE, 0);
4542 bUsingSpecular = 0; 4529 bUsingSpecular = 0;
4543 } 4530 }
4544 } 4531 }
4545 else 4532 /*else
4546 { 4533 {
4547 LockRenderSurface((void **)&pTargetSurface, &uTargetSurfacePitch); 4534 LockRenderSurface((void **)&pTargetSurface, &uTargetSurfacePitch);
4548 if (pTargetSurface) 4535 if (pTargetSurface)
4549 field_18_locked_pitch = uTargetSurfacePitch; 4536 field_18_locked_pitch = uTargetSurfacePitch;
4550 else 4537 else
4551 --uNumD3DSceneBegins; 4538 --uNumD3DSceneBegins;
4552 } 4539 }*/
4553 } 4540 }
4554 } 4541 }
4555 4542
4556 //----- (004A1FE1) -------------------------------------------------------- 4543 //----- (004A1FE1) --------------------------------------------------------
4557 void Render::DrawBillboards_And_MaybeRenderSpecialEffects_And_EndScene() 4544 void Render::DrawBillboards_And_MaybeRenderSpecialEffects_And_EndScene()
6467 else 6454 else
6468 { 6455 {
6469 if ( !this->pTargetSurface ) 6456 if ( !this->pTargetSurface )
6470 { 6457 {
6471 LockRenderSurface((void **)&this->pTargetSurface, &this->uTargetSurfacePitch); 6458 LockRenderSurface((void **)&this->pTargetSurface, &this->uTargetSurfacePitch);
6472 if ( this->pTargetSurface ) 6459 /*if ( this->pTargetSurface )
6473 { 6460 {
6474 this->field_18_locked_pitch = this->uTargetSurfacePitch; 6461 this->field_18_locked_pitch = this->uTargetSurfacePitch;
6475 } 6462 }*/
6476 --this->uNumSceneBegins; 6463 --this->uNumSceneBegins;
6477 } 6464 }
6478 } 6465 }
6479 RestoreFrontBuffer(); 6466 RestoreFrontBuffer();
6480 } 6467 }
6500 } 6487 }
6501 else 6488 else
6502 { 6489 {
6503 this->pTargetSurface = 0; 6490 this->pTargetSurface = 0;
6504 this->uTargetSurfacePitch = 0; 6491 this->uTargetSurfacePitch = 0;
6505 this->field_18_locked_pitch = 0; 6492 //this->field_18_locked_pitch = 0;
6506 UnlockBackBuffer(); 6493 UnlockBackBuffer();
6507 } 6494 }
6508 } 6495 }
6509 } 6496 }
6510 } 6497 }
8349 /*if ( !pRenderer->bWindowMode && (dword_6BE364_game_settings_1 & 2) ) 8336 /*if ( !pRenderer->bWindowMode && (dword_6BE364_game_settings_1 & 2) )
8350 { 8337 {
8351 ModalWindow(pGlobalTXT_LocalizationStrings[62], UIMSG_0);// "Might and Magic VII requires your desktop to be in 16bit (32k or 65k) Color mode in order to operate in a window." 8338 ModalWindow(pGlobalTXT_LocalizationStrings[62], UIMSG_0);// "Might and Magic VII requires your desktop to be in 16bit (32k or 65k) Color mode in order to operate in a window."
8352 return; 8339 return;
8353 }*/ 8340 }*/
8354 if ( pRenderer->bWindowMode || !pRenderer->pRenderD3D || pRenderer->pRenderD3D->pAvailableDevices->bIsDeviceCompatible ) 8341 if ( pRenderer->bWindowMode || pRenderer->pRenderD3D->pAvailableDevices->bIsDeviceCompatible )
8355 { 8342 {
8356 if ( pEventTimer->bPaused ) 8343 if ( pEventTimer->bPaused )
8357 dword_6BE364_game_settings_1 |= GAME_SETTINGS_0800; 8344 dword_6BE364_game_settings_1 |= GAME_SETTINGS_0800;
8358 else 8345 else
8359 pEventTimer->Pause(); 8346 pEventTimer->Pause();
9238 if ( pCurrentScreen != SCREEN_BRANCHLESS_NPC_DIALOG ) 9225 if ( pCurrentScreen != SCREEN_BRANCHLESS_NPC_DIALOG )
9239 return true; 9226 return true;
9240 } 9227 }
9241 return false; 9228 return false;
9242 } 9229 }
9230
9231
9232 //----- (0045E03A) --------------------------------------------------------
9233 unsigned short *Render::MakeScreenshot(signed int width, signed int height)
9234 {
9235 unsigned __int16 *v3; // ebx@1
9236 int v4; // edx@7
9237 unsigned __int8 v5; // cf@9
9238 unsigned int v6; // ecx@9
9239 unsigned __int16 *v7; // edi@9
9240 int j; // ecx@9
9241 unsigned int screen_x; // qax@18
9242 HRESULT v14; // eax@21
9243 int v15; // edi@29
9244 signed __int64 v16; // qax@30
9245 signed int v17; // edx@34
9246 unsigned __int16 *v18; // edi@36
9247 int k; // ecx@36
9248 DDSURFACEDESC2 Dst; // [sp+4h] [bp-A0h]@6
9249 unsigned __int16 *pPixels; // [sp+80h] [bp-24h]@1
9250 float interval_x; // [sp+84h] [bp-20h]@1
9251 unsigned __int16 *_this; // [sp+88h] [bp-1Ch]@21
9252 float interval_y; // [sp+8Ch] [bp-18h]@1
9253 unsigned int screen_y; // [sp+90h] [bp-14h]@17
9254 int v28; // [sp+98h] [bp-Ch]@16
9255 int v29; // [sp+9Ch] [bp-8h]@15
9256
9257 interval_x = game_viewport_width / (double)width;
9258 interval_y = game_viewport_height / (double)height;
9259
9260 pPixels = (unsigned __int16 *)malloc(2 * height * width);
9261 memset(pPixels, 0 , 2 * height * width);
9262
9263 v3 = pPixels;
9264
9265 BeginSceneD3D();
9266
9267 if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
9268 pIndoor->Draw();
9269 else if (uCurrentlyLoadedLevelType == LEVEL_Outdoor)
9270 pOutdoor->Draw();
9271
9272 DrawBillboards_And_MaybeRenderSpecialEffects_And_EndScene();
9273 memset(&Dst, 0, 0x7C);
9274 Dst.dwSize = sizeof(Dst);
9275
9276 if ( LockSurface_DDraw4(pBackBuffer4, &Dst, DDLOCK_WAIT) )
9277 {
9278 for (uint y = 0; y < height; ++y)
9279 {
9280 for (uint x = 0; x < width; ++x)
9281 {
9282 //*v3 = pRenderer->ReadPixel16((int)(x* interval_x + 8.0), (int)(y * interval_y + 8.0));//screen_data[screen_y + (int)(x* interval_x + 8.0)];
9283
9284 if (Dst.ddpfPixelFormat.dwRGBBitCount == 32)
9285 {
9286 auto p = (unsigned __int32 *)Dst.lpSurface + (int)(x * interval_x + 8.0) + y/* (int)(y * interval_y + 8.0)*/ * Dst.lPitch;
9287 *v3 = Color16((*p >> 16) & 255, (*p >> 8) & 255, *p & 255);
9288 }
9289 else if (Dst.ddpfPixelFormat.dwRGBBitCount == 16)
9290 {
9291 auto p = (unsigned __int16 *)Dst.lpSurface + (int)(x * interval_x + 8.0) + y * Dst.lPitch;
9292 *v3 = *p;
9293 }
9294 else __debugbreak();
9295 ++v3;
9296 }
9297 }
9298 ErrD3D(pBackBuffer4->Unlock(0));
9299 }
9300 else
9301 {
9302 __debugbreak(); // unrefactored - black screenshot
9303 v4 = height;
9304 if ( height > 0 )
9305 {
9306 do
9307 {
9308 if ( width > 0 )
9309 {
9310 v5 = width & 1;
9311 v6 = (unsigned int)width >> 1;
9312 memset(v3, 0, 4 * ((unsigned int)width >> 1));
9313 v7 = &v3[2 * v6];
9314 for ( j = v5; j; --j )
9315 {
9316 *v7 = 0;
9317 ++v7;
9318 }
9319 v3 += width;
9320 }
9321 --v4;
9322 }
9323 while ( v4 );
9324 }
9325 }
9326
9327
9328 /*if (!pRenderer->pRenderD3D)
9329 {
9330 pRenderer->BeginScene();
9331 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
9332 {
9333 pIndoor->Draw();
9334 }
9335 else
9336 {
9337 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor )
9338 pOutdoor->Draw();
9339 }
9340 _this = pRenderer->pTargetSurface;
9341 v26 = pRenderer->uTargetSurfacePitch;
9342 if ( pRenderer->pTargetSurface )
9343 {
9344 if ( height > 0 )
9345 {
9346 for ( v29 = 0; v29 < height; ++v29 )
9347 {
9348 if ( width > 0 )
9349 {
9350 v15 = v26 * (unsigned __int64)(signed __int64)((double)v29 * v25 + 8.0);
9351 for ( v28 = 0; v28 < width; v28++ )
9352 {
9353 *v3 = _this[v15 + (int)(signed __int64)((double)v28 * v23 + 8.0)];
9354 ++v3;
9355 }
9356 }
9357 }
9358 }
9359 }
9360 else
9361 {
9362 if ( height > 0 )
9363 {
9364 for ( v17 = height; v17; --v17 )
9365 {
9366 if ( width > 0 )
9367 {
9368 memset(v3, 0, 4 * ((unsigned int)width >> 1));
9369 v18 = &v3[2 * ((unsigned int)width >> 1)];
9370 for ( k = width & 1; k; --k )
9371 {
9372 *v18 = 0;
9373 ++v18;
9374 }
9375 v3 += width;
9376 }
9377 }
9378 }
9379 }
9380 pRenderer->EndScene();
9381 }*/
9382 return pPixels;
9383 }
9384 //----- (0045E26C) --------------------------------------------------------
9385 void Render::SaveScreenshot(const char *pFilename, unsigned int width, unsigned int height)
9386 {
9387 auto pixels = pRenderer->MakeScreenshot(width, height);
9388 pRenderer->SavePCXImage(pFilename, pixels, width, height);
9389 free(pixels);
9390 }
9391
9392 void Render::PackScreenshot(unsigned int width, unsigned int height, void *data, unsigned int data_size, unsigned int *out_screenshot_size)
9393 {
9394 auto pixels = pRenderer->MakeScreenshot(150, 112);
9395 pRenderer->PackPCXpicture(pixels, 150, 112, data, 1000000, out_screenshot_size);
9396 free(pixels);
9397 }