@react-three/drei 9.51.23 → 9.52.0

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>
@@ -1630,16 +1631,15 @@ Injects [percent closer soft shadows (pcss)](https://threejs.org/examples/#webgl
1630
1631
  <a href="https://codesandbox.io/s/ni6v4"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/ni6v4/screenshot.png" alt="Demo"/></a>
1631
1632
  </p>
1632
1633
 
1633
- Creates a THREE.ShaderMaterial for you with easier handling of uniforms, which are also automatically declared as setter/getters on the object.
1634
+ Creates a THREE.ShaderMaterial for you with easier handling of uniforms, which are automatically declared as setter/getters on the object and allowed as constructor arguments.
1634
1635
 
1635
1636
  ```jsx
1636
1637
  import { extend } from '@react-three/fiber'
1637
- import glsl from 'babel-plugin-glsl/macro'
1638
1638
 
1639
1639
  const ColorShiftMaterial = shaderMaterial(
1640
1640
  { time: 0, color: new THREE.Color(0.2, 0.0, 0.1) },
1641
1641
  // vertex shader
1642
- glsl`
1642
+ /*glsl*/`
1643
1643
  varying vec2 vUv;
1644
1644
  void main() {
1645
1645
  vUv = uv;
@@ -1647,7 +1647,7 @@ const ColorShiftMaterial = shaderMaterial(
1647
1647
  }
1648
1648
  `,
1649
1649
  // fragment shader
1650
- glsl`
1650
+ /*glsl*/`
1651
1651
  uniform float time;
1652
1652
  uniform vec3 color;
1653
1653
  varying vec2 vUv;
@@ -1657,12 +1657,16 @@ const ColorShiftMaterial = shaderMaterial(
1657
1657
  `
1658
1658
  )
1659
1659
 
1660
+ // declaratively
1660
1661
  extend({ ColorShiftMaterial })
1661
-
1662
- // in your component
1662
+ ...
1663
1663
  <mesh>
1664
1664
  <colorShiftMaterial color="hotpink" time={1} />
1665
1665
  </mesh>
1666
+
1667
+ // imperatively, all uniforms are available as setter/getters and constructor args
1668
+ const material = new ColorShiftMaterial({ color: new THREE.Color("hotpink") })
1669
+ material.time = 1
1666
1670
  ```
1667
1671
 
1668
1672
  `shaderMaterial` attaches a unique `key` property to the prototype class. If you wire it to Reacts own `key` property, you can enable hot-reload.
@@ -3102,6 +3106,68 @@ A cheap canvas-texture-based circular gradient.
3102
3106
  />
3103
3107
  ```
3104
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
+ /** Buffer resolution, default: 2048 */
3137
+ resolution?: number
3138
+ /** Camera near, default: 0.1 */
3139
+ near?: number
3140
+ /** Camera far, default: 100 */
3141
+ far?: number
3142
+ /** Camera position, default: [5, 5, 5] */
3143
+ lightSource?: [x: number, y: number, z: number]
3144
+ /** Camera lookAt, default: [0, 0, 0] */
3145
+ focus?: [x: number, y: number, z: number]
3146
+ }
3147
+ ```
3148
+
3149
+ 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!
3150
+
3151
+ 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).
3152
+
3153
+ ```jsx
3154
+ <Caustics debug backfaces lightSource={[2.5, 5, -2.5]} frustum={4}>
3155
+ <Bottle />
3156
+ <WineGlass>
3157
+ </Caustics>
3158
+ ```
3159
+
3160
+ 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.
3161
+
3162
+ ```jsx
3163
+ <Caustics lightSource={[2.5, 5, -2.5]} >
3164
+ <WineGlass />
3165
+ </Caustics>
3166
+ <Caustics causticsOnly lightSource={[-2.5, 5, 2.5]} ior={0.79} worldRadius={0.0124}>
3167
+ <WineGlass />
3168
+ </Caustics>
3169
+ ```
3170
+
3105
3171
  #### ContactShadows
3106
3172
 
3107
3173
  [![](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,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,causticsOnly:c=!1,backfaces:s=!1,backfaceIor:h=1.1,worldRadius:P=.3125,intensity:D=.05,resolution:M=2024,near:y=.1,far:w=100,lightSource:T=[5,5,5],focus:b=[0,0,0],...F},S)=>{t.extend({CausticsProjectionMaterial:p});const j=v.useRef(null),R=v.useRef(null),W=v.useRef(null),z=v.useRef(null),I=t.useThree((e=>e.gl)),O=o.useHelper(e&&R,d.CameraHelper),_=o.useHelper(e&&z,d.BoxHelper),B=i.useFBO(M,M,x),C=i.useFBO(M,M,x),E=i.useFBO(M,M,g),U=i.useFBO(M,M,g),[k]=v.useState((()=>f())),[q]=v.useState((()=>f(d.BackSide))),[A]=v.useState((()=>new m)),[L]=v.useState((()=>new l.FullScreenQuad(A))),V=new d.Vector3;return v.useLayoutEffect((()=>{var r,t;(j.current.updateWorldMatrix(!1,!0),R.current.position.set(...T),R.current.lookAt(...b),R.current.updateWorldMatrix(!1,!1),R.current.updateProjectionMatrix(),e)&&(null==(r=O.current)||r.update(),null==(t=_.current)||t.update());q.viewMatrix.value=k.viewMatrix.value=R.current.matrixWorldInverse,A.cameraMatrixWorld=R.current.matrixWorld,A.cameraProjectionMatrixInv=R.current.projectionMatrixInverse,A.lightDir=R.current.getWorldPosition(V).normalize().multiplyScalar(-1),A.near=R.current.near,A.far=R.current.far,A.resolution=M,A.size=n,A.intensity=D,A.worldRadius=P,W.current.visible=!0,I.setRenderTarget(B),I.clear(),W.current.overrideMaterial=k,I.render(W.current,R.current),I.setRenderTarget(C),I.clear(),s&&(W.current.overrideMaterial=q,I.render(W.current,R.current)),W.current.overrideMaterial=null,A.ior=a,z.current.material.lightProjMatrix=R.current.projectionMatrix,z.current.material.lightViewMatrix=R.current.matrixWorldInverse,A.normalTexture=B.texture,A.depthTexture=B.depthTexture,I.setRenderTarget(E),I.clear(),L.render(I),A.ior=h,A.normalTexture=C.texture,A.depthTexture=C.depthTexture,I.setRenderTarget(U),I.clear(),s&&L.render(I),I.setRenderTarget(null),c&&(W.current.visible=!1)})),v.createElement("group",u.default({ref:j},F),v.createElement("orthographicCamera",{ref:R,up:[0,1,0],left:-n,right:n,top:n,bottom:-n,near:y,far:w}),v.createElement("scene",{ref:W},r),v.createElement("mesh",{ref:z,"rotation-x":-Math.PI/2,scale:2*n},v.createElement("planeGeometry",null),v.createElement("causticsProjectionMaterial",{transparent:!0,causticsTexture:E.texture,causticsTextureB:U.texture,blending:d.CustomBlending,blendSrc:d.OneFactor,blendDst:d.SrcAlphaFactor,depthWrite:!1})))}));exports.Caustics=h;
