@react-three/drei 9.106.0 → 9.106.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -41
- package/core/Caustics.cjs.js +1 -1
- package/core/Caustics.js +2 -2
- package/core/Cloud.cjs.js +1 -1
- package/core/Cloud.js +1 -1
- package/core/CubeCamera.cjs.js +1 -1
- package/core/CubeCamera.d.ts +15 -3
- package/core/CubeCamera.js +47 -4
- package/core/CubeTexture.cjs.js +1 -0
- package/core/CubeTexture.d.ts +15 -0
- package/core/{useCubeTexture.js → CubeTexture.js} +12 -1
- package/core/DetectGPU.cjs.js +1 -0
- package/core/DetectGPU.d.ts +8 -0
- package/core/DetectGPU.js +14 -0
- package/core/Example.d.ts +1 -1
- package/core/Example.js +3 -0
- package/core/Fbo.cjs.js +1 -0
- package/core/{useFBO.d.ts → Fbo.d.ts} +6 -0
- package/core/{useFBO.js → Fbo.js} +10 -1
- package/core/Fbx.cjs.js +1 -0
- package/core/Fbx.d.ts +11 -0
- package/core/Fbx.js +23 -0
- package/core/GizmoHelper.cjs.js +1 -1
- package/core/GizmoViewcube.cjs.js +1 -1
- package/core/GizmoViewport.cjs.js +1 -1
- package/core/Gltf.cjs.js +1 -1
- package/core/Gltf.d.ts +17 -5
- package/core/Gltf.js +37 -3
- package/core/Helper.cjs.js +1 -1
- package/core/Helper.d.ts +3 -1
- package/core/Helper.js +35 -24
- package/core/Image.cjs.js +1 -1
- package/core/Image.js +1 -1
- package/core/Ktx2.cjs.js +1 -0
- package/core/{useKTX2.d.ts → Ktx2.d.ts} +6 -0
- package/core/{useKTX2.js → Ktx2.js} +15 -3
- package/core/MatcapTexture.cjs.js +1 -0
- package/core/MatcapTexture.d.ts +9 -0
- package/core/{useMatcapTexture.js → MatcapTexture.js} +14 -2
- package/core/MeshPortalMaterial.cjs.js +1 -1
- package/core/MeshPortalMaterial.js +1 -1
- package/core/MeshTransmissionMaterial.cjs.js +1 -1
- package/core/MeshTransmissionMaterial.js +1 -1
- package/core/NormalTexture.cjs.js +1 -0
- package/core/NormalTexture.d.ts +14 -0
- package/core/{useNormalTexture.js → NormalTexture.js} +14 -2
- package/core/OrthographicCamera.cjs.js +1 -1
- package/core/OrthographicCamera.js +1 -1
- package/core/PerspectiveCamera.cjs.js +1 -1
- package/core/PerspectiveCamera.js +1 -1
- package/core/Progress.cjs.js +1 -0
- package/core/{useProgress.d.ts → Progress.d.ts} +4 -0
- package/core/{useProgress.js → Progress.js} +11 -1
- package/core/RenderTexture.cjs.js +1 -1
- package/core/RenderTexture.js +1 -1
- package/core/Texture.cjs.js +1 -0
- package/core/{useTexture.d.ts → Texture.d.ts} +10 -4
- package/core/{useTexture.js → Texture.js} +18 -5
- package/core/TrailTexture.cjs.js +1 -0
- package/core/{useTrailTexture.d.ts → TrailTexture.d.ts} +4 -0
- package/core/{useTrailTexture.js → TrailTexture.js} +14 -3
- package/core/VideoTexture.cjs.js +1 -0
- package/core/VideoTexture.d.ts +18 -0
- package/core/{useVideoTexture.js → VideoTexture.js} +25 -23
- package/core/index.cjs.js +1 -1
- package/core/index.d.ts +12 -15
- package/core/index.js +16 -19
- package/core/useDepthBuffer.cjs.js +1 -1
- package/core/useDepthBuffer.js +1 -1
- package/core/useSpriteLoader.cjs.js +1 -1
- package/core/useSpriteLoader.d.ts +1 -0
- package/core/useSpriteLoader.js +82 -9
- package/index.cjs.js +1 -1
- package/index.js +16 -19
- package/native/index.cjs.js +1 -1
- package/native/index.js +16 -19
- package/package.json +3 -3
- package/react-three-drei-0.0.0-semantic-release.tgz +0 -0
- package/web/FaceControls.cjs.js +1 -1
- package/web/FaceControls.d.ts +1 -1
- package/web/FaceControls.js +12 -1
- package/web/Loader.cjs.js +1 -1
- package/web/Loader.js +1 -1
- package/web/index.cjs.js +1 -1
- package/web/index.js +16 -19
- package/core/useCubeCamera.cjs.js +0 -1
- package/core/useCubeCamera.d.ts +0 -14
- package/core/useCubeCamera.js +0 -49
- package/core/useCubeTexture.cjs.js +0 -1
- package/core/useCubeTexture.d.ts +0 -9
- package/core/useDetectGPU.cjs.js +0 -1
- package/core/useDetectGPU.d.ts +0 -2
- package/core/useDetectGPU.js +0 -6
- package/core/useFBO.cjs.js +0 -1
- package/core/useFBX.cjs.js +0 -1
- package/core/useFBX.d.ts +0 -6
- package/core/useFBX.js +0 -10
- package/core/useGLTF.cjs.js +0 -1
- package/core/useGLTF.d.ts +0 -8
- package/core/useGLTF.js +0 -32
- package/core/useHelper.cjs.js +0 -1
- package/core/useHelper.d.ts +0 -11
- package/core/useHelper.js +0 -30
- package/core/useKTX2.cjs.js +0 -1
- package/core/useMatcapTexture.cjs.js +0 -1
- package/core/useMatcapTexture.d.ts +0 -2
- package/core/useNormalTexture.cjs.js +0 -1
- package/core/useNormalTexture.d.ts +0 -8
- package/core/useProgress.cjs.js +0 -1
- package/core/useTexture.cjs.js +0 -1
- package/core/useTrailTexture.cjs.js +0 -1
- package/core/useVideoTexture.cjs.js +0 -1
- package/core/useVideoTexture.d.ts +0 -12
- /package/core/{useBVH.cjs.js → Bvh.cjs.js} +0 -0
- /package/core/{useBVH.d.ts → Bvh.d.ts} +0 -0
- /package/core/{useBVH.js → Bvh.js} +0 -0
package/README.md
CHANGED
|
@@ -11,7 +11,8 @@ A growing collection of useful helpers and fully functional, ready-made abstract
|
|
|
11
11
|
npm install @react-three/drei
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
> [!IMPORTANT]
|
|
15
|
+
> this package is using the stand-alone [`three-stdlib`](https://github.com/pmndrs/three-stdlib) instead of [`three/examples/jsm`](https://github.com/mrdoob/three.js/tree/master/examples/jsm).
|
|
15
16
|
|
|
16
17
|
### Basic usage:
|
|
17
18
|
|
|
@@ -1106,9 +1107,9 @@ export type GridProps = GridMaterialType & {
|
|
|
1106
1107
|
<Grid />
|
|
1107
1108
|
```
|
|
1108
1109
|
|
|
1109
|
-
#### useHelper
|
|
1110
|
+
#### Helper / useHelper
|
|
1110
1111
|
|
|
1111
|
-
[](https://drei.vercel.app/?path=/story/
|
|
1112
|
+
[](https://drei.vercel.app/?path=/story/gizmos-helper)
|
|
1112
1113
|
|
|
1113
1114
|
A hook for a quick way to add helpers to existing nodes in the scene. It handles removal of the helper on unmount and auto-updates it by default.
|
|
1114
1115
|
|
|
@@ -1120,11 +1121,7 @@ useHelper(condition && mesh, BoxHelper, 'red') // you can pass false instead of
|
|
|
1120
1121
|
<mesh ref={mesh} ... />
|
|
1121
1122
|
```
|
|
1122
1123
|
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
[](https://drei.vercel.app/?path=/story/gizmos-helper--default-story)
|
|
1126
|
-
|
|
1127
|
-
A component for declaratively adding helpers to existing nodes in the scene. It handles removal of the helper on unmount and auto-updates it by default.
|
|
1124
|
+
or with `Helper`:
|
|
1128
1125
|
|
|
1129
1126
|
```jsx
|
|
1130
1127
|
<mesh>
|
|
@@ -1942,14 +1939,6 @@ Accepts an SVG url or svg raw data.
|
|
|
1942
1939
|
<Svg src={urlOrRawSvgString} />
|
|
1943
1940
|
```
|
|
1944
1941
|
|
|
1945
|
-
#### Gltf
|
|
1946
|
-
|
|
1947
|
-
This is a convenience component that will load a gltf file and clone the scene using [drei/Clone](#clone). That means you can re-use and mount the same gltf file multiple times. It accepts all props that Clone does, including shortcuts (castShadow, receiveShadow) and material overrides.
|
|
1948
|
-
|
|
1949
|
-
```js
|
|
1950
|
-
<Gltf src="/model.glb" receiveShadow castShadow />
|
|
1951
|
-
```
|
|
1952
|
-
|
|
1953
1942
|
#### AsciiRenderer
|
|
1954
1943
|
|
|
1955
1944
|
<p>
|
|
@@ -2825,9 +2814,9 @@ const depthBuffer = useDepthBuffer({
|
|
|
2825
2814
|
return <SomethingThatNeedsADepthBuffer depthBuffer={depthBuffer} />
|
|
2826
2815
|
```
|
|
2827
2816
|
|
|
2828
|
-
#### useFBO
|
|
2817
|
+
#### Fbo / useFBO
|
|
2829
2818
|
|
|
2830
|
-
[](https://drei.vercel.app/?path=/story/misc-
|
|
2819
|
+
[](https://drei.vercel.app/?path=/story/misc-fbo)
|
|
2831
2820
|
|
|
2832
2821
|
Creates a `THREE.WebGLRenderTarget`.
|
|
2833
2822
|
|
|
@@ -2869,9 +2858,9 @@ A hook for the rare case when you are using non-default cameras for heads-up-dis
|
|
|
2869
2858
|
<mesh raycast={useCamera(customCamera)} />
|
|
2870
2859
|
```
|
|
2871
2860
|
|
|
2872
|
-
#### useCubeCamera
|
|
2861
|
+
#### CubeCamera / useCubeCamera
|
|
2873
2862
|
|
|
2874
|
-
[](https://drei.
|
|
2863
|
+
[](https://drei.pmnd.rs/?path=/story/camera-cubecamera)
|
|
2875
2864
|
|
|
2876
2865
|
Creates a [`THREE.CubeCamera`](https://threejs.org/docs/#api/en/cameras/CubeCamera) that renders into a `fbo` renderTarget and that you can `update()`.
|
|
2877
2866
|
|
|
@@ -2894,9 +2883,9 @@ export function useCubeCamera({
|
|
|
2894
2883
|
const { fbo, camera, update } = useCubeCamera()
|
|
2895
2884
|
```
|
|
2896
2885
|
|
|
2897
|
-
#### useDetectGPU
|
|
2886
|
+
#### DetectGPU / useDetectGPU
|
|
2898
2887
|
|
|
2899
|
-
[](https://drei.pmnd.rs/?path=/story/misc-
|
|
2888
|
+
[](https://drei.pmnd.rs/?path=/story/misc-detectgpu)
|
|
2900
2889
|
|
|
2901
2890
|
This hook uses [DetectGPU by @TimvanScherpenzeel](https://github.com/TimvanScherpenzeel/detect-gpu), wrapped into suspense, to determine what tier should be assigned to the user's GPU.
|
|
2902
2891
|
|
|
@@ -2981,9 +2970,9 @@ const projection = useBoxProjectedEnv(
|
|
|
2981
2970
|
</CubeCamera>
|
|
2982
2971
|
```
|
|
2983
2972
|
|
|
2984
|
-
#### useTrail
|
|
2973
|
+
#### Trail / useTrail
|
|
2985
2974
|
|
|
2986
|
-
[](https://drei.vercel.app/?path=/story/misc-trail
|
|
2975
|
+
[](https://drei.vercel.app/?path=/story/misc-trail)
|
|
2987
2976
|
|
|
2988
2977
|
A hook to obtain an array of points that make up a [Trail](#trail). You can use this array to drive your own `MeshLine` or make a trail out of anything you please.
|
|
2989
2978
|
|
|
@@ -3103,9 +3092,9 @@ You can override styles, too.
|
|
|
3103
3092
|
>
|
|
3104
3093
|
```
|
|
3105
3094
|
|
|
3106
|
-
#### useProgress
|
|
3095
|
+
#### Progress / useProgress
|
|
3107
3096
|
|
|
3108
|
-
[](https://drei.vercel.app/?path=/story/misc-
|
|
3097
|
+
[](https://drei.vercel.app/?path=/story/misc-progress)
|
|
3109
3098
|
|
|
3110
3099
|
A convenience hook that wraps `THREE.DefaultLoadingManager`'s progress status.
|
|
3111
3100
|
|
|
@@ -3130,7 +3119,7 @@ const errors = useProgress((state) => state.errors)
|
|
|
3130
3119
|
|
|
3131
3120
|
👉 Note that your loading component does not have to be a suspense fallback. You can use it anywhere, even in your dom tree, for instance for overlays.
|
|
3132
3121
|
|
|
3133
|
-
#### useGLTF
|
|
3122
|
+
#### Gltf / useGLTF
|
|
3134
3123
|
|
|
3135
3124
|
[](https://drei.pmnd.rs/?path=/story/loaders-gltf)
|
|
3136
3125
|
|
|
@@ -3165,7 +3154,7 @@ If you want to use your own draco decoder globally, you can pass it through `use
|
|
|
3165
3154
|
>
|
|
3166
3155
|
> It is recommended that you check your browser's network tab to confirm that the correct URLs are being used, and that the files do get loaded from the prefetch cache on subsequent requests.
|
|
3167
3156
|
|
|
3168
|
-
#### useFBX
|
|
3157
|
+
#### Fbx / useFBX
|
|
3169
3158
|
|
|
3170
3159
|
[](https://drei.pmnd.rs/?path=/story/loaders-fbx)
|
|
3171
3160
|
|
|
@@ -3180,7 +3169,7 @@ function SuzanneFBX() {
|
|
|
3180
3169
|
}
|
|
3181
3170
|
```
|
|
3182
3171
|
|
|
3183
|
-
#### useTexture
|
|
3172
|
+
#### Texture / useTexture
|
|
3184
3173
|
|
|
3185
3174
|
[](https://drei.pmnd.rs/?path=/story/loaders-texture)
|
|
3186
3175
|
|
|
@@ -3201,9 +3190,9 @@ const props = useTexture({
|
|
|
3201
3190
|
return <meshStandardMaterial {...props} />
|
|
3202
3191
|
```
|
|
3203
3192
|
|
|
3204
|
-
#### useKTX2
|
|
3193
|
+
#### Ktx2 / useKTX2
|
|
3205
3194
|
|
|
3206
|
-
[](https://drei.pmnd.rs/?path=/story/loaders-ktx2
|
|
3195
|
+
[](https://drei.pmnd.rs/?path=/story/loaders-ktx2)
|
|
3207
3196
|
|
|
3208
3197
|
A convenience hook that uses `useLoader` and `KTX2Loader`
|
|
3209
3198
|
|
|
@@ -3214,9 +3203,9 @@ const [texture1, texture2] = useKTX2([texture1, texture2])
|
|
|
3214
3203
|
return <meshStandardMaterial map={texture} />
|
|
3215
3204
|
```
|
|
3216
3205
|
|
|
3217
|
-
#### useCubeTexture
|
|
3206
|
+
#### CubeTexture / useCubeTexture
|
|
3218
3207
|
|
|
3219
|
-
[](https://drei.pmnd.rs/?path=/story/
|
|
3208
|
+
[](https://drei.pmnd.rs/?path=/story/abstractions-cubetexture)
|
|
3220
3209
|
|
|
3221
3210
|
A convenience hook that uses `useLoader` and `CubeTextureLoader`
|
|
3222
3211
|
|
|
@@ -3224,9 +3213,9 @@ A convenience hook that uses `useLoader` and `CubeTextureLoader`
|
|
|
3224
3213
|
const envMap = useCubeTexture(['px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'], { path: 'cube/' })
|
|
3225
3214
|
```
|
|
3226
3215
|
|
|
3227
|
-
#### useVideoTexture
|
|
3216
|
+
#### VideoTexture / useVideoTexture
|
|
3228
3217
|
|
|
3229
|
-
[](https://drei.pmnd.rs/?path=/story/
|
|
3218
|
+
[](https://drei.pmnd.rs/?path=/story/misc-videotexture) 
|
|
3230
3219
|
|
|
3231
3220
|
<p>
|
|
3232
3221
|
<a href="https://codesandbox.io/s/39hg8"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/39hg8/screenshot.png" alt="Demo"/></a>
|
|
@@ -3296,7 +3285,9 @@ You can fine-tune via the hls configuration:
|
|
|
3296
3285
|
|
|
3297
3286
|
> Available options: https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning
|
|
3298
3287
|
|
|
3299
|
-
#### useTrailTexture
|
|
3288
|
+
#### TrailTexture / useTrailTexture
|
|
3289
|
+
|
|
3290
|
+
[](https://drei.pmnd.rs/?path=/story/misc-trailtexture)
|
|
3300
3291
|
|
|
3301
3292
|
<p>
|
|
3302
3293
|
<a href="https://codesandbox.io/s/fj1qlg"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/fj1qlg/screenshot.png" alt="Demo"/></a>
|
|
@@ -3353,6 +3344,12 @@ useFont.preload('/fonts/helvetiker_regular.typeface.json')
|
|
|
3353
3344
|
|
|
3354
3345
|
Loads texture and JSON files with multiple or single animations and parses them into appropriate format. These assets can be used by multiple SpriteAnimator components to save memory and loading times.
|
|
3355
3346
|
|
|
3347
|
+
Returns: `{spriteTexture:Texture, spriteData:{any[], object}, aspect:Vector3}`
|
|
3348
|
+
|
|
3349
|
+
- spriteTexture: The ThreeJS Texture
|
|
3350
|
+
- spriteData: A collection of the sprite frames, and some meta information (width, height)
|
|
3351
|
+
- aspect: Information about the aspect ratio of the sprite sheet
|
|
3352
|
+
|
|
3356
3353
|
```jsx
|
|
3357
3354
|
/** The texture url to load the sprite frames from */
|
|
3358
3355
|
input?: Url | null,
|
|
@@ -3625,7 +3622,7 @@ Drop this component into your scene and it will switch off the raycaster while t
|
|
|
3625
3622
|
|
|
3626
3623
|
#### Bvh
|
|
3627
3624
|
|
|
3628
|
-
[](https://drei.vercel.app/?path=/story/performance-
|
|
3625
|
+
[](https://drei.vercel.app/?path=/story/performance-bvh)
|
|
3629
3626
|
|
|
3630
3627
|
An abstraction around [gkjohnson/three-mesh-bvh](https://github.com/gkjohnson/three-mesh-bvh) to speed up raycasting exponentially. Use this component to wrap your scene, a sub-graph, a model or single mesh, and it will automatically compute boundsTree and assign acceleratedRaycast. This component is side-effect free, once unmounted or disabled it will revert to the original raycast.
|
|
3631
3628
|
|
|
@@ -5005,9 +5002,9 @@ const rgbeTexture = useEnvironment({ files: 'model.hdr' })
|
|
|
5005
5002
|
const cubeTexture = useEnvironment({ files: ['px', 'nx', 'py', 'ny', 'pz', 'nz'].map((n) => `${n}.png`) })
|
|
5006
5003
|
```
|
|
5007
5004
|
|
|
5008
|
-
#### useMatcapTexture
|
|
5005
|
+
#### MatcapTexture / useMatcapTexture
|
|
5009
5006
|
|
|
5010
|
-
[](https://drei.pmnd.rs/?path=/story/staging-
|
|
5007
|
+
[](https://drei.pmnd.rs/?path=/story/staging-matcaptexture) 
|
|
5011
5008
|
|
|
5012
5009
|
Loads matcap textures from this repository: https://github.com/emmelleppi/matcaps
|
|
5013
5010
|
|
|
@@ -5036,9 +5033,9 @@ const [matcap] = useMatcapTexture('3E2335_D36A1B_8E4A2E_2842A5')
|
|
|
5036
5033
|
|
|
5037
5034
|
👉 Use the `url` to download the texture when you are ready for production!
|
|
5038
5035
|
|
|
5039
|
-
#### useNormalTexture
|
|
5036
|
+
#### NormalTexture / useNormalTexture
|
|
5040
5037
|
|
|
5041
|
-
[](https://drei.pmnd.rs/?path=/story/staging-
|
|
5038
|
+
[](https://drei.pmnd.rs/?path=/story/staging-normaltexture) 
|
|
5042
5039
|
|
|
5043
5040
|
Loads normal textures from this repository: https://github.com/emmelleppi/normal-maps
|
|
5044
5041
|
|
package/core/Caustics.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),o=require("./useFBO.cjs.js"),i=require("./useHelper.cjs.js"),a=require("./shaderMaterial.cjs.js"),l=require("./Edges.cjs.js"),c=require("three-stdlib"),s=require("../helpers/constants.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function d(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("./Line.cjs.js");var m=u(e),p=d(r),v=d(t);function f(e=p.FrontSide){const r={value:new p.Matrix4};return Object.assign(new p.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 x=a.shaderMaterial({causticsTexture:null,causticsTextureB:null,color:new p.Color,lightProjMatrix:new p.Matrix4,lightViewMatrix:new p.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 vec3 color;\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) * color, 1.0);\n #include <tonemapping_fragment>\n #include <${s.version>=154?"colorspace_fragment":"encodings_fragment"}>\n }`),h=a.shaderMaterial({cameraMatrixWorld:new p.Matrix4,cameraProjectionMatrixInv:new p.Matrix4,normalTexture:null,depthTexture:null,lightDir:new p.Vector3(0,1,0),lightPlaneNormal:new p.Vector3(0,1,0),lightPlaneConstant:0,near:.1,far:100,modelMatrix:new p.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 vec3 lightPlaneNormal;\n uniform float lightPlaneConstant;\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(lightPlaneNormal, lightPlaneConstant));\n float t2 = planeIntersect(endPos2, endDir2, vec4(lightPlaneNormal, lightPlaneConstant));\n float t3 = planeIntersect(endPos3, endDir3, vec4(lightPlaneNormal, lightPlaneConstant));\n float t4 = planeIntersect(endPos4, endDir4, vec4(lightPlaneNormal, lightPlaneConstant));\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 }"),g={depth:!0,minFilter:p.LinearFilter,magFilter:p.LinearFilter,type:p.UnsignedByteType},P={minFilter:p.LinearMipmapLinearFilter,magFilter:p.LinearFilter,type:p.FloatType,generateMipmaps:!0},y=v.forwardRef((({debug:e,children:r,frames:t=1,ior:a=1.1,color:s="white",causticsOnly:u=!1,backside:d=!1,backsideIOR:y=1.1,worldRadius:M=.3125,intensity:D=.05,resolution:w=2024,lightSource:T=[5,5,5],...j},S)=>{n.extend({CausticsProjectionMaterial:x});const b=v.useRef(null),F=v.useRef(null),z=v.useRef(null),W=v.useRef(null),R=n.useThree((e=>e.gl)),I=i.useHelper(e&&F,p.CameraHelper),O=o.useFBO(w,w,g),C=o.useFBO(w,w,g),_=o.useFBO(w,w,P),V=o.useFBO(w,w,P),[B]=v.useState((()=>f())),[E]=v.useState((()=>f(p.BackSide))),[q]=v.useState((()=>new h)),[A]=v.useState((()=>new c.FullScreenQuad(q)));v.useLayoutEffect((()=>{b.current.updateWorldMatrix(!1,!0)}));let N=0;const k=new p.Vector3,U=new p.Frustum,L=new p.Matrix4,H=new p.Plane,G=new p.Vector3,Q=new p.Vector3,$=new p.Box3,J=new p.Vector3,K=[],X=[],Y=[],Z=[],ee=new p.Vector3;for(let e=0;e<8;e++)K.push(new p.Vector3),X.push(new p.Vector3),Y.push(new p.Vector3),Z.push(new p.Vector3);return n.useFrame((()=>{if(t===1/0||N++<t){var r,n;Array.isArray(T)?G.fromArray(T).normalize():G.copy(b.current.worldToLocal(T.current.getWorldPosition(k)).normalize()),Q.copy(G).multiplyScalar(-1),null==(r=z.current.parent)||r.matrixWorld.identity(),$.setFromObject(z.current,!0),K[0].set($.min.x,$.min.y,$.min.z),K[1].set($.min.x,$.min.y,$.max.z),K[2].set($.min.x,$.max.y,$.min.z),K[3].set($.min.x,$.max.y,$.max.z),K[4].set($.max.x,$.min.y,$.min.z),K[5].set($.max.x,$.min.y,$.max.z),K[6].set($.max.x,$.max.y,$.min.z),K[7].set($.max.x,$.max.y,$.max.z);for(let e=0;e<8;e++)X[e].copy(K[e]);$.getCenter(J),K.map((e=>e.sub(J)));const t=H.set(Q,0);K.map(((e,r)=>t.projectPoint(e,Y[r])));const o=Y.reduce(((e,r)=>e.add(r)),k.set(0,0,0)).divideScalar(Y.length),i=Y.map((e=>e.distanceTo(o))).reduce(((e,r)=>Math.max(e,r))),l=K.map((e=>e.dot(G))).reduce(((e,r)=>Math.max(e,r)));F.current.position.copy(ee.copy(G).multiplyScalar(l).add(J)),F.current.lookAt(z.current.localToWorld(J));const c=L.lookAt(F.current.position,J,k.set(0,1,0));F.current.left=-i,F.current.right=i,F.current.top=i,F.current.bottom=-i;const s=k.set(0,i,0).applyMatrix4(c),m=(F.current.position.y+s.y)/G.y;F.current.near=.1,F.current.far=m,F.current.updateProjectionMatrix(),F.current.updateMatrixWorld();const p=X.map(((e,r)=>e.add(Z[r].copy(G).multiplyScalar(-e.y/G.y)))),v=p.reduce(((e,r)=>e.add(r)),k.set(0,0,0)).divideScalar(p.length),f=2*p.map((e=>Math.hypot(e.x-v.x,e.z-v.z))).reduce(((e,r)=>Math.max(e,r)));W.current.scale.setScalar(f),W.current.position.copy(v),e&&(null==(n=I.current)||n.update()),E.viewMatrix.value=B.viewMatrix.value=F.current.matrixWorldInverse;const x=U.setFromProjectionMatrix(L.multiplyMatrices(F.current.projectionMatrix,F.current.matrixWorldInverse)).planes[4];q.cameraMatrixWorld=F.current.matrixWorld,q.cameraProjectionMatrixInv=F.current.projectionMatrixInverse,q.lightDir=Q,q.lightPlaneNormal=x.normal,q.lightPlaneConstant=x.constant,q.near=F.current.near,q.far=F.current.far,q.resolution=w,q.size=i,q.intensity=D,q.worldRadius=M,z.current.visible=!0,R.setRenderTarget(O),R.clear(),z.current.overrideMaterial=B,R.render(z.current,F.current),R.setRenderTarget(C),R.clear(),d&&(z.current.overrideMaterial=E,R.render(z.current,F.current)),z.current.overrideMaterial=null,q.ior=a,W.current.material.lightProjMatrix=F.current.projectionMatrix,W.current.material.lightViewMatrix=F.current.matrixWorldInverse,q.normalTexture=O.texture,q.depthTexture=O.depthTexture,R.setRenderTarget(_),R.clear(),A.render(R),q.ior=y,q.normalTexture=C.texture,q.depthTexture=C.depthTexture,R.setRenderTarget(V),R.clear(),d&&A.render(R),R.setRenderTarget(null),u&&(z.current.visible=!1)}})),v.useImperativeHandle(S,(()=>b.current),[]),v.createElement("group",m.default({ref:b},j),v.createElement("scene",{ref:z},v.createElement("orthographicCamera",{ref:F,up:[0,1,0]}),r),v.createElement("mesh",{renderOrder:2,ref:W,"rotation-x":-Math.PI/2},v.createElement("planeGeometry",null),v.createElement("causticsProjectionMaterial",{transparent:!0,color:s,causticsTexture:_.texture,causticsTextureB:V.texture,blending:p.CustomBlending,blendSrc:p.OneFactor,blendDst:p.SrcAlphaFactor,depthWrite:!1}),e&&v.createElement(l.Edges,null,v.createElement("lineBasicMaterial",{color:"#ffff00",toneMapped:!1}))))}));exports.Caustics=y;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),o=require("./Fbo.cjs.js"),i=require("./Helper.cjs.js"),a=require("./shaderMaterial.cjs.js"),l=require("./Edges.cjs.js"),c=require("three-stdlib"),s=require("../helpers/constants.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function d(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("./Line.cjs.js");var m=u(e),p=d(r),v=d(t);function f(e=p.FrontSide){const r={value:new p.Matrix4};return Object.assign(new p.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 x=a.shaderMaterial({causticsTexture:null,causticsTextureB:null,color:new p.Color,lightProjMatrix:new p.Matrix4,lightViewMatrix:new p.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 vec3 color;\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) * color, 1.0);\n #include <tonemapping_fragment>\n #include <${s.version>=154?"colorspace_fragment":"encodings_fragment"}>\n }`),h=a.shaderMaterial({cameraMatrixWorld:new p.Matrix4,cameraProjectionMatrixInv:new p.Matrix4,normalTexture:null,depthTexture:null,lightDir:new p.Vector3(0,1,0),lightPlaneNormal:new p.Vector3(0,1,0),lightPlaneConstant:0,near:.1,far:100,modelMatrix:new p.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 vec3 lightPlaneNormal;\n uniform float lightPlaneConstant;\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(lightPlaneNormal, lightPlaneConstant));\n float t2 = planeIntersect(endPos2, endDir2, vec4(lightPlaneNormal, lightPlaneConstant));\n float t3 = planeIntersect(endPos3, endDir3, vec4(lightPlaneNormal, lightPlaneConstant));\n float t4 = planeIntersect(endPos4, endDir4, vec4(lightPlaneNormal, lightPlaneConstant));\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 }"),g={depth:!0,minFilter:p.LinearFilter,magFilter:p.LinearFilter,type:p.UnsignedByteType},P={minFilter:p.LinearMipmapLinearFilter,magFilter:p.LinearFilter,type:p.FloatType,generateMipmaps:!0},y=v.forwardRef((({debug:e,children:r,frames:t=1,ior:a=1.1,color:s="white",causticsOnly:u=!1,backside:d=!1,backsideIOR:y=1.1,worldRadius:M=.3125,intensity:D=.05,resolution:w=2024,lightSource:T=[5,5,5],...j},b)=>{n.extend({CausticsProjectionMaterial:x});const S=v.useRef(null),F=v.useRef(null),z=v.useRef(null),W=v.useRef(null),R=n.useThree((e=>e.gl)),I=i.useHelper(e&&F,p.CameraHelper),C=o.useFBO(w,w,g),O=o.useFBO(w,w,g),_=o.useFBO(w,w,P),V=o.useFBO(w,w,P),[B]=v.useState((()=>f())),[E]=v.useState((()=>f(p.BackSide))),[q]=v.useState((()=>new h)),[A]=v.useState((()=>new c.FullScreenQuad(q)));v.useLayoutEffect((()=>{S.current.updateWorldMatrix(!1,!0)}));let N=0;const k=new p.Vector3,U=new p.Frustum,L=new p.Matrix4,H=new p.Plane,G=new p.Vector3,Q=new p.Vector3,$=new p.Box3,J=new p.Vector3,K=[],X=[],Y=[],Z=[],ee=new p.Vector3;for(let e=0;e<8;e++)K.push(new p.Vector3),X.push(new p.Vector3),Y.push(new p.Vector3),Z.push(new p.Vector3);return n.useFrame((()=>{if(t===1/0||N++<t){var r,n;Array.isArray(T)?G.fromArray(T).normalize():G.copy(S.current.worldToLocal(T.current.getWorldPosition(k)).normalize()),Q.copy(G).multiplyScalar(-1),null==(r=z.current.parent)||r.matrixWorld.identity(),$.setFromObject(z.current,!0),K[0].set($.min.x,$.min.y,$.min.z),K[1].set($.min.x,$.min.y,$.max.z),K[2].set($.min.x,$.max.y,$.min.z),K[3].set($.min.x,$.max.y,$.max.z),K[4].set($.max.x,$.min.y,$.min.z),K[5].set($.max.x,$.min.y,$.max.z),K[6].set($.max.x,$.max.y,$.min.z),K[7].set($.max.x,$.max.y,$.max.z);for(let e=0;e<8;e++)X[e].copy(K[e]);$.getCenter(J),K.map((e=>e.sub(J)));const t=H.set(Q,0);K.map(((e,r)=>t.projectPoint(e,Y[r])));const o=Y.reduce(((e,r)=>e.add(r)),k.set(0,0,0)).divideScalar(Y.length),i=Y.map((e=>e.distanceTo(o))).reduce(((e,r)=>Math.max(e,r))),l=K.map((e=>e.dot(G))).reduce(((e,r)=>Math.max(e,r)));F.current.position.copy(ee.copy(G).multiplyScalar(l).add(J)),F.current.lookAt(z.current.localToWorld(J));const c=L.lookAt(F.current.position,J,k.set(0,1,0));F.current.left=-i,F.current.right=i,F.current.top=i,F.current.bottom=-i;const s=k.set(0,i,0).applyMatrix4(c),m=(F.current.position.y+s.y)/G.y;F.current.near=.1,F.current.far=m,F.current.updateProjectionMatrix(),F.current.updateMatrixWorld();const p=X.map(((e,r)=>e.add(Z[r].copy(G).multiplyScalar(-e.y/G.y)))),v=p.reduce(((e,r)=>e.add(r)),k.set(0,0,0)).divideScalar(p.length),f=2*p.map((e=>Math.hypot(e.x-v.x,e.z-v.z))).reduce(((e,r)=>Math.max(e,r)));W.current.scale.setScalar(f),W.current.position.copy(v),e&&(null==(n=I.current)||n.update()),E.viewMatrix.value=B.viewMatrix.value=F.current.matrixWorldInverse;const x=U.setFromProjectionMatrix(L.multiplyMatrices(F.current.projectionMatrix,F.current.matrixWorldInverse)).planes[4];q.cameraMatrixWorld=F.current.matrixWorld,q.cameraProjectionMatrixInv=F.current.projectionMatrixInverse,q.lightDir=Q,q.lightPlaneNormal=x.normal,q.lightPlaneConstant=x.constant,q.near=F.current.near,q.far=F.current.far,q.resolution=w,q.size=i,q.intensity=D,q.worldRadius=M,z.current.visible=!0,R.setRenderTarget(C),R.clear(),z.current.overrideMaterial=B,R.render(z.current,F.current),R.setRenderTarget(O),R.clear(),d&&(z.current.overrideMaterial=E,R.render(z.current,F.current)),z.current.overrideMaterial=null,q.ior=a,W.current.material.lightProjMatrix=F.current.projectionMatrix,W.current.material.lightViewMatrix=F.current.matrixWorldInverse,q.normalTexture=C.texture,q.depthTexture=C.depthTexture,R.setRenderTarget(_),R.clear(),A.render(R),q.ior=y,q.normalTexture=O.texture,q.depthTexture=O.depthTexture,R.setRenderTarget(V),R.clear(),d&&A.render(R),R.setRenderTarget(null),u&&(z.current.visible=!1)}})),v.useImperativeHandle(b,(()=>S.current),[]),v.createElement("group",m.default({ref:S},j),v.createElement("scene",{ref:z},v.createElement("orthographicCamera",{ref:F,up:[0,1,0]}),r),v.createElement("mesh",{renderOrder:2,ref:W,"rotation-x":-Math.PI/2},v.createElement("planeGeometry",null),v.createElement("causticsProjectionMaterial",{transparent:!0,color:s,causticsTexture:_.texture,causticsTextureB:V.texture,blending:p.CustomBlending,blendSrc:p.OneFactor,blendDst:p.SrcAlphaFactor,depthWrite:!1}),e&&v.createElement(l.Edges,null,v.createElement("lineBasicMaterial",{color:"#ffff00",toneMapped:!1}))))}));exports.Caustics=y;
|
package/core/Caustics.js
CHANGED
|
@@ -2,8 +2,8 @@ import _extends from '@babel/runtime/helpers/esm/extends';
|
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { extend, useThree, useFrame } from '@react-three/fiber';
|
|
5
|
-
import { useFBO } from './
|
|
6
|
-
import { useHelper } from './
|
|
5
|
+
import { useFBO } from './Fbo.js';
|
|
6
|
+
import { useHelper } from './Helper.js';
|
|
7
7
|
import { shaderMaterial } from './shaderMaterial.js';
|
|
8
8
|
import { Edges } from './Edges.js';
|
|
9
9
|
import { FullScreenQuad } from 'three-stdlib';
|
package/core/Cloud.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),n=require("@react-three/fiber"),a=require("./
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),n=require("@react-three/fiber"),a=require("./Texture.cjs.js"),o=require("uuid"),u=require("../helpers/deprecated.cjs.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(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)}var l=i(e),s=c(t);const d=new r.Matrix4,f=new r.Vector3,m=new r.Quaternion,p=new r.Vector3,g=new r.Quaternion,h=new r.Vector3,y=s.createContext(null),x=s.forwardRef((({children:e,material:t=r.MeshLambertMaterial,texture:o="https://rawcdn.githack.com/pmndrs/drei-assets/9225a9f1fbd449d9411125c2f419b843d0308c9f/cloud.png",range:i,limit:c=200,frustumCulled:x,...v},b)=>{var M,w;const C=s.useMemo((()=>class extends t{constructor(){super();const e=parseInt(r.REVISION.replace(/\D+/g,""))>=154?"opaque_fragment":"output_fragment";this.onBeforeCompile=t=>{t.vertexShader="attribute float opacity;\n varying float vOpacity;\n "+t.vertexShader.replace("#include <fog_vertex>","#include <fog_vertex>\n vOpacity = opacity;\n "),t.fragmentShader="varying float vOpacity;\n "+t.fragmentShader.replace(`#include <${e}>`,`#include <${e}>\n gl_FragColor = vec4(outgoingLight, diffuseColor.a * vOpacity);\n `)}}}),[t]);n.extend({CloudMaterial:C});const E=s.useRef(null),A=s.useRef([]),O=s.useMemo((()=>new Float32Array(Array.from({length:c},(()=>1)))),[c]),j=s.useMemo((()=>new Float32Array(Array.from({length:c},(()=>[1,1,1])).flat())),[c]),R=a.useTexture(o);let U,V=0,_=0;const q=new r.Quaternion,F=new r.Vector3(0,0,1),S=new r.Vector3;n.useFrame(((e,t)=>{for(V=e.clock.getElapsedTime(),d.copy(E.current.matrixWorld).invert(),e.camera.matrixWorld.decompose(p,g,h),_=0;_<A.current.length;_++)U=A.current[_],U.ref.current.matrixWorld.decompose(f,m,h),f.add(S.copy(U.position).applyQuaternion(m).multiply(h)),m.copy(g).multiply(q.setFromAxisAngle(F,U.rotation+=t*U.rotationFactor)),h.multiplyScalar(U.volume+(1+Math.sin(V*U.density*U.speed))/2*U.growth),U.matrix.compose(f,m,h).premultiply(d),U.dist=f.distanceTo(p);for(A.current.sort(((e,t)=>t.dist-e.dist)),_=0;_<A.current.length;_++)U=A.current[_],O[_]=U.opacity*(U.dist<U.fade-1?U.dist/U.fade:1),E.current.setMatrixAt(_,U.matrix),E.current.setColorAt(_,U.color);E.current.geometry.attributes.opacity.needsUpdate=!0,E.current.instanceMatrix.needsUpdate=!0,E.current.instanceColor&&(E.current.instanceColor.needsUpdate=!0)})),s.useLayoutEffect((()=>{const e=Math.min(c,void 0!==i?i:c,A.current.length);E.current.count=e,u.setUpdateRange(E.current.instanceMatrix,{offset:0,count:16*e}),E.current.instanceColor&&u.setUpdateRange(E.current.instanceColor,{offset:0,count:3*e}),u.setUpdateRange(E.current.geometry.attributes.opacity,{offset:0,count:e})}));let D=[null!==(M=R.image.width)&&void 0!==M?M:1,null!==(w=R.image.height)&&void 0!==w?w:1],I=Math.max(D[0],D[1]);return D=[D[0]/I,D[1]/I],s.createElement("group",l.default({ref:b},v),s.createElement(y.Provider,{value:A},e,s.createElement("instancedMesh",{matrixAutoUpdate:!1,ref:E,args:[null,null,c],frustumCulled:x},s.createElement("instancedBufferAttribute",{usage:r.DynamicDrawUsage,attach:"instanceColor",args:[j,3]}),s.createElement("planeGeometry",{args:[...D]},s.createElement("instancedBufferAttribute",{usage:r.DynamicDrawUsage,attach:"attributes-opacity",args:[O,1]})),s.createElement("cloudMaterial",{key:t.name,map:R,transparent:!0,depthWrite:!1}))))})),v=s.forwardRef((({opacity:e=1,speed:t=0,bounds:a=[5,1,1],segments:u=20,color:i="#ffffff",fade:c=10,volume:d=6,smallestVolume:f=.25,distribute:m=null,growth:p=4,concentrate:g="inside",seed:h=Math.random(),...x},v)=>{function b(){const e=1e4*Math.sin(h++);return e-Math.floor(e)}const M=s.useContext(y),w=s.useRef(null),[C]=s.useState((()=>o.v4())),E=s.useMemo((()=>[...new Array(u)].map(((e,t)=>({segments:u,bounds:new r.Vector3(1,1,1),position:new r.Vector3,uuid:C,index:t,ref:w,dist:0,matrix:new r.Matrix4,color:new r.Color,rotation:t*(Math.PI/u)})))),[u,C]);return s.useLayoutEffect((()=>{E.forEach(((r,o)=>{var l;n.applyProps(r,{volume:d,color:i,speed:t,growth:p,opacity:e,fade:c,bounds:a,density:Math.max(.5,b()),rotationFactor:Math.max(.2,.5*b())*t});const s=null==m?void 0:m(r,o);(s||u>1)&&r.position.copy(r.bounds).multiply(null!==(l=null==s?void 0:s.point)&&void 0!==l?l:{x:2*b()-1,y:2*b()-1,z:2*b()-1});const h=Math.abs(r.position.x),y=Math.abs(r.position.y),x=Math.abs(r.position.z),v=Math.max(h,y,x);r.length=1,h===v&&(r.length-=h/r.bounds.x),y===v&&(r.length-=y/r.bounds.y),x===v&&(r.length-=x/r.bounds.z),r.volume=(void 0!==(null==s?void 0:s.volume)?s.volume:Math.max(Math.max(0,f),"random"===g?b():"inside"===g?r.length:1-r.length))*d}))}),[g,a,c,i,e,p,d,h,u,t]),s.useLayoutEffect((()=>{const e=E;return M.current=[...M.current,...e],()=>{M.current=M.current.filter((e=>e.uuid!==C))}}),[E]),s.useImperativeHandle(v,(()=>w.current),[]),s.createElement("group",l.default({ref:w},x))})),b=s.forwardRef(((e,t)=>s.useContext(y)?s.createElement(v,l.default({ref:t},e)):s.createElement(x,null,s.createElement(v,l.default({ref:t},e)))));exports.Cloud=b,exports.CloudInstance=v,exports.Clouds=x;
|
package/core/Cloud.js
CHANGED
|
@@ -2,7 +2,7 @@ import _extends from '@babel/runtime/helpers/esm/extends';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { REVISION, Quaternion, Vector3, DynamicDrawUsage, MeshLambertMaterial, Matrix4, Color } from 'three';
|
|
4
4
|
import { extend, useFrame, applyProps } from '@react-three/fiber';
|
|
5
|
-
import { useTexture } from './
|
|
5
|
+
import { useTexture } from './Texture.js';
|
|
6
6
|
import { v4 } from 'uuid';
|
|
7
7
|
import { setUpdateRange } from '../helpers/deprecated.js';
|
|
8
8
|
|
package/core/CubeCamera.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");function u(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var n=u(e),a=u(r);function o({resolution:u=256,near:o=.1,far:c=1e3,envMap:s,fog:f}={}){const i=t.useThree((({gl:e})=>e)),l=t.useThree((({scene:e})=>e)),b=r.useMemo((()=>{const r=new e.WebGLCubeRenderTarget(u);return r.texture.type=e.HalfFloatType,r}),[u]);r.useEffect((()=>()=>{b.dispose()}),[b]);const p=r.useMemo((()=>new n.CubeCamera(o,c,b)),[o,c,b]);let d,g;const m=a.useCallback((()=>{d=l.fog,g=l.background,l.background=s||g,l.fog=f||d,p.update(i,l),l.fog=d,l.background=g}),[i,l,p]);return{fbo:b,camera:p,update:m}}exports.CubeCamera=function({children:e,frames:r=1/0,resolution:u,near:n,far:c,envMap:s,fog:f,...i}){const l=a.useRef(null),{fbo:b,camera:p,update:d}=o({resolution:u,near:n,far:c,envMap:s,fog:f});let g=0;return t.useFrame((()=>{l.current&&(r===1/0||g<r)&&(l.current.visible=!1,d(),l.current.visible=!0,g++)})),a.createElement("group",i,a.createElement("primitive",{object:p}),a.createElement("group",{ref:l},null==e?void 0:e(b.texture)))},exports.useCubeCamera=o;
|
package/core/CubeCamera.d.ts
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { Fog, FogExp2, Texture } from 'three';
|
|
2
3
|
import * as React from 'react';
|
|
3
|
-
|
|
4
|
+
export type CubeCameraOptions = {
|
|
5
|
+
resolution?: number;
|
|
6
|
+
near?: number;
|
|
7
|
+
far?: number;
|
|
8
|
+
envMap?: THREE.Texture;
|
|
9
|
+
fog?: Fog | FogExp2;
|
|
10
|
+
};
|
|
11
|
+
export declare function useCubeCamera({ resolution, near, far, envMap, fog }?: CubeCameraOptions): {
|
|
12
|
+
fbo: THREE.WebGLCubeRenderTarget;
|
|
13
|
+
camera: THREE.CubeCamera;
|
|
14
|
+
update: () => void;
|
|
15
|
+
};
|
|
4
16
|
type Props = Omit<JSX.IntrinsicElements['group'], 'children'> & {
|
|
5
|
-
children
|
|
17
|
+
children?: (tex: Texture) => React.ReactNode;
|
|
6
18
|
frames?: number;
|
|
7
19
|
} & CubeCameraOptions;
|
|
8
20
|
export declare function CubeCamera({ children, frames, resolution, near, far, envMap, fog, ...props }: Props): React.JSX.Element;
|
package/core/CubeCamera.js
CHANGED
|
@@ -1,7 +1,50 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { WebGLCubeRenderTarget, HalfFloatType } from 'three';
|
|
1
3
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
+
import { useMemo, useEffect } from 'react';
|
|
5
|
+
import { useThree, useFrame } from '@react-three/fiber';
|
|
4
6
|
|
|
7
|
+
function useCubeCamera({
|
|
8
|
+
resolution = 256,
|
|
9
|
+
near = 0.1,
|
|
10
|
+
far = 1000,
|
|
11
|
+
envMap,
|
|
12
|
+
fog
|
|
13
|
+
} = {}) {
|
|
14
|
+
const gl = useThree(({
|
|
15
|
+
gl
|
|
16
|
+
}) => gl);
|
|
17
|
+
const scene = useThree(({
|
|
18
|
+
scene
|
|
19
|
+
}) => scene);
|
|
20
|
+
const fbo = useMemo(() => {
|
|
21
|
+
const fbo = new WebGLCubeRenderTarget(resolution);
|
|
22
|
+
fbo.texture.type = HalfFloatType;
|
|
23
|
+
return fbo;
|
|
24
|
+
}, [resolution]);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
return () => {
|
|
27
|
+
fbo.dispose();
|
|
28
|
+
};
|
|
29
|
+
}, [fbo]);
|
|
30
|
+
const camera = useMemo(() => new THREE.CubeCamera(near, far, fbo), [near, far, fbo]);
|
|
31
|
+
let originalFog;
|
|
32
|
+
let originalBackground;
|
|
33
|
+
const update = React.useCallback(() => {
|
|
34
|
+
originalFog = scene.fog;
|
|
35
|
+
originalBackground = scene.background;
|
|
36
|
+
scene.background = envMap || originalBackground;
|
|
37
|
+
scene.fog = fog || originalFog;
|
|
38
|
+
camera.update(gl, scene);
|
|
39
|
+
scene.fog = originalFog;
|
|
40
|
+
scene.background = originalBackground;
|
|
41
|
+
}, [gl, scene, camera]);
|
|
42
|
+
return {
|
|
43
|
+
fbo,
|
|
44
|
+
camera,
|
|
45
|
+
update
|
|
46
|
+
};
|
|
47
|
+
}
|
|
5
48
|
function CubeCamera({
|
|
6
49
|
children,
|
|
7
50
|
frames = Infinity,
|
|
@@ -37,7 +80,7 @@ function CubeCamera({
|
|
|
37
80
|
object: camera
|
|
38
81
|
}), /*#__PURE__*/React.createElement("group", {
|
|
39
82
|
ref: ref
|
|
40
|
-
}, children(fbo.texture)));
|
|
83
|
+
}, children == null ? void 0 : children(fbo.texture)));
|
|
41
84
|
}
|
|
42
85
|
|
|
43
|
-
export { CubeCamera };
|
|
86
|
+
export { CubeCamera, useCubeCamera };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("three"),t=require("@react-three/fiber");function u(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var n=u(e);function a(e,{path:u}){const[n]=t.useLoader(r.CubeTextureLoader,[e],(e=>e.setPath(u)));return n}a.preload=(e,{path:u})=>t.useLoader.preload(r.CubeTextureLoader,[e],(e=>e.setPath(u))),exports.CubeTexture=function({children:e,files:r,...t}){const u=a(r,{...t});return n.createElement(n.Fragment,null,null==e?void 0:e(u))},exports.useCubeTexture=a;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { CubeTexture as _CubeTexture, Texture } from 'three';
|
|
3
|
+
type Options = {
|
|
4
|
+
path: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function useCubeTexture(files: string[], { path }: Options): _CubeTexture;
|
|
7
|
+
export declare namespace useCubeTexture {
|
|
8
|
+
var preload: (files: string[], { path }: Options) => undefined;
|
|
9
|
+
}
|
|
10
|
+
type CubeTextureProps = {
|
|
11
|
+
children?: (tex: Texture) => React.ReactNode;
|
|
12
|
+
files: Parameters<typeof useCubeTexture>[0];
|
|
13
|
+
} & Options;
|
|
14
|
+
export declare function CubeTexture({ children, files, ...options }: CubeTextureProps): React.JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import { CubeTextureLoader } from 'three';
|
|
2
3
|
import { useLoader } from '@react-three/fiber';
|
|
3
4
|
|
|
@@ -15,5 +16,15 @@ useCubeTexture.preload = (files, {
|
|
|
15
16
|
}) => useLoader.preload(
|
|
16
17
|
// @ts-ignore
|
|
17
18
|
CubeTextureLoader, [files], loader => loader.setPath(path));
|
|
19
|
+
function CubeTexture({
|
|
20
|
+
children,
|
|
21
|
+
files,
|
|
22
|
+
...options
|
|
23
|
+
}) {
|
|
24
|
+
const texture = useCubeTexture(files, {
|
|
25
|
+
...options
|
|
26
|
+
});
|
|
27
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children == null ? void 0 : children(texture));
|
|
28
|
+
}
|
|
18
29
|
|
|
19
|
-
export { useCubeTexture };
|
|
30
|
+
export { CubeTexture, useCubeTexture };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("detect-gpu"),r=require("suspend-react");function n(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)}var u=n(e);const c=e=>r.suspend((()=>t.getGPUTier(e)),["useDetectGPU"]);exports.DetectGPU=function({children:e,...t}){const r=c(t);return u.createElement(u.Fragment,null,null==e?void 0:e(r))},exports.useDetectGPU=c;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { GetGPUTier } from 'detect-gpu';
|
|
3
|
+
export declare const useDetectGPU: (props?: GetGPUTier) => import("detect-gpu").TierResult;
|
|
4
|
+
type DetectGPUProps = {
|
|
5
|
+
children?: (result: ReturnType<typeof useDetectGPU>) => React.ReactNode;
|
|
6
|
+
} & Parameters<typeof useDetectGPU>[0];
|
|
7
|
+
export declare function DetectGPU({ children, ...options }: DetectGPUProps): React.JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { getGPUTier } from 'detect-gpu';
|
|
3
|
+
import { suspend } from 'suspend-react';
|
|
4
|
+
|
|
5
|
+
const useDetectGPU = props => suspend(() => getGPUTier(props), ['useDetectGPU']);
|
|
6
|
+
function DetectGPU({
|
|
7
|
+
children,
|
|
8
|
+
...options
|
|
9
|
+
}) {
|
|
10
|
+
const result = useDetectGPU(options);
|
|
11
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children == null ? void 0 : children(result));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { DetectGPU, useDetectGPU };
|
package/core/Example.d.ts
CHANGED
package/core/Example.js
CHANGED
|
@@ -3,6 +3,9 @@ import { Text3D } from './Text3D.js';
|
|
|
3
3
|
import { Center } from './Center.js';
|
|
4
4
|
|
|
5
5
|
/* eslint react-hooks/exhaustive-deps: 1 */
|
|
6
|
+
/**
|
|
7
|
+
* A simple counter example component. Click to increment, meta-click to decrement.
|
|
8
|
+
*/
|
|
6
9
|
const Example = /* @__PURE__ */React.forwardRef(({
|
|
7
10
|
font,
|
|
8
11
|
color = '#cbcbcb',
|
package/core/Fbo.cjs.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber");function n(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)}var u=n(e),i=n(t);function o(e,t,n){const o=r.useThree((e=>e.size)),s=r.useThree((e=>e.viewport)),a="number"==typeof e?e:o.width*s.dpr,l="number"==typeof t?t:o.height*s.dpr,c=("number"==typeof e?n:e)||{},{samples:p=0,depth:f,...d}=c,h=u.useMemo((()=>{const e=new i.WebGLRenderTarget(a,l,{minFilter:i.LinearFilter,magFilter:i.LinearFilter,type:i.HalfFloatType,...d});return f&&(e.depthTexture=new i.DepthTexture(a,l,i.FloatType)),e.samples=p,e}),[]);return u.useLayoutEffect((()=>{h.setSize(a,l),p&&(h.samples=p)}),[p,h,a,l]),u.useEffect((()=>()=>h.dispose()),[]),h}exports.Fbo=({children:e,width:t,height:r,...n})=>{const i=o(t,r,n);return u.createElement(u.Fragment,null,null==e?void 0:e(i))},exports.useFBO=o;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import * as THREE from 'three';
|
|
2
3
|
import { TextureEncoding } from '../helpers/deprecated';
|
|
3
4
|
type ColorSpace = 'srgb' | 'srgb-linear' | '' | string;
|
|
@@ -19,4 +20,9 @@ type FBOSettings = {
|
|
|
19
20
|
colorSpace?: ColorSpace | undefined;
|
|
20
21
|
};
|
|
21
22
|
export declare function useFBO(width?: number | FBOSettings, height?: number, settings?: FBOSettings): THREE.WebGLRenderTarget;
|
|
23
|
+
export declare const Fbo: ({ children, width, height, ...settings }: {
|
|
24
|
+
children?: ((target: ReturnType<typeof useFBO>) => React.ReactNode) | undefined;
|
|
25
|
+
width: Parameters<typeof useFBO>[0];
|
|
26
|
+
height: Parameters<typeof useFBO>[1];
|
|
27
|
+
} & FBOSettings) => React.JSX.Element;
|
|
22
28
|
export {};
|
|
@@ -42,5 +42,14 @@ settings) {
|
|
|
42
42
|
}, []);
|
|
43
43
|
return target;
|
|
44
44
|
}
|
|
45
|
+
const Fbo = ({
|
|
46
|
+
children,
|
|
47
|
+
width,
|
|
48
|
+
height,
|
|
49
|
+
...settings
|
|
50
|
+
}) => {
|
|
51
|
+
const target = useFBO(width, height, settings);
|
|
52
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, children == null ? void 0 : children(target));
|
|
53
|
+
};
|
|
45
54
|
|
|
46
|
-
export { useFBO };
|
|
55
|
+
export { Fbo, useFBO };
|
package/core/Fbx.cjs.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three-stdlib"),u=require("@react-three/fiber"),n=require("./Clone.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function a(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("three");var c=o(e),i=a(r);function l(e){return u.useLoader(t.FBXLoader,e)}l.preload=e=>u.useLoader.preload(t.FBXLoader,e),l.clear=e=>u.useLoader.clear(t.FBXLoader,e),exports.Fbx=function({path:e,...r}){const t=l(e).children[0];return i.createElement(n.Clone,c.default({},r,{object:t}))},exports.useFBX=l;
|
package/core/Fbx.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Group } from 'three';
|
|
3
|
+
import { Clone } from './Clone';
|
|
4
|
+
export declare function useFBX(path: string): Group;
|
|
5
|
+
export declare namespace useFBX {
|
|
6
|
+
var preload: (path: string) => undefined;
|
|
7
|
+
var clear: (input: string | string[]) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function Fbx({ path, ...props }: {
|
|
10
|
+
path: Parameters<typeof useFBX>[0];
|
|
11
|
+
} & Omit<React.ComponentProps<typeof Clone>, 'object'>): React.JSX.Element;
|
package/core/Fbx.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import _extends from '@babel/runtime/helpers/esm/extends';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { FBXLoader } from 'three-stdlib';
|
|
4
|
+
import { useLoader } from '@react-three/fiber';
|
|
5
|
+
import { Clone } from './Clone.js';
|
|
6
|
+
|
|
7
|
+
function useFBX(path) {
|
|
8
|
+
return useLoader(FBXLoader, path);
|
|
9
|
+
}
|
|
10
|
+
useFBX.preload = path => useLoader.preload(FBXLoader, path);
|
|
11
|
+
useFBX.clear = input => useLoader.clear(FBXLoader, input);
|
|
12
|
+
function Fbx({
|
|
13
|
+
path,
|
|
14
|
+
...props
|
|
15
|
+
}) {
|
|
16
|
+
const fbx = useFBX(path);
|
|
17
|
+
const object = fbx.children[0];
|
|
18
|
+
return /*#__PURE__*/React.createElement(Clone, _extends({}, props, {
|
|
19
|
+
object: object
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { Fbx, useFBX };
|
package/core/GizmoHelper.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("three"),n=require("./OrthographicCamera.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("three"),n=require("./OrthographicCamera.cjs.js"),o=require("./Hud.cjs.js");function u(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@babel/runtime/helpers/extends"),require("./Fbo.cjs.js");var i=u(e);const a=i.createContext({}),c=2*Math.PI,s=new t.Object3D,l=new t.Matrix4,[p,d]=[new t.Quaternion,new t.Quaternion],f=new t.Vector3,h=new t.Vector3;exports.GizmoHelper=({alignment:e="bottom-right",margin:u=[80,80],renderPriority:m=1,onUpdate:y,onTarget:g,children:b})=>{const j=r.useThree((e=>e.size)),w=r.useThree((e=>e.camera)),v=r.useThree((e=>e.controls)),q=r.useThree((e=>e.invalidate)),x=i.useRef(null),O=i.useRef(null),P=i.useRef(!1),T=i.useRef(0),C=i.useRef(new t.Vector3(0,0,0)),R=i.useRef(new t.Vector3(0,0,0));i.useEffect((()=>{R.current.copy(w.up)}),[w]);const E=i.useCallback((e=>{P.current=!0,(v||g)&&(C.current=(null==v?void 0:v.target)||(null==g?void 0:g())),T.current=w.position.distanceTo(f),p.copy(w.quaternion),h.copy(e).multiplyScalar(T.current).add(f),s.lookAt(h),s.up.copy(w.up),d.copy(s.quaternion),q()}),[v,w,g,q]);r.useFrame(((e,r)=>{if(O.current&&x.current){var t;if(P.current)if(p.angleTo(d)<.01)P.current=!1,"minPolarAngle"in v&&w.up.copy(R.current);else{const e=r*c;p.rotateTowards(d,e),w.position.set(0,0,1).applyQuaternion(p).multiplyScalar(T.current).add(C.current),w.up.set(0,1,0).applyQuaternion(p).normalize(),w.quaternion.copy(p),y?y():v&&v.update(),q()}l.copy(w.matrix).invert(),null==(t=x.current)||t.quaternion.setFromRotationMatrix(l)}}));const M=i.useMemo((()=>({tweenCamera:E})),[E]),[z,k]=u,Q=e.endsWith("-center")?0:e.endsWith("-left")?-j.width/2+z:j.width/2-z,V=e.startsWith("center-")?0:e.startsWith("top-")?j.height/2-k:-j.height/2+k;return i.createElement(o.Hud,{renderPriority:m},i.createElement(a.Provider,{value:M},i.createElement(n.OrthographicCamera,{makeDefault:!0,ref:O,position:[0,0,200]}),i.createElement("group",{ref:x,position:[Q,V,0]},b)))},exports.useGizmoContext=()=>i.useContext(a);
|