feat: initialize sunrise with 100-player shared rooms

This commit is contained in:
2026-10-30 16:36:35 +09:00
commit 31d6eac4c2
257 changed files with 66063 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { Mesh, MeshBasicMaterial, Raycaster, Vector3 } from 'three';
import { GISAMUN } from '../src/constants/gisamun.ts';
import { isCoastalLand } from '../src/scene/coast.ts';
import { createTerrainGeometry, validateTerrain } from '../src/scene/terrainGeometry.ts';
import { calculateSun } from '../src/astronomy/sunCalculator.ts';
import { directionFromAngles } from '../src/astronomy/direction.ts';
const base = new URL('../public/terrain/gisamun/', import.meta.url);
test('Gisamun observer is on land and the eastern view is sea, with both DSM tiles used', () => {
const meta=JSON.parse(readFileSync(new URL('metadata.json',base),'utf8'));
const coast=JSON.parse(readFileSync(new URL('coast.json',base),'utf8'));
const bytes=readFileSync(new URL('heights.f32',base));
const heights=new Float32Array(bytes.buffer.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength));
validateTerrain(meta,heights,GISAMUN);
assert.ok(isCoastalLand(coast,0,0));
assert.equal(isCoastalLand(coast,200,0),false);
assert.equal(meta.sources.filter((s:{file:string})=>s.file.endsWith('.tif')).length,2);
assert.ok(heights.every(Number.isFinite));
assert.ok(heights.some(h=>h<0), 'retain below-zero Copernicus samples instead of clamping to OSM land/sea heights');
assert.equal(meta.corrections.osmHeightCorrection,false);
});
test('Gisamun terrain clears the October dawn sun that is blocked at Hajodae', () => {
const meta=JSON.parse(readFileSync(new URL('metadata.json',base),'utf8'));
const bytes=readFileSync(new URL('heights.f32',base));
const heights=new Float32Array(bytes.buffer.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength));
const geometry=createTerrainGeometry(meta,heights,true), material=new MeshBasicMaterial();
const mesh=new Mesh(geometry,material);
const observer={...GISAMUN,elevation:meta.observerSurfaceElevation,eyeHeight:1.7};
for (const time of ['06:52','06:55','07:00']) {
const sun=calculateSun(new Date(`2026-10-29T${time}:00+09:00`),observer);
assert.ok(sun.altitude>0);
const ray=new Raycaster(new Vector3(0,1.7,0),new Vector3(...directionFromAngles(sun.azimuth,sun.altitude)));
assert.equal(ray.intersectObject(mesh).length,0,`${time} should clear the modelled terrain`);
}
geometry.dispose(); material.dispose();
});