mesh.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. THREE.WebGLRenderer2.Mesh = {
  2. createBuffers : function(renderer,geometryGroup,info){
  3. geometryGroup.__webglVertexBuffer = renderer.createBuffer();
  4. geometryGroup.__webglNormalBuffer = renderer.createBuffer();
  5. geometryGroup.__webglTangentBuffer = renderer.createBuffer();
  6. geometryGroup.__webglColorBuffer = renderer.createBuffer();
  7. geometryGroup.__webglUVBuffer = renderer.createBuffer();
  8. geometryGroup.__webglUV2Buffer = renderer.createBuffer();
  9. geometryGroup.__webglSkinIndicesBuffer = renderer.createBuffer();
  10. geometryGroup.__webglSkinWeightsBuffer = renderer.createBuffer();
  11. geometryGroup.__webglFaceBuffer = renderer.createBuffer();
  12. geometryGroup.__webglLineBuffer = renderer.createBuffer();
  13. var m, ml;
  14. if ( geometryGroup.numMorphTargets ) {
  15. geometryGroup.__webglMorphTargetsBuffers = [];
  16. for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
  17. geometryGroup.__webglMorphTargetsBuffers.push( renderer.createBuffer() );
  18. }
  19. }
  20. if ( geometryGroup.numMorphNormals ) {
  21. geometryGroup.__webglMorphNormalsBuffers = [];
  22. for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
  23. geometryGroup.__webglMorphNormalsBuffers.push( renderer.createBuffer() );
  24. }
  25. }
  26. info.memory.geometries ++;
  27. },
  28. initBuffers: function(renderer,geometryGroup, object){
  29. var geometry = object.geometry,
  30. faces3 = geometryGroup.faces3,
  31. faces4 = geometryGroup.faces4,
  32. nvertices = faces3.length * 3 + faces4.length * 4,
  33. ntris = faces3.length * 1 + faces4.length * 2,
  34. nlines = faces3.length * 3 + faces4.length * 4,
  35. material = getBufferMaterial( object, geometryGroup ),
  36. uvType = bufferGuessUVType( material ),
  37. normalType = bufferGuessNormalType( material ),
  38. vertexColorType = bufferGuessVertexColorType( material );
  39. //console.log( "uvType", uvType, "normalType", normalType, "vertexColorType", vertexColorType, object, geometryGroup, material );
  40. geometryGroup.__vertexArray = new Float32Array( nvertices * 3 );
  41. if ( normalType ) {
  42. geometryGroup.__normalArray = new Float32Array( nvertices * 3 );
  43. }
  44. if ( geometry.hasTangents ) {
  45. geometryGroup.__tangentArray = new Float32Array( nvertices * 4 );
  46. }
  47. if ( vertexColorType ) {
  48. geometryGroup.__colorArray = new Float32Array( nvertices * 3 );
  49. }
  50. if ( uvType ) {
  51. if ( geometry.faceUvs.length > 0 || geometry.faceVertexUvs.length > 0 ) {
  52. geometryGroup.__uvArray = new Float32Array( nvertices * 2 );
  53. }
  54. if ( geometry.faceUvs.length > 1 || geometry.faceVertexUvs.length > 1 ) {
  55. geometryGroup.__uv2Array = new Float32Array( nvertices * 2 );
  56. }
  57. }
  58. if ( object.geometry.skinWeights.length && object.geometry.skinIndices.length ) {
  59. geometryGroup.__skinIndexArray = new Float32Array( nvertices * 4 );
  60. geometryGroup.__skinWeightArray = new Float32Array( nvertices * 4 );
  61. }
  62. geometryGroup.__faceArray = new Uint16Array( ntris * 3 );
  63. geometryGroup.__lineArray = new Uint16Array( nlines * 2 );
  64. var m, ml;
  65. if ( geometryGroup.numMorphTargets ) {
  66. geometryGroup.__morphTargetsArrays = [];
  67. for ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {
  68. geometryGroup.__morphTargetsArrays.push( new Float32Array( nvertices * 3 ) );
  69. }
  70. }
  71. if ( geometryGroup.numMorphNormals ) {
  72. geometryGroup.__morphNormalsArrays = [];
  73. for ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {
  74. geometryGroup.__morphNormalsArrays.push( new Float32Array( nvertices * 3 ) );
  75. }
  76. }
  77. geometryGroup.__webglFaceCount = ntris * 3;
  78. geometryGroup.__webglLineCount = nlines * 2;
  79. // custom attributes
  80. if ( material.attributes ) {
  81. if ( geometryGroup.__webglCustomAttributesList === undefined ) {
  82. geometryGroup.__webglCustomAttributesList = [];
  83. }
  84. for ( var a in material.attributes ) {
  85. // Do a shallow copy of the attribute object so different geometryGroup chunks use different
  86. // attribute buffers which are correctly indexed in the setMeshBuffers function
  87. var originalAttribute = material.attributes[ a ];
  88. var attribute = {};
  89. for ( var property in originalAttribute ) {
  90. attribute[ property ] = originalAttribute[ property ];
  91. }
  92. if ( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {
  93. attribute.__webglInitialized = true;
  94. var size = 1; // "f" and "i"
  95. if( attribute.type === "v2" ) size = 2;
  96. else if( attribute.type === "v3" ) size = 3;
  97. else if( attribute.type === "v4" ) size = 4;
  98. else if( attribute.type === "c" ) size = 3;
  99. attribute.size = size;
  100. attribute.array = new Float32Array( nvertices * size );
  101. attribute.buffer = renderer.createBuffer();
  102. attribute.buffer.belongsToAttribute = a;
  103. originalAttribute.needsUpdate = true;
  104. attribute.__original = originalAttribute;
  105. }
  106. geometryGroup.__webglCustomAttributesList.push( attribute );
  107. }
  108. }
  109. geometryGroup.__inittedArrays = true;
  110. },
  111. bufferGuessUVType: function( material ) {
  112. // material must use some texture to require uvs
  113. if ( material.map || material.lightMap || material.bumpMap || material.normalMap || material.specularMap || material instanceof THREE.ShaderMaterial ) {
  114. return true;
  115. }
  116. return false;
  117. }
  118. };