@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,191 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } 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
|
+
// Multi-layer vortex disc
|
|
7
|
+
const discVertShader = /* glsl */ `
|
|
8
|
+
varying vec2 vUv;
|
|
9
|
+
void main() {
|
|
10
|
+
vUv = uv;
|
|
11
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
12
|
+
}
|
|
13
|
+
`;
|
|
14
|
+
const discFragShader = /* glsl */ `
|
|
15
|
+
uniform float u_time;
|
|
16
|
+
uniform float uSpiralTurns;
|
|
17
|
+
uniform float uRotationSpeed;
|
|
18
|
+
uniform vec3 uInnerColor;
|
|
19
|
+
uniform vec3 uOuterColor;
|
|
20
|
+
uniform float uOpacity;
|
|
21
|
+
uniform float uIntensity;
|
|
22
|
+
|
|
23
|
+
varying vec2 vUv;
|
|
24
|
+
|
|
25
|
+
float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); }
|
|
26
|
+
|
|
27
|
+
void main() {
|
|
28
|
+
vec2 centered = vUv * 2.0 - 1.0;
|
|
29
|
+
float dist = length(centered);
|
|
30
|
+
if (dist > 1.0) discard;
|
|
31
|
+
|
|
32
|
+
float angle = atan(centered.y, centered.x);
|
|
33
|
+
const float TAU = 6.28318530718;
|
|
34
|
+
float t = u_time * uRotationSpeed;
|
|
35
|
+
|
|
36
|
+
// Three counter-rotating spiral layers
|
|
37
|
+
float s1 = fract(dist * uSpiralTurns - angle / TAU + t);
|
|
38
|
+
float s2 = fract(dist * uSpiralTurns * 0.6 + angle / TAU - t * 1.4);
|
|
39
|
+
float s3 = fract(dist * uSpiralTurns * 2.2 - angle / TAU * 1.5 + t * 2.1);
|
|
40
|
+
|
|
41
|
+
float w3 = pow(1.0 - dist, 2.0);
|
|
42
|
+
float vortex = s1 * 0.45 + s2 * 0.30 * (1.0 - w3) + s3 * 0.60 * w3;
|
|
43
|
+
|
|
44
|
+
// Gravitational lensing rim
|
|
45
|
+
float rimRing = exp(-pow((dist - 0.92) / 0.04, 2.0)) * 3.0;
|
|
46
|
+
float rim = pow(smoothstep(0.85, 1.0, dist), 0.7) * 1.5;
|
|
47
|
+
|
|
48
|
+
// Singularity core
|
|
49
|
+
float core = exp(-dist * dist * 22.0) * 4.0;
|
|
50
|
+
float singularity = exp(-dist * dist * 90.0) * 8.0;
|
|
51
|
+
|
|
52
|
+
float edgeFade = 1.0 - smoothstep(0.72, 1.0, dist);
|
|
53
|
+
float noise = hash(vec2(dist * 8.0 + t * 0.3, angle));
|
|
54
|
+
float flux = 0.85 + 0.15 * noise;
|
|
55
|
+
|
|
56
|
+
vec3 rimLight = mix(uOuterColor * 2.0, vec3(1.0, 0.9, 0.7), rimRing * 0.5);
|
|
57
|
+
vec3 col = mix(rimLight, uInnerColor, vortex * 0.7 + core * 0.3) * flux;
|
|
58
|
+
col += vec3(1.0, 0.95, 0.85) * (singularity + core * 0.4);
|
|
59
|
+
col += uOuterColor * rim * 0.8;
|
|
60
|
+
|
|
61
|
+
float alpha = (vortex * 0.5 + edgeFade * 0.25 + core * 0.5 + rim * 0.4 + singularity * 0.3)
|
|
62
|
+
* uOpacity * uIntensity;
|
|
63
|
+
if (alpha < 0.008) discard;
|
|
64
|
+
gl_FragColor = vec4(col, alpha);
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
// ── Event-horizon dust — GPU animated, all motion in vertex shader ────────────
|
|
68
|
+
// Each particle orbits independently at a slightly perturbed radius, height, and speed.
|
|
69
|
+
const dustVertShader = /* glsl */ `
|
|
70
|
+
attribute float aAngle; // initial angle 0..TAU
|
|
71
|
+
attribute float aRadiusOff; // -0.12..+0.12 (fractional deviation from rim radius)
|
|
72
|
+
attribute float aHeightOff; // -0.08..+0.08 relative height deviation
|
|
73
|
+
attribute float aSpeed; // orbit speed multiplier 0.3..1.7
|
|
74
|
+
attribute float aPhase; // twinkle phase
|
|
75
|
+
|
|
76
|
+
uniform float u_time;
|
|
77
|
+
uniform float uRadius;
|
|
78
|
+
uniform float uPointSize;
|
|
79
|
+
uniform float u_speed;
|
|
80
|
+
|
|
81
|
+
varying float vAlpha;
|
|
82
|
+
|
|
83
|
+
void main() {
|
|
84
|
+
const float TAU = 6.28318530718;
|
|
85
|
+
|
|
86
|
+
float angle = aAngle + u_time * u_speed * aSpeed;
|
|
87
|
+
float r = uRadius * (1.0 + aRadiusOff);
|
|
88
|
+
float y = uRadius * aHeightOff * sin(angle * 2.3 + aPhase + u_time * 0.7);
|
|
89
|
+
|
|
90
|
+
vec3 pos = vec3(cos(angle) * r, y, sin(angle) * r);
|
|
91
|
+
|
|
92
|
+
// Subtle twinkle — most dust is nearly invisible, occasionally flickers bright
|
|
93
|
+
float twinkle = pow(max(0.0, sin(u_time * 1.8 + aPhase)), 6.0); // sharp spikes
|
|
94
|
+
float base = 0.08 + 0.12 * (0.5 + 0.5 * sin(aPhase + u_time * 0.4));
|
|
95
|
+
vAlpha = base + twinkle * 0.7;
|
|
96
|
+
|
|
97
|
+
vec4 mv = modelViewMatrix * vec4(pos, 1.0);
|
|
98
|
+
gl_PointSize = uPointSize * (0.4 + twinkle * 1.6) * (180.0 / -mv.z);
|
|
99
|
+
gl_Position = projectionMatrix * mv;
|
|
100
|
+
}
|
|
101
|
+
`;
|
|
102
|
+
const dustFragShader = /* glsl */ `
|
|
103
|
+
uniform vec3 uColor;
|
|
104
|
+
uniform float uOpacity;
|
|
105
|
+
varying float vAlpha;
|
|
106
|
+
|
|
107
|
+
void main() {
|
|
108
|
+
vec2 coord = gl_PointCoord - 0.5;
|
|
109
|
+
float dist = length(coord);
|
|
110
|
+
if (dist > 0.5) discard;
|
|
111
|
+
float glow = exp(-dist * dist * 9.0);
|
|
112
|
+
gl_FragColor = vec4(uColor, vAlpha * uOpacity * glow);
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
const PortalEffect = ({ boundingRadius, config, animations }) => {
|
|
116
|
+
const { radius, spiralTurns, innerGlowColor, outerGlowColor, rotationSpeed, particleRingEnabled, particleCount, opacity, speed, intensity } = config;
|
|
117
|
+
const startValuesCacheRef = useRef({});
|
|
118
|
+
const r = boundingRadius * radius;
|
|
119
|
+
const innerColorVec = useMemo(() => { const c = new THREE.Color(innerGlowColor); return new THREE.Vector3(c.r, c.g, c.b); }, [innerGlowColor]);
|
|
120
|
+
const outerColorVec = useMemo(() => { const c = new THREE.Color(outerGlowColor); return new THREE.Vector3(c.r, c.g, c.b); }, [outerGlowColor]);
|
|
121
|
+
const discMaterial = useMemo(() => new THREE.ShaderMaterial({
|
|
122
|
+
vertexShader: discVertShader,
|
|
123
|
+
fragmentShader: discFragShader,
|
|
124
|
+
uniforms: {
|
|
125
|
+
u_time: { value: 0 },
|
|
126
|
+
uSpiralTurns: { value: spiralTurns },
|
|
127
|
+
uRotationSpeed: { value: rotationSpeed * speed },
|
|
128
|
+
uInnerColor: { value: innerColorVec },
|
|
129
|
+
uOuterColor: { value: outerColorVec },
|
|
130
|
+
uOpacity: { value: opacity },
|
|
131
|
+
uIntensity: { value: intensity },
|
|
132
|
+
},
|
|
133
|
+
transparent: true,
|
|
134
|
+
depthWrite: false,
|
|
135
|
+
blending: THREE.AdditiveBlending,
|
|
136
|
+
side: THREE.DoubleSide,
|
|
137
|
+
}), [spiralTurns, rotationSpeed, speed, innerColorVec, outerColorVec, opacity, intensity]);
|
|
138
|
+
// ── Event-horizon dust ──────────────────────────────────────────────────────
|
|
139
|
+
const { dustGeo, dustMat } = useMemo(() => {
|
|
140
|
+
const count = particleCount;
|
|
141
|
+
const angles = new Float32Array(count);
|
|
142
|
+
const radOffsets = new Float32Array(count);
|
|
143
|
+
const heightOffs = new Float32Array(count);
|
|
144
|
+
const speeds = new Float32Array(count);
|
|
145
|
+
const phases = new Float32Array(count);
|
|
146
|
+
for (let i = 0; i < count; i++) {
|
|
147
|
+
angles[i] = (i / count) * Math.PI * 2 + Math.random() * 0.2;
|
|
148
|
+
radOffsets[i] = (Math.random() - 0.5) * 0.24;
|
|
149
|
+
heightOffs[i] = (Math.random() - 0.5) * 0.16;
|
|
150
|
+
speeds[i] = 0.3 + Math.random() * 1.4; // wide speed spread
|
|
151
|
+
phases[i] = Math.random() * Math.PI * 2;
|
|
152
|
+
}
|
|
153
|
+
const geo = new THREE.BufferGeometry();
|
|
154
|
+
// Positions are computed entirely in vertex shader; use dummy zero positions
|
|
155
|
+
geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(count * 3), 3));
|
|
156
|
+
geo.setAttribute('aAngle', new THREE.BufferAttribute(angles, 1));
|
|
157
|
+
geo.setAttribute('aRadiusOff', new THREE.BufferAttribute(radOffsets, 1));
|
|
158
|
+
geo.setAttribute('aHeightOff', new THREE.BufferAttribute(heightOffs, 1));
|
|
159
|
+
geo.setAttribute('aSpeed', new THREE.BufferAttribute(speeds, 1));
|
|
160
|
+
geo.setAttribute('aPhase', new THREE.BufferAttribute(phases, 1));
|
|
161
|
+
// Dust color: mostly white, very slightly tinted toward innerGlowColor
|
|
162
|
+
const dustCol = new THREE.Color(innerGlowColor).lerp(new THREE.Color('#ffffff'), 0.75);
|
|
163
|
+
const dustColVec = new THREE.Vector3(dustCol.r, dustCol.g, dustCol.b);
|
|
164
|
+
const mat = new THREE.ShaderMaterial({
|
|
165
|
+
vertexShader: dustVertShader,
|
|
166
|
+
fragmentShader: dustFragShader,
|
|
167
|
+
uniforms: {
|
|
168
|
+
u_time: { value: 0 },
|
|
169
|
+
uRadius: { value: r },
|
|
170
|
+
uPointSize: { value: 5 * intensity },
|
|
171
|
+
u_speed: { value: speed * 0.5 },
|
|
172
|
+
uColor: { value: dustColVec },
|
|
173
|
+
uOpacity: { value: opacity * 0.6 },
|
|
174
|
+
},
|
|
175
|
+
transparent: true,
|
|
176
|
+
depthWrite: false,
|
|
177
|
+
blending: THREE.AdditiveBlending,
|
|
178
|
+
});
|
|
179
|
+
return { dustGeo: geo, dustMat: mat };
|
|
180
|
+
}, [particleCount, r, innerGlowColor, intensity, speed, opacity]);
|
|
181
|
+
useFrame((state) => {
|
|
182
|
+
const t = state.clock.getElapsedTime();
|
|
183
|
+
discMaterial.uniforms.u_time.value = t;
|
|
184
|
+
dustMat.uniforms.u_time.value = t;
|
|
185
|
+
if (animations?.length) {
|
|
186
|
+
applyGenerativeAnimations([discMaterial, dustMat], animations, startValuesCacheRef.current, Date.now(), false);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
return (_jsxs("group", { rotation: [-Math.PI / 2, 0, 0], position: [0, -boundingRadius * 0.75, 0], children: [_jsx("mesh", { material: discMaterial, children: _jsx("circleGeometry", { args: [r, 80] }) }), particleRingEnabled && (_jsx("points", { geometry: dustGeo, material: dustMat }))] }));
|
|
190
|
+
};
|
|
191
|
+
export default PortalEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ShockwaveConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface ShockwaveEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: ShockwaveConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const ShockwaveEffect: React.FC<ShockwaveEffectProps>;
|
|
9
|
+
export default ShockwaveEffect;
|
|
10
|
+
//# sourceMappingURL=ShockwaveEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShockwaveEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/ShockwaveEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqC,MAAM,OAAO,CAAC;AAG1D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAIhF,UAAU,oBAAoB;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAyFD,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA0HnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useMemo, useEffect } from 'react';
|
|
3
|
+
import { useFrame } from '@react-three/fiber';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { applyGenerativeAnimations } from '../../utils/handleGenerativeEffectsAnimations';
|
|
6
|
+
// Ring vertex — organic warp + vertical ripple
|
|
7
|
+
const vertexShader = /* glsl */ `
|
|
8
|
+
uniform float uProgress;
|
|
9
|
+
uniform float uExpansionScale;
|
|
10
|
+
|
|
11
|
+
void main() {
|
|
12
|
+
vec3 pos = position;
|
|
13
|
+
float expansion = 1.0 + uProgress * uExpansionScale;
|
|
14
|
+
pos.x *= expansion;
|
|
15
|
+
pos.y *= expansion;
|
|
16
|
+
|
|
17
|
+
// Organic warp: slight Z ripple based on angle along the torus
|
|
18
|
+
float angle = atan(pos.y, pos.x);
|
|
19
|
+
float warp = sin(angle * 8.0 + uProgress * 18.0) * 0.018 * (1.0 - uProgress);
|
|
20
|
+
pos.z += warp;
|
|
21
|
+
|
|
22
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
const fragmentShader = /* glsl */ `
|
|
26
|
+
uniform float uProgress;
|
|
27
|
+
uniform vec3 uColor;
|
|
28
|
+
uniform vec3 uRimColor;
|
|
29
|
+
uniform float uOpacity;
|
|
30
|
+
uniform float u_time;
|
|
31
|
+
|
|
32
|
+
// Cheap 1D noise for surface texture
|
|
33
|
+
float hash(float n){ return fract(sin(n) * 43758.5453); }
|
|
34
|
+
|
|
35
|
+
void main() {
|
|
36
|
+
// Core fade
|
|
37
|
+
float fade = 1.0 - uProgress;
|
|
38
|
+
|
|
39
|
+
// Leading-edge corona: ultra-bright blast front
|
|
40
|
+
float corona = exp(-uProgress * 6.0) * 2.5;
|
|
41
|
+
|
|
42
|
+
// High-frequency energy shimmer on the ring surface
|
|
43
|
+
float shimmer = 0.75 + 0.25 * hash(uProgress * 40.0 + u_time * 7.0);
|
|
44
|
+
|
|
45
|
+
// Rim glow (raised power = tighter, brighter rim)
|
|
46
|
+
float rim = pow(max(0.0, 1.0 - uProgress), 4.0);
|
|
47
|
+
|
|
48
|
+
// Chromatic split — push rim color toward white at the leading edge
|
|
49
|
+
vec3 rimBoosted = mix(uRimColor, vec3(1.4, 1.4, 1.6), corona * 0.5);
|
|
50
|
+
vec3 finalColor = mix(uColor, rimBoosted, rim + corona * 0.4);
|
|
51
|
+
finalColor += rimBoosted * corona * 0.6;
|
|
52
|
+
|
|
53
|
+
float alpha = fade * uOpacity * shimmer;
|
|
54
|
+
if (alpha < 0.005) discard;
|
|
55
|
+
|
|
56
|
+
gl_FragColor = vec4(finalColor, alpha);
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
// Flash disc at ring birth — bright flat burst that fades in ~0.2 progress
|
|
60
|
+
const flashFrag = /* glsl */ `
|
|
61
|
+
uniform float uProgress;
|
|
62
|
+
uniform vec3 uColor;
|
|
63
|
+
uniform float uOpacity;
|
|
64
|
+
|
|
65
|
+
varying vec2 vUv;
|
|
66
|
+
|
|
67
|
+
void main() {
|
|
68
|
+
vec2 c = vUv * 2.0 - 1.0;
|
|
69
|
+
float dist = length(c);
|
|
70
|
+
if (dist > 1.0) discard;
|
|
71
|
+
float fade = exp(-uProgress * 12.0);
|
|
72
|
+
float radial = 1.0 - smoothstep(0.4, 1.0, dist);
|
|
73
|
+
float alpha = fade * radial * uOpacity * 0.9;
|
|
74
|
+
if (alpha < 0.005) discard;
|
|
75
|
+
gl_FragColor = vec4(uColor * 2.0, alpha);
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
const flashVert = /* glsl */ `
|
|
79
|
+
varying vec2 vUv;
|
|
80
|
+
void main() {
|
|
81
|
+
vUv = uv;
|
|
82
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
const ShockwaveEffect = ({ boundingRadius, config, animations }) => {
|
|
86
|
+
const { ringCount, expansionRadius, thickness, intervalSeconds, color, rimColor, opacity, speed, intensity } = config;
|
|
87
|
+
const startValuesCacheRef = useRef({});
|
|
88
|
+
const meshRefs = useRef([]);
|
|
89
|
+
const flashRefs = useRef([]);
|
|
90
|
+
const makeRingStates = (count, interval) => Array.from({ length: count }, (_, i) => ({
|
|
91
|
+
progress: 0,
|
|
92
|
+
cooldown: (i / Math.max(count, 1)) * interval,
|
|
93
|
+
}));
|
|
94
|
+
const ringStates = useRef(makeRingStates(ringCount, intervalSeconds));
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
ringStates.current = makeRingStates(ringCount, intervalSeconds);
|
|
97
|
+
}, [ringCount, intervalSeconds]);
|
|
98
|
+
const colorVec = useMemo(() => { const c = new THREE.Color(color); return new THREE.Vector3(c.r, c.g, c.b); }, [color]);
|
|
99
|
+
const rimColorVec = useMemo(() => { const c = new THREE.Color(rimColor); return new THREE.Vector3(c.r, c.g, c.b); }, [rimColor]);
|
|
100
|
+
const materials = useMemo(() => Array.from({ length: ringCount }, () => new THREE.ShaderMaterial({
|
|
101
|
+
vertexShader,
|
|
102
|
+
fragmentShader,
|
|
103
|
+
uniforms: {
|
|
104
|
+
uProgress: { value: 0 },
|
|
105
|
+
uExpansionScale: { value: (expansionRadius - 1) * intensity },
|
|
106
|
+
uColor: { value: colorVec },
|
|
107
|
+
uRimColor: { value: rimColorVec },
|
|
108
|
+
uOpacity: { value: opacity },
|
|
109
|
+
u_time: { value: 0 },
|
|
110
|
+
},
|
|
111
|
+
transparent: true,
|
|
112
|
+
depthWrite: false,
|
|
113
|
+
blending: THREE.AdditiveBlending,
|
|
114
|
+
side: THREE.DoubleSide,
|
|
115
|
+
})), [ringCount, expansionRadius, intensity, colorVec, rimColorVec, opacity]);
|
|
116
|
+
const flashMaterials = useMemo(() => Array.from({ length: ringCount }, () => new THREE.ShaderMaterial({
|
|
117
|
+
vertexShader: flashVert,
|
|
118
|
+
fragmentShader: flashFrag,
|
|
119
|
+
uniforms: {
|
|
120
|
+
uProgress: { value: 0 },
|
|
121
|
+
uColor: { value: colorVec },
|
|
122
|
+
uOpacity: { value: opacity },
|
|
123
|
+
},
|
|
124
|
+
transparent: true,
|
|
125
|
+
depthWrite: false,
|
|
126
|
+
blending: THREE.AdditiveBlending,
|
|
127
|
+
side: THREE.DoubleSide,
|
|
128
|
+
})), [ringCount, colorVec, opacity]);
|
|
129
|
+
const r = boundingRadius;
|
|
130
|
+
useFrame((state, delta) => {
|
|
131
|
+
const t = state.clock.getElapsedTime();
|
|
132
|
+
for (let i = 0; i < ringCount; i++) {
|
|
133
|
+
const state_ = ringStates.current[i];
|
|
134
|
+
const mat = materials[i];
|
|
135
|
+
const fMat = flashMaterials[i];
|
|
136
|
+
mat.uniforms.u_time.value = t;
|
|
137
|
+
if (state_.cooldown > 0) {
|
|
138
|
+
state_.cooldown -= delta;
|
|
139
|
+
mat.uniforms.uProgress.value = 1;
|
|
140
|
+
fMat.uniforms.uProgress.value = 1;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
state_.progress += delta * speed;
|
|
144
|
+
const p = Math.min(state_.progress, 1);
|
|
145
|
+
mat.uniforms.uProgress.value = p;
|
|
146
|
+
fMat.uniforms.uProgress.value = p;
|
|
147
|
+
if (state_.progress >= 1) {
|
|
148
|
+
state_.progress = 0;
|
|
149
|
+
state_.cooldown = intervalSeconds / speed;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (animations?.length) {
|
|
153
|
+
applyGenerativeAnimations([...materials, ...flashMaterials], animations, startValuesCacheRef.current, Date.now(), false);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
const flashR = r * 1.05;
|
|
157
|
+
return (_jsx("group", { children: Array.from({ length: ringCount }, (_, i) => (_jsxs("group", { children: [_jsx("mesh", { ref: el => { meshRefs.current[i] = el; }, material: materials[i], rotation: [-Math.PI / 2, 0, 0], children: _jsx("torusGeometry", { args: [r, thickness * intensity, 10, 80] }) }), _jsx("mesh", { ref: el => { flashRefs.current[i] = el; }, material: flashMaterials[i], rotation: [-Math.PI / 2, 0, 0], children: _jsx("circleGeometry", { args: [flashR, 48] }) })] }, i))) }));
|
|
158
|
+
};
|
|
159
|
+
export default ShockwaveEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SmokePlumeConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface SmokePlumeEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: SmokePlumeConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const SmokePlumeEffect: React.FC<SmokePlumeEffectProps>;
|
|
9
|
+
export default SmokePlumeEffect;
|
|
10
|
+
//# sourceMappingURL=SmokePlumeEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SmokePlumeEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/SmokePlumeEffect.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,CAqErD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
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
|
+
// ── Fully GPU-animated smoke puff vertex shader ───────────────────────────────
|
|
7
|
+
// Each particle has a lifetime t ∈ [0,1). It rises, expands, and billows.
|
|
8
|
+
// All motion driven by u_time — zero CPU writes per frame.
|
|
9
|
+
const smokeVert = /* glsl */ `
|
|
10
|
+
attribute float aT; // birth offset 0..1 → staggered spawn
|
|
11
|
+
attribute vec2 aBase; // (x,z) spawn footprint
|
|
12
|
+
attribute float aPhase; // per-particle noise phase
|
|
13
|
+
attribute float aRotOff; // per-particle billboard rotation offset
|
|
14
|
+
attribute float aSize; // per-particle max size
|
|
15
|
+
|
|
16
|
+
uniform float u_time;
|
|
17
|
+
uniform float u_speed;
|
|
18
|
+
uniform float uHeight;
|
|
19
|
+
uniform float uSpread;
|
|
20
|
+
uniform float uTurb;
|
|
21
|
+
uniform float uSizeScale;
|
|
22
|
+
|
|
23
|
+
varying float vLife; // 0=just born, 1=about to die
|
|
24
|
+
varying float vAlpha;
|
|
25
|
+
|
|
26
|
+
void main() {
|
|
27
|
+
// Age loops continuously
|
|
28
|
+
float life = fract(aT + u_time * u_speed * 0.22);
|
|
29
|
+
vLife = life;
|
|
30
|
+
|
|
31
|
+
// Footprint expands as smoke rises and dissipates
|
|
32
|
+
float expand = 1.0 + life * 2.5;
|
|
33
|
+
float x = aBase.x * expand * uSpread;
|
|
34
|
+
float z = aBase.y * expand * uSpread;
|
|
35
|
+
|
|
36
|
+
// Turbulent horizontal drift — two layers of sine turbulence
|
|
37
|
+
float t1 = sin(life * 4.2 + aPhase) * uTurb * uSpread * life * 0.9;
|
|
38
|
+
float t2 = sin(life * 7.1 + aPhase * 1.7 + 1.3) * uTurb * uSpread * life * 0.4;
|
|
39
|
+
float t3 = cos(life * 3.5 - aPhase * 0.8) * uTurb * uSpread * life * 0.3;
|
|
40
|
+
x += t1 + t2;
|
|
41
|
+
z += t3 + t2 * 0.5;
|
|
42
|
+
|
|
43
|
+
float y = life * uHeight - uHeight * 0.45;
|
|
44
|
+
|
|
45
|
+
// Particle grows from tiny to large, then fades to nothing
|
|
46
|
+
float growFade = smoothstep(0.0, 0.15, life) * smoothstep(1.0, 0.6, life);
|
|
47
|
+
float sz = aSize * uSizeScale * growFade;
|
|
48
|
+
|
|
49
|
+
// Alpha: ramp in quickly, stay opaque, fade out
|
|
50
|
+
vAlpha = growFade * growFade;
|
|
51
|
+
|
|
52
|
+
vec4 mv = modelViewMatrix * vec4(x, y, z, 1.0);
|
|
53
|
+
gl_PointSize = sz * (200.0 / -mv.z);
|
|
54
|
+
gl_Position = projectionMatrix * mv;
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
const smokeFrag = /* glsl */ `
|
|
58
|
+
uniform vec3 uSmokeColor;
|
|
59
|
+
uniform float uOpacity;
|
|
60
|
+
varying float vLife;
|
|
61
|
+
varying float vAlpha;
|
|
62
|
+
|
|
63
|
+
void main() {
|
|
64
|
+
if (vAlpha < 0.01) discard;
|
|
65
|
+
|
|
66
|
+
vec2 c = gl_PointCoord - 0.5;
|
|
67
|
+
float d = length(c);
|
|
68
|
+
if (d > 0.5) discard;
|
|
69
|
+
|
|
70
|
+
// Soft gaussian puff — not a crisp disc
|
|
71
|
+
float g = exp(-d * d * 3.8);
|
|
72
|
+
|
|
73
|
+
// Slightly darken as smoke ages (hot white → grey → dark)
|
|
74
|
+
float darkening = 1.0 - vLife * 0.45;
|
|
75
|
+
vec3 col = uSmokeColor * darkening;
|
|
76
|
+
|
|
77
|
+
gl_FragColor = vec4(col, g * vAlpha * uOpacity);
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
const SmokePlumeEffect = ({ boundingRadius, config, animations }) => {
|
|
81
|
+
const { particleCount, height, spread, smokeColor, turbulence, opacity, speed, intensity } = config;
|
|
82
|
+
const startValuesCacheRef = useRef({});
|
|
83
|
+
const h = boundingRadius * height;
|
|
84
|
+
const s = boundingRadius * spread;
|
|
85
|
+
const { geo, mat } = useMemo(() => {
|
|
86
|
+
const N = Math.max(40, particleCount);
|
|
87
|
+
const aT = new Float32Array(N);
|
|
88
|
+
const aBase = new Float32Array(N * 2);
|
|
89
|
+
const aPhase = new Float32Array(N);
|
|
90
|
+
const aRotOff = new Float32Array(N);
|
|
91
|
+
const aSize = new Float32Array(N);
|
|
92
|
+
for (let i = 0; i < N; i++) {
|
|
93
|
+
aT[i] = i / N;
|
|
94
|
+
// Concentrate spawns near center, sparse toward edges
|
|
95
|
+
const r = Math.pow(Math.random(), 0.6) * s;
|
|
96
|
+
const a = Math.random() * Math.PI * 2;
|
|
97
|
+
aBase[i * 2] = Math.cos(a) * r;
|
|
98
|
+
aBase[i * 2 + 1] = Math.sin(a) * r;
|
|
99
|
+
aPhase[i] = Math.random() * Math.PI * 2;
|
|
100
|
+
aRotOff[i] = Math.random() * Math.PI * 2;
|
|
101
|
+
aSize[i] = 35 + Math.random() * 45; // puff screen size
|
|
102
|
+
}
|
|
103
|
+
const g = new THREE.BufferGeometry();
|
|
104
|
+
g.setAttribute('position', new THREE.BufferAttribute(new Float32Array(N * 3), 3));
|
|
105
|
+
g.setAttribute('aT', new THREE.BufferAttribute(aT, 1));
|
|
106
|
+
g.setAttribute('aBase', new THREE.BufferAttribute(aBase, 2));
|
|
107
|
+
g.setAttribute('aPhase', new THREE.BufferAttribute(aPhase, 1));
|
|
108
|
+
g.setAttribute('aRotOff', new THREE.BufferAttribute(aRotOff, 1));
|
|
109
|
+
g.setAttribute('aSize', new THREE.BufferAttribute(aSize, 1));
|
|
110
|
+
g.frustumCulled = false;
|
|
111
|
+
const sc = new THREE.Color(smokeColor);
|
|
112
|
+
const m = new THREE.ShaderMaterial({
|
|
113
|
+
vertexShader: smokeVert,
|
|
114
|
+
fragmentShader: smokeFrag,
|
|
115
|
+
uniforms: {
|
|
116
|
+
u_time: { value: 0 },
|
|
117
|
+
u_speed: { value: speed },
|
|
118
|
+
uHeight: { value: h },
|
|
119
|
+
uSpread: { value: s },
|
|
120
|
+
uTurb: { value: turbulence },
|
|
121
|
+
uSizeScale: { value: intensity },
|
|
122
|
+
uSmokeColor: { value: new THREE.Vector3(sc.r, sc.g, sc.b) },
|
|
123
|
+
uOpacity: { value: opacity },
|
|
124
|
+
},
|
|
125
|
+
transparent: true,
|
|
126
|
+
depthWrite: false,
|
|
127
|
+
// Normal blending (not additive) — smoke should look opaque/grey, not glowy
|
|
128
|
+
blending: THREE.NormalBlending,
|
|
129
|
+
});
|
|
130
|
+
return { geo: g, mat: m };
|
|
131
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
132
|
+
}, [particleCount, h, s, smokeColor, turbulence, opacity, speed, intensity]);
|
|
133
|
+
useFrame((state) => {
|
|
134
|
+
mat.uniforms.u_time.value = state.clock.getElapsedTime();
|
|
135
|
+
if (animations?.length) {
|
|
136
|
+
applyGenerativeAnimations([mat], animations, startValuesCacheRef.current, Date.now(), false);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return _jsx("points", { geometry: geo, material: mat });
|
|
140
|
+
};
|
|
141
|
+
export default SmokePlumeEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SmokeRingConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface SmokeRingEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: SmokeRingConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const SmokeRingEffect: React.FC<SmokeRingEffectProps>;
|
|
9
|
+
export default SmokeRingEffect;
|
|
10
|
+
//# sourceMappingURL=SmokeRingEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SmokeRingEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/SmokeRingEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAIhF,UAAU,oBAAoB;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AA0ED,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA4GnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
|