1
- import { MeshProps , useLoader } from '@react-three/fiber'
1
+ import {
2
+ MeshPhysicalMaterialProps ,
3
+ MeshProps ,
4
+ useLoader ,
5
+ } from '@react-three/fiber'
2
6
import create from 'zustand'
3
7
import * as THREE from 'three'
4
8
5
- import { Texture , TextureName } from '../types/textures'
9
+ import { Texture , TextureName , TextureRepeat } from '../types/textures'
6
10
7
11
interface TextureState {
8
12
textures : Texture [ ]
9
- setTextures : ( name : TextureName ) => Texture
10
- changeTexture : ( name : TextureName , assets : MeshProps [ ] ) => Texture | null
13
+ setTextures : ( name : TextureName , repeat ?: TextureRepeat ) => Texture
14
+ changeTexture : (
15
+ name : TextureName ,
16
+ assets : Partial < MeshPhysicalMaterialProps > ,
17
+ repeat ?: TextureRepeat ,
18
+ ) => Texture | null
11
19
}
12
20
13
- const useTextures = create < TextureState > ( ( set , get ) => {
14
- const wall_texture_diff = useLoader ( THREE . TextureLoader , '/assets/brickwall/textures/sandstone_brick_wall_01_diff_2k.jpg' )
15
- const wall_texture_disp = useLoader ( THREE . TextureLoader , '/assets/brickwall/textures/sandstone_brick_wall_01_disp_2k.png' )
21
+ export const useTextures = ( ) : TextureState => {
22
+ const wall_texture_diff = useLoader (
23
+ THREE . TextureLoader ,
24
+ '/assets/brickwall/textures/sandstone_brick_wall_01_diff_2k.jpg' ,
25
+ )
26
+ const wall_texture_disp = useLoader (
27
+ THREE . TextureLoader ,
28
+ '/assets/brickwall/textures/sandstone_brick_wall_01_disp_2k.png' ,
29
+ )
16
30
17
- const setTextures = ( name : TextureName ) => {
18
- const texture : Texture = { name }
31
+ const factory_wall_texture_diff = useLoader (
32
+ THREE . TextureLoader ,
33
+ '/assets/factorywall/factory_wall_diff_2k.jpg' ,
34
+ )
35
+ const factory_wall_texture_disp = useLoader (
36
+ THREE . TextureLoader ,
37
+ '/assets/factorywall/factory_wall_disp_2k.png' ,
38
+ )
39
+ // const factory_wall_texture_nor_gl = useLoader(THREE.TextureLoader, '/assets/factorywall/factory_wall_nor_gl_2k.exr')
40
+ const factory_wall_texture_rough = useLoader (
41
+ THREE . TextureLoader ,
42
+ '/assets/factorywall/factory_wall_rough_2k.jpg' ,
43
+ )
19
44
20
- set ( ( state ) => ( {
21
- textures : [ ...state . textures , texture ]
22
- } ) )
45
+ const concrete_floor_texture_diff = useLoader (
46
+ THREE . TextureLoader ,
47
+ '/assets/concretefloor/concrete_floor_02_diff_2k.jpg' ,
48
+ )
49
+ const concrete_floor_texture_disp = useLoader (
50
+ THREE . TextureLoader ,
51
+ '/assets/concretefloor/concrete_floor_02_disp_2k.png' ,
52
+ )
53
+ // const concrete_floor_texture_nor_gl = useLoader(THREE.TextureLoader, '/assets/concretefloor/concrete_floor_02_nor_gl_2k.exr')
54
+ const concrete_floor_texture_rough = useLoader (
55
+ THREE . TextureLoader ,
56
+ '/assets/concretefloor/concrete_floor_02_rough_2k.jpg' ,
57
+ )
58
+
59
+ const asphalt_texture_diff = useLoader (
60
+ THREE . TextureLoader ,
61
+ '/assets/asphalt/asphalt_02_diff_2k.jpg' ,
62
+ )
63
+ const asphalt_texture_disp = useLoader (
64
+ THREE . TextureLoader ,
65
+ '/assets/asphalt/asphalt_02_disp_2k.png' ,
66
+ )
67
+ // const asphalt_texture_nor_gl = useLoader(THREE.TextureLoader, '/assets/asphalt/asphalt_02_nor_gl_2k.exr')
68
+ const asphalt_texture_rough = useLoader (
69
+ THREE . TextureLoader ,
70
+ '/assets/asphalt/asphalt_02_rough_2k.jpg' ,
71
+ )
72
+
73
+ const setTextures = ( name : TextureName , repeat ?: TextureRepeat ) => {
74
+ const texture : Texture = { name, assets : { } , repeat }
75
+
76
+ switch ( name ) {
77
+ case 'asphalt' :
78
+ texture . assets = {
79
+ map : asphalt_texture_diff ,
80
+ displacementMap : asphalt_texture_disp ,
81
+ // envMap: asphalt_texture_nor_gl,
82
+ roughnessMap : asphalt_texture_rough ,
83
+ }
84
+ break
85
+ case 'floor' :
86
+ texture . assets = {
87
+ map : concrete_floor_texture_diff ,
88
+ displacementMap : concrete_floor_texture_disp ,
89
+ // envMap: concrete_floor_texture_nor_gl,
90
+ roughnessMap : concrete_floor_texture_rough ,
91
+ }
92
+ break
93
+ case 'garage' :
94
+ texture . assets = {
95
+ map : factory_wall_texture_diff ,
96
+ displacementMap : factory_wall_texture_disp ,
97
+ // envMap: factory_wall_texture_nor_gl,
98
+ roughnessMap : factory_wall_texture_rough ,
99
+ }
100
+ break
101
+ case 'wall' :
102
+ default :
103
+ texture . assets = {
104
+ map : wall_texture_diff ,
105
+ displacementMap : wall_texture_disp ,
106
+ }
107
+ break
108
+ }
109
+
110
+ Object . keys ( texture . assets ) . forEach ( ( asset : string ) => {
111
+ const key = asset as keyof MeshPhysicalMaterialProps
112
+
113
+ texture . assets [ key ] . wrapS = THREE . RepeatWrapping
114
+ texture . assets [ key ] . wrapT = THREE . RepeatWrapping
115
+
116
+ if ( repeat ) {
117
+ texture . assets [ key ] . repeat . set ( repeat . x , repeat . y )
118
+ }
119
+ } )
120
+
121
+ // set((state) => ({
122
+ // textures: [...state.textures, texture]
123
+ // }))
23
124
24
125
return texture
25
126
}
26
127
27
- const changeTexture = ( name : TextureName , assets : MeshProps ) => {
128
+ const changeTexture = (
129
+ name : TextureName ,
130
+ assets : Partial < MeshPhysicalMaterialProps > ,
131
+ ) => {
28
132
let texture : Texture | null = null
29
133
30
- set ( ( state ) => {
31
- const mutable_texture_state = state . textures
32
- texture = state . textures . find ( ( tx : Texture ) => tx . name === name ) || null
134
+ // set((state) => {
135
+ // const mutable_texture_state = state.textures
136
+ // texture = state.textures.find((tx: Texture) => tx.name === name) || null
33
137
34
- if ( ! texture ) return state
138
+ // if (!texture) return state
35
139
36
- const texture_index = state . textures . findIndex ( ( tx : Texture ) => tx . name === name )
140
+ // const texture_index = state.textures.findIndex((tx: Texture) => tx.name === name)
37
141
38
- // TODO: ASSETS!
39
- mutable_texture_state . splice ( texture_index , 1 , texture )
142
+ // texture = {
143
+ // ...texture,
144
+ // assets
145
+ // }
40
146
41
- return { textures : mutable_texture_state }
42
- } )
147
+ // mutable_texture_state.splice(texture_index, 1, texture)
148
+
149
+ // return { textures: mutable_texture_state }
150
+ // })
43
151
44
152
return texture
45
153
}
46
154
47
155
return {
48
156
textures : [ ] ,
49
157
setTextures,
50
- changeTexture
158
+ changeTexture,
51
159
}
52
- } )
160
+ }
0 commit comments