@react-three/drei 9.51.24 → 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 +63 -0
- package/core/Caustics.cjs.js +1 -0
- package/core/Caustics.d.ts +51 -0
- package/core/Caustics.js +326 -0
- package/core/index.cjs.js +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.js +1 -0
- package/index.cjs.js +1 -1
- package/index.js +1 -0
- package/native/index.cjs.js +1 -1
- package/native/index.js +1 -0
- package/package.json +1 -1
- package/web/index.cjs.js +1 -1
- package/web/index.js +1 -0
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,68 @@ 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
|
+
/** 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
|
+
|
|
3108
3171
|
#### ContactShadows
|
|
3109
3172
|
|
|
3110
3173
|
[](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>>;
|
package/core/Caustics.js
ADDED
|
@@ -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"),
|
|
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
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';
|