WebGLGeometries.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js';
  5. import { BufferGeometry } from '../../core/BufferGeometry.js';
  6. import { arrayMax } from '../../utils.js';
  7. function WebGLGeometries( gl, attributes, info ) {
  8. var geometries = {};
  9. var wireframeAttributes = {};
  10. function onGeometryDispose( event ) {
  11. var geometry = event.target;
  12. var buffergeometry = geometries[ geometry.id ];
  13. if ( buffergeometry.index !== null ) {
  14. attributes.remove( buffergeometry.index );
  15. }
  16. for ( var name in buffergeometry.attributes ) {
  17. attributes.remove( buffergeometry.attributes[ name ] );
  18. }
  19. geometry.removeEventListener( 'dispose', onGeometryDispose );
  20. delete geometries[ geometry.id ];
  21. // TODO Remove duplicate code
  22. var attribute = wireframeAttributes[ geometry.id ];
  23. if ( attribute ) {
  24. attributes.remove( attribute );
  25. delete wireframeAttributes[ geometry.id ];
  26. }
  27. attribute = wireframeAttributes[ buffergeometry.id ];
  28. if ( attribute ) {
  29. attributes.remove( attribute );
  30. delete wireframeAttributes[ buffergeometry.id ];
  31. }
  32. //
  33. info.memory.geometries --;
  34. }
  35. function get( object, geometry ) {
  36. var buffergeometry = geometries[ geometry.id ];
  37. if ( buffergeometry ) return buffergeometry;
  38. geometry.addEventListener( 'dispose', onGeometryDispose );
  39. if ( geometry.isBufferGeometry ) {
  40. buffergeometry = geometry;
  41. } else if ( geometry.isGeometry ) {
  42. if ( geometry._bufferGeometry === undefined ) {
  43. geometry._bufferGeometry = new BufferGeometry().setFromObject( object );
  44. }
  45. buffergeometry = geometry._bufferGeometry;
  46. }
  47. geometries[ geometry.id ] = buffergeometry;
  48. info.memory.geometries ++;
  49. return buffergeometry;
  50. }
  51. function update( geometry ) {
  52. var index = geometry.index;
  53. var geometryAttributes = geometry.attributes;
  54. if ( index !== null ) {
  55. attributes.update( index, gl.ELEMENT_ARRAY_BUFFER );
  56. }
  57. for ( var name in geometryAttributes ) {
  58. attributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );
  59. }
  60. // morph targets
  61. var morphAttributes = geometry.morphAttributes;
  62. for ( var name in morphAttributes ) {
  63. var array = morphAttributes[ name ];
  64. for ( var i = 0, l = array.length; i < l; i ++ ) {
  65. attributes.update( array[ i ], gl.ARRAY_BUFFER );
  66. }
  67. }
  68. }
  69. function getWireframeAttribute( geometry ) {
  70. var attribute = wireframeAttributes[ geometry.id ];
  71. if ( attribute ) return attribute;
  72. var indices = [];
  73. var geometryIndex = geometry.index;
  74. var geometryAttributes = geometry.attributes;
  75. // console.time( 'wireframe' );
  76. if ( geometryIndex !== null ) {
  77. var array = geometryIndex.array;
  78. for ( var i = 0, l = array.length; i < l; i += 3 ) {
  79. var a = array[ i + 0 ];
  80. var b = array[ i + 1 ];
  81. var c = array[ i + 2 ];
  82. indices.push( a, b, b, c, c, a );
  83. }
  84. } else {
  85. var array = geometryAttributes.position.array;
  86. for ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
  87. var a = i + 0;
  88. var b = i + 1;
  89. var c = i + 2;
  90. indices.push( a, b, b, c, c, a );
  91. }
  92. }
  93. // console.timeEnd( 'wireframe' );
  94. attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
  95. attributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );
  96. wireframeAttributes[ geometry.id ] = attribute;
  97. return attribute;
  98. }
  99. return {
  100. get: get,
  101. update: update,
  102. getWireframeAttribute: getWireframeAttribute
  103. };
  104. }
  105. export { WebGLGeometries };
粤ICP备19079148号