fix: restore rooftop ground on Intel and fill canal frontage

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.
This commit is contained in:
Artvasil09 2026-10-27 19:24:00 +03:00
parent 41ba8f46ed
commit 1006ba444b
19 changed files with 3005 additions and 32 deletions

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@
"format": "RGM1: count/bytes + material/3*(position,normal,uv)",
"gl_axes": "X/Z/Y; normals explicitly outward; no runtime model engine",
"triangles": {
"scene": 35386,
"scene": 44400,
"car": 360,
"boat": 170
},
@ -6660,6 +6660,6 @@
true
]
],
"removed_invisible_triangles": 18309,
"removed_invisible_triangles": 20717,
"front_face": "CCW"
}

Binary file not shown.

View file

@ -8,7 +8,7 @@ namespace AssemblerCasinoLauncher
{
static class Program
{
const string ExpectedPokerSha256 = "63C04B59D74772621A7563EA70DFA6764C60684459EE7D046AF30B555A01FF15";
const string ExpectedPokerSha256 = "CF04525CD5C9C87412001FF4F4CBBCA1C7019F71A53FEBA3BB8051323B0EB634";
[STAThread]
static void Main()

Binary file not shown.

Binary file not shown.

View file

@ -83,7 +83,13 @@ readback synchronisation, without a redundant preceding glFinish.
and gameplay do not change with the render profile; other rooms are unaffected.
- The offline mesh packer discards only triangles that face away from every
possible rooftop eye position. Runtime back-face culling handles head turns.
The static mesh now contains 35,386 triangles instead of 53,695.
The static mesh, including driver-safe ground and canal frontage, stays under 48,000
triangles. Never-visible faces are pruned before shipping.
- Terrain and light-map triangles crossing the near district are at most 64 m
wide, with finer cells near the terrace. This avoids relying on per-fragment
fog for multi-kilometre polygons on integrated OpenGL drivers. Water animation
uses its own display list from the same tessellated mesh, not two giant quads.
GL_NICEST requests accurate fog, but the geometry remains safe if ignored.
- CPU foreground surfaces use projected screen bounds and camera-facing box
sides. The final frame avoids an extra GDI scaling/alpha-blending pass.
- Mipmap generation is optional on older OpenGL drivers. If hardware rendering
@ -97,6 +103,12 @@ Integrated Intel graphics use shared system memory; the small dedicated-memory
figure alone is not a useful rendering budget. Actual laptop performance must be
checked on that machine, not inferred from the desktop benchmark.
The western canal has two rows of varied waterfront facades, raised stone quays,
bridge openings, trees and benches. These replace the empty cleared block rows;
they use the same world records in the GL and software renderers. The offline
`pack_rooftop.py --district-only` option rebuilds layout and lighting without
repacking unchanged sky, hand-animation or material assets.
The art direction takes atmospheric inspiration from the rooftop reference:
https://www.loftprojectetagi.ru/visitors/krysha/ . It is an original game backdrop,
not an exact survey or reproduction of that venue. Generated source images are
@ -121,3 +133,6 @@ written under `build/hall-expansion/roof-*.png`. `--parity` verifies tested
procedures against the full shipping object before publishing.
The native harness also checks all three resolution profiles, automatic downgrade,
F8 switching, and software roads/water with both present and missing city textures.
It also captures GL_FASTEST fog, checks ground-cell bounds and water tessellation.
These are compatibility checks on the test machine, not a substitute for confirming
the result on the laptop's actual Intel driver.

BIN
poker.exe

Binary file not shown.

View file

@ -1,10 +1,16 @@
; Generated city block footprints and rooftop-relative heights.
ROOF_BUILDING_COUNT equ 518
ROOF_BUILDING_COUNT equ 578
.data
roofDistrict3D LABEL DWORD
dd 1209139,2162688,2555904,3473408,-2949120,187,5
dd 458752,1150157,2555904,3473408,-3145728,186,5
dd 917504,1638400,-1966080,-1310720,-3538944,203,0
dd 2818048,3771597,2359296,3473408,-2621440,187,5
dd -1019085,-196608,2555904,3473408,-2883584,186,5
dd 3276800,3997696,-1966080,-1310720,-3211264,203,0
dd -1441792,-720896,-1966080,-1310720,-3407872,203,0
dd 3830579,4521984,2359296,3473408,-3145728,188,5
dd -1900544,-1078067,2555904,3473408,-3080192,193,5
dd 393216,2228224,-3538944,-3080192,-2339635,192,1
dd 5111808,5570560,262144,1179648,-3014656,192,2
dd -1966080,-131072,-3538944,-3080192,-3126067,189,1
@ -15,17 +21,25 @@ roofDistrict3D LABEL DWORD
dd -4325376,-2490368,1179648,1638400,-2929459,188,1
dd 5111808,6946816,-196608,262144,-3014656,192,0
dd 5111808,6946816,1179648,1638400,-2994995,192,1
dd -3247309,-2555904,2555904,3473408,-2818048,193,5
dd -589824,-131072,-4456448,-3538944,-3126067,189,3
dd 2752512,3211264,-4456448,-3538944,-2293760,187,2
dd -4325376,-2490368,-1179648,-720896,-2536243,187,1
dd 5111808,6946816,-1179648,-720896,-2929459,191,1
dd 458752,1281229,5373952,6225920,-2686976,189,5
dd 1340211,2162688,5373952,6225920,-2490368,190,5
dd -888013,-196608,5373952,6225920,-3145728,189,5
dd 393216,2228224,-4915200,-4456448,-2359296,192,0
dd -4325376,-3866624,262144,1179648,-2949120,188,2
dd 6488064,6946816,262144,1179648,-2994995,192,3
dd 2818048,3574989,5373952,6291456,-2883584,190,5
dd -4259840,-3306291,2555904,3473408,-3014656,192,5
dd -1966080,-1507328,-4456448,-3538944,-3145728,189,2
dd 4128768,4587520,-4456448,-3538944,-2274099,187,3
dd -4325376,-2490368,-2555904,-2097152,-2555904,187,0
dd 5111808,6946816,-2555904,-2097152,-2949120,191,0
dd -1900544,-946995,5373952,6225920,-2621440,188,5
dd 3633971,4521984,5373952,6291456,-2686976,191,5
dd -1966080,-131072,-4915200,-4456448,-3145728,189,0
dd 2752512,4587520,-4915200,-4456448,-2293760,187,0
dd -4325376,-3866624,-2097152,-1179648,-2555904,187,2
@ -34,11 +48,13 @@ roofDistrict3D LABEL DWORD
dd 5111808,5570560,-4456448,-3538944,-2555904,190,2
dd 393216,2228224,-5898240,-5439488,-2994995,191,1
dd -5308416,-4849664,262144,1179648,-2667315,193,3
dd -3509453,-2555904,5373952,6160384,-2949120,188,5
dd -1966080,-131072,-5898240,-5439488,-3060531,188,1
dd -5308416,-4849664,-2097152,-1179648,-2274099,192,3
dd 7471104,7929856,-2097152,-1179648,-2863923,186,1
dd -1966080,-131072,6881280,7340032,-3014656,186,0
dd 2752512,4587520,6881280,7340032,-2883584,192,0
dd -5868749,-4915200,2490368,3473408,-2621440,192,5
dd 7864320,8912896,65536,1376256,-1441792,199,0
dd 393216,851968,-6815744,-5898240,-3014656,191,2
dd -6684672,-4849664,-196608,262144,-2686976,193,0
@ -46,6 +62,7 @@ roofDistrict3D LABEL DWORD
dd -4325376,-2490368,-4915200,-4456448,-2162688,186,0
dd -4325376,-3866624,-4456448,-3538944,-2162688,186,2
dd 5111808,6946816,-4915200,-4456448,-2555904,190,0
dd -4259840,-3568435,5373952,6160384,-3145728,187,5
dd -589824,-131072,-6815744,-5898240,-3060531,188,3
dd -6684672,-4849664,-1179648,-720896,-2274099,192,1
dd 7471104,9306112,-1179648,-720896,-2883584,186,0
@ -57,6 +74,7 @@ roofDistrict3D LABEL DWORD
dd -1966080,-1507328,7340032,8257536,-3014656,186,2
dd 393216,2228224,-7274496,-6815744,-3014656,191,0
dd -6684672,-6225920,262144,1179648,-2686976,193,2
dd -6619136,-5927731,2490368,3473408,-2818048,191,5
dd 5111808,6946816,-5898240,-5439488,-2143027,189,1
dd 7471104,7929856,-4456448,-3538944,-2490368,193,2
dd 5111808,6946816,6881280,7340032,-3145728,187,0
@ -67,17 +85,20 @@ roofDistrict3D LABEL DWORD
dd 5111808,5570560,-6815744,-5898240,-2162688,189,2
dd 7471104,9306112,-3538944,-3080192,-2470707,193,1
dd 5111808,5570560,7340032,8257536,-3145728,187,2
dd -5737677,-4915200,5373952,6160384,-2883584,187,5
dd -3932160,-2883584,-7012352,-5701632,-2097152,204,0
dd -6291456,-5242880,-4653056,-3342336,-2293760,204,0
dd 393216,2228224,-8257536,-7798784,-2601779,190,1
dd 393216,2228224,9240576,9699328,-2293760,190,0
dd 7471104,9306112,-4915200,-4456448,-2490368,193,0
dd 6488064,6946816,7340032,8257536,-3126067,187,3
dd -6619136,-5796659,5373952,6160384,-3080192,186,5
dd 2752512,4587520,-8257536,-7798784,-2863923,193,1
dd 2752512,4587520,9240576,9699328,-2228224,193,0
dd 5111808,6946816,-7274496,-6815744,-2162688,189,0
dd 8847360,9306112,-4456448,-3538944,-2470707,193,3
dd 5111808,6946816,8257536,8716288,-3126067,187,1
dd -8096973,-7274496,2490368,3473408,-2555904,191,5
dd 393216,851968,-9175040,-8257536,-2621440,190,2
dd -9043968,-7208960,-196608,262144,-2752512,190,0
dd -9043968,-7208960,1179648,1638400,-2732851,190,1
@ -99,6 +120,8 @@ roofDistrict3D LABEL DWORD
dd 393216,2228224,-9633792,-9175040,-2621440,190,0
dd -9043968,-8585216,262144,1179648,-2752512,190,2
dd 393216,2228224,10616832,11075584,-2274099,190,1
dd -8978432,-8155955,2490368,3473408,-2752512,190,5
dd -7965901,-7274496,5373952,6160384,-2818048,186,5
dd -9043968,-7208960,-3538944,-3080192,-2994995,188,1
dd 9830400,11665408,-3538944,-3080192,-2732851,188,1
dd -2949120,-2490368,9699328,10616832,-3126067,192,3
@ -117,6 +140,7 @@ roofDistrict3D LABEL DWORD
dd -9043968,-7208960,-4915200,-4456448,-3014656,188,0
dd 9830400,11665408,-4915200,-4456448,-2752512,188,0
dd -4325376,-3866624,9699328,10616832,-3145728,192,2
dd -8978432,-8024883,5373952,6160384,-3014656,193,5
dd 393216,2228224,-10616832,-10158080,-2208563,189,1
dd -10027008,-9568256,262144,1179648,-2470707,187,3
dd -4325376,-2490368,-9633792,-9175040,-2424832,192,0
@ -140,6 +164,7 @@ roofDistrict3D LABEL DWORD
dd 9830400,11665408,-5898240,-5439488,-2339635,187,1
dd 9830400,11665408,6881280,7340032,-2293760,193,0
dd 7471104,7929856,9699328,10616832,-2424832,191,2
dd -10325197,-9633792,2490368,3473408,-2490368,190,5
dd 786432,1835008,11862016,13172736,-1900544,204,0
dd 393216,851968,-11534336,-10616832,-2228224,189,2
dd -11403264,-9568256,-196608,262144,-2490368,187,0
@ -170,12 +195,14 @@ roofDistrict3D LABEL DWORD
dd 11206656,11665408,7340032,8257536,-2274099,193,3
dd -6684672,-4849664,10616832,11075584,-2863923,189,1
dd 7471104,9306112,10616832,11075584,-2405171,191,1
dd -11337728,-10384179,2490368,3473408,-2686976,189,5
dd 5111808,5570560,-11534336,-10616832,-2424832,187,2
dd -11403264,-9568256,-3538944,-3080192,-3060531,193,1
dd 12189696,14024704,-3538944,-3080192,-2667315,191,1
dd 5111808,5570560,12058624,12976128,-2883584,189,2
dd 393216,2228224,-11993088,-11534336,-2228224,189,0
dd -11403264,-10944512,262144,1179648,-2490368,187,2
dd -10587341,-9633792,5373952,6291456,-2621440,193,5
dd -1966080,-131072,-11993088,-11534336,-2293760,186,0
dd -11403264,-10944512,-2097152,-1179648,-3145728,186,2
dd 13565952,14024704,-2097152,-1179648,-3060531,192,3
@ -195,6 +222,7 @@ roofDistrict3D LABEL DWORD
dd -10027008,-9568256,7340032,8257536,-2601779,190,3
dd 12189696,12648448,7340032,8257536,-2228224,188,2
dd -6684672,-4849664,11599872,12058624,-2228224,190,0
dd -11337728,-10646323,5373952,6291456,-2818048,192,5
dd 10223616,11272192,9502720,10813440,-1900544,204,0
dd 5111808,6946816,-11993088,-11534336,-2424832,187,0
dd -11403264,-10944512,-4456448,-3538944,-3080192,193,2
@ -213,6 +241,7 @@ roofDistrict3D LABEL DWORD
dd 9830400,11665408,-9633792,-9175040,-3014656,186,0
dd -9043968,-7208960,10616832,11075584,-2929459,186,1
dd -9043968,-8585216,9699328,10616832,-2949120,186,2
dd -12946637,-11993088,2424832,3473408,-3014656,189,5
dd -6684672,-6225920,-11534336,-10616832,-3145728,188,2
dd 12189696,14024704,-7274496,-6815744,-2293760,190,0
dd -11403264,-9568256,8257536,8716288,-2601779,190,1
@ -229,13 +258,16 @@ roofDistrict3D LABEL DWORD
dd 12189696,12648448,9699328,10616832,-2621440,189,2
dd -9043968,-7208960,11599872,12058624,-2293760,187,0
dd 9830400,11665408,11599872,12058624,-3080192,187,0
dd -12815565,-11993088,5373952,6291456,-2555904,192,5
dd 9830400,10289152,-11534336,-10616832,-2621440,193,2
dd -11403264,-9568256,-8257536,-7798784,-2274099,191,1
dd -11403264,-9568256,9240576,9699328,-3014656,191,0
dd 12189696,14024704,9240576,9699328,-2621440,189,0
dd -7667712,-7208960,12058624,12976128,-2274099,187,3
dd 9830400,10289152,12058624,12976128,-3080192,187,2
dd -13697024,-13005619,2424832,3473408,-2490368,188,5
dd 12582912,13631488,-9371648,-8060928,-2293760,204,0
dd -13697024,-12874547,5373952,6291456,-2752512,191,5
dd -9043968,-8585216,-11534336,-10616832,-2883584,193,2
dd -11403264,-9568256,-9633792,-9175040,-2293760,191,0
dd -11403264,-9568256,10616832,11075584,-2994995,191,1
@ -254,9 +286,12 @@ roofDistrict3D LABEL DWORD
dd 12189696,12648448,-11534336,-10616832,-2883584,188,2
dd 12189696,14024704,11599872,12058624,-3014656,190,0
dd 12189696,12648448,12058624,12976128,-3014656,190,2
dd -15174861,-14352384,2424832,3473408,-2949120,188,5
dd -65536,2686976,-17629184,-14483456,-2359296,190,4
dd -17170432,-13762560,-851968,2293760,-2686976,190,4
dd -131072,2752512,15925248,19070976,-2293760,190,4
dd -15043789,-14352384,5373952,6291456,-2490368,191,5
dd -16056320,-15233843,2424832,3473408,-3145728,187,5
dd -11403264,-9568256,-11993088,-11534336,-2949120,190,0
dd -11403264,-10944512,-11534336,-10616832,-2949120,190,2
dd 12189696,14024704,-11993088,-11534336,-2883584,188,0
@ -268,6 +303,8 @@ roofDistrict3D LABEL DWORD
dd 16384000,19791872,-5046272,-1900544,-2686976,189,4
dd -3997696,-1769472,15925248,19070976,-2621440,189,4
dd 4390912,6619136,15925248,19070976,-1966080,191,4
dd -16056320,-15102771,5373952,6291456,-2686976,190,5
dd -17468621,-16711680,2359296,3473408,-2752512,187,5
dd -8454144,-5701632,-17629184,-14483456,-3014656,188,4
dd 8323072,11075584,-17629184,-14483456,-1703936,192,4
dd -16973824,-13959168,-9240576,-6094848,-2228224,188,4
@ -276,6 +313,9 @@ roofDistrict3D LABEL DWORD
dd 16777216,19398656,7536640,10682368,-2424832,192,4
dd -8519680,-5636096,15925248,19070976,-2949120,188,4
dd 8257536,11141120,15925248,19070976,-1638400,192,4
dd -17665229,-16711680,5373952,6225920,-3014656,190,5
dd -18415616,-17527603,2359296,3473408,-2949120,186,5
dd -18415616,-17724211,5373952,6225920,-2490368,189,5
dd 0,2621440,-21823488,-18677760,-3080192,189,4
dd -12910592,-9633792,-17629184,-14483456,-1441792,187,4
dd 12779520,15007744,-17629184,-14483456,-3276800,193,4
@ -287,14 +327,18 @@ roofDistrict3D LABEL DWORD
dd -12386304,-10158080,15925248,19070976,-3276800,187,4
dd 12713984,15073280,15925248,19070976,-3211264,193,4
dd -196608,2818048,20119552,23265280,-1572864,191,4
dd -20024525,-19070976,2359296,3473408,-2686976,186,5
dd -4456448,-1310720,-21823488,-18677760,-1507328,188,4
dd 3866624,7143424,-21823488,-18677760,-2752512,190,4
dd -20905984,-18415616,-5046272,-1900544,-1835008,188,4
dd 20905984,23658496,-5046272,-1900544,-2359296,190,4
dd -4063232,-1703936,20119552,23265280,-1900544,190,4
dd 4259840,6750208,20119552,23265280,-3145728,192,4
dd -19893453,-19070976,5373952,6225920,-2949120,189,5
dd 20447232,21495808,-9175040,-7864320,1966080,200,2
dd 20643840,21299200,-8978432,-8060928,2424832,200,2
dd -20774912,-20083507,2359296,3473408,-2883584,193,5
dd -20774912,-19952435,5373952,6225920,-3145728,188,5
dd -8323072,-5832704,-21823488,-18677760,-1835008,187,4
dd 8388608,11010048,-21823488,-18677760,-2424832,191,4
dd -20840448,-18481152,-9240576,-6094848,-2555904,187,4
@ -303,10 +347,13 @@ roofDistrict3D LABEL DWORD
dd 20643840,23920640,7536640,10682368,-2097152,193,4
dd -8585216,-5570560,20119552,23265280,-2228224,189,4
dd 8126464,11272192,20119552,23265280,-2818048,193,4
dd -22252749,-21430272,2359296,3473408,-2621440,193,5
dd -22187213,-21430272,5373952,6160384,-2752512,188,5
dd -16777216,-14155776,-17629184,-14483456,-1769472,186,4
dd 16646144,19529728,-17629184,-14483456,-2949120,186,4
dd -16842752,-14090240,15925248,19070976,-1703936,186,4
dd 16580608,19595264,15925248,19070976,-2883584,186,4
dd -23134208,-22311731,2359296,3473408,-2818048,192,5
dd -12845056,-9699328,-21823488,-18677760,-2162688,186,4
dd 12255232,15532032,-21823488,-18677760,-2097152,192,4
dd -20774912,-18546688,-13434880,-10289152,-3276800,186,4
@ -315,6 +362,7 @@ roofDistrict3D LABEL DWORD
dd 21168128,23396352,11730944,14876672,-3276800,186,4
dd -12451840,-10092544,20119552,23265280,-2555904,188,4
dd 12648448,15138816,20119552,23265280,-2490368,186,4
dd -23134208,-22246195,5373952,6160384,-2949120,187,5
dd 22740992,23789568,-11468800,-10158080,4325376,201,2
dd 22937600,23592960,-11272192,-10354688,4784128,201,2
dd 131072,2490368,-26017792,-22872064,-1900544,188,4
@ -326,10 +374,13 @@ roofDistrict3D LABEL DWORD
dd 24772608,28180480,-5046272,-1900544,-2031616,191,4
dd -4194304,-1572864,24313856,27459584,-3080192,191,4
dd 4194304,6815744,24313856,27459584,-2424832,193,4
dd -24546509,-23789568,2555904,3473408,-3145728,192,5
dd 25034752,26083328,-8847360,-7536640,3145728,202,2
dd 25231360,25886720,-8650752,-7733248,3604480,202,2
dd -24743117,-23789568,5373952,6160384,-2686976,187,5
dd 22085632,23134208,-15400960,-14090240,3604480,202,2
dd 22282240,22937600,-15204352,-14286848,4063232,202,2
dd -25493504,-24605491,2555904,3473408,-2621440,191,5
dd -8257536,-5898240,-26017792,-22872064,-2555904,186,4
dd 8454144,10944512,-26017792,-22872064,-3145728,190,4
dd -25362432,-22347776,-9240576,-6094848,-2883584,186,4
@ -346,6 +397,8 @@ roofDistrict3D LABEL DWORD
dd 21102592,23461888,15925248,19070976,-2555904,187,4
dd -16973824,-13959168,20119552,23265280,-2883584,187,4
dd 16515072,19660800,20119552,23265280,-2162688,187,4
dd -25493504,-24802099,5373952,6160384,-2883584,186,5
dd -27102413,-26148864,2555904,3473408,-3080192,191,5
dd -12779520,-9764864,-26017792,-22872064,-2883584,193,4
dd 12320768,15466496,-26017792,-22872064,-2818048,191,4
dd -25231360,-22478848,-13434880,-10289152,-1703936,193,4
@ -354,6 +407,9 @@ roofDistrict3D LABEL DWORD
dd 25034752,27918336,11730944,14876672,-2949120,187,4
dd -12517376,-10027008,24313856,27459584,-1835008,189,4
dd 12582912,15204352,24313856,27459584,-1769472,187,4
dd -26971341,-26148864,5373952,6160384,-2621440,186,5
dd -27852800,-27161395,2555904,3473408,-2555904,190,5
dd -27852800,-27030323,5373952,6160384,-2818048,193,5
dd 196608,2424832,-30212096,-27066368,-2621440,187,4
dd -29360128,-26738688,-851968,2293760,-1769472,187,4
dd -393216,3014656,28508160,31653888,-2031616,193,4
@ -377,6 +433,7 @@ roofDistrict3D LABEL DWORD
dd 24969216,27983872,15925248,19070976,-2228224,188,4
dd -17039360,-13893632,24313856,27459584,-2162688,188,4
dd 16449536,19726336,24313856,27459584,-1441792,188,4
dd -29396173,-28508160,2490368,3473408,-2883584,190,5
dd -8192000,-5963776,-30212096,-27066368,-3276800,193,4
dd 8585216,10813440,-30212096,-27066368,-1966080,189,4
dd -29229056,-26869760,-9240576,-6094848,-3211264,193,4
@ -387,8 +444,11 @@ roofDistrict3D LABEL DWORD
dd 8585216,10813440,28508160,31653888,-3276800,187,4
dd 29622272,30670848,-10158080,-8847360,2752512,201,2
dd 29818880,30474240,-9961472,-9043968,3211264,201,2
dd -29265101,-28508160,5373952,6291456,-3145728,193,5
dd 26017792,27066368,-17694720,-16384000,4718592,200,2
dd 26214400,26869760,-17498112,-16580608,5177344,200,2
dd -30212096,-29455155,2490368,3473408,-3080192,189,5
dd -30212096,-29324083,5373952,6291456,-2621440,192,5
dd -12648448,-9895936,-30212096,-27066368,-1703936,192,4
dd 12451840,15335424,-30212096,-27066368,-1638400,190,4
dd -29753344,-26345472,-13434880,-10289152,-2031616,192,4
@ -760,7 +820,7 @@ roofCityLamps3D LABEL DWORD
dd 41025536,5111808
dd 42205184,1769472
dd 42205184,5111808
ROOF_LANDMARK_PARTS equ 26
ROOF_LANDMARK_PARTS equ 180
roofLandmarkParts3D LABEL DWORD
dd 0,131072,2490368,6619136,8978432,-3932160,-1441792,193
dd 0,524288,2097152,7012352,8585216,-1441792,-1048576,168
@ -788,6 +848,160 @@ roofLandmarkParts3D LABEL DWORD
dd 0,10354688,11141120,327680,1114112,-1703936,-524288,206
dd 0,10485760,11010048,458752,983040,-524288,262144,191
dd 2,10747904,720896,262144,235930,235930,2621440,166
dd 0,-34078720,4587520,3604480,3932160,-4063232,-3915776,162
dd 0,-34078720,-2464154,3909222,3932160,-3915776,-3856794,162
dd 0,-34078720,-2464154,3906601,3934781,-3856794,-3846963,168
dd 0,-1992294,2254438,3909222,3932160,-3915776,-3856794,162
dd 0,-1992294,2254438,3906601,3934781,-3856794,-3846963,168
dd 0,2726298,4587520,3909222,3932160,-3915776,-3856794,162
dd 0,2726298,4587520,3906601,3934781,-3856794,-3846963,168
dd 0,-34078720,4587520,4980736,5308416,-4063232,-3915776,162
dd 0,-34078720,-2464154,4980736,5003674,-3915776,-3856794,162
dd 0,-34078720,-2464154,4978115,5006295,-3856794,-3846963,168
dd 0,-1992294,2254438,4980736,5003674,-3915776,-3856794,162
dd 0,-1992294,2254438,4978115,5006295,-3856794,-3846963,168
dd 0,2726298,4587520,4980736,5003674,-3915776,-3856794,162
dd 0,2726298,4587520,4978115,5006295,-3856794,-3846963,168
dd 0,-12066488,-12050760,3708027,3723756,-3915776,-3722445,162
dd 1,-12058624,3715891,-3722445,98304,98304,137626,207
dd 0,-11862016,-11730944,3699507,3732275,-3889562,-3876454,196
dd 0,-11848909,-11837112,3702784,3728998,-3915776,-3889562,165
dd 0,-11757158,-11745362,3702784,3728998,-3915776,-3889562,165
dd 0,-12066488,-12050760,5189140,5204869,-3915776,-3722445,162
dd 1,-12058624,5197005,-3722445,98304,98304,137626,207
dd 0,-11862016,-11730944,5180621,5213389,-3889562,-3876454,196
dd 0,-11848909,-11837112,5183898,5210112,-3915776,-3889562,165
dd 0,-11757158,-11745362,5183898,5210112,-3915776,-3889562,165
dd 0,-10886840,-10871112,3708027,3723756,-3915776,-3722445,162
dd 1,-10878976,3715891,-3722445,98304,98304,137626,207
dd 0,-10682368,-10551296,3699507,3732275,-3889562,-3876454,196
dd 0,-10669261,-10657464,3702784,3728998,-3915776,-3889562,165
dd 0,-10577510,-10565714,3702784,3728998,-3915776,-3889562,165
dd 0,-10886840,-10871112,5189140,5204869,-3915776,-3722445,162
dd 1,-10878976,5197005,-3722445,98304,98304,137626,207
dd 0,-10682368,-10551296,5180621,5213389,-3889562,-3876454,196
dd 0,-10669261,-10657464,5183898,5210112,-3915776,-3889562,165
dd 0,-10577510,-10565714,5183898,5210112,-3915776,-3889562,165
dd 0,-9707192,-9691464,3708027,3723756,-3915776,-3722445,162
dd 1,-9699328,3715891,-3722445,98304,98304,137626,207
dd 0,-9502720,-9371648,3699507,3732275,-3889562,-3876454,196
dd 0,-9489613,-9477816,3702784,3728998,-3915776,-3889562,165
dd 0,-9397862,-9386066,3702784,3728998,-3915776,-3889562,165
dd 0,-9707192,-9691464,5189140,5204869,-3915776,-3722445,162
dd 1,-9699328,5197005,-3722445,98304,98304,137626,207
dd 0,-9502720,-9371648,5180621,5213389,-3889562,-3876454,196
dd 0,-9489613,-9477816,5183898,5210112,-3915776,-3889562,165
dd 0,-9397862,-9386066,5183898,5210112,-3915776,-3889562,165
dd 0,-8527544,-8511816,3708027,3723756,-3915776,-3722445,162
dd 1,-8519680,3715891,-3722445,98304,98304,137626,207
dd 0,-8323072,-8192000,3699507,3732275,-3889562,-3876454,196
dd 0,-8309965,-8298168,3702784,3728998,-3915776,-3889562,165
dd 0,-8218214,-8206418,3702784,3728998,-3915776,-3889562,165
dd 0,-8527544,-8511816,5189140,5204869,-3915776,-3722445,162
dd 1,-8519680,5197005,-3722445,98304,98304,137626,207
dd 0,-8323072,-8192000,5180621,5213389,-3889562,-3876454,196
dd 0,-8309965,-8298168,5183898,5210112,-3915776,-3889562,165
dd 0,-8218214,-8206418,5183898,5210112,-3915776,-3889562,165
dd 0,-7347896,-7332168,3708027,3723756,-3915776,-3722445,162
dd 1,-7340032,3715891,-3722445,98304,98304,137626,207
dd 0,-7143424,-7012352,3699507,3732275,-3889562,-3876454,196
dd 0,-7130317,-7118520,3702784,3728998,-3915776,-3889562,165
dd 0,-7038566,-7026770,3702784,3728998,-3915776,-3889562,165
dd 0,-7347896,-7332168,5189140,5204869,-3915776,-3722445,162
dd 1,-7340032,5197005,-3722445,98304,98304,137626,207
dd 0,-7143424,-7012352,5180621,5213389,-3889562,-3876454,196
dd 0,-7130317,-7118520,5183898,5210112,-3915776,-3889562,165
dd 0,-7038566,-7026770,5183898,5210112,-3915776,-3889562,165
dd 0,-6168248,-6152520,3708027,3723756,-3915776,-3722445,162
dd 1,-6160384,3715891,-3722445,98304,98304,137626,207
dd 0,-5963776,-5832704,3699507,3732275,-3889562,-3876454,196
dd 0,-5950669,-5938872,3702784,3728998,-3915776,-3889562,165
dd 0,-5858918,-5847122,3702784,3728998,-3915776,-3889562,165
dd 0,-6168248,-6152520,5189140,5204869,-3915776,-3722445,162
dd 1,-6160384,5197005,-3722445,98304,98304,137626,207
dd 0,-5963776,-5832704,5180621,5213389,-3889562,-3876454,196
dd 0,-5950669,-5938872,5183898,5210112,-3915776,-3889562,165
dd 0,-5858918,-5847122,5183898,5210112,-3915776,-3889562,165
dd 0,-4988600,-4972872,3708027,3723756,-3915776,-3722445,162
dd 1,-4980736,3715891,-3722445,98304,98304,137626,207
dd 0,-4784128,-4653056,3699507,3732275,-3889562,-3876454,196
dd 0,-4771021,-4759224,3702784,3728998,-3915776,-3889562,165
dd 0,-4679270,-4667474,3702784,3728998,-3915776,-3889562,165
dd 0,-4988600,-4972872,5189140,5204869,-3915776,-3722445,162
dd 1,-4980736,5197005,-3722445,98304,98304,137626,207
dd 0,-4784128,-4653056,5180621,5213389,-3889562,-3876454,196
dd 0,-4771021,-4759224,5183898,5210112,-3915776,-3889562,165
dd 0,-4679270,-4667474,5183898,5210112,-3915776,-3889562,165
dd 0,-3808952,-3793224,3708027,3723756,-3915776,-3722445,162
dd 1,-3801088,3715891,-3722445,98304,98304,137626,207
dd 0,-3604480,-3473408,3699507,3732275,-3889562,-3876454,196
dd 0,-3591373,-3579576,3702784,3728998,-3915776,-3889562,165
dd 0,-3499622,-3487826,3702784,3728998,-3915776,-3889562,165
dd 0,-3808952,-3793224,5189140,5204869,-3915776,-3722445,162
dd 1,-3801088,5197005,-3722445,98304,98304,137626,207
dd 0,-3604480,-3473408,5180621,5213389,-3889562,-3876454,196
dd 0,-3591373,-3579576,5183898,5210112,-3915776,-3889562,165
dd 0,-3499622,-3487826,5183898,5210112,-3915776,-3889562,165
dd 0,-2629304,-2613576,3708027,3723756,-3915776,-3722445,162
dd 1,-2621440,3715891,-3722445,98304,98304,137626,207
dd 0,-2424832,-2293760,3699507,3732275,-3889562,-3876454,196
dd 0,-2411725,-2399928,3702784,3728998,-3915776,-3889562,165
dd 0,-2319974,-2308178,3702784,3728998,-3915776,-3889562,165
dd 0,-2629304,-2613576,5189140,5204869,-3915776,-3722445,162
dd 1,-2621440,5197005,-3722445,98304,98304,137626,207
dd 0,-2424832,-2293760,5180621,5213389,-3889562,-3876454,196
dd 0,-2411725,-2399928,5183898,5210112,-3915776,-3889562,165
dd 0,-2319974,-2308178,5183898,5210112,-3915776,-3889562,165
dd 0,-1449656,-1433928,3708027,3723756,-3915776,-3722445,162
dd 1,-1441792,3715891,-3722445,98304,98304,137626,207
dd 0,-1245184,-1114112,3699507,3732275,-3889562,-3876454,196
dd 0,-1232077,-1220280,3702784,3728998,-3915776,-3889562,165
dd 0,-1140326,-1128530,3702784,3728998,-3915776,-3889562,165
dd 0,-1449656,-1433928,5189140,5204869,-3915776,-3722445,162
dd 1,-1441792,5197005,-3722445,98304,98304,137626,207
dd 0,-1245184,-1114112,5180621,5213389,-3889562,-3876454,196
dd 0,-1232077,-1220280,5183898,5210112,-3915776,-3889562,165
dd 0,-1140326,-1128530,5183898,5210112,-3915776,-3889562,165
dd 0,-270008,-254280,3708027,3723756,-3915776,-3722445,162
dd 1,-262144,3715891,-3722445,98304,98304,137626,207
dd 0,-65536,65536,3699507,3732275,-3889562,-3876454,196
dd 0,-52429,-40632,3702784,3728998,-3915776,-3889562,165
dd 0,39322,51118,3702784,3728998,-3915776,-3889562,165
dd 0,-270008,-254280,5189140,5204869,-3915776,-3722445,162
dd 1,-262144,5197005,-3722445,98304,98304,137626,207
dd 0,-65536,65536,5180621,5213389,-3889562,-3876454,196
dd 0,-52429,-40632,5183898,5210112,-3915776,-3889562,165
dd 0,39322,51118,5183898,5210112,-3915776,-3889562,165
dd 0,909640,925368,3708027,3723756,-3915776,-3722445,162
dd 1,917504,3715891,-3722445,98304,98304,137626,207
dd 0,1114112,1245184,3699507,3732275,-3889562,-3876454,196
dd 0,1127219,1139016,3702784,3728998,-3915776,-3889562,165
dd 0,1218970,1230766,3702784,3728998,-3915776,-3889562,165
dd 0,909640,925368,5189140,5204869,-3915776,-3722445,162
dd 1,917504,5197005,-3722445,98304,98304,137626,207
dd 0,1114112,1245184,5180621,5213389,-3889562,-3876454,196
dd 0,1127219,1139016,5183898,5210112,-3915776,-3889562,165
dd 0,1218970,1230766,5183898,5210112,-3915776,-3889562,165
dd 0,2089288,2105016,3708027,3723756,-3915776,-3722445,162
dd 1,2097152,3715891,-3722445,98304,98304,137626,207
dd 0,2293760,2424832,3699507,3732275,-3889562,-3876454,196
dd 0,2306867,2318664,3702784,3728998,-3915776,-3889562,165
dd 0,2398618,2410414,3702784,3728998,-3915776,-3889562,165
dd 0,2089288,2105016,5189140,5204869,-3915776,-3722445,162
dd 1,2097152,5197005,-3722445,98304,98304,137626,207
dd 0,2293760,2424832,5180621,5213389,-3889562,-3876454,196
dd 0,2306867,2318664,5183898,5210112,-3915776,-3889562,165
dd 0,2398618,2410414,5183898,5210112,-3915776,-3889562,165
dd 0,3268936,3284664,3708027,3723756,-3915776,-3722445,162
dd 1,3276800,3715891,-3722445,98304,98304,137626,207
dd 0,3473408,3604480,3699507,3732275,-3889562,-3876454,196
dd 0,3486515,3498312,3702784,3728998,-3915776,-3889562,165
dd 0,3578266,3590062,3702784,3728998,-3915776,-3889562,165
dd 0,3268936,3284664,5189140,5204869,-3915776,-3722445,162
dd 1,3276800,5197005,-3722445,98304,98304,137626,207
dd 0,3473408,3604480,5180621,5213389,-3889562,-3876454,196
dd 0,3486515,3498312,5183898,5210112,-3915776,-3889562,165
dd 0,3578266,3590062,5183898,5210112,-3915776,-3889562,165
roofFog3D db 0,1,1,2,3,4,4,5,6,6,7,8,8,9,10,10,11,11,12,13,13,14,15,15,16,16,17,18,18,19,19,20
db 20,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36
db 37,37,38,38,38,39,39,40,40,41,41,42,42,42,43,43,44,44,44,45,45,46,46,46,47,47,48,48,48,49,49,50

View file

@ -173,6 +173,13 @@ roof_gl_list_triangle:
mov inside,0
@@:
mov currentMat,ebx
; Mode 2 compiles only tessellated water, with texture state set at playback.
cmp emission,2
jne roof_gl_list_material
cmp ebx,ROOF_CITY_WATER
jne roof_gl_list_skip
jmp roof_gl_list_begin
roof_gl_list_material:
sub ebx,ROOF_DECK
mov eax,roofHDDayTextures3D[ebx*4]
cmp theme,0
@ -512,7 +519,7 @@ roof_hd_emission_next:
invoke UploadRoofGLSky3D,OFFSET roofNightArt3D,roofHDSkyTextures3D[4]
test eax,eax
jz roof_hd_init_failed
invoke glGenLists,9
invoke glGenLists,ROOF_GL_LIST_COUNT
test eax,eax
jz roof_hd_init_failed
mov roofHDLists3D,eax
@ -530,6 +537,9 @@ roof_hd_compile_model:
inc model
cmp model,3
jb roof_hd_compile_model
mov eax,roofHDLists3D
add eax,ROOF_GL_WATER_LIST
invoke BuildRoofGLList3D,OFFSET roofHDMeshScene3D,0,2,eax
invoke FreeRoofMesh3D,OFFSET roofHDMeshScene3D
invoke FreeRoofMesh3D,OFFSET roofHDMeshCar3D
invoke FreeRoofMesh3D,OFFSET roofHDMeshBoat3D
@ -816,16 +826,9 @@ DrawRoofGLWater3D PROC uses ebx esi
@@:
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
mov eax,roofHDLists3D
add eax,ROOF_GL_WATER_LIST
invoke glCallList,eax
invoke glMatrixMode,1702h
invoke glLoadIdentity
invoke glMatrixMode,1700h
@ -925,6 +928,7 @@ roof_hd_render_refresh:
invoke glShadeModel,1D01h
invoke glEnable,0B60h
invoke glFogi,0B65h,801h
invoke glHint,0C54h,roofGLFogHint3D
invoke glFogf,0B62h,3B2A64C3h
mov eax,OFFSET roofGLFogCurrent3D
mov ebx,OFFSET roofGLAmbientDay3D
@ -1041,7 +1045,7 @@ FreeRoofHD3D PROC uses ebx esi edi
invoke wglMakeCurrent,roofHDDC3D,roofHDRC3D
cmp roofHDLists3D,0
je @F
invoke glDeleteLists,roofHDLists3D,9
invoke glDeleteLists,roofHDLists3D,ROOF_GL_LIST_COUNT
mov roofHDLists3D,0
@@:
invoke glDeleteTextures,ROOF_GL_TEXTURES,OFFSET roofHDDayTextures3D

View file

@ -37,6 +37,7 @@ glColorMaterial PROTO STDCALL :DWORD,:DWORD
glFogfv PROTO STDCALL :DWORD,:DWORD
glFogf PROTO STDCALL :DWORD,:DWORD
glFogi PROTO STDCALL :DWORD,:DWORD
glHint PROTO STDCALL :DWORD,:DWORD
glShadeModel PROTO STDCALL :DWORD
glBlendFunc PROTO STDCALL :DWORD,:DWORD
glDepthMask PROTO STDCALL :DWORD

View file

@ -2,6 +2,8 @@ include src_graphics\rooftop_gl_api.inc
ROOF_HD_W equ 1280
ROOF_HD_H equ 960
ROOF_GL_TEXTURES equ 49
ROOF_GL_LIST_COUNT equ 10
ROOF_GL_WATER_LIST equ 9
InitRoofHD3D PROTO
FreeRoofHD3D PROTO
RenderRoofHD3D PROTO
@ -33,6 +35,7 @@ roofHDFBO3D dd 0
roofHDColorTex3D dd 0
roofHDDepth3D dd 0
roofHDLists3D dd 0
roofGLFogHint3D dd 1102h
roofHDSkyTextures3D dd 2 dup(0)
roofHDDayTextures3D dd ROOF_GL_TEXTURES dup(0)
roofHDNightTextures3D dd ROOF_GL_TEXTURES dup(0)
@ -117,14 +120,6 @@ roofGLFogBlack3D REAL4 0.0,0.0,0.0,1.0
roofGLColorScale3D REAL4 255.0
roofGLWaveDiv3D REAL4 100000.0
roofGLHalf3D REAL4 0.5
roofGLWaterVertices3D REAL4 -2000.0,-62.0,76.0,-166.666667,6.333333
REAL4 2000.0,-62.0,76.0,166.666667,6.333333
REAL4 2000.0,-62.0,60.0,166.666667,5.0
REAL4 -2000.0,-62.0,60.0,-166.666667,5.0
REAL4 70.0,-62.0,60.0,5.833333,5.0
REAL4 2000.0,-62.0,60.0,166.666667,5.0
REAL4 2000.0,-62.0,29.0,166.666667,2.416667
REAL4 70.0,-62.0,29.0,5.833333,2.416667
roofGLAmbientDay3D REAL4 0.43,0.43,0.48,1.0
roofGLAmbientNight3D REAL4 0.20,0.23,0.32,1.0
roofGLSunColorDay3D REAL4 0.75,0.57,0.39,1.0
@ -167,6 +162,8 @@ roofQualityEcoText3D db 202,208,219,216,192,58,32,221,202,206,0
roofQualityHighText3D db 202,208,219,216,192,58,32,196,197,210,192,203,200,0
roofLogPath3D db "runtime\roof-renderer.txt",0
roofLogHeader3D db "Native MASM rooftop renderer",13,10,0
roofLogTerrain3D db "Terrain path: tiled ground and animated mesh water v2",13,10,0
roofLogTriangles3D db "City mesh triangles: ",0
roofLogVendor3D db "Vendor: ",0
roofLogRenderer3D db "Renderer: ",0
roofLogVersion3D db "OpenGL: ",0

View file

@ -214,12 +214,18 @@ roof_log_write:
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

View file

@ -183,6 +183,12 @@ def main():
lit_windows += count
night_city.append(frame)
pack("city-night-v1.bin",night_city)
count = pack_city_district()
pack_roof_map()
print(f"Packed roof: sunset/night, {lit_windows} distinct lit window apertures, 32 hand frames, {count} buildings.")
def pack_city_district():
# A connected street/courtyard district, not a ring of independent props.
blocks = []
lots,parks = [],[]
@ -248,6 +254,19 @@ def main():
y = 6-(i%3)*8 if side < 0 else 106+(i%4)*9
h = 16+(i*7)%24
blocks.append((x-11,x+11,y-10,y+10,-60+h,186+i%8,4))
# Canal clearance removes water footprints, not entire empty city blocks.
waterfront = []
for gx in range(-13,2):
x = 20+gx*36
for bank in (0,1):
key = (gx*19+bank*7)%31
front,back = (53,39-key%4) if bank == 0 else (82,94+key%3)
y0,y1 = sorted((front,back))
mid = x-2+key%5
for index,(x0,x1) in enumerate(((x-13,mid-.45),(mid+.45,x+13))):
top = -60+12+(key+index*3)%11
waterfront.append((x0,x1,y0,y1,top,186+(gx+bank*3+index)%8,5))
blocks.extend(waterfront)
blocks.sort(key=lambda b:(((b[0]+b[1])/2-20)**2+((b[2]+b[3])/2-11)**2))
# Ground-only baked illumination follows the same real building footprints.
elevation = np.zeros((512,512),dtype=np.float32)
@ -328,6 +347,27 @@ def main():
spire(0,(-19,-13,-64,-58,0,9),206)
spire(0,(-18,-14,-63,-59,9,15),191)
spire(2,(-16,-61,15,1.8,1.8,20),166)
# The same modest quay geometry is consumed by both native renderers.
quays = []
def quay_piece(kind,coords,mat):
piece = (kind,*[round(v*65536) for v in coords],mat)
pieces.append(piece)
quays.append((kind,*coords,mat))
for y0,y1 in ((55,60),(76,81)):
quay_piece(0,(-520,70,y0,y1,-62,-59.75),162)
edge = 59.65 if y0 < 60 else 76
for a,b in ((-520,-37.6),(-30.4,34.4),(41.6,70)):
quay_piece(0,(a,b,edge,edge+.35,-59.75,-58.85),162)
quay_piece(0,(a,b,edge-.04,edge+.39,-58.85,-58.7),168)
for x in range(-184,68,18):
if min(abs(x-b) for b in (-34,38)) < 6:
continue
for y in (56.7,79.3):
quay_piece(0,(x-.12,x+.12,y-.12,y+.12,-59.75,-56.8),162)
quay_piece(1,(x,y,-56.8,1.5,1.5,2.1),207)
quay_piece(0,(x+3,x+5,y-.25,y+.25,-59.35,-59.15),196)
for leg in (x+3.2,x+4.6):
quay_piece(0,(leg,leg+.18,y-.2,y+.2,-59.75,-59.35),165)
district += [f"ROOF_LANDMARK_PARTS equ {len(pieces)}","roofLandmarkParts3D LABEL DWORD"]
district += [" dd "+",".join(map(str,piece)) for piece in pieces]
fog = [min(190,round(d*180/(d+250))) for d in range(1024)]
@ -340,8 +380,13 @@ def main():
"casino":[10.9,29.1,.9,21.1],"street_spacing":36,"street_width":8,
"street_level":-60,"canal":[-190,230,60,76],"bridges":[-34,38,110],
"east_river":[70,1800,29,76],"river_bridges":[110,254,398],
"waterfront_buildings":waterfront,"canal_quay_parts":quays,
"lots":lots,"parks":parks,"lamps":lamps,"towers":towers,"buildings":blocks,
"landmarks":{"dome":[20,119],"spire":[164,11]}},indent=2)+"\n",encoding="ascii")
return len(blocks)
def pack_roof_map():
# Collision-only enclosure uses a valid legacy prepass material; the final
# rooftop pass replaces its tall walls with low world-space railings.
roof = [[102]*32 for _ in range(32)]
@ -362,8 +407,13 @@ def main():
"lighting":[512,512,3],"city_renderer":"world-space MASM geometry; sky only is raster",
"source":"Built-in image generation; runtime geometry and interaction are assembly-only",
"reference":"https://www.loftprojectetagi.ru/visitors/krysha/"},indent=2)+"\n",encoding="ascii")
print(f"Packed roof: sunset/night, {lit_windows} distinct lit window apertures, 32 hand frames, {len(blocks)} buildings.")
if __name__ == "__main__":
main()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--district-only",action="store_true")
if parser.parse_args().district_only:
print(f"Packed city district: {pack_city_district()} building parts")
else:
main()

