@@ -227,9 +227,9 @@ const spaceWarp = TSL.Fn( ( [ p, warpStrength, xyScale, zScale ] ) => {
227
227
228
228
} ) ;
229
229
230
- const woodRings = TSL . Fn ( ( [ w , ringCount , ringBias , ringSizeVariance , ringVarianceScale , barkThickness ] ) => {
230
+ const woodRings = TSL . Fn ( ( [ w , ringThickness , ringBias , ringSizeVariance , ringVarianceScale , barkThickness ] ) => {
231
231
232
- const rings = noiseFbm ( w . mul ( ringVarianceScale ) , TSL . float ( 1 ) , TSL . float ( 0.5 ) , TSL . float ( 1 ) , TSL . int ( 1 ) ) . mul ( ringSizeVariance ) . add ( w ) . mul ( ringCount ) . fract ( ) . mul ( barkThickness ) ;
232
+ const rings = noiseFbm ( w . mul ( ringVarianceScale ) , TSL . float ( 1 ) , TSL . float ( 0.5 ) , TSL . float ( 1 ) , TSL . int ( 1 ) ) . mul ( ringSizeVariance ) . add ( w ) . mul ( ringThickness ) . fract ( ) . mul ( barkThickness ) ;
233
233
234
234
const sharpRings = TSL . min ( mapRange ( rings , 0 , ringBias , 0 , 1 , TSL . bool ( true ) ) , mapRange ( rings , ringBias , 1 , 1 , 0 , TSL . bool ( true ) ) ) ;
235
235
@@ -268,7 +268,7 @@ const wood = TSL.Fn( ( [
268
268
smallWarpScale ,
269
269
fineWarpStrength ,
270
270
fineWarpScale ,
271
- ringCount ,
271
+ ringThickness ,
272
272
ringBias ,
273
273
ringSizeVariance ,
274
274
ringVarianceScale ,
@@ -284,7 +284,7 @@ const wood = TSL.Fn( ( [
284
284
const center = woodCenter ( p , centerSize ) ;
285
285
const mainWarp = spaceWarp ( spaceWarp ( p , center , largeWarpScale , largeGrainStretch ) , smallWarpStrength , smallWarpScale , 0.17 ) ;
286
286
const detailWarp = spaceWarp ( mainWarp , fineWarpStrength , fineWarpScale , 0.17 ) ;
287
- const rings = woodRings ( detailWarp . length ( ) , ringCount , ringBias , ringSizeVariance , ringVarianceScale , barkThickness ) ;
287
+ const rings = woodRings ( detailWarp . length ( ) , TSL . float ( 1 ) . div ( ringThickness ) , ringBias , ringSizeVariance , ringVarianceScale , barkThickness ) ;
288
288
const detail = woodDetail ( detailWarp , p , detailWarp . length ( ) , splotchScale ) ;
289
289
const cells = cellStructure ( mainWarp , cellScale , cellSize . div ( TSL . max ( TSL . positionView . length ( ) . mul ( 10 ) , 1 ) ) ) ;
290
290
const baseColor = TSL . mix ( darkGrainColor , lightGrainColor , rings ) ;
@@ -295,91 +295,81 @@ const wood = TSL.Fn( ( [
295
295
296
296
const woodParams = {
297
297
teak : {
298
- grainPosition : { x : - 0.4 , y : 0 , z : 0 } ,
299
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
298
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
300
299
centerSize : 1.11 , largeWarpScale : 0.32 , largeGrainStretch : 0.24 , smallWarpStrength : 0.059 ,
301
- smallWarpScale : 2 , fineWarpStrength : 0.006 , fineWarpScale : 32.8 , ringCount : 34 ,
300
+ smallWarpScale : 2 , fineWarpStrength : 0.006 , fineWarpScale : 32.8 , ringThickness : 1 / 34 ,
302
301
ringBias : 0.03 , ringSizeVariance : 0.03 , ringVarianceScale : 4.4 , barkThickness : 0.3 ,
303
302
splotchScale : 0.2 , splotchIntensity : 0.541 , cellScale : 910 , cellSize : 0.1 ,
304
303
darkGrainColor : '#0c0504' , lightGrainColor : '#926c50'
305
304
} ,
306
305
walnut : {
307
- grainPosition : { x : - 0.4 , y : 0 , z : 0 } ,
308
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
306
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
309
307
centerSize : 1.07 , largeWarpScale : 0.42 , largeGrainStretch : 0.34 , smallWarpStrength : 0.016 ,
310
- smallWarpScale : 10.3 , fineWarpStrength : 0.028 , fineWarpScale : 12.7 , ringCount : 32 ,
308
+ smallWarpScale : 10.3 , fineWarpStrength : 0.028 , fineWarpScale : 12.7 , ringThickness : 1 / 32 ,
311
309
ringBias : 0.08 , ringSizeVariance : 0.03 , ringVarianceScale : 5.5 , barkThickness : 0.98 ,
312
310
splotchScale : 1.84 , splotchIntensity : 0.97 , cellScale : 710 , cellSize : 0.31 ,
313
311
darkGrainColor : '#311e13' , lightGrainColor : '#523424'
314
312
} ,
315
313
white_oak : {
316
- grainPosition : { x : - 0.4 , y : 0 , z : 0 } ,
317
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
314
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
318
315
centerSize : 1.23 , largeWarpScale : 0.21 , largeGrainStretch : 0.21 , smallWarpStrength : 0.034 ,
319
- smallWarpScale : 2.44 , fineWarpStrength : 0.01 , fineWarpScale : 14.3 , ringCount : 34 ,
316
+ smallWarpScale : 2.44 , fineWarpStrength : 0.01 , fineWarpScale : 14.3 , ringThickness : 1 / 34 ,
320
317
ringBias : 0.82 , ringSizeVariance : 0.16 , ringVarianceScale : 1.4 , barkThickness : 0.7 ,
321
318
splotchScale : 0.2 , splotchIntensity : 0.541 , cellScale : 800 , cellSize : 0.28 ,
322
319
darkGrainColor : '#8b4c21' , lightGrainColor : '#c57e43'
323
320
} ,
324
321
pine : {
325
- grainPosition : { x : - 0.4 , y : 0 , z : - 0.2 } ,
326
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
322
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
327
323
centerSize : 1.23 , largeWarpScale : 0.21 , largeGrainStretch : 0.18 , smallWarpStrength : 0.041 ,
328
- smallWarpScale : 2.44 , fineWarpStrength : 0.006 , fineWarpScale : 23.2 , ringCount : 24 ,
324
+ smallWarpScale : 2.44 , fineWarpStrength : 0.006 , fineWarpScale : 23.2 , ringThickness : 1 / 24 ,
329
325
ringBias : 0.1 , ringSizeVariance : 0.07 , ringVarianceScale : 5 , barkThickness : 0.35 ,
330
326
splotchScale : 0.51 , splotchIntensity : 3.32 , cellScale : 1480 , cellSize : 0.07 ,
331
327
darkGrainColor : '#c58355' , lightGrainColor : '#d19d61'
332
328
} ,
333
329
poplar : {
334
- grainPosition : { x : - 0.4 , y : 0 , z : 0.2 } ,
335
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
330
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
336
331
centerSize : 1.43 , largeWarpScale : 0.33 , largeGrainStretch : 0.18 , smallWarpStrength : 0.04 ,
337
- smallWarpScale : 4.3 , fineWarpStrength : 0.004 , fineWarpScale : 33.6 , ringCount : 37 ,
332
+ smallWarpScale : 4.3 , fineWarpStrength : 0.004 , fineWarpScale : 33.6 , ringThickness : 1 / 37 ,
338
333
ringBias : 0.07 , ringSizeVariance : 0.03 , ringVarianceScale : 3.8 , barkThickness : 0.3 ,
339
334
splotchScale : 1.92 , splotchIntensity : 0.71 , cellScale : 830 , cellSize : 0.04 ,
340
335
darkGrainColor : '#716347' , lightGrainColor : '#998966'
341
336
} ,
342
337
maple : {
343
- grainPosition : { x : - 0.4 , y : 0.3 , z : - 0.2 } ,
344
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
338
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
345
339
centerSize : 1.4 , largeWarpScale : 0.38 , largeGrainStretch : 0.25 , smallWarpStrength : 0.067 ,
346
- smallWarpScale : 2.5 , fineWarpStrength : 0.005 , fineWarpScale : 33.6 , ringCount : 35 ,
340
+ smallWarpScale : 2.5 , fineWarpStrength : 0.005 , fineWarpScale : 33.6 , ringThickness : 1 / 35 ,
347
341
ringBias : 0.1 , ringSizeVariance : 0.07 , ringVarianceScale : 4.6 , barkThickness : 0.61 ,
348
342
splotchScale : 0.46 , splotchIntensity : 1.49 , cellScale : 800 , cellSize : 0.03 ,
349
343
darkGrainColor : '#b08969' , lightGrainColor : '#bc9d7d'
350
344
} ,
351
345
red_oak : {
352
- grainPosition : { x : - 0.4 , y : 0 , z : 0.4 } ,
353
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
346
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
354
347
centerSize : 1.21 , largeWarpScale : 0.24 , largeGrainStretch : 0.25 , smallWarpStrength : 0.044 ,
355
- smallWarpScale : 2.54 , fineWarpStrength : 0.01 , fineWarpScale : 14.5 , ringCount : 34 ,
348
+ smallWarpScale : 2.54 , fineWarpStrength : 0.01 , fineWarpScale : 14.5 , ringThickness : 1 / 34 ,
356
349
ringBias : 0.92 , ringSizeVariance : 0.03 , ringVarianceScale : 5.6 , barkThickness : 1.01 ,
357
350
splotchScale : 0.28 , splotchIntensity : 3.48 , cellScale : 800 , cellSize : 0.25 ,
358
351
darkGrainColor : '#af613b' , lightGrainColor : '#e0a27a'
359
352
} ,
360
353
cherry : {
361
- grainPosition : { x : - 0.4 , y : 0.3 , z : 0 } ,
362
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
354
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
363
355
centerSize : 1.33 , largeWarpScale : 0.11 , largeGrainStretch : 0.33 , smallWarpStrength : 0.024 ,
364
- smallWarpScale : 2.48 , fineWarpStrength : 0.01 , fineWarpScale : 15.3 , ringCount : 36 ,
356
+ smallWarpScale : 2.48 , fineWarpStrength : 0.01 , fineWarpScale : 15.3 , ringThickness : 1 / 36 ,
365
357
ringBias : 0.02 , ringSizeVariance : 0.04 , ringVarianceScale : 6.5 , barkThickness : 0.09 ,
366
358
splotchScale : 1.27 , splotchIntensity : 1.24 , cellScale : 1530 , cellSize : 0.15 ,
367
359
darkGrainColor : '#913f27' , lightGrainColor : '#b45837'
368
360
} ,
369
361
cedar : {
370
- grainPosition : { x : - 0.4 , y : 0.1 , z : 0.1 } ,
371
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
362
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
372
363
centerSize : 1.11 , largeWarpScale : 0.39 , largeGrainStretch : 0.12 , smallWarpStrength : 0.061 ,
373
- smallWarpScale : 1.9 , fineWarpStrength : 0.006 , fineWarpScale : 4.8 , ringCount : 25 ,
364
+ smallWarpScale : 1.9 , fineWarpStrength : 0.006 , fineWarpScale : 4.8 , ringThickness : 1 / 25 ,
374
365
ringBias : 0.01 , ringSizeVariance : 0.07 , ringVarianceScale : 6.7 , barkThickness : 0.1 ,
375
366
splotchScale : 0.61 , splotchIntensity : 2.54 , cellScale : 630 , cellSize : 0.19 ,
376
367
darkGrainColor : '#9a5b49' , lightGrainColor : '#ae745e'
377
368
} ,
378
369
mahogany : {
379
- grainPosition : { x : - 0.4 , y : 0.2 , z : 0 } ,
380
- grainRotation : { x : 0 , y : 0 , z : 0 } ,
370
+ transformationMatrix : new THREE . Matrix4 ( ) . identity ( ) ,
381
371
centerSize : 1.25 , largeWarpScale : 0.26 , largeGrainStretch : 0.29 , smallWarpStrength : 0.044 ,
382
- smallWarpScale : 2.54 , fineWarpStrength : 0.01 , fineWarpScale : 15.3 , ringCount : 38 ,
372
+ smallWarpScale : 2.54 , fineWarpStrength : 0.01 , fineWarpScale : 15.3 , ringThickness : 1 / 38 ,
383
373
ringBias : 0.01 , ringSizeVariance : 0.33 , ringVarianceScale : 1.2 , barkThickness : 0.07 ,
384
374
splotchScale : 0.77 , splotchIntensity : 1.39 , cellScale : 1400 , cellSize : 0.23 ,
385
375
darkGrainColor : '#501d12' , lightGrainColor : '#6d3722'
@@ -415,7 +405,7 @@ export function GetWoodPreset( genus, finish ) {
415
405
416
406
}
417
407
418
- return { ...params , grainPosition : new THREE . Vector3 ( ) . copy ( params . grainPosition ) , grainRotation : new THREE . Vector3 ( ) . copy ( params . grainRotation ) , genus, finish, clearcoat, clearcoatRoughness, clearcoatDarken } ;
408
+ return { ...params , transformationMatrix : new THREE . Matrix4 ( ) . copy ( params . transformationMatrix ) , genus, finish, clearcoat, clearcoatRoughness, clearcoatDarken } ;
419
409
420
410
}
421
411
@@ -429,7 +419,7 @@ uniforms.smallWarpStrength = TSL.uniform( params.smallWarpStrength ).onObjectUpd
429
419
uniforms . smallWarpScale = TSL . uniform ( params . smallWarpScale ) . onObjectUpdate ( ( { material } ) => material . smallWarpScale ) ;
430
420
uniforms . fineWarpStrength = TSL . uniform ( params . fineWarpStrength ) . onObjectUpdate ( ( { material } ) => material . fineWarpStrength ) ;
431
421
uniforms . fineWarpScale = TSL . uniform ( params . fineWarpScale ) . onObjectUpdate ( ( { material } ) => material . fineWarpScale ) ;
432
- uniforms . ringCount = TSL . uniform ( params . ringCount ) . onObjectUpdate ( ( { material } ) => material . ringCount ) ;
422
+ uniforms . ringThickness = TSL . uniform ( params . ringThickness ) . onObjectUpdate ( ( { material } ) => material . ringThickness ) ;
433
423
uniforms . ringBias = TSL . uniform ( params . ringBias ) . onObjectUpdate ( ( { material } ) => material . ringBias ) ;
434
424
uniforms . ringSizeVariance = TSL . uniform ( params . ringSizeVariance ) . onObjectUpdate ( ( { material } ) => material . ringSizeVariance ) ;
435
425
uniforms . ringVarianceScale = TSL . uniform ( params . ringVarianceScale ) . onObjectUpdate ( ( { material } ) => material . ringVarianceScale ) ;
@@ -440,19 +430,18 @@ uniforms.cellScale = TSL.uniform( params.cellScale ).onObjectUpdate( ( { materia
440
430
uniforms . cellSize = TSL . uniform ( params . cellSize ) . onObjectUpdate ( ( { material } ) => material . cellSize ) ;
441
431
uniforms . darkGrainColor = TSL . uniform ( new THREE . Color ( params . darkGrainColor ) ) . onObjectUpdate ( ( { material } , self ) => self . value . set ( material . darkGrainColor ) ) ;
442
432
uniforms . lightGrainColor = TSL . uniform ( new THREE . Color ( params . lightGrainColor ) ) . onObjectUpdate ( ( { material } , self ) => self . value . set ( material . lightGrainColor ) ) ;
443
- uniforms . grainPosition = TSL . uniform ( new THREE . Vector3 ( ) . copy ( params . grainPosition ) ) . onObjectUpdate ( ( { material } ) => material . grainPosition ) ;
444
- uniforms . grainRotation = TSL . uniform ( new THREE . Vector3 ( ) . copy ( params . grainRotation ) ) . onObjectUpdate ( ( { material } ) => material . grainRotation ) ;
433
+ uniforms . transformationMatrix = TSL . uniform ( new THREE . Matrix4 ( ) . copy ( params . transformationMatrix ) ) . onObjectUpdate ( ( { material } ) => material . transformationMatrix ) ;
445
434
446
435
const colorNode = wood (
447
- TSL . rotate ( TSL . positionLocal . add ( uniforms . grainPosition ) , uniforms . grainRotation ) ,
436
+ uniforms . transformationMatrix . mul ( TSL . vec4 ( TSL . positionLocal , 1 ) ) . xyz ,
448
437
uniforms . centerSize ,
449
438
uniforms . largeWarpScale ,
450
439
uniforms . largeGrainStretch ,
451
440
uniforms . smallWarpStrength ,
452
441
uniforms . smallWarpScale ,
453
442
uniforms . fineWarpStrength ,
454
443
uniforms . fineWarpScale ,
455
- uniforms . ringCount ,
444
+ uniforms . ringThickness ,
456
445
uniforms . ringBias ,
457
446
uniforms . ringSizeVariance ,
458
447
uniforms . ringVarianceScale ,
@@ -476,7 +465,7 @@ const colorNode = wood(
476
465
* // Using custom parameters (for advanced customization)
477
466
* const material = new WoodNodeMaterial({
478
467
* centerSize: 1.2,
479
- * ringCount: 40,
468
+ * ringThickness: 1/ 40,
480
469
* darkGrainColor: new THREE.Color('#2a1a0a'),
481
470
* lightGrainColor: new THREE.Color('#8b4513'),
482
471
* clearcoat: 1,
@@ -487,11 +476,11 @@ const colorNode = wood(
487
476
* const walnutParams = GetWoodPreset('walnut', 'raw');
488
477
* const material = new WoodNodeMaterial({
489
478
* ...walnutParams,
490
- * ringCount: 50, // Override specific parameter
479
+ * ringThickness: 1/ 50, // Override specific parameter
491
480
* clearcoat: 1 // Add finish
492
481
* });
493
482
*/
494
- export class WoodNodeMaterial extends THREE . MeshPhysicalNodeMaterial {
483
+ export class WoodNodeMaterial extends THREE . MeshPhysicalMaterial {
495
484
496
485
static get type ( ) {
497
486
0 commit comments