- Stage 1: Eliminate fish-eye distortion with precomputed tangential ray offset table and fractional DDA depth - Stage 2: Full asset management in EblanStudio (stb_image/stb_image_write, 128x128 BGRA texture packaging, WAV sound manager) - Stage 3: Multi-level room streaming, LevelTransition/CELL_PORTAL trigger system, 16-frame screen fade to black - Stage 4: 60Hz cutscene engine in pure x86 ASM (v4 binary track, waypoint camera motion, shortest-arc pan, CP1251 Russian subtitles, letterbox overlay, audio) - Stage 5: EblanStudio cutscene timeline (F6) and windowless Live ASM Viewport over shared-memory IPC directly rendered into DX11 - Tooling & Tests: comprehensive regression test suite (94 editor + 107 engine tests), IPC tests, and cutscene demo
150 lines
4 KiB
PHP
150 lines
4 KiB
PHP
; Windowless renderer used by EblanStudio. Same Render3DScene and overlays as game.
|
|
; Fixed wire layout is mirrored by editor/src/preview_protocol.h.
|
|
.data
|
|
previewPrefix db "--preview:",0
|
|
previewHandle dd 0
|
|
previewMemory dd 0
|
|
previewParent dd 0
|
|
previewTextureRevision dd -1
|
|
.code
|
|
TryEnginePreview PROC uses ebx ecx edx esi edi
|
|
mov esi, OFFSET startupMapPath
|
|
mov edi, OFFSET previewPrefix
|
|
mov ecx, 10
|
|
repe cmpsb
|
|
jne preview_not_requested
|
|
invoke OpenFileMappingA, 6, 0, esi ; FILE_MAP_READ | FILE_MAP_WRITE
|
|
test eax, eax
|
|
jz preview_exit_error
|
|
mov previewHandle, eax
|
|
invoke MapViewOfFile, eax, 6, 0, 0, 1357792
|
|
test eax, eax
|
|
jz preview_exit_error
|
|
mov previewMemory, eax
|
|
mov ebx, eax
|
|
cmp DWORD PTR [ebx], 56504245h
|
|
jne preview_exit_error
|
|
cmp DWORD PTR [ebx+4], 1
|
|
jne preview_exit_error
|
|
invoke OpenProcess, 00100000h, 0, DWORD PTR [ebx+12] ; SYNCHRONIZE
|
|
test eax, eax
|
|
jz preview_exit_error
|
|
mov previewParent, eax
|
|
call InitMathTables
|
|
call GenerateDefaultTextures
|
|
preview_wait:
|
|
invoke WaitForSingleObject, previewParent, 0
|
|
test eax, eax
|
|
jz preview_exit_ok
|
|
mov ebx, previewMemory
|
|
cmp DWORD PTR [ebx+8], 3
|
|
je preview_exit_ok
|
|
cmp DWORD PTR [ebx+8], 1
|
|
je preview_render
|
|
invoke Sleep, 1
|
|
jmp preview_wait
|
|
preview_render:
|
|
; Treat IPC as untrusted: bounds before touching engine buffers.
|
|
mov eax, [ebx+16]
|
|
cmp eax, 2048
|
|
jae preview_exit_error
|
|
mov playerX, eax
|
|
mov eax, [ebx+20]
|
|
cmp eax, 2048
|
|
jae preview_exit_error
|
|
mov playerY, eax
|
|
mov eax, [ebx+24]
|
|
and eax, 511
|
|
mov playerAngle, eax
|
|
mov eax, [ebx+28]
|
|
mov mapCeilingColor, eax
|
|
mov eax, [ebx+32]
|
|
mov mapFloorColor, eax
|
|
mov eax, [ebx+36]
|
|
cmp eax, MAX_SPRITES
|
|
ja preview_exit_error
|
|
mov spriteCount, eax
|
|
lea esi, [ebx+128]
|
|
mov edi, OFFSET gameMap
|
|
mov ecx, 1024/4
|
|
rep movsd
|
|
push esi
|
|
mov esi, OFFSET gameMap
|
|
mov ecx, MAP_SIZE
|
|
preview_cell_check:
|
|
lodsb
|
|
cmp al, 15
|
|
ja preview_exit_error
|
|
loop preview_cell_check
|
|
pop esi
|
|
mov edi, OFFSET spriteList
|
|
mov ecx, 32*sizeof SpriteStruct/4
|
|
rep movsd
|
|
; Validate every sprite, including unsaved inspector edits.
|
|
mov esi, OFFSET spriteList
|
|
mov ecx, spriteCount
|
|
preview_sprite_check:
|
|
test ecx, ecx
|
|
jz preview_textures
|
|
cmp DWORD PTR [esi].SpriteStruct.textureId, MAX_TEXTURES
|
|
jae preview_exit_error
|
|
cmp DWORD PTR [esi].SpriteStruct.x, 2048
|
|
jae preview_exit_error
|
|
cmp DWORD PTR [esi].SpriteStruct.y, 2048
|
|
jae preview_exit_error
|
|
cmp DWORD PTR [esi].SpriteStruct.scale, 1048576
|
|
ja preview_exit_error
|
|
add esi, sizeof SpriteStruct
|
|
dec ecx
|
|
jmp preview_sprite_check
|
|
preview_textures:
|
|
mov eax, [ebx+48]
|
|
cmp eax, previewTextureRevision
|
|
je preview_scene
|
|
mov previewTextureRevision, eax
|
|
lea esi, [ebx+2016]
|
|
mov edi, OFFSET textureBuffer
|
|
mov ecx, MAX_TEXTURES*TEX_SIZE_BYTES/4
|
|
rep movsd
|
|
preview_scene:
|
|
call Render3DScene
|
|
mov ebx, previewMemory
|
|
cmp DWORD PTR [ebx+40], 0
|
|
je preview_copy_frame
|
|
mov cutsceneSubtitle, -1
|
|
cmp BYTE PTR [ebx+1920], 0
|
|
je preview_overlay
|
|
lea esi, [ebx+1920]
|
|
mov edi, OFFSET cutsceneStrings
|
|
mov ecx, 96/4
|
|
rep movsd
|
|
mov BYTE PTR [cutsceneStrings+95], 0
|
|
mov cutsceneStringCount, 1
|
|
mov cutsceneSubtitle, 0
|
|
preview_overlay:
|
|
call RenderCutsceneOverlay
|
|
mov ebx, previewMemory
|
|
mov eax, [ebx+44]
|
|
cmp eax, 16
|
|
ja preview_exit_error
|
|
mov cutsceneFade, eax
|
|
call ApplyCutsceneFade
|
|
preview_copy_frame:
|
|
mov esi, OFFSET screenBuffer
|
|
mov ebx, previewMemory
|
|
lea edi, [ebx+1050592]
|
|
mov ecx, FRAME_BUFFER_SIZE/4
|
|
rep movsd
|
|
mov eax, 2
|
|
xchg eax, [ebx+8] ; Publish complete frame (full memory barrier).
|
|
jmp preview_wait
|
|
preview_exit_ok:
|
|
invoke UnmapViewOfFile, previewMemory
|
|
invoke CloseHandle, previewParent
|
|
invoke CloseHandle, previewHandle
|
|
invoke ExitProcess, 0
|
|
preview_exit_error:
|
|
invoke ExitProcess, 2
|
|
preview_not_requested:
|
|
ret
|
|
TryEnginePreview ENDP
|