View file

@ -48,9 +48,23 @@ class Mesh:
self.horizontal(x0,x1,y0,y1,z1,roof or material)
def horizontal(self,x0,x1,y0,y1,z,material,uv=None):
points = [(x0,y1,z),(x1,y1,z),(x1,y0,z),(x0,y0,z)]
uv = uv or [(0,0),(1,0),(1,1),(0,1)]
self.quad(material,list(reversed(points)),list(reversed(uv)))
# Vertex-fog drivers must not interpolate a whole city from distant corners.
def cuts(lo,hi):
if hi-lo <= 64:
return [lo,hi]
candidates = list(range(-512,513,64))+[-96,-32,32,96,-1536,-1024,-768,768,1024,1536]
return [lo,*sorted(v for v in candidates if lo < v < hi),hi]
def texcoord(x,y):
s,t = (x-x0)/(x1-x0),(y1-y)/(y1-y0)
return tuple((1-t)*((1-s)*uv[0][i]+s*uv[1][i])+
t*((1-s)*uv[3][i]+s*uv[2][i]) for i in range(2))
xs,ys = cuts(x0,x1),cuts(y0,y1)
for a,b in zip(xs,xs[1:]):
for c,d in zip(ys,ys[1:]):
points = [(a,d,z),(b,d,z),(b,c,z),(a,c,z)]
coords = [texcoord(x,y) for x,y,_ in points]
self.quad(material,list(reversed(points)),list(reversed(coords)))
def ellipsoid(self,x,y,z,rx,ry,rz,material,upper=False,rings=10,sides=24):
end = math.pi/2 if upper else math.pi
@ -231,7 +245,9 @@ def main():
else:
scene.box(*coords,mat)
elif kind == 1:
scene.ellipsoid(*coords,mat,upper=True,rings=14,sides=48)
foliage = mat == 207
scene.ellipsoid(*coords,mat,upper=not foliage,
rings=4 if foliage else 14,sides=8 if foliage else 48)
elif kind == 2:
x,y,z,rx,ry,h = coords
h *= .65

