1- import { useCallback , useEffect , useMemo , useState } from "react" ;
21import * as THREE from "three" ;
2+ import { useCallback , useEffect , useMemo , useRef , useState } from "react" ;
33import { useCamera } from "../../utils/useCamera" ;
44import { RootState , Size } from "@react-three/fiber" ;
55import { useSingleFBO } from "../../utils/useSingleFBO" ;
6- import { setUniform } from "../../utils/setUniforms" ;
76import { HooksReturn } from "../types" ;
87import { useParams } from "../../utils/useParams" ;
9-
10- import vertexShader from "./shader/main.vert" ;
11- import fragmentShader from "./shader/main.frag" ;
8+ import { errorHandling } from "./utils/errorHandling" ;
9+ import { createMesh } from "./utils/createMesh" ;
10+ import { intersectionHandler } from "./utils/intersectionHandler" ;
11+ import { updateRect } from "./utils/updateRect" ;
1212
1313export type DomSyncerParams = {
1414 texture : THREE . Texture [ ] ;
1515 dom : ( HTMLElement | Element | null ) [ ] ;
16+ resolution ?: THREE . Vector2 [ ] ;
1617} ;
1718
1819export type DomSyncerObject = {
@@ -24,6 +25,7 @@ export type DomSyncerObject = {
2425export const DOMSYNCER_PARAMS : DomSyncerParams = {
2526 texture : [ ] ,
2627 dom : [ ] ,
28+ resolution : [ ] ,
2729} ;
2830
2931/**
@@ -47,24 +49,19 @@ export const useDomSyncer = (
4749 size,
4850 dpr,
4951 } ) ;
52+ const [ params , setParams ] = useParams < DomSyncerParams > ( DOMSYNCER_PARAMS ) ;
5053
54+ // dependenciesをtriggerして、meshと
5155 const [ refreshTrigger , setRefreshTrigger ] = useState ( true ) ;
5256 useEffect ( ( ) => {
5357 setRefreshTrigger ( true ) ;
54- return ( ) => {
55- for ( let i = 0 ; i < scene . children . length ; i ++ ) {
56- const child = scene . children [ i ] ;
57- if ( child instanceof THREE . Mesh ) {
58- child . geometry . dispose ( ) ;
59- child . material . dispose ( ) ;
60- }
61- }
62- scene . remove ( ...scene . children ) ;
63- } ;
6458 // eslint-disable-next-line react-hooks/exhaustive-deps
6559 } , dependencies ) ;
6660
67- const [ params , setParams ] = useParams < DomSyncerParams > ( DOMSYNCER_PARAMS ) ;
61+ const resolutionRef = useRef < THREE . Vector2 > ( new THREE . Vector2 ( 0 , 0 ) ) ;
62+ const intersectionObserverRef = useRef < IntersectionObserver [ ] > ( [ ] ) ;
63+ const intersectionDomRef = useRef < ( HTMLElement | Element | null ) [ ] > ( [ ] ) ;
64+ const isIntersectingRef = useRef < boolean [ ] > ( [ ] ) ;
6865
6966 const updateFx = useCallback (
7067 ( props : RootState , updateParams ?: DomSyncerParams ) => {
@@ -73,66 +70,45 @@ export const useDomSyncer = (
7370 updateParams && setParams ( updateParams ) ;
7471
7572 /*===============================================
76- エラー
73+ エラーハンドリング
7774 ===============================================*/
78- if ( params . dom . length !== params . texture . length ) {
79- throw new Error ( "domとテクスチャーの数は一致しません!" ) ;
80- }
81- if ( params . dom . length === 0 || params . texture . length === 0 ) {
82- throw new Error ( "配列が空ですよ!" ) ;
83- }
75+ errorHandling ( params ) ;
8476
8577 /*===============================================
86- // 最初の1回だけ、materialを生成して、sceneに渡す
78+ 最初の1回だけ、materialを生成して、sceneに渡す
8779 ===============================================*/
8880 if ( refreshTrigger ) {
89- for ( let i = 0 ; i < params . dom . length ; i ++ ) {
90- const object = new THREE . Mesh (
91- new THREE . PlaneGeometry ( 1 , 1 ) ,
92- new THREE . ShaderMaterial ( {
93- vertexShader : vertexShader ,
94- fragmentShader : fragmentShader ,
95- transparent : true ,
96- uniforms : {
97- u_texture : { value : params . texture [ i ] } ,
98- } ,
99- } )
100- ) ;
101- scene . add ( object ) ;
102- }
81+ createMesh ( {
82+ params ,
83+ size ,
84+ resolutionRef ,
85+ scene ,
86+ } ) ;
87+
88+ intersectionHandler ( {
89+ intersectionObserverRef ,
90+ intersectionDomRef ,
91+ isIntersectingRef ,
92+ params ,
93+ } ) ;
94+
10395 setRefreshTrigger ( false ) ;
10496 }
10597
10698 /*===============================================
107- rectを計算する
108- //TODO* intersection してる時だけ計算するようにしたい
99+ rectを更新する
109100 ===============================================*/
110- for ( let i = 0 ; i < scene . children . length ; i ++ ) {
111- const domElement = params . dom [ i ] ;
112- if ( ! domElement ) {
113- throw new Error ( "domが取得できてないっぽい!" ) ;
114- }
115- const rect = domElement . getBoundingClientRect ( ) ;
116- const object = scene . children [ i ] ;
117- object . scale . set ( rect . width , rect . height , 1.0 ) ;
118- object . position . set (
119- rect . left + rect . width * 0.5 - size . width * 0.5 ,
120- - rect . top - rect . height * 0.5 + size . height * 0.5 ,
121- 0.0
122- ) ;
123- }
101+ updateRect ( {
102+ params,
103+ size,
104+ resolutionRef,
105+ scene,
106+ isIntersectingRef,
107+ } ) ;
124108
125- const bufferTexture = updateRenderTarget ( gl ) ;
126- return bufferTexture ;
109+ return updateRenderTarget ( gl ) ;
127110 } ,
128- [
129- updateRenderTarget ,
130- setParams ,
131- refreshTrigger ,
132- scene ,
133- params . dom ,
134- params . texture ,
135- ]
111+ [ updateRenderTarget , setParams , refreshTrigger , scene , params ]
136112 ) ;
137113
138114 return [
0 commit comments