TextureTab.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. module INSPECTOR {
  2. export class TextureTab extends Tab {
  3. private _inspector: Inspector;
  4. /** The panel containing a list of items */
  5. protected _treePanel: HTMLElement;
  6. protected _treeItems: Array<TreeItem> = [];
  7. /* Panel containing the texture image */
  8. private _imagePanel: HTMLElement;
  9. constructor(tabbar: TabBar, inspector: Inspector) {
  10. super(tabbar, 'Textures');
  11. this._inspector = inspector;
  12. // Build the properties panel : a div that will contains the tree and the detail panel
  13. this._panel = Helpers.CreateDiv('tab-panel') as HTMLDivElement;
  14. // Build the treepanel
  15. this._treePanel = Helpers.CreateDiv('insp-tree', this._panel);
  16. this._imagePanel = Helpers.CreateDiv('insp-details', this._panel) as HTMLDivElement;
  17. Split([this._treePanel, this._imagePanel], {
  18. blockDrag: this._inspector.popupMode,
  19. direction: 'vertical'
  20. });
  21. this.update();
  22. }
  23. public dispose() {
  24. // Nothing to dispose
  25. }
  26. public update(_items?: Array<TreeItem>) {
  27. let items;
  28. if (_items) {
  29. items = _items;
  30. } else {
  31. // Rebuild the tree
  32. this._treeItems = this._getTree();
  33. items = this._treeItems;
  34. }
  35. // Clean the tree
  36. Helpers.CleanDiv(this._treePanel);
  37. Helpers.CleanDiv(this._imagePanel);
  38. // Sort items alphabetically
  39. items.sort((item1, item2) => {
  40. return item1.compareTo(item2);
  41. });
  42. // Display items
  43. for (let item of items) {
  44. this._treePanel.appendChild(item.toHtml());
  45. }
  46. }
  47. /* Overrides super */
  48. private _getTree(): Array<TreeItem> {
  49. let arr = [];
  50. // get all cameras from the first scene
  51. let instances = this._inspector.scene;
  52. for (let tex of instances.textures) {
  53. arr.push(new TreeItem(this, new TextureAdapter(tex)));
  54. }
  55. return arr;
  56. }
  57. /** Display the details of the given item */
  58. public displayDetails(item: TreeItem) {
  59. // Remove active state on all items
  60. this.activateNode(item);
  61. Helpers.CleanDiv(this._imagePanel);
  62. // Get the texture object
  63. let texture = item.adapter.object;
  64. let imgs: HTMLImageElement[] = [];
  65. let img = Helpers.CreateElement('img', 'texture-image', this._imagePanel) as HTMLImageElement;
  66. imgs.push(img);
  67. //Create five other images elements
  68. for (let i = 0; i < 5; i++) {
  69. imgs.push(Helpers.CreateElement('img', 'texture-image', this._imagePanel) as HTMLImageElement);
  70. }
  71. if (texture instanceof BABYLON.RenderTargetTexture) {
  72. // RenderTarget textures
  73. let scene = this._inspector.scene;
  74. let engine = scene.getEngine();
  75. let size = texture.getSize();
  76. // Clone the texture
  77. let screenShotTexture = texture.clone();
  78. screenShotTexture.activeCamera = texture.activeCamera;
  79. screenShotTexture.onBeforeRender = texture.onBeforeRender;
  80. screenShotTexture.onAfterRender = texture.onAfterRender;
  81. screenShotTexture.onBeforeRenderObservable = texture.onBeforeRenderObservable;
  82. // To display the texture after rendering
  83. screenShotTexture.onAfterRenderObservable.add((faceIndex: number) => {
  84. BABYLON.Tools.DumpFramebuffer(size.width, size.height, engine,
  85. (data) => imgs[faceIndex].src = data);
  86. });
  87. // Render the texture
  88. scene.incrementRenderId();
  89. scene.resetCachedMaterial();
  90. screenShotTexture.render();
  91. screenShotTexture.dispose();
  92. } else if (texture instanceof BABYLON.CubeTexture) {
  93. // Cannot open correctly DDS File
  94. // Display all textures of the CubeTexture
  95. let pixels = <ArrayBufferView>texture.readPixels();
  96. let canvas = document.createElement('canvas');
  97. canvas.id = "MyCanvas";
  98. if (img.parentElement) {
  99. img.parentElement.appendChild(canvas);
  100. }
  101. let ctx = <CanvasRenderingContext2D>canvas.getContext('2d');
  102. let size = texture.getSize();
  103. let tmp = pixels.buffer.slice(0, size.height * size.width * 4);
  104. let u = new Uint8ClampedArray(tmp)
  105. let colors = new ImageData(size.width * 6, size.height);
  106. colors.data.set(u);
  107. let imgData = ctx.createImageData(size.width * 6, size.height);
  108. imgData.data.set(u);
  109. // let data = imgData.data;
  110. // for(let i = 0, len = size.height * size.width; i < len; i++) {
  111. // data[i] = pixels[i];
  112. // }
  113. ctx.putImageData(imgData, 0, 0);
  114. // let i: number = 0;
  115. // for(let filename of (texture as BABYLON.CubeTexture)['_files']){
  116. // imgs[i].src = filename;
  117. // i++;
  118. // }
  119. }
  120. else if (texture['_canvas']) {
  121. // Dynamic texture
  122. let base64Image = texture['_canvas'].toDataURL("image/png");
  123. img.src = base64Image;
  124. } else if (texture.url) {
  125. let pixels = texture.readPixels();
  126. let canvas = document.createElement('canvas');
  127. canvas.id = "MyCanvas";
  128. if (img.parentElement) {
  129. img.parentElement.appendChild(canvas);
  130. }
  131. let ctx = <CanvasRenderingContext2D>canvas.getContext('2d');
  132. let size = texture.getSize();
  133. let imgData = ctx.createImageData(size.width, size.height);
  134. imgData.data.set(pixels);
  135. ctx.putImageData(imgData, 0, 0);
  136. // If an url is present, the texture is an image
  137. // img.src = texture.url;
  138. }
  139. }
  140. /** Select an item in the tree */
  141. public select(item: TreeItem) {
  142. // Active the node
  143. this.activateNode(item);
  144. // Display its details
  145. this.displayDetails(item);
  146. }
  147. /** Set the given item as active in the tree */
  148. public activateNode(item: TreeItem) {
  149. if (this._treeItems) {
  150. for (let node of this._treeItems) {
  151. node.active(false);
  152. }
  153. }
  154. item.active(true);
  155. }
  156. }
  157. }