51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import * as THREE from 'three';
|
|
import * as Types from '../../../../types/world/worldTypes';
|
|
import * as CONSTANTS from '../../../../types/world/worldConstants';
|
|
|
|
const baseMaterial = new THREE.ShaderMaterial({
|
|
side: THREE.DoubleSide,
|
|
vertexShader: `
|
|
varying vec2 vUv;
|
|
void main(){
|
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
vUv = uv;
|
|
}
|
|
`,
|
|
fragmentShader: `
|
|
varying vec2 vUv;
|
|
uniform vec3 uOuterColor;
|
|
void main(){
|
|
float alpha = 1.0 - vUv.y;
|
|
gl_FragColor = vec4(uOuterColor, alpha);
|
|
}
|
|
`,
|
|
uniforms: {
|
|
uOuterColor: { value: new THREE.Color(CONSTANTS.zoneConfig.defaultColor) },
|
|
},
|
|
transparent: true,
|
|
});
|
|
|
|
export default function addZonesToScene(
|
|
line: Types.Line,
|
|
floorGroupZone: Types.RefGroup,
|
|
color: THREE.Color
|
|
) {
|
|
const point1 = line[0][0];
|
|
const point2 = line[1][0];
|
|
|
|
const length = (new THREE.Vector3(point2.x, point2.y, point2.z)).distanceTo(new THREE.Vector3(point1.x, point1.y, point1.z));
|
|
const angle = Math.atan2(point2.z - point1.z, point2.x - point1.x);
|
|
|
|
const geometry = new THREE.PlaneGeometry(length, 10);
|
|
|
|
const material = baseMaterial.clone();
|
|
material.uniforms.uOuterColor.value.set(color.r, color.g, color.b);
|
|
|
|
const mesh = new THREE.Mesh(geometry, material);
|
|
|
|
mesh.position.set((point1.x + point2.x) / 2, ((line[0][2] - 1) * CONSTANTS.wallConfig.height) + 5, (point1.z + point2.z) / 2);
|
|
mesh.rotation.y = -angle;
|
|
|
|
floorGroupZone.current.add(mesh);
|
|
}
|