Skip to content

Commit 3a798b2

Browse files
authored
Merge pull request #21 from b0ink/refactor/server-side-occlusion
refactor: server side occlusion
2 parents c34fa89 + 815b164 commit 3a798b2

File tree

17 files changed

+80
-701
lines changed

17 files changed

+80
-701
lines changed

src/main/ipc-handlers.ts

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as fs from 'fs';
33
import * as fsp from 'fs/promises';
44
import path from 'path';
55
import ping from 'ping';
6-
import { MapData, MapDoor, ReverbZone } from '@shared/types/maps';
6+
import { MapData, ReverbZone } from '@shared/types/maps';
77
import { DEFAULT_STORE } from '@shared/types/store/default';
88
import { getMainWindow } from './main-window';
99
import { retrieveIceServers } from './retrieveIceServers';
@@ -20,42 +20,14 @@ ipcMain.handle('load-map', async (_event, map: string): Promise<MapData> => {
2020
? path.resolve(__dirname, '../../static/maps')
2121
: path.join(process.resourcesPath, 'app.asar.unpacked', 'static', 'maps'); // Is direct access to app.asar.unpacked really the best way ????
2222

23-
const mapPath = path.join(basePath, `${map}.glb`);
24-
const rawMapBuffer = await fsp.readFile(mapPath);
25-
26-
const mapDoors = path.join(basePath, `${map}.json`);
27-
let doors: MapDoor[] | null = [];
23+
const mapData = path.join(basePath, `${map}.json`);
2824
let reverbZones: ReverbZone[] | null = [];
2925

30-
if (fs.existsSync(mapDoors)) {
26+
if (fs.existsSync(mapData)) {
3127
try {
32-
const raw = await fsp.readFile(mapDoors, 'utf-8');
28+
const raw = await fsp.readFile(mapData, 'utf-8');
3329
const parsed = JSON.parse(raw);
3430

35-
// Parse doors
36-
if (parsed.doors) {
37-
doors = parsed.doors.map((entry: any) => {
38-
const [x, y, z] = entry.absorigin.split(' ').map(Number);
39-
const [ox, oy, oz] = entry.offset.split(' ').map(Number);
40-
const [rx, ry, rz] = entry.startRotation.split(' ').map(Number);
41-
const [ax, ay, az] = entry.axis.split(' ').map(Number);
42-
43-
const door: MapDoor = {
44-
label: entry.label,
45-
rotateOffset: Number(entry.rotateOffset),
46-
absOrigin: { x, y, z },
47-
offset: { x: ox, y: oy, z: oz },
48-
startingRotation: { x: rx, y: ry, z: rz },
49-
axis: { x: ax, y: ay, z: az },
50-
size: {
51-
width: Number(entry.doorWidth),
52-
height: Number(entry.doorHeight),
53-
},
54-
};
55-
return door;
56-
});
57-
}
58-
5931
// Parse reverb zones
6032
if (parsed.reverb) {
6133
reverbZones = parsed.reverb.map((zone: any) => {
@@ -72,13 +44,10 @@ ipcMain.handle('load-map', async (_event, map: string): Promise<MapData> => {
7244
}
7345
} catch (err) {
7446
console.warn(`[Map] Failed to load doors JSON for ${map}:`, err);
75-
doors = null;
7647
reverbZones = null;
7748
}
7849
}
7950
return {
80-
buffer: rawMapBuffer,
81-
doors,
8251
reverbZones,
8352
};
8453
});

src/renderer/src/App.svelte

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
type SocketApiError,
1515
SocketApiErrorType,
1616
} from '@shared/types/api';
17-
import { DEFAULT_PLAYER_VOLUME, OcclusionQuality } from '@shared/types/store/settings';
17+
import { DEFAULT_PLAYER_VOLUME } from '@shared/types/store/settings';
1818
import {
1919
currentTime,
2020
nextServerRestart,
@@ -45,7 +45,7 @@
4545
import SteamLoginButton from './components/SteamLoginButton.svelte';
4646
import { cn } from './lib/tailwind';
4747
import { transformVector } from './lib/vector';
48-
import { flipDoor, getMap, getMapDoors, getReverbZones, initializeMap } from './render/maps';
48+
import { getReverbZones, initializeMap } from './render/maps';
4949
import { renderFrame } from './render/renderFrame';
5050
import { type AudioConnectionStuff, CsTeam, type PlayerPositionApiData } from './type';
5151
import { decodePlayerData, decodeServerConfig } from './utils/decode';
@@ -65,7 +65,6 @@
6565
}
6666
$: useTurnConfig = $settings.natFixEnabled;
6767
$: microphoneMuted = $settings.micMuted;
68-
$: occlusionQuality = $settings.occlusionQuality;
6968
$: noiseSuppression = $settings.noiseSuppression;
7069
$: playerVolumes = $settings.playerVolumes;
7170
$: if (playerVolumes) {
@@ -294,9 +293,6 @@
294293
295294
$socket?.on('current-map', async (mapName) => {
296295
console.log(`$socket.on('current-map'): ${mapName}`);
297-
if ($settings.occlusionAutoQuality) {
298-
window.api.setSettingsValue('occlusionQuality', OcclusionQuality.VERYLOW);
299-
}
300296
await initializeMap($scene, mapName);
301297
});
302298
@@ -329,13 +325,6 @@
329325
}
330326
});
331327
332-
$socket?.on('door-rotation', (data) => {
333-
// console.log(`$socket.on('door-rotation'): ${JSON.stringify(data)}`);
334-
const origin = new THREE.Vector3(data.absorigin.x, data.absorigin.y, data.absorigin.z);
335-
flipDoor(origin, data.rotation);
336-
});
337-
338-
// $socket?.on('player-positions', (players: PlayerPositionApiData[]) => {
339328
$socket?.on('player-positions', (data) => {
340329
if (!$connectedToRoom) {
341330
return;
@@ -404,6 +393,8 @@
404393
continue;
405394
}
406395
396+
positionalSound.SetServerOcclusion(player.occlusion ?? 0);
397+
407398
positionalSound.playerIsAlive =
408399
player.isAlive &&
409400
(player.team === CsTeam.CounterTerrorist || player.team === CsTeam.Terrorist)
@@ -454,7 +445,7 @@
454445
}
455446
}
456447
457-
renderFrame($threejs, $scene, $clientCamera, $settingsOpen, updateSoundFilters);
448+
renderFrame($threejs, $scene, $clientCamera, updateSoundFilters);
458449
});
459450
}
460451
@@ -726,9 +717,6 @@
726717
};
727718
document.querySelector('#threejs')!.innerHTML = '';
728719
initializeRenderer();
729-
if ($settings.occlusionAutoQuality) {
730-
window.api.setSettingsValue('occlusionQuality', OcclusionQuality.VERYLOW);
731-
}
732720
await initializeMap($scene, response.mapName ?? 'de_dust2');
733721
if (response.serverConfig) {
734722
serverConfigStore.set({
@@ -770,16 +758,8 @@
770758
};
771759
772760
const updateSoundFilters = (): void => {
773-
const map = getMap();
774-
if (map) {
775-
for (const soundData of $remotePlayers.values()) {
776-
soundData?.updateFilters(
777-
[map, ...getMapDoors()],
778-
occlusionQuality,
779-
$serverConfigStore,
780-
getReverbZones(),
781-
);
782-
}
761+
for (const soundData of $remotePlayers.values()) {
762+
soundData?.updateFilters($serverConfigStore, getReverbZones());
783763
}
784764
};
785765
@@ -812,6 +792,20 @@
812792
return;
813793
}
814794
$threejs.autoClear = true;
795+
$threejs.setClearColor(0x101820, 1);
796+
797+
if (!$scene.getObjectByName('debug-ambient-light')) {
798+
const ambientLight = new THREE.AmbientLight(0xffffff, 1.25);
799+
ambientLight.name = 'debug-ambient-light';
800+
$scene.add(ambientLight);
801+
}
802+
803+
if (!$scene.getObjectByName('debug-directional-light')) {
804+
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.75);
805+
directionalLight.name = 'debug-directional-light';
806+
directionalLight.position.set(2000, 2500, 2000);
807+
$scene.add(directionalLight);
808+
}
815809
816810
const threeJsDom = document.querySelector('#threejs');
817811
if (!threeJsDom) {
@@ -1012,12 +1006,6 @@
10121006

10131007
{#if clientSteamId && socketUrl}
10141008
<div class="m-2 overflow-hidden relative">
1015-
{#if $roomCode}
1016-
<div class="absolute left-0 top-0 bg-black text-white text-xs p-1 z-5">
1017-
<span>Occlusion Detail:</span>
1018-
{OcclusionQuality[occlusionQuality]}
1019-
</div>
1020-
{/if}
10211009
{#if microphoneMuted}
10221010
<div
10231011
class="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-red-500 text-white text-xs p-1 z-5"

0 commit comments

Comments
 (0)