threepipe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {_testFinish, IObject3D, LoadingScreenPlugin, ThreeViewer} from 'threepipe'
  2. import {TweakpaneUiPlugin} from '@threepipe/plugin-tweakpane'
  3. async function init() {
  4. const viewer = new ThreeViewer({
  5. canvas: document.getElementById('mcanvas') as HTMLCanvasElement,
  6. msaa: true,
  7. plugins: [LoadingScreenPlugin],
  8. })
  9. const ui = viewer.addPluginSync(new TweakpaneUiPlugin(true))
  10. await viewer.setEnvironmentMap('https://threejs.org/examples/textures/equirectangular/venice_sunset_1k.hdr', {
  11. setBackground: true,
  12. })
  13. await viewer.load<IObject3D>('https://threejs.org/examples/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf', {
  14. autoCenter: true,
  15. autoScale: true,
  16. })
  17. // setup css alignment of canvas inside container
  18. viewer.container.style.position = 'relative'
  19. viewer.canvas.style.position = 'absolute'
  20. viewer.canvas.style.top = '50%'
  21. viewer.canvas.style.left = '50%'
  22. viewer.canvas.style.transform = 'translate(-50%, -50%)'
  23. const state = {
  24. width: 1280,
  25. height: 768,
  26. mode: 'contain' as 'contain' | 'cover' | 'fill' | 'scale-down' | 'none',
  27. dpr: 1,
  28. alignX: 0,
  29. alignY: 0,
  30. }
  31. viewer.setRenderSize({width: state.width, height: state.height}, state.mode, state.dpr)
  32. ui.appendChild({
  33. type: 'folder',
  34. label: 'Render Size',
  35. value: state,
  36. expanded: true,
  37. onChange: ()=>{
  38. viewer.setRenderSize({width: state.width, height: state.height}, state.mode, state.dpr)
  39. viewer.canvas.style.transform = `translate(${state.alignX * 100 - 50}%, ${state.alignY * 100 - 50}%)`
  40. },
  41. children: [{
  42. type: 'slider',
  43. label: 'Width',
  44. path: 'width',
  45. bounds: [10, 2048],
  46. stepSize: 10,
  47. }, {
  48. type: 'slider',
  49. label: 'Height',
  50. path: 'height',
  51. bounds: [10, 2048],
  52. stepSize: 10,
  53. }, {
  54. type: 'dropdown',
  55. label: 'Mode',
  56. children: ['contain', 'cover', 'fill', 'scale-down', 'none'].map((v) => ({label: v})),
  57. path: 'mode',
  58. }, {
  59. type: 'slider',
  60. label: 'DPR',
  61. path: 'dpr',
  62. bounds: [0.1, 4],
  63. stepSize: 0.1,
  64. }, {
  65. type: 'slider',
  66. label: 'AlignX',
  67. path: 'alignX',
  68. bounds: [-1, 1],
  69. stepSize: 0.01,
  70. }, {
  71. type: 'slider',
  72. label: 'AlignY',
  73. path: 'alignY',
  74. bounds: [-1, 1],
  75. stepSize: 0.01,
  76. }],
  77. })
  78. }
  79. init().finally(_testFinish)