@react-three/drei 9.51.24 → 9.52.1

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/README.md CHANGED
@@ -195,6 +195,7 @@ The `native` route of the library **does not** export `Html` or `Loader`. The de
195
195
  <li><a href="#lightformer">Lightformer</a></li>
196
196
  <li><a href="#spotlight">SpotLight</a></li>
197
197
  <li><a href="#shadow">Shadow</a></li>
198
+ <li><a href="#caustics">Caustics</a></li>
198
199
  <li><a href="#contactshadows">ContactShadows</a></li>
199
200
  <li><a href="#randomizedlight">RandomizedLight</a></li>
200
201
  <li><a href="#accumulativeshadows">AccumulativeShadows</a></li>
@@ -3105,6 +3106,70 @@ A cheap canvas-texture-based circular gradient.
3105
3106
  />
3106
3107
  ```
3107
3108
 
3109
+ #### Caustics
3110
+
3111
+ <p>
3112
+ <a href="https://codesandbox.io/s/szj6p7"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/szj6p7/screenshot.png" alt="Demo"/></a>
3113
+ <a href="https://codesandbox.io/s/g7wbe0"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/g7wbe0/screenshot.png" alt="Demo"/></a>
3114
+ </p>
3115
+
3116
+ Caustics are swirls of light that appear when light passes through transmissive surfaces. This component uses a raymarching technique to project caustics onto a catcher plane. It is based on [github/N8python/caustics](https://github.com/N8python/caustics).
3117
+
3118
+ ```tsx
3119
+ type CausticsProps = JSX.IntrinsicElements['group'] & {
3120
+ /** Enables visual cues to help you stage your scene, default: false */
3121
+ debug?: boolean
3122
+ /** Will display caustics only and skip the models, default: false */
3123
+ causticsOnly: boolean
3124
+ /** Will include back faces and enable the backfaceIor prop, default: false */
3125
+ backfaces: boolean
3126
+ /** The size of the camera frustum, default: 2 */
3127
+ frustum?: number
3128
+ /** The IOR refraction index, default: 1.1 */
3129
+ ior?: number
3130
+ /** The IOR refraction index for back faces (only available when backfaces is enabled), default: 1.1 */
3131
+ backfaceIor?: number
3132
+ /** The texel size, default: 0.3125 */
3133
+ worldRadius?: number
3134
+ /** Intensity of the prjected caustics, default: 0.05 */
3135
+ intensity?: number
3136
+ /** Caustics color, default: white */
3137
+ color?: ReactThreeFiber.Color
3138
+ /** Buffer resolution, default: 2048 */
3139
+ resolution?: number
3140
+ /** Camera near, default: 0.1 */
3141
+ near?: number
3142
+ /** Camera far, default: 100 */
3143
+ far?: number
3144
+ /** Camera position, default: [5, 5, 5] */
3145
+ lightSource?: [x: number, y: number, z: number]
3146
+ /** Camera lookAt, default: [0, 0, 0] */
3147
+ focus?: [x: number, y: number, z: number]
3148
+ }
3149
+ ```
3150
+
3151
+ It will create a transparent plane that blends the caustics of the objects it receives into your scene. It will only render once and not take resources any longer!
3152
+
3153
+ Make sure to use the `debug` flag to help you stage your contents. Like ContactShadows and AccumulativeShadows the plane faces Y up. It is recommended to use [leva](https://github.com/pmndrs/leva) to configue the props above as some can be micro fractional depending on the models (intensity, worldRadius, ior and backfaceIor especially).
3154
+
3155
+ ```jsx
3156
+ <Caustics debug backfaces lightSource={[2.5, 5, -2.5]} frustum={4}>
3157
+ <Bottle />
3158
+ <WineGlass>
3159
+ </Caustics>
3160
+ ```
3161
+
3162
+ Sometimes you want to combine caustics for even better visuals, or if you want to emulate multiple lightsources. Use the `causticsOnly` flag in such cases and it will use the model inside only for calculations. Since all loaders in Fiber should be cached there is no expense or memory overhead doing this.
3163
+
3164
+ ```jsx
3165
+ <Caustics lightSource={[2.5, 5, -2.5]} >
3166
+ <WineGlass />
3167
+ </Caustics>
3168
+ <Caustics causticsOnly lightSource={[-2.5, 5, 2.5]} ior={0.79} worldRadius={0.0124}>
3169
+ <WineGlass />
3170
+ </Caustics>
3171
+ ```
3172
+
3108
3173
  #### ContactShadows
3109
3174
 
3110
3175
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-contactshadows--contact-shadow-st)
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),n=require("react"),t=require("@react-three/fiber"),i=require("./useFBO.cjs.js"),o=require("./useHelper.cjs.js"),a=require("./shaderMaterial.cjs.js"),l=require("three-stdlib");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,t.get?t:{enumerable:!0,get:function(){return e[n]}})}})),r.default=e,Object.freeze(r)}var u=c(e),d=s(r),v=s(n);function f(e=d.FrontSide){const r={value:new d.Matrix4};return Object.assign(new d.MeshNormalMaterial({side:e}),{viewMatrix:r,onBeforeCompile:e=>{e.uniforms.viewMatrix=r,e.fragmentShader="vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n }\n"+e.fragmentShader.replace("#include <normal_fragment_maps>","#include <normal_fragment_maps>\n normal = inverseTransformDirection( normal, viewMatrix );\n")}})}const p=a.shaderMaterial({causticsTexture:null,causticsTextureB:null,color:new d.Color,lightProjMatrix:new d.Matrix4,lightViewMatrix:new d.Matrix4},"varying vec3 vWorldPosition; \n void main() {\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\n vec4 worldPosition = modelMatrix * vec4(position, 1.);\n vWorldPosition = worldPosition.xyz;\n }","varying vec3 vWorldPosition;\n uniform sampler2D causticsTexture; \n uniform sampler2D causticsTextureB; \n uniform mat4 lightProjMatrix;\n uniform mat4 lightViewMatrix;\n void main() {\n // Apply caustics \n vec4 lightSpacePos = lightProjMatrix * lightViewMatrix * vec4(vWorldPosition, 1.0);\n lightSpacePos.xyz /= lightSpacePos.w;\n lightSpacePos.xyz = lightSpacePos.xyz * 0.5 + 0.5; \n vec3 front = texture2D(causticsTexture, lightSpacePos.xy).rgb;\n vec3 back = texture2D(causticsTextureB, lightSpacePos.xy).rgb;\n gl_FragColor = vec4(front + back, 1.0);\n #include <tonemapping_fragment>\n #include <encodings_fragment>\n }"),m=a.shaderMaterial({cameraMatrixWorld:new d.Matrix4,cameraProjectionMatrixInv:new d.Matrix4,normalTexture:null,depthTexture:null,lightDir:new d.Vector3(0,1,0),near:.1,far:100,modelMatrix:new d.Matrix4,worldRadius:1/40,ior:1.1,bounces:0,resolution:1024,size:10,intensity:.5},"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }"," \n uniform mat4 cameraMatrixWorld;\n uniform mat4 cameraProjectionMatrixInv;\n uniform vec3 lightDir;\n uniform float near;\n uniform float far;\n uniform float time;\n uniform float worldRadius;\n uniform float resolution;\n uniform float size;\n uniform float intensity;\n uniform float ior;\n precision highp isampler2D;\n precision highp usampler2D;\n uniform sampler2D normalTexture;\n uniform sampler2D depthTexture;\n uniform float bounces;\n varying vec2 vUv;\n vec3 WorldPosFromDepth(float depth, vec2 coord) {\n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = cameraProjectionMatrixInv * clipSpacePosition;\n // Perspective division\n viewSpacePosition /= viewSpacePosition.w;\n vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;\n return worldSpacePosition.xyz;\n } \n float sdPlane( vec3 p, vec3 n, float h ) {\n // n must be normalized\n return dot(p,n) + h;\n }\n float planeIntersect( vec3 ro, vec3 rd, vec4 p ) {\n return -(dot(ro,p.xyz)+p.w)/dot(rd,p.xyz);\n }\n vec3 totalInternalReflection(vec3 ro, vec3 rd, vec3 pos, vec3 normal, float ior, out vec3 rayOrigin, out vec3 rayDirection) {\n rayOrigin = ro;\n rayDirection = rd;\n rayDirection = refract(rayDirection, normal, 1.0 / ior);\n rayOrigin = pos + rayDirection * 0.1;\n return rayDirection;\n }\n void main() {\n // Each sample consists of random offset in the x and y direction\n float caustic = 0.0;\n float causticTexelSize = (1.0 / resolution) * size * 2.0;\n float texelsNeeded = worldRadius / causticTexelSize;\n float sampleRadius = texelsNeeded / resolution;\n float sum = 0.0;\n if (texture2D(depthTexture, vUv).x == 1.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n vec2 offset1 = vec2(-0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);\n vec2 offset2 = vec2(-0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);\n vec2 offset3 = vec2(0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);\n vec2 offset4 = vec2(0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);\n vec2 uv1 = vUv + offset1 * sampleRadius;\n vec2 uv2 = vUv + offset2 * sampleRadius;\n vec2 uv3 = vUv + offset3 * sampleRadius;\n vec2 uv4 = vUv + offset4 * sampleRadius;\n vec3 normal1 = texture2D(normalTexture, uv1, -10.0).rgb * 2.0 - 1.0;\n vec3 normal2 = texture2D(normalTexture, uv2, -10.0).rgb * 2.0 - 1.0;\n vec3 normal3 = texture2D(normalTexture, uv3, -10.0).rgb * 2.0 - 1.0;\n vec3 normal4 = texture2D(normalTexture, uv4, -10.0).rgb * 2.0 - 1.0;\n float depth1 = texture2D(depthTexture, uv1, -10.0).x;\n float depth2 = texture2D(depthTexture, uv2, -10.0).x;\n float depth3 = texture2D(depthTexture, uv3, -10.0).x;\n float depth4 = texture2D(depthTexture, uv4, -10.0).x;\n // Sanity check the depths\n if (depth1 == 1.0 || depth2 == 1.0 || depth3 == 1.0 || depth4 == 1.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n return;\n }\n vec3 pos1 = WorldPosFromDepth(depth1, uv1);\n vec3 pos2 = WorldPosFromDepth(depth2, uv2);\n vec3 pos3 = WorldPosFromDepth(depth3, uv3);\n vec3 pos4 = WorldPosFromDepth(depth4, uv4);\n vec3 originPos1 = WorldPosFromDepth(0.0, uv1);\n vec3 originPos2 = WorldPosFromDepth(0.0, uv2);\n vec3 originPos3 = WorldPosFromDepth(0.0, uv3);\n vec3 originPos4 = WorldPosFromDepth(0.0, uv4);\n vec3 endPos1, endPos2, endPos3, endPos4;\n vec3 endDir1, endDir2, endDir3, endDir4;\n totalInternalReflection(originPos1, lightDir, pos1, normal1, ior, endPos1, endDir1);\n totalInternalReflection(originPos2, lightDir, pos2, normal2, ior, endPos2, endDir2);\n totalInternalReflection(originPos3, lightDir, pos3, normal3, ior, endPos3, endDir3);\n totalInternalReflection(originPos4, lightDir, pos4, normal4, ior, endPos4, endDir4);\n float lightPosArea = length(cross(originPos2 - originPos1, originPos3 - originPos1)) + length(cross(originPos3 - originPos1, originPos4 - originPos1));\n float t1 = planeIntersect(endPos1, endDir1, vec4(0.0, 1.0, 0.0, 0.0));\n float t2 = planeIntersect(endPos2, endDir2, vec4(0.0, 1.0, 0.0, 0.0));\n float t3 = planeIntersect(endPos3, endDir3, vec4(0.0, 1.0, 0.0, 0.0));\n float t4 = planeIntersect(endPos4, endDir4, vec4(0.0, 1.0, 0.0, 0.0));\n vec3 finalPos1 = endPos1 + endDir1 * t1;\n vec3 finalPos2 = endPos2 + endDir2 * t2;\n vec3 finalPos3 = endPos3 + endDir3 * t3;\n vec3 finalPos4 = endPos4 + endDir4 * t4;\n float finalArea = length(cross(finalPos2 - finalPos1, finalPos3 - finalPos1)) + length(cross(finalPos3 - finalPos1, finalPos4 - finalPos1));\n caustic += intensity * (lightPosArea / finalArea);\n // Calculate the area of the triangle in light spaces\n gl_FragColor = vec4(vec3(max(caustic, 0.0)), 1.0);\n }"),x={depth:!0,minFilter:d.LinearFilter,magFilter:d.LinearFilter,encoding:d.LinearEncoding,type:d.UnsignedByteType},g={minFilter:d.LinearMipmapLinearFilter,magFilter:d.LinearFilter,encoding:d.LinearEncoding,format:d.RGBAFormat,type:d.FloatType,generateMipmaps:!0},h=v.forwardRef((({debug:e,children:r,frustum:n=2,ior:a=1.1,color:c="white",causticsOnly:s=!1,backfaces:h=!1,backfaceIor:P=1.1,worldRadius:D=.3125,intensity:M=.05,resolution:y=2024,near:w=.1,far:T=100,lightSource:b=[5,5,5],focus:F=[0,0,0],...S},j)=>{t.extend({CausticsProjectionMaterial:p});const R=v.useRef(null),W=v.useRef(null),z=v.useRef(null),I=v.useRef(null),O=t.useThree((e=>e.gl)),_=o.useHelper(e&&W,d.CameraHelper),B=o.useHelper(e&&I,d.BoxHelper),C=i.useFBO(y,y,x),E=i.useFBO(y,y,x),U=i.useFBO(y,y,g),k=i.useFBO(y,y,g),[q]=v.useState((()=>f())),[A]=v.useState((()=>f(d.BackSide))),[L]=v.useState((()=>new m)),[V]=v.useState((()=>new l.FullScreenQuad(L))),H=new d.Vector3;return v.useLayoutEffect((()=>{var r,t;(R.current.updateWorldMatrix(!1,!0),W.current.position.set(...b),W.current.lookAt(...F),W.current.updateWorldMatrix(!1,!1),W.current.updateProjectionMatrix(),e)&&(null==(r=_.current)||r.update(),null==(t=B.current)||t.update());A.viewMatrix.value=q.viewMatrix.value=W.current.matrixWorldInverse,L.cameraMatrixWorld=W.current.matrixWorld,L.cameraProjectionMatrixInv=W.current.projectionMatrixInverse,L.lightDir=W.current.getWorldPosition(H).normalize().multiplyScalar(-1),L.near=W.current.near,L.far=W.current.far,L.resolution=y,L.size=n,L.intensity=M,L.worldRadius=D,z.current.visible=!0,O.setRenderTarget(C),O.clear(),z.current.overrideMaterial=q,O.render(z.current,W.current),O.setRenderTarget(E),O.clear(),h&&(z.current.overrideMaterial=A,O.render(z.current,W.current)),z.current.overrideMaterial=null,L.ior=a,I.current.material.lightProjMatrix=W.current.projectionMatrix,I.current.material.lightViewMatrix=W.current.matrixWorldInverse,L.normalTexture=C.texture,L.depthTexture=C.depthTexture,O.setRenderTarget(U),O.clear(),V.render(O),L.ior=P,L.normalTexture=E.texture,L.depthTexture=E.depthTexture,O.setRenderTarget(k),O.clear(),h&&V.render(O),O.setRenderTarget(null),s&&(z.current.visible=!1)})),v.createElement("group",u.default({ref:R},S),v.createElement("orthographicCamera",{ref:W,up:[0,1,0],left:-n,right:n,top:n,bottom:-n,near:w,far:T}),v.createElement("scene",{ref:z},r),v.createElement("mesh",{ref:I,"rotation-x":-Math.PI/2,scale:2*n},v.createElement("planeGeometry",null),v.createElement("causticsProjectionMaterial",{transparent:!0,color:c,causticsTexture:U.texture,causticsTextureB:k.texture,blending:d.CustomBlending,blendSrc:d.OneFactor,blendDst:d.SrcAlphaFactor,depthWrite:!1})))}));exports.Caustics=h;
@@ -0,0 +1,53 @@
1
+ import * as THREE from 'three';
2
+ import * as React from 'react';
3
+ import { ReactThreeFiber } from '@react-three/fiber';
4
+ declare global {
5
+ namespace JSX {
6
+ interface IntrinsicElements {
7
+ causticsProjectionMaterial: ReactThreeFiber.MeshNormalMaterialProps & {
8
+ viewMatrix?: {
9
+ value: THREE.Matrix4;
10
+ };
11
+ color?: ReactThreeFiber.Color;
12
+ causticsTexture?: THREE.Texture;
13
+ causticsTextureB?: THREE.Texture;
14
+ lightProjMatrix?: THREE.Matrix4;
15
+ lightViewMatrix?: THREE.Matrix4;
16
+ };
17
+ }
18
+ }
19
+ }
20
+ export declare const Caustics: React.ForwardRefExoticComponent<Pick<Omit<ReactThreeFiber.ExtendedColors<ReactThreeFiber.Overwrite<Partial<THREE.Group>, ReactThreeFiber.NodeProps<THREE.Group, typeof THREE.Group>>>, ReactThreeFiber.NonFunctionKeys<{
21
+ position?: ReactThreeFiber.Vector3 | undefined;
22
+ up?: ReactThreeFiber.Vector3 | undefined;
23
+ scale?: ReactThreeFiber.Vector3 | undefined;
24
+ rotation?: ReactThreeFiber.Euler | undefined;
25
+ matrix?: ReactThreeFiber.Matrix4 | undefined;
26
+ quaternion?: ReactThreeFiber.Quaternion | undefined;
27
+ layers?: ReactThreeFiber.Layers | undefined;
28
+ dispose?: (() => void) | null | undefined;
29
+ }>> & {
30
+ position?: ReactThreeFiber.Vector3 | undefined;
31
+ up?: ReactThreeFiber.Vector3 | undefined;
32
+ scale?: ReactThreeFiber.Vector3 | undefined;
33
+ rotation?: ReactThreeFiber.Euler | undefined;
34
+ matrix?: ReactThreeFiber.Matrix4 | undefined;
35
+ quaternion?: ReactThreeFiber.Quaternion | undefined;
36
+ layers?: ReactThreeFiber.Layers | undefined;
37
+ dispose?: (() => void) | null | undefined;
38
+ } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
39
+ debug?: boolean | undefined;
40
+ causticsOnly: boolean;
41
+ backfaces: boolean;
42
+ frustum?: number | undefined;
43
+ ior?: number | undefined;
44
+ backfaceIor?: number | undefined;
45
+ worldRadius?: number | undefined;
46
+ intensity?: number | undefined;
47
+ color?: ReactThreeFiber.Color | undefined;
48
+ resolution?: number | undefined;
49
+ near?: number | undefined;
50
+ far?: number | undefined;
51
+ lightSource?: [x: number, y: number, z: number] | undefined;
52
+ focus?: [x: number, y: number, z: number] | undefined;
53
+ }, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "color" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "near" | "far" | "intensity" | "focus" | "ior" | "resolution" | "debug" | "frustum" | "worldRadius" | "causticsOnly" | "backfaces" | "backfaceIor" | "lightSource"> & React.RefAttributes<unknown>>;
@@ -0,0 +1,329 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as THREE from 'three';
3
+ import * as React from 'react';
4
+ import { extend, useThree } from '@react-three/fiber';
5
+ import { useFBO } from './useFBO.js';
6
+ import { useHelper } from './useHelper.js';
7
+ import { shaderMaterial } from './shaderMaterial.js';
8
+ import { FullScreenQuad } from 'three-stdlib';
9
+
10
+ function createNormalMaterial(side = THREE.FrontSide) {
11
+ const viewMatrix = {
12
+ value: new THREE.Matrix4()
13
+ };
14
+ return Object.assign(new THREE.MeshNormalMaterial({
15
+ side
16
+ }), {
17
+ viewMatrix,
18
+ onBeforeCompile: shader => {
19
+ shader.uniforms.viewMatrix = viewMatrix;
20
+ shader.fragmentShader = `vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {
21
+ return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );
22
+ }\n` + shader.fragmentShader.replace('#include <normal_fragment_maps>', `#include <normal_fragment_maps>
23
+ normal = inverseTransformDirection( normal, viewMatrix );\n`);
24
+ }
25
+ });
26
+ }
27
+
28
+ const CausticsProjectionMaterial = shaderMaterial({
29
+ causticsTexture: null,
30
+ causticsTextureB: null,
31
+ color: new THREE.Color(),
32
+ lightProjMatrix: new THREE.Matrix4(),
33
+ lightViewMatrix: new THREE.Matrix4()
34
+ }, `varying vec3 vWorldPosition;
35
+ void main() {
36
+ gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);
37
+ vec4 worldPosition = modelMatrix * vec4(position, 1.);
38
+ vWorldPosition = worldPosition.xyz;
39
+ }`, `varying vec3 vWorldPosition;
40
+ uniform sampler2D causticsTexture;
41
+ uniform sampler2D causticsTextureB;
42
+ uniform mat4 lightProjMatrix;
43
+ uniform mat4 lightViewMatrix;
44
+ void main() {
45
+ // Apply caustics
46
+ vec4 lightSpacePos = lightProjMatrix * lightViewMatrix * vec4(vWorldPosition, 1.0);
47
+ lightSpacePos.xyz /= lightSpacePos.w;
48
+ lightSpacePos.xyz = lightSpacePos.xyz * 0.5 + 0.5;
49
+ vec3 front = texture2D(causticsTexture, lightSpacePos.xy).rgb;
50
+ vec3 back = texture2D(causticsTextureB, lightSpacePos.xy).rgb;
51
+ gl_FragColor = vec4(front + back, 1.0);
52
+ #include <tonemapping_fragment>
53
+ #include <encodings_fragment>
54
+ }`);
55
+ const CausticsMaterial = shaderMaterial({
56
+ cameraMatrixWorld: new THREE.Matrix4(),
57
+ cameraProjectionMatrixInv: new THREE.Matrix4(),
58
+ normalTexture: null,
59
+ depthTexture: null,
60
+ lightDir: new THREE.Vector3(0, 1, 0),
61
+ near: 0.1,
62
+ far: 100,
63
+ modelMatrix: new THREE.Matrix4(),
64
+ worldRadius: 1 / 40,
65
+ ior: 1.1,
66
+ bounces: 0,
67
+ resolution: 1024,
68
+ size: 10,
69
+ intensity: 0.5
70
+ },
71
+ /* glsl */
72
+ `
73
+ varying vec2 vUv;
74
+ void main() {
75
+ vUv = uv;
76
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
77
+ }`,
78
+ /* glsl */
79
+ `
80
+ uniform mat4 cameraMatrixWorld;
81
+ uniform mat4 cameraProjectionMatrixInv;
82
+ uniform vec3 lightDir;
83
+ uniform float near;
84
+ uniform float far;
85
+ uniform float time;
86
+ uniform float worldRadius;
87
+ uniform float resolution;
88
+ uniform float size;
89
+ uniform float intensity;
90
+ uniform float ior;
91
+ precision highp isampler2D;
92
+ precision highp usampler2D;
93
+ uniform sampler2D normalTexture;
94
+ uniform sampler2D depthTexture;
95
+ uniform float bounces;
96
+ varying vec2 vUv;
97
+ vec3 WorldPosFromDepth(float depth, vec2 coord) {
98
+ float z = depth * 2.0 - 1.0;
99
+ vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
100
+ vec4 viewSpacePosition = cameraProjectionMatrixInv * clipSpacePosition;
101
+ // Perspective division
102
+ viewSpacePosition /= viewSpacePosition.w;
103
+ vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
104
+ return worldSpacePosition.xyz;
105
+ }
106
+ float sdPlane( vec3 p, vec3 n, float h ) {
107
+ // n must be normalized
108
+ return dot(p,n) + h;
109
+ }
110
+ float planeIntersect( vec3 ro, vec3 rd, vec4 p ) {
111
+ return -(dot(ro,p.xyz)+p.w)/dot(rd,p.xyz);
112
+ }
113
+ vec3 totalInternalReflection(vec3 ro, vec3 rd, vec3 pos, vec3 normal, float ior, out vec3 rayOrigin, out vec3 rayDirection) {
114
+ rayOrigin = ro;
115
+ rayDirection = rd;
116
+ rayDirection = refract(rayDirection, normal, 1.0 / ior);
117
+ rayOrigin = pos + rayDirection * 0.1;
118
+ return rayDirection;
119
+ }
120
+ void main() {
121
+ // Each sample consists of random offset in the x and y direction
122
+ float caustic = 0.0;
123
+ float causticTexelSize = (1.0 / resolution) * size * 2.0;
124
+ float texelsNeeded = worldRadius / causticTexelSize;
125
+ float sampleRadius = texelsNeeded / resolution;
126
+ float sum = 0.0;
127
+ if (texture2D(depthTexture, vUv).x == 1.0) {
128
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
129
+ return;
130
+ }
131
+ vec2 offset1 = vec2(-0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
132
+ vec2 offset2 = vec2(-0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
133
+ vec2 offset3 = vec2(0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
134
+ vec2 offset4 = vec2(0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
135
+ vec2 uv1 = vUv + offset1 * sampleRadius;
136
+ vec2 uv2 = vUv + offset2 * sampleRadius;
137
+ vec2 uv3 = vUv + offset3 * sampleRadius;
138
+ vec2 uv4 = vUv + offset4 * sampleRadius;
139
+ vec3 normal1 = texture2D(normalTexture, uv1, -10.0).rgb * 2.0 - 1.0;
140
+ vec3 normal2 = texture2D(normalTexture, uv2, -10.0).rgb * 2.0 - 1.0;
141
+ vec3 normal3 = texture2D(normalTexture, uv3, -10.0).rgb * 2.0 - 1.0;
142
+ vec3 normal4 = texture2D(normalTexture, uv4, -10.0).rgb * 2.0 - 1.0;
143
+ float depth1 = texture2D(depthTexture, uv1, -10.0).x;
144
+ float depth2 = texture2D(depthTexture, uv2, -10.0).x;
145
+ float depth3 = texture2D(depthTexture, uv3, -10.0).x;
146
+ float depth4 = texture2D(depthTexture, uv4, -10.0).x;
147
+ // Sanity check the depths
148
+ if (depth1 == 1.0 || depth2 == 1.0 || depth3 == 1.0 || depth4 == 1.0) {
149
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
150
+ return;
151
+ }
152
+ vec3 pos1 = WorldPosFromDepth(depth1, uv1);
153
+ vec3 pos2 = WorldPosFromDepth(depth2, uv2);
154
+ vec3 pos3 = WorldPosFromDepth(depth3, uv3);
155
+ vec3 pos4 = WorldPosFromDepth(depth4, uv4);
156
+ vec3 originPos1 = WorldPosFromDepth(0.0, uv1);
157
+ vec3 originPos2 = WorldPosFromDepth(0.0, uv2);
158
+ vec3 originPos3 = WorldPosFromDepth(0.0, uv3);
159
+ vec3 originPos4 = WorldPosFromDepth(0.0, uv4);
160
+ vec3 endPos1, endPos2, endPos3, endPos4;
161
+ vec3 endDir1, endDir2, endDir3, endDir4;
162
+ totalInternalReflection(originPos1, lightDir, pos1, normal1, ior, endPos1, endDir1);
163
+ totalInternalReflection(originPos2, lightDir, pos2, normal2, ior, endPos2, endDir2);
164
+ totalInternalReflection(originPos3, lightDir, pos3, normal3, ior, endPos3, endDir3);
165
+ totalInternalReflection(originPos4, lightDir, pos4, normal4, ior, endPos4, endDir4);
166
+ float lightPosArea = length(cross(originPos2 - originPos1, originPos3 - originPos1)) + length(cross(originPos3 - originPos1, originPos4 - originPos1));
167
+ float t1 = planeIntersect(endPos1, endDir1, vec4(0.0, 1.0, 0.0, 0.0));
168
+ float t2 = planeIntersect(endPos2, endDir2, vec4(0.0, 1.0, 0.0, 0.0));
169
+ float t3 = planeIntersect(endPos3, endDir3, vec4(0.0, 1.0, 0.0, 0.0));
170
+ float t4 = planeIntersect(endPos4, endDir4, vec4(0.0, 1.0, 0.0, 0.0));
171
+ vec3 finalPos1 = endPos1 + endDir1 * t1;
172
+ vec3 finalPos2 = endPos2 + endDir2 * t2;
173
+ vec3 finalPos3 = endPos3 + endDir3 * t3;
174
+ vec3 finalPos4 = endPos4 + endDir4 * t4;
175
+ float finalArea = length(cross(finalPos2 - finalPos1, finalPos3 - finalPos1)) + length(cross(finalPos3 - finalPos1, finalPos4 - finalPos1));
176
+ caustic += intensity * (lightPosArea / finalArea);
177
+ // Calculate the area of the triangle in light spaces
178
+ gl_FragColor = vec4(vec3(max(caustic, 0.0)), 1.0);
179
+ }`);
180
+ const NORMALPROPS = {
181
+ depth: true,
182
+ minFilter: THREE.LinearFilter,
183
+ magFilter: THREE.LinearFilter,
184
+ encoding: THREE.LinearEncoding,
185
+ type: THREE.UnsignedByteType
186
+ };
187
+ const CAUSTICPROPS = {
188
+ minFilter: THREE.LinearMipmapLinearFilter,
189
+ magFilter: THREE.LinearFilter,
190
+ encoding: THREE.LinearEncoding,
191
+ format: THREE.RGBAFormat,
192
+ type: THREE.FloatType,
193
+ generateMipmaps: true
194
+ };
195
+ const Caustics = /*#__PURE__*/React.forwardRef(({
196
+ debug,
197
+ children,
198
+ frustum = 2,
199
+ ior = 1.1,
200
+ color = 'white',
201
+ causticsOnly = false,
202
+ backfaces = false,
203
+ backfaceIor = 1.1,
204
+ worldRadius = 0.3125,
205
+ intensity = 0.05,
206
+ resolution = 2024,
207
+ near = 0.1,
208
+ far = 100,
209
+ lightSource = [5, 5, 5],
210
+ focus = [0, 0, 0],
211
+ ...props
212
+ }, fref) => {
213
+ extend({
214
+ CausticsProjectionMaterial
215
+ });
216
+ const ref = React.useRef(null);
217
+ const camera = React.useRef(null);
218
+ const scene = React.useRef(null);
219
+ const plane = React.useRef(null);
220
+ const gl = useThree(state => state.gl);
221
+ const helper = useHelper(debug && camera, THREE.CameraHelper);
222
+ const boxHelper = useHelper(debug && plane, THREE.BoxHelper); // Buffers for front and back faces
223
+
224
+ const normalTarget = useFBO(resolution, resolution, NORMALPROPS);
225
+ const normalTargetB = useFBO(resolution, resolution, NORMALPROPS);
226
+ const causticsTarget = useFBO(resolution, resolution, CAUSTICPROPS);
227
+ const causticsTargetB = useFBO(resolution, resolution, CAUSTICPROPS); // Normal materials for front and back faces
228
+
229
+ const [normalMat] = React.useState(() => createNormalMaterial());
230
+ const [normalMatB] = React.useState(() => createNormalMaterial(THREE.BackSide)); // The quad that catches the caustics
231
+
232
+ const [causticsMaterial] = React.useState(() => new CausticsMaterial());
233
+ const [causticsQuad] = React.useState(() => new FullScreenQuad(causticsMaterial));
234
+ const pos = new THREE.Vector3();
235
+ React.useLayoutEffect(() => {
236
+ // Update matrix world and the camera
237
+ ref.current.updateWorldMatrix(false, true);
238
+ camera.current.position.set(...lightSource);
239
+ camera.current.lookAt(...focus);
240
+ camera.current.updateWorldMatrix(false, false);
241
+ camera.current.updateProjectionMatrix();
242
+
243
+ if (debug) {
244
+ var _helper$current, _boxHelper$current;
245
+
246
+ (_helper$current = helper.current) == null ? void 0 : _helper$current.update();
247
+ (_boxHelper$current = boxHelper.current) == null ? void 0 : _boxHelper$current.update();
248
+ } // Inject uniforms
249
+
250
+
251
+ normalMatB.viewMatrix.value = normalMat.viewMatrix.value = camera.current.matrixWorldInverse;
252
+ causticsMaterial.cameraMatrixWorld = camera.current.matrixWorld;
253
+ causticsMaterial.cameraProjectionMatrixInv = camera.current.projectionMatrixInverse;
254
+ causticsMaterial.lightDir = camera.current.getWorldPosition(pos).normalize().multiplyScalar(-1);
255
+ causticsMaterial.near = camera.current.near;
256
+ causticsMaterial.far = camera.current.far;
257
+ causticsMaterial.resolution = resolution;
258
+ causticsMaterial.size = frustum;
259
+ causticsMaterial.intensity = intensity;
260
+ causticsMaterial.worldRadius = worldRadius; // Switch the scene on
261
+
262
+ scene.current.visible = true; // Render front face normals
263
+
264
+ gl.setRenderTarget(normalTarget);
265
+ gl.clear();
266
+ scene.current.overrideMaterial = normalMat;
267
+ gl.render(scene.current, camera.current); // Render back face normals, if enabled
268
+
269
+ gl.setRenderTarget(normalTargetB);
270
+ gl.clear();
271
+
272
+ if (backfaces) {
273
+ scene.current.overrideMaterial = normalMatB;
274
+ gl.render(scene.current, camera.current);
275
+ } // Remove the override material
276
+
277
+
278
+ scene.current.overrideMaterial = null; // Render front face caustics
279
+
280
+ causticsMaterial.ior = ior;
281
+ plane.current.material.lightProjMatrix = camera.current.projectionMatrix;
282
+ plane.current.material.lightViewMatrix = camera.current.matrixWorldInverse;
283
+ causticsMaterial.normalTexture = normalTarget.texture;
284
+ causticsMaterial.depthTexture = normalTarget.depthTexture;
285
+ gl.setRenderTarget(causticsTarget);
286
+ gl.clear();
287
+ causticsQuad.render(gl); // Render back face caustics, if enabled
288
+
289
+ causticsMaterial.ior = backfaceIor;
290
+ causticsMaterial.normalTexture = normalTargetB.texture;
291
+ causticsMaterial.depthTexture = normalTargetB.depthTexture;
292
+ gl.setRenderTarget(causticsTargetB);
293
+ gl.clear();
294
+ if (backfaces) causticsQuad.render(gl); // Reset render target
295
+
296
+ gl.setRenderTarget(null); // Switch the scene off if caustics is all that's wanted
297
+
298
+ if (causticsOnly) scene.current.visible = false;
299
+ });
300
+ return /*#__PURE__*/React.createElement("group", _extends({
301
+ ref: ref
302
+ }, props), /*#__PURE__*/React.createElement("orthographicCamera", {
303
+ ref: camera,
304
+ up: [0, 1, 0],
305
+ left: -frustum,
306
+ right: frustum,
307
+ top: frustum,
308
+ bottom: -frustum,
309
+ near: near,
310
+ far: far
311
+ }), /*#__PURE__*/React.createElement("scene", {
312
+ ref: scene
313
+ }, children), /*#__PURE__*/React.createElement("mesh", {
314
+ ref: plane,
315
+ "rotation-x": -Math.PI / 2,
316
+ scale: frustum * 2
317
+ }, /*#__PURE__*/React.createElement("planeGeometry", null), /*#__PURE__*/React.createElement("causticsProjectionMaterial", {
318
+ transparent: true,
319
+ color: color,
320
+ causticsTexture: causticsTarget.texture,
321
+ causticsTextureB: causticsTargetB.texture,
322
+ blending: THREE.CustomBlending,
323
+ blendSrc: THREE.OneFactor,
324
+ blendDst: THREE.SrcAlphaFactor,
325
+ depthWrite: false
326
+ })));
327
+ });
328
+
329
+ export { Caustics };
package/core/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./ScreenSpace.cjs.js"),s=require("./QuadraticBezierLine.cjs.js"),t=require("./CubicBezierLine.cjs.js"),o=require("./CatmullRomLine.cjs.js"),i=require("./Line.cjs.js"),u=require("./PositionalAudio.cjs.js"),a=require("./Text.cjs.js"),n=require("./Text3D.cjs.js"),c=require("./Effects.cjs.js"),j=require("./GradientTexture.cjs.js"),p=require("./Image.cjs.js"),x=require("./Edges.cjs.js"),l=require("./Trail.cjs.js"),d=require("./Sampler.cjs.js"),q=require("./ComputedAttribute.cjs.js"),m=require("./Clone.cjs.js"),h=require("./MarchingCubes.cjs.js"),C=require("./Decal.cjs.js"),M=require("./Svg.cjs.js"),S=require("./Gltf.cjs.js"),T=require("./AsciiRenderer.cjs.js"),f=require("./OrthographicCamera.cjs.js"),P=require("./PerspectiveCamera.cjs.js"),b=require("./CubeCamera.cjs.js"),B=require("./DeviceOrientationControls.cjs.js"),g=require("./FlyControls.cjs.js"),v=require("./MapControls.cjs.js"),A=require("./OrbitControls.cjs.js"),L=require("./TrackballControls.cjs.js"),k=require("./ArcballControls.cjs.js"),G=require("./TransformControls.cjs.js"),R=require("./PointerLockControls.cjs.js"),D=require("./FirstPersonControls.cjs.js"),E=require("./GizmoHelper.cjs.js"),w=require("./GizmoViewcube.cjs.js"),z=require("./GizmoViewport.cjs.js"),F=require("./Grid.cjs.js"),O=require("./useCubeTexture.cjs.js"),I=require("./useFBX.cjs.js"),H=require("./useGLTF.cjs.js"),V=require("./useKTX2.cjs.js"),y=require("./useProgress.cjs.js"),Q=require("./useTexture.cjs.js"),X=require("./useVideoTexture.cjs.js"),K=require("./Stats.cjs.js"),W=require("./useDepthBuffer.cjs.js"),N=require("./useAspect.cjs.js"),U=require("./useCamera.cjs.js"),_=require("./useDetectGPU.cjs.js"),J=require("./useHelper.cjs.js"),Y=require("./useBVH.cjs.js"),Z=require("./useContextBridge.cjs.js"),$=require("./useAnimations.cjs.js"),ee=require("./useFBO.cjs.js"),re=require("./useIntersect.cjs.js"),se=require("./useBoxProjectedEnv.cjs.js"),te=require("./BBAnchor.cjs.js"),oe=require("./useTrailTexture.cjs.js"),ie=require("./CurveModifier.cjs.js"),ue=require("./MeshDistortMaterial.cjs.js"),ae=require("./MeshWobbleMaterial.cjs.js"),ne=require("./MeshReflectorMaterial.cjs.js"),ce=require("./MeshRefractionMaterial.cjs.js"),je=require("./MeshTransmissionMaterial.cjs.js"),pe=require("./PointMaterial.cjs.js"),xe=require("./shaderMaterial.cjs.js"),le=require("./softShadows.cjs.js"),de=require("./shapes.cjs.js"),qe=require("./RoundedBox.cjs.js"),me=require("./ScreenQuad.cjs.js"),he=require("./Center.cjs.js"),Ce=require("./Bounds.cjs.js"),Me=require("./CameraShake.cjs.js"),Se=require("./Float.cjs.js"),Te=require("./Stage.cjs.js"),fe=require("./Backdrop.cjs.js"),Pe=require("./Shadow.cjs.js"),be=require("./ContactShadows.cjs.js"),Be=require("./AccumulativeShadows.cjs.js"),ge=require("./Reflector.cjs.js"),ve=require("./SpotLight.cjs.js"),Ae=require("./Environment.cjs.js"),Le=require("./Lightformer.cjs.js"),ke=require("./Sky.cjs.js"),Ge=require("./Stars.cjs.js"),Re=require("./Cloud.cjs.js"),De=require("./Sparkles.cjs.js"),Ee=require("./useMatcapTexture.cjs.js"),we=require("./useNormalTexture.cjs.js"),ze=require("./Points.cjs.js"),Fe=require("./Instances.cjs.js"),Oe=require("./Segments.cjs.js"),Ie=require("./Detailed.cjs.js"),He=require("./Preload.cjs.js"),Ve=require("./BakeShadows.cjs.js"),ye=require("./meshBounds.cjs.js"),Qe=require("./AdaptiveDpr.cjs.js"),Xe=require("./AdaptiveEvents.cjs.js"),Ke=require("./PerformanceMonitor.cjs.js"),We=require("./RenderTexture.cjs.js"),Ne=require("./Mask.cjs.js"),Ue=require("./Hud.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("three"),require("three-stdlib"),require("troika-three-text"),require("suspend-react"),require("meshline"),require("lodash.pick"),require("lodash.omit"),require("zustand"),require("stats.js"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/BlurPass.cjs.js"),require("../materials/ConvolutionMaterial.cjs.js"),require("../materials/MeshReflectorMaterial.cjs.js"),require("../materials/MeshRefractionMaterial.cjs.js"),require("../helpers/environment-assets.cjs.js"),require("../materials/SpotLightMaterial.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.ScreenSpace=r.ScreenSpace,exports.QuadraticBezierLine=s.QuadraticBezierLine,exports.CubicBezierLine=t.CubicBezierLine,exports.CatmullRomLine=o.CatmullRomLine,exports.Line=i.Line,exports.PositionalAudio=u.PositionalAudio,exports.Text=a.Text,exports.Text3D=n.Text3D,exports.Effects=c.Effects,exports.isWebGL2Available=c.isWebGL2Available,exports.GradientTexture=j.GradientTexture,exports.Image=p.Image,exports.Edges=x.Edges,exports.Trail=l.Trail,exports.useTrail=l.useTrail,exports.Sampler=d.Sampler,exports.useSurfaceSampler=d.useSurfaceSampler,exports.ComputedAttribute=q.ComputedAttribute,exports.Clone=m.Clone,exports.MarchingCube=h.MarchingCube,exports.MarchingCubes=h.MarchingCubes,exports.MarchingPlane=h.MarchingPlane,exports.Decal=C.Decal,exports.Svg=M.Svg,exports.Gltf=S.Gltf,exports.AsciiRenderer=T.AsciiRenderer,exports.OrthographicCamera=f.OrthographicCamera,exports.PerspectiveCamera=P.PerspectiveCamera,exports.CubeCamera=b.CubeCamera,exports.DeviceOrientationControls=B.DeviceOrientationControls,exports.FlyControls=g.FlyControls,exports.MapControls=v.MapControls,exports.OrbitControls=A.OrbitControls,exports.TrackballControls=L.TrackballControls,exports.ArcballControls=k.ArcballControls,exports.TransformControls=G.TransformControls,exports.PointerLockControls=R.PointerLockControls,exports.FirstPersonControls=D.FirstPersonControls,exports.GizmoHelper=E.GizmoHelper,exports.useGizmoContext=E.useGizmoContext,exports.GizmoViewcube=w.GizmoViewcube,exports.GizmoViewport=z.GizmoViewport,exports.Grid=F.Grid,exports.useCubeTexture=O.useCubeTexture,exports.useFBX=I.useFBX,exports.useGLTF=H.useGLTF,exports.useKTX2=V.useKTX2,exports.useProgress=y.useProgress,exports.IsObject=Q.IsObject,exports.useTexture=Q.useTexture,exports.useVideoTexture=X.useVideoTexture,exports.Stats=K.Stats,exports.useDepthBuffer=W.useDepthBuffer,exports.useAspect=N.useAspect,exports.useCamera=U.useCamera,exports.useDetectGPU=_.useDetectGPU,exports.useHelper=J.useHelper,exports.useBVH=Y.useBVH,exports.useContextBridge=Z.useContextBridge,exports.useAnimations=$.useAnimations,exports.useFBO=ee.useFBO,exports.useIntersect=re.useIntersect,exports.useBoxProjectedEnv=se.useBoxProjectedEnv,exports.BBAnchor=te.BBAnchor,exports.useTrailTexture=oe.useTrailTexture,exports.CurveModifier=ie.CurveModifier,exports.MeshDistortMaterial=ue.MeshDistortMaterial,exports.MeshWobbleMaterial=ae.MeshWobbleMaterial,exports.MeshReflectorMaterial=ne.MeshReflectorMaterial,exports.MeshRefractionMaterial=ce.MeshRefractionMaterial,exports.MeshTransmissionMaterial=je.MeshTransmissionMaterial,exports.PointMaterial=pe.PointMaterial,exports.PointMaterialImpl=pe.PointMaterialImpl,exports.shaderMaterial=xe.shaderMaterial,exports.SoftShadows=le.SoftShadows,exports.softShadows=le.softShadows,exports.Box=de.Box,exports.Capsule=de.Capsule,exports.Circle=de.Circle,exports.Cone=de.Cone,exports.Cylinder=de.Cylinder,exports.Dodecahedron=de.Dodecahedron,exports.Extrude=de.Extrude,exports.Icosahedron=de.Icosahedron,exports.Lathe=de.Lathe,exports.Octahedron=de.Octahedron,exports.Plane=de.Plane,exports.Polyhedron=de.Polyhedron,exports.Ring=de.Ring,exports.Sphere=de.Sphere,exports.Tetrahedron=de.Tetrahedron,exports.Torus=de.Torus,exports.TorusKnot=de.TorusKnot,exports.Tube=de.Tube,exports.RoundedBox=qe.RoundedBox,exports.ScreenQuad=me.ScreenQuad,exports.Center=he.Center,exports.Bounds=Ce.Bounds,exports.useBounds=Ce.useBounds,exports.CameraShake=Me.CameraShake,exports.Float=Se.Float,exports.Stage=Te.Stage,exports.Backdrop=fe.Backdrop,exports.Shadow=Pe.Shadow,exports.ContactShadows=be.ContactShadows,exports.AccumulativeShadows=Be.AccumulativeShadows,exports.RandomizedLight=Be.RandomizedLight,exports.accumulativeContext=Be.accumulativeContext,exports.Reflector=ge.Reflector,exports.SpotLight=ve.SpotLight,exports.SpotLightShadow=ve.SpotLightShadow,exports.Environment=Ae.Environment,exports.EnvironmentCube=Ae.EnvironmentCube,exports.EnvironmentMap=Ae.EnvironmentMap,exports.EnvironmentPortal=Ae.EnvironmentPortal,exports.useEnvironment=Ae.useEnvironment,exports.Lightformer=Le.Lightformer,exports.Sky=ke.Sky,exports.calcPosFromAngles=ke.calcPosFromAngles,exports.Stars=Ge.Stars,exports.Cloud=Re.Cloud,exports.Sparkles=De.Sparkles,exports.useMatcapTexture=Ee.useMatcapTexture,exports.useNormalTexture=we.useNormalTexture,exports.Point=ze.Point,exports.Points=ze.Points,exports.PointsBuffer=ze.PointsBuffer,exports.PositionPoint=ze.PositionPoint,exports.Instance=Fe.Instance,exports.Instances=Fe.Instances,exports.Merged=Fe.Merged,exports.Segment=Oe.Segment,exports.SegmentObject=Oe.SegmentObject,exports.Segments=Oe.Segments,exports.Detailed=Ie.Detailed,exports.Preload=He.Preload,exports.BakeShadows=Ve.BakeShadows,exports.meshBounds=ye.meshBounds,exports.AdaptiveDpr=Qe.AdaptiveDpr,exports.AdaptiveEvents=Xe.AdaptiveEvents,exports.PerformanceMonitor=Ke.PerformanceMonitor,exports.usePerformanceMonitor=Ke.usePerformanceMonitor,exports.RenderTexture=We.RenderTexture,exports.Mask=Ne.Mask,exports.useMask=Ne.useMask,exports.Hud=Ue.Hud;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./ScreenSpace.cjs.js"),s=require("./QuadraticBezierLine.cjs.js"),t=require("./CubicBezierLine.cjs.js"),o=require("./CatmullRomLine.cjs.js"),i=require("./Line.cjs.js"),u=require("./PositionalAudio.cjs.js"),a=require("./Text.cjs.js"),c=require("./Text3D.cjs.js"),n=require("./Effects.cjs.js"),j=require("./GradientTexture.cjs.js"),p=require("./Image.cjs.js"),x=require("./Edges.cjs.js"),l=require("./Trail.cjs.js"),d=require("./Sampler.cjs.js"),q=require("./ComputedAttribute.cjs.js"),m=require("./Clone.cjs.js"),h=require("./MarchingCubes.cjs.js"),C=require("./Decal.cjs.js"),M=require("./Svg.cjs.js"),S=require("./Gltf.cjs.js"),T=require("./AsciiRenderer.cjs.js"),f=require("./OrthographicCamera.cjs.js"),P=require("./PerspectiveCamera.cjs.js"),b=require("./CubeCamera.cjs.js"),B=require("./DeviceOrientationControls.cjs.js"),g=require("./FlyControls.cjs.js"),v=require("./MapControls.cjs.js"),A=require("./OrbitControls.cjs.js"),L=require("./TrackballControls.cjs.js"),k=require("./ArcballControls.cjs.js"),G=require("./TransformControls.cjs.js"),R=require("./PointerLockControls.cjs.js"),D=require("./FirstPersonControls.cjs.js"),E=require("./GizmoHelper.cjs.js"),w=require("./GizmoViewcube.cjs.js"),z=require("./GizmoViewport.cjs.js"),F=require("./Grid.cjs.js"),O=require("./useCubeTexture.cjs.js"),I=require("./useFBX.cjs.js"),H=require("./useGLTF.cjs.js"),V=require("./useKTX2.cjs.js"),y=require("./useProgress.cjs.js"),Q=require("./useTexture.cjs.js"),X=require("./useVideoTexture.cjs.js"),K=require("./Stats.cjs.js"),W=require("./useDepthBuffer.cjs.js"),N=require("./useAspect.cjs.js"),U=require("./useCamera.cjs.js"),_=require("./useDetectGPU.cjs.js"),J=require("./useHelper.cjs.js"),Y=require("./useBVH.cjs.js"),Z=require("./useContextBridge.cjs.js"),$=require("./useAnimations.cjs.js"),ee=require("./useFBO.cjs.js"),re=require("./useIntersect.cjs.js"),se=require("./useBoxProjectedEnv.cjs.js"),te=require("./BBAnchor.cjs.js"),oe=require("./useTrailTexture.cjs.js"),ie=require("./CurveModifier.cjs.js"),ue=require("./MeshDistortMaterial.cjs.js"),ae=require("./MeshWobbleMaterial.cjs.js"),ce=require("./MeshReflectorMaterial.cjs.js"),ne=require("./MeshRefractionMaterial.cjs.js"),je=require("./MeshTransmissionMaterial.cjs.js"),pe=require("./PointMaterial.cjs.js"),xe=require("./shaderMaterial.cjs.js"),le=require("./softShadows.cjs.js"),de=require("./shapes.cjs.js"),qe=require("./RoundedBox.cjs.js"),me=require("./ScreenQuad.cjs.js"),he=require("./Center.cjs.js"),Ce=require("./Bounds.cjs.js"),Me=require("./CameraShake.cjs.js"),Se=require("./Float.cjs.js"),Te=require("./Stage.cjs.js"),fe=require("./Backdrop.cjs.js"),Pe=require("./Shadow.cjs.js"),be=require("./Caustics.cjs.js"),Be=require("./ContactShadows.cjs.js"),ge=require("./AccumulativeShadows.cjs.js"),ve=require("./Reflector.cjs.js"),Ae=require("./SpotLight.cjs.js"),Le=require("./Environment.cjs.js"),ke=require("./Lightformer.cjs.js"),Ge=require("./Sky.cjs.js"),Re=require("./Stars.cjs.js"),De=require("./Cloud.cjs.js"),Ee=require("./Sparkles.cjs.js"),we=require("./useMatcapTexture.cjs.js"),ze=require("./useNormalTexture.cjs.js"),Fe=require("./Points.cjs.js"),Oe=require("./Instances.cjs.js"),Ie=require("./Segments.cjs.js"),He=require("./Detailed.cjs.js"),Ve=require("./Preload.cjs.js"),ye=require("./BakeShadows.cjs.js"),Qe=require("./meshBounds.cjs.js"),Xe=require("./AdaptiveDpr.cjs.js"),Ke=require("./AdaptiveEvents.cjs.js"),We=require("./PerformanceMonitor.cjs.js"),Ne=require("./RenderTexture.cjs.js"),Ue=require("./Mask.cjs.js"),_e=require("./Hud.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("three"),require("three-stdlib"),require("troika-three-text"),require("suspend-react"),require("meshline"),require("lodash.pick"),require("lodash.omit"),require("zustand"),require("stats.js"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/BlurPass.cjs.js"),require("../materials/ConvolutionMaterial.cjs.js"),require("../materials/MeshReflectorMaterial.cjs.js"),require("../materials/MeshRefractionMaterial.cjs.js"),require("../helpers/environment-assets.cjs.js"),require("../materials/SpotLightMaterial.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.ScreenSpace=r.ScreenSpace,exports.QuadraticBezierLine=s.QuadraticBezierLine,exports.CubicBezierLine=t.CubicBezierLine,exports.CatmullRomLine=o.CatmullRomLine,exports.Line=i.Line,exports.PositionalAudio=u.PositionalAudio,exports.Text=a.Text,exports.Text3D=c.Text3D,exports.Effects=n.Effects,exports.isWebGL2Available=n.isWebGL2Available,exports.GradientTexture=j.GradientTexture,exports.Image=p.Image,exports.Edges=x.Edges,exports.Trail=l.Trail,exports.useTrail=l.useTrail,exports.Sampler=d.Sampler,exports.useSurfaceSampler=d.useSurfaceSampler,exports.ComputedAttribute=q.ComputedAttribute,exports.Clone=m.Clone,exports.MarchingCube=h.MarchingCube,exports.MarchingCubes=h.MarchingCubes,exports.MarchingPlane=h.MarchingPlane,exports.Decal=C.Decal,exports.Svg=M.Svg,exports.Gltf=S.Gltf,exports.AsciiRenderer=T.AsciiRenderer,exports.OrthographicCamera=f.OrthographicCamera,exports.PerspectiveCamera=P.PerspectiveCamera,exports.CubeCamera=b.CubeCamera,exports.DeviceOrientationControls=B.DeviceOrientationControls,exports.FlyControls=g.FlyControls,exports.MapControls=v.MapControls,exports.OrbitControls=A.OrbitControls,exports.TrackballControls=L.TrackballControls,exports.ArcballControls=k.ArcballControls,exports.TransformControls=G.TransformControls,exports.PointerLockControls=R.PointerLockControls,exports.FirstPersonControls=D.FirstPersonControls,exports.GizmoHelper=E.GizmoHelper,exports.useGizmoContext=E.useGizmoContext,exports.GizmoViewcube=w.GizmoViewcube,exports.GizmoViewport=z.GizmoViewport,exports.Grid=F.Grid,exports.useCubeTexture=O.useCubeTexture,exports.useFBX=I.useFBX,exports.useGLTF=H.useGLTF,exports.useKTX2=V.useKTX2,exports.useProgress=y.useProgress,exports.IsObject=Q.IsObject,exports.useTexture=Q.useTexture,exports.useVideoTexture=X.useVideoTexture,exports.Stats=K.Stats,exports.useDepthBuffer=W.useDepthBuffer,exports.useAspect=N.useAspect,exports.useCamera=U.useCamera,exports.useDetectGPU=_.useDetectGPU,exports.useHelper=J.useHelper,exports.useBVH=Y.useBVH,exports.useContextBridge=Z.useContextBridge,exports.useAnimations=$.useAnimations,exports.useFBO=ee.useFBO,exports.useIntersect=re.useIntersect,exports.useBoxProjectedEnv=se.useBoxProjectedEnv,exports.BBAnchor=te.BBAnchor,exports.useTrailTexture=oe.useTrailTexture,exports.CurveModifier=ie.CurveModifier,exports.MeshDistortMaterial=ue.MeshDistortMaterial,exports.MeshWobbleMaterial=ae.MeshWobbleMaterial,exports.MeshReflectorMaterial=ce.MeshReflectorMaterial,exports.MeshRefractionMaterial=ne.MeshRefractionMaterial,exports.MeshTransmissionMaterial=je.MeshTransmissionMaterial,exports.PointMaterial=pe.PointMaterial,exports.PointMaterialImpl=pe.PointMaterialImpl,exports.shaderMaterial=xe.shaderMaterial,exports.SoftShadows=le.SoftShadows,exports.softShadows=le.softShadows,exports.Box=de.Box,exports.Capsule=de.Capsule,exports.Circle=de.Circle,exports.Cone=de.Cone,exports.Cylinder=de.Cylinder,exports.Dodecahedron=de.Dodecahedron,exports.Extrude=de.Extrude,exports.Icosahedron=de.Icosahedron,exports.Lathe=de.Lathe,exports.Octahedron=de.Octahedron,exports.Plane=de.Plane,exports.Polyhedron=de.Polyhedron,exports.Ring=de.Ring,exports.Sphere=de.Sphere,exports.Tetrahedron=de.Tetrahedron,exports.Torus=de.Torus,exports.TorusKnot=de.TorusKnot,exports.Tube=de.Tube,exports.RoundedBox=qe.RoundedBox,exports.ScreenQuad=me.ScreenQuad,exports.Center=he.Center,exports.Bounds=Ce.Bounds,exports.useBounds=Ce.useBounds,exports.CameraShake=Me.CameraShake,exports.Float=Se.Float,exports.Stage=Te.Stage,exports.Backdrop=fe.Backdrop,exports.Shadow=Pe.Shadow,exports.Caustics=be.Caustics,exports.ContactShadows=Be.ContactShadows,exports.AccumulativeShadows=ge.AccumulativeShadows,exports.RandomizedLight=ge.RandomizedLight,exports.accumulativeContext=ge.accumulativeContext,exports.Reflector=ve.Reflector,exports.SpotLight=Ae.SpotLight,exports.SpotLightShadow=Ae.SpotLightShadow,exports.Environment=Le.Environment,exports.EnvironmentCube=Le.EnvironmentCube,exports.EnvironmentMap=Le.EnvironmentMap,exports.EnvironmentPortal=Le.EnvironmentPortal,exports.useEnvironment=Le.useEnvironment,exports.Lightformer=ke.Lightformer,exports.Sky=Ge.Sky,exports.calcPosFromAngles=Ge.calcPosFromAngles,exports.Stars=Re.Stars,exports.Cloud=De.Cloud,exports.Sparkles=Ee.Sparkles,exports.useMatcapTexture=we.useMatcapTexture,exports.useNormalTexture=ze.useNormalTexture,exports.Point=Fe.Point,exports.Points=Fe.Points,exports.PointsBuffer=Fe.PointsBuffer,exports.PositionPoint=Fe.PositionPoint,exports.Instance=Oe.Instance,exports.Instances=Oe.Instances,exports.Merged=Oe.Merged,exports.Segment=Ie.Segment,exports.SegmentObject=Ie.SegmentObject,exports.Segments=Ie.Segments,exports.Detailed=He.Detailed,exports.Preload=Ve.Preload,exports.BakeShadows=ye.BakeShadows,exports.meshBounds=Qe.meshBounds,exports.AdaptiveDpr=Xe.AdaptiveDpr,exports.AdaptiveEvents=Ke.AdaptiveEvents,exports.PerformanceMonitor=We.PerformanceMonitor,exports.usePerformanceMonitor=We.usePerformanceMonitor,exports.RenderTexture=Ne.RenderTexture,exports.Mask=Ue.Mask,exports.useMask=Ue.useMask,exports.Hud=_e.Hud;
package/core/index.d.ts CHANGED
@@ -76,6 +76,7 @@ export * from './Float';
76
76
  export * from './Stage';
77
77
  export * from './Backdrop';
78
78
  export * from './Shadow';
79
+ export * from './Caustics';
79
80
  export * from './ContactShadows';
80
81
  export * from './AccumulativeShadows';
81
82
  export * from './Reflector';
package/core/index.js CHANGED
@@ -76,6 +76,7 @@ export { Float } from './Float.js';
76
76
  export { Stage } from './Stage.js';
77
77
  export { Backdrop } from './Backdrop.js';
78
78
  export { Shadow } from './Shadow.js';
79
+ export { Caustics } from './Caustics.js';
79
80
  export { ContactShadows } from './ContactShadows.js';
80
81
  export { AccumulativeShadows, RandomizedLight, accumulativeContext } from './AccumulativeShadows.js';
81
82
  export { Reflector } from './Reflector.js';