Viewport.Info.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { UIPanel, UIBreak, UIText } from './libs/ui.js';
  2. function ViewportInfo( editor ) {
  3. const signals = editor.signals;
  4. const strings = editor.strings;
  5. const container = new UIPanel();
  6. container.setId( 'info' );
  7. container.setPosition( 'absolute' );
  8. container.setLeft( '10px' );
  9. container.setBottom( '20px' );
  10. container.setFontSize( '12px' );
  11. container.setColor( '#fff' );
  12. container.setTextTransform( 'lowercase' );
  13. const objectsText = new UIText( '0' ).setTextAlign( 'right' ).setWidth( '60px' ).setMarginRight( '6px' );
  14. const verticesText = new UIText( '0' ).setTextAlign( 'right' ).setWidth( '60px' ).setMarginRight( '6px' );
  15. const trianglesText = new UIText( '0' ).setTextAlign( 'right' ).setWidth( '60px' ).setMarginRight( '6px' );
  16. const frametimeText = new UIText( '0' ).setTextAlign( 'right' ).setWidth( '60px' ).setMarginRight( '6px' );
  17. const samplesText = new UIText( '0' ).setTextAlign( 'right' ).setWidth( '60px' ).setMarginRight( '6px' ).setHidden( true );
  18. const objectsUnitText = new UIText( strings.getKey( 'viewport/info/objects' ) );
  19. const verticesUnitText = new UIText( strings.getKey( 'viewport/info/vertices' ) );
  20. const trianglesUnitText = new UIText( strings.getKey( 'viewport/info/triangles' ) );
  21. const samplesUnitText = new UIText( strings.getKey( 'viewport/info/samples' ) ).setHidden( true );
  22. container.add( objectsText, objectsUnitText, new UIBreak() );
  23. container.add( verticesText, verticesUnitText, new UIBreak() );
  24. container.add( trianglesText, trianglesUnitText, new UIBreak() );
  25. container.add( frametimeText, new UIText( strings.getKey( 'viewport/info/rendertime' ) ), new UIBreak() );
  26. container.add( samplesText, samplesUnitText, new UIBreak() );
  27. signals.objectAdded.add( update );
  28. signals.objectRemoved.add( update );
  29. signals.objectChanged.add( update );
  30. signals.geometryChanged.add( update );
  31. signals.sceneRendered.add( updateFrametime );
  32. //
  33. const pluralRules = new Intl.PluralRules( editor.config.getKey( 'language' ) );
  34. //
  35. function update() {
  36. const scene = editor.scene;
  37. let objects = 0, vertices = 0, triangles = 0;
  38. for ( let i = 0, l = scene.children.length; i < l; i ++ ) {
  39. const object = scene.children[ i ];
  40. object.traverseVisible( function ( object ) {
  41. objects ++;
  42. if ( object.isMesh || object.isPoints ) {
  43. const geometry = object.geometry;
  44. vertices += geometry.attributes.position.count;
  45. if ( object.isMesh ) {
  46. if ( geometry.index !== null ) {
  47. triangles += geometry.index.count / 3;
  48. } else {
  49. triangles += geometry.attributes.position.count / 3;
  50. }
  51. }
  52. }
  53. } );
  54. }
  55. objectsText.setValue( editor.utils.formatNumber( objects ) );
  56. verticesText.setValue( editor.utils.formatNumber( vertices ) );
  57. trianglesText.setValue( editor.utils.formatNumber( triangles ) );
  58. const pluralRules = new Intl.PluralRules( editor.config.getKey( 'language' ) );
  59. const objectsStringKey = ( pluralRules.select( objects ) === 'one' ) ? 'viewport/info/object' : 'viewport/info/objects';
  60. objectsUnitText.setValue( strings.getKey( objectsStringKey ) );
  61. const verticesStringKey = ( pluralRules.select( vertices ) === 'one' ) ? 'viewport/info/vertex' : 'viewport/info/vertices';
  62. verticesUnitText.setValue( strings.getKey( verticesStringKey ) );
  63. const trianglesStringKey = ( pluralRules.select( triangles ) === 'one' ) ? 'viewport/info/triangle' : 'viewport/info/triangles';
  64. trianglesUnitText.setValue( strings.getKey( trianglesStringKey ) );
  65. }
  66. function updateFrametime( frametime ) {
  67. frametimeText.setValue( Number( frametime ).toFixed( 2 ) );
  68. }
  69. //
  70. editor.signals.pathTracerUpdated.add( function ( samples ) {
  71. samples = Math.floor( samples );
  72. samplesText.setValue( samples );
  73. const samplesStringKey = ( pluralRules.select( samples ) === 'one' ) ? 'viewport/info/sample' : 'viewport/info/samples';
  74. samplesUnitText.setValue( strings.getKey( samplesStringKey ) );
  75. } );
  76. editor.signals.viewportShadingChanged.add( function () {
  77. const isRealisticShading = ( editor.viewportShading === 'realistic' );
  78. samplesText.setHidden( ! isRealisticShading );
  79. samplesUnitText.setHidden( ! isRealisticShading );
  80. container.setBottom( isRealisticShading ? '32px' : '20px' );
  81. } );
  82. return container;
  83. }
  84. export { ViewportInfo };
粤ICP备19079148号