View file

@ -185,6 +185,14 @@ def check_rooftop_navigation():
assert city["street_level"] == -60
assert len(city["parks"]) >= 6 and len(city["towers"]) >= 8
assert len(city["buildings"]) > 400
waterfront = city["waterfront_buildings"]
assert len(waterfront) == 60
assert all(b in city["buildings"] for b in waterfront)
assert all(b[3] <= 54 or b[2] >= 82 for b in waterfront), "canal must stay open"
for bank in (0,1):
row = [b for b in waterfront if (b[3] < 60) == (bank == 0)]
assert len(row) == 30 and min(b[0] for b in row) < -450 and max(b[1] for b in row) >= 68
assert len(city["canal_quay_parts"]) > 100
heights = {round(b[4]+60,1) for b in city["buildings"]}
assert len(heights) >= 35 and min(heights) <= 6 and max(heights) >= 150
assert len({(round(b[1]-b[0],1),round(b[3]-b[2],1)) for b in city["buildings"]}) >= 15
@ -393,7 +401,26 @@ def main():
right = Image.open(OUT/"roof-hd-look-right.bmp").convert("RGB")
assert left.tobytes() != east.tobytes() != right.tobytes(), "leaning must allow actual head turns"
mesh = json.loads((ROOT/"assets/sprites/rooftop/mesh-v1.json").read_text())
assert mesh["triangles"]["scene"] < 36000, "never-visible static faces must be pruned"
assert mesh["triangles"]["scene"] < 48000, "driver-safe ground must stay within the optimised mesh budget"
assert mesh["removed_invisible_triangles"] > 18000
packed_mesh = (ROOT/"assets/animations/rooftop/mesh-city-v1.bin").read_bytes()
water_tiles = 0
for at in range(12,len(packed_mesh),100):
mat,*values = struct.unpack_from("<I24f",packed_mesh,at)
if mat == 198:
water_tiles += 1
if mat not in (162,197,198,208,209):
continue
vertices = [values[i:i+8] for i in (0,8,16)]
if not all(-62.1 <= v[1] <= -59.7 and v[4] > .99 for v in vertices):
continue
xs,zs = [v[0] for v in vertices],[v[2] for v in vertices]
if max(xs) > -480 and min(xs) < 480 and max(zs) > -480 and min(zs) < 480:
assert max(xs)-min(xs) <= 64.01 and max(zs)-min(zs) <= 64.01, "giant vertex-fog ground polygon"
assert water_tiles >= 80, "animated water must reuse the tessellated scene mesh"
fast_fog = Image.open(OUT/"roof-hd-vertex-fog.bmp").convert("RGB")
nice_fog = Image.open(OUT/"roof-hd-canal-quays.bmp").convert("RGB")
assert max(ImageStat.Stat(ImageChops.difference(fast_fog,nice_fog)).mean) < 20
for profile in ("eco", "auto"):
low = Image.open(OUT/f"roof-hd-{profile}.bmp").convert("RGB")
difference = ImageStat.Stat(ImageChops.difference(low, east)).mean

