threepipe
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

script.ts 2.7KB

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