@@ -0,0 +1,51 @@
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
+ causticsTexture?: THREE.Texture;
12
+ causticsTextureB?: THREE.Texture;
13
+ lightProjMatrix?: THREE.Matrix4;
14
+ lightViewMatrix?: THREE.Matrix4;
15
+ };
16
+ }
17
+ }
18
+ }
19
+ export declare const Caustics: React.ForwardRefExoticComponent<Pick<Omit<ReactThreeFiber.ExtendedColors<ReactThreeFiber.Overwrite<Partial<THREE.Group>, ReactThreeFiber.NodeProps<THREE.Group, typeof THREE.Group>>>, ReactThreeFiber.NonFunctionKeys<{
20
+ position?: ReactThreeFiber.Vector3 | undefined;
21
+ up?: ReactThreeFiber.Vector3 | undefined;
22
+ scale?: ReactThreeFiber.Vector3 | undefined;
23
+ rotation?: ReactThreeFiber.Euler | undefined;
24
+ matrix?: ReactThreeFiber.Matrix4 | undefined;
25
+ quaternion?: ReactThreeFiber.Quaternion | undefined;
26
+ layers?: ReactThreeFiber.Layers | undefined;
27
+ dispose?: (() => void) | null | undefined;
28
+ }>> & {
29
+ position?: ReactThreeFiber.Vector3 | undefined;
30
+ up?: ReactThreeFiber.Vector3 | undefined;
31
+ scale?: ReactThreeFiber.Vector3 | undefined;
32
+ rotation?: ReactThreeFiber.Euler | undefined;
33
+ matrix?: ReactThreeFiber.Matrix4 | undefined;
34
+ quaternion?: ReactThreeFiber.Quaternion | undefined;
35
+ layers?: ReactThreeFiber.Layers | undefined;
36
+ dispose?: (() => void) | null | undefined;
37
+ } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
38
+ debug?: boolean | undefined;
39
+ causticsOnly: boolean;
40
+ backfaces: boolean;
41
+ frustum?: number | undefined;
42
+ ior?: number | undefined;
43
+ backfaceIor?: number | undefined;
44
+ worldRadius?: number | undefined;
45
+ intensity?: number | undefined;
46
+ resolution?: number | undefined;
47
+ near?: number | undefined;
48
+ far?: number | undefined;
49
+ lightSource?: [x: number, y: number, z: number] | undefined;
50
+ focus?: [x: number, y: number, z: number] | undefined;
51
+ }, "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" | 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,326 @@
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
+ lightProjMatrix: new THREE.Matrix4(),
32
+ lightViewMatrix: new THREE.Matrix4()
33
+ }, `varying vec3 vWorldPosition;
34
+ void main() {
35
+ gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);
36
+ vec4 worldPosition = modelMatrix * vec4(position, 1.);
37
+ vWorldPosition = worldPosition.xyz;
38
+ }`, `varying vec3 vWorldPosition;
39
+ uniform sampler2D causticsTexture;
40
+ uniform sampler2D causticsTextureB;
41
+ uniform mat4 lightProjMatrix;
42
+ uniform mat4 lightViewMatrix;
43
+ void main() {
44
+ // Apply caustics
45
+ vec4 lightSpacePos = lightProjMatrix * lightViewMatrix * vec4(vWorldPosition, 1.0);
46
+ lightSpacePos.xyz /= lightSpacePos.w;
47
+ lightSpacePos.xyz = lightSpacePos.xyz * 0.5 + 0.5;
48
+ vec3 front = texture2D(causticsTexture, lightSpacePos.xy).rgb;
49
+ vec3 back = texture2D(causticsTextureB, lightSpacePos.xy).rgb;
50
+ gl_FragColor = vec4(front + back, 1.0);
51
+ #include <tonemapping_fragment>
52
+ #include <encodings_fragment>
53
+ }`);
54
+ const CausticsMaterial = shaderMaterial({
55
+ cameraMatrixWorld: new THREE.Matrix4(),
56
+ cameraProjectionMatrixInv: new THREE.Matrix4(),
57
+ normalTexture: null,
58
+ depthTexture: null,
59
+ lightDir: new THREE.Vector3(0, 1, 0),
60
+ near: 0.1,
61
+ far: 100,
62
+ modelMatrix: new THREE.Matrix4(),
63
+ worldRadius: 1 / 40,
64
+ ior: 1.1,
65
+ bounces: 0,
66
+ resolution: 1024,
67
+ size: 10,
68
+ intensity: 0.5
69
+ },
70
+ /* glsl */
71
+ `
72
+ varying vec2 vUv;
73
+ void main() {
74
+ vUv = uv;
75
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
76
+ }`,
77
+ /* glsl */
78
+ `
79
+ uniform mat4 cameraMatrixWorld;
80
+ uniform mat4 cameraProjectionMatrixInv;
81
+ uniform vec3 lightDir;
82
+ uniform float near;
83
+ uniform float far;
84
+ uniform float time;
85
+ uniform float worldRadius;
86
+ uniform float resolution;
87
+ uniform float size;
88
+ uniform float intensity;
89
+ uniform float ior;
90
+ precision highp isampler2D;
91
+ precision highp usampler2D;
92
+ uniform sampler2D normalTexture;
93
+ uniform sampler2D depthTexture;
94
+ uniform float bounces;
95
+ varying vec2 vUv;
96
+ vec3 WorldPosFromDepth(float depth, vec2 coord) {
97
+ float z = depth * 2.0 - 1.0;
98
+ vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
99
+ vec4 viewSpacePosition = cameraProjectionMatrixInv * clipSpacePosition;
100
+ // Perspective division
101
+ viewSpacePosition /= viewSpacePosition.w;
102
+ vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
103
+ return worldSpacePosition.xyz;
104
+ }
105
+ float sdPlane( vec3 p, vec3 n, float h ) {
106
+ // n must be normalized
107
+ return dot(p,n) + h;
108
+ }
109
+ float planeIntersect( vec3 ro, vec3 rd, vec4 p ) {
110
+ return -(dot(ro,p.xyz)+p.w)/dot(rd,p.xyz);
111
+ }
112
+ vec3 totalInternalReflection(vec3 ro, vec3 rd, vec3 pos, vec3 normal, float ior, out vec3 rayOrigin, out vec3 rayDirection) {
113
+ rayOrigin = ro;
114
+ rayDirection = rd;
115
+ rayDirection = refract(rayDirection, normal, 1.0 / ior);
116
+ rayOrigin = pos + rayDirection * 0.1;
117
+ return rayDirection;
118
+ }
119
+ void main() {
120
+ // Each sample consists of random offset in the x and y direction
121
+ float caustic = 0.0;
122
+ float causticTexelSize = (1.0 / resolution) * size * 2.0;
123
+ float texelsNeeded = worldRadius / causticTexelSize;
124
+ float sampleRadius = texelsNeeded / resolution;
125
+ float sum = 0.0;
126
+ if (texture2D(depthTexture, vUv).x == 1.0) {
127
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
128
+ return;
129
+ }
130
+ vec2 offset1 = vec2(-0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
131
+ vec2 offset2 = vec2(-0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
132
+ vec2 offset3 = vec2(0.5, 0.5);//vec2(rand() - 0.5, rand() - 0.5);
133
+ vec2 offset4 = vec2(0.5, -0.5);//vec2(rand() - 0.5, rand() - 0.5);
134
+ vec2 uv1 = vUv + offset1 * sampleRadius;
135
+ vec2 uv2 = vUv + offset2 * sampleRadius;
136
+ vec2 uv3 = vUv + offset3 * sampleRadius;
137
+ vec2 uv4 = vUv + offset4 * sampleRadius;
138
+ vec3 normal1 = texture2D(normalTexture, uv1, -10.0).rgb * 2.0 - 1.0;
139
+ vec3 normal2 = texture2D(normalTexture, uv2, -10.0).rgb * 2.0 - 1.0;
140
+ vec3 normal3 = texture2D(normalTexture, uv3, -10.0).rgb * 2.0 - 1.0;
141
+ vec3 normal4 = texture2D(normalTexture, uv4, -10.0).rgb * 2.0 - 1.0;
142
+ float depth1 = texture2D(depthTexture, uv1, -10.0).x;
143
+ float depth2 = texture2D(depthTexture, uv2, -10.0).x;
144
+ float depth3 = texture2D(depthTexture, uv3, -10.0).x;
145
+ float depth4 = texture2D(depthTexture, uv4, -10.0).x;
146
+ // Sanity check the depths
147
+ if (depth1 == 1.0 || depth2 == 1.0 || depth3 == 1.0 || depth4 == 1.0) {
148
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
149
+ return;
150
+ }
151
+ vec3 pos1 = WorldPosFromDepth(depth1, uv1);
152
+ vec3 pos2 = WorldPosFromDepth(depth2, uv2);
153
+ vec3 pos3 = WorldPosFromDepth(depth3, uv3);
154
+ vec3 pos4 = WorldPosFromDepth(depth4, uv4);
155
+ vec3 originPos1 = WorldPosFromDepth(0.0, uv1);
156
+ vec3 originPos2 = WorldPosFromDepth(0.0, uv2);
157
+ vec3 originPos3 = WorldPosFromDepth(0.0, uv3);
158
+ vec3 originPos4 = WorldPosFromDepth(0.0, uv4);
159
+ vec3 endPos1, endPos2, endPos3, endPos4;
160
+ vec3 endDir1, endDir2, endDir3, endDir4;
161
+ totalInternalReflection(originPos1, lightDir, pos1, normal1, ior, endPos1, endDir1);
162
+ totalInternalReflection(originPos2, lightDir, pos2, normal2, ior, endPos2, endDir2);
163
+ totalInternalReflection(originPos3, lightDir, pos3, normal3, ior, endPos3, endDir3);
164
+ totalInternalReflection(originPos4, lightDir, pos4, normal4, ior, endPos4, endDir4);
165
+ float lightPosArea = length(cross(originPos2 - originPos1, originPos3 - originPos1)) + length(cross(originPos3 - originPos1, originPos4 - originPos1));
166
+ float t1 = planeIntersect(endPos1, endDir1, vec4(0.0, 1.0, 0.0, 0.0));
167
+ float t2 = planeIntersect(endPos2, endDir2, vec4(0.0, 1.0, 0.0, 0.0));
168
+ float t3 = planeIntersect(endPos3, endDir3, vec4(0.0, 1.0, 0.0, 0.0));
169
+ float t4 = planeIntersect(endPos4, endDir4, vec4(0.0, 1.0, 0.0, 0.0));
170
+ vec3 finalPos1 = endPos1 + endDir1 * t1;
171
+ vec3 finalPos2 = endPos2 + endDir2 * t2;
172
+ vec3 finalPos3 = endPos3 + endDir3 * t3;
173
+ vec3 finalPos4 = endPos4 + endDir4 * t4;
174
+ float finalArea = length(cross(finalPos2 - finalPos1, finalPos3 - finalPos1)) + length(cross(finalPos3 - finalPos1, finalPos4 - finalPos1));
175
+ caustic += intensity * (lightPosArea / finalArea);
176
+ // Calculate the area of the triangle in light spaces
177
+ gl_FragColor = vec4(vec3(max(caustic, 0.0)), 1.0);
178
+ }`);
179
+ const NORMALPROPS = {
180
+ depth: true,
181
+ minFilter: THREE.LinearFilter,
182
+ magFilter: THREE.LinearFilter,
183
+ encoding: THREE.LinearEncoding,
184
+ type: THREE.UnsignedByteType
185
+ };
186
+ const CAUSTICPROPS = {
187
+ minFilter: THREE.LinearMipmapLinearFilter,
188
+ magFilter: THREE.LinearFilter,
189
+ encoding: THREE.LinearEncoding,
190
+ format: THREE.RGBAFormat,
191
+ type: THREE.FloatType,
192
+ generateMipmaps: true
193
+ };
194
+ const Caustics = /*#__PURE__*/React.forwardRef(({
195
+ debug,
196
+ children,
197
+ frustum = 2,
198
+ ior = 1.1,
199
+ causticsOnly = false,
200
+ backfaces = false,
201
+ backfaceIor = 1.1,
202
+ worldRadius = 0.3125,
203
+ intensity = 0.05,
204
+ resolution = 2024,
205
+ near = 0.1,
206
+ far = 100,
207
+ lightSource = [5, 5, 5],
208
+ focus = [0, 0, 0],
209
+ ...props
210
+ }, fref) => {
211
+ extend({
212
+ CausticsProjectionMaterial
213
+ });
214
+ const ref = React.useRef(null);
215
+ const camera = React.useRef(null);
216
+ const scene = React.useRef(null);
217
+ const plane = React.useRef(null);
218
+ const gl = useThree(state => state.gl);
219
+ const helper = useHelper(debug && camera, THREE.CameraHelper);
220
+ const boxHelper = useHelper(debug && plane, THREE.BoxHelper); // Buffers for front and back faces
221
+
222
+ const normalTarget = useFBO(resolution, resolution, NORMALPROPS);
223
+ const normalTargetB = useFBO(resolution, resolution, NORMALPROPS);
224
+ const causticsTarget = useFBO(resolution, resolution, CAUSTICPROPS);
225
+ const causticsTargetB = useFBO(resolution, resolution, CAUSTICPROPS); // Normal materials for front and back faces
226
+
227
+ const [normalMat] = React.useState(() => createNormalMaterial());
228
+ const [normalMatB] = React.useState(() => createNormalMaterial(THREE.BackSide)); // The quad that catches the caustics
229
+
230
+ const [causticsMaterial] = React.useState(() => new CausticsMaterial());
231
+ const [causticsQuad] = React.useState(() => new FullScreenQuad(causticsMaterial));
232
+ const pos = new THREE.Vector3();
233
+ React.useLayoutEffect(() => {
234
+ // Update matrix world and the camera
235
+ ref.current.updateWorldMatrix(false, true);
236
+ camera.current.position.set(...lightSource);
237
+ camera.current.lookAt(...focus);
238
+ camera.current.updateWorldMatrix(false, false);
239
+ camera.current.updateProjectionMatrix();
240
+
241
+ if (debug) {
242
+ var _helper$current, _boxHelper$current;
243
+
244
+ (_helper$current = helper.current) == null ? void 0 : _helper$current.update();
245
+ (_boxHelper$current = boxHelper.current) == null ? void 0 : _boxHelper$current.update();
246
+ } // Inject uniforms
247
+
248
+
249
+ normalMatB.viewMatrix.value = normalMat.viewMatrix.value = camera.current.matrixWorldInverse;
250
+ causticsMaterial.cameraMatrixWorld = camera.current.matrixWorld;
251
+ causticsMaterial.cameraProjectionMatrixInv = camera.current.projectionMatrixInverse;
252
+ causticsMaterial.lightDir = camera.current.getWorldPosition(pos).normalize().multiplyScalar(-1);
253
+ causticsMaterial.near = camera.current.near;
254
+ causticsMaterial.far = camera.current.far;
255
+ causticsMaterial.resolution = resolution;
256
+ causticsMaterial.size = frustum;
257
+ causticsMaterial.intensity = intensity;
258
+ causticsMaterial.worldRadius = worldRadius; // Switch the scene on
259
+
260
+ scene.current.visible = true; // Render front face normals
261
+
262
+ gl.setRenderTarget(normalTarget);
263
+ gl.clear();
264
+ scene.current.overrideMaterial = normalMat;
265
+ gl.render(scene.current, camera.current); // Render back face normals, if enabled
266
+
267
+ gl.setRenderTarget(normalTargetB);
268
+ gl.clear();
269
+
270
+ if (backfaces) {
271
+ scene.current.overrideMaterial = normalMatB;
272
+ gl.render(scene.current, camera.current);
273
+ } // Remove the override material
274
+
275
+
276
+ scene.current.overrideMaterial = null; // Render front face caustics
277
+
278
+ causticsMaterial.ior = ior;
279
+ plane.current.material.lightProjMatrix = camera.current.projectionMatrix;
280
+ plane.current.material.lightViewMatrix = camera.current.matrixWorldInverse;
281
+ causticsMaterial.normalTexture = normalTarget.texture;
282
+ causticsMaterial.depthTexture = normalTarget.depthTexture;
283
+ gl.setRenderTarget(causticsTarget);
284
+ gl.clear();
285
+ causticsQuad.render(gl); // Render back face caustics, if enabled
286
+
287
+ causticsMaterial.ior = backfaceIor;
288
+ causticsMaterial.normalTexture = normalTargetB.texture;
289
+ causticsMaterial.depthTexture = normalTargetB.depthTexture;
290
+ gl.setRenderTarget(causticsTargetB);
291
+ gl.clear();
292
+ if (backfaces) causticsQuad.render(gl); // Reset render target
293
+
294
+ gl.setRenderTarget(null); // Switch the scene off if caustics is all that's wanted
295
+
296
+ if (causticsOnly) scene.current.visible = false;
297
+ });
298
+ return /*#__PURE__*/React.createElement("group", _extends({
299
+ ref: ref
300
+ }, props), /*#__PURE__*/React.createElement("orthographicCamera", {
301
+ ref: camera,
302
+ up: [0, 1, 0],
303
+ left: -frustum,
304
+ right: frustum,
305
+ top: frustum,
306
+ bottom: -frustum,
307
+ near: near,
308
+ far: far
309
+ }), /*#__PURE__*/React.createElement("scene", {
310
+ ref: scene
311
+ }, children), /*#__PURE__*/React.createElement("mesh", {
312
+ ref: plane,
313
+ "rotation-x": -Math.PI / 2,
314
+ scale: frustum * 2
315
+ }, /*#__PURE__*/React.createElement("planeGeometry", null), /*#__PURE__*/React.createElement("causticsProjectionMaterial", {
316
+ transparent: true,
317
+ causticsTexture: causticsTarget.texture,
318
+ causticsTextureB: causticsTargetB.texture,
319
+ blending: THREE.CustomBlending,
320
+ blendSrc: THREE.OneFactor,
321
+ blendDst: THREE.SrcAlphaFactor,
322
+ depthWrite: false
323
+ })));
324
+ });
325
+
326
+ 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';
@@ -1 +1 @@
1
- "use strict";function e(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("three"));exports.shaderMaterial=function(e,r,n,s){const i=class extends t.ShaderMaterial{constructor(i={}){const u=Object.entries(e);super({uniforms:u.reduce(((e,[r,n])=>({...e,...t.UniformsUtils.clone({[r]:{value:n}})})),{}),vertexShader:r,fragmentShader:n,...i}),this.key="",u.forEach((([e])=>Object.defineProperty(this,e,{get:()=>this.uniforms[e].value,set:t=>this.uniforms[e].value=t}))),s&&s(this)}};return i.key=t.MathUtils.generateUUID(),i};
1
+ "use strict";function e(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("three"));exports.shaderMaterial=function(e,r,s,n){const i=class extends t.ShaderMaterial{constructor(i={}){const a=Object.entries(e);super({uniforms:a.reduce(((e,[r,s])=>({...e,...t.UniformsUtils.clone({[r]:{value:s}})})),{}),vertexShader:r,fragmentShader:s}),this.key="",a.forEach((([e])=>Object.defineProperty(this,e,{get:()=>this.uniforms[e].value,set:t=>this.uniforms[e].value=t}))),Object.assign(this,i),n&&n(this)}};return i.key=t.MathUtils.generateUUID(),i};
@@ -17,15 +17,17 @@ function shaderMaterial(uniforms, vertexShader, fragmentShader, onInit) {
17
17
  };
18
18
  }, {}),
19
19
  vertexShader,
20
- fragmentShader,
21
- ...parameters
20
+ fragmentShader
22
21
  }); // Create getter/setters
23
22
 
24
23
  this.key = '';
25
24
  entries.forEach(([name]) => Object.defineProperty(this, name, {
26
25
  get: () => this.uniforms[name].value,
27
26
  set: v => this.uniforms[name].value = v
28
- }));
27
+ })); // Assign parameters, this might include uniforms
28
+
29
+ Object.assign(this, parameters); // Call onInit
30
+
29
31
  if (onInit) onInit(this);
30
32
  }
31
33