@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,188 @@
|
|
|
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
|
+
// Glow sprite for pulse signals and node flashes
|
|
7
|
+
const pulseVert = /* glsl */ `
|
|
8
|
+
attribute float aBright;
|
|
9
|
+
uniform float uSize;
|
|
10
|
+
varying float vB;
|
|
11
|
+
void main() {
|
|
12
|
+
vB = aBright;
|
|
13
|
+
if (vB < 0.01) { gl_PointSize = 0.0; gl_Position = vec4(0); return; }
|
|
14
|
+
vec4 mv = modelViewMatrix * vec4(position, 1.0);
|
|
15
|
+
gl_PointSize = uSize * vB * (200.0 / -mv.z);
|
|
16
|
+
gl_Position = projectionMatrix * mv;
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
const pulseFrag = /* glsl */ `
|
|
20
|
+
uniform vec3 uColor;
|
|
21
|
+
uniform float uOpacity;
|
|
22
|
+
varying float vB;
|
|
23
|
+
void main() {
|
|
24
|
+
if (vB < 0.01) discard;
|
|
25
|
+
vec2 c = gl_PointCoord - 0.5;
|
|
26
|
+
if (length(c) > 0.5) discard;
|
|
27
|
+
float g = exp(-dot(c, c) * 5.5);
|
|
28
|
+
gl_FragColor = vec4(uColor, g * vB * uOpacity);
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
const MAX_PULSES = 4;
|
|
32
|
+
const NeuralNetworkEffect = ({ boundingRadius, config, animations }) => {
|
|
33
|
+
const { nodeCount, signalSpeed, nodeColor, pulseColor, orbitSpeed, opacity, speed, intensity } = config;
|
|
34
|
+
const startValuesCacheRef = useRef({});
|
|
35
|
+
const groupRef = useRef(null);
|
|
36
|
+
// Node orbit state
|
|
37
|
+
const orbitAngles = useRef(new Float32Array(0));
|
|
38
|
+
const pulses = useRef([]);
|
|
39
|
+
const nextPulse = useRef(0);
|
|
40
|
+
const r = boundingRadius * 1.35;
|
|
41
|
+
const N = Math.max(8, Math.min(nodeCount, 40));
|
|
42
|
+
const scene = useMemo(() => {
|
|
43
|
+
// ── Node positions on Fibonacci sphere ────────────────────────────────
|
|
44
|
+
const basePos = [];
|
|
45
|
+
const goldenAngle = Math.PI * (3 - Math.sqrt(5));
|
|
46
|
+
for (let i = 0; i < N; i++) {
|
|
47
|
+
const y = 1 - (i / (N - 1)) * 2;
|
|
48
|
+
const rad = Math.sqrt(1 - y * y) * r;
|
|
49
|
+
const phi = i * goldenAngle;
|
|
50
|
+
basePos.push(new THREE.Vector3(Math.cos(phi) * rad, y * r, Math.sin(phi) * rad));
|
|
51
|
+
}
|
|
52
|
+
// Orbit axes — random unit vectors
|
|
53
|
+
const orbitAxes = Array.from({ length: N }, () => new THREE.Vector3(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5).normalize());
|
|
54
|
+
const orbitSpeeds = Array.from({ length: N }, () => 0.4 + Math.random() * 0.6);
|
|
55
|
+
const angles = new Float32Array(N).map((_, i) => i * 0.7);
|
|
56
|
+
orbitAngles.current = angles;
|
|
57
|
+
// ── Edges — connect nearby pairs ─────────────────────────────────────
|
|
58
|
+
const MAX_DIST = r * 0.85;
|
|
59
|
+
const edges = [];
|
|
60
|
+
const degree = new Int32Array(N);
|
|
61
|
+
for (let i = 0; i < N; i++) {
|
|
62
|
+
for (let j = i + 1; j < N; j++) {
|
|
63
|
+
if (degree[i] >= 3 || degree[j] >= 3)
|
|
64
|
+
continue;
|
|
65
|
+
if (basePos[i].distanceTo(basePos[j]) < MAX_DIST) {
|
|
66
|
+
edges.push([i, j]);
|
|
67
|
+
degree[i]++;
|
|
68
|
+
degree[j]++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const edgeVerts = new Float32Array(edges.length * 6);
|
|
73
|
+
const edgeCols = new Float32Array(edges.length * 6);
|
|
74
|
+
const nc = new THREE.Color(nodeColor);
|
|
75
|
+
const DIM = 0.06;
|
|
76
|
+
for (let e = 0; e < edges.length; e++) {
|
|
77
|
+
const [a, b] = edges[e];
|
|
78
|
+
edgeVerts.set([basePos[a].x, basePos[a].y, basePos[a].z, basePos[b].x, basePos[b].y, basePos[b].z], e * 6);
|
|
79
|
+
edgeCols.set([nc.r * DIM, nc.g * DIM, nc.b * DIM, nc.r * DIM, nc.g * DIM, nc.b * DIM], e * 6);
|
|
80
|
+
}
|
|
81
|
+
const edgeGeo = new THREE.BufferGeometry();
|
|
82
|
+
edgeGeo.setAttribute('position', new THREE.BufferAttribute(edgeVerts, 3));
|
|
83
|
+
edgeGeo.setAttribute('color', new THREE.BufferAttribute(edgeCols, 3));
|
|
84
|
+
const edgeMat = new THREE.LineBasicMaterial({
|
|
85
|
+
vertexColors: true, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending,
|
|
86
|
+
});
|
|
87
|
+
// ── Node instanced mesh ───────────────────────────────────────────────
|
|
88
|
+
const nodeGeo = new THREE.SphereGeometry(0.055 * intensity, 8, 8);
|
|
89
|
+
const nc2 = new THREE.Color(nodeColor);
|
|
90
|
+
const nodeMat = new THREE.MeshBasicMaterial({
|
|
91
|
+
color: nc2, transparent: true, opacity: opacity * 0.55,
|
|
92
|
+
depthWrite: false, blending: THREE.AdditiveBlending,
|
|
93
|
+
});
|
|
94
|
+
const nodeMesh = new THREE.InstancedMesh(nodeGeo, nodeMat, N);
|
|
95
|
+
nodeMesh.instanceMatrix.setUsage(THREE.DynamicDrawUsage);
|
|
96
|
+
// ── Pulse sprites ─────────────────────────────────────────────────────
|
|
97
|
+
const pulsePos = new Float32Array(MAX_PULSES * 3);
|
|
98
|
+
const pulseBright = new Float32Array(MAX_PULSES);
|
|
99
|
+
const pulseGeo = new THREE.BufferGeometry();
|
|
100
|
+
pulseGeo.setAttribute('position', new THREE.BufferAttribute(pulsePos, 3));
|
|
101
|
+
pulseGeo.setAttribute('aBright', new THREE.BufferAttribute(pulseBright, 1));
|
|
102
|
+
const pc = new THREE.Color(pulseColor);
|
|
103
|
+
const pulseMat = new THREE.ShaderMaterial({
|
|
104
|
+
vertexShader: pulseVert, fragmentShader: pulseFrag,
|
|
105
|
+
uniforms: {
|
|
106
|
+
uSize: { value: 20 * intensity },
|
|
107
|
+
uColor: { value: new THREE.Vector3(pc.r, pc.g, pc.b) },
|
|
108
|
+
uOpacity: { value: opacity },
|
|
109
|
+
},
|
|
110
|
+
transparent: true, depthWrite: false, blending: THREE.AdditiveBlending,
|
|
111
|
+
});
|
|
112
|
+
// Initialise pulse states
|
|
113
|
+
pulses.current = Array.from({ length: MAX_PULSES }, () => ({
|
|
114
|
+
fromIdx: 0, toIdx: 1, progress: 0, active: false,
|
|
115
|
+
}));
|
|
116
|
+
return { basePos, orbitAxes, orbitSpeeds, edges, edgeGeo, edgeMat, nodeMesh, pulseGeo, pulseMat };
|
|
117
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
118
|
+
}, [N, r, nodeColor, pulseColor, opacity, intensity]);
|
|
119
|
+
const tmpMat = useMemo(() => new THREE.Matrix4(), []);
|
|
120
|
+
const tmpQuat = useMemo(() => new THREE.Quaternion(), []);
|
|
121
|
+
const tmpVec = useMemo(() => new THREE.Vector3(), []);
|
|
122
|
+
useFrame((_, delta) => {
|
|
123
|
+
if (!groupRef.current)
|
|
124
|
+
return;
|
|
125
|
+
const dt = delta * speed;
|
|
126
|
+
const { basePos, orbitAxes, orbitSpeeds, edges, edgeGeo, nodeMesh, pulseGeo, pulseMat } = scene;
|
|
127
|
+
// Rotate nodes around their individual axes
|
|
128
|
+
const angles = orbitAngles.current;
|
|
129
|
+
const curPos = [];
|
|
130
|
+
for (let i = 0; i < N; i++) {
|
|
131
|
+
angles[i] += dt * orbitSpeed * orbitSpeeds[i] * 0.4;
|
|
132
|
+
const base = basePos[i];
|
|
133
|
+
const axis = orbitAxes[i];
|
|
134
|
+
const ang = angles[i];
|
|
135
|
+
// Rodrigues rotation of base position around axis
|
|
136
|
+
const cosA = Math.cos(ang), sinA = Math.sin(ang);
|
|
137
|
+
const dot = base.dot(axis);
|
|
138
|
+
tmpVec.set(base.x * cosA + (axis.y * base.z - axis.z * base.y) * sinA + axis.x * dot * (1 - cosA), base.y * cosA + (axis.z * base.x - axis.x * base.z) * sinA + axis.y * dot * (1 - cosA), base.z * cosA + (axis.x * base.y - axis.y * base.x) * sinA + axis.z * dot * (1 - cosA));
|
|
139
|
+
curPos.push(tmpVec.clone());
|
|
140
|
+
tmpMat.compose(tmpVec, tmpQuat, new THREE.Vector3(1, 1, 1));
|
|
141
|
+
nodeMesh.setMatrixAt(i, tmpMat);
|
|
142
|
+
}
|
|
143
|
+
nodeMesh.instanceMatrix.needsUpdate = true;
|
|
144
|
+
// Update edge positions
|
|
145
|
+
const edgePosAttr = edgeGeo.attributes.position;
|
|
146
|
+
for (let e = 0; e < edges.length; e++) {
|
|
147
|
+
const [a, b] = edges[e];
|
|
148
|
+
edgePosAttr.setXYZ(e * 2, curPos[a].x, curPos[a].y, curPos[a].z);
|
|
149
|
+
edgePosAttr.setXYZ(e * 2 + 1, curPos[b].x, curPos[b].y, curPos[b].z);
|
|
150
|
+
}
|
|
151
|
+
edgePosAttr.needsUpdate = true;
|
|
152
|
+
// Pulse signals along edges
|
|
153
|
+
nextPulse.current -= delta;
|
|
154
|
+
if (nextPulse.current <= 0 && edges.length > 0) {
|
|
155
|
+
nextPulse.current = 0.4 / speed;
|
|
156
|
+
const idle = pulses.current.findIndex(p => !p.active);
|
|
157
|
+
if (idle >= 0) {
|
|
158
|
+
const e = Math.floor(Math.random() * edges.length);
|
|
159
|
+
pulses.current[idle] = { fromIdx: edges[e][0], toIdx: edges[e][1], progress: 0, active: true };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const ptPos = pulseGeo.attributes.position;
|
|
163
|
+
const ptBright = pulseGeo.attributes.aBright;
|
|
164
|
+
pulses.current.forEach((p, pi) => {
|
|
165
|
+
if (!p.active) {
|
|
166
|
+
ptBright.setX(pi, 0);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
p.progress += dt * signalSpeed * 0.9;
|
|
170
|
+
if (p.progress >= 1) {
|
|
171
|
+
p.active = false;
|
|
172
|
+
ptBright.setX(pi, 0);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const pos = curPos[p.fromIdx].clone().lerp(curPos[p.toIdx], p.progress);
|
|
176
|
+
ptPos.setXYZ(pi, pos.x, pos.y, pos.z);
|
|
177
|
+
ptBright.setX(pi, 0.7 + 0.3 * Math.sin(p.progress * Math.PI));
|
|
178
|
+
});
|
|
179
|
+
ptPos.needsUpdate = true;
|
|
180
|
+
ptBright.needsUpdate = true;
|
|
181
|
+
pulseMat.uniforms.uSize.value = 20 * intensity;
|
|
182
|
+
if (animations?.length) {
|
|
183
|
+
applyGenerativeAnimations([pulseMat], animations, startValuesCacheRef.current, Date.now(), false);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
return (_jsxs("group", { ref: groupRef, children: [_jsx("lineSegments", { geometry: scene.edgeGeo, material: scene.edgeMat }), _jsx("primitive", { object: scene.nodeMesh }), _jsx("points", { geometry: scene.pulseGeo, material: scene.pulseMat })] }));
|
|
187
|
+
};
|
|
188
|
+
export default NeuralNetworkEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { OrbConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface OrbEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: OrbConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const OrbEffect: React.FC<OrbEffectProps>;
|
|
9
|
+
export default OrbEffect;
|
|
10
|
+
//# sourceMappingURL=OrbEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrbEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/OrbEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI1E,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAyLD,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAqJvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,291 @@
|
|
|
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
|
+
// ── Shared vert (normal + viewDir) ────────────────────────────────────────────
|
|
7
|
+
const sharedVert = /* glsl */ `
|
|
8
|
+
varying vec3 vNormal;
|
|
9
|
+
varying vec3 vViewDir;
|
|
10
|
+
varying vec3 vWorldNormal;
|
|
11
|
+
void main() {
|
|
12
|
+
vNormal = normalize(normalMatrix * normal);
|
|
13
|
+
vWorldNormal = normalize((modelMatrix * vec4(normal, 0.0)).xyz);
|
|
14
|
+
vec4 mv = modelViewMatrix * vec4(position, 1.0);
|
|
15
|
+
vViewDir = normalize(-mv.xyz);
|
|
16
|
+
gl_Position = projectionMatrix * mv;
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
// ── CORE: boiling solar surface ───────────────────────────────────────────────
|
|
20
|
+
const coreFrag = /* glsl */ `
|
|
21
|
+
uniform float u_time;
|
|
22
|
+
uniform vec3 uInnerColor;
|
|
23
|
+
uniform vec3 uOuterColor;
|
|
24
|
+
uniform float uOpacity;
|
|
25
|
+
uniform float uNoiseAmount;
|
|
26
|
+
uniform float uIntensity;
|
|
27
|
+
uniform float uPulseSpeed;
|
|
28
|
+
|
|
29
|
+
varying vec3 vNormal;
|
|
30
|
+
varying vec3 vViewDir;
|
|
31
|
+
varying vec3 vWorldNormal;
|
|
32
|
+
|
|
33
|
+
float hash(vec3 p){ return fract(sin(dot(p,vec3(127.1,311.7,74.7)))*43758.5453); }
|
|
34
|
+
float noise(vec3 p){
|
|
35
|
+
vec3 i=floor(p); vec3 f=fract(p); f=f*f*(3.-2.*f);
|
|
36
|
+
return mix(mix(mix(hash(i),hash(i+vec3(1,0,0)),f.x),mix(hash(i+vec3(0,1,0)),hash(i+vec3(1,1,0)),f.x),f.y),
|
|
37
|
+
mix(mix(hash(i+vec3(0,0,1)),hash(i+vec3(1,0,1)),f.x),mix(hash(i+vec3(0,1,1)),hash(i+vec3(1,1,1)),f.x),f.y),f.z);
|
|
38
|
+
}
|
|
39
|
+
// 6-octave FBM for rich surface detail
|
|
40
|
+
float fbm(vec3 p){
|
|
41
|
+
float v=0., a=0.5;
|
|
42
|
+
for(int i=0;i<6;i++){ v+=a*noise(p); p=p*2.13+vec3(1.7,9.2,3.7); a*=0.5; }
|
|
43
|
+
return v;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void main() {
|
|
47
|
+
// Animated surface boiling — rotate noise field over time
|
|
48
|
+
vec3 nCoord = vWorldNormal * 5.5 + vec3(u_time * 0.35, u_time * 0.18, u_time * -0.22);
|
|
49
|
+
float f = fbm(nCoord);
|
|
50
|
+
|
|
51
|
+
// Active regions: bright convective cells
|
|
52
|
+
float cells = smoothstep(0.54, 0.72, f) * 4.0;
|
|
53
|
+
// Cool lanes between cells (slightly darker)
|
|
54
|
+
float cool = (1.0 - smoothstep(0.38, 0.50, f)) * 0.3;
|
|
55
|
+
// Solar flares: ultra-sharp spikes where FBM peaks
|
|
56
|
+
float flares = smoothstep(0.70, 0.85, f) * 6.0;
|
|
57
|
+
|
|
58
|
+
float pulse = 0.85 + 0.15 * sin(u_time * uPulseSpeed * 2.3);
|
|
59
|
+
float limb = 1.0 - abs(dot(vNormal, vViewDir)) * 0.4; // limb darkening
|
|
60
|
+
|
|
61
|
+
// Color: white-hot core cells, outer-color cool lanes
|
|
62
|
+
vec3 col = mix(uOuterColor, uInnerColor, f * 1.8 + cells * 0.3);
|
|
63
|
+
col += uInnerColor * flares;
|
|
64
|
+
col -= uOuterColor * cool;
|
|
65
|
+
col *= pulse * limb * (1.0 + uNoiseAmount * cells);
|
|
66
|
+
|
|
67
|
+
float alpha = (0.85 + cells * 0.15) * uOpacity * uIntensity;
|
|
68
|
+
gl_FragColor = vec4(col, alpha);
|
|
69
|
+
}
|
|
70
|
+
`;
|
|
71
|
+
// ── PLASMA SHELL: iridescent + FBM tendrils ───────────────────────────────────
|
|
72
|
+
const plasmaFrag = /* glsl */ `
|
|
73
|
+
uniform float u_time;
|
|
74
|
+
uniform float uLayerIndex; // 0..1
|
|
75
|
+
uniform vec3 uInnerColor;
|
|
76
|
+
uniform vec3 uOuterColor;
|
|
77
|
+
uniform float uOpacity;
|
|
78
|
+
uniform float uNoiseAmount;
|
|
79
|
+
uniform float uPulseSpeed;
|
|
80
|
+
uniform float uIntensity;
|
|
81
|
+
|
|
82
|
+
varying vec3 vNormal;
|
|
83
|
+
varying vec3 vViewDir;
|
|
84
|
+
varying vec3 vWorldNormal;
|
|
85
|
+
|
|
86
|
+
vec3 hsv2rgb(float h, float s, float v){
|
|
87
|
+
vec3 rgb=clamp(abs(mod(h*6.+vec3(0.,4.,2.),6.)-3.)-1.,0.,1.);
|
|
88
|
+
return v*mix(vec3(1.),rgb,s);
|
|
89
|
+
}
|
|
90
|
+
float hash(vec3 p){ return fract(sin(dot(p,vec3(127.1,311.7,74.7)))*43758.5453); }
|
|
91
|
+
float noise(vec3 p){
|
|
92
|
+
vec3 i=floor(p); vec3 f=fract(p); f=f*f*(3.-2.*f);
|
|
93
|
+
return mix(mix(mix(hash(i),hash(i+vec3(1,0,0)),f.x),mix(hash(i+vec3(0,1,0)),hash(i+vec3(1,1,0)),f.x),f.y),
|
|
94
|
+
mix(mix(hash(i+vec3(0,0,1)),hash(i+vec3(1,0,1)),f.x),mix(hash(i+vec3(0,1,1)),hash(i+vec3(1,1,1)),f.x),f.y),f.z);
|
|
95
|
+
}
|
|
96
|
+
float fbm(vec3 p){ float v=0.,a=0.5; for(int i=0;i<5;i++){v+=a*noise(p);p=p*2.17+vec3(1.7,9.2,3.7);a*=0.5;} return v; }
|
|
97
|
+
|
|
98
|
+
void main() {
|
|
99
|
+
vec3 viewDir = normalize(vViewDir);
|
|
100
|
+
float ndv = abs(dot(vNormal, viewDir));
|
|
101
|
+
|
|
102
|
+
// Fresnel edge glow
|
|
103
|
+
float fresnel = pow(1.0 - ndv, 2.5 - uLayerIndex);
|
|
104
|
+
|
|
105
|
+
// 5-octave FBM driven by world normal + time
|
|
106
|
+
float f = fbm(vWorldNormal * (3.0 + uLayerIndex * 2.0) + vec3(u_time * (0.15 + uLayerIndex * 0.08)));
|
|
107
|
+
|
|
108
|
+
// Iridescent hue: shifts with view angle, layer depth, and time
|
|
109
|
+
float innerHue = 0.0; // derive from innerColor
|
|
110
|
+
float hue = mod(ndv * 0.5 - uLayerIndex * 0.2 + u_time * 0.05 + f * 0.15, 1.0);
|
|
111
|
+
vec3 iriCol = hsv2rgb(hue, 0.9 - uLayerIndex * 0.2, 1.0);
|
|
112
|
+
|
|
113
|
+
// Electric tendrils: sharp bright streamers where FBM exceeds threshold
|
|
114
|
+
float tendril = smoothstep(0.62 - uLayerIndex * 0.04, 0.78, f);
|
|
115
|
+
// Plasma cells: lower threshold dimmer glow
|
|
116
|
+
float plasma = smoothstep(0.50, 0.65, f) * 0.5;
|
|
117
|
+
|
|
118
|
+
float pulse = 0.6 + 0.4 * sin(u_time * uPulseSpeed + uLayerIndex * 2.4);
|
|
119
|
+
|
|
120
|
+
vec3 col = iriCol + iriCol * (tendril * 2.0 + plasma);
|
|
121
|
+
col = mix(col, uInnerColor, tendril * 0.3); // brightest tendrils go white
|
|
122
|
+
|
|
123
|
+
float noiseBlend = (1.0 - uNoiseAmount) + uNoiseAmount * f;
|
|
124
|
+
float alpha = fresnel * noiseBlend * uOpacity * pulse
|
|
125
|
+
* (1.0 - uLayerIndex * 0.28) * uIntensity;
|
|
126
|
+
if (alpha < 0.004) discard;
|
|
127
|
+
|
|
128
|
+
gl_FragColor = vec4(col, alpha);
|
|
129
|
+
}
|
|
130
|
+
`;
|
|
131
|
+
// ── OUTER DIFFUSE GLOW ────────────────────────────────────────────────────────
|
|
132
|
+
const glowFrag = /* glsl */ `
|
|
133
|
+
uniform float u_time;
|
|
134
|
+
uniform vec3 uOuterColor;
|
|
135
|
+
uniform float uOpacity;
|
|
136
|
+
uniform float uPulseSpeed;
|
|
137
|
+
|
|
138
|
+
varying vec3 vNormal;
|
|
139
|
+
varying vec3 vViewDir;
|
|
140
|
+
|
|
141
|
+
void main() {
|
|
142
|
+
float ndv = abs(dot(normalize(vNormal), normalize(vViewDir)));
|
|
143
|
+
float fresnel = pow(1.0 - ndv, 1.2);
|
|
144
|
+
float pulse = 0.55 + 0.45 * sin(u_time * uPulseSpeed * 0.7 + 1.2);
|
|
145
|
+
float alpha = fresnel * uOpacity * pulse * 0.5;
|
|
146
|
+
if (alpha < 0.003) discard;
|
|
147
|
+
// Slowly cycle hue of the outer glow
|
|
148
|
+
float hue = mod(u_time * 0.04, 1.0);
|
|
149
|
+
vec3 tint = mix(uOuterColor, vec3(cos(hue*6.28)*0.5+0.5, cos((hue+0.33)*6.28)*0.5+0.5, cos((hue+0.67)*6.28)*0.5+0.5), 0.25);
|
|
150
|
+
gl_FragColor = vec4(tint, alpha);
|
|
151
|
+
}
|
|
152
|
+
`;
|
|
153
|
+
// ── CORONA RING ───────────────────────────────────────────────────────────────
|
|
154
|
+
const coronaVert = /* glsl */ `
|
|
155
|
+
attribute float aAngle;
|
|
156
|
+
varying float vAngle;
|
|
157
|
+
void main() {
|
|
158
|
+
vAngle = aAngle;
|
|
159
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
160
|
+
}
|
|
161
|
+
`;
|
|
162
|
+
const coronaFrag = /* glsl */ `
|
|
163
|
+
uniform float u_time;
|
|
164
|
+
uniform vec3 uCoronaColor;
|
|
165
|
+
uniform float uOpacity;
|
|
166
|
+
uniform float uIntensity;
|
|
167
|
+
varying float vAngle;
|
|
168
|
+
|
|
169
|
+
vec3 hsv2rgb(float h, float s, float v){
|
|
170
|
+
vec3 rgb=clamp(abs(mod(h*6.+vec3(0.,4.,2.),6.)-3.)-1.,0.,1.);
|
|
171
|
+
return v*mix(vec3(1.),rgb,s);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
void main() {
|
|
175
|
+
// Color flows around the ring over time
|
|
176
|
+
float hue = mod(vAngle / 6.28318 + u_time * 0.15, 1.0);
|
|
177
|
+
vec3 col = mix(uCoronaColor, hsv2rgb(hue, 0.8, 1.0), 0.6);
|
|
178
|
+
// Pulse brightness
|
|
179
|
+
float pulse = 0.6 + 0.4 * sin(u_time * 2.5 + vAngle * 3.0);
|
|
180
|
+
float alpha = uOpacity * pulse * uIntensity;
|
|
181
|
+
gl_FragColor = vec4(col * (1.0 + pulse), alpha);
|
|
182
|
+
}
|
|
183
|
+
`;
|
|
184
|
+
const OrbEffect = ({ boundingRadius, config, animations }) => {
|
|
185
|
+
const { coreSize, glowLayers, innerColor, outerColor, coronaEnabled, coronaColor, noiseAmount, pulseSpeed, opacity, speed, intensity } = config;
|
|
186
|
+
const startValuesCacheRef = useRef({});
|
|
187
|
+
const innerColorVec = useMemo(() => { const c = new THREE.Color(innerColor); return new THREE.Vector3(c.r, c.g, c.b); }, [innerColor]);
|
|
188
|
+
const outerColorVec = useMemo(() => { const c = new THREE.Color(outerColor); return new THREE.Vector3(c.r, c.g, c.b); }, [outerColor]);
|
|
189
|
+
const coronaColorVec = useMemo(() => { const c = new THREE.Color(coronaColor); return new THREE.Vector3(c.r, c.g, c.b); }, [coronaColor]);
|
|
190
|
+
const coreR = boundingRadius * coreSize;
|
|
191
|
+
// Core material — boiling solar surface
|
|
192
|
+
const coreMat = useMemo(() => new THREE.ShaderMaterial({
|
|
193
|
+
vertexShader: sharedVert,
|
|
194
|
+
fragmentShader: coreFrag,
|
|
195
|
+
uniforms: {
|
|
196
|
+
u_time: { value: 0 },
|
|
197
|
+
uInnerColor: { value: innerColorVec },
|
|
198
|
+
uOuterColor: { value: outerColorVec },
|
|
199
|
+
uOpacity: { value: opacity },
|
|
200
|
+
uNoiseAmount: { value: noiseAmount },
|
|
201
|
+
uIntensity: { value: intensity },
|
|
202
|
+
uPulseSpeed: { value: pulseSpeed * speed },
|
|
203
|
+
},
|
|
204
|
+
transparent: true,
|
|
205
|
+
depthWrite: false,
|
|
206
|
+
blending: THREE.AdditiveBlending,
|
|
207
|
+
}), [innerColorVec, outerColorVec, opacity, noiseAmount, intensity, pulseSpeed, speed]);
|
|
208
|
+
// Plasma shell materials — one per layer
|
|
209
|
+
const shellMats = useMemo(() => Array.from({ length: glowLayers }, (_, i) => new THREE.ShaderMaterial({
|
|
210
|
+
vertexShader: sharedVert,
|
|
211
|
+
fragmentShader: plasmaFrag,
|
|
212
|
+
uniforms: {
|
|
213
|
+
u_time: { value: 0 },
|
|
214
|
+
uLayerIndex: { value: glowLayers > 1 ? i / (glowLayers - 1) : 0 },
|
|
215
|
+
uInnerColor: { value: innerColorVec },
|
|
216
|
+
uOuterColor: { value: outerColorVec },
|
|
217
|
+
uOpacity: { value: opacity },
|
|
218
|
+
uNoiseAmount: { value: noiseAmount },
|
|
219
|
+
uPulseSpeed: { value: pulseSpeed * speed },
|
|
220
|
+
uIntensity: { value: intensity },
|
|
221
|
+
},
|
|
222
|
+
transparent: true,
|
|
223
|
+
depthWrite: false,
|
|
224
|
+
blending: THREE.AdditiveBlending,
|
|
225
|
+
side: THREE.BackSide,
|
|
226
|
+
})), [glowLayers, innerColorVec, outerColorVec, opacity, noiseAmount, pulseSpeed, speed, intensity]);
|
|
227
|
+
// Outer diffuse glow
|
|
228
|
+
const glowMat = useMemo(() => new THREE.ShaderMaterial({
|
|
229
|
+
vertexShader: sharedVert,
|
|
230
|
+
fragmentShader: glowFrag,
|
|
231
|
+
uniforms: {
|
|
232
|
+
u_time: { value: 0 },
|
|
233
|
+
uOuterColor: { value: outerColorVec },
|
|
234
|
+
uOpacity: { value: opacity * 0.6 },
|
|
235
|
+
uPulseSpeed: { value: pulseSpeed * speed },
|
|
236
|
+
},
|
|
237
|
+
transparent: true,
|
|
238
|
+
depthWrite: false,
|
|
239
|
+
blending: THREE.AdditiveBlending,
|
|
240
|
+
side: THREE.BackSide,
|
|
241
|
+
}), [outerColorVec, opacity, pulseSpeed, speed]);
|
|
242
|
+
// Corona ring geometry — torus with per-vertex angle attribute for color flow
|
|
243
|
+
const { coronaGeo, coronaMat } = useMemo(() => {
|
|
244
|
+
const tubeSegs = 80;
|
|
245
|
+
const geo = new THREE.TorusGeometry(coreR * 2.8, coreR * 0.12, 8, tubeSegs);
|
|
246
|
+
const count = geo.attributes.position.count;
|
|
247
|
+
// Per-vertex angle around the ring (0 → 2π)
|
|
248
|
+
const angles = new Float32Array(count);
|
|
249
|
+
// TorusGeometry vertices go around the major circle; approximate angle from XZ
|
|
250
|
+
const pos = geo.attributes.position;
|
|
251
|
+
for (let i = 0; i < count; i++) {
|
|
252
|
+
angles[i] = Math.atan2(pos.getZ(i), pos.getX(i)) + Math.PI;
|
|
253
|
+
}
|
|
254
|
+
geo.setAttribute('aAngle', new THREE.BufferAttribute(angles, 1));
|
|
255
|
+
const mat = new THREE.ShaderMaterial({
|
|
256
|
+
vertexShader: coronaVert,
|
|
257
|
+
fragmentShader: coronaFrag,
|
|
258
|
+
uniforms: {
|
|
259
|
+
u_time: { value: 0 },
|
|
260
|
+
uCoronaColor: { value: coronaColorVec },
|
|
261
|
+
uOpacity: { value: opacity * 0.85 },
|
|
262
|
+
uIntensity: { value: intensity },
|
|
263
|
+
},
|
|
264
|
+
transparent: true,
|
|
265
|
+
depthWrite: false,
|
|
266
|
+
blending: THREE.AdditiveBlending,
|
|
267
|
+
});
|
|
268
|
+
return { coronaGeo: geo, coronaMat: mat };
|
|
269
|
+
}, [coreR, coronaColorVec, opacity, intensity]);
|
|
270
|
+
const coronaGroupRef = useRef(null);
|
|
271
|
+
const allMats = useMemo(() => [coreMat, ...shellMats, glowMat, coronaMat], [coreMat, shellMats, glowMat, coronaMat]);
|
|
272
|
+
useFrame((state, delta) => {
|
|
273
|
+
const t = state.clock.getElapsedTime();
|
|
274
|
+
for (const mat of allMats)
|
|
275
|
+
mat.uniforms.u_time.value = t;
|
|
276
|
+
// Tilt the corona ring and rotate slowly
|
|
277
|
+
if (coronaGroupRef.current) {
|
|
278
|
+
coronaGroupRef.current.rotation.z += delta * speed * 0.4;
|
|
279
|
+
}
|
|
280
|
+
if (animations?.length) {
|
|
281
|
+
applyGenerativeAnimations(allMats, animations, startValuesCacheRef.current, Date.now(), false);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
const glowR = coreR * (3.5 + glowLayers * 0.6);
|
|
285
|
+
return (_jsxs("group", { children: [_jsx("mesh", { material: coreMat, children: _jsx("sphereGeometry", { args: [coreR, 48, 48] }) }), Array.from({ length: glowLayers }, (_, i) => {
|
|
286
|
+
const layerT = glowLayers > 1 ? i / (glowLayers - 1) : 0;
|
|
287
|
+
const r = coreR * (1.35 + layerT * layerT * 1.8);
|
|
288
|
+
return (_jsx("mesh", { material: shellMats[i], children: _jsx("sphereGeometry", { args: [r, 40, 40] }) }, i));
|
|
289
|
+
}), _jsx("mesh", { material: glowMat, children: _jsx("sphereGeometry", { args: [glowR, 32, 32] }) }), coronaEnabled && (_jsx("group", { ref: coronaGroupRef, rotation: [Math.PI * 0.18, 0, Math.PI * 0.08], children: _jsx("mesh", { geometry: coronaGeo, material: coronaMat }) }))] }));
|
|
290
|
+
};
|
|
291
|
+
export default OrbEffect;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { PortalConfig, AnimationOptions } from '@ntalmagor/3drize-core';
|
|
3
|
+
interface PortalEffectProps {
|
|
4
|
+
boundingRadius: number;
|
|
5
|
+
config: PortalConfig;
|
|
6
|
+
animations?: AnimationOptions[];
|
|
7
|
+
}
|
|
8
|
+
declare const PortalEffect: React.FC<PortalEffectProps>;
|
|
9
|
+
export default PortalEffect;
|
|
10
|
+
//# sourceMappingURL=PortalEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortalEffect.d.ts","sourceRoot":"","sources":["../../../src/components/effects/PortalEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI7E,UAAU,iBAAiB;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC;AAmHD,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAmG7C,CAAC;AAEF,eAAe,YAAY,CAAC"}
|