WebGLBuffers.js 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.WebGLBuffers = function ( gl, info, extensions, getBufferMaterial ) {
  5. function initCustomAttributes( object ) {
  6. var geometry = object.geometry;
  7. var material = object.material;
  8. var nvertices = geometry.vertices.length;
  9. if ( material.attributes ) {
  10. if ( geometry.__webglCustomAttributesList === undefined ) {
  11. geometry.__webglCustomAttributesList = [];
  12. }
  13. for ( var name in material.attributes ) {
  14. var attribute = material.attributes[ name ];
  15. if ( ! attribute.__webglInitialized || attribute.createUniqueBuffers ) {
  16. attribute.__webglInitialized = true;
  17. var size = 1; // "f" and "i"
  18. if ( attribute.type === 'v2' ) size = 2;
  19. else if ( attribute.type === 'v3' ) size = 3;
  20. else if ( attribute.type === 'v4' ) size = 4;
  21. else if ( attribute.type === 'c' ) size = 3;
  22. attribute.size = size;
  23. attribute.array = new Float32Array( nvertices * size );
  24. attribute.buffer = gl.createBuffer();
  25. attribute.buffer.belongsToAttribute = name;
  26. attribute.needsUpdate = true;
  27. }
  28. geometry.__webglCustomAttributesList.push( attribute );
  29. }
  30. }
  31. }
  32. this.initPointCloudBuffers = function ( geometry, object ) {
  33. if ( geometry.__webglVertexBuffer !== undefined ) return;
  34. geometry.__webglVertexBuffer = gl.createBuffer();
  35. geometry.__webglColorBuffer = gl.createBuffer();
  36. info.memory.geometries ++;
  37. //
  38. var nvertices = geometry.vertices.length;
  39. geometry.__vertexArray = new Float32Array( nvertices * 3 );
  40. geometry.__colorArray = new Float32Array( nvertices * 3 );
  41. geometry.__webglParticleCount = nvertices;
  42. initCustomAttributes( object );
  43. geometry.verticesNeedUpdate = true;
  44. geometry.colorsNeedUpdate = true;
  45. };
  46. this.initLineBuffers = function ( geometry, object ) {
  47. if ( geometry.__webglVertexBuffer !== undefined ) return;
  48. geometry.__webglVertexBuffer = gl.createBuffer();
  49. geometry.__webglColorBuffer = gl.createBuffer();
  50. geometry.__webglLineDistanceBuffer = gl.createBuffer();
  51. info.memory.geometries ++;
  52. //
  53. var nvertices = geometry.vertices.length;
  54. geometry.__vertexArray = new Float32Array( nvertices * 3 );
  55. geometry.__colorArray = new Float32Array( nvertices * 3 );
  56. geometry.__lineDistanceArray = new Float32Array( nvertices * 1 );
  57. geometry.__webglLineCount = nvertices;
  58. initCustomAttributes( object );
  59. geometry.verticesNeedUpdate = true;
  60. geometry.colorsNeedUpdate = true;
  61. geometry.lineDistancesNeedUpdate = true;
  62. };
  63. this.initMeshBuffers = function ( geometryGroup, object ) {
  64. geometryGroup.__webglVertexBuffer = gl.createBuffer();
  65. geometryGroup.__webglNormalBuffer = gl.createBuffer();
  66. geometryGroup.__webglTangentBuffer = gl.createBuffer();
  67. geometryGroup.__webglColorBuffer = gl.createBuffer();
  68. geometryGroup.__webglUVBuffer = gl.createBuffer();
  69. geometryGroup.__webglUV2Buffer = gl.createBuffer();
  70. geometryGroup.__webglSkinIndicesBuffer = gl.createBuffer();
  71. geometryGroup.__webglSkinWeightsBuffer = gl.createBuffer();
  72. geometryGroup.__webglFaceBuffer = gl.createBuffer();
  73. geometryGroup.__webglLineBuffer = gl.createBuffer();
  74. var numMorphTargets = geometryGroup.numMorphTargets;
  75. if ( numMorphTargets ) {
  76. geometryGroup.__webglMorphTargetsBuffers = [];
  77. for ( var m = 0, ml = numMorphTargets; m < ml; m ++ ) {
  78. geometryGroup.__webglMorphTargetsBuffers.push( gl.createBuffer() );
  79. }
  80. }
  81. var numMorphNormals = geometryGroup.numMorphNormals;
  82. if ( numMorphNormals ) {
  83. geometryGroup.__webglMorphNormalsBuffers = [];
  84. for ( var m = 0, ml = numMorphNormals; m < ml; m ++ ) {
  85. geometryGroup.__webglMorphNormalsBuffers.push( gl.createBuffer() );
  86. }
  87. }
  88. info.memory.geometries ++;
  89. //
  90. var geometry = object.geometry,
  91. faces = geometryGroup.faces,
  92. nvertices = faces.length * 3,
  93. ntris = faces.length * 1,
  94. nlines = faces.length * 3,
  95. material = getBufferMaterial( object, geometryGroup );
  96. geometryGroup.__vertexArray = new Float32Array( nvertices * 3 );
  97. geometryGroup.__normalArray = new Float32Array( nvertices * 3 );
  98. geometryGroup.__colorArray = new Float32Array( nvertices * 3 );
  99. geometryGroup.__uvArray = new Float32Array( nvertices * 2 );
  100. if ( geometry.faceVertexUvs.length > 1 ) {
  101. geometryGroup.__uv2Array = new Float32Array( nvertices * 2 );
  102. }
  103. if ( geometry.hasTangents ) {
  104. geometryGroup.__tangentArray = new Float32Array( nvertices * 4 );
  105. }
  106. if ( object.geometry.skinWeights.length && object.geometry.skinIndices.length ) {
  107. geometryGroup.__skinIndexArray = new Float32Array( nvertices * 4 );
  108. geometryGroup.__skinWeightArray = new Float32Array( nvertices * 4 );
  109. }
  110. var UintArray = extensions.get( 'OES_element_index_uint' ) !== null && ntris > 21845 ? Uint32Array : Uint16Array; // 65535 / 3
  111. geometryGroup.__typeArray = UintArray;
  112. geometryGroup.__faceArray = new UintArray( ntris * 3 );
  113. geometryGroup.__lineArray = new UintArray( nlines * 2 );
  114. if ( numMorphTargets ) {
  115. geometryGroup.__morphTargetsArrays = [];
  116. for ( var m = 0, ml = numMorphTargets; m < ml; m ++ ) {
  117. geometryGroup.__morphTargetsArrays.push( new Float32Array( nvertices * 3 ) );
  118. }
  119. }
  120. if ( numMorphNormals ) {
  121. geometryGroup.__morphNormalsArrays = [];
  122. for ( var m = 0, ml = numMorphNormals; m < ml; m ++ ) {
  123. geometryGroup.__morphNormalsArrays.push( new Float32Array( nvertices * 3 ) );
  124. }
  125. }
  126. geometryGroup.__webglFaceCount = ntris * 3;
  127. geometryGroup.__webglLineCount = nlines * 2;
  128. // custom attributes
  129. if ( material.attributes ) {
  130. if ( geometryGroup.__webglCustomAttributesList === undefined ) {
  131. geometryGroup.__webglCustomAttributesList = [];
  132. }
  133. for ( var name in material.attributes ) {
  134. // Do a shallow copy of the attribute object so different geometryGroup chunks use different
  135. // attribute buffers which are correctly indexed in the setMeshBuffers function
  136. var originalAttribute = material.attributes[ name ];
  137. var attribute = {};
  138. for ( var property in originalAttribute ) {
  139. attribute[ property ] = originalAttribute[ property ];
  140. }
  141. if ( ! attribute.__webglInitialized || attribute.createUniqueBuffers ) {
  142. attribute.__webglInitialized = true;
  143. var size = 1; // "f" and "i"
  144. if ( attribute.type === 'v2' ) size = 2;
  145. else if ( attribute.type === 'v3' ) size = 3;
  146. else if ( attribute.type === 'v4' ) size = 4;
  147. else if ( attribute.type === 'c' ) size = 3;
  148. attribute.size = size;
  149. attribute.array = new Float32Array( nvertices * size );
  150. attribute.buffer = gl.createBuffer();
  151. attribute.buffer.belongsToAttribute = name;
  152. originalAttribute.needsUpdate = true;
  153. attribute.__original = originalAttribute;
  154. }
  155. geometryGroup.__webglCustomAttributesList.push( attribute );
  156. }
  157. }
  158. geometryGroup.__inittedArrays = true;
  159. };
  160. // Buffer setting
  161. this.setPointCloudBuffers = function ( geometry, hint, object ) {
  162. var v, c, vertex, offset, color,
  163. vertices = geometry.vertices,
  164. vl = vertices.length,
  165. colors = geometry.colors,
  166. cl = colors.length,
  167. vertexArray = geometry.__vertexArray,
  168. colorArray = geometry.__colorArray,
  169. dirtyVertices = geometry.verticesNeedUpdate,
  170. dirtyColors = geometry.colorsNeedUpdate,
  171. customAttributes = geometry.__webglCustomAttributesList,
  172. i, il,
  173. ca, cal, value,
  174. customAttribute;
  175. if ( dirtyVertices ) {
  176. for ( v = 0; v < vl; v ++ ) {
  177. vertex = vertices[ v ];
  178. offset = v * 3;
  179. vertexArray[ offset ] = vertex.x;
  180. vertexArray[ offset + 1 ] = vertex.y;
  181. vertexArray[ offset + 2 ] = vertex.z;
  182. }
  183. gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );
  184. gl.bufferData( gl.ARRAY_BUFFER, vertexArray, hint );
  185. }
  186. if ( dirtyColors ) {
  187. for ( c = 0; c < cl; c ++ ) {
  188. color = colors[ c ];
  189. offset = c * 3;
  190. colorArray[ offset ] = color.r;
  191. colorArray[ offset + 1 ] = color.g;
  192. colorArray[ offset + 2 ] = color.b;
  193. }
  194. gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglColorBuffer );
  195. gl.bufferData( gl.ARRAY_BUFFER, colorArray, hint );
  196. }
  197. if ( customAttributes ) {
  198. for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
  199. customAttribute = customAttributes[ i ];
  200. if ( customAttribute.needsUpdate && ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) ) {
  201. cal = customAttribute.value.length;
  202. offset = 0;
  203. if ( customAttribute.size === 1 ) {
  204. for ( ca = 0; ca < cal; ca ++ ) {
  205. customAttribute.array[ ca ] = customAttribute.value[ ca ];
  206. }
  207. } else if ( customAttribute.size === 2 ) {
  208. for ( ca = 0; ca < cal; ca ++ ) {
  209. value = customAttribute.value[ ca ];
  210. customAttribute.array[ offset ] = value.x;
  211. customAttribute.array[ offset + 1 ] = value.y;
  212. offset += 2;
  213. }
  214. } else if ( customAttribute.size === 3 ) {
  215. if ( customAttribute.type === 'c' ) {
  216. for ( ca = 0; ca < cal; ca ++ ) {
  217. value = customAttribute.value[ ca ];
  218. customAttribute.array[ offset ] = value.r;
  219. customAttribute.array[ offset + 1 ] = value.g;
  220. customAttribute.array[ offset + 2 ] = value.b;
  221. offset += 3;
  222. }
  223. } else {
  224. for ( ca = 0; ca < cal; ca ++ ) {
  225. value = customAttribute.value[ ca ];
  226. customAttribute.array[ offset ] = value.x;
  227. customAttribute.array[ offset + 1 ] = value.y;
  228. customAttribute.array[ offset + 2 ] = value.z;
  229. offset += 3;
  230. }
  231. }
  232. } else if ( customAttribute.size === 4 ) {
  233. for ( ca = 0; ca < cal; ca ++ ) {
  234. value = customAttribute.value[ ca ];
  235. customAttribute.array[ offset ] = value.x;
  236. customAttribute.array[ offset + 1 ] = value.y;
  237. customAttribute.array[ offset + 2 ] = value.z;
  238. customAttribute.array[ offset + 3 ] = value.w;
  239. offset += 4;
  240. }
  241. }
  242. }
  243. gl.bindBuffer( gl.ARRAY_BUFFER, customAttribute.buffer );
  244. gl.bufferData( gl.ARRAY_BUFFER, customAttribute.array, hint );
  245. customAttribute.needsUpdate = false;
  246. }
  247. }
  248. };
  249. this.setLineBuffers = function ( geometry, hint ) {
  250. var v, c, d, vertex, offset, color,
  251. vertices = geometry.vertices,
  252. colors = geometry.colors,
  253. lineDistances = geometry.lineDistances,
  254. vl = vertices.length,
  255. cl = colors.length,
  256. dl = lineDistances.length,
  257. vertexArray = geometry.__vertexArray,
  258. colorArray = geometry.__colorArray,
  259. lineDistanceArray = geometry.__lineDistanceArray,
  260. dirtyVertices = geometry.verticesNeedUpdate,
  261. dirtyColors = geometry.colorsNeedUpdate,
  262. dirtyLineDistances = geometry.lineDistancesNeedUpdate,
  263. customAttributes = geometry.__webglCustomAttributesList,
  264. i, il,
  265. ca, cal, value,
  266. customAttribute;
  267. if ( dirtyVertices ) {
  268. for ( v = 0; v < vl; v ++ ) {
  269. vertex = vertices[ v ];
  270. offset = v * 3;
  271. vertexArray[ offset ] = vertex.x;
  272. vertexArray[ offset + 1 ] = vertex.y;
  273. vertexArray[ offset + 2 ] = vertex.z;
  274. }
  275. gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );
  276. gl.bufferData( gl.ARRAY_BUFFER, vertexArray, hint );
  277. }
  278. if ( dirtyColors ) {
  279. for ( c = 0; c < cl; c ++ ) {
  280. color = colors[ c ];
  281. offset = c * 3;
  282. colorArray[ offset ] = color.r;
  283. colorArray[ offset + 1 ] = color.g;
  284. colorArray[ offset + 2 ] = color.b;
  285. }
  286. gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglColorBuffer );
  287. gl.bufferData( gl.ARRAY_BUFFER, colorArray, hint );
  288. }
  289. if ( dirtyLineDistances ) {
  290. for ( d = 0; d < dl; d ++ ) {
  291. lineDistanceArray[ d ] = lineDistances[ d ];
  292. }
  293. gl.bindBuffer( gl.ARRAY_BUFFER, geometry.__webglLineDistanceBuffer );
  294. gl.bufferData( gl.ARRAY_BUFFER, lineDistanceArray, hint );
  295. }
  296. if ( customAttributes ) {
  297. for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
  298. customAttribute = customAttributes[ i ];
  299. if ( customAttribute.needsUpdate && ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) ) {
  300. offset = 0;
  301. cal = customAttribute.value.length;
  302. if ( customAttribute.size === 1 ) {
  303. for ( ca = 0; ca < cal; ca ++ ) {
  304. customAttribute.array[ ca ] = customAttribute.value[ ca ];
  305. }
  306. } else if ( customAttribute.size === 2 ) {
  307. for ( ca = 0; ca < cal; ca ++ ) {
  308. value = customAttribute.value[ ca ];
  309. customAttribute.array[ offset ] = value.x;
  310. customAttribute.array[ offset + 1 ] = value.y;
  311. offset += 2;
  312. }
  313. } else if ( customAttribute.size === 3 ) {
  314. if ( customAttribute.type === 'c' ) {
  315. for ( ca = 0; ca < cal; ca ++ ) {
  316. value = customAttribute.value[ ca ];
  317. customAttribute.array[ offset ] = value.r;
  318. customAttribute.array[ offset + 1 ] = value.g;
  319. customAttribute.array[ offset + 2 ] = value.b;
  320. offset += 3;
  321. }
  322. } else {
  323. for ( ca = 0; ca < cal; ca ++ ) {
  324. value = customAttribute.value[ ca ];
  325. customAttribute.array[ offset ] = value.x;
  326. customAttribute.array[ offset + 1 ] = value.y;
  327. customAttribute.array[ offset + 2 ] = value.z;
  328. offset += 3;
  329. }
  330. }
  331. } else if ( customAttribute.size === 4 ) {
  332. for ( ca = 0; ca < cal; ca ++ ) {
  333. value = customAttribute.value[ ca ];
  334. customAttribute.array[ offset ] = value.x;
  335. customAttribute.array[ offset + 1 ] = value.y;
  336. customAttribute.array[ offset + 2 ] = value.z;
  337. customAttribute.array[ offset + 3 ] = value.w;
  338. offset += 4;
  339. }
  340. }
  341. gl.bindBuffer( gl.ARRAY_BUFFER, customAttribute.buffer );
  342. gl.bufferData( gl.ARRAY_BUFFER, customAttribute.array, hint );
  343. customAttribute.needsUpdate = false;
  344. }
  345. }
  346. }
  347. };
  348. function materialNeedsFaceNormals ( material ) {
  349. return material instanceof THREE.MeshPhongMaterial === false && material.shading === THREE.FlatShading;
  350. }
  351. this.setMeshBuffers = function ( geometryGroup, object, hint, dispose, material ) {
  352. if ( ! geometryGroup.__inittedArrays ) {
  353. return;
  354. }
  355. var needsFaceNormals = materialNeedsFaceNormals( material );
  356. var f, fl, fi, face,
  357. vertexNormals, faceNormal,
  358. vertexColors, faceColor,
  359. vertexTangents,
  360. uv, uv2, v1, v2, v3, t1, t2, t3, n1, n2, n3,
  361. c1, c2, c3,
  362. sw1, sw2, sw3,
  363. si1, si2, si3,
  364. i, il,
  365. vn, uvi, uv2i,
  366. vk, vkl, vka,
  367. nka, chf, faceVertexNormals,
  368. vertexIndex = 0,
  369. offset = 0,
  370. offset_uv = 0,
  371. offset_uv2 = 0,
  372. offset_face = 0,
  373. offset_normal = 0,
  374. offset_tangent = 0,
  375. offset_line = 0,
  376. offset_color = 0,
  377. offset_skin = 0,
  378. offset_morphTarget = 0,
  379. offset_custom = 0,
  380. value,
  381. vertexArray = geometryGroup.__vertexArray,
  382. uvArray = geometryGroup.__uvArray,
  383. uv2Array = geometryGroup.__uv2Array,
  384. normalArray = geometryGroup.__normalArray,
  385. tangentArray = geometryGroup.__tangentArray,
  386. colorArray = geometryGroup.__colorArray,
  387. skinIndexArray = geometryGroup.__skinIndexArray,
  388. skinWeightArray = geometryGroup.__skinWeightArray,
  389. morphTargetsArrays = geometryGroup.__morphTargetsArrays,
  390. morphNormalsArrays = geometryGroup.__morphNormalsArrays,
  391. customAttributes = geometryGroup.__webglCustomAttributesList,
  392. customAttribute,
  393. faceArray = geometryGroup.__faceArray,
  394. lineArray = geometryGroup.__lineArray,
  395. geometry = object.geometry, // this is shared for all chunks
  396. dirtyVertices = geometry.verticesNeedUpdate,
  397. dirtyElements = geometry.elementsNeedUpdate,
  398. dirtyUvs = geometry.uvsNeedUpdate,
  399. dirtyNormals = geometry.normalsNeedUpdate,
  400. dirtyTangents = geometry.tangentsNeedUpdate,
  401. dirtyColors = geometry.colorsNeedUpdate,
  402. dirtyMorphTargets = geometry.morphTargetsNeedUpdate,
  403. vertices = geometry.vertices,
  404. chunk_faces = geometryGroup.faces,
  405. obj_faces = geometry.faces,
  406. obj_uvs = geometry.faceVertexUvs[ 0 ],
  407. obj_uvs2 = geometry.faceVertexUvs[ 1 ],
  408. obj_skinIndices = geometry.skinIndices,
  409. obj_skinWeights = geometry.skinWeights,
  410. morphTargets = geometry.morphTargets,
  411. morphNormals = geometry.morphNormals;
  412. if ( dirtyVertices ) {
  413. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  414. face = obj_faces[ chunk_faces[ f ] ];
  415. v1 = vertices[ face.a ];
  416. v2 = vertices[ face.b ];
  417. v3 = vertices[ face.c ];
  418. vertexArray[ offset ] = v1.x;
  419. vertexArray[ offset + 1 ] = v1.y;
  420. vertexArray[ offset + 2 ] = v1.z;
  421. vertexArray[ offset + 3 ] = v2.x;
  422. vertexArray[ offset + 4 ] = v2.y;
  423. vertexArray[ offset + 5 ] = v2.z;
  424. vertexArray[ offset + 6 ] = v3.x;
  425. vertexArray[ offset + 7 ] = v3.y;
  426. vertexArray[ offset + 8 ] = v3.z;
  427. offset += 9;
  428. }
  429. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );
  430. gl.bufferData( gl.ARRAY_BUFFER, vertexArray, hint );
  431. }
  432. if ( dirtyMorphTargets ) {
  433. for ( vk = 0, vkl = morphTargets.length; vk < vkl; vk ++ ) {
  434. offset_morphTarget = 0;
  435. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  436. chf = chunk_faces[ f ];
  437. face = obj_faces[ chf ];
  438. // morph positions
  439. v1 = morphTargets[ vk ].vertices[ face.a ];
  440. v2 = morphTargets[ vk ].vertices[ face.b ];
  441. v3 = morphTargets[ vk ].vertices[ face.c ];
  442. vka = morphTargetsArrays[ vk ];
  443. vka[ offset_morphTarget ] = v1.x;
  444. vka[ offset_morphTarget + 1 ] = v1.y;
  445. vka[ offset_morphTarget + 2 ] = v1.z;
  446. vka[ offset_morphTarget + 3 ] = v2.x;
  447. vka[ offset_morphTarget + 4 ] = v2.y;
  448. vka[ offset_morphTarget + 5 ] = v2.z;
  449. vka[ offset_morphTarget + 6 ] = v3.x;
  450. vka[ offset_morphTarget + 7 ] = v3.y;
  451. vka[ offset_morphTarget + 8 ] = v3.z;
  452. // morph normals
  453. if ( material.morphNormals ) {
  454. if ( needsFaceNormals ) {
  455. n1 = morphNormals[ vk ].faceNormals[ chf ];
  456. n2 = n1;
  457. n3 = n1;
  458. } else {
  459. faceVertexNormals = morphNormals[ vk ].vertexNormals[ chf ];
  460. n1 = faceVertexNormals.a;
  461. n2 = faceVertexNormals.b;
  462. n3 = faceVertexNormals.c;
  463. }
  464. nka = morphNormalsArrays[ vk ];
  465. nka[ offset_morphTarget ] = n1.x;
  466. nka[ offset_morphTarget + 1 ] = n1.y;
  467. nka[ offset_morphTarget + 2 ] = n1.z;
  468. nka[ offset_morphTarget + 3 ] = n2.x;
  469. nka[ offset_morphTarget + 4 ] = n2.y;
  470. nka[ offset_morphTarget + 5 ] = n2.z;
  471. nka[ offset_morphTarget + 6 ] = n3.x;
  472. nka[ offset_morphTarget + 7 ] = n3.y;
  473. nka[ offset_morphTarget + 8 ] = n3.z;
  474. }
  475. //
  476. offset_morphTarget += 9;
  477. }
  478. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ vk ] );
  479. gl.bufferData( gl.ARRAY_BUFFER, morphTargetsArrays[ vk ], hint );
  480. if ( material.morphNormals ) {
  481. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ vk ] );
  482. gl.bufferData( gl.ARRAY_BUFFER, morphNormalsArrays[ vk ], hint );
  483. }
  484. }
  485. }
  486. if ( obj_skinWeights.length ) {
  487. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  488. face = obj_faces[ chunk_faces[ f ] ];
  489. // weights
  490. sw1 = obj_skinWeights[ face.a ];
  491. sw2 = obj_skinWeights[ face.b ];
  492. sw3 = obj_skinWeights[ face.c ];
  493. skinWeightArray[ offset_skin ] = sw1.x;
  494. skinWeightArray[ offset_skin + 1 ] = sw1.y;
  495. skinWeightArray[ offset_skin + 2 ] = sw1.z;
  496. skinWeightArray[ offset_skin + 3 ] = sw1.w;
  497. skinWeightArray[ offset_skin + 4 ] = sw2.x;
  498. skinWeightArray[ offset_skin + 5 ] = sw2.y;
  499. skinWeightArray[ offset_skin + 6 ] = sw2.z;
  500. skinWeightArray[ offset_skin + 7 ] = sw2.w;
  501. skinWeightArray[ offset_skin + 8 ] = sw3.x;
  502. skinWeightArray[ offset_skin + 9 ] = sw3.y;
  503. skinWeightArray[ offset_skin + 10 ] = sw3.z;
  504. skinWeightArray[ offset_skin + 11 ] = sw3.w;
  505. // indices
  506. si1 = obj_skinIndices[ face.a ];
  507. si2 = obj_skinIndices[ face.b ];
  508. si3 = obj_skinIndices[ face.c ];
  509. skinIndexArray[ offset_skin ] = si1.x;
  510. skinIndexArray[ offset_skin + 1 ] = si1.y;
  511. skinIndexArray[ offset_skin + 2 ] = si1.z;
  512. skinIndexArray[ offset_skin + 3 ] = si1.w;
  513. skinIndexArray[ offset_skin + 4 ] = si2.x;
  514. skinIndexArray[ offset_skin + 5 ] = si2.y;
  515. skinIndexArray[ offset_skin + 6 ] = si2.z;
  516. skinIndexArray[ offset_skin + 7 ] = si2.w;
  517. skinIndexArray[ offset_skin + 8 ] = si3.x;
  518. skinIndexArray[ offset_skin + 9 ] = si3.y;
  519. skinIndexArray[ offset_skin + 10 ] = si3.z;
  520. skinIndexArray[ offset_skin + 11 ] = si3.w;
  521. offset_skin += 12;
  522. }
  523. if ( offset_skin > 0 ) {
  524. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer );
  525. gl.bufferData( gl.ARRAY_BUFFER, skinIndexArray, hint );
  526. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer );
  527. gl.bufferData( gl.ARRAY_BUFFER, skinWeightArray, hint );
  528. }
  529. }
  530. if ( dirtyColors ) {
  531. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  532. face = obj_faces[ chunk_faces[ f ] ];
  533. vertexColors = face.vertexColors;
  534. faceColor = face.color;
  535. if ( vertexColors.length === 3 && material.vertexColors === THREE.VertexColors ) {
  536. c1 = vertexColors[ 0 ];
  537. c2 = vertexColors[ 1 ];
  538. c3 = vertexColors[ 2 ];
  539. } else {
  540. c1 = faceColor;
  541. c2 = faceColor;
  542. c3 = faceColor;
  543. }
  544. colorArray[ offset_color ] = c1.r;
  545. colorArray[ offset_color + 1 ] = c1.g;
  546. colorArray[ offset_color + 2 ] = c1.b;
  547. colorArray[ offset_color + 3 ] = c2.r;
  548. colorArray[ offset_color + 4 ] = c2.g;
  549. colorArray[ offset_color + 5 ] = c2.b;
  550. colorArray[ offset_color + 6 ] = c3.r;
  551. colorArray[ offset_color + 7 ] = c3.g;
  552. colorArray[ offset_color + 8 ] = c3.b;
  553. offset_color += 9;
  554. }
  555. if ( offset_color > 0 ) {
  556. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer );
  557. gl.bufferData( gl.ARRAY_BUFFER, colorArray, hint );
  558. }
  559. }
  560. if ( dirtyTangents && geometry.hasTangents ) {
  561. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  562. face = obj_faces[ chunk_faces[ f ] ];
  563. vertexTangents = face.vertexTangents;
  564. t1 = vertexTangents[ 0 ];
  565. t2 = vertexTangents[ 1 ];
  566. t3 = vertexTangents[ 2 ];
  567. tangentArray[ offset_tangent ] = t1.x;
  568. tangentArray[ offset_tangent + 1 ] = t1.y;
  569. tangentArray[ offset_tangent + 2 ] = t1.z;
  570. tangentArray[ offset_tangent + 3 ] = t1.w;
  571. tangentArray[ offset_tangent + 4 ] = t2.x;
  572. tangentArray[ offset_tangent + 5 ] = t2.y;
  573. tangentArray[ offset_tangent + 6 ] = t2.z;
  574. tangentArray[ offset_tangent + 7 ] = t2.w;
  575. tangentArray[ offset_tangent + 8 ] = t3.x;
  576. tangentArray[ offset_tangent + 9 ] = t3.y;
  577. tangentArray[ offset_tangent + 10 ] = t3.z;
  578. tangentArray[ offset_tangent + 11 ] = t3.w;
  579. offset_tangent += 12;
  580. }
  581. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer );
  582. gl.bufferData( gl.ARRAY_BUFFER, tangentArray, hint );
  583. }
  584. if ( dirtyNormals ) {
  585. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  586. face = obj_faces[ chunk_faces[ f ] ];
  587. vertexNormals = face.vertexNormals;
  588. faceNormal = face.normal;
  589. if ( vertexNormals.length === 3 && needsFaceNormals === false ) {
  590. for ( i = 0; i < 3; i ++ ) {
  591. vn = vertexNormals[ i ];
  592. normalArray[ offset_normal ] = vn.x;
  593. normalArray[ offset_normal + 1 ] = vn.y;
  594. normalArray[ offset_normal + 2 ] = vn.z;
  595. offset_normal += 3;
  596. }
  597. } else {
  598. for ( i = 0; i < 3; i ++ ) {
  599. normalArray[ offset_normal ] = faceNormal.x;
  600. normalArray[ offset_normal + 1 ] = faceNormal.y;
  601. normalArray[ offset_normal + 2 ] = faceNormal.z;
  602. offset_normal += 3;
  603. }
  604. }
  605. }
  606. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer );
  607. gl.bufferData( gl.ARRAY_BUFFER, normalArray, hint );
  608. }
  609. if ( dirtyUvs && obj_uvs ) {
  610. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  611. fi = chunk_faces[ f ];
  612. uv = obj_uvs[ fi ];
  613. if ( uv === undefined ) continue;
  614. for ( i = 0; i < 3; i ++ ) {
  615. uvi = uv[ i ];
  616. uvArray[ offset_uv ] = uvi.x;
  617. uvArray[ offset_uv + 1 ] = uvi.y;
  618. offset_uv += 2;
  619. }
  620. }
  621. if ( offset_uv > 0 ) {
  622. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer );
  623. gl.bufferData( gl.ARRAY_BUFFER, uvArray, hint );
  624. }
  625. }
  626. if ( dirtyUvs && obj_uvs2 ) {
  627. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  628. fi = chunk_faces[ f ];
  629. uv2 = obj_uvs2[ fi ];
  630. if ( uv2 === undefined ) continue;
  631. for ( i = 0; i < 3; i ++ ) {
  632. uv2i = uv2[ i ];
  633. uv2Array[ offset_uv2 ] = uv2i.x;
  634. uv2Array[ offset_uv2 + 1 ] = uv2i.y;
  635. offset_uv2 += 2;
  636. }
  637. }
  638. if ( offset_uv2 > 0 ) {
  639. gl.bindBuffer( gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer );
  640. gl.bufferData( gl.ARRAY_BUFFER, uv2Array, hint );
  641. }
  642. }
  643. if ( dirtyElements ) {
  644. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  645. faceArray[ offset_face ] = vertexIndex;
  646. faceArray[ offset_face + 1 ] = vertexIndex + 1;
  647. faceArray[ offset_face + 2 ] = vertexIndex + 2;
  648. offset_face += 3;
  649. lineArray[ offset_line ] = vertexIndex;
  650. lineArray[ offset_line + 1 ] = vertexIndex + 1;
  651. lineArray[ offset_line + 2 ] = vertexIndex;
  652. lineArray[ offset_line + 3 ] = vertexIndex + 2;
  653. lineArray[ offset_line + 4 ] = vertexIndex + 1;
  654. lineArray[ offset_line + 5 ] = vertexIndex + 2;
  655. offset_line += 6;
  656. vertexIndex += 3;
  657. }
  658. gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer );
  659. gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
  660. gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer );
  661. gl.bufferData( gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
  662. }
  663. if ( customAttributes ) {
  664. for ( i = 0, il = customAttributes.length; i < il; i ++ ) {
  665. customAttribute = customAttributes[ i ];
  666. if ( ! customAttribute.__original.needsUpdate ) continue;
  667. offset_custom = 0;
  668. if ( customAttribute.size === 1 ) {
  669. if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
  670. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  671. face = obj_faces[ chunk_faces[ f ] ];
  672. customAttribute.array[ offset_custom ] = customAttribute.value[ face.a ];
  673. customAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ];
  674. customAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ];
  675. offset_custom += 3;
  676. }
  677. } else if ( customAttribute.boundTo === 'faces' ) {
  678. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  679. value = customAttribute.value[ chunk_faces[ f ] ];
  680. customAttribute.array[ offset_custom ] = value;
  681. customAttribute.array[ offset_custom + 1 ] = value;
  682. customAttribute.array[ offset_custom + 2 ] = value;
  683. offset_custom += 3;
  684. }
  685. }
  686. } else if ( customAttribute.size === 2 ) {
  687. if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
  688. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  689. face = obj_faces[ chunk_faces[ f ] ];
  690. v1 = customAttribute.value[ face.a ];
  691. v2 = customAttribute.value[ face.b ];
  692. v3 = customAttribute.value[ face.c ];
  693. customAttribute.array[ offset_custom ] = v1.x;
  694. customAttribute.array[ offset_custom + 1 ] = v1.y;
  695. customAttribute.array[ offset_custom + 2 ] = v2.x;
  696. customAttribute.array[ offset_custom + 3 ] = v2.y;
  697. customAttribute.array[ offset_custom + 4 ] = v3.x;
  698. customAttribute.array[ offset_custom + 5 ] = v3.y;
  699. offset_custom += 6;
  700. }
  701. } else if ( customAttribute.boundTo === 'faces' ) {
  702. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  703. value = customAttribute.value[ chunk_faces[ f ] ];
  704. v1 = value;
  705. v2 = value;
  706. v3 = value;
  707. customAttribute.array[ offset_custom ] = v1.x;
  708. customAttribute.array[ offset_custom + 1 ] = v1.y;
  709. customAttribute.array[ offset_custom + 2 ] = v2.x;
  710. customAttribute.array[ offset_custom + 3 ] = v2.y;
  711. customAttribute.array[ offset_custom + 4 ] = v3.x;
  712. customAttribute.array[ offset_custom + 5 ] = v3.y;
  713. offset_custom += 6;
  714. }
  715. }
  716. } else if ( customAttribute.size === 3 ) {
  717. var pp;
  718. if ( customAttribute.type === 'c' ) {
  719. pp = [ 'r', 'g', 'b' ];
  720. } else {
  721. pp = [ 'x', 'y', 'z' ];
  722. }
  723. if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
  724. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  725. face = obj_faces[ chunk_faces[ f ] ];
  726. v1 = customAttribute.value[ face.a ];
  727. v2 = customAttribute.value[ face.b ];
  728. v3 = customAttribute.value[ face.c ];
  729. customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ];
  730. customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
  731. customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
  732. customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
  733. customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
  734. customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
  735. customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
  736. customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
  737. customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
  738. offset_custom += 9;
  739. }
  740. } else if ( customAttribute.boundTo === 'faces' ) {
  741. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  742. value = customAttribute.value[ chunk_faces[ f ] ];
  743. v1 = value;
  744. v2 = value;
  745. v3 = value;
  746. customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ];
  747. customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
  748. customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
  749. customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
  750. customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
  751. customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
  752. customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
  753. customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
  754. customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
  755. offset_custom += 9;
  756. }
  757. } else if ( customAttribute.boundTo === 'faceVertices' ) {
  758. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  759. value = customAttribute.value[ chunk_faces[ f ] ];
  760. v1 = value[ 0 ];
  761. v2 = value[ 1 ];
  762. v3 = value[ 2 ];
  763. customAttribute.array[ offset_custom ] = v1[ pp[ 0 ] ];
  764. customAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];
  765. customAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];
  766. customAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];
  767. customAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];
  768. customAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];
  769. customAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];
  770. customAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];
  771. customAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];
  772. offset_custom += 9;
  773. }
  774. }
  775. } else if ( customAttribute.size === 4 ) {
  776. if ( customAttribute.boundTo === undefined || customAttribute.boundTo === 'vertices' ) {
  777. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  778. face = obj_faces[ chunk_faces[ f ] ];
  779. v1 = customAttribute.value[ face.a ];
  780. v2 = customAttribute.value[ face.b ];
  781. v3 = customAttribute.value[ face.c ];
  782. customAttribute.array[ offset_custom ] = v1.x;
  783. customAttribute.array[ offset_custom + 1 ] = v1.y;
  784. customAttribute.array[ offset_custom + 2 ] = v1.z;
  785. customAttribute.array[ offset_custom + 3 ] = v1.w;
  786. customAttribute.array[ offset_custom + 4 ] = v2.x;
  787. customAttribute.array[ offset_custom + 5 ] = v2.y;
  788. customAttribute.array[ offset_custom + 6 ] = v2.z;
  789. customAttribute.array[ offset_custom + 7 ] = v2.w;
  790. customAttribute.array[ offset_custom + 8 ] = v3.x;
  791. customAttribute.array[ offset_custom + 9 ] = v3.y;
  792. customAttribute.array[ offset_custom + 10 ] = v3.z;
  793. customAttribute.array[ offset_custom + 11 ] = v3.w;
  794. offset_custom += 12;
  795. }
  796. } else if ( customAttribute.boundTo === 'faces' ) {
  797. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  798. value = customAttribute.value[ chunk_faces[ f ] ];
  799. v1 = value;
  800. v2 = value;
  801. v3 = value;
  802. customAttribute.array[ offset_custom ] = v1.x;
  803. customAttribute.array[ offset_custom + 1 ] = v1.y;
  804. customAttribute.array[ offset_custom + 2 ] = v1.z;
  805. customAttribute.array[ offset_custom + 3 ] = v1.w;
  806. customAttribute.array[ offset_custom + 4 ] = v2.x;
  807. customAttribute.array[ offset_custom + 5 ] = v2.y;
  808. customAttribute.array[ offset_custom + 6 ] = v2.z;
  809. customAttribute.array[ offset_custom + 7 ] = v2.w;
  810. customAttribute.array[ offset_custom + 8 ] = v3.x;
  811. customAttribute.array[ offset_custom + 9 ] = v3.y;
  812. customAttribute.array[ offset_custom + 10 ] = v3.z;
  813. customAttribute.array[ offset_custom + 11 ] = v3.w;
  814. offset_custom += 12;
  815. }
  816. } else if ( customAttribute.boundTo === 'faceVertices' ) {
  817. for ( f = 0, fl = chunk_faces.length; f < fl; f ++ ) {
  818. value = customAttribute.value[ chunk_faces[ f ] ];
  819. v1 = value[ 0 ];
  820. v2 = value[ 1 ];
  821. v3 = value[ 2 ];
  822. customAttribute.array[ offset_custom ] = v1.x;
  823. customAttribute.array[ offset_custom + 1 ] = v1.y;
  824. customAttribute.array[ offset_custom + 2 ] = v1.z;
  825. customAttribute.array[ offset_custom + 3 ] = v1.w;
  826. customAttribute.array[ offset_custom + 4 ] = v2.x;
  827. customAttribute.array[ offset_custom + 5 ] = v2.y;
  828. customAttribute.array[ offset_custom + 6 ] = v2.z;
  829. customAttribute.array[ offset_custom + 7 ] = v2.w;
  830. customAttribute.array[ offset_custom + 8 ] = v3.x;
  831. customAttribute.array[ offset_custom + 9 ] = v3.y;
  832. customAttribute.array[ offset_custom + 10 ] = v3.z;
  833. customAttribute.array[ offset_custom + 11 ] = v3.w;
  834. offset_custom += 12;
  835. }
  836. }
  837. }
  838. gl.bindBuffer( gl.ARRAY_BUFFER, customAttribute.buffer );
  839. gl.bufferData( gl.ARRAY_BUFFER, customAttribute.array, hint );
  840. }
  841. }
  842. if ( dispose ) {
  843. delete geometryGroup.__inittedArrays;
  844. delete geometryGroup.__colorArray;
  845. delete geometryGroup.__normalArray;
  846. delete geometryGroup.__tangentArray;
  847. delete geometryGroup.__uvArray;
  848. delete geometryGroup.__uv2Array;
  849. delete geometryGroup.__faceArray;
  850. delete geometryGroup.__vertexArray;
  851. delete geometryGroup.__lineArray;
  852. delete geometryGroup.__skinIndexArray;
  853. delete geometryGroup.__skinWeightArray;
  854. }
  855. };
  856. this.delete = function ( geometry ) {
  857. var buffers = [
  858. '__webglVertexBuffer',
  859. '__webglNormalBuffer',
  860. '__webglTangentBuffer',
  861. '__webglColorBuffer',
  862. '__webglUVBuffer',
  863. '__webglUV2Buffer',
  864. '__webglSkinIndicesBuffer',
  865. '__webglSkinWeightsBuffer',
  866. '__webglFaceBuffer',
  867. '__webglLineBuffer',
  868. '__webglLineDistanceBuffer'
  869. ];
  870. for ( var i = 0, l = buffers.length; i < l; i ++ ) {
  871. var name = buffers[ i ];
  872. if ( geometry[ name ] !== undefined ) {
  873. gl.deleteBuffer( geometry[ name ] );
  874. delete geometry[ name ];
  875. }
  876. }
  877. // custom attributes
  878. if ( geometry.__webglCustomAttributesList !== undefined ) {
  879. for ( var name in geometry.__webglCustomAttributesList ) {
  880. gl.deleteBuffer( geometry.__webglCustomAttributesList[ name ].buffer );
  881. }
  882. delete geometry.__webglCustomAttributesList;
  883. }
  884. info.memory.geometries --;
  885. };
  886. };