UNPKG

@omnedia/ngx-orb

Version:

An Angular standalone component for an animated, interactive 3D orb with procedural GLSL shaders (OGL/WebGL).

1 lines 20.8 kB
{"version":3,"file":"omnedia-ngx-orb.mjs","sources":["../../../projects/ngx-orb/src/lib/ngx-orb.component.ts","../../../projects/ngx-orb/src/lib/ngx-orb.component.html","../../../projects/ngx-orb/src/public-api.ts","../../../projects/ngx-orb/src/omnedia-ngx-orb.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\n\r\nimport {Mesh, OGLRenderingContext, Program, Renderer, Triangle, Vec3} from 'ogl';\r\n\r\n@Component({\r\n selector: 'om-orb',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: \"./ngx-orb.component.html\",\r\n styleUrl: './ngx-orb.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxOrbComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild('OmOrb') containerRef!: ElementRef<HTMLDivElement>;\r\n @ViewChild('OmOrbCanvas') canvasWrapperRef!: ElementRef<HTMLDivElement>;\r\n\r\n @Input() set hue(v: number) {\r\n this.hueSignal.set(v);\r\n if (this.initialized) this.updateUniform('hue', v);\r\n }\r\n\r\n @Input() set hoverIntensity(v: number) {\r\n this.hoverIntensitySignal.set(v);\r\n if (this.initialized) this.updateUniform('hoverIntensity', v);\r\n }\r\n\r\n @Input() set rotateOnHover(v: boolean) {\r\n this.rotateOnHoverSignal.set(v);\r\n }\r\n\r\n @Input() set forceHoverState(v: boolean) {\r\n this.forceHoverStateSignal.set(v);\r\n }\r\n\r\n hueSignal = signal(0);\r\n hoverIntensitySignal = signal(0.2);\r\n rotateOnHoverSignal = signal(true);\r\n forceHoverStateSignal = signal(false);\r\n\r\n private renderer: any;\r\n private gl?: OGLRenderingContext;\r\n private program?: Program;\r\n private mesh?: Mesh;\r\n private rafId?: number;\r\n private initialized = false;\r\n private lastTime = 0;\r\n private targetHover = 0;\r\n private currentRot = 0;\r\n private running = true;\r\n private intersectionObserver?: IntersectionObserver;\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\r\n this.setupOGL();\r\n this.observeInView();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.running = false;\r\n if (this.rafId) cancelAnimationFrame(this.rafId);\r\n if (this.intersectionObserver) this.intersectionObserver.disconnect();\r\n if (this.gl?.canvas && this.canvasWrapperRef.nativeElement.contains(this.gl.canvas)) {\r\n this.canvasWrapperRef.nativeElement.removeChild(this.gl.canvas);\r\n }\r\n this.gl?.getExtension('WEBGL_lose_context')?.loseContext();\r\n window.removeEventListener('resize', this.resizeHandler);\r\n this.containerRef.nativeElement.removeEventListener('mousemove', this.handleMouseMove);\r\n this.containerRef.nativeElement.removeEventListener('mouseleave', this.handleMouseLeave);\r\n }\r\n\r\n private observeInView() {\r\n this.intersectionObserver = new IntersectionObserver(([entry]) => {\r\n this.running = entry.isIntersecting;\r\n if (this.running) this.rafId = requestAnimationFrame(this.update);\r\n });\r\n this.intersectionObserver.observe(this.containerRef.nativeElement);\r\n }\r\n\r\n private setupOGL() {\r\n const vert = `precision highp float; attribute vec2 position; attribute vec2 uv; varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 0.0, 1.0); }`;\r\n\r\n // (Use your full fragment shader code here)\r\n const frag = `\r\n precision highp float;\r\n uniform float iTime;\r\n uniform vec3 iResolution;\r\n uniform float hue;\r\n uniform float hover;\r\n uniform float rot;\r\n uniform float hoverIntensity;\r\n varying vec2 vUv;\r\n\r\n vec3 rgb2yiq(vec3 c) {\r\n float y = dot(c, vec3(0.299, 0.587, 0.114));\r\n float i = dot(c, vec3(0.596, -0.274, -0.322));\r\n float q = dot(c, vec3(0.211, -0.523, 0.312));\r\n return vec3(y, i, q);\r\n }\r\n\r\n vec3 yiq2rgb(vec3 c) {\r\n float r = c.x + 0.956 * c.y + 0.621 * c.z;\r\n float g = c.x - 0.272 * c.y - 0.647 * c.z;\r\n float b = c.x - 1.106 * c.y + 1.703 * c.z;\r\n return vec3(r, g, b);\r\n }\r\n\r\n vec3 adjustHue(vec3 color, float hueDeg) {\r\n float hueRad = hueDeg * 3.14159265 / 180.0;\r\n vec3 yiq = rgb2yiq(color);\r\n float cosA = cos(hueRad);\r\n float sinA = sin(hueRad);\r\n float i = yiq.y * cosA - yiq.z * sinA;\r\n float q = yiq.y * sinA + yiq.z * cosA;\r\n yiq.y = i;\r\n yiq.z = q;\r\n return yiq2rgb(yiq);\r\n }\r\n\r\n vec3 hash33(vec3 p3) {\r\n p3 = fract(p3 * vec3(0.1031, 0.11369, 0.13787));\r\n p3 += dot(p3, p3.yxz + 19.19);\r\n return -1.0 + 2.0 * fract(vec3(\r\n p3.x + p3.y,\r\n p3.x + p3.z,\r\n p3.y + p3.z\r\n ) * p3.zyx);\r\n }\r\n\r\n float snoise3(vec3 p) {\r\n const float K1 = 0.333333333;\r\n const float K2 = 0.166666667;\r\n vec3 i = floor(p + (p.x + p.y + p.z) * K1);\r\n vec3 d0 = p - (i - (i.x + i.y + i.z) * K2);\r\n vec3 e = step(vec3(0.0), d0 - d0.yzx);\r\n vec3 i1 = e * (1.0 - e.zxy);\r\n vec3 i2 = 1.0 - e.zxy * (1.0 - e);\r\n vec3 d1 = d0 - (i1 - K2);\r\n vec3 d2 = d0 - (i2 - K1);\r\n vec3 d3 = d0 - 0.5;\r\n vec4 h = max(0.6 - vec4(\r\n dot(d0, d0),\r\n dot(d1, d1),\r\n dot(d2, d2),\r\n dot(d3, d3)\r\n ), 0.0);\r\n\r\n vec4 n = h * h * h * h * vec4(\r\n dot(d0, hash33(i)),\r\n dot(d1, hash33(i + i1)),\r\n dot(d2, hash33(i + i2)),\r\n dot(d3, hash33(i + 1.0))\r\n );\r\n\r\n return dot(vec4(31.316), n);\r\n }\r\n\r\n vec4 extractAlpha(vec3 colorIn) {\r\n float a = max(max(colorIn.r, colorIn.g), colorIn.b);\r\n return vec4(colorIn.rgb / (a + 1e-5), a);\r\n }\r\n\r\n const vec3 baseColor1 = vec3(0.611765, 0.262745, 0.996078);\r\n const vec3 baseColor2 = vec3(0.298039, 0.760784, 0.913725);\r\n const vec3 baseColor3 = vec3(0.062745, 0.078431, 0.600000);\r\n const float innerRadius = 0.6;\r\n const float noiseScale = 0.65;\r\n\r\n float light1(float intensity, float attenuation, float dist) {\r\n return intensity / (1.0 + dist * attenuation);\r\n }\r\n float light2(float intensity, float attenuation, float dist) {\r\n return intensity / (1.0 + dist * dist * attenuation);\r\n }\r\n\r\n vec4 draw(vec2 uv) {\r\n vec3 color1 = adjustHue(baseColor1, hue);\r\n vec3 color2 = adjustHue(baseColor2, hue);\r\n vec3 color3 = adjustHue(baseColor3, hue);\r\n\r\n float ang = atan(uv.y, uv.x);\r\n float len = length(uv);\r\n float invLen = len > 0.0 ? 1.0 / len : 0.0;\r\n\r\n float n0 = snoise3(vec3(uv * noiseScale, iTime * 0.5)) * 0.5 + 0.5;\r\n float r0 = mix(mix(innerRadius, 1.0, 0.4), mix(innerRadius, 1.0, 0.6), n0);\r\n float d0 = distance(uv, (r0 * invLen) * uv);\r\n float v0 = light1(1.0, 10.0, d0);\r\n v0 *= smoothstep(r0 * 1.05, r0, len);\r\n float cl = cos(ang + iTime * 2.0) * 0.5 + 0.5;\r\n\r\n float a = iTime * -1.0;\r\n vec2 pos = vec2(cos(a), sin(a)) * r0;\r\n float d = distance(uv, pos);\r\n float v1 = light2(1.5, 5.0, d);\r\n v1 *= light1(1.0, 50.0, d0);\r\n\r\n float v2 = smoothstep(1.0, mix(innerRadius, 1.0, n0 * 0.5), len);\r\n float v3 = smoothstep(innerRadius, mix(innerRadius, 1.0, 0.5), len);\r\n\r\n vec3 col = mix(color1, color2, cl);\r\n col = mix(color3, col, v0);\r\n col = (col + v1) * v2 * v3;\r\n col = clamp(col, 0.0, 1.0);\r\n\r\n return extractAlpha(col);\r\n }\r\n\r\n vec4 mainImage(vec2 fragCoord) {\r\n vec2 center = iResolution.xy * 0.5;\r\n float size = min(iResolution.x, iResolution.y);\r\n vec2 uv = (fragCoord - center) / size * 2.0;\r\n\r\n float angle = rot;\r\n float s = sin(angle);\r\n float c = cos(angle);\r\n uv = vec2(c * uv.x - s * uv.y, s * uv.x + c * uv.y);\r\n\r\n uv.x += hover * hoverIntensity * 0.1 * sin(uv.y * 10.0 + iTime);\r\n uv.y += hover * hoverIntensity * 0.1 * sin(uv.x * 10.0 + iTime);\r\n\r\n return draw(uv);\r\n }\r\n\r\n void main() {\r\n vec2 fragCoord = vUv * iResolution.xy;\r\n vec4 col = mainImage(fragCoord);\r\n gl_FragColor = vec4(col.rgb * col.a, col.a);\r\n }\r\n `;\r\n\r\n this.renderer = new Renderer({alpha: true, premultipliedAlpha: false});\r\n this.gl = this.renderer.gl;\r\n\r\n if (!this.gl) {\r\n return;\r\n }\r\n\r\n this.gl.clearColor(0, 0, 0, 0);\r\n this.canvasWrapperRef.nativeElement.appendChild(this.gl.canvas);\r\n\r\n const geometry = new Triangle(this.gl);\r\n this.program = new Program(this.gl, {\r\n vertex: vert,\r\n fragment: frag,\r\n uniforms: {\r\n iTime: {value: 0},\r\n iResolution: {value: new Vec3(this.gl.canvas.width, this.gl.canvas.height, this.gl.canvas.width / this.gl.canvas.height)},\r\n hue: {value: this.hueSignal()},\r\n hover: {value: 0},\r\n rot: {value: 0},\r\n hoverIntensity: {value: this.hoverIntensitySignal()},\r\n },\r\n });\r\n this.mesh = new Mesh(this.gl, {geometry, program: this.program});\r\n\r\n window.addEventListener('resize', this.resizeHandler);\r\n this.containerRef.nativeElement.addEventListener('mousemove', this.handleMouseMove);\r\n this.containerRef.nativeElement.addEventListener('mouseleave', this.handleMouseLeave);\r\n this.resizeHandler();\r\n\r\n this.initialized = true;\r\n this.rafId = requestAnimationFrame(this.update);\r\n }\r\n\r\n private resizeHandler = () => {\r\n if (!this.canvasWrapperRef.nativeElement) return;\r\n const dpr = window.devicePixelRatio || 1;\r\n const width = this.canvasWrapperRef.nativeElement.clientWidth;\r\n const height = this.canvasWrapperRef.nativeElement.clientHeight;\r\n this.renderer.setSize(width * dpr, height * dpr);\r\n this.gl!.canvas.style.width = width + \"px\";\r\n this.gl!.canvas.style.height = height + \"px\";\r\n this.program!.uniforms['iResolution'].value.set(this.gl!.canvas.width, this.gl!.canvas.height, this.gl!.canvas.width / this.gl!.canvas.height);\r\n };\r\n\r\n private handleMouseMove = (e: MouseEvent) => {\r\n const rect = this.canvasWrapperRef.nativeElement.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n const width = rect.width;\r\n const height = rect.height;\r\n const size = Math.min(width, height);\r\n const centerX = width / 2;\r\n const centerY = height / 2;\r\n const uvX = ((x - centerX) / size) * 2.0;\r\n const uvY = ((y - centerY) / size) * 2.0;\r\n this.targetHover = Math.sqrt(uvX * uvX + uvY * uvY) < 0.8 ? 1 : 0;\r\n };\r\n\r\n private handleMouseLeave = () => {\r\n this.targetHover = 0;\r\n };\r\n\r\n private updateUniform(key: string, value: any) {\r\n if (this.program && this.program.uniforms && key in this.program.uniforms) {\r\n this.program.uniforms[key].value = value;\r\n }\r\n }\r\n\r\n private update = (t: number) => {\r\n if (!this.running || !this.program) return;\r\n const dt = (t - this.lastTime) * 0.001;\r\n this.lastTime = t;\r\n\r\n const hue = this.hueSignal();\r\n const hoverIntensity = this.hoverIntensitySignal();\r\n const rotateOnHover = this.rotateOnHoverSignal();\r\n const forceHoverState = this.forceHoverStateSignal();\r\n\r\n this.program.uniforms['iTime'].value = t * 0.001;\r\n this.program.uniforms['hue'].value = hue;\r\n this.program.uniforms['hoverIntensity'].value = hoverIntensity;\r\n\r\n const effectiveHover = forceHoverState ? 1 : this.targetHover;\r\n this.program.uniforms['hover'].value += (effectiveHover - this.program.uniforms['hover'].value) * 0.1;\r\n\r\n if (rotateOnHover && effectiveHover > 0.5) {\r\n this.currentRot += dt * 0.3;\r\n }\r\n this.program.uniforms['rot'].value = this.currentRot;\r\n\r\n this.renderer.render({scene: this.mesh});\r\n this.rafId = requestAnimationFrame(this.update);\r\n };\r\n}\r\n","<div #OmOrb class=\"om-orb\">\r\n <div class=\"om-orb-canvas\" #OmOrbCanvas></div>\r\n <div class=\"om-orb-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n</div>\r\n","/*\r\n * Public API Surface of ngx-orb\r\n */\r\n\r\nexport * from './lib/ngx-orb.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}