Sidebar.Properties.Geometry.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. Sidebar.Properties.Geometry = function ( signals ) {
  2. var geometries = {
  3. "ConvexGeometry": THREE.ConvexGeometry,
  4. "CubeGeometry": THREE.CubeGeometry,
  5. "CylinderGeometry": THREE.CylinderGeometry,
  6. "ExtrudeGeometry": THREE.ExtrudeGeometry,
  7. "IcosahedronGeometry": THREE.IcosahedronGeometry,
  8. "LatheGeometry": THREE.LatheGeometry,
  9. "OctahedronGeometry": THREE.OctahedronGeometry,
  10. "ParametricGeometry": THREE.ParametricGeometry,
  11. "PlaneGeometry": THREE.PlaneGeometry,
  12. "PolyhedronGeometry": THREE.PolyhedronGeometry,
  13. "SphereGeometry": THREE.SphereGeometry,
  14. "TetrahedronGeometry": THREE.TetrahedronGeometry,
  15. "TextGeometry": THREE.TextGeometry,
  16. "TorusGeometry": THREE.TorusGeometry,
  17. "TorusKnotGeometry": THREE.TorusKnotGeometry,
  18. "TubeGeometry": THREE.TubeGeometry,
  19. "Geometry": THREE.Geometry
  20. };
  21. var container = new UI.Panel();
  22. container.setDisplay( 'none' );
  23. container.add( new UI.Text().setValue( 'GEOMETRY' ).setColor( '#666' ) );
  24. container.add( new UI.Button( 'absolute' ).setRight( '0px' ).setLabel( 'Export' ).onClick( exportGeometry ) );
  25. container.add( new UI.Break(), new UI.Break() );
  26. // name
  27. var geometryNameRow = new UI.Panel();
  28. var geometryName = new UI.Text( 'absolute' ).setLeft( '90px' ).setColor( '#444' ).setFontSize( '12px' );
  29. geometryNameRow.add( new UI.Text().setValue( 'Name' ).setColor( '#666' ) );
  30. geometryNameRow.add( geometryName );
  31. container.add( geometryNameRow );
  32. // class
  33. var geometryClassRow = new UI.Panel();
  34. var geometryClass = new UI.Text( 'absolute' ).setLeft( '90px' ).setColor( '#444' ).setFontSize( '12px' );
  35. geometryClassRow.add( new UI.HorizontalRule(), new UI.Text().setValue( 'Class' ).setColor( '#666' ) );
  36. geometryClassRow.add( geometryClass );
  37. container.add( geometryClassRow );
  38. // vertices
  39. var geometryVerticesRow = new UI.Panel();
  40. var geometryVertices = new UI.Text( 'absolute' ).setLeft( '90px' ).setColor( '#444' ).setFontSize( '12px' );
  41. geometryVerticesRow.add( new UI.HorizontalRule(), new UI.Text().setValue( 'Vertices' ).setColor( '#666' ) );
  42. geometryVerticesRow.add( geometryVertices );
  43. container.add( geometryVerticesRow );
  44. // faces
  45. var geometryFacesRow = new UI.Panel();
  46. var geometryFaces = new UI.Text( 'absolute' ).setLeft( '90px' ).setColor( '#444' ).setFontSize( '12px' );
  47. geometryFacesRow.add( new UI.HorizontalRule(), new UI.Text().setValue( 'Faces' ).setColor( '#666' ) );
  48. geometryFacesRow.add( geometryFaces );
  49. container.add( geometryFacesRow );
  50. container.add( new UI.Break(), new UI.Break(), new UI.Break() );
  51. //
  52. var selected = null;
  53. signals.objectSelected.add( function ( object ) {
  54. if ( object && object.geometry ) {
  55. selected = object.geometry;
  56. container.setDisplay( 'block' );
  57. geometryName.setValue( object.geometry.name );
  58. geometryClass.setValue( getGeometryInstanceName( object.geometry ) );
  59. geometryVertices.setValue( object.geometry.vertices.length );
  60. geometryFaces.setValue( object.geometry.faces.length );
  61. } else {
  62. selected = null;
  63. container.setDisplay( 'none' );
  64. }
  65. } );
  66. function getGeometryInstanceName( geometry ) {
  67. for ( var key in geometries ) {
  68. if ( geometry instanceof geometries[ key ] ) return key;
  69. }
  70. }
  71. function exportGeometry() {
  72. var geometry = selected;
  73. var vertices = [];
  74. for ( var i = 0; i < geometry.vertices.length; i ++ ) {
  75. var vertex = geometry.vertices[ i ];
  76. vertices.push( vertex.x, vertex.y, vertex.z );
  77. }
  78. var faces = [];
  79. var uvs = [[]];
  80. var normals = [];
  81. var normalsHash = {};
  82. for ( var i = 0; i < geometry.faces.length; i ++ ) {
  83. var face = geometry.faces[ i ];
  84. var isTriangle = face instanceof THREE.Face3;
  85. var hasMaterial = face.materialIndex !== undefined;
  86. var hasFaceUv = geometry.faceUvs[ 0 ][ i ] !== undefined;
  87. var hasFaceVertexUv = geometry.faceVertexUvs[ 0 ][ i ] !== undefined;
  88. var hasFaceNormal = face.normal.length() > 0;
  89. var hasFaceVertexNormal = face.vertexNormals[ 0 ] !== undefined;
  90. var hasFaceColor = face.color;
  91. var hasFaceVertexColor = face.vertexColors[ 0 ] !== undefined;
  92. var faceType = 0;
  93. faceType = setBit( faceType, 0, ! isTriangle );
  94. // faceType = setBit( faceType, 1, hasMaterial );
  95. // faceType = setBit( faceType, 2, hasFaceUv );
  96. // faceType = setBit( faceType, 3, hasFaceVertexUv );
  97. faceType = setBit( faceType, 4, hasFaceNormal );
  98. faceType = setBit( faceType, 5, hasFaceVertexNormal );
  99. // faceType = setBit( faceType, 6, hasFaceColor );
  100. // faceType = setBit( faceType, 7, hasFaceVertexColor );
  101. faces.push( faceType );
  102. if ( isTriangle ) {
  103. faces.push( face.a, face.b, face.c );
  104. } else {
  105. faces.push( face.a, face.b, face.c, face.d );
  106. }
  107. if ( hasMaterial ) {
  108. faces.push( face.materialIndex );
  109. }
  110. if ( hasFaceUv ) {
  111. /*
  112. var uv = geometry.faceUvs[ 0 ][ i ];
  113. uvs[ 0 ].push( uv.u, uv.v );
  114. */
  115. }
  116. if ( hasFaceVertexUv ) {
  117. /*
  118. var uvs = geometry.faceVertexUvs[ 0 ][ i ];
  119. if ( isTriangle ) {
  120. faces.push(
  121. uvs[ 0 ].u, uvs[ 0 ].v,
  122. uvs[ 1 ].u, uvs[ 1 ].v,
  123. uvs[ 2 ].u, uvs[ 2 ].v
  124. );
  125. } else {
  126. faces.push(
  127. uvs[ 0 ].u, uvs[ 0 ].v,
  128. uvs[ 1 ].u, uvs[ 1 ].v,
  129. uvs[ 2 ].u, uvs[ 2 ].v,
  130. uvs[ 3 ].u, uvs[ 3 ].v
  131. );
  132. }
  133. */
  134. }
  135. if ( hasFaceNormal ) {
  136. var faceNormal = face.normal;
  137. faces.push( getNormalIndex( faceNormal.x, faceNormal.y, faceNormal.z ) );
  138. }
  139. if ( hasFaceVertexNormal ) {
  140. var vertexNormals = face.vertexNormals;
  141. if ( isTriangle ) {
  142. faces.push(
  143. getNormalIndex( vertexNormals[ 0 ].x, vertexNormals[ 0 ].y, vertexNormals[ 0 ].z ),
  144. getNormalIndex( vertexNormals[ 1 ].x, vertexNormals[ 1 ].y, vertexNormals[ 1 ].z ),
  145. getNormalIndex( vertexNormals[ 2 ].x, vertexNormals[ 2 ].y, vertexNormals[ 2 ].z )
  146. );
  147. } else {
  148. faces.push(
  149. getNormalIndex( vertexNormals[ 0 ].x, vertexNormals[ 0 ].y, vertexNormals[ 0 ].z ),
  150. getNormalIndex( vertexNormals[ 1 ].x, vertexNormals[ 1 ].y, vertexNormals[ 1 ].z ),
  151. getNormalIndex( vertexNormals[ 2 ].x, vertexNormals[ 2 ].y, vertexNormals[ 2 ].z ),
  152. getNormalIndex( vertexNormals[ 3 ].x, vertexNormals[ 3 ].y, vertexNormals[ 3 ].z )
  153. );
  154. }
  155. }
  156. }
  157. function setBit( value, position, enabled ) {
  158. return enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position) );
  159. }
  160. function getNormalIndex( x, y, z ) {
  161. var hash = x.toString() + y.toString() + z.toString();
  162. if ( normalsHash[ hash ] !== undefined ) {
  163. return normalsHash[ hash ];
  164. }
  165. normalsHash[ hash ] = normals.length / 3;
  166. normals.push( x, y, z );
  167. return normalsHash[ hash ];
  168. }
  169. //
  170. var output = [
  171. '{',
  172. ' "metadata": {',
  173. ' "formatVersion" : 3',
  174. ' },',
  175. ' "vertices": ' + JSON.stringify( vertices ) + ',',
  176. ' "normals": ' + JSON.stringify( normals ) + ',',
  177. ' "uvs": ' + JSON.stringify( uvs ) + ',',
  178. ' "faces": ' + JSON.stringify( faces ),
  179. '}'
  180. ].join( '\n' );
  181. var file = new BlobBuilder();
  182. file.append( output );
  183. var objectURL = URL.createObjectURL( file.getBlob( 'text/json' ) );
  184. var clickEvent = document.createEvent( 'MouseEvent' );
  185. clickEvent.initMouseEvent( 'click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null );
  186. var download = document.createElement( 'a' );
  187. download.href = objectURL;
  188. download.download = 'geometry.js';
  189. download.dispatchEvent( clickEvent );
  190. URL.revokeObjectURL( objectURL );
  191. }
  192. return container;
  193. }