; Benches are fixed world surfaces, not camera-facing cutouts. .data cityBenchCenters3D dd FP_1*151/10,FP_1*45/2 cityBenchMetal3D dd (32*32) dup(0FF24282Dh) IFDEF CASINO_ACTION_TEST cityBenchVisible3D dd 0 .data? cityBenchBefore3D dd SCREEN_SIZE dup(?) ENDIF .code DrawCityBenchBlock3D PROC x0:DWORD,x1:DWORD,y0:DWORD,y1:DWORD,z0:DWORD,z1:DWORD,material:DWORD invoke DrawCityBoxSides3D,x0,x1,y0,y1,z0,z1,material invoke DrawCityHorizontal3D,x0,x1,y0,y1,z1,material ret DrawCityBenchBlock3D ENDP DrawCityBench3D PROC uses ebx esi center:DWORD local loX:DWORD,hiX:DWORD,loY:DWORD,hiY:DWORD mov eax,center sub eax,FP_1*19/20 mov loX,eax add eax,FP_1*19/10 mov hiX,eax mov loY,FP_1*327/20 xor esi,esi city_bench_seat: mov eax,loY add eax,FP_1*3/20 mov hiY,eax invoke DrawCityBenchBlock3D,loX,hiX,loY,hiY,FP_1*11/25,FP_HALF,96 add loY,FP_1*9/50 inc esi cmp esi,3 jb city_bench_seat invoke DrawCityBenchBlock3D,loX,hiX,FP_1*422/25,FP_1*847/50,FP_1*18/25,FP_1*41/50,96 invoke DrawCityBenchBlock3D,loX,hiX,FP_1*422/25,FP_1*847/50,FP_1*9/10,FP_1,96 xor esi,esi city_bench_leg: mov eax,center sub eax,FP_1*3/4 test esi,1 jz @F add eax,FP_1*3/2 @@: sub eax,FP_1/25 mov loX,eax add eax,FP_1*2/25 mov hiX,eax mov loY,FP_1*819/50 mov hiY,FP_1*823/50 mov ebx,FP_1*17/25 test esi,2 jz @F mov loY,FP_1*843/50 mov hiY,FP_1*847/50 mov ebx,FP_1*21/20 @@: invoke DrawCityBenchBlock3D,loX,hiX,loY,hiY,0,ebx,110 inc esi cmp esi,4 jb city_bench_leg mov eax,center sub eax,FP_1*21/25 mov loX,eax add eax,FP_1*2/25 mov hiX,eax invoke DrawCityBenchBlock3D,loX,hiX,FP_1*327/20,FP_1*169/10,FP_1*17/25,FP_1*18/25,110 add loX,FP_1*8/5 add hiX,FP_1*8/5 invoke DrawCityBenchBlock3D,loX,hiX,FP_1*327/20,FP_1*169/10,FP_1*17/25,FP_1*18/25,110 ret DrawCityBench3D ENDP RenderCityFurniture3D PROC uses esi edi IFDEF CASINO_ACTION_TEST lea esi,screenBuffer lea edi,cityBenchBefore3D mov ecx,SCREEN_SIZE rep movsd ENDIF invoke DrawCityBench3D,cityBenchCenters3D invoke DrawCityBench3D,cityBenchCenters3D[4] IFDEF CASINO_ACTION_TEST mov cityBenchVisible3D,0 xor ecx,ecx city_bench_count: mov eax,screenBuffer[ecx*4] cmp eax,cityBenchBefore3D[ecx*4] je @F inc cityBenchVisible3D @@: inc ecx cmp ecx,SCREEN_SIZE jb city_bench_count ENDIF ret RenderCityFurniture3D ENDP