threepipe
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import {
  2. _testFinish,
  3. IObject3D,
  4. LoadingScreenPlugin,
  5. PhysicalMaterial,
  6. shaderReplaceString,
  7. ThreeViewer, Vector2,
  8. } from 'threepipe'
  9. import {TweakpaneUiPlugin} from '@threepipe/plugin-tweakpane'
  10. async function init() {
  11. const viewer = new ThreeViewer({
  12. canvas: document.getElementById('mcanvas') as HTMLCanvasElement,
  13. msaa: true,
  14. plugins: [LoadingScreenPlugin],
  15. })
  16. const ui = viewer.addPluginSync(new TweakpaneUiPlugin(true))
  17. await viewer.setEnvironmentMap('https://threejs.org/examples/textures/equirectangular/venice_sunset_1k.hdr', {
  18. setBackground: true,
  19. })
  20. const result = await viewer.load<IObject3D>('https://threejs.org/examples/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf', {
  21. autoCenter: true,
  22. autoScale: true,
  23. })
  24. const testMat = await viewer.load<PhysicalMaterial>('https://packs.ijewel3d.com/files/metal_whitegold_brush_3_08d4d2ad61.pmat?tp')
  25. const model = result?.getObjectByName('node_damagedHelmet_-6514')
  26. if (!model || !testMat) {
  27. alert('Model or material not found')
  28. return
  29. }
  30. testMat.color.set(0x00ff00)
  31. const model2 = model.clone()
  32. model2.material = testMat
  33. model.parent!.add(model2)
  34. const clipVec = new Vector2(0.3, 0.5)
  35. ui.appendChild({
  36. type: 'slider',
  37. bounds: [0, 1],
  38. label: 'Clip UV X',
  39. property: [clipVec, 'x'],
  40. onChange: ()=>{
  41. model.materials![0].setDirty()
  42. testMat.setDirty()
  43. },
  44. })
  45. model.materials![0].registerMaterialExtensions([{
  46. extraUniforms: {
  47. clipVec: {value: clipVec},
  48. },
  49. parsFragmentSnippet: 'uniform vec2 clipVec;',
  50. shaderExtender: (shader)=>{
  51. shader.fragmentShader = shaderReplaceString(shader.fragmentShader, 'void main() {', `
  52. if(vUv.x > clipVec.x) discard;
  53. `, {append: true})
  54. shader.defines.USE_UV = ''
  55. },
  56. isCompatible: (mat)=>(mat as any).isMeshStandardMaterial,
  57. computeCacheKey: ()=>clipVec.x + ' ' + clipVec.y,
  58. }])
  59. testMat.registerMaterialExtensions([{
  60. extraUniforms: {
  61. clipVec: {value: clipVec},
  62. },
  63. parsFragmentSnippet: 'uniform vec2 clipVec;',
  64. shaderExtender: (shader)=>{
  65. shader.fragmentShader = shaderReplaceString(shader.fragmentShader, 'void main() {', `
  66. if(vUv.x < clipVec.x) discard;
  67. `, {append: true})
  68. shader.defines.USE_UV = ''
  69. },
  70. isCompatible: (mat)=>(mat as any).isMeshStandardMaterial,
  71. computeCacheKey: ()=>clipVec.x + ' ' + clipVec.y,
  72. }])
  73. }
  74. init().finally(_testFinish)