|
1 | 1 | import { expect, test } from 'vitest'; |
2 | | -import { Fn, vec2, vec3, vec4 } from 'three/tsl'; |
| 2 | +import { Fn, smoothstep, smoothstepElement, step, stepElement, vec2, vec3, vec4 } from 'three/tsl'; |
3 | 3 | import * as THREE from 'three/webgpu'; |
4 | 4 |
|
5 | 5 | const renderer = new THREE.WebGPURenderer(); |
@@ -232,3 +232,125 @@ test('vec3(1, 0, 2).flipZX()', async () => { |
232 | 232 | await renderer.init(); |
233 | 233 | renderer.render(scene, camera); |
234 | 234 | }); |
| 235 | + |
| 236 | +// smoothstep — chained method on vector nodes |
| 237 | + |
| 238 | +test('vec2(0.5, 0.5).smoothstep(0.1, 0.9)', async () => { |
| 239 | + const result: THREE.Node<'vec2'> = vec2(0.5, 0.5).smoothstep(0.1, 0.9); |
| 240 | + |
| 241 | + expect(result.getNodeType(nodeBuilder)).toBe('vec2'); |
| 242 | + |
| 243 | + scene.backgroundNode = result.debug(); |
| 244 | + |
| 245 | + await renderer.init(); |
| 246 | + renderer.render(scene, camera); |
| 247 | +}); |
| 248 | + |
| 249 | +test('vec3(0.5, 0.5, 0.5).smoothstep(float, float)', async () => { |
| 250 | + const result: THREE.Node<'vec3'> = vec3(0.5, 0.5, 0.5).smoothstep(0.1, 0.9); |
| 251 | + |
| 252 | + expect(result.getNodeType(nodeBuilder)).toBe('vec3'); |
| 253 | + |
| 254 | + scene.backgroundNode = result.debug(); |
| 255 | + |
| 256 | + await renderer.init(); |
| 257 | + renderer.render(scene, camera); |
| 258 | +}); |
| 259 | + |
| 260 | +test('vec4(0.5, 0.5, 0.5, 0.5).smoothstep(float, float)', async () => { |
| 261 | + const result: THREE.Node<'vec4'> = vec4(0.5, 0.5, 0.5, 0.5).smoothstep(0.1, 0.9); |
| 262 | + |
| 263 | + expect(result.getNodeType(nodeBuilder)).toBe('vec4'); |
| 264 | + |
| 265 | + scene.backgroundNode = result.debug(); |
| 266 | + |
| 267 | + await renderer.init(); |
| 268 | + renderer.render(scene, camera); |
| 269 | +}); |
| 270 | + |
| 271 | +// smoothstep — standalone function with vector args |
| 272 | + |
| 273 | +test('smoothstep(float, float, vec3)', async () => { |
| 274 | + const result: THREE.Node<'vec3'> = smoothstep(0.1, 0.9, vec3(0.5, 0.5, 0.5)); |
| 275 | + |
| 276 | + expect(result.getNodeType(nodeBuilder)).toBe('vec3'); |
| 277 | + |
| 278 | + scene.backgroundNode = result.debug(); |
| 279 | + |
| 280 | + await renderer.init(); |
| 281 | + renderer.render(scene, camera); |
| 282 | +}); |
| 283 | + |
| 284 | +// smoothstepElement — standalone function with vector args |
| 285 | + |
| 286 | +test('smoothstepElement(vec3, float, float)', async () => { |
| 287 | + const result: THREE.Node<'vec3'> = smoothstepElement(vec3(0.5, 0.5, 0.5), 0.1, 0.9); |
| 288 | + |
| 289 | + expect(result.getNodeType(nodeBuilder)).toBe('vec3'); |
| 290 | + |
| 291 | + scene.backgroundNode = result.debug(); |
| 292 | + |
| 293 | + await renderer.init(); |
| 294 | + renderer.render(scene, camera); |
| 295 | +}); |
| 296 | + |
| 297 | +// step — chained method on vector nodes |
| 298 | + |
| 299 | +test('vec2(0.5, 0.5).step(0.3)', async () => { |
| 300 | + const result: THREE.Node<'vec2'> = vec2(0.5, 0.5).step(0.3); |
| 301 | + |
| 302 | + expect(result.getNodeType(nodeBuilder)).toBe('vec2'); |
| 303 | + |
| 304 | + scene.backgroundNode = result.debug(); |
| 305 | + |
| 306 | + await renderer.init(); |
| 307 | + renderer.render(scene, camera); |
| 308 | +}); |
| 309 | + |
| 310 | +test('vec3(0.5, 0.5, 0.5).step(float)', async () => { |
| 311 | + const result: THREE.Node<'vec3'> = vec3(0.5, 0.5, 0.5).step(0.3); |
| 312 | + |
| 313 | + expect(result.getNodeType(nodeBuilder)).toBe('vec3'); |
| 314 | + |
| 315 | + scene.backgroundNode = result.debug(); |
| 316 | + |
| 317 | + await renderer.init(); |
| 318 | + renderer.render(scene, camera); |
| 319 | +}); |
| 320 | + |
| 321 | +test('vec4(0.5, 0.5, 0.5, 0.5).step(float)', async () => { |
| 322 | + const result: THREE.Node<'vec4'> = vec4(0.5, 0.5, 0.5, 0.5).step(0.3); |
| 323 | + |
| 324 | + expect(result.getNodeType(nodeBuilder)).toBe('vec4'); |
| 325 | + |
| 326 | + scene.backgroundNode = result.debug(); |
| 327 | + |
| 328 | + await renderer.init(); |
| 329 | + renderer.render(scene, camera); |
| 330 | +}); |
| 331 | + |
| 332 | +// step — standalone function with vector args |
| 333 | + |
| 334 | +test('step(float, vec3)', async () => { |
| 335 | + const result: THREE.Node<'vec3'> = step(0.3, vec3(0.5, 0.5, 0.5)); |
| 336 | + |
| 337 | + expect(result.getNodeType(nodeBuilder)).toBe('vec3'); |
| 338 | + |
| 339 | + scene.backgroundNode = result.debug(); |
| 340 | + |
| 341 | + await renderer.init(); |
| 342 | + renderer.render(scene, camera); |
| 343 | +}); |
| 344 | + |
| 345 | +// stepElement — standalone function with vector args |
| 346 | + |
| 347 | +test('stepElement(vec3, float)', async () => { |
| 348 | + const result: THREE.Node<'vec3'> = stepElement(vec3(0.5, 0.5, 0.5), 0.3); |
| 349 | + |
| 350 | + expect(result.getNodeType(nodeBuilder)).toBe('vec3'); |
| 351 | + |
| 352 | + scene.backgroundNode = result.debug(); |
| 353 | + |
| 354 | + await renderer.init(); |
| 355 | + renderer.render(scene, camera); |
| 356 | +}); |
0 commit comments