fix: add separate rust texture for walls to stop stretching
This commit is contained in:
@@ -32,19 +32,21 @@ function Door({ position, rotation }: DoorProps) {
|
|||||||
|
|
||||||
export default function Hallway() {
|
export default function Hallway() {
|
||||||
const [width, setWidth] = useState(fearState.currentWidth);
|
const [width, setWidth] = useState(fearState.currentWidth);
|
||||||
const [floorTex, wallTex, rustTex] = useTexture([
|
const [floorTex, wallTex, rustWallTex, rustFloorTex] = useTexture([
|
||||||
'fear/img/concrete-floor.png',
|
'fear/img/concrete-floor.png',
|
||||||
'fear/img/concrete-wall.png',
|
'fear/img/concrete-wall.png',
|
||||||
|
'fear/img/rust.png',
|
||||||
'fear/img/rust.png'
|
'fear/img/rust.png'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
[floorTex, wallTex, rustTex].forEach((tex) => {
|
[floorTex, wallTex, rustWallTex, rustFloorTex].forEach((tex) => {
|
||||||
tex.wrapS = tex.wrapT = THREE.RepeatWrapping;
|
tex.wrapS = tex.wrapT = THREE.RepeatWrapping;
|
||||||
tex.minFilter = tex.magFilter = THREE.NearestFilter;
|
tex.minFilter = tex.magFilter = THREE.NearestFilter;
|
||||||
tex.colorSpace = THREE.SRGBColorSpace;
|
tex.colorSpace = THREE.SRGBColorSpace;
|
||||||
});
|
});
|
||||||
}, [floorTex, wallTex, rustTex]);
|
}, [floorTex, wallTex, rustWallTex, rustFloorTex]);
|
||||||
|
|
||||||
|
|
||||||
const segmentPool = [0, 1, 2, 3, 4];
|
const segmentPool = [0, 1, 2, 3, 4];
|
||||||
const segmentCount = segmentPool.length;
|
const segmentCount = segmentPool.length;
|
||||||
@@ -125,11 +127,13 @@ export default function Hallway() {
|
|||||||
const horizontalTexRepeat = width / FEAR_SETTINGS.HALLWAY_WIDTH;
|
const horizontalTexRepeat = width / FEAR_SETTINGS.HALLWAY_WIDTH;
|
||||||
floorTex.repeat.set(horizontalTexRepeat, 10);
|
floorTex.repeat.set(horizontalTexRepeat, 10);
|
||||||
wallTex.repeat.set(10, 1);
|
wallTex.repeat.set(10, 1);
|
||||||
rustTex.repeat.set(horizontalTexRepeat, 10);
|
rustWallTex.repeat.set(10, 1);
|
||||||
|
rustFloorTex.repeat.set(horizontalTexRepeat, 10);
|
||||||
|
|
||||||
floorTex.needsUpdate = true;
|
floorTex.needsUpdate = true;
|
||||||
wallTex.needsUpdate = true;
|
wallTex.needsUpdate = true;
|
||||||
rustTex.needsUpdate = true;
|
rustWallTex.needsUpdate = true;
|
||||||
|
rustFloorTex.needsUpdate = true;
|
||||||
|
|
||||||
let closestPoolIndex = 0;
|
let closestPoolIndex = 0;
|
||||||
let minDistance = Infinity;
|
let minDistance = Infinity;
|
||||||
@@ -140,7 +144,6 @@ export default function Hallway() {
|
|||||||
let segmentZIndex = poolIndex - Math.floor(segmentCount / 2) + playerSegmentZ;
|
let segmentZIndex = poolIndex - Math.floor(segmentCount / 2) + playerSegmentZ;
|
||||||
segGroup.position.z = segmentZIndex * length;
|
segGroup.position.z = segmentZIndex * length;
|
||||||
|
|
||||||
// Track which pool index is currently physically closest to the player's camera position
|
|
||||||
const distance = Math.abs(segGroup.position.z - state.camera.position.z);
|
const distance = Math.abs(segGroup.position.z - state.camera.position.z);
|
||||||
if (distance < minDistance) {
|
if (distance < minDistance) {
|
||||||
minDistance = distance;
|
minDistance = distance;
|
||||||
@@ -197,10 +200,10 @@ export default function Hallway() {
|
|||||||
/*
|
/*
|
||||||
materials
|
materials
|
||||||
*/
|
*/
|
||||||
const updateMaterials = (materials: THREE.MeshStandardMaterial[], defaultTex: THREE.Texture, activeColor: string, defaultColor: string, activeRough: number, defaultRough: number, activeMetal: number, defaultMetal: number) => {
|
const updateMaterials = (materials: THREE.MeshStandardMaterial[], defaultTex: THREE.Texture, targetRustTex: THREE.Texture, activeColor: string, defaultColor: string, activeRough: number, defaultRough: number, activeMetal: number, defaultMetal: number) => {
|
||||||
materials.forEach(mat => {
|
materials.forEach(mat => {
|
||||||
if (!mat) return;
|
if (!mat) return;
|
||||||
const targetTex = isRustActive ? rustTex : defaultTex;
|
const targetTex = isRustActive ? targetRustTex : defaultTex;
|
||||||
if (mat.map !== targetTex) {
|
if (mat.map !== targetTex) {
|
||||||
mat.map = targetTex;
|
mat.map = targetTex;
|
||||||
mat.needsUpdate = true;
|
mat.needsUpdate = true;
|
||||||
@@ -211,8 +214,8 @@ export default function Hallway() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
updateMaterials(wallMaterialsRef.current, wallTex, "#918a87", "#ffffff", 0.95, 0.7, 0.05, 0.1);
|
updateMaterials(wallMaterialsRef.current, wallTex, rustWallTex, "#c5c0be", "#ffffff", 0.95, 0.7, 0.05, 0.1);
|
||||||
updateMaterials(floorMaterialsRef.current, floorTex, "#8b827f", "#ffffff", 0.95, 0.8, 0.05, 0.2);
|
updateMaterials(floorMaterialsRef.current, floorTex, rustFloorTex, "#cabdb9", "#ffffff", 0.95, 0.8, 0.05, 0.2);
|
||||||
|
|
||||||
pipeMaterialsRef.current.forEach(mat => {
|
pipeMaterialsRef.current.forEach(mat => {
|
||||||
if (!mat) return;
|
if (!mat) return;
|
||||||
|
|||||||
Reference in New Issue
Block a user