Tessellate terrain and light-map surfaces for vertex-fog drivers, render animated water from the tiled mesh, request accurate fog and extend renderer diagnostics. Add canal-front buildings, raised quays, trees and benches while preserving the terrace and native runtime. Update native regression coverage and shipping executables. Exclude laptop screenshots and local runtime data.
280 lines
6.7 KiB
PHP
280 lines
6.7 KiB
PHP
; Quality changes only roof rendering. Simulation, collisions and other games stay native.
|
|
UpdateRoofQuality3D PROC uses ebx esi edi
|
|
cmp hallLevel3D,HALL_ROOF
|
|
jne roof_quality_apply
|
|
cmp engineMode,MODE_WALK
|
|
jne roof_quality_apply
|
|
mov eax,animationClock3D
|
|
cmp eax,roofQualityClock3D
|
|
je roof_quality_apply
|
|
mov roofQualityClock3D,eax
|
|
invoke Pressed3D,77h
|
|
test eax,eax
|
|
jz roof_quality_auto
|
|
inc roofQualityMode3D
|
|
cmp roofQualityMode3D,3
|
|
jb @F
|
|
mov roofQualityMode3D,0
|
|
mov roofAutoWidth3D,960
|
|
@@:
|
|
mov roofQualityToast3D,1800
|
|
mov roofQualitySlow3D,0
|
|
roof_quality_auto:
|
|
mov eax,deltaTime3D
|
|
cmp eax,100
|
|
jbe @F
|
|
mov eax,100
|
|
@@:
|
|
sub roofQualityToast3D,eax
|
|
jns @F
|
|
mov roofQualityToast3D,0
|
|
@@:
|
|
cmp roofQualityMode3D,0
|
|
jne roof_quality_apply
|
|
cmp roofAutoWidth3D,640
|
|
je roof_quality_apply
|
|
cmp deltaTime3D,34
|
|
jbe roof_quality_cool
|
|
add roofQualitySlow3D,eax
|
|
cmp roofQualitySlow3D,1000
|
|
jb roof_quality_apply
|
|
mov roofAutoWidth3D,640
|
|
mov roofQualitySlow3D,0
|
|
mov roofQualityToast3D,1800
|
|
jmp roof_quality_apply
|
|
roof_quality_cool:
|
|
sub roofQualitySlow3D,8
|
|
jns roof_quality_apply
|
|
mov roofQualitySlow3D,0
|
|
roof_quality_apply:
|
|
mov eax,roofAutoWidth3D
|
|
cmp roofQualityMode3D,0
|
|
je roof_quality_size
|
|
mov eax,640
|
|
cmp roofQualityMode3D,1
|
|
je roof_quality_size
|
|
mov eax,1280
|
|
roof_quality_size:
|
|
mov roofRenderW3D,eax
|
|
imul eax,3
|
|
shr eax,2
|
|
mov roofRenderH3D,eax
|
|
mov eax,roofRenderW3D
|
|
cmp eax,roofQualityMapW3D
|
|
je roof_quality_done
|
|
mov roofQualityMapW3D,eax
|
|
mov roofHDRenderClock3D,-1
|
|
xor esi,esi
|
|
roof_quality_x:
|
|
mov eax,esi
|
|
imul eax,roofRenderW3D
|
|
xor edx,edx
|
|
mov ecx,SCREEN_W
|
|
div ecx
|
|
mov ebx,eax
|
|
shl eax,2
|
|
mov roofQualityX3D[esi*4],eax
|
|
mov eax,esi
|
|
inc eax
|
|
imul eax,roofRenderW3D
|
|
xor edx,edx
|
|
div ecx
|
|
sub eax,ebx
|
|
mov roofQualityXCount3D[esi*4],eax
|
|
inc esi
|
|
cmp esi,SCREEN_W
|
|
jb roof_quality_x
|
|
xor esi,esi
|
|
roof_quality_y:
|
|
mov eax,esi
|
|
imul eax,roofRenderH3D
|
|
xor edx,edx
|
|
mov ecx,SCREEN_H
|
|
div ecx
|
|
mov ebx,eax
|
|
mov edi,ROOF_HD_H-1
|
|
sub edi,eax
|
|
imul edi,ROOF_HD_W*4
|
|
mov roofQualityY3D[esi*4],edi
|
|
mov eax,esi
|
|
inc eax
|
|
imul eax,roofRenderH3D
|
|
xor edx,edx
|
|
div ecx
|
|
sub eax,ebx
|
|
mov roofQualityYCount3D[esi*4],eax
|
|
inc esi
|
|
cmp esi,SCREEN_H
|
|
jb roof_quality_y
|
|
cmp roofHDReady3D,1
|
|
jne roof_quality_done
|
|
call WriteRoofRendererInfo3D
|
|
roof_quality_done:
|
|
ret
|
|
UpdateRoofQuality3D ENDP
|
|
|
|
ComposeRoofFrame3D PROC uses ebx esi edi
|
|
local rows:DWORD,y:DWORD,x:DWORD,targetRow:DWORD,repeatRow:DWORD
|
|
invoke GdiFlush
|
|
mov esi,roofHDBuffer3D
|
|
mov eax,ROOF_HD_H
|
|
sub eax,roofRenderH3D
|
|
imul eax,ROOF_HD_W*4
|
|
add eax,roofHDFinalPixels3D
|
|
mov edi,eax
|
|
mov eax,roofRenderH3D
|
|
mov rows,eax
|
|
roof_compose_background:
|
|
mov ecx,roofRenderW3D
|
|
rep movsd
|
|
mov eax,ROOF_HD_W
|
|
sub eax,roofRenderW3D
|
|
lea edi,[edi+eax*4]
|
|
dec rows
|
|
jnz roof_compose_background
|
|
xor esi,esi
|
|
mov y,0
|
|
roof_compose_row:
|
|
mov ebx,y
|
|
mov eax,roofQualityY3D[ebx*4]
|
|
add eax,roofHDFinalPixels3D
|
|
mov targetRow,eax
|
|
mov eax,roofQualityYCount3D[ebx*4]
|
|
mov repeatRow,eax
|
|
mov x,0
|
|
roof_compose_pixel:
|
|
mov eax,screenBuffer[esi*4]
|
|
cmp roofCityMask3D[esi],0
|
|
je roof_compose_opaque
|
|
cmp eax,roofHDBackdrop3D[esi*4]
|
|
je roof_compose_next
|
|
roof_compose_opaque:
|
|
mov ebx,x
|
|
mov edi,roofQualityX3D[ebx*4]
|
|
add edi,targetRow
|
|
mov [edi],eax
|
|
cmp roofQualityXCount3D[ebx*4],2
|
|
jne @F
|
|
mov [edi+4],eax
|
|
@@:
|
|
cmp repeatRow,2
|
|
jne roof_compose_next
|
|
mov [edi-ROOF_HD_W*4],eax
|
|
cmp roofQualityXCount3D[ebx*4],2
|
|
jne roof_compose_next
|
|
mov [edi-ROOF_HD_W*4+4],eax
|
|
roof_compose_next:
|
|
inc esi
|
|
inc x
|
|
cmp x,SCREEN_W
|
|
jb roof_compose_pixel
|
|
inc y
|
|
cmp y,SCREEN_H
|
|
jb roof_compose_row
|
|
ret
|
|
ComposeRoofFrame3D ENDP
|
|
|
|
RenderRoofQualityToast3D PROC
|
|
cmp roofQualityToast3D,0
|
|
je roof_quality_toast_done
|
|
mov eax,OFFSET roofQualityAutoText3D
|
|
cmp roofRenderW3D,640
|
|
jne @F
|
|
mov eax,OFFSET roofQualityEcoText3D
|
|
@@:
|
|
cmp roofQualityMode3D,2
|
|
jne @F
|
|
mov eax,OFFSET roofQualityHighText3D
|
|
@@:
|
|
push eax
|
|
invoke DrawBox,12,40,160,18,00151B1Eh
|
|
pop eax
|
|
invoke DrawString8x8,20,45,eax,00E8D7ADh
|
|
roof_quality_toast_done:
|
|
ret
|
|
RenderRoofQualityToast3D ENDP
|
|
|
|
WriteRoofLogString3D PROC uses ebx esi handle:DWORD,value:DWORD
|
|
local written:DWORD
|
|
mov ebx,handle
|
|
mov esi,value
|
|
test esi,esi
|
|
jnz @F
|
|
mov esi,OFFSET roofLogUnknown3D
|
|
@@:
|
|
xor ecx,ecx
|
|
roof_log_length:
|
|
cmp BYTE PTR [esi+ecx],0
|
|
je roof_log_write
|
|
inc ecx
|
|
jmp roof_log_length
|
|
roof_log_write:
|
|
invoke WriteFile,ebx,esi,ecx,ADDR written,0
|
|
ret
|
|
WriteRoofLogString3D ENDP
|
|
|
|
WriteRoofRendererInfo3D PROC uses ebx esi
|
|
local number[16]:BYTE
|
|
invoke CreateDirectoryA,OFFSET runtime3D,0
|
|
invoke CreateFileA,OFFSET roofLogPath3D,40000000h,1,0,2,80h,0
|
|
cmp eax,-1
|
|
je roof_log_done
|
|
mov ebx,eax
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogHeader3D
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogTerrain3D
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogTriangles3D
|
|
invoke FormatNumber,roofHDMeshScene3D[4],ADDR number
|
|
invoke WriteRoofLogString3D,ebx,ADDR number
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D
|
|
mov esi,0
|
|
roof_log_gl_string:
|
|
mov eax,OFFSET roofLogVendor3D
|
|
cmp esi,0
|
|
je @F
|
|
mov eax,OFFSET roofLogRenderer3D
|
|
cmp esi,1
|
|
je @F
|
|
mov eax,OFFSET roofLogVersion3D
|
|
@@:
|
|
invoke WriteRoofLogString3D,ebx,eax
|
|
xor eax,eax
|
|
cmp roofHDRC3D,0
|
|
je @F
|
|
mov eax,esi
|
|
add eax,1F00h
|
|
invoke glGetString,eax
|
|
@@:
|
|
invoke WriteRoofLogString3D,ebx,eax
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D
|
|
inc esi
|
|
cmp esi,3
|
|
jb roof_log_gl_string
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogStage3D
|
|
mov eax,roofHDStage3D
|
|
add al,'0'
|
|
mov roofLogDigit3D,al
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogDigit3D
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogAssets3D
|
|
mov roofLogDigit3D,'0'
|
|
cmp roofCityArt3D.pixels,0
|
|
je @F
|
|
mov roofLogDigit3D,'1'
|
|
@@:
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogDigit3D
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogWidth3D
|
|
mov eax,OFFSET roofLogMedium3D
|
|
cmp roofRenderW3D,960
|
|
je @F
|
|
mov eax,OFFSET roofLogSmall3D
|
|
cmp roofRenderW3D,640
|
|
je @F
|
|
mov eax,OFFSET roofLogLarge3D
|
|
@@:
|
|
invoke WriteRoofLogString3D,ebx,eax
|
|
invoke WriteRoofLogString3D,ebx,OFFSET roofLogNL3D
|
|
invoke CloseHandle,ebx
|
|
roof_log_done:
|
|
ret
|
|
WriteRoofRendererInfo3D ENDP
|