Skip to content

Commit 8732440

Browse files
author
takuma-hmng8
committed
add useCopyTexture
1 parent f4d53a9 commit 8732440

File tree

14 files changed

+449
-299
lines changed

14 files changed

+449
-299
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,18 @@ const [params, setParams] = useParams<HooksParams>;
225225
}
226226
```
227227

228+
## useCopyTexture
229+
230+
Generate an FBO array to copy the texture.
231+
232+
```tsx
233+
const [renderTargets, copyTexture] = useCopyTexture(
234+
{ scene, camera, size, dpr },
235+
length
236+
);
237+
copyTexture(gl, index); // return texture
238+
```
239+
228240
# Other Hooks
229241

230242
## useDomSyncer
@@ -254,6 +266,11 @@ useLayoutEffect(() => {
254266
});
255267
}, [state]);
256268

269+
const [, copyTexture] = useCopyTexture(
270+
{ scene: fxTextureObj.scene, camera: fxTextureObj.camera, size, dpr },
271+
domArr.current.length
272+
);
273+
257274
useFrame((props) => {
258275
const syncedTexture = updateDomSyncer(props, {
259276
texture: [...Array(domArr.current.length)].map((_, i) => {
@@ -262,6 +279,7 @@ useFrame((props) => {
262279
map: someFx,
263280
texture0: someTexture,
264281
});
282+
return copyTexture(props.gl, i);
265283
}
266284
}),
267285
resolution: [...Array(domArr.current.length)].map(() =>

app/domSyncer/DomSyncer.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import * as THREE from "three";
2-
import { useLayoutEffect, useRef } from "react";
2+
import { useEffect, useLayoutEffect, useRef } from "react";
33
import { useFrame, extend, useThree, useLoader } from "@react-three/fiber";
44
import { FxMaterial, FxMaterialProps } from "@/utils/fxMaterial";
55
import {
66
useDomSyncer,
77
useWave,
88
useFxTexture,
9+
useCopyTexture,
910
} from "@/packages/use-shader-fx/src";
1011
import { WaveParams } from "@/packages/use-shader-fx/src/hooks/useWave";
1112
import gsap from "gsap";
@@ -36,7 +37,7 @@ export const DomSyncer = ({ state }: { state: number }) => {
3637
const size = useThree((state) => state.size);
3738
const dpr = useThree((state) => state.viewport.dpr);
3839

39-
const [updateFxTexture] = useFxTexture({ size, dpr });
40+
const [updateFxTexture, , fxTextureObj] = useFxTexture({ size, dpr });
4041
const [updateWave] = useWave({ size, dpr });
4142

4243
const [updateDomSyncer, setDomSyncer, domSyncerObj] = useDomSyncer(
@@ -48,6 +49,7 @@ export const DomSyncer = ({ state }: { state: number }) => {
4849

4950
useLayoutEffect(() => {
5051
CONFIG.waveArr = [];
52+
5153
if (state === 0) {
5254
domArr.current = [...document.querySelectorAll(".item")!];
5355
} else {
@@ -83,11 +85,16 @@ export const DomSyncer = ({ state }: { state: number }) => {
8385
// eslint-disable-next-line react-hooks/exhaustive-deps
8486
}, [state]);
8587

88+
const [, copyTexture] = useCopyTexture(
89+
{ scene: fxTextureObj.scene, camera: fxTextureObj.camera, size, dpr },
90+
domArr.current.length
91+
);
92+
8693
useFrame((props) => {
8794
const syncedTexture = updateDomSyncer(props, {
8895
texture: [...Array(domArr.current.length)].map((_, i) => {
8996
if (domSyncerObj.isIntersecting(i, false)) {
90-
textureRef.current = updateFxTexture(props, {
97+
updateFxTexture(props, {
9198
padding: 0.0,
9299
map: updateWave(props, {
93100
epicenter: CONFIG.waveArr[i].epicenter,
@@ -99,6 +106,8 @@ export const DomSyncer = ({ state }: { state: number }) => {
99106
textureResolution: CONFIG.textureResolution,
100107
texture0: momo,
101108
});
109+
110+
return copyTexture(props.gl, i);
102111
}
103112
return textureRef.current;
104113
}),

app/domSyncer/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export default function Page() {
5252
key={i}
5353
style={{
5454
width: "calc(50% - 40px)",
55-
height: "120vh",
55+
height: "80vh",
5656
zIndex: 100,
5757
borderRadius: `${i * 50}px`,
5858
}}></div>

0 commit comments

Comments
 (0)