Sidebar.Object3D.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. Sidebar.Object3D = function ( signals ) {
  2. var container = new UI.Panel();
  3. container.setBorderTop( '1px solid #ccc' );
  4. container.setPadding( '10px' );
  5. container.setDisplay( 'none' );
  6. var objectType = new UI.Text().setColor( '#666' ).setTextTransform( 'uppercase' );
  7. container.add( objectType );
  8. container.add( new UI.Break(), new UI.Break() );
  9. // name
  10. var objectNameRow = new UI.Panel();
  11. var objectName = new UI.Input().setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
  12. objectNameRow.add( new UI.Text( 'Name' ).setWidth( '90px' ).setColor( '#666' ) );
  13. objectNameRow.add( objectName );
  14. container.add( objectNameRow );
  15. // parent
  16. var objectParentRow = new UI.Panel();
  17. var objectParent = new UI.Select().setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
  18. var parentLabel = new UI.Text( 'Parent' ).setWidth( '90px' ).setColor( '#0080f0' );
  19. parentLabel.onClick( function(){ editor.select( editor.objects[ objectParent.getValue() ] ) } );
  20. objectParentRow.add( parentLabel );
  21. objectParentRow.add( objectParent );
  22. container.add( objectParentRow );
  23. // geometry
  24. var objectGeometryRow = new UI.Panel();
  25. var objectGeometry = new UI.Select().setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
  26. var geometryLabel = new UI.Text( 'Geometry' ).setWidth( '90px' ).setColor( '#0080f0' );
  27. geometryLabel.onClick( function(){ editor.select( editor.geometries[ objectGeometry.getValue() ] ) } );
  28. objectGeometryRow.add( geometryLabel );
  29. objectGeometryRow.add( objectGeometry );
  30. container.add( objectGeometryRow );
  31. // material
  32. var objectMaterialRow = new UI.Panel();
  33. var objectMaterial = new UI.Select().setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
  34. var materialLabel = new UI.Text( 'Material' ).setWidth( '90px' ).setColor( '#0080f0' );
  35. materialLabel.onClick( function(){ editor.select( editor.materials[ objectMaterial.getValue() ] ) } );
  36. objectMaterialRow.add( materialLabel );
  37. objectMaterialRow.add( objectMaterial );
  38. container.add( objectMaterialRow );
  39. // position
  40. var objectPositionRow = new UI.Panel();
  41. var objectPositionX = new UI.Number().setWidth( '50px' ).onChange( update );
  42. var objectPositionY = new UI.Number().setWidth( '50px' ).onChange( update );
  43. var objectPositionZ = new UI.Number().setWidth( '50px' ).onChange( update );
  44. objectPositionRow.add( new UI.Text( 'Position' ).setWidth( '90px' ).setColor( '#666' ) );
  45. objectPositionRow.add( objectPositionX, objectPositionY, objectPositionZ );
  46. container.add( objectPositionRow );
  47. // rotation
  48. var objectRotationRow = new UI.Panel();
  49. var objectRotationX = new UI.Number().setWidth( '50px' ).onChange( update );
  50. var objectRotationY = new UI.Number().setWidth( '50px' ).onChange( update );
  51. var objectRotationZ = new UI.Number().setWidth( '50px' ).onChange( update );
  52. objectRotationRow.add( new UI.Text( 'Rotation' ).setWidth( '90px' ).setColor( '#666' ) );
  53. objectRotationRow.add( objectRotationX, objectRotationY, objectRotationZ );
  54. container.add( objectRotationRow );
  55. // scale
  56. var objectScaleRow = new UI.Panel();
  57. var objectScaleLock = new UI.Checkbox().setPosition( 'absolute' ).setLeft( '75px' );
  58. var objectScaleX = new UI.Number( 1 ).setWidth( '50px' ).onChange( updateScaleX );
  59. var objectScaleY = new UI.Number( 1 ).setWidth( '50px' ).onChange( updateScaleY );
  60. var objectScaleZ = new UI.Number( 1 ).setWidth( '50px' ).onChange( updateScaleZ );
  61. objectScaleRow.add( new UI.Text( 'Scale' ).setWidth( '90px' ).setColor( '#666' ) );
  62. objectScaleRow.add( objectScaleLock );
  63. objectScaleRow.add( objectScaleX, objectScaleY, objectScaleZ );
  64. container.add( objectScaleRow );
  65. // fov
  66. var objectFovRow = new UI.Panel();
  67. var objectFov = new UI.Number().onChange( update );
  68. objectFovRow.add( new UI.Text( 'Fov' ).setWidth( '90px' ).setColor( '#666' ) );
  69. objectFovRow.add( objectFov );
  70. container.add( objectFovRow );
  71. // near
  72. var objectNearRow = new UI.Panel();
  73. var objectNear = new UI.Number().onChange( update );
  74. objectNearRow.add( new UI.Text( 'Near' ).setWidth( '90px' ).setColor( '#666' ) );
  75. objectNearRow.add( objectNear );
  76. container.add( objectNearRow );
  77. // far
  78. var objectFarRow = new UI.Panel();
  79. var objectFar = new UI.Number().onChange( update );
  80. objectFarRow.add( new UI.Text( 'Far' ).setWidth( '90px' ).setColor( '#666' ) );
  81. objectFarRow.add( objectFar );
  82. container.add( objectFarRow );
  83. // intensity
  84. var objectIntensityRow = new UI.Panel();
  85. var objectIntensity = new UI.Number().setRange( 0, Infinity ).onChange( update );
  86. objectIntensityRow.add( new UI.Text( 'Intensity' ).setWidth( '90px' ).setColor( '#666' ) );
  87. objectIntensityRow.add( objectIntensity );
  88. container.add( objectIntensityRow );
  89. // color
  90. var objectColorRow = new UI.Panel();
  91. var objectColor = new UI.Color().onChange( update );
  92. objectColorRow.add( new UI.Text( 'Color' ).setWidth( '90px' ).setColor( '#666' ) );
  93. objectColorRow.add( objectColor );
  94. container.add( objectColorRow );
  95. // ground color
  96. var objectGroundColorRow = new UI.Panel();
  97. var objectGroundColor = new UI.Color().onChange( update );
  98. objectGroundColorRow.add( new UI.Text( 'Ground color' ).setWidth( '90px' ).setColor( '#666' ) );
  99. objectGroundColorRow.add( objectGroundColor );
  100. container.add( objectGroundColorRow );
  101. // distance
  102. var objectDistanceRow = new UI.Panel();
  103. var objectDistance = new UI.Number().setRange( 0, Infinity ).onChange( update );
  104. objectDistanceRow.add( new UI.Text( 'Distance' ).setWidth( '90px' ).setColor( '#666' ) );
  105. objectDistanceRow.add( objectDistance );
  106. container.add( objectDistanceRow );
  107. // angle
  108. var objectAngleRow = new UI.Panel();
  109. var objectAngle = new UI.Number().setPrecision( 3 ).setRange( 0, Math.PI / 2 ).onChange( update );
  110. objectAngleRow.add( new UI.Text( 'Angle' ).setWidth( '90px' ).setColor( '#666' ) );
  111. objectAngleRow.add( objectAngle );
  112. container.add( objectAngleRow );
  113. // exponent
  114. var objectExponentRow = new UI.Panel();
  115. var objectExponent = new UI.Number().setRange( 0, Infinity ).onChange( update );
  116. objectExponentRow.add( new UI.Text( 'Exponent' ).setWidth( '90px' ).setColor( '#666' ) );
  117. objectExponentRow.add( objectExponent );
  118. container.add( objectExponentRow );
  119. // visible
  120. var objectVisibleRow = new UI.Panel();
  121. var objectVisible = new UI.Checkbox().onChange( update );
  122. objectVisibleRow.add( new UI.Text( 'Visible' ).setWidth( '90px' ).setColor( '#666' ) );
  123. objectVisibleRow.add( objectVisible );
  124. container.add( objectVisibleRow );
  125. // user data
  126. var objectUserDataRow = new UI.Panel();
  127. var objectUserData = new UI.TextArea().setWidth( '150px' ).setHeight( '40px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
  128. objectUserData.onKeyUp( function () {
  129. try {
  130. JSON.parse( objectUserData.getValue() );
  131. objectUserData.setBorderColor( '#ccc' );
  132. objectUserData.setBackgroundColor( '' );
  133. } catch ( error ) {
  134. objectUserData.setBorderColor( '#f00' );
  135. objectUserData.setBackgroundColor( 'rgba(255,0,0,0.25)' );
  136. }
  137. } );
  138. objectUserDataRow.add( new UI.Text( 'User data' ).setWidth( '90px' ).setColor( '#666' ) );
  139. objectUserDataRow.add( objectUserData );
  140. container.add( objectUserDataRow );
  141. //
  142. var object = null;
  143. var scene = editor.scene;
  144. //
  145. function updateScaleX() {
  146. if ( objectScaleLock.getValue() === true ) {
  147. var scale = objectScaleX.getValue() / object.scale.x;
  148. objectScaleY.setValue( objectScaleY.getValue() * scale );
  149. objectScaleZ.setValue( objectScaleZ.getValue() * scale );
  150. }
  151. update();
  152. }
  153. function updateScaleY() {
  154. if ( objectScaleLock.getValue() === true ) {
  155. var scale = objectScaleY.getValue() / object.scale.y;
  156. objectScaleX.setValue( objectScaleX.getValue() * scale );
  157. objectScaleZ.setValue( objectScaleZ.getValue() * scale );
  158. }
  159. update();
  160. }
  161. function updateScaleZ() {
  162. if ( objectScaleLock.getValue() === true ) {
  163. var scale = objectScaleZ.getValue() / object.scale.z;
  164. objectScaleX.setValue( objectScaleX.getValue() * scale );
  165. objectScaleY.setValue( objectScaleY.getValue() * scale );
  166. }
  167. update();
  168. }
  169. function update() {
  170. if ( object ) {
  171. object.name = objectName.getValue();
  172. if ( object.parent !== undefined ) {
  173. var newParentUuid = objectParent.getValue();
  174. if ( object.parent.uuid !== newParentUuid && object.uuid !== newParentUuid ) {
  175. var parent = editor.objects[newParentUuid];
  176. if ( parent === undefined ) {
  177. parent = scene;
  178. }
  179. parent.add( object );
  180. signals.sceneChanged.dispatch( scene );
  181. }
  182. }
  183. if ( object.geometry !== undefined ) {
  184. var newGeometryUUid = objectGeometry.getValue();
  185. if ( object.geometry.uuid !== newGeometryUUid && object.uuid !== newGeometryUUid ) {
  186. object.geometry = editor.geometries[newGeometryUUid];
  187. // TODO: Update Geometry;
  188. signals.objectChanged.dispatch( object );
  189. }
  190. }
  191. if ( object.material !== undefined ) {
  192. var newMaterialUUid = objectMaterial.getValue();
  193. if ( object.material.uuid !== newMaterialUUid && object.uuid !== newMaterialUUid ) {
  194. object.material = editor.materials[newMaterialUUid];
  195. signals.objectChanged.dispatch( object );
  196. }
  197. }
  198. object.position.x = objectPositionX.getValue();
  199. object.position.y = objectPositionY.getValue();
  200. object.position.z = objectPositionZ.getValue();
  201. object.rotation.x = objectRotationX.getValue();
  202. object.rotation.y = objectRotationY.getValue();
  203. object.rotation.z = objectRotationZ.getValue();
  204. object.scale.x = objectScaleX.getValue();
  205. object.scale.y = objectScaleY.getValue();
  206. object.scale.z = objectScaleZ.getValue();
  207. if ( object.fov !== undefined ) {
  208. object.fov = objectFov.getValue();
  209. object.updateProjectionMatrix();
  210. }
  211. if ( object.near !== undefined ) {
  212. object.near = objectNear.getValue();
  213. }
  214. if ( object.far !== undefined ) {
  215. object.far = objectFar.getValue();
  216. }
  217. if ( object.intensity !== undefined ) {
  218. object.intensity = objectIntensity.getValue();
  219. }
  220. if ( object.color !== undefined ) {
  221. object.color.setHex( objectColor.getHexValue() );
  222. }
  223. if ( object.groundColor !== undefined ) {
  224. object.groundColor.setHex( objectGroundColor.getHexValue() );
  225. }
  226. if ( object.distance !== undefined ) {
  227. object.distance = objectDistance.getValue();
  228. }
  229. if ( object.angle !== undefined ) {
  230. object.angle = objectAngle.getValue();
  231. }
  232. if ( object.exponent !== undefined ) {
  233. object.exponent = objectExponent.getValue();
  234. }
  235. object.visible = objectVisible.getValue();
  236. try {
  237. object.userData = JSON.parse( objectUserData.getValue() );
  238. } catch ( error ) {
  239. console.log( error );
  240. }
  241. signals.objectChanged.dispatch( object );
  242. }
  243. }
  244. function updateRows() {
  245. var properties = {
  246. 'parent': objectParentRow,
  247. 'geometry': objectGeometryRow,
  248. 'material': objectMaterialRow,
  249. 'fov': objectFovRow,
  250. 'near': objectNearRow,
  251. 'far': objectFarRow,
  252. 'intensity': objectIntensityRow,
  253. 'color': objectColorRow,
  254. 'groundColor': objectGroundColorRow,
  255. 'distance' : objectDistanceRow,
  256. 'angle' : objectAngleRow,
  257. 'exponent' : objectExponentRow
  258. };
  259. for ( var property in properties ) {
  260. properties[ property ].setDisplay( object[ property ] !== undefined ? '' : 'none' );
  261. }
  262. }
  263. function updateTransformRows() {
  264. if ( object instanceof THREE.Light || ( object instanceof THREE.Object3D && object.userData.targetInverse ) ) {
  265. objectRotationRow.setDisplay( 'none' );
  266. objectScaleRow.setDisplay( 'none' );
  267. } else {
  268. objectRotationRow.setDisplay( '' );
  269. objectScaleRow.setDisplay( '' );
  270. }
  271. }
  272. function getObjectInstanceName( object ) {
  273. var objects = {
  274. 'Scene': THREE.Scene,
  275. 'PerspectiveCamera': THREE.PerspectiveCamera,
  276. 'AmbientLight': THREE.AmbientLight,
  277. 'DirectionalLight': THREE.DirectionalLight,
  278. 'HemisphereLight': THREE.HemisphereLight,
  279. 'PointLight': THREE.PointLight,
  280. 'SpotLight': THREE.SpotLight,
  281. 'Mesh': THREE.Mesh,
  282. 'Object3D': THREE.Object3D
  283. };
  284. for ( var key in objects ) {
  285. if ( object instanceof objects[ key ] ) return key;
  286. }
  287. }
  288. // events
  289. signals.sceneChanged.add( function () {
  290. } );
  291. signals.selected.add( function ( selected ) {
  292. var selected = editor.listSelected( 'object' );
  293. object = ( selected.length ) ? selected[0] : null;
  294. updateUI();
  295. } );
  296. signals.objectChanged.add( function ( changedObject ) {
  297. if ( object === changedObject ) updateUI();
  298. } );
  299. function updateUI() {
  300. if ( !object ) {
  301. container.setDisplay( 'none' );
  302. return;
  303. }
  304. container.setDisplay( 'block' );
  305. objectType.setValue( getObjectInstanceName( object ) );
  306. var allObjects = {};
  307. var allGeometries = {};
  308. var allMaterials = {};
  309. for ( var uuid in editor.objects ) {
  310. if ( object.uuid != uuid ) allObjects[ uuid ] = editor.objects[ uuid ].name;
  311. }
  312. for ( var uuid in editor.geometries ) {
  313. allGeometries[ uuid ] = editor.geometries[ uuid ].name;
  314. }
  315. for ( var uuid in editor.materials ) {
  316. allMaterials[ uuid ] = editor.materials[ uuid ].name;
  317. }
  318. objectParent.setOptions( allObjects );
  319. objectGeometry.setOptions( allGeometries );
  320. objectMaterial.setOptions( allMaterials );
  321. if ( object.parent !== undefined ) {
  322. objectParent.setValue( object.parent.uuid );
  323. }
  324. if ( object.geometry !== undefined ) {
  325. objectGeometry.setValue( object.geometry.uuid );
  326. }
  327. if ( object.material !== undefined ) {
  328. objectMaterial.setValue( object.material.uuid );
  329. }
  330. objectName.setValue( object.name );
  331. objectPositionX.setValue( object.position.x );
  332. objectPositionY.setValue( object.position.y );
  333. objectPositionZ.setValue( object.position.z );
  334. objectRotationX.setValue( object.rotation.x );
  335. objectRotationY.setValue( object.rotation.y );
  336. objectRotationZ.setValue( object.rotation.z );
  337. objectScaleX.setValue( object.scale.x );
  338. objectScaleY.setValue( object.scale.y );
  339. objectScaleZ.setValue( object.scale.z );
  340. if ( object.fov !== undefined ) {
  341. objectFov.setValue( object.fov );
  342. }
  343. if ( object.near !== undefined ) {
  344. objectNear.setValue( object.near );
  345. }
  346. if ( object.far !== undefined ) {
  347. objectFar.setValue( object.far );
  348. }
  349. if ( object.intensity !== undefined ) {
  350. objectIntensity.setValue( object.intensity );
  351. }
  352. if ( object.color !== undefined ) {
  353. objectColor.setValue( '#' + object.color.getHexString() );
  354. }
  355. if ( object.groundColor !== undefined ) {
  356. objectGroundColor.setValue( '#' + object.groundColor.getHexString() );
  357. }
  358. if ( object.distance !== undefined ) {
  359. objectDistance.setValue( object.distance );
  360. }
  361. if ( object.angle !== undefined ) {
  362. objectAngle.setValue( object.angle );
  363. }
  364. if ( object.exponent !== undefined ) {
  365. objectExponent.setValue( object.exponent );
  366. }
  367. objectVisible.setValue( object.visible );
  368. try {
  369. objectUserData.setValue( JSON.stringify( object.userData, null, ' ' ) );
  370. } catch ( error ) {
  371. console.log( error );
  372. }
  373. objectUserData.setBorderColor( '#ccc' );
  374. objectUserData.setBackgroundColor( '' );
  375. updateRows();
  376. updateTransformRows();
  377. }
  378. return container;
  379. }