material.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. var constants = {
  2. side: {
  3. "THREE.FrontSide": THREE.FrontSide,
  4. "THREE.BackSide": THREE.BackSide,
  5. "THREE.DoubleSide": THREE.DoubleSide
  6. },
  7. shading: {
  8. "THREE.NoShading": THREE.NoShading,
  9. "THREE.FlatShading": THREE.FlatShading,
  10. "THREE.SmoothShading": THREE.SmoothShading
  11. },
  12. colors: {
  13. "THREE.NoColors": THREE.NoColors,
  14. "THREE.FaceColors": THREE.FaceColors,
  15. "THREE.VertexColors": THREE.VertexColors
  16. },
  17. blendingMode: {
  18. "THREE.NoBlending": THREE.NoBlending,
  19. "THREE.NormalBlending": THREE.NormalBlending,
  20. "THREE.AdditiveBlending": THREE.AdditiveBlending,
  21. "THREE.SubtractiveBlending": THREE.SubtractiveBlending,
  22. "THREE.MultiplyBlending": THREE.MultiplyBlending,
  23. "THREE.CustomBlending": THREE.CustomBlending
  24. },
  25. equations : {
  26. "THREE.AddEquation" : THREE.AddEquation,
  27. "THREE.SubtractEquation" : THREE.SubtractEquation,
  28. "THREE.ReverseSubtractEquation" : THREE.ReverseSubtractEquation
  29. },
  30. destinationFactors : {
  31. "THREE.ZeroFactor" : THREE.ZeroFactor,
  32. "THREE.OneFactor" : THREE.OneFactor,
  33. "THREE.SrcColorFactor" : THREE.SrcColorFactor,
  34. "THREE.OneMinusSrcColorFactor" : THREE.OneMinusSrcColorFactor,
  35. "THREE.SrcAlphaFactor" : THREE.SrcAlphaFactor,
  36. "THREE.OneMinusSrcAlphaFactor" : THREE.OneMinusSrcAlphaFactor,
  37. "THREE.DstAlphaFactor" : THREE.DstAlphaFactor,
  38. "THREE.OneMinusDstAlphaFactor" : THREE.OneMinusDstAlphaFactor
  39. },
  40. sourceFactors : {
  41. "THREE.DstColorFactor" : THREE.DstColorFactor,
  42. "THREE.OneMinusDstColorFactor" : THREE.OneMinusDstColorFactor,
  43. "THREE.SrcAlphaSaturateFactor" : THREE.SrcAlphaSaturateFactor
  44. }
  45. }
  46. function handleColorChange( color ) {
  47. return function( value ){
  48. if(typeof value === "string") {
  49. value = value.replace('#', '0x');
  50. }
  51. color.setHex( value );
  52. };
  53. }
  54. function needsUpdate( material, geometry ) {
  55. return function() {
  56. material.shading = +material.shading; //Ensure number
  57. material.needsUpdate = true;
  58. geometry.verticesNeedUpdate = true;
  59. geometry.normalsNeedUpdate = true;
  60. }
  61. };
  62. function guiScene( gui, scene ) {
  63. var folder = gui.addFolder('Scene');
  64. var data = {
  65. background : "#000000"
  66. }
  67. var color = new THREE.Color();
  68. var colorConvert = handleColorChange( color );
  69. folder.addColor( data, "background" ).onChange( function( value ) {
  70. colorConvert( value );
  71. renderer.setClearColor(color.getHex(), 1);
  72. } );
  73. guiSceneFog( folder, scene );
  74. }
  75. function guiSceneFog( folder, scene ) {
  76. var fogFolder = folder.addFolder('scene.fog');
  77. var fog = new THREE.Fog( 0x3f7b9d, 0, 60 );
  78. var data = {
  79. fog : {
  80. "THREE.Fog()" : false,
  81. "scene.fog.color" : fog.color.getHex()
  82. }
  83. };
  84. fogFolder.add( data.fog, 'THREE.Fog()' ).onChange( function( useFog ) {
  85. if( useFog ) {
  86. scene.fog = fog;
  87. } else {
  88. scene.fog = null;
  89. }
  90. } );
  91. fogFolder.addColor( data.fog, 'scene.fog.color').onChange( handleColorChange( fog.color ) );
  92. }
  93. function guiMaterial( gui, material, geometry ) {
  94. var folder = gui.addFolder('THREE.Material');
  95. folder.add( material, 'transparent' );
  96. folder.add( material, 'opacity', 0, 1 );
  97. // folder.add( material, 'blending', constants.blendingMode );
  98. // folder.add( material, 'blendSrc', constants.destinationFactors );
  99. // folder.add( material, 'blendDst', constants.destinationFactors );
  100. // folder.add( material, 'blendEquation', constants.equations );
  101. folder.add( material, 'depthTest' );
  102. folder.add( material, 'depthWrite' );
  103. folder.add( material, 'polygonOffset' );
  104. folder.add( material, 'polygonOffsetFactor' );
  105. folder.add( material, 'polygonOffsetUnits' );
  106. folder.add( material, 'alphaTest' );
  107. folder.add( material, 'overdraw' );
  108. folder.add( material, 'visible' );
  109. folder.add( material, 'side', constants.side ).onChange( needsUpdate( material, geometry ) );
  110. }
  111. function guiMeshBasicMaterial( gui, material, geometry ) {
  112. var data = {
  113. color : material.color.getHex()
  114. };
  115. var folder = gui.addFolder('THREE.MeshBasicMaterial');
  116. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  117. folder.add( material, 'wireframe' );
  118. folder.add( material, 'wireframeLinewidth', 0, 10 );
  119. folder.add( material, 'wireframeLinecap', ["butt", "round", "square"] );
  120. folder.add( material, 'wireframeLinejoin', ["round", "bevel", "miter"] );
  121. folder.add( material, 'shading', constants.shading);
  122. folder.add( material, 'vertexColors', constants.colors);
  123. folder.add( material, 'fog' );
  124. //folder.add( material, 'lightMap' );
  125. //folder.add( material, 'specularMap' );
  126. //folder.add( material, 'alphaMap' );
  127. //folder.add( material, 'envMap' );
  128. //folder.add( material, 'skinning' );
  129. //folder.add( material, 'morphTargets' );
  130. //folder.add( material, 'map' );
  131. //folder.add( material, 'combine' );
  132. //folder.add( material, 'relectivity' );
  133. //folder.add( material, 'refractionRatio' );
  134. }
  135. function guiMeshDepthMaterial( gui, material, geometry ) {
  136. var folder = gui.addFolder('THREE.MeshDepthMaterial');
  137. folder.add( material, 'wireframe' );
  138. folder.add( material, 'wireframeLinewidth', 0, 10 );
  139. }
  140. function guiMeshNormalMaterial( gui, material, geometry ) {
  141. var folder = gui.addFolder('THREE.MeshNormalMaterial');
  142. folder.add( material, 'morphTargets');
  143. folder.add( material, 'shading', constants.shading).onChange( needsUpdate( material, geometry ) );
  144. folder.add( material, 'wireframe' );
  145. folder.add( material, 'wireframeLinewidth', 0, 10 );
  146. }
  147. function guiLineBasicMaterial( gui, material, geometry ) {
  148. var data = {
  149. color : material.color.getHex()
  150. };
  151. var folder = gui.addFolder('THREE.LineBasicMaterial');
  152. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  153. folder.add( material, 'linewidth', 0, 10 );
  154. folder.add( material, 'linecap', ["butt", "round", "square"] );
  155. folder.add( material, 'linejoin', ["round", "bevel", "miter"] );
  156. folder.add( material, 'vertexColors', constants.colors);
  157. folder.add( material, 'fog' );
  158. }
  159. function guiMeshLambertMaterial( gui, material, geometry ) {
  160. var data = {
  161. color : material.color.getHex(),
  162. ambient : material.ambient.getHex(),
  163. emissive : material.emissive.getHex()
  164. };
  165. var folder = gui.addFolder('THREE.MeshLambertMaterial');
  166. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  167. folder.addColor( data, 'ambient' ).onChange( handleColorChange( material.ambient ) );
  168. folder.addColor( data, 'emissive' ).onChange( handleColorChange( material.emissive ) );
  169. folder.add( material, 'shading', constants.shading).onChange( needsUpdate( material, geometry ) );
  170. folder.add( material, 'wireframe' );
  171. folder.add( material, 'wireframeLinewidth', 0, 10 );
  172. folder.add( material, 'wireframeLinecap', ["butt", "round", "square"] );
  173. folder.add( material, 'wireframeLinejoin', ["round", "bevel", "miter"] );
  174. folder.add( material, 'vertexColors', constants.colors);
  175. folder.add( material, 'fog' );
  176. }
  177. function guiMeshPhongMaterial( gui, material, geometry ) {
  178. var data = {
  179. color : material.color.getHex(),
  180. ambient : material.ambient.getHex(),
  181. emissive : material.emissive.getHex(),
  182. specular : material.specular.getHex()
  183. };
  184. var folder = gui.addFolder('THREE.MeshPhongMaterial');
  185. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  186. folder.addColor( data, 'ambient' ).onChange( handleColorChange( material.ambient ) );
  187. folder.addColor( data, 'emissive' ).onChange( handleColorChange( material.emissive ) );
  188. folder.addColor( data, 'specular' ).onChange( handleColorChange( material.specular ) );
  189. folder.add( material, 'shininess', 0, 100);
  190. folder.add( material, 'shading', constants.shading).onChange( needsUpdate( material, geometry ) );
  191. folder.add( material, 'wireframe' );
  192. folder.add( material, 'wireframeLinewidth', 0, 10 );
  193. folder.add( material, 'wireframeLinecap', ["butt", "round", "square"] );
  194. folder.add( material, 'wireframeLinejoin', ["round", "bevel", "miter"] );
  195. folder.add( material, 'vertexColors', constants.colors);
  196. folder.add( material, 'fog' );
  197. }
  198. function chooseFromHash( gui, geometry ) {
  199. var selectedMaterial = window.location.hash.substring(1) || "MeshBasicMaterial";
  200. var material;
  201. switch (selectedMaterial) {
  202. case "MeshBasicMaterial":
  203. material = new THREE.MeshBasicMaterial({color: 0x00ff00});
  204. guiMaterial( gui, material, geometry );
  205. guiMeshBasicMaterial( gui, material, geometry );
  206. return material;
  207. break;
  208. case "MeshLambertMaterial":
  209. material = new THREE.MeshLambertMaterial({color: 0x00ff00});
  210. guiMaterial( gui, material, geometry );
  211. guiMeshLambertMaterial( gui, material, geometry );
  212. return material;
  213. break;
  214. case "MeshPhongMaterial":
  215. material = new THREE.MeshPhongMaterial({color: 0x00ff00});
  216. guiMaterial( gui, material, geometry );
  217. guiMeshPhongMaterial( gui, material, geometry );
  218. return material;
  219. break;
  220. case "MeshDepthMaterial":
  221. material = new THREE.MeshDepthMaterial({color: 0x00ff00});
  222. guiMaterial( gui, material, geometry );
  223. guiMeshDepthMaterial( gui, material, geometry );
  224. return material;
  225. break;
  226. case "MeshNormalMaterial":
  227. material = new THREE.MeshNormalMaterial();
  228. guiMaterial( gui, material, geometry );
  229. guiMeshNormalMaterial( gui, material, geometry );
  230. return material;
  231. break;
  232. case "LineBasicMaterial":
  233. material = new THREE.LineBasicMaterial({color: 0x00ff00});
  234. guiMaterial( gui, material, geometry );
  235. guiLineBasicMaterial( gui, material, geometry );
  236. return material;
  237. break;
  238. }
  239. }