mesh.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*jshint esversion: 6 */
  2. module.exports = function createThreeJSBufferGeometry(blender_mesh, origin) {
  3. //get materials
  4. let pick_material = 0,
  5. mesh = blender_mesh,
  6. faces = mesh.mpoly,
  7. loops = mesh.mloop,
  8. UV = mesh.mloopuv,
  9. verts = mesh.mvert;
  10. var geometry = new THREE.BufferGeometry();
  11. if (!faces) return geometry;
  12. var index_count = 0;
  13. //precalculate the size of the array needed for faces
  14. var face_indice_count = 0;
  15. var face_indice_counta = 0;
  16. for (var i = 0; i < faces.length; i++) {
  17. var face = faces[i] || faces;
  18. var len = face.totloop;
  19. var indexi = 1;
  20. face_indice_counta += (len * 2 / 3) | 0;
  21. while (indexi < len) {
  22. face_indice_count += 3;
  23. indexi += 2;
  24. }
  25. }
  26. //extract face info and dump into array buffer;
  27. var face_buffer = new Uint32Array(face_indice_count);
  28. var uv_buffer = new Float32Array(face_indice_count * 2);
  29. var normal_buffer = new Float32Array(face_indice_count * 3);
  30. var verts_array_buff = new Float32Array(face_indice_count * 3);
  31. for (var i = 0; i < faces.length; i++) {
  32. var face = faces[i] || faces;
  33. var len = face.totloop;
  34. var start = face.loopstart;
  35. var indexi = 1;
  36. var offset = 0;
  37. while (indexi < len) {
  38. var face_normals = [];
  39. var face_index_array = [];
  40. var face_uvs = [];
  41. let index = 0;
  42. for (var l = 0; l < 3; l++) {
  43. //Per Vertice
  44. if ((indexi - 1) + l < len) {
  45. index = start + (indexi - 1) + l;
  46. } else {
  47. index = start;
  48. }
  49. var v = loops[index].v;
  50. var vert = verts[v];
  51. face_buffer[index_count] = index_count;
  52. //get normals, which are 16byte ints, and norm them back into floats.
  53. verts_array_buff[index_count * 3 + 0] = vert.co[0] + origin[0];
  54. verts_array_buff[index_count * 3 + 1] = vert.co[2] + origin[2];
  55. verts_array_buff[index_count * 3 + 2] = -vert.co[1] + -origin[1];
  56. normal_buffer[index_count * 3 + 0] = vert.no[0];
  57. normal_buffer[index_count * 3 + 1] = vert.no[2];
  58. normal_buffer[index_count * 3 + 2] = (-vert.no[1]);
  59. if (UV) {
  60. var uv = UV[index].uv;
  61. uv_buffer[index_count * 2 + 0] = uv[0];
  62. uv_buffer[index_count * 2 + 1] = uv[1];
  63. }
  64. index_count++;
  65. }
  66. indexi += 2;
  67. }
  68. }
  69. geometry.addAttribute('position', new THREE.BufferAttribute(verts_array_buff, 3));
  70. geometry.setIndex(new THREE.BufferAttribute(face_buffer, 1));
  71. geometry.addAttribute('normal', new THREE.BufferAttribute(normal_buffer, 3));
  72. geometry.addAttribute('uv', new THREE.BufferAttribute(uv_buffer, 2));
  73. //geometry.blend_mat = materials[pick_material];
  74. return geometry;
  75. };
  76. function createThreeJSGeometry(blender_mesh, origin) {
  77. //get materials
  78. var mats = blender_mesh.mat,
  79. materials = [];
  80. for (var i = 0; i < mats.length; i++) {
  81. var material = createThreeJSMaterial(mats[i]);
  82. materials.push(material);
  83. }
  84. let pick_material = 0,
  85. mesh = blender_mesh,
  86. faces = mesh.mpoly,
  87. loops = mesh.mloop,
  88. UV = mesh.mloopuv,
  89. verts = mesh.mvert,
  90. vert_array = [],
  91. face_array = [],
  92. uv_array = [],
  93. normal_array = [];
  94. var geometry = new THREE.Geometry();
  95. if (!faces) return geometry;
  96. var index_count = 0;
  97. let verts_array_buff = new Float32Array(verts.length * 3);
  98. for (var i = 0; i < verts.length; i++) {
  99. let vert = verts[i];
  100. vert_array.push(new THREE.Vector3(vert.co[0] + origin[0], vert.co[2] + origin[2], -vert.co[1] - origin[1]));
  101. }
  102. for (var i = 0; i < faces.length; i++) {
  103. var face = faces[i] || faces;
  104. var len = face.totloop;
  105. var start = face.loopstart;
  106. var indexi = 1;
  107. pick_material = face.mat_nr;
  108. while (indexi < len) {
  109. var face_normals = [];
  110. var face_index_array = [];
  111. var face_uvs = [];
  112. let index = 0;
  113. for (var l = 0; l < 3; l++) {
  114. //Per Vertice
  115. if ((indexi - 1) + l < len) {
  116. index = start + (indexi - 1) + l;
  117. } else {
  118. index = start;
  119. }
  120. var v = loops[index].v;
  121. var vert = verts[v];
  122. face_index_array.push(v);
  123. index_count++;
  124. //get normals, which are 16byte ints, and norm them back into floats.
  125. var
  126. n1 = vert.no[0],
  127. n2 = vert.no[2],
  128. n3 = -vert.no[1];
  129. var nl = 1;
  130. Math.sqrt((n1 * n1) + (n2 * n2) + (n3 * n3));
  131. face_normals.push(new THREE.Vector3(n1 / nl, n2 / nl, n3 / nl));
  132. if (UV) {
  133. var uv = UV[index].uv;
  134. face_uvs.push(new THREE.Vector2(uv[0], uv[1]));
  135. }
  136. }
  137. uv_array.push(face_uvs);
  138. face_array.push(new THREE.Face3(
  139. face_index_array[0], face_index_array[1], face_index_array[2],
  140. face_normals
  141. ));
  142. indexi += 2;
  143. }
  144. }
  145. geometry.blend_mat = materials[pick_material];
  146. geometry.vertices = vert_array;
  147. geometry.faces = face_array;
  148. if (uv_array.length > 0) {
  149. geometry.faceVertexUvs = [uv_array];
  150. }
  151. geometry.uvsNeedUpdate = true;
  152. //Well, using blender file normals does not work. Will need to investigate why normals from the blender file do not provide correct results.
  153. //For now, have Three calculate normals.
  154. geometry.computeVertexNormals();
  155. return geometry;
  156. };