Skip to content

Commit 58218da

Browse files
author
Parsa Azari
committed
Fix asset paths for GitHub Pages deployment - Add getAssetPath utility for proper base URL handling
1 parent a8961f1 commit 58218da

File tree

7 files changed

+98
-235
lines changed

7 files changed

+98
-235
lines changed

.github/workflows/deploy.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,25 @@ jobs:
3636
touch dist/.nojekyll
3737
ls -la dist/
3838
ls -la dist/assets/
39+
cat dist/index.html | grep -E "(script|link)"
3940
41+
- name: Deploy built files to root for GitHub Pages
42+
run: |
43+
# Backup development files
44+
mkdir -p backup-dev
45+
cp index.html backup-dev/
46+
cp -r src backup-dev/ 2>/dev/null || true
47+
48+
# Copy built files to root
49+
cp -r dist/* .
50+
51+
# Commit and push the changes
52+
git config --local user.email "action@github.com"
53+
git config --local user.name "GitHub Action"
54+
git add .
55+
git commit -m "Deploy: Update root with built files [skip ci]" || echo "No changes to commit"
56+
git push || echo "Nothing to push"
57+
4058
- name: Setup Pages
4159
uses: actions/configure-pages@v4
4260

src/core/rendering/environments/SeveranceEnvironment.js

Lines changed: 25 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
} from "../../../systems/corridorSystem";
1515
import { CORRIDOR_MAP } from "../../../systems/map/SeveranceCorridorMap.js";
1616
import PerformanceArtLetterGenerator from '../performance/PerformanceArtLetterGenerator.js';
17+
import { getAssetPath } from '../../../utils/assetPath.js';
1718

1819

1920
const DOORWAY_WIDTH = 1.8; // Widened from 1.2 for a more spacious doorframe
@@ -242,7 +243,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
242243
console.log("[Door Models] Loading door frame model...");
243244
const doorFrameResult = await new Promise((resolve, reject) => {
244245
this.gltfLoader.load(
245-
'assets/models/door frame.glb',
246+
getAssetPath('assets/models/door frame.glb'),
246247
resolve,
247248
(progress) => {
248249
console.log(`[Door Models] Frame loading progress: ${Math.round(progress.loaded / progress.total * 100)}%`);
@@ -260,7 +261,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
260261
console.log("[Door Models] Loading door pivot model...");
261262
const doorPivotResult = await new Promise((resolve, reject) => {
262263
this.gltfLoader.load(
263-
'assets/models/door pivot.glb',
264+
getAssetPath('assets/models/door pivot.glb'),
264265
resolve,
265266
(progress) => {
266267
console.log(`[Door Models] Pivot loading progress: ${Math.round(progress.loaded / progress.total * 100)}%`);
@@ -278,7 +279,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
278279
console.log("[Door Models] Loading card reader model...");
279280
const cardReaderResult = await new Promise((resolve, reject) => {
280281
this.gltfLoader.load(
281-
'assets/models/card reader.glb',
282+
getAssetPath('assets/models/card reader.glb'),
282283
resolve,
283284
(progress) => {
284285
console.log(`[Door Models] Card reader loading progress: ${Math.round(progress.loaded / progress.total * 100)}%`);
@@ -432,10 +433,10 @@ export class SeveranceEnvironment extends BaseEnvironment {
432433
// Use material system to load vertex shader instead of inline definition
433434
// This ensures we're following the project organization guidelines
434435
vertexShader: await this.materialSystem._loadShaderFile(
435-
"./src/shaders/common/vertex.txt"
436+
getAssetPath("./src/shaders/common/vertex.txt")
436437
),
437438
fragmentShader: await this.materialSystem._loadShaderFile(
438-
"./src/shaders/wall.txt"
439+
getAssetPath("./src/shaders/wall.txt")
439440
),
440441
side: THREE.DoubleSide,
441442
});
@@ -483,10 +484,10 @@ export class SeveranceEnvironment extends BaseEnvironment {
483484
},
484485
// Use material system to load vertex shader instead of inline definition
485486
vertexShader: await this.materialSystem._loadShaderFile(
486-
"./src/shaders/common/vertex.txt"
487+
getAssetPath("./src/shaders/common/vertex.txt")
487488
),
488489
fragmentShader: await this.materialSystem._loadShaderFile(
489-
"./src/shaders/corridor.txt"
490+
getAssetPath("./src/shaders/corridor.txt")
490491
),
491492
transparent: true,
492493
blending: THREE.AdditiveBlending,
@@ -1564,16 +1565,6 @@ export class SeveranceEnvironment extends BaseEnvironment {
15641565
return doorGroup;
15651566
}
15661567

1567-
/**
1568-
* Set up department locations and access points - REMOVED/TO BE REPLACED
1569-
* @private
1570-
*/
1571-
/*
1572-
setupDepartments() {
1573-
// ... Entire function content removed ...
1574-
}
1575-
*/ // KEEPING THE FUNCTION SIGNATURE AS A REMINDER TO ADD PORTFOLIO SETUP LATER
1576-
15771568
// --- Portfolio Section Configuration ---
15781569
portfolioSectionsConfig = {
15791570
DESIGN: {
@@ -2124,19 +2115,6 @@ export class SeveranceEnvironment extends BaseEnvironment {
21242115
getCurrentLocation() {
21252116
if (!this.camera) return "Unknown";
21262117

2127-
// Check if in any department - REMOVED departmentBounds check
2128-
/*
2129-
for (const [name, bounds] of this.departmentBounds) {
2130-
if (bounds.containsPoint(this.camera.position)) {
2131-
return name;
2132-
}
2133-
}
2134-
*/
2135-
2136-
// TODO: Implement logic to detect which portfolio section the player is in,
2137-
// potentially based on proximity to section entrances or defined zones.
2138-
// For now, just return "CORRIDOR".
2139-
21402118
// If not in a department, must be in a corridor
21412119
return "CORRIDOR";
21422120
}
@@ -3299,22 +3277,6 @@ export class SeveranceEnvironment extends BaseEnvironment {
32993277
eButtonCanvas.width = 320; // Keep width
33003278
eButtonCanvas.height = 100; // Reduce height slightly
33013279
const eButtonCtx = eButtonCanvas.getContext('2d');
3302-
import * as THREE from "three";
3303-
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; // Added GLTFLoader import
3304-
import { TextureLoader } from "three"; // Add TextureLoader import
3305-
import { BaseEnvironment } from "./BaseEnvironment";
3306-
import { MapSystem } from "../../../systems/map/MapSystem";
3307-
import { SeveranceMaterials } from "../materials/SeveranceMaterials";
3308-
import { UnifiedMovementController } from "../../../systems/movement/UnifiedMovementController";
3309-
import {
3310-
CorridorSystem,
3311-
CORRIDOR_WIDTH,
3312-
SEGMENT_LENGTH,
3313-
CORRIDOR_HEIGHT,
3314-
CORRIDOR_TRIM_HEIGHT,
3315-
} from "../../../systems/corridorSystem";
3316-
import { CORRIDOR_MAP } from "../../../systems/map/SeveranceCorridorMap.js";
3317-
import PerformanceArtLetterGenerator from '../performance/PerformanceArtLetterGenerator.js';
33183280

33193281

33203282
const DOORWAY_WIDTH = 1.8; // Widened from 1.2 for a more spacious doorframe
@@ -3543,7 +3505,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
35433505
console.log("[Door Models] Loading door frame model...");
35443506
const doorFrameResult = await new Promise((resolve, reject) => {
35453507
this.gltfLoader.load(
3546-
'assets/models/door frame.glb',
3508+
getAssetPath('assets/models/door frame.glb'),
35473509
resolve,
35483510
(progress) => {
35493511
console.log(`[Door Models] Frame loading progress: ${Math.round(progress.loaded / progress.total * 100)}%`);
@@ -3561,7 +3523,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
35613523
console.log("[Door Models] Loading door pivot model...");
35623524
const doorPivotResult = await new Promise((resolve, reject) => {
35633525
this.gltfLoader.load(
3564-
'assets/models/door pivot.glb',
3526+
getAssetPath('assets/models/door pivot.glb'),
35653527
resolve,
35663528
(progress) => {
35673529
console.log(`[Door Models] Pivot loading progress: ${Math.round(progress.loaded / progress.total * 100)}%`);
@@ -3579,7 +3541,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
35793541
console.log("[Door Models] Loading card reader model...");
35803542
const cardReaderResult = await new Promise((resolve, reject) => {
35813543
this.gltfLoader.load(
3582-
'assets/models/card reader.glb',
3544+
getAssetPath('assets/models/card reader.glb'),
35833545
resolve,
35843546
(progress) => {
35853547
console.log(`[Door Models] Card reader loading progress: ${Math.round(progress.loaded / progress.total * 100)}%`);
@@ -3733,10 +3695,10 @@ export class SeveranceEnvironment extends BaseEnvironment {
37333695
// Use material system to load vertex shader instead of inline definition
37343696
// This ensures we're following the project organization guidelines
37353697
vertexShader: await this.materialSystem._loadShaderFile(
3736-
"./src/shaders/common/vertex.txt"
3698+
getAssetPath("./src/shaders/common/vertex.txt")
37373699
),
37383700
fragmentShader: await this.materialSystem._loadShaderFile(
3739-
"./src/shaders/wall.txt"
3701+
getAssetPath("./src/shaders/wall.txt")
37403702
),
37413703
side: THREE.DoubleSide,
37423704
});
@@ -3784,10 +3746,10 @@ export class SeveranceEnvironment extends BaseEnvironment {
37843746
},
37853747
// Use material system to load vertex shader instead of inline definition
37863748
vertexShader: await this.materialSystem._loadShaderFile(
3787-
"./src/shaders/common/vertex.txt"
3749+
getAssetPath("./src/shaders/common/vertex.txt")
37883750
),
37893751
fragmentShader: await this.materialSystem._loadShaderFile(
3790-
"./src/shaders/corridor.txt"
3752+
getAssetPath("./src/shaders/corridor.txt")
37913753
),
37923754
transparent: true,
37933755
blending: THREE.AdditiveBlending,
@@ -5425,19 +5387,6 @@ export class SeveranceEnvironment extends BaseEnvironment {
54255387
getCurrentLocation() {
54265388
if (!this.camera) return "Unknown";
54275389

5428-
// Check if in any department - REMOVED departmentBounds check
5429-
/*
5430-
for (const [name, bounds] of this.departmentBounds) {
5431-
if (bounds.containsPoint(this.camera.position)) {
5432-
return name;
5433-
}
5434-
}
5435-
*/
5436-
5437-
// TODO: Implement logic to detect which portfolio section the player is in,
5438-
// potentially based on proximity to section entrances or defined zones.
5439-
// For now, just return "CORRIDOR".
5440-
54415390
// If not in a department, must be in a corridor
54425391
return "CORRIDOR";
54435392
}
@@ -5466,21 +5415,6 @@ export class SeveranceEnvironment extends BaseEnvironment {
54665415
}
54675416
}
54685417

5469-
// Get department information - REMOVED departmentBounds check
5470-
/*
5471-
for (const [deptName, bounds] of this.departmentBounds) {
5472-
if (bounds.containsPoint(position)) {
5473-
return {
5474-
department: deptName.toLowerCase(),
5475-
position: position.clone(),
5476-
};
5477-
}
5478-
}
5479-
*/
5480-
5481-
// TODO: Adapt this to return portfolio section info later.
5482-
// For now, it primarily returns corridor info based on segments.
5483-
54845418
// Return corridor segment info if found
54855419
if (closestSegment) {
54865420
const segmentId = closestSegment.id;
@@ -5550,12 +5484,9 @@ export class SeveranceEnvironment extends BaseEnvironment {
55505484
this.systems.clear();
55515485
this.doors.clear();
55525486
this.interactiveObjects.clear();
5553-
// REMOVED: this.departmentBounds.clear();
55545487
this.corridorSegments.clear();
55555488
this.wayfinding.clear(); // Clear wayfinding elements
55565489

5557-
// Don't dispose movement controller here as it's managed by main.js
5558-
55595490
// Clear global references
55605491
window.doorLocations = [];
55615492
}
@@ -6717,22 +6648,22 @@ export class SeveranceEnvironment extends BaseEnvironment {
67176648

67186649
// Load chair.gltf
67196650
const chairGltf = await new Promise((resolve, reject) => {
6720-
loader.load('/chair.glb', resolve, undefined, reject);
6651+
loader.load(getAssetPath('/chair.glb'), resolve, undefined, reject);
67216652
});
67226653
// Load lamp.gltf
67236654
const lampGltf = await new Promise((resolve, reject) => {
6724-
loader.load('/lamp.glb', resolve, undefined, reject);
6655+
loader.load(getAssetPath('/lamp.glb'), resolve, undefined, reject);
67256656
});
67266657
// Load projector.glb
67276658
const projectorGltf = await new Promise((resolve, reject) => {
6728-
loader.load('/projector.glb', resolve, undefined, reject);
6659+
loader.load(getAssetPath('/projector.glb'), resolve, undefined, reject);
67296660
});
67306661
const projectorScreenGltf = await new Promise((resolve, reject) => {
6731-
loader.load('/projector_screen.glb', resolve, undefined, reject);
6662+
loader.load(getAssetPath('/projector_screen.glb'), resolve, undefined, reject);
67326663
});
67336664

67346665
// Load poster textures
6735-
const poster1Texture = await textureLoader.loadAsync('/assets/textures/posters/poster1.jpg');
6666+
const poster1Texture = await textureLoader.loadAsync(getAssetPath('/assets/textures/posters/poster1.jpg'));
67366667
// const poster2Texture = await textureLoader.loadAsync('/assets/textures/posters/Severance_Photo_0201.jpg');
67376668

67386669
const chairMesh = chairGltf.scene;
@@ -7148,7 +7079,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
71487079
);
71497080
// Load all still textures asynchronously
71507081
const stillTextures = await Promise.all(
7151-
stillFilenames.map(filename => textureLoader.loadAsync(stillBasePath + filename))
7082+
stillFilenames.map(filename => textureLoader.loadAsync(getAssetPath(stillBasePath + filename)))
71527083
);
71537084
const collage = createFramedCollage(stillTextures, collagePosition, stillRotation);
71547085
interiorGroup.add(collage);
@@ -7217,7 +7148,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
72177148

72187149
// Load all favorite film textures
72197150
const favoriteFilmTextures = await Promise.all(
7220-
favoriteFilms.map(film => textureLoader.loadAsync(`/assets/images/film/favorite films/${film.filename}`))
7151+
favoriteFilms.map(film => textureLoader.loadAsync(getAssetPath(`/assets/images/film/favorite films/${film.filename}`)))
72217152
);
72227153

72237154
// Define right wall position and rotation for gallery
@@ -7464,7 +7395,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
74647395
const textureLoader = new THREE.TextureLoader();
74657396

74667397
// Create the appropriate path based on posterTitle
7467-
const basePath = `/assets/Images/performance/solo performances/${posterTitle.toLowerCase()}/`;
7398+
const basePath = getAssetPath(`/assets/Images/performance/solo performances/${posterTitle.toLowerCase()}/`);
74687399
console.log(`Looking for images at path: ${basePath}`);
74697400

74707401
for (let i = 0; i < count; i++) {
@@ -7663,7 +7594,7 @@ export class SeveranceEnvironment extends BaseEnvironment {
76637594
console.log(`Creating MDR interior at ${center.x}, ${center.z}`);
76647595
try {
76657596
const loader = new GLTFLoader();
7666-
const gltf = await loader.loadAsync("/severance_tv_show_office.glb"); // Path relative to public/
7597+
const gltf = await loader.loadAsync(getAssetPath("/severance_tv_show_office.glb")); // Path relative to public/
76677598
const model = gltf.scene;
76687599

76697600
// --- Material Override & Collision Setup --- (Simplified)
@@ -9119,7 +9050,7 @@ function createKrugerTextTexture(text, { width = 1024, height = 256, bgColor = '
91199050
// Helper function to get image paths for a given poster title
91209051
const getArtPosterImagePaths = (title) => {
91219052
// Path that matches the known directory structure
9122-
const correctBasePath = `/assets/Images/performance/solo performances/${title.toLowerCase()}/`;
9053+
const correctBasePath = getAssetPath(`/assets/Images/performance/solo performances/${title.toLowerCase()}/`);
91239054
const urls = [];
91249055
let count = 0;
91259056

src/core/rendering/materials/SeveranceMaterials.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as THREE from "three";
2+
import { getAssetPath } from '../../../utils/assetPath.js';
23

34
/**
45
* Material system for the Severance aesthetic
@@ -162,12 +163,12 @@ export class SeveranceMaterials {
162163
async _loadTextures() {
163164
const textureLoader = new THREE.TextureLoader();
164165
const texturePaths = {
165-
wall: "/assets/textures/wall.jpg",
166-
floor: "/assets/textures/floor.jpg",
167-
ceiling: "/assets/textures/ceiling.jpg",
168-
trim: "/assets/textures/trim.jpg",
169-
door: "/assets/textures/door.jpg",
170-
outsideGround: "/assets/textures/wall.jpg",
166+
wall: getAssetPath("/assets/textures/wall.jpg"),
167+
floor: getAssetPath("/assets/textures/floor.jpg"),
168+
ceiling: getAssetPath("/assets/textures/ceiling.jpg"),
169+
trim: getAssetPath("/assets/textures/trim.jpg"),
170+
door: getAssetPath("/assets/textures/door.jpg"),
171+
outsideGround: getAssetPath("/assets/textures/wall.jpg"),
171172
};
172173

173174
const loadTexture = (path) => {

src/core/rendering/performance/PerformanceArtLetterGenerator.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import * as THREE from 'three';
77
import { FontLoader } from 'three/examples/jsm/loaders/FontLoader.js';
88
import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js';
9+
import { getAssetPath } from '../../../utils/assetPath.js';
910

1011
// Performance art related vocabulary
1112
const PERFORMANCE_ART_WORDS = [
@@ -24,7 +25,7 @@ const PERFORMANCE_ART_WORDS = [
2425
"power", "technology", "nature", "ecology", "social", "cultural"
2526
];
2627

27-
const FONT_PATH = '/assets/fonts/Noto Sans_Regular.typeface.json';
28+
const FONT_PATH = getAssetPath('/assets/fonts/Noto Sans_Regular.typeface.json');
2829

2930
function shuffleArray(array) {
3031
// Fisher-Yates shuffle

0 commit comments

Comments
 (0)