|
35 | 35 | var THREE, fflate, manager, g_loader, gltf_loader, ktx2_loader, texture_loader; |
36 | 36 | var skeletonUtils, draco_loader, tga_loader, dds_loader, exr_loader, rgbe_loader; |
37 | 37 | var gpu, gl2, renderer, scene, scenes, default_camera, camera, cameras, cam_id; |
38 | | - var controls, orb_controls, gizmo, orb_controls_gizmo, clock, count = 0; |
| 38 | + var controls, clock, count = 0, tex_res, tex_flip, tex_fmt; |
39 | 39 | var postProcessing, outputPass, bloomPass, bloom_enabled, emissive_present; |
40 | 40 | var grid, polar_grid, grid_visible, polar_grid_visible, model_modified; |
41 | 41 | var animations, animation_mixer, current_animation, extras, current_extra; |
|
44 | 44 | var gui, gui_set = false, guiExposure, params, toneMappingOptions, draco_material; |
45 | 45 | var variants, variant_materials, current_variant, variants_available, link; |
46 | 46 | var ambientLight, directionalLight, isMobile, equi_enabled, depthTest_enabled; |
47 | | - var ww = window.innerWidth, wh = window.innerHeight, tex_res, tex_flip, tex_fmt; |
| 47 | + var ww = window.innerWidth, wh = window.innerHeight; |
48 | 48 | var animation_running, extra_running, gif_export, object_is_points; |
49 | 49 | var rot_x = 0, rot_y = 0, rot_z = 0, initial_rotation, texture_maps; |
50 | 50 | var render_requested, flat_shading_enabled, filename, enabled_features; |
|
68 | 68 | import { KTX2Loader } from "three/addons/loaders/KTX2Loader.min.js"; |
69 | 69 | import { DRACOLoader } from "three/addons/loaders/DRACOLoader.min.js"; |
70 | 70 | import { GLTFLoader } from "../static/jsm/loaders/GLTFLoader.min.js"; |
71 | | - import { OrbitControls } from "../static/jsm/controls/OrbitControls.min.js"; |
72 | | - import { OrbitControlsGizmo } from "../static/jsm/controls/OrbitControlsGizmo.min.js"; |
73 | 71 |
|
74 | 72 | THREE = three_js; |
75 | 73 | fflate = fflate_js; |
|
96 | 94 |
|
97 | 95 | gui = new GUI( { autoPlace: false, container: document.getElementById("gui_position") } ); |
98 | 96 | set_gui_position(); |
99 | | - |
100 | | - orb_controls = OrbitControls; |
101 | | - orb_controls_gizmo = OrbitControlsGizmo; |
102 | 97 | </script> |
103 | 98 |
|
104 | 99 | <script src="../static/js/upng/UPNG.min.js" defer></script> |
|
110 | 105 | position: relative; |
111 | 106 | display: block; |
112 | 107 | background-color: black; |
113 | | - background-image: url( '../../images/DragonFly.webp' ), url( '../../images/DragonFly.png' ); |
114 | | - background-image: -webkit-image-set( url( '../../images/DragonFly.webp' ), url( '../../images/DragonFly.png' ) ); |
115 | | - background-position: calc(50vw - 115px) calc(50vh - 115px); |
116 | | - background-repeat: no-repeat; |
117 | 108 | width: 100%; |
118 | 109 | min-height: 100vh; |
119 | 110 | border: 0; |
|
224 | 215 | z-index: 1; |
225 | 216 | } |
226 | 217 |
|
227 | | - .spinner { |
228 | | - position: absolute; |
229 | | - display: block; |
230 | | - width: 240px; |
231 | | - height: 240px; |
232 | | - top: calc(50% - 130px); |
233 | | - left: calc(50% - 130px); |
234 | | - padding: 4px; |
235 | | - border: 6px solid blue; |
236 | | - -webkit-border-radius: 50%; |
237 | | - border-radius: 50%; |
238 | | - border-top-color: lightblue; |
239 | | - border-bottom-color: lightblue; |
240 | | - background-color: transparent; |
241 | | - -webkit-animation: spin 8s ease-in-out infinite; |
242 | | - animation: spin 8s ease-in-out infinite; |
243 | | - } |
244 | | - |
245 | | - @-webkit-keyframes spin { to { -webkit-transform: rotate( 360deg ); } } |
246 | | - @keyframes spin { to { transform: rotate( 360deg ); } } |
247 | | - |
248 | 218 | .error_msg { |
249 | 219 | background-color: transparent; |
250 | 220 | position: absolute; |
|
267 | 237 | position: absolute; |
268 | 238 | text-align: center; |
269 | 239 | font-size: large; |
270 | | - display: none; |
271 | 240 | height: 240px; |
272 | 241 | width: 240px; |
273 | 242 | top: 50%; |
|
295 | 264 | height: 15px; |
296 | 265 | } |
297 | 266 |
|
298 | | - .fm { |
299 | | - color: navy; |
300 | | - width: calc(100% - 86px); |
301 | | - border: 1px solid navy; |
302 | | - -webkit-border-radius: 2px; |
303 | | - border-radius: 2px; |
304 | | - padding: 4px; |
305 | | - margin: 1px; |
306 | | - } |
307 | | - |
308 | 267 | #gui_position { |
309 | 268 | position: absolute; |
310 | 269 | display: none; |
|
316 | 275 | margin-left: 2px; |
317 | 276 | } |
318 | 277 |
|
319 | | - .fm_gizmo { |
320 | | - width: 63px; |
321 | | - height: 63px; |
| 278 | + .fm { |
| 279 | + color: navy; |
| 280 | + width: 99%; |
| 281 | + border: 1px solid navy; |
| 282 | + -webkit-border-radius: 2px; |
| 283 | + border-radius: 2px; |
322 | 284 | padding: 4px; |
323 | | - margin: 2px; |
| 285 | + margin: 1px; |
324 | 286 | } |
325 | 287 |
|
326 | 288 | .fixed-menu { |
|
347 | 309 |
|
348 | 310 | <!-- Original OBJ source code that inspired this: https://codepen.io/Mamboleoo/pen/PqjGdN --> |
349 | 311 | <!-- Using three.js library: https://github.com/mrdoob/three.js --> |
350 | | - <!-- OrbitControlsGizmo from: https://github.com/Fennec-hub/ThreeOrbitControlsGizmo --> |
351 | 312 | <!-- Animated GIF export is based on the following example and library: --> |
352 | 313 | <!-- https://github.com/mrdoob/omggif-example --> |
353 | 314 | <!-- https://github.com/deanm/omggif --> |
|
361 | 322 | </head> |
362 | 323 | <body onload="reset_all(); document_ready(); disabled_changed();" onresize="resize();"> |
363 | 324 | <div id="fixed_menu" class="fixed-menu"> |
364 | | - <div class="fm_gizmo" id="gizmo" title="Interactive Orbit Controls Gizmo" style="float: right; background-color: black;"></div> |
365 | 325 | <div class="fm" id="fm1"> |
366 | 326 | <label for="file_input" title="3D Model Formats: GLTF + BIN, GLB, VRM, DRC Formats" style="color: #553801; margin-left: 3px;">3D</label> |
367 | 327 | <button title="URL of the remote 3D model" id="btn_url" onclick="show_url();" style="background-color: transparent; min-width: 34px;">URL</button> |
|
515 | 475 | <progress id="progress" value="0" max="1"></progress> |
516 | 476 | </div> |
517 | 477 |
|
518 | | - <div id="div_spinner" class="spinner"></div> |
519 | 478 | <div id="div_error" class="error_msg">E R R O R !</div> |
520 | | - <div id="div_loading" class="loading_msg">Loading</div> |
| 479 | + <div id="div_loading" class="loading_msg">GLTF WebGPU</div> |
521 | 480 | <div id="div_gif_rectangle" class="gif_rectangle"></div> |
522 | 481 |
|
523 | 482 | <script> |
|
685 | 644 | function show_url() { |
686 | 645 | if (url_displayed === true) { |
687 | 646 | document.getElementById('url').style.display = 'none'; |
688 | | - document.getElementById('fm2').style.width = isMobile === true ? '99%' : 'calc(100% - 86px)'; |
689 | 647 | document.getElementById('btn_url').style.backgroundColor = 'transparent'; |
690 | 648 | url_displayed = false; |
691 | 649 | } else { |
692 | 650 | document.getElementById('url').style.display = 'block'; |
693 | | - document.getElementById('fm2').style.width = '99%'; |
694 | 651 | document.getElementById('btn_url').style.backgroundColor = 'lightgreen'; |
695 | 652 | url_displayed = true; |
696 | 653 | } |
697 | 654 |
|
698 | 655 | resize(); |
699 | 656 |
|
700 | | - if (gui) set_gui_position(); |
701 | | - |
702 | 657 | mouse_wheel = true; |
703 | 658 | } |
704 | 659 |
|
|
742 | 697 | document.getElementById('btn_full_screen').style.backgroundColor = 'transparent'; |
743 | 698 | } |
744 | 699 |
|
745 | | - if (typeof $ !== 'undefined' && isMobile === false) { |
746 | | - let fm1_bottom = ( parseInt( $('#fm1').outerHeight( true ) ) ); |
747 | | - |
748 | | - if (url_displayed === true) { |
749 | | - document.getElementById('url').style.width = fm1_bottom > 70 ? '99%' : 'calc(100% - 86px)'; |
750 | | - |
751 | | - let url_bottom = ( fm1_bottom + parseInt( $('#url').outerHeight( true ) ) ); |
752 | | - document.getElementById('fm2').style.width = url_bottom > 70 ? '99%' : 'calc(100% - 86px)'; |
753 | | - } else { |
754 | | - document.getElementById('fm2').style.width = fm1_bottom > 70 ? '99%' : 'calc(100% - 86px)'; |
755 | | - } |
756 | | - } |
| 700 | + set_gui_position(); |
757 | 701 |
|
758 | 702 | if (scene !== undefined) { |
759 | 703 | mouse_wheel = true; |
|
766 | 710 | default_camera.aspect = ww / wh; |
767 | 711 | default_camera.updateProjectionMatrix(); |
768 | 712 |
|
769 | | - if (gui) set_gui_position(); |
770 | | - |
771 | 713 | mouse_wheel = true; |
772 | 714 | } |
773 | 715 | } |
|
801 | 743 | document.getElementById('btn_menu_location').style.backgroundColor = '#FFFF00'; |
802 | 744 | } |
803 | 745 |
|
804 | | - if (gui) set_gui_position(); |
| 746 | + set_gui_position(); |
805 | 747 |
|
806 | 748 | mouse_wheel = true; |
807 | 749 | } |
|
1809 | 1751 | document.getElementById('div_message').style.display = ''; |
1810 | 1752 | } |
1811 | 1753 |
|
1812 | | - if (gui) set_gui_position(); |
| 1754 | + set_gui_position(); |
1813 | 1755 | } |
1814 | 1756 |
|
1815 | 1757 | async function set_scene_image( reset = false ) { |
|
2309 | 2251 |
|
2310 | 2252 | await scene_cleanup(); |
2311 | 2253 |
|
2312 | | - if (gizmo) { |
2313 | | - document.getElementById('gizmo').removeChild( gizmo.domElement ); |
2314 | | - gizmo = undefined; |
2315 | | - } |
2316 | | - |
2317 | 2254 | await reset_all( true ); |
2318 | 2255 | } |
2319 | 2256 |
|
|
2426 | 2363 |
|
2427 | 2364 | console.time( 'Loading Time' ); |
2428 | 2365 | document.body.style.backgroundImage = 'none'; |
2429 | | - document.getElementById('div_spinner').style.display = 'none'; |
2430 | 2366 | document.getElementById('div_error').style.display = 'none'; |
2431 | 2367 | document.getElementById('div_loading').style.display = 'block'; |
2432 | 2368 | document.getElementById('div_loading').innerHTML = 'Load & Visualize'; |
|
2564 | 2500 | } |
2565 | 2501 |
|
2566 | 2502 | if (controls === undefined) { |
2567 | | - controls = new orb_controls( default_camera, renderer.domElement ); |
2568 | | - controls.enableZoomToCursor = true; |
2569 | | - controls.zoomSpeed = 0.8; |
2570 | | - controls.rotateSpeed = 0.8; |
2571 | | - controls.keyPanSpeed = 0.8; |
2572 | | - controls.panSpeed = 0.8; |
| 2503 | + const { OrbitControls } = await import( "three/addons/controls/OrbitControls.min.js" ); |
| 2504 | + |
| 2505 | + controls = new OrbitControls( default_camera, renderer.domElement ); |
| 2506 | + controls.zoomToCursor = true; |
| 2507 | + controls.zoomSpeed = 0.6; |
| 2508 | + controls.rotateSpeed = 0.6; |
| 2509 | + controls.keyPanSpeed = 0.6; |
| 2510 | + controls.panSpeed = 0.6; |
2573 | 2511 | //controls.enableDamping = true; |
2574 | 2512 | //controls.dampingFactor = 0.05; |
2575 | 2513 | //controls.enableKeys = false; |
|
3194 | 3132 | disabled_changed(); |
3195 | 3133 | } |
3196 | 3134 |
|
3197 | | - if (isMobile === true) { |
3198 | | - document.getElementById('gizmo').style.display = 'none'; |
3199 | | - } else { |
3200 | | - if (gizmo === undefined) { |
3201 | | - gizmo = new orb_controls_gizmo( controls, { |
3202 | | - size: 65, |
3203 | | - padding: 4, |
3204 | | - bubbleSizePrimary: 7, |
3205 | | - bubbleSizeSecondary: 3, |
3206 | | - lineWidth: 1, |
3207 | | - fontSize: '8px', |
3208 | | - fontColor: 'black', |
3209 | | - fontWeight: 'bold' |
3210 | | - }); |
3211 | | - |
3212 | | - document.getElementById('gizmo').addEventListener( 'click', ( event ) => { if (progress.value === 0) mouse_down = true; }, false); |
3213 | | - document.getElementById('gizmo').appendChild( gizmo.domElement ); |
3214 | | - } |
3215 | | - } |
3216 | | - |
3217 | 3135 | if (animations.length > 0) { |
3218 | 3136 | animation_mixer.clipAction( animations[ 0 ] ).play(); |
3219 | 3137 | document.getElementById('btn_animate').disabled = false; |
|
3289 | 3207 | render_requested = false; |
3290 | 3208 | enable_disable( true ); |
3291 | 3209 |
|
3292 | | - if (gizmo) { |
3293 | | - document.getElementById('gizmo').removeChild( gizmo.domElement ); |
3294 | | - gizmo.dispose(); |
3295 | | - } |
3296 | | - |
3297 | 3210 | document.getElementById('div_loading').style.display = 'none'; |
3298 | 3211 | document.getElementById('div_error').style.display = 'block'; |
3299 | 3212 | } |
|
4343 | 4256 | } |
4344 | 4257 |
|
4345 | 4258 | controls.update(); |
4346 | | - if (gizmo) gizmo.update(); |
4347 | 4259 |
|
4348 | 4260 | renderer.clear(); |
4349 | 4261 |
|
|
4499 | 4411 | } |
4500 | 4412 |
|
4501 | 4413 | document.getElementById('file_input').value = ''; |
4502 | | - document.getElementById('div_spinner').style.display = 'block'; |
4503 | 4414 | document.getElementById('div_error').style.display = 'none'; |
4504 | 4415 | document.getElementById('btn_lines').disabled = true; |
4505 | 4416 | document.getElementById('btn_animate').disabled = true; |
|
4510 | 4421 | document.getElementById('url_entry').value = ''; |
4511 | 4422 | selected_url_file = ''; |
4512 | 4423 | enable_disable( true ); |
4513 | | - |
4514 | | - if (gizmo) { |
4515 | | - document.getElementById('gizmo').removeChild( gizmo.domElement ); |
4516 | | - gizmo.dispose(); |
4517 | | - } |
4518 | 4424 | } |
4519 | 4425 |
|
4520 | 4426 | disabled_changed(); |
|
4766 | 4672 | $('#model_scale').change( function() { $(this).children(':selected').click(); }); |
4767 | 4673 | } |
4768 | 4674 |
|
4769 | | - if (isMobile === true) { |
4770 | | - $('#gizmo')[ 0 ].style.display = 'none'; |
4771 | | - $('#fm1')[ 0 ].style.width = '99%'; |
4772 | | - $('#fm2')[ 0 ].style.width = '99%'; |
4773 | | - $('#url')[ 0 ].style.width = '99%'; |
4774 | | - } |
4775 | | - |
4776 | 4675 | mouse_wheel = true; |
4777 | 4676 | } |
4778 | 4677 |
|
|
0 commit comments