GeometryExporter.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.GeometryExporter = function () {};
  5. THREE.GeometryExporter.prototype = {
  6. constructor: THREE.GeometryExporter,
  7. parse: function ( geometry ) {
  8. var vertices = [];
  9. for ( var i = 0; i < geometry.vertices.length; i ++ ) {
  10. var vertex = geometry.vertices[ i ];
  11. vertices.push( vertex.x, vertex.y, vertex.z );
  12. }
  13. var faces = [];
  14. var uvs = [[]];
  15. var normals = [];
  16. var normalsHash = {};
  17. for ( var i = 0; i < geometry.faces.length; i ++ ) {
  18. var face = geometry.faces[ i ];
  19. var isTriangle = face instanceof THREE.Face3;
  20. var hasMaterial = face.materialIndex !== undefined;
  21. var hasFaceUv = geometry.faceUvs[ 0 ][ i ] !== undefined;
  22. var hasFaceVertexUv = geometry.faceVertexUvs[ 0 ][ i ] !== undefined;
  23. var hasFaceNormal = face.normal.length() > 0;
  24. var hasFaceVertexNormal = face.vertexNormals[ 0 ] !== undefined;
  25. var hasFaceColor = face.color;
  26. var hasFaceVertexColor = face.vertexColors[ 0 ] !== undefined;
  27. var faceType = 0;
  28. faceType = setBit( faceType, 0, ! isTriangle );
  29. // faceType = setBit( faceType, 1, hasMaterial );
  30. // faceType = setBit( faceType, 2, hasFaceUv );
  31. // faceType = setBit( faceType, 3, hasFaceVertexUv );
  32. faceType = setBit( faceType, 4, hasFaceNormal );
  33. faceType = setBit( faceType, 5, hasFaceVertexNormal );
  34. // faceType = setBit( faceType, 6, hasFaceColor );
  35. // faceType = setBit( faceType, 7, hasFaceVertexColor );
  36. faces.push( faceType );
  37. if ( isTriangle ) {
  38. faces.push( face.a, face.b, face.c );
  39. } else {
  40. faces.push( face.a, face.b, face.c, face.d );
  41. }
  42. if ( hasMaterial ) {
  43. faces.push( face.materialIndex );
  44. }
  45. /*
  46. if ( hasFaceUv ) {
  47. var uv = geometry.faceUvs[ 0 ][ i ];
  48. uvs[ 0 ].push( uv.u, uv.v );
  49. }
  50. */
  51. /*
  52. if ( hasFaceVertexUv ) {
  53. var uvs = geometry.faceVertexUvs[ 0 ][ i ];
  54. if ( isTriangle ) {
  55. faces.push(
  56. uvs[ 0 ].u, uvs[ 0 ].v,
  57. uvs[ 1 ].u, uvs[ 1 ].v,
  58. uvs[ 2 ].u, uvs[ 2 ].v
  59. );
  60. } else {
  61. faces.push(
  62. uvs[ 0 ].u, uvs[ 0 ].v,
  63. uvs[ 1 ].u, uvs[ 1 ].v,
  64. uvs[ 2 ].u, uvs[ 2 ].v,
  65. uvs[ 3 ].u, uvs[ 3 ].v
  66. );
  67. }
  68. }
  69. */
  70. if ( hasFaceNormal ) {
  71. var faceNormal = face.normal;
  72. faces.push( getNormalIndex( faceNormal.x, faceNormal.y, faceNormal.z ) );
  73. }
  74. if ( hasFaceVertexNormal ) {
  75. var vertexNormals = face.vertexNormals;
  76. if ( isTriangle ) {
  77. faces.push(
  78. getNormalIndex( vertexNormals[ 0 ].x, vertexNormals[ 0 ].y, vertexNormals[ 0 ].z ),
  79. getNormalIndex( vertexNormals[ 1 ].x, vertexNormals[ 1 ].y, vertexNormals[ 1 ].z ),
  80. getNormalIndex( vertexNormals[ 2 ].x, vertexNormals[ 2 ].y, vertexNormals[ 2 ].z )
  81. );
  82. } else {
  83. faces.push(
  84. getNormalIndex( vertexNormals[ 0 ].x, vertexNormals[ 0 ].y, vertexNormals[ 0 ].z ),
  85. getNormalIndex( vertexNormals[ 1 ].x, vertexNormals[ 1 ].y, vertexNormals[ 1 ].z ),
  86. getNormalIndex( vertexNormals[ 2 ].x, vertexNormals[ 2 ].y, vertexNormals[ 2 ].z ),
  87. getNormalIndex( vertexNormals[ 3 ].x, vertexNormals[ 3 ].y, vertexNormals[ 3 ].z )
  88. );
  89. }
  90. }
  91. }
  92. function setBit( value, position, enabled ) {
  93. return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position) );
  94. }
  95. function getNormalIndex( x, y, z ) {
  96. var hash = x.toString() + y.toString() + z.toString();
  97. if ( normalsHash[ hash ] !== undefined ) {
  98. return normalsHash[ hash ];
  99. }
  100. normalsHash[ hash ] = normals.length / 3;
  101. normals.push( x, y, z );
  102. return normalsHash[ hash ];
  103. }
  104. //
  105. var output = [
  106. '{',
  107. ' "metadata": {',
  108. ' "formatVersion" : 3',
  109. ' },',
  110. ' "vertices": ' + JSON.stringify( vertices ) + ',',
  111. ' "normals": ' + JSON.stringify( normals ) + ',',
  112. ' "uvs": ' + JSON.stringify( uvs ) + ',',
  113. ' "faces": ' + JSON.stringify( faces ),
  114. '}'
  115. ].join( '\n' );
  116. return output;
  117. }
  118. }