| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import {
- _testFinish,
- IObject3D,
- LoadingScreenPlugin,
- PhysicalMaterial,
- shaderReplaceString,
- ThreeViewer, Vector2,
- } from 'threepipe'
- import {TweakpaneUiPlugin} from '@threepipe/plugin-tweakpane'
-
- async function init() {
-
- const viewer = new ThreeViewer({
- canvas: document.getElementById('mcanvas') as HTMLCanvasElement,
- msaa: true,
- plugins: [LoadingScreenPlugin],
- })
-
- const ui = viewer.addPluginSync(new TweakpaneUiPlugin(true))
-
- await viewer.setEnvironmentMap('https://threejs.org/examples/textures/equirectangular/venice_sunset_1k.hdr', {
- setBackground: true,
- })
- const result = await viewer.load<IObject3D>('https://threejs.org/examples/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf', {
- autoCenter: true,
- autoScale: true,
- })
-
- const testMat = await viewer.load<PhysicalMaterial>('https://packs.ijewel3d.com/files/metal_whitegold_brush_3_08d4d2ad61.pmat?tp')
- const model = result?.getObjectByName('node_damagedHelmet_-6514')
-
- if (!model || !testMat) {
- alert('Model or material not found')
- return
- }
- testMat.color.set(0x00ff00)
-
- const model2 = model.clone()
- model2.material = testMat
- model.parent!.add(model2)
-
- const clipVec = new Vector2(0.3, 0.5)
-
- ui.appendChild({
- type: 'slider',
- bounds: [0, 1],
- label: 'Clip UV X',
- property: [clipVec, 'x'],
- onChange: ()=>{
- model.materials![0].setDirty()
- testMat.setDirty()
- },
- })
-
- model.materials![0].registerMaterialExtensions([{
- extraUniforms: {
- clipVec: {value: clipVec},
- },
- parsFragmentSnippet: 'uniform vec2 clipVec;',
- shaderExtender: (shader)=>{
- shader.fragmentShader = shaderReplaceString(shader.fragmentShader, 'void main() {', `
- if(vUv.x > clipVec.x) discard;
- `, {append: true})
- shader.defines.USE_UV = ''
- },
- isCompatible: (mat)=>(mat as any).isMeshStandardMaterial,
- computeCacheKey: ()=>clipVec.x + ' ' + clipVec.y,
- }])
- testMat.registerMaterialExtensions([{
- extraUniforms: {
- clipVec: {value: clipVec},
- },
- parsFragmentSnippet: 'uniform vec2 clipVec;',
- shaderExtender: (shader)=>{
- shader.fragmentShader = shaderReplaceString(shader.fragmentShader, 'void main() {', `
- if(vUv.x < clipVec.x) discard;
- `, {append: true})
- shader.defines.USE_UV = ''
- },
- isCompatible: (mat)=>(mat as any).isMeshStandardMaterial,
- computeCacheKey: ()=>clipVec.x + ' ' + clipVec.y,
- }])
-
- }
-
- init().finally(_testFinish)
|