RoofGLProc3D PROC procName:DWORD,alternate:DWORD invoke wglGetProcAddress,procName cmp eax,3 jbe roof_gl_proc_alternate cmp eax,-1 jne roof_gl_proc_done roof_gl_proc_alternate: invoke wglGetProcAddress,alternate cmp eax,3 jbe roof_gl_proc_missing cmp eax,-1 jne roof_gl_proc_done roof_gl_proc_missing: xor eax,eax roof_gl_proc_done: ret RoofGLProc3D ENDP LoadRoofMesh3D PROC uses ebx esi edi slot:DWORD,path:DWORD local io:DWORD,allocation:DWORD mov esi,slot cmp DWORD PTR [esi+12],0 jne roof_mesh_ready invoke CreateFileA,path,80000000h,1,0,3,80h,0 cmp eax,-1 je roof_mesh_failed mov ebx,eax invoke ReadFile,ebx,esi,12,ADDR io,0 test eax,eax jz roof_mesh_close cmp io,12 jne roof_mesh_close cmp DWORD PTR [esi],314D4752h jne roof_mesh_close mov eax,[esi+4] test eax,eax jz roof_mesh_close cmp eax,65000 ja roof_mesh_close imul eax,100 cmp eax,[esi+8] jne roof_mesh_close invoke GetFileSize,ebx,0 sub eax,12 cmp eax,[esi+8] jne roof_mesh_close invoke GetProcessHeap invoke HeapAlloc,eax,0,[esi+8] test eax,eax jz roof_mesh_close mov allocation,eax invoke ReadFile,ebx,allocation,[esi+8],ADDR io,0 test eax,eax jz roof_mesh_free mov eax,io cmp eax,[esi+8] jne roof_mesh_free mov edi,allocation mov ecx,[esi+4] roof_mesh_validate: mov eax,[edi] cmp eax,ROOF_DECK jb roof_mesh_free cmp eax,209 ja roof_mesh_free add edi,100 dec ecx jnz roof_mesh_validate invoke CloseHandle,ebx mov eax,allocation mov [esi+12],eax roof_mesh_ready: mov eax,1 ret roof_mesh_free: invoke GetProcessHeap invoke HeapFree,eax,0,allocation roof_mesh_close: invoke CloseHandle,ebx roof_mesh_failed: xor eax,eax ret LoadRoofMesh3D ENDP FreeRoofMesh3D PROC uses esi slot:DWORD mov esi,slot cmp DWORD PTR [esi+12],0 je @F invoke GetProcessHeap invoke HeapFree,eax,0,[esi+12] mov DWORD PTR [esi+12],0 @@: ret FreeRoofMesh3D ENDP UploadRoofGLTexture3D PROC pixels:DWORD,tw:DWORD,th:DWORD,texture:DWORD invoke glBindTexture,0DE1h,texture invoke glTexParameteri,0DE1h,2801h,2601h invoke glTexParameteri,0DE1h,2800h,2601h invoke glTexParameteri,0DE1h,2802h,2901h invoke glTexParameteri,0DE1h,2803h,2901h invoke glTexImage2D,0DE1h,0,8058h,tw,th,0,80E1h,1401h,pixels cmp roofGLMipmap3D,0 je @F push 0DE1h call roofGLMipmap3D invoke glTexParameteri,0DE1h,2801h,2703h @@: ret UploadRoofGLTexture3D ENDP UploadRoofGLSky3D PROC uses ebx esi edi pack:DWORD,texture:DWORD local allocation:DWORD,tile:DWORD,row:DWORD invoke GetProcessHeap invoke HeapAlloc,eax,0,2048*512*4 test eax,eax jz roof_gl_sky_failed mov allocation,eax mov tile,0 roof_gl_sky_tile: mov row,0 roof_gl_sky_row: mov esi,pack mov eax,tile shl eax,20 add eax,[esi].AnimPack3D.pixels mov edx,row shl edx,11 add eax,edx mov esi,eax mov eax,row shl eax,13 add eax,allocation mov edx,tile shl edx,11 add eax,edx mov edi,eax mov ecx,512 rep movsd inc row cmp row,512 jb roof_gl_sky_row inc tile cmp tile,4 jb roof_gl_sky_tile invoke UploadRoofGLTexture3D,allocation,2048,512,texture invoke glTexParameteri,0DE1h,2803h,812Fh invoke GetProcessHeap invoke HeapFree,eax,0,allocation mov eax,1 ret roof_gl_sky_failed: xor eax,eax ret UploadRoofGLSky3D ENDP BuildRoofGLList3D PROC uses ebx esi edi mesh:DWORD,theme:DWORD,emission:DWORD,listId:DWORD local count:DWORD,currentMat:DWORD,inside:DWORD,vertex:DWORD,texture:DWORD mov esi,mesh mov eax,[esi+4] mov count,eax mov esi,[esi+12] mov currentMat,-1 mov inside,0 invoke glNewList,listId,1300h roof_gl_list_triangle: mov ebx,[esi] cmp ebx,currentMat je roof_gl_list_vertices cmp inside,0 je @F invoke glEnd mov inside,0 @@: mov currentMat,ebx sub ebx,ROOF_DECK mov eax,roofHDDayTextures3D[ebx*4] cmp theme,0 je @F mov eax,roofHDNightTextures3D[ebx*4] @@: cmp emission,0 je @F mov eax,roofHDEmissionTextures3D[ebx*4] @@: mov texture,eax test eax,eax jz roof_gl_list_skip cmp currentMat,ROOF_CITY_WATER je roof_gl_list_skip invoke glBindTexture,0DE1h,texture cmp emission,0 jne roof_gl_list_begin invoke glMaterialfv,408h,1600h,OFFSET roofGLEmissionZero3D cmp theme,0 je roof_gl_list_surface cmp currentMat,ROOF_LIGHT jne @F invoke glMaterialfv,408h,1600h,OFFSET roofGLEmissionLamp3D @@: cmp currentMat,ROOF_BRASS jne roof_gl_list_surface invoke glMaterialfv,408h,1600h,OFFSET roofGLEmissionGold3D roof_gl_list_surface: cmp currentMat,208 jne roof_gl_list_opaque invoke glDisable,0B50h invoke glEnable,0B60h invoke glFogfv,0B66h,OFFSET roofGLFogWhite3D invoke glEnable,0BE2h invoke glBlendFunc,306h,0 invoke glDepthMask,0 jmp roof_gl_list_begin roof_gl_list_opaque: invoke glDisable,8037h cmp currentMat,ROOF_CITY_ROAD jne @F invoke glEnable,8037h invoke glPolygonOffset,0BF800000h,0BF800000h @@: invoke glEnable,0B50h invoke glEnable,0B60h invoke glDisable,0BE2h invoke glDepthMask,1 roof_gl_list_begin: invoke glBegin,4 mov inside,1 roof_gl_list_vertices: cmp inside,0 je roof_gl_list_skip lea edi,[esi+4] mov vertex,3 roof_gl_list_vertex: invoke glNormal3f,[edi+12],[edi+16],[edi+20] invoke glTexCoord2f,[edi+24],[edi+28] invoke glVertex3f,[edi],[edi+4],[edi+8] add edi,32 dec vertex jnz roof_gl_list_vertex roof_gl_list_skip: add esi,100 dec count jnz roof_gl_list_triangle cmp inside,0 je @F invoke glEnd @@: invoke glEndList ret BuildRoofGLList3D ENDP InitRoofHD3D PROC uses ebx esi edi local maxTexture:DWORD,oldTheme:DWORD,allocation:DWORD,model:DWORD,theme:DWORD cmp roofHDReady3D,0 jne roof_hd_init_status mov roofHDReady3D,-1 mov roofHDStage3D,1 cmp roofSkyArt3D.pixels,0 je roof_hd_init_failed cmp roofNightArt3D.pixels,0 je roof_hd_init_failed cmp roofCityArt3D.pixels,0 je roof_hd_init_failed cmp roofCityNightArt3D.pixels,0 je roof_hd_init_failed cmp roofMaterialArt3D.pixels,0 je roof_hd_init_failed cmp roofDetailArt3D.pixels,0 je roof_hd_init_failed cmp roofLightingArt3D.pixels,0 je roof_hd_init_failed cmp roofLightingArt3D.frames,3 jb roof_hd_init_failed invoke GetModuleHandleA,0 mov roofHDModule3D,eax mov roofHDClass3D[16],eax invoke RegisterClassA,OFFSET roofHDClass3D invoke CreateWindowExA,0,OFFSET roofHDClassName3D,OFFSET roofHDTitle3D,86000000h,0,0,ROOF_HD_W,ROOF_HD_H,0,0,roofHDModule3D,0 test eax,eax jz roof_hd_init_failed mov roofHDWindow3D,eax invoke GetDC,eax mov roofHDDC3D,eax invoke ChoosePixelFormat,eax,OFFSET roofHDPixelFormat3D test eax,eax jz roof_hd_init_failed invoke SetPixelFormat,roofHDDC3D,eax,OFFSET roofHDPixelFormat3D test eax,eax jz roof_hd_init_failed invoke wglCreateContext,roofHDDC3D test eax,eax jz roof_hd_init_failed mov roofHDRC3D,eax invoke wglMakeCurrent,roofHDDC3D,eax test eax,eax jz roof_hd_init_failed mov roofHDStage3D,2 xor esi,esi roof_hd_load_gl_proc: invoke RoofGLProc3D,roofGLProcNames3D[esi*4],roofGLProcExtNames3D[esi*4] mov edi,roofGLProcSlots3D[esi*4] mov [edi],eax test eax,eax jnz roof_hd_gl_proc_ready cmp esi,10 jne roof_hd_init_failed roof_hd_gl_proc_ready: inc esi cmp esi,11 jb roof_hd_load_gl_proc invoke glGetIntegerv,0D33h,ADDR maxTexture cmp maxTexture,2048 jb roof_hd_init_failed mov roofHDStage3D,3 push OFFSET roofHDFBO3D push 1 call roofGLGenFBO3D push roofHDFBO3D push 8D40h call roofGLBindFBO3D invoke glGenTextures,1,OFFSET roofHDColorTex3D invoke glBindTexture,0DE1h,roofHDColorTex3D invoke glTexParameteri,0DE1h,2801h,2601h invoke glTexImage2D,0DE1h,0,8058h,ROOF_HD_W,ROOF_HD_H,0,1908h,1401h,0 push 0 push roofHDColorTex3D push 0DE1h push 8CE0h push 8D40h call roofGLAttachTexture3D push OFFSET roofHDDepth3D push 1 call roofGLGenRBO3D push roofHDDepth3D push 8D41h call roofGLBindRBO3D push ROOF_HD_H push ROOF_HD_W push 81A6h push 8D41h call roofGLStoreRBO3D push roofHDDepth3D push 8D41h push 8D00h push 8D40h call roofGLAttachRBO3D push 8D40h call roofGLCheckFBO3D cmp eax,8CD5h jne roof_hd_init_failed invoke glDrawBuffer,8CE0h invoke glReadBuffer,8CE0h invoke GetProcessHeap invoke HeapAlloc,eax,8,ROOF_HD_W*ROOF_HD_H*4 test eax,eax jz roof_hd_init_failed mov roofHDBuffer3D,eax mov roofHDStage3D,4 invoke LoadRoofMesh3D,OFFSET roofHDMeshScene3D,OFFSET roofHDScenePath3D test eax,eax jz roof_hd_init_failed invoke LoadRoofMesh3D,OFFSET roofHDMeshCar3D,OFFSET roofHDCarPath3D test eax,eax jz roof_hd_init_failed invoke LoadRoofMesh3D,OFFSET roofHDMeshBoat3D,OFFSET roofHDBoatPath3D test eax,eax jz roof_hd_init_failed lea edi,roofHDUsedMaterials3D xor eax,eax mov ecx,ROOF_GL_TEXTURES rep stosb mov model,0 roof_hd_collect_materials: mov ebx,model mov esi,roofHDMeshPtrs3D[ebx*4] mov ecx,[esi+4] mov esi,[esi+12] roof_hd_collect_triangle: mov eax,[esi] sub eax,ROOF_DECK mov roofHDUsedMaterials3D[eax],1 add esi,100 dec ecx jnz roof_hd_collect_triangle inc model cmp model,3 jb roof_hd_collect_materials invoke glGenTextures,ROOF_GL_TEXTURES,OFFSET roofHDDayTextures3D invoke glGenTextures,ROOF_GL_TEXTURES,OFFSET roofHDNightTextures3D invoke glGenTextures,ROOF_GL_TEXTURES,OFFSET roofHDEmissionTextures3D mov eax,roofNight3D mov oldTheme,eax mov theme,0 roof_hd_upload_theme: mov eax,theme mov roofNight3D,eax mov esi,ROOF_DECK roof_hd_upload_material: mov ebx,esi sub ebx,ROOF_DECK cmp roofHDUsedMaterials3D[ebx],0 jne roof_hd_upload_used mov roofHDDayTextures3D[ebx*4],0 mov roofHDNightTextures3D[ebx*4],0 jmp roof_hd_upload_next roof_hd_upload_used: cmp theme,0 je roof_hd_upload_pixels cmp esi,ROOF_FACADE jb roof_hd_share_material cmp esi,ROOF_FACADE+7 jbe roof_hd_upload_pixels cmp esi,ROOF_MODERN_FACADE jb roof_hd_share_material cmp esi,ROOF_MODERN_FACADE+7 jbe roof_hd_upload_pixels roof_hd_share_material: mov eax,roofHDDayTextures3D[ebx*4] mov roofHDNightTextures3D[ebx*4],eax jmp roof_hd_upload_next roof_hd_upload_pixels: invoke ResolveRoofSurface3D,esi mov edi,roofHDDayTextures3D[ebx*4] cmp theme,0 je @F mov edi,roofHDNightTextures3D[ebx*4] @@: invoke UploadRoofGLTexture3D,eax,ecx,edx,edi roof_hd_upload_next: inc esi cmp esi,ROOF_LAST_MATERIAL jbe roof_hd_upload_material mov esi,OFFSET roofLightingArt3D mov eax,theme shl eax,20 add eax,[esi].AnimPack3D.pixels mov edi,roofHDDayTextures3D[47*4] cmp theme,0 je @F mov edi,roofHDNightTextures3D[47*4] @@: invoke UploadRoofGLTexture3D,eax,512,512,edi invoke glTexParameteri,0DE1h,2802h,812Fh invoke glTexParameteri,0DE1h,2803h,812Fh inc theme cmp theme,2 jb roof_hd_upload_theme mov roofHDDayTextures3D[48*4],0 mov roofHDNightTextures3D[48*4],0 mov roofHDStage3D,5 invoke GetProcessHeap invoke HeapAlloc,eax,0,512*512*4 test eax,eax jz roof_hd_restore_failed mov allocation,eax mov esi,ROOF_DECK roof_hd_emission_material: mov ebx,esi sub ebx,ROOF_DECK cmp roofHDUsedMaterials3D[ebx],0 je roof_hd_emission_empty cmp esi,ROOF_FACADE jb roof_hd_emission_empty cmp esi,ROOF_FACADE+7 jbe roof_hd_emission_create cmp esi,ROOF_MODERN_FACADE jb roof_hd_emission_empty cmp esi,ROOF_MODERN_FACADE+7 ja roof_hd_emission_empty roof_hd_emission_create: invoke ResolveRoofSurface3D,esi mov ebx,eax mov edi,allocation mov ecx,512*512 roof_hd_emission_pixel: mov eax,[ebx] cmp eax,0FF000000h jae @F xor eax,eax @@: stosd add ebx,4 dec ecx jnz roof_hd_emission_pixel mov ebx,esi sub ebx,ROOF_DECK invoke UploadRoofGLTexture3D,allocation,512,512,roofHDEmissionTextures3D[ebx*4] jmp roof_hd_emission_next roof_hd_emission_empty: mov ebx,esi sub ebx,ROOF_DECK ; No emission list binds these handles; zero is an explicit skipped material. mov roofHDEmissionTextures3D[ebx*4],0 roof_hd_emission_next: inc esi cmp esi,ROOF_LAST_MATERIAL jbe roof_hd_emission_material mov roofHDEmissionTextures3D[47*4],0 mov eax,roofLightingArt3D.pixels add eax,2*512*512*4 invoke UploadRoofGLTexture3D,eax,512,512,roofHDEmissionTextures3D[48*4] invoke glTexParameteri,0DE1h,2802h,812Fh invoke glTexParameteri,0DE1h,2803h,812Fh invoke GetProcessHeap invoke HeapFree,eax,0,allocation mov eax,oldTheme mov roofNight3D,eax invoke glGenTextures,2,OFFSET roofHDSkyTextures3D invoke UploadRoofGLSky3D,OFFSET roofSkyArt3D,roofHDSkyTextures3D[0] test eax,eax jz roof_hd_init_failed invoke UploadRoofGLSky3D,OFFSET roofNightArt3D,roofHDSkyTextures3D[4] test eax,eax jz roof_hd_init_failed invoke glGenLists,9 test eax,eax jz roof_hd_init_failed mov roofHDLists3D,eax mov model,0 roof_hd_compile_model: mov ebx,model mov edi,roofHDMeshPtrs3D[ebx*4] imul ebx,3 add ebx,roofHDLists3D invoke BuildRoofGLList3D,edi,0,0,ebx inc ebx invoke BuildRoofGLList3D,edi,1,0,ebx inc ebx invoke BuildRoofGLList3D,edi,1,1,ebx inc model cmp model,3 jb roof_hd_compile_model invoke FreeRoofMesh3D,OFFSET roofHDMeshScene3D invoke FreeRoofMesh3D,OFFSET roofHDMeshCar3D invoke FreeRoofMesh3D,OFFSET roofHDMeshBoat3D invoke CreateCompatibleDC,0 test eax,eax jz roof_hd_init_failed mov roofHDOverlayDC3D,eax invoke CreateDIBSection,eax,OFFSET roofHDOverlayBMI3D,0,OFFSET roofHDOverlayPixels3D,0,0 test eax,eax jz roof_hd_init_failed mov roofHDOverlayBmp3D,eax invoke SelectObject,roofHDOverlayDC3D,eax mov roofHDOverlayOld3D,eax invoke CreateCompatibleDC,0 test eax,eax jz roof_hd_init_failed mov roofHDFinalDC3D,eax invoke CreateDIBSection,eax,OFFSET roofHDBMI3D,0,OFFSET roofHDFinalPixels3D,0,0 test eax,eax jz roof_hd_init_failed mov roofHDFinalBmp3D,eax invoke SelectObject,roofHDFinalDC3D,eax mov roofHDFinalOld3D,eax invoke glGetError test eax,eax jnz roof_hd_init_failed mov roofHDReady3D,1 mov roofHDStage3D,0 call WriteRoofRendererInfo3D roof_hd_init_status: xor eax,eax cmp roofHDReady3D,1 sete al ret roof_hd_restore_failed: mov eax,oldTheme mov roofNight3D,eax roof_hd_init_failed: call WriteRoofRendererInfo3D call FreeRoofHD3D mov roofHDReady3D,-1 xor eax,eax ret InitRoofHD3D ENDP DrawRoofGLSky3D PROC uses ebx esi edi local px:DWORD,x0:REAL4,x1:REAL4,u0:REAL4,u1:REAL4,v0:REAL4,v1:REAL4 local skyWidth:DWORD,logicalHeight:DWORD local fadeTop:REAL4,fadeBottom:REAL4,fadePixel:DWORD mov skyWidth,2048 invoke glDisable,0B44h mov logicalHeight,480 invoke glDisable,0B71h invoke glDisable,0B50h invoke glDisable,0B60h invoke glDisable,0BE2h invoke glEnable,0DE1h invoke glDepthMask,0 invoke glColor4f,3F800000h,3F800000h,3F800000h,3F800000h invoke glMatrixMode,1701h invoke glLoadIdentity invoke glOrtho,DWORD PTR roofGLZeroD3D,DWORD PTR roofGLZeroD3D+4,DWORD PTR roofGLScreenWidthD3D,DWORD PTR roofGLScreenWidthD3D+4,DWORD PTR roofGLZeroD3D,DWORD PTR roofGLZeroD3D+4,DWORD PTR roofGLScreenHeightD3D,DWORD PTR roofGLScreenHeightD3D+4,DWORD PTR roofGLMinusOneD3D,DWORD PTR roofGLMinusOneD3D+4,DWORD PTR roofGLOneD3D,DWORD PTR roofGLOneD3D+4 invoke glMatrixMode,1700h invoke glLoadIdentity mov eax,roofNight3D invoke glBindTexture,0DE1h,roofHDSkyTextures3D[eax*4] mov eax,HALF_H sub eax,viewHorizon3D mov px,eax fild px fidiv logicalHeight fst v0 fld1 faddp st(1),st fstp v1 mov px,0 roof_hd_sky_segment: mov ebx,px fild px fstp x0 add px,16 fild px fstp x1 shr ebx,1 mov eax,roofSkyColumns3D[ebx*4] mov ecx,playerAngle shl ecx,2 add eax,ecx mov skyWidth,2048 mov ebx,eax push eax fild DWORD PTR [esp] add esp,4 fidiv skyWidth fstp u0 mov ebx,px shr ebx,1 cmp ebx,639 jbe @F mov ebx,639 @@: mov eax,roofSkyColumns3D[ebx*4] mov ecx,playerAngle shl ecx,2 add eax,ecx push eax fild DWORD PTR [esp] add esp,4 fidiv skyWidth fstp u1 invoke glBegin,7 invoke glTexCoord2f,DWORD PTR u0,DWORD PTR v1 invoke glVertex3f,DWORD PTR x0,0,0 invoke glTexCoord2f,DWORD PTR u1,DWORD PTR v1 invoke glVertex3f,DWORD PTR x1,0,0 invoke glTexCoord2f,DWORD PTR u1,DWORD PTR v0 invoke glVertex3f,DWORD PTR x1,44700000h,0 invoke glTexCoord2f,DWORD PTR u0,DWORD PTR v0 invoke glVertex3f,DWORD PTR x0,44700000h,0 invoke glEnd cmp px,ROOF_HD_W jb roof_hd_sky_segment ; The atmospheric horizon blends into the same haze as distant geometry. mov eax,viewHorizon3D shl eax,1 neg eax add eax,ROOF_HD_H+120 mov fadePixel,eax fild fadePixel fstp fadeTop sub fadePixel,210 fild fadePixel fstp fadeBottom invoke glDisable,0DE1h invoke glEnable,0BE2h invoke glBlendFunc,302h,303h invoke glBegin,7 invoke glColor4f,DWORD PTR roofGLFogCurrent3D[0],DWORD PTR roofGLFogCurrent3D[4],DWORD PTR roofGLFogCurrent3D[8],3F800000h invoke glVertex3f,0,0,0 invoke glVertex3f,44A00000h,0,0 invoke glVertex3f,44A00000h,DWORD PTR fadeBottom,0 invoke glVertex3f,0,DWORD PTR fadeBottom,0 invoke glVertex3f,0,DWORD PTR fadeBottom,0 invoke glVertex3f,44A00000h,DWORD PTR fadeBottom,0 invoke glColor4f,DWORD PTR roofGLFogCurrent3D[0],DWORD PTR roofGLFogCurrent3D[4],DWORD PTR roofGLFogCurrent3D[8],0 invoke glVertex3f,44A00000h,DWORD PTR fadeTop,0 invoke glVertex3f,0,DWORD PTR fadeTop,0 invoke glEnd invoke glDisable,0BE2h invoke glEnable,0DE1h invoke glColor4f,3F800000h,3F800000h,3F800000h,3F800000h ret DrawRoofGLSky3D ENDP DrawRoofGLTraffic3D PROC uses ebx esi edi local px:DWORD,py:DWORD,fx:REAL4,fy:REAL4,level:REAL4,angle:DWORD,listId:DWORD xor esi,esi roof_hd_car: imul eax,esi,17000 add eax,animationClock3D mov ecx,393 mul ecx mov ecx,340*FP_1 div ecx sub edx,160*FP_1 mov px,edx mov py,-FP_1*59/10 mov angle,0 test esi,1 jz @F neg edx mov px,edx mov py,-FP_1*81/10 mov angle,43340000h @@: cmp esi,4 jb roof_hd_car_pose mov eax,px mov py,eax mov px,FP_1*391/10 mov angle,42B40000h test esi,1 jz roof_hd_car_pose mov px,FP_1*369/10 mov angle,43870000h roof_hd_car_pose: fild px fmul roofGLInvFP3D fstp fx fild py fmul roofGLInvFP3D fstp fy invoke glPushMatrix invoke glTranslatef,DWORD PTR fx,0C2700000h,DWORD PTR fy invoke glRotatef,angle,0,3F800000h,0 mov ebx,roofHDLists3D add ebx,3 add ebx,roofNight3D invoke glCallList,ebx cmp roofNight3D,0 je roof_hd_car_pop invoke glDisable,0B50h invoke glDisable,0B60h invoke glEnable,0BE2h invoke glBlendFunc,1,1 invoke glEnable,8037h invoke glPolygonOffset,0BF800000h,0BF800000h invoke glDepthMask,0 mov eax,roofHDLists3D add eax,5 invoke glCallList,eax invoke glDisable,8037h invoke glDepthMask,1 roof_hd_car_pop: invoke glPopMatrix inc esi cmp esi,8 jb roof_hd_car xor esi,esi roof_hd_boat: imul eax,esi,47000 add eax,animationClock3D mov ecx,98 mul ecx mov ecx,340*FP_1 div ecx sub edx,160*FP_1 mov px,edx mov py,68*FP_1 cmp esi,3 jb roof_hd_boat_pose imul eax,esi,61000 add eax,animationClock3D mov ecx,98 mul ecx mov ecx,660*FP_1 div ecx add edx,90*FP_1 mov px,edx mov py,44*FP_1 test esi,1 jz roof_hd_boat_pose mov py,63*FP_1 roof_hd_boat_pose: fild px fmul roofGLInvFP3D fstp fx fild py fmul roofGLInvFP3D fstp fy invoke glPushMatrix invoke glTranslatef,DWORD PTR fx,0C2700000h,DWORD PTR fy mov eax,roofHDLists3D add eax,6 add eax,roofNight3D invoke glCallList,eax invoke glPopMatrix inc esi cmp esi,6 jb roof_hd_boat ret DrawRoofGLTraffic3D ENDP DrawRoofGLWater3D PROC uses ebx esi local ticks:DWORD,flowX:REAL4,flowY:REAL4 mov eax,animationClock3D xor edx,edx mov ecx,200000 div ecx mov ticks,edx fild ticks fdiv roofGLWaveDiv3D fst flowX fmul roofGLHalf3D fstp flowY invoke glMatrixMode,1702h invoke glLoadIdentity invoke glTranslatef,DWORD PTR flowX,DWORD PTR flowY,0 invoke glMatrixMode,1700h mov eax,roofHDDayTextures3D[(ROOF_CITY_WATER-ROOF_DECK)*4] cmp roofNight3D,0 je @F mov eax,roofHDNightTextures3D[(ROOF_CITY_WATER-ROOF_DECK)*4] @@: invoke glBindTexture,0DE1h,eax invoke glNormal3f,0,3F800000h,0 invoke glBegin,7 mov esi,OFFSET roofGLWaterVertices3D mov ebx,8 roof_gl_water_vertex: invoke glTexCoord2f,[esi+12],[esi+16] invoke glVertex3f,[esi],[esi+4],[esi+8] add esi,20 dec ebx jnz roof_gl_water_vertex invoke glEnd invoke glMatrixMode,1702h invoke glLoadIdentity invoke glMatrixMode,1700h ret DrawRoofGLWater3D ENDP UpdateRoofGLFog3D PROC uses ebx esi local channel:DWORD mov esi,roofSkyArt3D.pixels cmp roofNight3D,0 je @F mov esi,roofNightArt3D.pixels @@: mov eax,playerAngle shl eax,2 and eax,2047 mov edx,eax shr edx,9 shl edx,20 add esi,edx and eax,511 lea esi,[esi+eax*4+256*512*4] movzx eax,BYTE PTR [esi+2] mov channel,eax fild channel fdiv roofGLColorScale3D fstp roofGLFogCurrent3D[0] movzx eax,BYTE PTR [esi+1] mov channel,eax fild channel fdiv roofGLColorScale3D fstp roofGLFogCurrent3D[4] movzx eax,BYTE PTR [esi] mov channel,eax fild channel fdiv roofGLColorScale3D fstp roofGLFogCurrent3D[8] ret UpdateRoofGLFog3D ENDP RenderRoofHD3D PROC uses ebx esi edi local left:REAL8,right:REAL8,bottom:REAL8,top:REAL8 local angle:REAL4,px:REAL4,py:REAL4,eye:REAL4,clock:DWORD call UpdateRoofQuality3D invoke InitRoofHD3D test eax,eax jz roof_hd_render_failed mov eax,animationClock3D xor edx,edx mov ecx,33 div ecx mov clock,eax cmp eax,roofHDRenderClock3D jne roof_hd_render_refresh mov eax,playerX cmp eax,roofHDRenderX3D jne roof_hd_render_refresh mov eax,playerY cmp eax,roofHDRenderY3D jne roof_hd_render_refresh mov eax,playerAngle cmp eax,roofHDRenderAngle3D jne roof_hd_render_refresh mov eax,viewEye3D cmp eax,roofHDRenderEye3D jne roof_hd_render_refresh mov eax,viewHorizon3D cmp eax,roofHDRenderHorizon3D jne roof_hd_render_refresh mov eax,roofNight3D cmp eax,roofHDRenderTheme3D je roof_hd_render_ready roof_hd_render_refresh: invoke wglMakeCurrent,roofHDDC3D,roofHDRC3D push roofHDFBO3D push 8D40h call roofGLBindFBO3D invoke glViewport,0,0,roofRenderW3D,roofRenderH3D invoke glDepthMask,1 invoke glClearColor,0,0,0,3F800000h invoke glClear,4100h call UpdateRoofGLFog3D call DrawRoofGLSky3D invoke glEnable,0B71h invoke glDepthFunc,203h invoke glDepthMask,1 invoke glEnable,0B44h invoke glFrontFace,901h invoke glCullFace,405h invoke glEnable,0DE1h invoke glEnable,0B50h invoke glEnable,4000h invoke glEnable,0BA1h invoke glEnable,0B57h invoke glColorMaterial,408h,1602h invoke glColor4f,3F800000h,3F800000h,3F800000h,3F800000h invoke glShadeModel,1D01h invoke glEnable,0B60h invoke glFogi,0B65h,801h invoke glFogf,0B62h,3B2A64C3h mov eax,OFFSET roofGLFogCurrent3D mov ebx,OFFSET roofGLAmbientDay3D mov esi,OFFSET roofGLSunColorDay3D cmp roofNight3D,0 je @F mov ebx,OFFSET roofGLAmbientNight3D mov esi,OFFSET roofGLSunColorNight3D @@: invoke glFogfv,0B66h,eax invoke glLightModelfv,0B53h,ebx invoke glLightfv,4000h,1201h,esi fild viewHorizon3D fidiv roofGLCameraH3D fst top fld1 fsubp st(1),st fstp bottom invoke glMatrixMode,1701h invoke glLoadIdentity invoke glFrustum,DWORD PTR roofGLLeft3D,DWORD PTR roofGLLeft3D+4,DWORD PTR roofGLRight3D,DWORD PTR roofGLRight3D+4,DWORD PTR bottom,DWORD PTR bottom+4,DWORD PTR top,DWORD PTR top+4,DWORD PTR roofGLNear3D,DWORD PTR roofGLNear3D+4,DWORD PTR roofGLFar3D,DWORD PTR roofGLFar3D+4 invoke glMatrixMode,1700h invoke glLoadIdentity fild playerAngle fmul roofGLDegrees3D fadd roofGLNinety3D fstp angle invoke glRotatef,DWORD PTR angle,0,3F800000h,0 fild playerX fmul roofGLInvFP3D fchs fstp px fild playerY fmul roofGLInvFP3D fchs fstp py fild viewEye3D fmul roofGLInvFP3D fchs fstp eye invoke glTranslatef,DWORD PTR px,DWORD PTR eye,DWORD PTR py invoke glLightfv,4000h,1203h,OFFSET roofGLSunDirection3D invoke glMaterialfv,408h,1600h,OFFSET roofGLEmissionZero3D invoke glDisable,0BE2h call DrawRoofGLWater3D mov eax,roofHDLists3D add eax,roofNight3D invoke glCallList,eax cmp roofNight3D,0 je roof_hd_render_traffic invoke glDisable,0B50h invoke glEnable,0B60h invoke glFogfv,0B66h,OFFSET roofGLFogBlack3D invoke glEnable,0BE2h invoke glBlendFunc,1,1 invoke glEnable,8037h invoke glPolygonOffset,0BF800000h,0BF800000h invoke glDepthMask,0 mov eax,roofHDLists3D add eax,2 invoke glCallList,eax invoke glDisable,8037h invoke glDepthMask,1 roof_hd_render_traffic: invoke glFogfv,0B66h,OFFSET roofGLFogCurrent3D call DrawRoofGLTraffic3D invoke glReadPixels,0,0,roofRenderW3D,roofRenderH3D,80E1h,1401h,roofHDBuffer3D invoke glGetError test eax,eax jnz roof_hd_render_failed mov eax,playerX mov roofHDRenderX3D,eax mov eax,playerY mov roofHDRenderY3D,eax mov eax,playerAngle mov roofHDRenderAngle3D,eax mov eax,viewEye3D mov roofHDRenderEye3D,eax mov eax,viewHorizon3D mov roofHDRenderHorizon3D,eax mov eax,roofNight3D mov roofHDRenderTheme3D,eax mov eax,clock mov roofHDRenderClock3D,eax roof_hd_render_ready: mov eax,1 ret roof_hd_render_failed: call FreeRoofHD3D mov roofHDReady3D,-1 xor eax,eax ret RenderRoofHD3D ENDP PresentRoofHD3D PROC uses ebx esi edi dc:DWORD,left:DWORD,top:DWORD,viewW:DWORD,viewH:DWORD cmp hallLevel3D,HALL_ROOF jne roof_hd_present_fallback cmp engineMode,MODE_WALK jne roof_hd_present_fallback call RenderRoofHD3D test eax,eax jz roof_hd_present_fallback call ComposeRoofFrame3D invoke StretchBlt,dc,left,top,viewW,viewH,roofHDFinalDC3D,0,0,roofRenderW3D,roofRenderH3D,SRCCOPY ret roof_hd_present_fallback: xor eax,eax ret PresentRoofHD3D ENDP FreeRoofHD3D PROC uses ebx esi edi cmp roofHDRC3D,0 je roof_hd_free_windows invoke wglMakeCurrent,roofHDDC3D,roofHDRC3D cmp roofHDLists3D,0 je @F invoke glDeleteLists,roofHDLists3D,9 mov roofHDLists3D,0 @@: invoke glDeleteTextures,ROOF_GL_TEXTURES,OFFSET roofHDDayTextures3D invoke glDeleteTextures,ROOF_GL_TEXTURES,OFFSET roofHDNightTextures3D invoke glDeleteTextures,ROOF_GL_TEXTURES,OFFSET roofHDEmissionTextures3D invoke glDeleteTextures,2,OFFSET roofHDSkyTextures3D cmp roofHDFBO3D,0 je @F cmp roofGLDeleteFBO3D,0 je @F push OFFSET roofHDFBO3D push 1 call roofGLDeleteFBO3D mov roofHDFBO3D,0 @@: cmp roofHDDepth3D,0 je @F cmp roofGLDeleteRBO3D,0 je @F push OFFSET roofHDDepth3D push 1 call roofGLDeleteRBO3D mov roofHDDepth3D,0 @@: invoke glDeleteTextures,1,OFFSET roofHDColorTex3D invoke wglMakeCurrent,0,0 invoke wglDeleteContext,roofHDRC3D mov roofHDRC3D,0 roof_hd_free_windows: cmp roofHDFinalDC3D,0 je @F invoke SelectObject,roofHDFinalDC3D,roofHDFinalOld3D invoke DeleteDC,roofHDFinalDC3D mov roofHDFinalDC3D,0 @@: cmp roofHDFinalBmp3D,0 je @F invoke DeleteObject,roofHDFinalBmp3D mov roofHDFinalBmp3D,0 @@: cmp roofHDOverlayDC3D,0 je @F invoke SelectObject,roofHDOverlayDC3D,roofHDOverlayOld3D invoke DeleteDC,roofHDOverlayDC3D mov roofHDOverlayDC3D,0 @@: cmp roofHDOverlayBmp3D,0 je @F invoke DeleteObject,roofHDOverlayBmp3D mov roofHDOverlayBmp3D,0 @@: cmp roofHDDC3D,0 je @F invoke ReleaseDC,roofHDWindow3D,roofHDDC3D mov roofHDDC3D,0 @@: cmp roofHDWindow3D,0 je @F invoke DestroyWindow,roofHDWindow3D mov roofHDWindow3D,0 @@: cmp roofHDBuffer3D,0 je @F invoke GetProcessHeap invoke HeapFree,eax,0,roofHDBuffer3D mov roofHDBuffer3D,0 @@: invoke FreeRoofMesh3D,OFFSET roofHDMeshScene3D invoke FreeRoofMesh3D,OFFSET roofHDMeshCar3D invoke FreeRoofMesh3D,OFFSET roofHDMeshBoat3D mov roofHDReady3D,0 mov roofHDRenderClock3D,-1 ret FreeRoofHD3D ENDP