Przeglądaj źródła

Add example Multi-Render UV Clipping

master
Palash Bansal 1 rok temu
rodzic
commit
5f25bd33c4
No account linked to committer's email address

+ 1
- 0
examples/index.html Wyświetl plik

@@ -498,6 +498,7 @@
<h2 class="category">Experiments</h2>
<ul>
<li><a href="./progressive-hdr-shadows-exp/">Progressive HDR Environment Shadows</a></li>
<li><a href="./multi-render-uv-clip/">Multi-render UV clipping <br/> (Material Extension) </a></li>
<li><a href="./svg-geometry-playground/">SVG Geometry Playground </a></li>
</ul>
<h2 class="category">UI Config</h2>

+ 36
- 0
examples/multi-render-uv-clip/index.html Wyświetl plik

@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Multi-Render UV Clipping</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Import maps polyfill -->
<!-- Remove this when import maps will be widely supported -->
<script async src="https://unpkg.com/es-module-shims@1.6.3/dist/es-module-shims.js"></script>

<script type="importmap">
{
"imports": {
"threepipe": "./../../dist/index.mjs",
"@threepipe/plugin-tweakpane": "./../../plugins/tweakpane/dist/index.mjs"
}
}

</script>
<style id="example-style">
html, body, #canvas-container, #mcanvas {
width: 100%;
height: 100%;
margin: 0;
overflow: hidden;
}
</style>
<script type="module" src="../examples-utils/simple-code-preview.mjs"></script>
<script id="example-script" type="module" src="./script.js" data-scripts="./script.ts;./script.js"></script>
</head>
<body>
<div id="canvas-container">
<canvas id="mcanvas"></canvas>
</div>

</body>

+ 86
- 0
examples/multi-render-uv-clip/script.ts Wyświetl plik

@@ -0,0 +1,86 @@
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)

Ładowanie…
Anuluj
Zapisz