@@ -8,40 +8,42 @@ import {
88 Texture ,
99} from "three" ;
1010
11- export const checkerMaterial = memoize ( ( scale : number = 1 ) => {
12- const map = new Texture ( ) ;
13- const material = new MeshStandardMaterial ( {
14- map,
15- color : new Color ( 0xffffff ) ,
16- roughness : 0.5 ,
17- roughnessMap : new Texture ( ) ,
18- } ) ;
19-
20- // Setup texture tiling and filtering
21- map . wrapS = RepeatWrapping ;
22- map . wrapT = RepeatWrapping ;
23- map . magFilter = NearestFilter ;
24- map . minFilter = NearestMipMapNearestFilter ;
25-
26- material . onBeforeCompile = ( shader ) => {
27- // Add varyings
28- shader . vertexShader =
29- `
11+ export const checkerMaterial = memoize (
12+ ( scale : number = 1 , materialOptions = { } ) => {
13+ const map = new Texture ( ) ;
14+ const material = new MeshStandardMaterial ( {
15+ color : new Color ( 0xffffff ) ,
16+ roughness : 0.5 ,
17+ ...materialOptions ,
18+ map,
19+ roughnessMap : new Texture ( ) ,
20+ } ) ;
21+
22+ // Setup texture tiling and filtering
23+ map . wrapS = RepeatWrapping ;
24+ map . wrapT = RepeatWrapping ;
25+ map . magFilter = NearestFilter ;
26+ map . minFilter = NearestMipMapNearestFilter ;
27+
28+ material . onBeforeCompile = ( shader ) => {
29+ // Add varyings
30+ shader . vertexShader =
31+ `
3032 varying vec3 vWorldPosition;
3133 varying vec3 vWorldNormal;
3234 ` +
33- shader . vertexShader . replace (
34- "#include <worldpos_vertex>" ,
35- `
35+ shader . vertexShader . replace (
36+ "#include <worldpos_vertex>" ,
37+ `
3638 #include <worldpos_vertex>
3739 vWorldPosition = worldPosition.xyz;
3840 vWorldNormal = normalize(round(normalMatrix * normal));
3941 `
40- ) ;
42+ ) ;
4143
42- // Add uniforms and function
43- shader . fragmentShader =
44- `
44+ // Add uniforms and function
45+ shader . fragmentShader =
46+ `
4547 varying vec3 vWorldPosition;
4648 varying vec3 vWorldNormal;
4749 uniform float uTileScale;
@@ -73,35 +75,37 @@ export const checkerMaterial = memoize((scale: number = 1) => {
7375 }
7476
7577 float sampleWorld(sampler2D tex, vec3 worldPos, vec3 normal, float scale) {
76- return noise(vec3(floor(worldPos.x * 64.0), floor(worldPos.y * 64.0), floor(worldPos.z * 64.0)));
78+ return noise(vec3(floor(worldPos.x * 64.0 * scale ), floor(worldPos.y * 64.0 * scale ), floor(worldPos.z * 64.0 * scale )));
7779}
7880 ` + shader . fragmentShader ;
7981
80- // Replace default UV-based sampling
81- shader . fragmentShader = shader . fragmentShader . replace (
82- "#include <map_fragment>" ,
83- `
82+ // Replace default UV-based sampling
83+ shader . fragmentShader = shader . fragmentShader . replace (
84+ "#include <map_fragment>" ,
85+ `
8486 float fac = sampleWorld(map, vWorldPosition, vWorldNormal, uTileScale);
8587 float fac2 = sampleWorld(map, vec3(vWorldPosition.x+1.0, vWorldPosition.y+1.0, vWorldPosition.z+1.0), vWorldNormal, uTileScale);
86- diffuseColor *= 0.8 + fac * 0.05 ;
88+ diffuseColor *= 0.8 + fac * 0.1 ;
8789 `
88- ) ;
90+ ) ;
8991
90- // Replace roughness map sampling
91- shader . fragmentShader = shader . fragmentShader . replace (
92- "#include <roughnessmap_fragment>" ,
93- `
92+ // Replace roughness map sampling
93+ shader . fragmentShader = shader . fragmentShader . replace (
94+ "#include <roughnessmap_fragment>" ,
95+ `
9496 float roughnessFactor = 0.5;
9597 #ifdef USE_ROUGHNESSMAP
96- roughnessFactor *= 0.6 + fac2 * 0.2 ;
98+ roughnessFactor *= 0.6 + fac2 * 0.4 ;
9799 #endif
98100 `
99- ) ;
101+ ) ;
100102
101- // Uniform for tile scale
102- shader . uniforms . uTileScale = { value : scale } ;
103- material . userData . shader = shader ;
104- } ;
103+ // Uniform for tile scale
104+ shader . uniforms . uTileScale = { value : scale } ;
105+ material . userData . shader = shader ;
106+ } ;
105107
106- return material ;
107- } ) ;
108+ return material ;
109+ } ,
110+ JSON . stringify
111+ ) ;
0 commit comments