View file

@ -24,6 +24,10 @@ roofTestHDComposite db "build\hall-expansion\roof-hd-terrace.bmp",0
roofTestHDMotion db "build\hall-expansion\roof-hd-traffic.bmp",0
roofTestHDLeft db "build\hall-expansion\roof-hd-look-left.bmp",0
roofTestHDRight db "build\hall-expansion\roof-hd-look-right.bmp",0
roofTestHDQuay db "build\hall-expansion\roof-hd-canal-quays.bmp",0
roofTestHDQuayNight db "build\hall-expansion\roof-hd-canal-night.bmp",0
roofTestHDFastFog db "build\hall-expansion\roof-hd-vertex-fog.bmp",0
roofTestHDWest db "build\hall-expansion\roof-hd-west.bmp",0
roofTestHDEco db "build\hall-expansion\roof-hd-eco.bmp",0
roofTestHDAuto db "build\hall-expansion\roof-hd-auto.bmp",0
roofTestSoftware db "build\hall-expansion\roof-software-ground.bmp",0
@ -172,8 +176,23 @@ roof_test_driver_write:
mov roofNight3D,1
invoke RoofTestHDSnapshot,OFFSET roofTestHDNight
mov roofNight3D,0
mov playerX,12*FP_1
mov playerY,10*FP_1
mov playerAngle,224
invoke RoofTestHDSnapshot,OFFSET roofTestHDQuay
mov roofGLFogHint3D,1101h
mov roofHDRenderClock3D,-1
invoke RoofTestHDSnapshot,OFFSET roofTestHDFastFog
mov roofGLFogHint3D,1102h
mov roofHDRenderClock3D,-1
mov roofNight3D,1
invoke RoofTestHDSnapshot,OFFSET roofTestHDQuayNight
mov roofNight3D,0
mov playerAngle,256
invoke RoofTestHDSnapshot,OFFSET roofTestHDWest
mov playerX,20*FP_1
mov playerY,7*FP_1
mov playerAngle,128
invoke RoofTestHDSnapshot,OFFSET roofTestHDComposite
invoke GetTickCount
mov started,eax