@ntalmagor/3drize-viewer 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AnimatedObject.d.ts +22 -0
- package/dist/components/AnimatedObject.d.ts.map +1 -0
- package/dist/components/AnimatedObject.js +121 -0
- package/dist/components/CameraController.d.ts +16 -0
- package/dist/components/CameraController.d.ts.map +1 -0
- package/dist/components/CameraController.js +132 -0
- package/dist/components/Clouds.d.ts +14 -0
- package/dist/components/Clouds.d.ts.map +1 -0
- package/dist/components/Clouds.js +97 -0
- package/dist/components/CreatedObject.d.ts +12 -0
- package/dist/components/CreatedObject.d.ts.map +1 -0
- package/dist/components/CreatedObject.js +139 -0
- package/dist/components/CustomPrimitive.d.ts +12 -0
- package/dist/components/CustomPrimitive.d.ts.map +1 -0
- package/dist/components/CustomPrimitive.js +80 -0
- package/dist/components/EffectsGenerator.d.ts +10 -0
- package/dist/components/EffectsGenerator.d.ts.map +1 -0
- package/dist/components/EffectsGenerator.js +59 -0
- package/dist/components/EffectsGroup.d.ts +8 -0
- package/dist/components/EffectsGroup.d.ts.map +1 -0
- package/dist/components/EffectsGroup.js +8 -0
- package/dist/components/EnvironmentManager.d.ts +9 -0
- package/dist/components/EnvironmentManager.d.ts.map +1 -0
- package/dist/components/EnvironmentManager.js +47 -0
- package/dist/components/Frame.d.ts +26 -0
- package/dist/components/Frame.d.ts.map +1 -0
- package/dist/components/Frame.js +50 -0
- package/dist/components/FrameGeometry.d.ts +10 -0
- package/dist/components/FrameGeometry.d.ts.map +1 -0
- package/dist/components/FrameGeometry.js +17 -0
- package/dist/components/FrameImage.d.ts +14 -0
- package/dist/components/FrameImage.d.ts.map +1 -0
- package/dist/components/FrameImage.js +15 -0
- package/dist/components/Galaxy.d.ts +8 -0
- package/dist/components/Galaxy.d.ts.map +1 -0
- package/dist/components/Galaxy.js +9 -0
- package/dist/components/GalleryLayout.d.ts +10 -0
- package/dist/components/GalleryLayout.d.ts.map +1 -0
- package/dist/components/GalleryLayout.js +18 -0
- package/dist/components/GridHelper.d.ts +23 -0
- package/dist/components/GridHelper.d.ts.map +1 -0
- package/dist/components/GridHelper.js +38 -0
- package/dist/components/ImageGeometry.d.ts +14 -0
- package/dist/components/ImageGeometry.d.ts.map +1 -0
- package/dist/components/ImageGeometry.js +62 -0
- package/dist/components/Lensflare.d.ts +12 -0
- package/dist/components/Lensflare.d.ts.map +1 -0
- package/dist/components/Lensflare.js +66 -0
- package/dist/components/Letter.d.ts +20 -0
- package/dist/components/Letter.d.ts.map +1 -0
- package/dist/components/Letter.js +83 -0
- package/dist/components/Letters.d.ts +16 -0
- package/dist/components/Letters.d.ts.map +1 -0
- package/dist/components/Letters.js +18 -0
- package/dist/components/LightsManager.d.ts +9 -0
- package/dist/components/LightsManager.d.ts.map +1 -0
- package/dist/components/LightsManager.js +121 -0
- package/dist/components/Lines.d.ts +9 -0
- package/dist/components/Lines.d.ts.map +1 -0
- package/dist/components/Lines.js +19 -0
- package/dist/components/LoadingIndicator.d.ts +10 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/LoadingIndicator.js +143 -0
- package/dist/components/MaterialLibrary.d.ts +9 -0
- package/dist/components/MaterialLibrary.d.ts.map +1 -0
- package/dist/components/MaterialLibrary.js +57 -0
- package/dist/components/Moon.d.ts +13 -0
- package/dist/components/Moon.d.ts.map +1 -0
- package/dist/components/Moon.js +52 -0
- package/dist/components/ObjectNode.d.ts +11 -0
- package/dist/components/ObjectNode.d.ts.map +1 -0
- package/dist/components/ObjectNode.js +61 -0
- package/dist/components/ObjectsRenderer.d.ts +11 -0
- package/dist/components/ObjectsRenderer.d.ts.map +1 -0
- package/dist/components/ObjectsRenderer.js +19 -0
- package/dist/components/Ocean.d.ts +8 -0
- package/dist/components/Ocean.d.ts.map +1 -0
- package/dist/components/Ocean.js +111 -0
- package/dist/components/ParticlesR3f.d.ts +16 -0
- package/dist/components/ParticlesR3f.d.ts.map +1 -0
- package/dist/components/ParticlesR3f.js +66 -0
- package/dist/components/Path.d.ts +13 -0
- package/dist/components/Path.d.ts.map +1 -0
- package/dist/components/Path.js +41 -0
- package/dist/components/PathGeometry.d.ts +11 -0
- package/dist/components/PathGeometry.d.ts.map +1 -0
- package/dist/components/PathGeometry.js +109 -0
- package/dist/components/PathRenderer.d.ts +14 -0
- package/dist/components/PathRenderer.d.ts.map +1 -0
- package/dist/components/PathRenderer.js +33 -0
- package/dist/components/ProductionScene.d.ts +29 -0
- package/dist/components/ProductionScene.d.ts.map +1 -0
- package/dist/components/ProductionScene.js +18 -0
- package/dist/components/ProjectLoader.d.ts +14 -0
- package/dist/components/ProjectLoader.d.ts.map +1 -0
- package/dist/components/ProjectLoader.js +76 -0
- package/dist/components/Rain.d.ts +8 -0
- package/dist/components/Rain.d.ts.map +1 -0
- package/dist/components/Rain.js +133 -0
- package/dist/components/SceneBuilder.d.ts +5 -0
- package/dist/components/SceneBuilder.d.ts.map +1 -0
- package/dist/components/SceneBuilder.js +104 -0
- package/dist/components/SceneFog.d.ts +8 -0
- package/dist/components/SceneFog.d.ts.map +1 -0
- package/dist/components/SceneFog.js +19 -0
- package/dist/components/ShootingStar.d.ts +16 -0
- package/dist/components/ShootingStar.d.ts.map +1 -0
- package/dist/components/ShootingStar.js +92 -0
- package/dist/components/ShootingStars.d.ts +8 -0
- package/dist/components/ShootingStars.d.ts.map +1 -0
- package/dist/components/ShootingStars.js +40 -0
- package/dist/components/SkyController.d.ts +10 -0
- package/dist/components/SkyController.d.ts.map +1 -0
- package/dist/components/SkyController.js +159 -0
- package/dist/components/SkyMesh.d.ts +11 -0
- package/dist/components/SkyMesh.d.ts.map +1 -0
- package/dist/components/SkyMesh.js +36 -0
- package/dist/components/SkySystem.d.ts +34 -0
- package/dist/components/SkySystem.d.ts.map +1 -0
- package/dist/components/SkySystem.js +47 -0
- package/dist/components/Skybox.d.ts +12 -0
- package/dist/components/Skybox.d.ts.map +1 -0
- package/dist/components/Skybox.js +79 -0
- package/dist/components/Stars.d.ts +14 -0
- package/dist/components/Stars.d.ts.map +1 -0
- package/dist/components/Stars.js +165 -0
- package/dist/components/SunLight.d.ts +15 -0
- package/dist/components/SunLight.d.ts.map +1 -0
- package/dist/components/SunLight.js +57 -0
- package/dist/components/Text2D.d.ts +9 -0
- package/dist/components/Text2D.d.ts.map +1 -0
- package/dist/components/Text2D.js +56 -0
- package/dist/components/Text3D.d.ts +10 -0
- package/dist/components/Text3D.d.ts.map +1 -0
- package/dist/components/Text3D.js +8 -0
- package/dist/components/effects/AuraEffect.d.ts +10 -0
- package/dist/components/effects/AuraEffect.d.ts.map +1 -0
- package/dist/components/effects/AuraEffect.js +127 -0
- package/dist/components/effects/AuroraEffect.d.ts +10 -0
- package/dist/components/effects/AuroraEffect.d.ts.map +1 -0
- package/dist/components/effects/AuroraEffect.js +112 -0
- package/dist/components/effects/BlackHoleEffect.d.ts +10 -0
- package/dist/components/effects/BlackHoleEffect.d.ts.map +1 -0
- package/dist/components/effects/BlackHoleEffect.js +193 -0
- package/dist/components/effects/ConstellationEffect.d.ts +10 -0
- package/dist/components/effects/ConstellationEffect.d.ts.map +1 -0
- package/dist/components/effects/ConstellationEffect.js +189 -0
- package/dist/components/effects/DataStreamEffect.d.ts +10 -0
- package/dist/components/effects/DataStreamEffect.d.ts.map +1 -0
- package/dist/components/effects/DataStreamEffect.js +138 -0
- package/dist/components/effects/DnaHelixEffect.d.ts +10 -0
- package/dist/components/effects/DnaHelixEffect.d.ts.map +1 -0
- package/dist/components/effects/DnaHelixEffect.js +311 -0
- package/dist/components/effects/FireEffect.d.ts +10 -0
- package/dist/components/effects/FireEffect.d.ts.map +1 -0
- package/dist/components/effects/FireEffect.js +194 -0
- package/dist/components/effects/ForcefieldEffect.d.ts +10 -0
- package/dist/components/effects/ForcefieldEffect.d.ts.map +1 -0
- package/dist/components/effects/ForcefieldEffect.js +132 -0
- package/dist/components/effects/HologramEffect.d.ts +10 -0
- package/dist/components/effects/HologramEffect.d.ts.map +1 -0
- package/dist/components/effects/HologramEffect.js +143 -0
- package/dist/components/effects/IceCrystalsEffect.d.ts +10 -0
- package/dist/components/effects/IceCrystalsEffect.d.ts.map +1 -0
- package/dist/components/effects/IceCrystalsEffect.js +190 -0
- package/dist/components/effects/LightningEffect.d.ts +10 -0
- package/dist/components/effects/LightningEffect.d.ts.map +1 -0
- package/dist/components/effects/LightningEffect.js +240 -0
- package/dist/components/effects/MoleculesEffect.d.ts +10 -0
- package/dist/components/effects/MoleculesEffect.d.ts.map +1 -0
- package/dist/components/effects/MoleculesEffect.js +179 -0
- package/dist/components/effects/NeuralNetworkEffect.d.ts +10 -0
- package/dist/components/effects/NeuralNetworkEffect.d.ts.map +1 -0
- package/dist/components/effects/NeuralNetworkEffect.js +188 -0
- package/dist/components/effects/OrbEffect.d.ts +10 -0
- package/dist/components/effects/OrbEffect.d.ts.map +1 -0
- package/dist/components/effects/OrbEffect.js +291 -0
- package/dist/components/effects/PortalEffect.d.ts +10 -0
- package/dist/components/effects/PortalEffect.d.ts.map +1 -0
- package/dist/components/effects/PortalEffect.js +191 -0
- package/dist/components/effects/ShockwaveEffect.d.ts +10 -0
- package/dist/components/effects/ShockwaveEffect.d.ts.map +1 -0
- package/dist/components/effects/ShockwaveEffect.js +159 -0
- package/dist/components/effects/SmokePlumeEffect.d.ts +10 -0
- package/dist/components/effects/SmokePlumeEffect.d.ts.map +1 -0
- package/dist/components/effects/SmokePlumeEffect.js +141 -0
- package/dist/components/effects/SmokeRingEffect.d.ts +10 -0
- package/dist/components/effects/SmokeRingEffect.d.ts.map +1 -0
- package/dist/components/effects/SmokeRingEffect.js +158 -0
- package/dist/components/effects/VolumetricFogEffect.d.ts +10 -0
- package/dist/components/effects/VolumetricFogEffect.d.ts.map +1 -0
- package/dist/components/effects/VolumetricFogEffect.js +111 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAnimationEvents.d.ts +10 -0
- package/dist/hooks/useAnimationEvents.d.ts.map +1 -0
- package/dist/hooks/useAnimationEvents.js +28 -0
- package/dist/hooks/useCameraAnimation.d.ts +35 -0
- package/dist/hooks/useCameraAnimation.d.ts.map +1 -0
- package/dist/hooks/useCameraAnimation.js +268 -0
- package/dist/hooks/useContinuousEffects.d.ts +15 -0
- package/dist/hooks/useContinuousEffects.d.ts.map +1 -0
- package/dist/hooks/useContinuousEffects.js +173 -0
- package/dist/hooks/useCubeCamera.d.ts +19 -0
- package/dist/hooks/useCubeCamera.d.ts.map +1 -0
- package/dist/hooks/useCubeCamera.js +73 -0
- package/dist/hooks/useEnvironmentEffects.d.ts +12 -0
- package/dist/hooks/useEnvironmentEffects.d.ts.map +1 -0
- package/dist/hooks/useEnvironmentEffects.js +22 -0
- package/dist/hooks/useFrameEffects.d.ts +6 -0
- package/dist/hooks/useFrameEffects.d.ts.map +1 -0
- package/dist/hooks/useFrameEffects.js +19 -0
- package/dist/hooks/useInteractionEffects.d.ts +11 -0
- package/dist/hooks/useInteractionEffects.d.ts.map +1 -0
- package/dist/hooks/useInteractionEffects.js +35 -0
- package/dist/hooks/useKey.d.ts +26 -0
- package/dist/hooks/useKey.d.ts.map +1 -0
- package/dist/hooks/useKey.js +73 -0
- package/dist/hooks/useLightHandlers.d.ts +14 -0
- package/dist/hooks/useLightHandlers.d.ts.map +1 -0
- package/dist/hooks/useLightHandlers.js +116 -0
- package/dist/hooks/useMaterialApplication.d.ts +9 -0
- package/dist/hooks/useMaterialApplication.d.ts.map +1 -0
- package/dist/hooks/useMaterialApplication.js +113 -0
- package/dist/hooks/useMaterialOptions.d.ts +13 -0
- package/dist/hooks/useMaterialOptions.d.ts.map +1 -0
- package/dist/hooks/useMaterialOptions.js +110 -0
- package/dist/hooks/useMaterialUniforms.d.ts +18 -0
- package/dist/hooks/useMaterialUniforms.d.ts.map +1 -0
- package/dist/hooks/useMaterialUniforms.js +96 -0
- package/dist/hooks/useMeshController.d.ts +3 -0
- package/dist/hooks/useMeshController.d.ts.map +1 -0
- package/dist/hooks/useMeshController.js +152 -0
- package/dist/hooks/useMouseHandlers.d.ts +8 -0
- package/dist/hooks/useMouseHandlers.d.ts.map +1 -0
- package/dist/hooks/useMouseHandlers.js +47 -0
- package/dist/hooks/useObjectAnimation.d.ts +13 -0
- package/dist/hooks/useObjectAnimation.d.ts.map +1 -0
- package/dist/hooks/useObjectAnimation.js +11 -0
- package/dist/hooks/useObjectEdges.d.ts +4 -0
- package/dist/hooks/useObjectEdges.d.ts.map +1 -0
- package/dist/hooks/useObjectEdges.js +199 -0
- package/dist/hooks/useOrbitControls.d.ts +7 -0
- package/dist/hooks/useOrbitControls.d.ts.map +1 -0
- package/dist/hooks/useOrbitControls.js +9 -0
- package/dist/hooks/useParticlePositions.d.ts +19 -0
- package/dist/hooks/useParticlePositions.d.ts.map +1 -0
- package/dist/hooks/useParticlePositions.js +56 -0
- package/dist/hooks/useParticlesColors.d.ts +14 -0
- package/dist/hooks/useParticlesColors.d.ts.map +1 -0
- package/dist/hooks/useParticlesColors.js +27 -0
- package/dist/hooks/useParticlesTextures.d.ts +10 -0
- package/dist/hooks/useParticlesTextures.d.ts.map +1 -0
- package/dist/hooks/useParticlesTextures.js +23 -0
- package/dist/hooks/usePathAnimation.d.ts +26 -0
- package/dist/hooks/usePathAnimation.d.ts.map +1 -0
- package/dist/hooks/usePathAnimation.js +120 -0
- package/dist/hooks/useSkyAnimation.d.ts +14 -0
- package/dist/hooks/useSkyAnimation.d.ts.map +1 -0
- package/dist/hooks/useSkyAnimation.js +46 -0
- package/dist/hooks/useSkySystem.d.ts +26 -0
- package/dist/hooks/useSkySystem.d.ts.map +1 -0
- package/dist/hooks/useSkySystem.js +57 -0
- package/dist/hooks/useSkyUniforms.d.ts +18 -0
- package/dist/hooks/useSkyUniforms.d.ts.map +1 -0
- package/dist/hooks/useSkyUniforms.js +59 -0
- package/dist/hooks/useTransformControls.d.ts +6 -0
- package/dist/hooks/useTransformControls.d.ts.map +1 -0
- package/dist/hooks/useTransformControls.js +111 -0
- package/dist/hooks/useWaterEnvironment.d.ts +5 -0
- package/dist/hooks/useWaterEnvironment.d.ts.map +1 -0
- package/dist/hooks/useWaterEnvironment.js +27 -0
- package/dist/hooks/useWaterReflections.d.ts +17 -0
- package/dist/hooks/useWaterReflections.d.ts.map +1 -0
- package/dist/hooks/useWaterReflections.js +77 -0
- package/dist/index.d.ts +140 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/services/AnimationsManager.d.ts +33 -0
- package/dist/services/AnimationsManager.d.ts.map +1 -0
- package/dist/services/AnimationsManager.js +58 -0
- package/dist/services/FontManager.d.ts +32 -0
- package/dist/services/FontManager.d.ts.map +1 -0
- package/dist/services/FontManager.js +76 -0
- package/dist/services/TexturesManager.d.ts +17 -0
- package/dist/services/TexturesManager.d.ts.map +1 -0
- package/dist/services/TexturesManager.js +48 -0
- package/dist/shaders/RainMaterial.d.ts +34 -0
- package/dist/shaders/RainMaterial.d.ts.map +1 -0
- package/dist/shaders/RainMaterial.js +56 -0
- package/dist/shaders/ShaderEffectsMaterial.d.ts +279 -0
- package/dist/shaders/ShaderEffectsMaterial.d.ts.map +1 -0
- package/dist/shaders/ShaderEffectsMaterial.js +257 -0
- package/dist/shaders/ShootingStarMaterial.d.ts +14 -0
- package/dist/shaders/ShootingStarMaterial.d.ts.map +1 -0
- package/dist/shaders/ShootingStarMaterial.js +33 -0
- package/dist/shaders/SkyboxMaterial.d.ts +38 -0
- package/dist/shaders/SkyboxMaterial.d.ts.map +1 -0
- package/dist/shaders/SkyboxMaterial.js +57 -0
- package/dist/shaders/effects/EffectsVertexFunctions.glsl.d.ts +2 -0
- package/dist/shaders/effects/EffectsVertexFunctions.glsl.d.ts.map +1 -0
- package/dist/shaders/effects/EffectsVertexFunctions.glsl.js +167 -0
- package/dist/utils/CameraSingleton.d.ts +35 -0
- package/dist/utils/CameraSingleton.d.ts.map +1 -0
- package/dist/utils/CameraSingleton.js +178 -0
- package/dist/utils/anchorUtils.d.ts +10 -0
- package/dist/utils/anchorUtils.d.ts.map +1 -0
- package/dist/utils/anchorUtils.js +13 -0
- package/dist/utils/frameAnimations.d.ts +49 -0
- package/dist/utils/frameAnimations.d.ts.map +1 -0
- package/dist/utils/frameAnimations.js +213 -0
- package/dist/utils/handleGenerativeEffectsAnimations.d.ts +5 -0
- package/dist/utils/handleGenerativeEffectsAnimations.d.ts.map +1 -0
- package/dist/utils/handleGenerativeEffectsAnimations.js +268 -0
- package/dist/utils/hasHoverAnimation.d.ts +3 -0
- package/dist/utils/hasHoverAnimation.d.ts.map +1 -0
- package/dist/utils/hasHoverAnimation.js +15 -0
- package/dist/utils/particleAnimations.d.ts +3 -0
- package/dist/utils/particleAnimations.d.ts.map +1 -0
- package/dist/utils/particleAnimations.js +17 -0
- package/dist/utils/sceneQuery.d.ts +9 -0
- package/dist/utils/sceneQuery.d.ts.map +1 -0
- package/dist/utils/sceneQuery.js +22 -0
- package/dist/utils/shaderUtils.d.ts +6 -0
- package/dist/utils/shaderUtils.d.ts.map +1 -0
- package/dist/utils/shaderUtils.js +145 -0
- package/dist/utils/textEffects.d.ts +31 -0
- package/dist/utils/textEffects.d.ts.map +1 -0
- package/dist/utils/textEffects.js +61 -0
- package/dist/utils/utils3d.d.ts +7 -0
- package/dist/utils/utils3d.d.ts.map +1 -0
- package/dist/utils/utils3d.js +34 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FireEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/FireEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI3E,UAAU,eAAe;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AA2GD,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAwGzC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useRef } from 'react';
|
|
3
|
+
import { useFrame } from '@react-three/fiber';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { applyGenerativeAnimations } from '../../utils/handleGenerativeEffectsAnimations';
|
|
6
|
+
// ── Flame particle vertex shader ──────────────────────────────────────────────
|
|
7
|
+
const flameVert = /* glsl */ `
|
|
8
|
+
attribute float aT; // lifetime position 0..1 (base→tip)
|
|
9
|
+
attribute vec2 aBase; // (x, z) spawn position within disc
|
|
10
|
+
attribute float aSpeed; // per-particle rise speed variation
|
|
11
|
+
attribute float aPhase; // noise phase offset
|
|
12
|
+
|
|
13
|
+
uniform float u_time;
|
|
14
|
+
uniform float u_speed;
|
|
15
|
+
uniform float uHeight;
|
|
16
|
+
uniform float uSpread;
|
|
17
|
+
uniform float uSize;
|
|
18
|
+
|
|
19
|
+
varying float vT;
|
|
20
|
+
|
|
21
|
+
void main() {
|
|
22
|
+
// Loop t upward continuously
|
|
23
|
+
float t = fract(aT + u_time * u_speed * aSpeed);
|
|
24
|
+
vT = t;
|
|
25
|
+
|
|
26
|
+
// Rise in Y, shrink spread toward tip
|
|
27
|
+
float spreadScale = 1.0 - t * 0.85;
|
|
28
|
+
float x = aBase.x * spreadScale * uSpread;
|
|
29
|
+
float z = aBase.y * spreadScale * uSpread;
|
|
30
|
+
|
|
31
|
+
// Turbulent horizontal sway (FBM-like with 2 sines)
|
|
32
|
+
float sway1 = sin(t * 3.8 + u_time * 1.6 + aPhase) * 0.18 * uSpread * (1.0 - t);
|
|
33
|
+
float sway2 = sin(t * 6.2 - u_time * 2.3 + aPhase * 1.7) * 0.09 * uSpread * (1.0 - t);
|
|
34
|
+
x += sway1 + sway2;
|
|
35
|
+
z += cos(t * 4.1 + u_time * 1.9 + aPhase * 0.8) * 0.12 * uSpread * (1.0 - t);
|
|
36
|
+
|
|
37
|
+
float y = t * uHeight - uHeight * 0.5;
|
|
38
|
+
|
|
39
|
+
// Shrink point size toward tip
|
|
40
|
+
gl_PointSize = uSize * (1.0 - t * 0.8) * (200.0 / -(modelViewMatrix * vec4(x, y, z, 1.0)).z);
|
|
41
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(x, y, z, 1.0);
|
|
42
|
+
}
|
|
43
|
+
`;
|
|
44
|
+
const flameFrag = /* glsl */ `
|
|
45
|
+
uniform vec3 uFlameColor;
|
|
46
|
+
uniform vec3 uTipColor;
|
|
47
|
+
uniform float uOpacity;
|
|
48
|
+
varying float vT;
|
|
49
|
+
|
|
50
|
+
void main() {
|
|
51
|
+
vec2 c = gl_PointCoord - 0.5;
|
|
52
|
+
float d = length(c);
|
|
53
|
+
if (d > 0.5) discard;
|
|
54
|
+
float g = exp(-d * d * 5.5);
|
|
55
|
+
|
|
56
|
+
// Color: flameColor at base → mid orange → tipColor near top → transparent
|
|
57
|
+
float t2 = vT * vT;
|
|
58
|
+
vec3 midCol = mix(uFlameColor, vec3(1.0, 0.65, 0.1), 0.5);
|
|
59
|
+
vec3 col = t2 < 0.4
|
|
60
|
+
? mix(uFlameColor, midCol, t2 / 0.4)
|
|
61
|
+
: mix(midCol, uTipColor, (t2 - 0.4) / 0.6);
|
|
62
|
+
|
|
63
|
+
// Fade out at tip and base
|
|
64
|
+
float alpha = g * uOpacity * smoothstep(0.0, 0.12, vT) * (1.0 - smoothstep(0.75, 1.0, vT));
|
|
65
|
+
if (alpha < 0.01) discard;
|
|
66
|
+
gl_FragColor = vec4(col, alpha);
|
|
67
|
+
}
|
|
68
|
+
`;
|
|
69
|
+
// ── Ember vertex shader ───────────────────────────────────────────────────────
|
|
70
|
+
const emberVert = /* glsl */ `
|
|
71
|
+
attribute float aT;
|
|
72
|
+
attribute vec3 aDrift; // (vx, vy, vz) drift velocity
|
|
73
|
+
attribute float aPhase;
|
|
74
|
+
|
|
75
|
+
uniform float u_time;
|
|
76
|
+
uniform float u_speed;
|
|
77
|
+
uniform float uHeight;
|
|
78
|
+
|
|
79
|
+
varying float vT;
|
|
80
|
+
|
|
81
|
+
void main() {
|
|
82
|
+
float t = fract(aT + u_time * u_speed * 0.4);
|
|
83
|
+
vT = t;
|
|
84
|
+
|
|
85
|
+
float x = aDrift.x * t * 1.8 + sin(t * 5.0 + aPhase) * 0.15;
|
|
86
|
+
float y = t * uHeight * 1.3 - uHeight * 0.4;
|
|
87
|
+
float z = aDrift.z * t * 1.8 + cos(t * 4.0 + aPhase) * 0.12;
|
|
88
|
+
|
|
89
|
+
gl_PointSize = (1.0 - t) * 5.0 * (200.0 / -(modelViewMatrix * vec4(x, y, z, 1.0)).z);
|
|
90
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(x, y, z, 1.0);
|
|
91
|
+
}
|
|
92
|
+
`;
|
|
93
|
+
const emberFrag = /* glsl */ `
|
|
94
|
+
uniform float uOpacity;
|
|
95
|
+
varying float vT;
|
|
96
|
+
|
|
97
|
+
void main() {
|
|
98
|
+
vec2 c = gl_PointCoord - 0.5;
|
|
99
|
+
if (length(c) > 0.5) discard;
|
|
100
|
+
float g = exp(-dot(c, c) * 7.0);
|
|
101
|
+
float alpha = g * uOpacity * (1.0 - vT) * smoothstep(0.0, 0.08, vT);
|
|
102
|
+
if (alpha < 0.01) discard;
|
|
103
|
+
// Orange-white ember color
|
|
104
|
+
gl_FragColor = vec4(1.0, 0.65 + (1.0 - vT) * 0.35, 0.2 * (1.0 - vT), alpha);
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
107
|
+
const FireEffect = ({ boundingRadius, config, animations }) => {
|
|
108
|
+
const { particleCount, height, spread, flameColor, tipColor, opacity, speed, intensity } = config;
|
|
109
|
+
const startValuesCacheRef = useRef({});
|
|
110
|
+
const h = boundingRadius * height;
|
|
111
|
+
const s = boundingRadius * spread;
|
|
112
|
+
const { flameGeo, flameMat, emberGeo, emberMat } = useMemo(() => {
|
|
113
|
+
const N = Math.max(50, particleCount);
|
|
114
|
+
const E = Math.floor(N * 0.2);
|
|
115
|
+
// ── Flame geometry ─────────────────────────────────────────────────────
|
|
116
|
+
const aT = new Float32Array(N);
|
|
117
|
+
const aBase = new Float32Array(N * 2);
|
|
118
|
+
const aSpeed = new Float32Array(N);
|
|
119
|
+
const aPhase = new Float32Array(N);
|
|
120
|
+
for (let i = 0; i < N; i++) {
|
|
121
|
+
aT[i] = i / N;
|
|
122
|
+
const r = Math.sqrt(Math.random()) * s;
|
|
123
|
+
const a = Math.random() * Math.PI * 2;
|
|
124
|
+
aBase[i * 2] = Math.cos(a) * r;
|
|
125
|
+
aBase[i * 2 + 1] = Math.sin(a) * r;
|
|
126
|
+
aSpeed[i] = 0.6 + Math.random() * 0.8;
|
|
127
|
+
aPhase[i] = Math.random() * Math.PI * 2;
|
|
128
|
+
}
|
|
129
|
+
const fGeo = new THREE.BufferGeometry();
|
|
130
|
+
fGeo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(N * 3), 3));
|
|
131
|
+
fGeo.setAttribute('aT', new THREE.BufferAttribute(aT, 1));
|
|
132
|
+
fGeo.setAttribute('aBase', new THREE.BufferAttribute(aBase, 2));
|
|
133
|
+
fGeo.setAttribute('aSpeed', new THREE.BufferAttribute(aSpeed, 1));
|
|
134
|
+
fGeo.setAttribute('aPhase', new THREE.BufferAttribute(aPhase, 1));
|
|
135
|
+
const fc = new THREE.Color(flameColor);
|
|
136
|
+
const tc = new THREE.Color(tipColor);
|
|
137
|
+
const fMat = new THREE.ShaderMaterial({
|
|
138
|
+
vertexShader: flameVert,
|
|
139
|
+
fragmentShader: flameFrag,
|
|
140
|
+
uniforms: {
|
|
141
|
+
u_time: { value: 0 },
|
|
142
|
+
u_speed: { value: speed },
|
|
143
|
+
uHeight: { value: h },
|
|
144
|
+
uSpread: { value: s },
|
|
145
|
+
uSize: { value: 20 * intensity },
|
|
146
|
+
uFlameColor: { value: new THREE.Vector3(fc.r, fc.g, fc.b) },
|
|
147
|
+
uTipColor: { value: new THREE.Vector3(tc.r, tc.g, tc.b) },
|
|
148
|
+
uOpacity: { value: opacity },
|
|
149
|
+
},
|
|
150
|
+
transparent: true, depthWrite: false, blending: THREE.AdditiveBlending,
|
|
151
|
+
});
|
|
152
|
+
// ── Ember geometry ─────────────────────────────────────────────────────
|
|
153
|
+
const eT = new Float32Array(E);
|
|
154
|
+
const eDrift = new Float32Array(E * 3);
|
|
155
|
+
const ePhase = new Float32Array(E);
|
|
156
|
+
for (let i = 0; i < E; i++) {
|
|
157
|
+
eT[i] = i / E;
|
|
158
|
+
const a = Math.random() * Math.PI * 2;
|
|
159
|
+
const r = (0.2 + Math.random() * 0.8) * s;
|
|
160
|
+
eDrift[i * 3] = Math.cos(a) * r;
|
|
161
|
+
eDrift[i * 3 + 1] = 0;
|
|
162
|
+
eDrift[i * 3 + 2] = Math.sin(a) * r;
|
|
163
|
+
ePhase[i] = Math.random() * Math.PI * 2;
|
|
164
|
+
}
|
|
165
|
+
const eGeo = new THREE.BufferGeometry();
|
|
166
|
+
eGeo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(E * 3), 3));
|
|
167
|
+
eGeo.setAttribute('aT', new THREE.BufferAttribute(eT, 1));
|
|
168
|
+
eGeo.setAttribute('aDrift', new THREE.BufferAttribute(eDrift, 3));
|
|
169
|
+
eGeo.setAttribute('aPhase', new THREE.BufferAttribute(ePhase, 1));
|
|
170
|
+
const eMat = new THREE.ShaderMaterial({
|
|
171
|
+
vertexShader: emberVert,
|
|
172
|
+
fragmentShader: emberFrag,
|
|
173
|
+
uniforms: {
|
|
174
|
+
u_time: { value: 0 },
|
|
175
|
+
u_speed: { value: speed },
|
|
176
|
+
uHeight: { value: h },
|
|
177
|
+
uOpacity: { value: opacity * 0.7 },
|
|
178
|
+
},
|
|
179
|
+
transparent: true, depthWrite: false, blending: THREE.AdditiveBlending,
|
|
180
|
+
});
|
|
181
|
+
return { flameGeo: fGeo, flameMat: fMat, emberGeo: eGeo, emberMat: eMat };
|
|
182
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
183
|
+
}, [particleCount, h, s, flameColor, tipColor, opacity, speed, intensity]);
|
|
184
|
+
useFrame((state) => {
|
|
185
|
+
const t = state.clock.getElapsedTime();
|
|
186
|
+
flameMat.uniforms.u_time.value = t;
|
|
187
|
+
emberMat.uniforms.u_time.value = t;
|
|
188
|
+
if (animations?.length) {
|
|
189
|
+
applyGenerativeAnimations([flameMat, emberMat], animations, startValuesCacheRef.current, Date.now(), false);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
return (_jsxs("group", { position: [0, boundingRadius * 0.1, 0], children: [_jsx("points", { geometry: flameGeo, material: flameMat }), _jsx("points", { geometry: emberGeo, material: emberMat })] }));
|
|
193
|
+
};
|
|
194
|
+
export default FireEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ForcefieldConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface ForcefieldEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: ForcefieldConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const ForcefieldEffect: React.FC<ForcefieldEffectProps>;
|
|
9
|
+
export default ForcefieldEffect;
|
|
10
|
+
//# sourceMappingURL=ForcefieldEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ForcefieldEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/ForcefieldEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAIjF,UAAU,qBAAqB;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AA8ED,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAgErD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useMemo } from 'react';
|
|
3
|
+
import { useFrame } from '@react-three/fiber';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { applyGenerativeAnimations } from '../../utils/handleGenerativeEffectsAnimations';
|
|
6
|
+
const shieldVert = /* glsl */ `
|
|
7
|
+
varying vec3 vNormal;
|
|
8
|
+
varying vec3 vWorldPos;
|
|
9
|
+
varying vec2 vUv;
|
|
10
|
+
void main() {
|
|
11
|
+
vNormal = normalize(normalMatrix * normal);
|
|
12
|
+
vWorldPos = (modelMatrix * vec4(position, 1.0)).xyz;
|
|
13
|
+
vUv = uv;
|
|
14
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
const shieldFrag = /* glsl */ `
|
|
18
|
+
uniform float u_time;
|
|
19
|
+
uniform float uHexSize;
|
|
20
|
+
uniform vec3 uShieldColor;
|
|
21
|
+
uniform vec3 uRimColor;
|
|
22
|
+
uniform float uOpacity;
|
|
23
|
+
uniform float uIntensity;
|
|
24
|
+
|
|
25
|
+
// Ripple slots (3 simultaneous)
|
|
26
|
+
uniform vec3 uHitPos[3];
|
|
27
|
+
uniform float uHitTime[3];
|
|
28
|
+
|
|
29
|
+
varying vec3 vNormal;
|
|
30
|
+
varying vec3 vWorldPos;
|
|
31
|
+
varying vec2 vUv;
|
|
32
|
+
|
|
33
|
+
// ── Analytical hex grid in 3D via world-space spherical UV ───────────────
|
|
34
|
+
vec2 hexCoord(vec2 p) {
|
|
35
|
+
const float SQRT3 = 1.7320508;
|
|
36
|
+
vec2 r = vec2(1.0, SQRT3);
|
|
37
|
+
vec2 h = r * 0.5;
|
|
38
|
+
vec2 a = mod(p, r) - h;
|
|
39
|
+
vec2 b = mod(p + h, r) - h;
|
|
40
|
+
return dot(a, a) < dot(b, b) ? a : b;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
float hexEdge(vec2 p, float size) {
|
|
44
|
+
vec2 hc = hexCoord(p / size);
|
|
45
|
+
float d = length(hc);
|
|
46
|
+
// Edge = thin ring at cell boundary
|
|
47
|
+
return 1.0 - smoothstep(size * 0.38, size * 0.46, d);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
void main() {
|
|
51
|
+
// Spherical UV from world normal
|
|
52
|
+
vec3 n = normalize(vNormal);
|
|
53
|
+
float phi = atan(n.z, n.x);
|
|
54
|
+
float theta = acos(clamp(n.y, -1.0, 1.0));
|
|
55
|
+
vec2 suv = vec2(phi / 6.28318, theta / 3.14159);
|
|
56
|
+
|
|
57
|
+
float edge = hexEdge(suv, uHexSize);
|
|
58
|
+
|
|
59
|
+
// Fresnel rim
|
|
60
|
+
vec3 viewDir = normalize(cameraPosition - vWorldPos);
|
|
61
|
+
float fresnel = pow(1.0 - abs(dot(n, viewDir)), 2.5);
|
|
62
|
+
|
|
63
|
+
// Ripple contributions
|
|
64
|
+
float ripple = 0.0;
|
|
65
|
+
for (int k = 0; k < 3; k++) {
|
|
66
|
+
float age = u_time - uHitTime[k];
|
|
67
|
+
if (age < 0.0 || age > 2.0) continue;
|
|
68
|
+
float dist = distance(vWorldPos, uHitPos[k]);
|
|
69
|
+
float wave = sin(dist * 14.0 - age * 9.0) * exp(-dist * 2.5) * exp(-age * 1.4);
|
|
70
|
+
ripple += wave * 0.7;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
vec3 col = mix(uShieldColor, uRimColor, fresnel * 0.6 + edge * 0.4);
|
|
74
|
+
float alpha = (edge * 0.55 + fresnel * 0.3 + max(0.0, ripple) * 0.45 + 0.04)
|
|
75
|
+
* uOpacity * uIntensity;
|
|
76
|
+
if (alpha < 0.005) discard;
|
|
77
|
+
gl_FragColor = vec4(col + uRimColor * ripple * 0.3, alpha);
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
const ForcefieldEffect = ({ boundingRadius, config, animations }) => {
|
|
81
|
+
const { hexSize, rippleEnabled, shieldColor, rimColor, opacity, speed, intensity } = config;
|
|
82
|
+
const startValuesCacheRef = useRef({});
|
|
83
|
+
const meshRef = useRef(null);
|
|
84
|
+
const hitSlot = useRef(0);
|
|
85
|
+
const nextHit = useRef(0);
|
|
86
|
+
const mat = useMemo(() => {
|
|
87
|
+
const sc = new THREE.Color(shieldColor);
|
|
88
|
+
const rc = new THREE.Color(rimColor);
|
|
89
|
+
return new THREE.ShaderMaterial({
|
|
90
|
+
vertexShader: shieldVert,
|
|
91
|
+
fragmentShader: shieldFrag,
|
|
92
|
+
uniforms: {
|
|
93
|
+
u_time: { value: 0 },
|
|
94
|
+
uHexSize: { value: hexSize },
|
|
95
|
+
uShieldColor: { value: new THREE.Vector3(sc.r, sc.g, sc.b) },
|
|
96
|
+
uRimColor: { value: new THREE.Vector3(rc.r, rc.g, rc.b) },
|
|
97
|
+
uOpacity: { value: opacity },
|
|
98
|
+
uIntensity: { value: intensity },
|
|
99
|
+
uHitPos: { value: [new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3()] },
|
|
100
|
+
uHitTime: { value: [-99, -99, -99] },
|
|
101
|
+
},
|
|
102
|
+
transparent: true,
|
|
103
|
+
depthWrite: false,
|
|
104
|
+
side: THREE.FrontSide,
|
|
105
|
+
blending: THREE.AdditiveBlending,
|
|
106
|
+
});
|
|
107
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
108
|
+
}, [hexSize, shieldColor, rimColor, opacity, intensity]);
|
|
109
|
+
useFrame((state, delta) => {
|
|
110
|
+
const t = state.clock.getElapsedTime();
|
|
111
|
+
mat.uniforms.u_time.value = t;
|
|
112
|
+
if (rippleEnabled) {
|
|
113
|
+
nextHit.current -= delta;
|
|
114
|
+
if (nextHit.current <= 0) {
|
|
115
|
+
nextHit.current = 1.4 / speed + Math.random() * 0.8;
|
|
116
|
+
// Random point on sphere surface
|
|
117
|
+
const phi = Math.random() * Math.PI * 2;
|
|
118
|
+
const theta = Math.acos(2 * Math.random() - 1);
|
|
119
|
+
const r = boundingRadius * 1.15;
|
|
120
|
+
const slot = hitSlot.current % 3;
|
|
121
|
+
mat.uniforms.uHitPos.value[slot].set(Math.sin(theta) * Math.cos(phi) * r, Math.cos(theta) * r, Math.sin(theta) * Math.sin(phi) * r);
|
|
122
|
+
mat.uniforms.uHitTime.value[slot] = t;
|
|
123
|
+
hitSlot.current++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (animations?.length) {
|
|
127
|
+
applyGenerativeAnimations([mat], animations, startValuesCacheRef.current, Date.now(), false);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return (_jsx("mesh", { ref: meshRef, material: mat, children: _jsx("sphereGeometry", { args: [boundingRadius * 1.15, 64, 64] }) }));
|
|
131
|
+
};
|
|
132
|
+
export default ForcefieldEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { HologramConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface HologramEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: HologramConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const HologramEffect: React.FC<HologramEffectProps>;
|
|
9
|
+
export default HologramEffect;
|
|
10
|
+
//# sourceMappingURL=HologramEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HologramEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/HologramEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI/E,UAAU,mBAAmB;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAsFD,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA4EjD,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useMemo } from 'react';
|
|
3
|
+
import { useFrame } from '@react-three/fiber';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { applyGenerativeAnimations } from '../../utils/handleGenerativeEffectsAnimations';
|
|
6
|
+
// Single rich shader handles scanlines, grid, RGB aberration, interference fringes, flicker
|
|
7
|
+
const vertexShader = /* glsl */ `
|
|
8
|
+
varying vec2 vUv;
|
|
9
|
+
void main() {
|
|
10
|
+
vUv = uv;
|
|
11
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
12
|
+
}
|
|
13
|
+
`;
|
|
14
|
+
const fragmentShader = /* glsl */ `
|
|
15
|
+
uniform float u_time;
|
|
16
|
+
uniform float uScanSpeed;
|
|
17
|
+
uniform float uScanlineCount;
|
|
18
|
+
uniform vec3 uColor;
|
|
19
|
+
uniform float uOpacity;
|
|
20
|
+
uniform float uFlickerAmount;
|
|
21
|
+
uniform float uGridEnabled;
|
|
22
|
+
uniform float uGlitchOffset;
|
|
23
|
+
uniform float uAberration; // chromatic aberration intensity
|
|
24
|
+
uniform float uPlaneY; // -1..1 normalized plane position
|
|
25
|
+
uniform float uIntensity;
|
|
26
|
+
|
|
27
|
+
varying vec2 vUv;
|
|
28
|
+
|
|
29
|
+
float hash(float n){ return fract(sin(n) * 43758.5453); }
|
|
30
|
+
float hash2(vec2 p){ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }
|
|
31
|
+
|
|
32
|
+
// Scanline sample at a specific UV (shared logic, called 3× for RGB split)
|
|
33
|
+
float scanSample(vec2 uv, float t) {
|
|
34
|
+
return step(0.45, fract(uv.y * uScanlineCount + t * uScanSpeed));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void main() {
|
|
38
|
+
vec2 uv = vUv;
|
|
39
|
+
float t = u_time;
|
|
40
|
+
|
|
41
|
+
// ── Glitch: rectangular block shift ────────────────────────────────────
|
|
42
|
+
float blockY = floor(uv.y * 8.0);
|
|
43
|
+
float glitchT = hash(blockY + floor(t * 12.0));
|
|
44
|
+
float doGlitch= step(0.94, glitchT);
|
|
45
|
+
uv.x += doGlitch * (hash(blockY * 3.1 + t * 4.0) - 0.5) * uGlitchOffset;
|
|
46
|
+
uv.x = fract(uv.x);
|
|
47
|
+
|
|
48
|
+
// ── RGB chromatic aberration ───────────────────────────────────────────
|
|
49
|
+
float aberr = uAberration * (1.0 + 0.4 * sin(t * 3.0));
|
|
50
|
+
float r_val = scanSample(uv + vec2( aberr, 0.0), t);
|
|
51
|
+
float g_val = scanSample(uv, t);
|
|
52
|
+
float b_val = scanSample(uv - vec2( aberr, 0.0), t);
|
|
53
|
+
vec3 scanRGB = vec3(r_val, g_val, b_val);
|
|
54
|
+
|
|
55
|
+
// ── Interference fringe pattern ────────────────────────────────────────
|
|
56
|
+
// Moiré-like bands that drift across the plane
|
|
57
|
+
float fringe = sin(uv.y * 60.0 + t * 4.0) * sin(uv.x * 40.0 - t * 2.0) * 0.5 + 0.5;
|
|
58
|
+
fringe = pow(fringe, 3.0) * 0.35;
|
|
59
|
+
|
|
60
|
+
// ── Grid overlay ───────────────────────────────────────────────────────
|
|
61
|
+
float grid = 0.0;
|
|
62
|
+
if (uGridEnabled > 0.5) {
|
|
63
|
+
float gx = step(0.93, fract(uv.x * 14.0));
|
|
64
|
+
float gy = step(0.93, fract(uv.y * 14.0));
|
|
65
|
+
grid = max(gx, gy) * 0.5;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ── Assembly animation: plane lights up from bottom ────────────────────
|
|
69
|
+
// uPlaneY goes -1 (bottom) to +1 (top); assemble = time-based sweep
|
|
70
|
+
float assembleT = mod(t * 0.3, 2.5);
|
|
71
|
+
float assembled = smoothstep(assembleT - 0.4, assembleT, uPlaneY * 0.5 + 0.5);
|
|
72
|
+
// Once fully assembled, stay on; only flicker during initial assembly
|
|
73
|
+
float stableT = smoothstep(0.0, 1.2, assembleT);
|
|
74
|
+
float assembleA = mix(assembled, 1.0, stableT);
|
|
75
|
+
|
|
76
|
+
// ── Flicker ────────────────────────────────────────────────────────────
|
|
77
|
+
float flicker = 1.0 - uFlickerAmount * step(0.93, hash(floor(t * 18.0)));
|
|
78
|
+
|
|
79
|
+
// ── Composite ─────────────────────────────────────────────────────────
|
|
80
|
+
vec3 hologramColor = uColor * scanRGB;
|
|
81
|
+
float scanBright = (r_val + g_val + b_val) / 3.0;
|
|
82
|
+
float intensity = (scanBright * 0.65 + fringe + grid) * flicker * assembleA * uIntensity;
|
|
83
|
+
if (intensity < 0.015) discard;
|
|
84
|
+
|
|
85
|
+
gl_FragColor = vec4(hologramColor + uColor * fringe, intensity * uOpacity);
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
const HologramEffect = ({ boundingRadius, config, animations }) => {
|
|
89
|
+
const { scanlineCount, scanSpeed, scanColor, gridEnabled, flickerAmount, glitchEnabled, opacity, speed, intensity } = config;
|
|
90
|
+
const startValuesCacheRef = useRef({});
|
|
91
|
+
const meshRefs = useRef([]);
|
|
92
|
+
const colorVec = useMemo(() => {
|
|
93
|
+
const c = new THREE.Color(scanColor);
|
|
94
|
+
return new THREE.Vector3(c.r, c.g, c.b);
|
|
95
|
+
}, [scanColor]);
|
|
96
|
+
// One material per plane — each has its own uPlaneY so the assembly sweeps correctly
|
|
97
|
+
const materials = useMemo(() => Array.from({ length: scanlineCount }, (_, i) => {
|
|
98
|
+
const planeY = (i / Math.max(scanlineCount - 1, 1)) * 2 - 1; // -1..+1
|
|
99
|
+
return new THREE.ShaderMaterial({
|
|
100
|
+
vertexShader,
|
|
101
|
+
fragmentShader,
|
|
102
|
+
uniforms: {
|
|
103
|
+
u_time: { value: 0 },
|
|
104
|
+
uScanSpeed: { value: scanSpeed * speed },
|
|
105
|
+
uScanlineCount: { value: 5.0 + i * 0.3 }, // slight variation per plane
|
|
106
|
+
uColor: { value: colorVec },
|
|
107
|
+
uOpacity: { value: opacity * intensity },
|
|
108
|
+
uFlickerAmount: { value: flickerAmount },
|
|
109
|
+
uGridEnabled: { value: gridEnabled ? 1.0 : 0.0 },
|
|
110
|
+
uGlitchOffset: { value: 0 },
|
|
111
|
+
uAberration: { value: 0.012 },
|
|
112
|
+
uPlaneY: { value: planeY },
|
|
113
|
+
uIntensity: { value: intensity },
|
|
114
|
+
},
|
|
115
|
+
transparent: true,
|
|
116
|
+
depthWrite: false,
|
|
117
|
+
blending: THREE.AdditiveBlending,
|
|
118
|
+
side: THREE.DoubleSide,
|
|
119
|
+
});
|
|
120
|
+
}), [scanlineCount, scanSpeed, speed, colorVec, opacity, intensity, flickerAmount, gridEnabled]);
|
|
121
|
+
const planeSize = boundingRadius * 2.3;
|
|
122
|
+
const stepY = (boundingRadius * 2.5) / Math.max(scanlineCount - 1, 1);
|
|
123
|
+
useFrame((state) => {
|
|
124
|
+
const t = state.clock.getElapsedTime();
|
|
125
|
+
materials.forEach((mat, i) => {
|
|
126
|
+
mat.uniforms.u_time.value = t + i * 0.04;
|
|
127
|
+
if (glitchEnabled && Math.random() > 0.985) {
|
|
128
|
+
mat.uniforms.uGlitchOffset.value = (Math.random() - 0.5) * 0.06;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
mat.uniforms.uGlitchOffset.value *= 0.80;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
if (animations?.length) {
|
|
135
|
+
applyGenerativeAnimations(materials, animations, startValuesCacheRef.current, Date.now(), false);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
return (_jsx("group", { children: Array.from({ length: scanlineCount }, (_, i) => {
|
|
139
|
+
const y = -boundingRadius * 1.25 + i * stepY;
|
|
140
|
+
return (_jsx("mesh", { ref: el => { meshRefs.current[i] = el; }, material: materials[i], position: [0, y, 0], rotation: [-Math.PI / 2, 0, 0], children: _jsx("planeGeometry", { args: [planeSize, planeSize, 2, 2] }) }, i));
|
|
141
|
+
}) }));
|
|
142
|
+
};
|
|
143
|
+
export default HologramEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { IceCrystalsConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface IceCrystalsEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: IceCrystalsConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const IceCrystalsEffect: React.FC<IceCrystalsEffectProps>;
|
|
9
|
+
export default IceCrystalsEffect;
|
|
10
|
+
//# sourceMappingURL=IceCrystalsEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IceCrystalsEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/IceCrystalsEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAIlF,UAAU,sBAAsB;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAoED,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAiJvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|