inject.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Create the __THREE_DEVTOOLS__ object immediately
  2. window.__THREE_DEVTOOLS__ = new EventTarget();
  3. // Store references to observed objects
  4. window.__THREE_DEVTOOLS__.objects = new Map();
  5. // Track visibility state
  6. window.__THREE_DEVTOOLS__.isVisible = true;
  7. // Listen for visibility updates from devtools panel
  8. window.__THREE_DEVTOOLS__.addEventListener( 'visibility', ( event ) => {
  9. window.__THREE_DEVTOOLS__.isVisible = event.detail;
  10. window.postMessage( {
  11. id: 'three-devtools',
  12. type: 'visibility',
  13. state: event.detail
  14. }, '*' );
  15. } );
  16. // Function to get renderer data
  17. function getRendererData( renderer ) {
  18. return {
  19. uuid: renderer.uuid,
  20. type: 'WebGLRenderer',
  21. name: 'WebGLRenderer',
  22. isRenderer: true,
  23. properties: {
  24. width: renderer.domElement.width,
  25. height: renderer.domElement.height,
  26. drawCalls: renderer.info.render.calls,
  27. triangles: renderer.info.render.triangles
  28. }
  29. };
  30. }
  31. // Function to get object hierarchy
  32. function getObjectData( obj ) {
  33. if ( obj.isWebGLRenderer === true ) {
  34. return getRendererData( obj );
  35. }
  36. return {
  37. uuid: obj.uuid,
  38. type: obj.type,
  39. name: obj.name || obj.type,
  40. isScene: obj.type === 'Scene',
  41. isRenderer: false,
  42. parent: obj.parent ? obj.parent.uuid : null,
  43. children: obj.children ? obj.children.map( child => child.uuid ) : []
  44. };
  45. }
  46. // Listen for Three.js registration
  47. window.__THREE_DEVTOOLS__.addEventListener( 'register', ( event ) => {
  48. console.log( 'Three.js registered:', event.detail );
  49. window.postMessage( {
  50. type: 'FROM_THREE_INSPECTOR',
  51. subType: 'register',
  52. detail: event.detail
  53. }, '*' );
  54. } );
  55. // Listen for object observations
  56. window.__THREE_DEVTOOLS__.addEventListener( 'observe', ( event ) => {
  57. const obj = event.detail;
  58. console.log( 'Three.js object observed:', obj.type );
  59. const data = getObjectData( obj );
  60. window.__THREE_DEVTOOLS__.objects.set( obj.uuid, data );
  61. window.postMessage( {
  62. type: 'FROM_THREE_INSPECTOR',
  63. subType: 'observe',
  64. detail: data
  65. }, '*' );
  66. // If this is a scene, also traverse its children
  67. if ( obj.type === 'Scene' ) {
  68. console.log( 'Traversing scene children' );
  69. obj.traverse( ( child ) => {
  70. if ( child !== obj ) {
  71. const childData = getObjectData( child );
  72. window.__THREE_DEVTOOLS__.objects.set( child.uuid, childData );
  73. window.postMessage( {
  74. type: 'FROM_THREE_INSPECTOR',
  75. subType: 'observe',
  76. detail: childData
  77. }, '*' );
  78. }
  79. } );
  80. }
  81. } );
粤ICP备19079148号