UNPKG

@omnedia/ngx-steel-beams

Version:

An Angular standalone component rendering animated 3D steel beams with a realistic procedural shader effect using Three.js.

1 lines 27.4 kB
{"version":3,"file":"omnedia-ngx-steel-beams.mjs","sources":["../../../projects/ngx-steel-beams/src/lib/ngx-steel-beams.component.ts","../../../projects/ngx-steel-beams/src/lib/ngx-steel-beams.component.html","../../../projects/ngx-steel-beams/src/public-api.ts","../../../projects/ngx-steel-beams/src/omnedia-ngx-steel-beams.ts"],"sourcesContent":["import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n PLATFORM_ID,\r\n signal,\r\n ViewChild\r\n} from '@angular/core';\r\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\r\nimport * as THREE from 'three';\r\n\r\n@Component({\r\n selector: 'om-steel-beams',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ngx-steel-beams.component.html',\r\n styleUrl: './ngx-steel-beams.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxSteelBeamsComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild('OmSteelBeams') containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n @Input() set beamWidth(v: number) {\r\n this.beamWidthSignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n @Input() set beamHeight(v: number) {\r\n this.beamHeightSignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n @Input() set beamNumber(v: number) {\r\n this.beamNumberSignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n @Input() set lightColor(v: string) {\r\n this.lightColorSignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n @Input() set speed(v: number) {\r\n this.speedSignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n @Input() set noiseIntensity(v: number) {\r\n this.noiseIntensitySignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n @Input() set scale(v: number) {\r\n this.scaleSignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n @Input() set rotation(v: number) {\r\n this.rotationSignal.set(v);\r\n\r\n if (this.initialized) {\r\n this.setupScene();\r\n }\r\n }\r\n\r\n beamWidthSignal = signal(3);\r\n beamHeightSignal = signal(20);\r\n beamNumberSignal = signal(6);\r\n lightColorSignal = signal('#ffffff');\r\n speedSignal = signal(0.01);\r\n noiseIntensitySignal = signal(1.75);\r\n scaleSignal = signal(0.2);\r\n rotationSignal = signal(45);\r\n\r\n private renderer?: THREE.WebGLRenderer;\r\n private scene?: THREE.Scene;\r\n private camera?: THREE.PerspectiveCamera;\r\n private mesh?: THREE.Mesh;\r\n private material?: THREE.ShaderMaterial;\r\n private animationFrameId?: number;\r\n private intersectionObserver?: IntersectionObserver;\r\n private running = false;\r\n private initialized = false;\r\n isInView = signal(false);\r\n\r\n private noiseGLSL = `\r\nfloat random (in vec2 st) {\r\n return fract(sin(dot(st.xy,\r\n vec2(12.9898,78.233)))*\r\n 43758.5453123);\r\n}\r\nfloat noise (in vec2 st) {\r\n vec2 i = floor(st);\r\n vec2 f = fract(st);\r\n float a = random(i);\r\n float b = random(i + vec2(1.0, 0.0));\r\n float c = random(i + vec2(0.0, 1.0));\r\n float d = random(i + vec2(1.0, 1.0));\r\n vec2 u = f * f * (3.0 - 2.0 * f);\r\n return mix(a, b, u.x) +\r\n (c - a)* u.y * (1.0 - u.x) +\r\n (d - b) * u.x * u.y;\r\n}\r\nvec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\r\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\r\nvec3 fade(vec3 t) {return t*t*t*(t*(t*6.0-15.0)+10.0);}\r\nfloat cnoise(vec3 P){\r\n vec3 Pi0 = floor(P);\r\n vec3 Pi1 = Pi0 + vec3(1.0);\r\n Pi0 = mod(Pi0, 289.0);\r\n Pi1 = mod(Pi1, 289.0);\r\n vec3 Pf0 = fract(P);\r\n vec3 Pf1 = Pf0 - vec3(1.0);\r\n vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\r\n vec4 iy = vec4(Pi0.yy, Pi1.yy);\r\n vec4 iz0 = Pi0.zzzz;\r\n vec4 iz1 = Pi1.zzzz;\r\n vec4 ixy = permute(permute(ix) + iy);\r\n vec4 ixy0 = permute(ixy + iz0);\r\n vec4 ixy1 = permute(ixy + iz1);\r\n vec4 gx0 = ixy0 / 7.0;\r\n vec4 gy0 = fract(floor(gx0) / 7.0) - 0.5;\r\n gx0 = fract(gx0);\r\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\r\n vec4 sz0 = step(gz0, vec4(0.0));\r\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\r\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\r\n vec4 gx1 = ixy1 / 7.0;\r\n vec4 gy1 = fract(floor(gx1) / 7.0) - 0.5;\r\n gx1 = fract(gx1);\r\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\r\n vec4 sz1 = step(gz1, vec4(0.0));\r\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\r\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\r\n vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);\r\n vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);\r\n vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);\r\n vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);\r\n vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);\r\n vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);\r\n vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);\r\n vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);\r\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000,g000),dot(g010,g010),dot(g100,g100),dot(g110,g110)));\r\n g000 *= norm0.x; g010 *= norm0.y; g100 *= norm0.z; g110 *= norm0.w;\r\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001,g001),dot(g011,g011),dot(g101,g101),dot(g111,g111)));\r\n g001 *= norm1.x; g011 *= norm1.y; g101 *= norm1.z; g111 *= norm1.w;\r\n float n000 = dot(g000, Pf0);\r\n float n100 = dot(g100, vec3(Pf1.x,Pf0.yz));\r\n float n010 = dot(g010, vec3(Pf0.x,Pf1.y,Pf0.z));\r\n float n110 = dot(g110, vec3(Pf1.xy,Pf0.z));\r\n float n001 = dot(g001, vec3(Pf0.xy,Pf1.z));\r\n float n101 = dot(g101, vec3(Pf1.x,Pf0.y,Pf1.z));\r\n float n011 = dot(g011, vec3(Pf0.x,Pf1.yz));\r\n float n111 = dot(g111, Pf1);\r\n vec3 fade_xyz = fade(Pf0);\r\n vec4 n_z = mix(vec4(n000,n100,n010,n110),vec4(n001,n101,n011,n111),fade_xyz.z);\r\n vec2 n_yz = mix(n_z.xy,n_z.zw,fade_xyz.y);\r\n float n_xyz = mix(n_yz.x,n_yz.y,fade_xyz.x);\r\n return 2.2 * n_xyz;\r\n}\r\n`;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: Object) {\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n this.setupScene();\r\n this.observeInView();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.running = false;\r\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\r\n if (this.intersectionObserver) this.intersectionObserver.disconnect();\r\n if (this.renderer) {\r\n this.containerRef.nativeElement.removeChild(this.renderer.domElement);\r\n this.renderer.dispose();\r\n }\r\n }\r\n\r\n private observeInView() {\r\n this.intersectionObserver = new IntersectionObserver(([entry]) => {\r\n const wasInView = this.isInView();\r\n this.isInView.set(entry.isIntersecting);\r\n if (!wasInView && this.isInView()) {\r\n this.running = true;\r\n this.animate();\r\n }\r\n if (wasInView && !this.isInView()) {\r\n this.running = false;\r\n }\r\n });\r\n this.intersectionObserver.observe(this.containerRef.nativeElement);\r\n }\r\n\r\n private setupScene() {\r\n if (this.renderer) {\r\n this.containerRef.nativeElement.removeChild(this.renderer.domElement);\r\n this.renderer.dispose();\r\n }\r\n\r\n this.renderer = new THREE.WebGLRenderer({alpha: true, antialias: true});\r\n this.renderer.setClearColor(0x000000, 0);\r\n this.containerRef.nativeElement.appendChild(this.renderer.domElement);\r\n\r\n const width = this.containerRef.nativeElement.clientWidth;\r\n const height = this.containerRef.nativeElement.clientHeight;\r\n this.camera = new THREE.PerspectiveCamera(30, width / height, 0.1, 100);\r\n this.camera.position.set(0, 0, 20);\r\n\r\n this.scene = new THREE.Scene();\r\n\r\n const beamWidth = this.beamWidthSignal();\r\n const beamHeight = this.beamHeightSignal();\r\n const beamNumber = this.beamNumberSignal();\r\n const speed = this.speedSignal();\r\n const noiseIntensity = this.noiseIntensitySignal();\r\n const scale = this.scaleSignal();\r\n const rotation = this.rotationSignal();\r\n\r\n const geometry = this.createStackedPlanesBufferGeometry(beamNumber, beamWidth, beamHeight, 0, 100);\r\n\r\n this.material = this.extendMaterial(THREE.MeshStandardMaterial, {\r\n header: `\r\nvarying vec3 vEye;\r\nvarying float vNoise;\r\nvarying vec2 vUv;\r\nvarying vec3 vPosition;\r\nuniform float time;\r\nuniform float uSpeed;\r\nuniform float uNoiseIntensity;\r\nuniform float uScale;\r\n${this.noiseGLSL}`,\r\n vertexHeader: `\r\nfloat getPos(vec3 pos) {\r\n vec3 noisePos =\r\n vec3(pos.x * 0., pos.y - uv.y, pos.z + time * uSpeed * 3.) * uScale;\r\n return cnoise(noisePos);\r\n}\r\nvec3 getCurrentPos(vec3 pos) {\r\n vec3 newpos = pos;\r\n newpos.z += getPos(pos);\r\n return newpos;\r\n}\r\nvec3 getNormal(vec3 pos) {\r\n vec3 curpos = getCurrentPos(pos);\r\n vec3 nextposX = getCurrentPos(pos + vec3(0.01, 0.0, 0.0));\r\n vec3 nextposZ = getCurrentPos(pos + vec3(0.0, -0.01, 0.0));\r\n vec3 tangentX = normalize(nextposX - curpos);\r\n vec3 tangentZ = normalize(nextposZ - curpos);\r\n return normalize(cross(tangentZ, tangentX));\r\n}`,\r\n fragmentHeader: \"\",\r\n vertex: {\r\n \"#include <begin_vertex>\": `transformed.z += getPos(transformed.xyz);`,\r\n \"#include <beginnormal_vertex>\": `objectNormal = getNormal(position.xyz);`,\r\n },\r\n fragment: {\r\n \"#include <dithering_fragment>\": `\r\nfloat randomNoise = noise(gl_FragCoord.xy);\r\ngl_FragColor.rgb -= randomNoise / 15. * uNoiseIntensity;`,\r\n },\r\n material: {fog: true},\r\n uniforms: {\r\n diffuse: new THREE.Color(...this.hexToNormalizedRGB(\"#000000\")),\r\n time: {shared: true, mixed: true, linked: true, value: 0},\r\n roughness: 0.3,\r\n metalness: 0.3,\r\n uSpeed: {shared: true, mixed: true, linked: true, value: speed},\r\n envMapIntensity: 10,\r\n uNoiseIntensity: noiseIntensity,\r\n uScale: scale,\r\n },\r\n });\r\n\r\n this.mesh = new THREE.Mesh(geometry, this.material);\r\n this.scene.add(this.mesh);\r\n\r\n const dirLight = new THREE.DirectionalLight(this.lightColorSignal(), 1);\r\n dirLight.position.set(0, 3, 10);\r\n dirLight.castShadow = false;\r\n this.scene.add(dirLight);\r\n const ambient = new THREE.AmbientLight(0xffffff, 1);\r\n this.scene.add(ambient);\r\n\r\n this.mesh.rotation.z = THREE.MathUtils.degToRad(rotation);\r\n\r\n this.renderer.setSize(width, height, false);\r\n this.camera.aspect = width / height;\r\n this.camera.updateProjectionMatrix();\r\n\r\n this.initialized = true;\r\n this.running = true;\r\n this.animate();\r\n }\r\n\r\n private animate = () => {\r\n if (!this.running) return;\r\n if (this.material && this.material.uniforms && this.material.uniforms['time']) {\r\n this.material.uniforms['time'].value += 0.1;\r\n }\r\n this.renderer?.render(this.scene!, this.camera!);\r\n this.animationFrameId = requestAnimationFrame(this.animate);\r\n };\r\n\r\n private extendMaterial(BaseMaterial: any, cfg: any) {\r\n const physical = THREE.ShaderLib.physical;\r\n const {vertexShader: baseVert, fragmentShader: baseFrag, uniforms: baseUniforms} = physical;\r\n const baseDefines = 'defines' in physical ? (physical as any).defines : {};\r\n const uniforms = THREE.UniformsUtils.clone(baseUniforms);\r\n const defaults = new BaseMaterial(cfg.material || {});\r\n if (defaults.color) uniforms['diffuse'].value = defaults.color;\r\n if ('roughness' in defaults) uniforms['roughness'].value = defaults.roughness;\r\n if ('metalness' in defaults) uniforms['metalness'].value = defaults.metalness;\r\n if ('envMap' in defaults) uniforms['envMap'].value = defaults.envMap;\r\n if ('envMapIntensity' in defaults) uniforms['envMapIntensity'].value = defaults.envMapIntensity;\r\n Object.entries(cfg.uniforms ?? {}).forEach(([key, u]: [string, any]) => {\r\n uniforms[key] =\r\n u !== null && typeof u === 'object' && 'value' in u ? (u) : ({value: u});\r\n });\r\n let vert = `${cfg.header}\\n${cfg.vertexHeader ?? \"\"}\\n${baseVert}`;\r\n let frag = `${cfg.header}\\n${cfg.fragmentHeader ?? \"\"}\\n${baseFrag}`;\r\n for (const [inc, code] of Object.entries(cfg.vertex ?? {})) {\r\n vert = vert.replace(inc, `${inc}\\n${code}`);\r\n }\r\n for (const [inc, code] of Object.entries(cfg.fragment ?? {})) {\r\n frag = frag.replace(inc, `${inc}\\n${code}`);\r\n }\r\n return new THREE.ShaderMaterial({\r\n defines: {...baseDefines},\r\n uniforms,\r\n vertexShader: vert,\r\n fragmentShader: frag,\r\n lights: true,\r\n fog: !!cfg.material?.fog,\r\n });\r\n }\r\n\r\n private hexToNormalizedRGB(hex: string): [number, number, number] {\r\n const clean = hex.replace('#', '');\r\n return [\r\n parseInt(clean.substring(0, 2), 16) / 255,\r\n parseInt(clean.substring(2, 4), 16) / 255,\r\n parseInt(clean.substring(4, 6), 16) / 255\r\n ];\r\n }\r\n\r\n private createStackedPlanesBufferGeometry(n: number, width: number, height: number, spacing: number, heightSegments: number): THREE.BufferGeometry {\r\n const geometry = new THREE.BufferGeometry();\r\n const numVertices = n * (heightSegments + 1) * 2;\r\n const numFaces = n * heightSegments * 2;\r\n const positions = new Float32Array(numVertices * 3);\r\n const indices = new Uint32Array(numFaces * 3);\r\n const uvs = new Float32Array(numVertices * 2);\r\n\r\n let vertexOffset = 0;\r\n let indexOffset = 0;\r\n let uvOffset = 0;\r\n const totalWidth = n * width + (n - 1) * spacing;\r\n const xOffsetBase = -totalWidth / 2;\r\n\r\n for (let i = 0; i < n; i++) {\r\n const xOffset = xOffsetBase + i * (width + spacing);\r\n const uvXOffset = Math.random() * 300;\r\n const uvYOffset = Math.random() * 300;\r\n for (let j = 0; j <= heightSegments; j++) {\r\n const y = height * (j / heightSegments - 0.5);\r\n const v0 = [xOffset, y, 0];\r\n const v1 = [xOffset + width, y, 0];\r\n positions.set([...v0, ...v1], vertexOffset * 3);\r\n const uvY = j / heightSegments;\r\n uvs.set(\r\n [uvXOffset, uvY + uvYOffset, uvXOffset + 1, uvY + uvYOffset],\r\n uvOffset\r\n );\r\n if (j < heightSegments) {\r\n const b = vertexOffset + 1;\r\n const c = vertexOffset + 2;\r\n const d = vertexOffset + 3;\r\n indices.set([vertexOffset, b, c, c, b, d], indexOffset);\r\n indexOffset += 6;\r\n }\r\n vertexOffset += 2;\r\n uvOffset += 4;\r\n }\r\n }\r\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(positions, 3));\r\n geometry.setAttribute(\"uv\", new THREE.BufferAttribute(uvs, 2));\r\n geometry.setIndex(new THREE.BufferAttribute(indices, 1));\r\n geometry.computeVertexNormals();\r\n return geometry;\r\n }\r\n}\r\n","<div #OmSteelBeams class=\"om-steel-beams\"></div>\n","/*\r\n * Public API Surface of ngx-steel-beams\r\n */\r\n\r\nexport * from './lib/ngx-steel-beams.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}