Mercurial > mm7
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 } |