material.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. var constants = {
  2. combine: {
  3. "THREE.MultiplyOperation" : THREE.MultiplyOperation,
  4. "THREE.MixOperation" : THREE.MixOperation,
  5. "THREE.AddOperation" : THREE.AddOperation
  6. },
  7. side: {
  8. "THREE.FrontSide" : THREE.FrontSide,
  9. "THREE.BackSide" : THREE.BackSide,
  10. "THREE.DoubleSide" : THREE.DoubleSide
  11. },
  12. shading: {
  13. "THREE.NoShading" : THREE.NoShading,
  14. "THREE.FlatShading" : THREE.FlatShading,
  15. "THREE.SmoothShading" : THREE.SmoothShading
  16. },
  17. colors: {
  18. "THREE.NoColors" : THREE.NoColors,
  19. "THREE.FaceColors" : THREE.FaceColors,
  20. "THREE.VertexColors" : THREE.VertexColors
  21. },
  22. blendingMode: {
  23. "THREE.NoBlending" : THREE.NoBlending,
  24. "THREE.NormalBlending" : THREE.NormalBlending,
  25. "THREE.AdditiveBlending" : THREE.AdditiveBlending,
  26. "THREE.SubtractiveBlending" : THREE.SubtractiveBlending,
  27. "THREE.MultiplyBlending" : THREE.MultiplyBlending,
  28. "THREE.CustomBlending" : THREE.CustomBlending
  29. },
  30. equations : {
  31. "THREE.AddEquation" : THREE.AddEquation,
  32. "THREE.SubtractEquation" : THREE.SubtractEquation,
  33. "THREE.ReverseSubtractEquation" : THREE.ReverseSubtractEquation
  34. },
  35. destinationFactors : {
  36. "THREE.ZeroFactor" : THREE.ZeroFactor,
  37. "THREE.OneFactor" : THREE.OneFactor,
  38. "THREE.SrcColorFactor" : THREE.SrcColorFactor,
  39. "THREE.OneMinusSrcColorFactor" : THREE.OneMinusSrcColorFactor,
  40. "THREE.SrcAlphaFactor" : THREE.SrcAlphaFactor,
  41. "THREE.OneMinusSrcAlphaFactor" : THREE.OneMinusSrcAlphaFactor,
  42. "THREE.DstAlphaFactor" : THREE.DstAlphaFactor,
  43. "THREE.OneMinusDstAlphaFactor" : THREE.OneMinusDstAlphaFactor
  44. },
  45. sourceFactors : {
  46. "THREE.DstColorFactor" : THREE.DstColorFactor,
  47. "THREE.OneMinusDstColorFactor" : THREE.OneMinusDstColorFactor,
  48. "THREE.SrcAlphaSaturateFactor" : THREE.SrcAlphaSaturateFactor
  49. }
  50. }
  51. var cubes = (function() {
  52. var path = "../../examples/textures/cube/SwedishRoyalCastle/";
  53. var format = '.jpg';
  54. var urls = [
  55. path + 'px' + format, path + 'nx' + format,
  56. path + 'py' + format, path + 'ny' + format,
  57. path + 'pz' + format, path + 'nz' + format
  58. ];
  59. var reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
  60. reflectionCube.format = THREE.RGBFormat;
  61. var refractionCube = new THREE.Texture( reflectionCube.image, new THREE.CubeRefractionMapping() );
  62. reflectionCube.format = THREE.RGBFormat;
  63. return {
  64. none : null,
  65. reflection : reflectionCube,
  66. refraction : refractionCube
  67. };
  68. })();
  69. function generateVertexColors( geometry ) {
  70. for( var i=0, il = geometry.faces.length; i < il; i++ ) {
  71. geometry.faces[i].vertexColors.push( new THREE.Color().setHSL(
  72. i / il * Math.random(),
  73. 0.5,
  74. 0.5
  75. ) );
  76. geometry.faces[i].vertexColors.push( new THREE.Color().setHSL(
  77. i / il * Math.random(),
  78. 0.5,
  79. 0.5
  80. ) );
  81. geometry.faces[i].vertexColors.push( new THREE.Color().setHSL(
  82. i / il * Math.random(),
  83. 0.5,
  84. 0.5
  85. ) );
  86. geometry.faces[i].color = new THREE.Color().setHSL(
  87. i / il * Math.random(),
  88. 0.5,
  89. 0.5
  90. );
  91. }
  92. }
  93. function generateMorphTargets( mesh, geometry ) {
  94. var vertices = [], scale;
  95. for ( var i = 0; i < geometry.vertices.length; i++ ) {
  96. vertices.push( geometry.vertices[ i ].clone() );
  97. scale = 1 + Math.random() * 0.3;
  98. vertices[ vertices.length - 1 ].x *= scale;
  99. vertices[ vertices.length - 1 ].y *= scale;
  100. vertices[ vertices.length - 1 ].z *= scale;
  101. }
  102. geometry.morphTargets.push( { name: "target1", vertices: vertices } );
  103. geometry.update
  104. }
  105. function handleColorChange( color ) {
  106. return function( value ){
  107. if(typeof value === "string") {
  108. value = value.replace('#', '0x');
  109. }
  110. color.setHex( value );
  111. };
  112. }
  113. function needsUpdate( material, geometry ) {
  114. return function() {
  115. material.shading = +material.shading; //Ensure number
  116. material.vertexColors = +material.vertexColors; //Ensure number
  117. material.side = +material.side; //Ensure number
  118. material.needsUpdate = true;
  119. geometry.verticesNeedUpdate = true;
  120. geometry.normalsNeedUpdate = true;
  121. geometry.colorsNeedUpdate = true;
  122. };
  123. };
  124. function updateMorphs( torus, material ) {
  125. return function() {
  126. torus.updateMorphTargets();
  127. material.needsUpdate = true;
  128. };
  129. }
  130. function guiScene( gui, scene ) {
  131. var folder = gui.addFolder('Scene');
  132. var data = {
  133. background : "#000000",
  134. "ambient light" : ambientLight.color.getHex()
  135. }
  136. var color = new THREE.Color();
  137. var colorConvert = handleColorChange( color );
  138. folder.addColor( data, "background" ).onChange( function( value ) {
  139. colorConvert( value );
  140. renderer.setClearColor(color.getHex(), 1);
  141. } );
  142. folder.addColor( data, "ambient light" ).onChange( handleColorChange( ambientLight.color ) )
  143. guiSceneFog( folder, scene );
  144. }
  145. function guiSceneFog( folder, scene ) {
  146. var fogFolder = folder.addFolder('scene.fog');
  147. var fog = new THREE.Fog( 0x3f7b9d, 0, 60 );
  148. var data = {
  149. fog : {
  150. "THREE.Fog()" : false,
  151. "scene.fog.color" : fog.color.getHex()
  152. }
  153. };
  154. fogFolder.add( data.fog, 'THREE.Fog()' ).onChange( function( useFog ) {
  155. if( useFog ) {
  156. scene.fog = fog;
  157. } else {
  158. scene.fog = null;
  159. }
  160. } );
  161. fogFolder.addColor( data.fog, 'scene.fog.color').onChange( handleColorChange( fog.color ) );
  162. }
  163. function guiMaterial( gui, mesh, material, geometry ) {
  164. var folder = gui.addFolder('THREE.Material');
  165. folder.add( material, 'transparent' );
  166. folder.add( material, 'opacity', 0, 1 );
  167. // folder.add( material, 'blending', constants.blendingMode );
  168. // folder.add( material, 'blendSrc', constants.destinationFactors );
  169. // folder.add( material, 'blendDst', constants.destinationFactors );
  170. // folder.add( material, 'blendEquation', constants.equations );
  171. folder.add( material, 'depthTest' );
  172. folder.add( material, 'depthWrite' );
  173. // folder.add( material, 'polygonOffset' );
  174. // folder.add( material, 'polygonOffsetFactor' );
  175. // folder.add( material, 'polygonOffsetUnits' );
  176. folder.add( material, 'alphaTest', 0, 1 );
  177. folder.add( material, 'overdraw', 0, 5 );
  178. folder.add( material, 'visible' );
  179. folder.add( material, 'side', constants.side ).onChange( needsUpdate( material, geometry ) );
  180. }
  181. function guiMeshBasicMaterial( gui, mesh, material, geometry ) {
  182. var data = {
  183. color : material.color.getHex()
  184. };
  185. var folder = gui.addFolder('THREE.MeshBasicMaterial');
  186. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  187. folder.add( material, 'wireframe' );
  188. folder.add( material, 'wireframeLinewidth', 0, 10 );
  189. folder.add( material, 'shading', constants.shading);
  190. folder.add( material, 'vertexColors', constants.colors).onChange( needsUpdate( material, geometry ) );
  191. folder.add( material, 'fog' );
  192. //folder.add( material, 'lightMap' );
  193. //folder.add( material, 'specularMap' );
  194. //folder.add( material, 'alphaMap' );
  195. //folder.add( material, 'envMap' );
  196. //folder.add( material, 'skinning' );
  197. folder.add( material, 'morphTargets' ).onChange( updateMorphs( mesh, material ) );
  198. //folder.add( material, 'map' );
  199. //folder.add( material, 'combine' );
  200. //folder.add( material, 'relectivity' );
  201. //folder.add( material, 'refractionRatio' );
  202. }
  203. function guiMeshDepthMaterial( gui, mesh, material, geometry ) {
  204. var folder = gui.addFolder('THREE.MeshDepthMaterial');
  205. folder.add( material, 'wireframe' );
  206. folder.add( material, 'wireframeLinewidth', 0, 10 );
  207. folder.add( material, 'morphTargets' ).onChange( updateMorphs( mesh, material ) );
  208. }
  209. function guiMeshNormalMaterial( gui, mesh, material, geometry ) {
  210. var folder = gui.addFolder('THREE.MeshNormalMaterial');
  211. folder.add( material, 'morphTargets');
  212. folder.add( material, 'shading', constants.shading).onChange( needsUpdate( material, geometry ) );
  213. folder.add( material, 'wireframe' );
  214. folder.add( material, 'wireframeLinewidth', 0, 10 );
  215. folder.add( material, 'morphTargets' ).onChange( updateMorphs( mesh, material ) );
  216. }
  217. function guiLineBasicMaterial( gui, mesh, material, geometry ) {
  218. var data = {
  219. color : material.color.getHex()
  220. };
  221. var folder = gui.addFolder('THREE.LineBasicMaterial');
  222. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  223. folder.add( material, 'linewidth', 0, 10 );
  224. folder.add( material, 'linecap', ["butt", "round", "square"] );
  225. folder.add( material, 'linejoin', ["round", "bevel", "miter"] );
  226. folder.add( material, 'vertexColors', constants.colors).onChange( needsUpdate( material, geometry ) );
  227. folder.add( material, 'fog' );
  228. }
  229. function guiMeshLambertMaterial( gui, mesh, material, geometry ) {
  230. var data = {
  231. color : material.color.getHex(),
  232. ambient : material.ambient.getHex(),
  233. emissive : material.emissive.getHex()
  234. };
  235. var folder = gui.addFolder('THREE.MeshLambertMaterial');
  236. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  237. folder.addColor( data, 'ambient' ).onChange( handleColorChange( material.ambient ) );
  238. folder.addColor( data, 'emissive' ).onChange( handleColorChange( material.emissive ) );
  239. folder.add( material, 'shading', constants.shading).onChange( needsUpdate( material, geometry ) );
  240. folder.add( material, 'wireframe' );
  241. folder.add( material, 'wireframeLinewidth', 0, 10 );
  242. folder.add( material, 'vertexColors', constants.colors).onChange( needsUpdate( material, geometry ) );
  243. folder.add( material, 'fog' );
  244. //folder.add( material, 'lightMap' );
  245. //folder.add( material, 'specularMap' );
  246. //folder.add( material, 'alphaMap' );
  247. //folder.add( material, 'envMap', cubes ).onChange( needsUpdate( material, geometry ) );;
  248. //folder.add( material, 'skinning' );
  249. folder.add( material, 'morphTargets' ).onChange( updateMorphs( mesh, material ) );
  250. //folder.add( material, 'map' );
  251. //folder.add( material, 'combine', constants.combine ).onChange( updateMorphs( mesh, material ) );
  252. //folder.add( material, 'relectivity' );
  253. //folder.add( material, 'refractionRatio' );
  254. }
  255. function guiMeshPhongMaterial( gui, mesh, material, geometry ) {
  256. var data = {
  257. color : material.color.getHex(),
  258. ambient : material.ambient.getHex(),
  259. emissive : material.emissive.getHex(),
  260. specular : material.specular.getHex()
  261. };
  262. var folder = gui.addFolder('THREE.MeshPhongMaterial');
  263. folder.addColor( data, 'color' ).onChange( handleColorChange( material.color ) );
  264. folder.addColor( data, 'ambient' ).onChange( handleColorChange( material.ambient ) );
  265. folder.addColor( data, 'emissive' ).onChange( handleColorChange( material.emissive ) );
  266. folder.addColor( data, 'specular' ).onChange( handleColorChange( material.specular ) );
  267. folder.add( material, 'shininess', 0, 100);
  268. folder.add( material, 'shading', constants.shading).onChange( needsUpdate( material, geometry ) );
  269. folder.add( material, 'wireframe' );
  270. folder.add( material, 'wireframeLinewidth', 0, 10 );
  271. folder.add( material, 'vertexColors', constants.colors);
  272. folder.add( material, 'fog' );
  273. }
  274. function chooseFromHash( gui, mesh, geometry ) {
  275. var selectedMaterial = window.location.hash.substring(1) || "MeshBasicMaterial";
  276. var material;
  277. switch (selectedMaterial) {
  278. case "MeshBasicMaterial":
  279. material = new THREE.MeshBasicMaterial({color: 0x2194CE});
  280. guiMaterial( gui, mesh, material, geometry );
  281. guiMeshBasicMaterial( gui, mesh, material, geometry );
  282. return material;
  283. break;
  284. case "MeshLambertMaterial":
  285. material = new THREE.MeshLambertMaterial({color: 0x2194CE});
  286. guiMaterial( gui, mesh, material, geometry );
  287. guiMeshLambertMaterial( gui, mesh, material, geometry );
  288. return material;
  289. break;
  290. case "MeshPhongMaterial":
  291. material = new THREE.MeshPhongMaterial({color: 0x2194CE});
  292. guiMaterial( gui, mesh, material, geometry );
  293. guiMeshPhongMaterial( gui, mesh, material, geometry );
  294. return material;
  295. break;
  296. case "MeshDepthMaterial":
  297. material = new THREE.MeshDepthMaterial({color: 0x2194CE});
  298. guiMaterial( gui, mesh, material, geometry );
  299. guiMeshDepthMaterial( gui, mesh, material, geometry );
  300. return material;
  301. break;
  302. case "MeshNormalMaterial":
  303. material = new THREE.MeshNormalMaterial();
  304. guiMaterial( gui, mesh, material, geometry );
  305. guiMeshNormalMaterial( gui, mesh, material, geometry );
  306. return material;
  307. break;
  308. case "LineBasicMaterial":
  309. material = new THREE.LineBasicMaterial({color: 0x2194CE});
  310. guiMaterial( gui, mesh, material, geometry );
  311. guiLineBasicMaterial( gui, mesh, material, geometry );
  312. return material;
  313. break;
  314. }
  315. }