WebGLRenderer.js 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319
  1. /**
  2. * @author supereggbert / http://www.paulbrunt.co.uk/
  3. * @author mrdoob / http://mrdoob.com/
  4. * @author alteredq / http://alteredqualia.com/
  5. * @author szimek / https://github.com/szimek/
  6. */
  7. THREE.WebGLRenderer = function ( parameters ) {
  8. // Currently you can use just up to 4 directional / point lights total.
  9. // Chrome barfs on shader linking when there are more than 4 lights :(
  10. // The problem comes from shader using too many varying vectors.
  11. // This is not GPU limitation as the same shader works ok in Firefox
  12. // and Chrome with "--use-gl=desktop" flag.
  13. // Difference comes from Chrome on Windows using by default ANGLE,
  14. // thus going DirectX9 route (while FF uses OpenGL).
  15. // See http://code.google.com/p/chromium/issues/detail?id=63491
  16. var _canvas = document.createElement( 'canvas' ), _gl,
  17. _oldProgram = null,
  18. _oldFramebuffer = null,
  19. _modelViewMatrix = new THREE.Matrix4(), _normalMatrix,
  20. _viewMatrixArray = new Float32Array(16),
  21. _modelViewMatrixArray = new Float32Array(16),
  22. _projectionMatrixArray = new Float32Array(16),
  23. _normalMatrixArray = new Float32Array(9),
  24. _objectMatrixArray = new Float32Array(16),
  25. // parameters defaults
  26. antialias = true,
  27. clearColor = new THREE.Color( 0x000000 ),
  28. clearAlpha = 0;
  29. if ( parameters ) {
  30. if ( parameters.antialias !== undefined ) antialias = parameters.antialias;
  31. if ( parameters.clearColor !== undefined ) clearColor.setHex( parameters.clearColor );
  32. if ( parameters.clearAlpha !== undefined ) clearAlpha = parameters.clearAlpha;
  33. }
  34. this.domElement = _canvas;
  35. this.autoClear = true;
  36. initGL( antialias, clearColor, clearAlpha );
  37. this.context = _gl;
  38. //alert( dumpObject( getGLParams() ) );
  39. this.setSize = function ( width, height ) {
  40. _canvas.width = width;
  41. _canvas.height = height;
  42. _gl.viewport( 0, 0, _canvas.width, _canvas.height );
  43. };
  44. this.setClearColor = function( hex, alpha ) {
  45. var color = new THREE.Color( hex );
  46. _gl.clearColor( color.r, color.g, color.b, alpha );
  47. };
  48. this.clear = function () {
  49. _gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT );
  50. };
  51. this.setupLights = function ( program, lights ) {
  52. var l, ll, light, r = 0, g = 0, b = 0,
  53. color, position, intensity,
  54. dcolors = [], dpositions = [],
  55. pcolors = [], ppositions = [];
  56. for ( l = 0, ll = lights.length; l < ll; l++ ) {
  57. light = lights[ l ];
  58. color = light.color;
  59. position = light.position;
  60. intensity = light.intensity;
  61. if ( light instanceof THREE.AmbientLight ) {
  62. r += color.r;
  63. g += color.g;
  64. b += color.b;
  65. } else if ( light instanceof THREE.DirectionalLight ) {
  66. dcolors.push( color.r * intensity,
  67. color.g * intensity,
  68. color.b * intensity );
  69. dpositions.push( position.x,
  70. position.y,
  71. position.z );
  72. } else if( light instanceof THREE.PointLight ) {
  73. pcolors.push( color.r * intensity,
  74. color.g * intensity,
  75. color.b * intensity );
  76. ppositions.push( position.x,
  77. position.y,
  78. position.z );
  79. }
  80. }
  81. return { ambient: [ r, g, b ], directional: { colors: dcolors, positions: dpositions }, point: { colors: pcolors, positions: ppositions } };
  82. };
  83. this.createParticleBuffers = function( geometry ) {
  84. geometry.__webGLVertexBuffer = _gl.createBuffer();
  85. geometry.__webGLFaceBuffer = _gl.createBuffer();
  86. };
  87. this.createLineBuffers = function( geometry ) {
  88. geometry.__webGLVertexBuffer = _gl.createBuffer();
  89. geometry.__webGLLineBuffer = _gl.createBuffer();
  90. };
  91. this.createMeshBuffers = function( geometryChunk ) {
  92. geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
  93. geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
  94. geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
  95. geometryChunk.__webGLUVBuffer = _gl.createBuffer();
  96. geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
  97. geometryChunk.__webGLLineBuffer = _gl.createBuffer();
  98. };
  99. this.initLineBuffers = function( geometry ) {
  100. var nvertices = geometry.vertices.length;
  101. geometry.__vertexArray = new Float32Array( nvertices * 3 );
  102. geometry.__lineArray = new Uint16Array( nvertices );
  103. geometry.__webGLLineCount = nvertices;
  104. };
  105. this.initMeshBuffers = function( geometryChunk, object ) {
  106. var f, fl, nvertices = 0, ntris = 0, nlines = 0,
  107. obj_faces = object.geometry.faces,
  108. chunk_faces = geometryChunk.faces;
  109. for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
  110. fi = chunk_faces[ f ];
  111. face = obj_faces[ fi ];
  112. if ( face instanceof THREE.Face3 ) {
  113. nvertices += 3;
  114. ntris += 1;
  115. nlines += 3;
  116. } else if ( face instanceof THREE.Face4 ) {
  117. nvertices += 4;
  118. ntris += 2;
  119. nlines += 5;
  120. }
  121. }
  122. // TODO: only create arrays for attributes existing in the object
  123. geometryChunk.__vertexArray = new Float32Array( nvertices * 3 );
  124. geometryChunk.__normalArray = new Float32Array( nvertices * 3 );
  125. geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
  126. geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
  127. geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
  128. geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
  129. geometryChunk.__needsSmoothNormals = bufferNeedsSmoothNormals ( geometryChunk, object );
  130. geometryChunk.__webGLFaceCount = ntris * 3;
  131. geometryChunk.__webGLLineCount = nlines * 2;
  132. };
  133. this.setMeshBuffers = function ( geometryChunk, object, hint, dirtyVertices, dirtyElements, dirtyUvs, dirtyNormals, dirtyTangents ) {
  134. var f, fl, fi, face, vertexNormals, faceNormal, normal, uv, v1, v2, v3, v4, t1, t2, t3, t4, m, ml, i,
  135. vn, uvi,
  136. vertexIndex = 0,
  137. offset = 0,
  138. offset_uv = 0,
  139. offset_face = 0,
  140. offset_normal = 0,
  141. offset_tangent = 0,
  142. offset_line = 0,
  143. vertexArray = geometryChunk.__vertexArray,
  144. uvArray = geometryChunk.__uvArray,
  145. normalArray = geometryChunk.__normalArray,
  146. tangentArray = geometryChunk.__tangentArray,
  147. faceArray = geometryChunk.__faceArray,
  148. lineArray = geometryChunk.__lineArray,
  149. needsSmoothNormals = geometryChunk.__needsSmoothNormals,
  150. geometry = object.geometry,
  151. vertices = geometry.vertices,
  152. chunk_faces = geometryChunk.faces,
  153. obj_faces = geometry.faces,
  154. obj_uvs = geometry.uvs;
  155. for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
  156. fi = chunk_faces[ f ];
  157. face = obj_faces[ fi ];
  158. uv = obj_uvs[ fi ];
  159. vertexNormals = face.vertexNormals;
  160. faceNormal = face.normal;
  161. if ( face instanceof THREE.Face3 ) {
  162. if ( dirtyVertices ) {
  163. v1 = vertices[ face.a ].position;
  164. v2 = vertices[ face.b ].position;
  165. v3 = vertices[ face.c ].position;
  166. vertexArray[ offset ] = v1.x;
  167. vertexArray[ offset + 1 ] = v1.y;
  168. vertexArray[ offset + 2 ] = v1.z;
  169. vertexArray[ offset + 3 ] = v2.x;
  170. vertexArray[ offset + 4 ] = v2.y;
  171. vertexArray[ offset + 5 ] = v2.z;
  172. vertexArray[ offset + 6 ] = v3.x;
  173. vertexArray[ offset + 7 ] = v3.y;
  174. vertexArray[ offset + 8 ] = v3.z;
  175. offset += 9;
  176. }
  177. if ( dirtyTangents && geometry.hasTangents ) {
  178. t1 = vertices[ face.a ].tangent;
  179. t2 = vertices[ face.b ].tangent;
  180. t3 = vertices[ face.c ].tangent;
  181. tangentArray[ offset_tangent ] = t1.x;
  182. tangentArray[ offset_tangent + 1 ] = t1.y;
  183. tangentArray[ offset_tangent + 2 ] = t1.z;
  184. tangentArray[ offset_tangent + 3 ] = t1.w;
  185. tangentArray[ offset_tangent + 4 ] = t2.x;
  186. tangentArray[ offset_tangent + 5 ] = t2.y;
  187. tangentArray[ offset_tangent + 6 ] = t2.z;
  188. tangentArray[ offset_tangent + 7 ] = t2.w;
  189. tangentArray[ offset_tangent + 8 ] = t3.x;
  190. tangentArray[ offset_tangent + 9 ] = t3.y;
  191. tangentArray[ offset_tangent + 10 ] = t3.z;
  192. tangentArray[ offset_tangent + 11 ] = t3.w;
  193. offset_tangent += 12;
  194. }
  195. if( dirtyNormals ) {
  196. if ( vertexNormals.length == 3 && needsSmoothNormals ) {
  197. for ( i = 0; i < 3; i ++ ) {
  198. vn = vertexNormals[ i ];
  199. normalArray[ offset_normal ] = vn.x;
  200. normalArray[ offset_normal + 1 ] = vn.y;
  201. normalArray[ offset_normal + 2 ] = vn.z;
  202. offset_normal += 3;
  203. }
  204. } else {
  205. for ( i = 0; i < 3; i ++ ) {
  206. normalArray[ offset_normal ] = faceNormal.x;
  207. normalArray[ offset_normal + 1 ] = faceNormal.y;
  208. normalArray[ offset_normal + 2 ] = faceNormal.z;
  209. offset_normal += 3;
  210. }
  211. }
  212. }
  213. if ( dirtyUvs && uv ) {
  214. for ( i = 0; i < 3; i ++ ) {
  215. uvi = uv[ i ];
  216. uvArray[ offset_uv ] = uvi.u;
  217. uvArray[ offset_uv + 1 ] = uvi.v;
  218. offset_uv += 2;
  219. }
  220. }
  221. if( dirtyElements ) {
  222. faceArray[ offset_face ] = vertexIndex;
  223. faceArray[ offset_face + 1 ] = vertexIndex + 1;
  224. faceArray[ offset_face + 2 ] = vertexIndex + 2;
  225. offset_face += 3;
  226. lineArray[ offset_line ] = vertexIndex;
  227. lineArray[ offset_line + 1 ] = vertexIndex + 1;
  228. lineArray[ offset_line + 2 ] = vertexIndex;
  229. lineArray[ offset_line + 3 ] = vertexIndex + 2;
  230. lineArray[ offset_line + 4 ] = vertexIndex + 1;
  231. lineArray[ offset_line + 5 ] = vertexIndex + 2;
  232. offset_line += 6;
  233. vertexIndex += 3;
  234. }
  235. } else if ( face instanceof THREE.Face4 ) {
  236. if ( dirtyVertices ) {
  237. v1 = vertices[ face.a ].position;
  238. v2 = vertices[ face.b ].position;
  239. v3 = vertices[ face.c ].position;
  240. v4 = vertices[ face.d ].position;
  241. vertexArray[ offset ] = v1.x;
  242. vertexArray[ offset + 1 ] = v1.y;
  243. vertexArray[ offset + 2 ] = v1.z;
  244. vertexArray[ offset + 3 ] = v2.x;
  245. vertexArray[ offset + 4 ] = v2.y;
  246. vertexArray[ offset + 5 ] = v2.z;
  247. vertexArray[ offset + 6 ] = v3.x;
  248. vertexArray[ offset + 7 ] = v3.y;
  249. vertexArray[ offset + 8 ] = v3.z;
  250. vertexArray[ offset + 9 ] = v4.x;
  251. vertexArray[ offset + 10 ] = v4.y;
  252. vertexArray[ offset + 11 ] = v4.z;
  253. offset += 12;
  254. }
  255. if ( dirtyTangents && geometry.hasTangents ) {
  256. t1 = vertices[ face.a ].tangent;
  257. t2 = vertices[ face.b ].tangent;
  258. t3 = vertices[ face.c ].tangent;
  259. t4 = vertices[ face.d ].tangent;
  260. tangentArray[ offset_tangent ] = t1.x;
  261. tangentArray[ offset_tangent + 1 ] = t1.y;
  262. tangentArray[ offset_tangent + 2 ] = t1.z;
  263. tangentArray[ offset_tangent + 3 ] = t1.w;
  264. tangentArray[ offset_tangent + 4 ] = t2.x;
  265. tangentArray[ offset_tangent + 5 ] = t2.y;
  266. tangentArray[ offset_tangent + 6 ] = t2.z;
  267. tangentArray[ offset_tangent + 7 ] = t2.w;
  268. tangentArray[ offset_tangent + 8 ] = t3.x;
  269. tangentArray[ offset_tangent + 9 ] = t3.y;
  270. tangentArray[ offset_tangent + 10 ] = t3.z;
  271. tangentArray[ offset_tangent + 11 ] = t3.w;
  272. tangentArray[ offset_tangent + 12 ] = t4.x;
  273. tangentArray[ offset_tangent + 13 ] = t4.y;
  274. tangentArray[ offset_tangent + 14 ] = t4.z;
  275. tangentArray[ offset_tangent + 15 ] = t4.w;
  276. offset_tangent += 16;
  277. }
  278. if( dirtyNormals ) {
  279. if ( vertexNormals.length == 4 && needsSmoothNormals ) {
  280. for ( i = 0; i < 4; i ++ ) {
  281. vn = vertexNormals[ i ];
  282. normalArray[ offset_normal ] = vn.x;
  283. normalArray[ offset_normal + 1 ] = vn.y;
  284. normalArray[ offset_normal + 2 ] = vn.z;
  285. offset_normal += 3;
  286. }
  287. } else {
  288. for ( i = 0; i < 4; i ++ ) {
  289. normalArray[ offset_normal ] = faceNormal.x;
  290. normalArray[ offset_normal + 1 ] = faceNormal.y;
  291. normalArray[ offset_normal + 2 ] = faceNormal.z;
  292. offset_normal += 3;
  293. }
  294. }
  295. }
  296. if ( dirtyUvs && uv ) {
  297. for ( i = 0; i < 4; i ++ ) {
  298. uvi = uv[ i ];
  299. uvArray[ offset_uv ] = uvi.u;
  300. uvArray[ offset_uv + 1 ] = uvi.v;
  301. offset_uv += 2;
  302. }
  303. }
  304. if( dirtyElements ) {
  305. faceArray[ offset_face ] = vertexIndex;
  306. faceArray[ offset_face + 1 ] = vertexIndex + 1;
  307. faceArray[ offset_face + 2 ] = vertexIndex + 2;
  308. faceArray[ offset_face + 3 ] = vertexIndex;
  309. faceArray[ offset_face + 4 ] = vertexIndex + 2;
  310. faceArray[ offset_face + 5 ] = vertexIndex + 3;
  311. offset_face += 6;
  312. lineArray[ offset_line ] = vertexIndex;
  313. lineArray[ offset_line + 1 ] = vertexIndex + 1;
  314. lineArray[ offset_line + 2 ] = vertexIndex;
  315. lineArray[ offset_line + 3 ] = vertexIndex + 2;
  316. lineArray[ offset_line + 4 ] = vertexIndex;
  317. lineArray[ offset_line + 5 ] = vertexIndex + 3;
  318. lineArray[ offset_line + 6 ] = vertexIndex + 1;
  319. lineArray[ offset_line + 7 ] = vertexIndex + 2;
  320. lineArray[ offset_line + 8 ] = vertexIndex + 2;
  321. lineArray[ offset_line + 9 ] = vertexIndex + 3;
  322. offset_line += 10;
  323. vertexIndex += 4;
  324. }
  325. }
  326. }
  327. if ( dirtyVertices ) {
  328. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
  329. _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
  330. }
  331. if ( dirtyNormals ) {
  332. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
  333. _gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
  334. }
  335. if ( dirtyTangents && geometry.hasTangents ) {
  336. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
  337. _gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
  338. }
  339. if ( dirtyUvs && offset_uv > 0 ) {
  340. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
  341. _gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
  342. }
  343. if( dirtyElements ) {
  344. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
  345. _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
  346. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
  347. _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
  348. }
  349. };
  350. this.setLineBuffers = function( geometry, hint, dirtyVertices, dirtyElements ) {
  351. var v, vertex, offset,
  352. vertices = geometry.vertices,
  353. vl = vertices.length,
  354. vertexArray = geometry.__vertexArray,
  355. lineArray = geometry.__lineArray;
  356. if ( dirtyVertices ) {
  357. for ( v = 0; v < vl; v++ ) {
  358. vertex = vertices[ v ].position;
  359. offset = v * 3;
  360. vertexArray[ offset ] = vertex.x;
  361. vertexArray[ offset + 1 ] = vertex.y;
  362. vertexArray[ offset + 2 ] = vertex.z;
  363. }
  364. }
  365. // yeah, this is silly as order of element indices is currently fixed
  366. // though this could change if some use case arises
  367. if ( dirtyElements ) {
  368. for ( v = 0; v < vl; v++ ) {
  369. lineArray[ v ] = v;
  370. }
  371. }
  372. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
  373. _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
  374. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLLineBuffer );
  375. _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
  376. };
  377. this.setParticleBuffers = function( geometry, hint, dirtyVertices, dirtyElements ) {
  378. };
  379. function setMaterialShaders( material, shaders ) {
  380. material.fragment_shader = shaders.fragment_shader;
  381. material.vertex_shader = shaders.vertex_shader;
  382. material.uniforms = Uniforms.clone( shaders.uniforms );
  383. };
  384. function refreshUniformsCommon( material, fog ) {
  385. // premultiply alpha
  386. material.uniforms.color.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
  387. // pure color
  388. //material.uniforms.color.value.setHex( material.color.hex );
  389. material.uniforms.opacity.value = material.opacity;
  390. material.uniforms.map.texture = material.map;
  391. material.uniforms.env_map.texture = material.env_map;
  392. material.uniforms.reflectivity.value = material.reflectivity;
  393. material.uniforms.refraction_ratio.value = material.refraction_ratio;
  394. material.uniforms.combine.value = material.combine;
  395. material.uniforms.useRefract.value = material.env_map && material.env_map.mapping instanceof THREE.CubeRefractionMapping;
  396. if ( fog ) {
  397. material.uniforms.fogColor.value.setHex( fog.color.hex );
  398. if ( fog instanceof THREE.Fog ) {
  399. material.uniforms.fogNear.value = fog.near;
  400. material.uniforms.fogFar.value = fog.far;
  401. } else if ( fog instanceof THREE.FogExp2 ) {
  402. material.uniforms.fogDensity.value = fog.density;
  403. }
  404. }
  405. };
  406. function refreshUniformsLine( material, fog ) {
  407. material.uniforms.color.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
  408. material.uniforms.opacity.value = material.opacity;
  409. if ( fog ) {
  410. material.uniforms.fogColor.value.setHex( fog.color.hex );
  411. if ( fog instanceof THREE.Fog ) {
  412. material.uniforms.fogNear.value = fog.near;
  413. material.uniforms.fogFar.value = fog.far;
  414. } else if ( fog instanceof THREE.FogExp2 ) {
  415. material.uniforms.fogDensity.value = fog.density;
  416. }
  417. }
  418. };
  419. function refreshUniformsPhong( material ) {
  420. //material.uniforms.ambient.value.setHex( material.ambient.hex );
  421. //material.uniforms.specular.value.setHex( material.specular.hex );
  422. material.uniforms.ambient.value.setRGB( material.ambient.r, material.ambient.g, material.ambient.b );
  423. material.uniforms.specular.value.setRGB( material.specular.r, material.specular.g, material.specular.b );
  424. material.uniforms.shininess.value = material.shininess;
  425. };
  426. function refreshLights( material, lights ) {
  427. material.uniforms.enableLighting.value = lights.directional.positions.length + lights.point.positions.length;
  428. material.uniforms.ambientLightColor.value = lights.ambient;
  429. material.uniforms.directionalLightColor.value = lights.directional.colors;
  430. material.uniforms.directionalLightDirection.value = lights.directional.positions;
  431. material.uniforms.pointLightColor.value = lights.point.colors;
  432. material.uniforms.pointLightPosition.value = lights.point.positions;
  433. };
  434. this.renderBuffer = function ( camera, lights, fog, material, geometryChunk, object ) {
  435. var program, u, identifiers, attributes, parameters, vector_lights, maxLightCount, linewidth, primitives;
  436. if ( !material.program ) {
  437. if ( material instanceof THREE.MeshDepthMaterial ) {
  438. setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
  439. material.uniforms.mNear.value = camera.near;
  440. material.uniforms.mFar.value = camera.far;
  441. } else if ( material instanceof THREE.MeshNormalMaterial ) {
  442. setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
  443. } else if ( material instanceof THREE.MeshBasicMaterial ) {
  444. setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
  445. refreshUniformsCommon( material, fog );
  446. } else if ( material instanceof THREE.MeshLambertMaterial ) {
  447. setMaterialShaders( material, THREE.ShaderLib[ 'lambert' ] );
  448. refreshUniformsCommon( material, fog );
  449. } else if ( material instanceof THREE.MeshPhongMaterial ) {
  450. setMaterialShaders( material, THREE.ShaderLib[ 'phong' ] );
  451. refreshUniformsCommon( material, fog );
  452. } else if ( material instanceof THREE.LineBasicMaterial ) {
  453. setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
  454. refreshUniformsLine( material, fog );
  455. }
  456. // heuristics to create shader parameters according to lights in the scene
  457. // (not to blow over maxLights budget)
  458. maxLightCount = allocateLights( lights, 4 );
  459. parameters = { fog: fog, map: material.map, env_map: material.env_map, maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point };
  460. material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
  461. identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
  462. for( u in material.uniforms ) {
  463. identifiers.push(u);
  464. }
  465. cacheUniformLocations( material.program, identifiers );
  466. cacheAttributeLocations( material.program, [ "position", "normal", "uv", "tangent" ] );
  467. }
  468. program = material.program;
  469. if( program != _oldProgram ) {
  470. _gl.useProgram( program );
  471. _oldProgram = program;
  472. }
  473. this.loadCamera( program, camera );
  474. this.loadMatrices( program );
  475. if ( material instanceof THREE.MeshPhongMaterial ||
  476. material instanceof THREE.MeshLambertMaterial ) {
  477. vector_lights = this.setupLights( program, lights );
  478. refreshLights( material, vector_lights );
  479. }
  480. if ( material instanceof THREE.MeshBasicMaterial ||
  481. material instanceof THREE.MeshLambertMaterial ||
  482. material instanceof THREE.MeshPhongMaterial ) {
  483. refreshUniformsCommon( material, fog );
  484. }
  485. if ( material instanceof THREE.LineBasicMaterial ) {
  486. refreshUniformsLine( material, fog );
  487. }
  488. if ( material instanceof THREE.MeshPhongMaterial ) {
  489. refreshUniformsPhong( material );
  490. }
  491. setUniforms( program, material.uniforms );
  492. attributes = program.attributes;
  493. // vertices
  494. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
  495. _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
  496. _gl.enableVertexAttribArray( attributes.position );
  497. // normals
  498. if ( attributes.normal >= 0 ) {
  499. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
  500. _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
  501. _gl.enableVertexAttribArray( attributes.normal );
  502. }
  503. // tangents
  504. if ( attributes.tangent >= 0 ) {
  505. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
  506. _gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
  507. _gl.enableVertexAttribArray( attributes.tangent );
  508. }
  509. // uvs
  510. if ( attributes.uv >= 0 ) {
  511. if ( geometryChunk.__webGLUVBuffer ) {
  512. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
  513. _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
  514. _gl.enableVertexAttribArray( attributes.uv );
  515. } else {
  516. _gl.disableVertexAttribArray( attributes.uv );
  517. }
  518. }
  519. // render lines
  520. if ( material.wireframe || material instanceof THREE.LineBasicMaterial ) {
  521. linewidth = material.wireframe_linewidth !== undefined ? material.wireframe_linewidth :
  522. material.linewidth !== undefined ? material.linewidth : 1;
  523. primitives = material instanceof THREE.LineBasicMaterial && object.type == THREE.LineStrip ? _gl.LINE_STRIP : _gl.LINES;
  524. _gl.lineWidth( linewidth );
  525. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
  526. _gl.drawElements( primitives, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
  527. // render triangles
  528. } else {
  529. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
  530. _gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
  531. }
  532. };
  533. this.renderPass = function ( camera, lights, fog, object, geometryChunk, blending, transparent ) {
  534. var i, l, m, ml, material, meshMaterial;
  535. for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
  536. meshMaterial = object.materials[ m ];
  537. if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
  538. for ( i = 0, l = geometryChunk.materials.length; i < l; i++ ) {
  539. material = geometryChunk.materials[ i ];
  540. if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
  541. this.setBlending( material.blending );
  542. this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
  543. }
  544. }
  545. } else {
  546. material = meshMaterial;
  547. if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
  548. this.setBlending( material.blending );
  549. this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
  550. }
  551. }
  552. }
  553. };
  554. this.render = function( scene, camera, renderTarget ) {
  555. var o, ol, webGLObject, object, buffer,
  556. lights = scene.lights,
  557. fog = scene.fog;
  558. this.initWebGLObjects( scene );
  559. setRenderTarget( renderTarget );
  560. if ( this.autoClear ) {
  561. this.clear();
  562. }
  563. camera.autoUpdateMatrix && camera.updateMatrix();
  564. _viewMatrixArray.set( camera.matrix.flatten() );
  565. _projectionMatrixArray.set( camera.projectionMatrix.flatten() );
  566. // opaque pass
  567. for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) {
  568. webGLObject = scene.__webGLObjects[ o ];
  569. object = webGLObject.object;
  570. buffer = webGLObject.buffer;
  571. if ( object.visible ) {
  572. this.setupMatrices( object, camera );
  573. this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );
  574. }
  575. }
  576. // transparent pass
  577. for ( o = 0, ol = scene.__webGLObjects.length; o < ol; o++ ) {
  578. webGLObject = scene.__webGLObjects[ o ];
  579. object = webGLObject.object;
  580. buffer = webGLObject.buffer;
  581. if ( object.visible ) {
  582. this.setupMatrices( object, camera );
  583. // opaque blended materials
  584. this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, false );
  585. this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, false );
  586. // transparent blended materials
  587. this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
  588. this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
  589. // transparent normal materials
  590. this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, true );
  591. }
  592. }
  593. // Generate mipmap if we're using any kind of mipmap filtering
  594. if ( renderTarget && renderTarget.min_filter !== THREE.NearestFilter && renderTarget.min_filter !== THREE.LinearFilter ) {
  595. updateRenderTargetMipmap( renderTarget );
  596. }
  597. };
  598. this.initWebGLObjects = function( scene ) {
  599. function add_buffer( objmap, id, buffer, object ) {
  600. if ( objmap[ id ] == undefined ) {
  601. scene.__webGLObjects.push( { buffer: buffer, object: object } );
  602. objmap[ id ] = 1;
  603. }
  604. };
  605. var o, ol, object, g, geometry, geometryChunk, objmap;
  606. if ( !scene.__webGLObjects ) {
  607. scene.__webGLObjects = [];
  608. scene.__webGLObjectsMap = {};
  609. }
  610. for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {
  611. object = scene.objects[ o ];
  612. geometry = object.geometry;
  613. if ( scene.__webGLObjectsMap[ object.id ] == undefined ) {
  614. scene.__webGLObjectsMap[ object.id ] = {};
  615. }
  616. objmap = scene.__webGLObjectsMap[ object.id ];
  617. if ( object instanceof THREE.Mesh ) {
  618. // create separate VBOs per geometry chunk
  619. for ( g in geometry.geometryChunks ) {
  620. geometryChunk = geometry.geometryChunks[ g ];
  621. // initialise VBO on the first access
  622. if( ! geometryChunk.__webGLVertexBuffer ) {
  623. this.createMeshBuffers( geometryChunk );
  624. this.initMeshBuffers( geometryChunk, object );
  625. geometry.__dirtyVertices = true;
  626. geometry.__dirtyElements = true;
  627. geometry.__dirtyUvs = true;
  628. geometry.__dirtyNormals = true;
  629. geometry.__dirtyTangents = true;
  630. }
  631. if( geometry.__dirtyVertices || geometry.__dirtyElements || geometry.__dirtyUvs ) {
  632. this.setMeshBuffers( geometryChunk, object, _gl.DYNAMIC_DRAW,
  633. geometry.__dirtyVertices, geometry.__dirtyElements, geometry.__dirtyUvs,
  634. geometry.__dirtyNormals, geometry.__dirtyTangents );
  635. }
  636. // create separate wrapper per each use of VBO
  637. add_buffer( objmap, g, geometryChunk, object );
  638. }
  639. geometry.__dirtyVertices = false;
  640. geometry.__dirtyElements = false;
  641. geometry.__dirtyUvs = false;
  642. geometry.__dirtyNormals = false;
  643. geometry.__dirtyTangents = false;
  644. } else if ( object instanceof THREE.Line ) {
  645. if( ! geometry.__webGLVertexBuffer ) {
  646. this.createLineBuffers( geometry );
  647. this.initLineBuffers( geometry );
  648. geometry.__dirtyVertices = true;
  649. geometry.__dirtyElements = true;
  650. }
  651. if( geometry.__dirtyVertices ) {
  652. this.setLineBuffers( geometry, _gl.DYNAMIC_DRAW, geometry.__dirtyVertices, geometry.__dirtyElements );
  653. }
  654. add_buffer( objmap, 0, geometry, object );
  655. geometry.__dirtyVertices = false;
  656. geometry.__dirtyElements = false;
  657. } else if ( object instanceof THREE.ParticleSystem ) {
  658. if( ! geometry.__webGLVertexBuffer ) {
  659. this.createParticleBuffers( geometry );
  660. }
  661. add_buffer( objmap, 0, geometry, object );
  662. }/*else if ( object instanceof THREE.Particle ) {
  663. }*/
  664. }
  665. };
  666. this.removeObject = function ( scene, object ) {
  667. var o, ol, zobject;
  668. for ( o = scene.__webGLObjects.length - 1; o >= 0; o-- ) {
  669. zobject = scene.__webGLObjects[ o ].object;
  670. if ( object == zobject ) {
  671. scene.__webGLObjects.splice( o, 1 );
  672. }
  673. }
  674. };
  675. this.setupMatrices = function ( object, camera ) {
  676. object.autoUpdateMatrix && object.updateMatrix();
  677. _modelViewMatrix.multiply( camera.matrix, object.matrix );
  678. _modelViewMatrixArray.set( _modelViewMatrix.flatten() );
  679. _normalMatrix = THREE.Matrix4.makeInvert3x3( _modelViewMatrix ).transpose();
  680. _normalMatrixArray.set( _normalMatrix.m );
  681. _objectMatrixArray.set( object.matrix.flatten() );
  682. };
  683. this.loadMatrices = function ( program ) {
  684. _gl.uniformMatrix4fv( program.uniforms.viewMatrix, false, _viewMatrixArray );
  685. _gl.uniformMatrix4fv( program.uniforms.modelViewMatrix, false, _modelViewMatrixArray );
  686. _gl.uniformMatrix4fv( program.uniforms.projectionMatrix, false, _projectionMatrixArray );
  687. _gl.uniformMatrix3fv( program.uniforms.normalMatrix, false, _normalMatrixArray );
  688. _gl.uniformMatrix4fv( program.uniforms.objectMatrix, false, _objectMatrixArray );
  689. };
  690. this.loadCamera = function( program, camera ) {
  691. _gl.uniform3f( program.uniforms.cameraPosition, camera.position.x, camera.position.y, camera.position.z );
  692. };
  693. this.setBlending = function( blending ) {
  694. switch ( blending ) {
  695. case THREE.AdditiveBlending:
  696. _gl.blendEquation( _gl.FUNC_ADD );
  697. _gl.blendFunc( _gl.ONE, _gl.ONE );
  698. break;
  699. case THREE.SubtractiveBlending:
  700. //_gl.blendEquation( _gl.FUNC_SUBTRACT );
  701. _gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );
  702. break;
  703. default:
  704. _gl.blendEquation( _gl.FUNC_ADD );
  705. _gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
  706. break;
  707. }
  708. };
  709. this.setFaceCulling = function ( cullFace, frontFace ) {
  710. if ( cullFace ) {
  711. if ( !frontFace || frontFace == "ccw" ) {
  712. _gl.frontFace( _gl.CCW );
  713. } else {
  714. _gl.frontFace( _gl.CW );
  715. }
  716. if( cullFace == "back" ) {
  717. _gl.cullFace( _gl.BACK );
  718. } else if( cullFace == "front" ) {
  719. _gl.cullFace( _gl.FRONT );
  720. } else {
  721. _gl.cullFace( _gl.FRONT_AND_BACK );
  722. }
  723. _gl.enable( _gl.CULL_FACE );
  724. } else {
  725. _gl.disable( _gl.CULL_FACE );
  726. }
  727. };
  728. this.supportsVertexTextures = function() {
  729. return maxVertexTextures() > 0;
  730. };
  731. function maxVertexTextures() {
  732. return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
  733. };
  734. function initGL( antialias, clearColor, clearAlpha ) {
  735. try {
  736. _gl = _canvas.getContext( 'experimental-webgl', { antialias: antialias } );
  737. } catch(e) { }
  738. if (!_gl) {
  739. alert("WebGL not supported");
  740. throw "cannot create webgl context";
  741. }
  742. _gl.clearColor( 0, 0, 0, 1 );
  743. _gl.clearDepth( 1 );
  744. _gl.enable( _gl.DEPTH_TEST );
  745. _gl.depthFunc( _gl.LEQUAL );
  746. _gl.frontFace( _gl.CCW );
  747. _gl.cullFace( _gl.BACK );
  748. _gl.enable( _gl.CULL_FACE );
  749. _gl.enable( _gl.BLEND );
  750. _gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
  751. _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
  752. };
  753. function buildProgram( fragment_shader, vertex_shader, parameters ) {
  754. var program = _gl.createProgram(),
  755. prefix_fragment = [
  756. "#ifdef GL_ES",
  757. "precision highp float;",
  758. "#endif",
  759. "#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
  760. "#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
  761. parameters.fog ? "#define USE_FOG" : "",
  762. parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
  763. parameters.map ? "#define USE_MAP" : "",
  764. parameters.env_map ? "#define USE_ENVMAP" : "",
  765. "uniform mat4 viewMatrix;",
  766. "uniform vec3 cameraPosition;",
  767. ""
  768. ].join("\n"),
  769. prefix_vertex = [
  770. maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
  771. "#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
  772. "#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
  773. parameters.map ? "#define USE_MAP" : "",
  774. parameters.env_map ? "#define USE_ENVMAP" : "",
  775. "uniform mat4 objectMatrix;",
  776. "uniform mat4 modelViewMatrix;",
  777. "uniform mat4 projectionMatrix;",
  778. "uniform mat4 viewMatrix;",
  779. "uniform mat3 normalMatrix;",
  780. "uniform vec3 cameraPosition;",
  781. "attribute vec3 position;",
  782. "attribute vec3 normal;",
  783. "attribute vec2 uv;",
  784. ""
  785. ].join("\n");
  786. _gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
  787. _gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
  788. _gl.linkProgram( program );
  789. if ( !_gl.getProgramParameter( program, _gl.LINK_STATUS ) ) {
  790. alert( "Could not initialise shaders\n"+
  791. "VALIDATE_STATUS: " + _gl.getProgramParameter( program, _gl.VALIDATE_STATUS ) + ", gl error [" + _gl.getError() + "]" );
  792. //console.log( prefix_fragment + fragment_shader );
  793. //console.log( prefix_vertex + vertex_shader );
  794. }
  795. program.uniforms = {};
  796. program.attributes = {};
  797. return program;
  798. };
  799. function setUniforms( program, uniforms ) {
  800. var u, uniform, value, type, location, texture;
  801. for( u in uniforms ) {
  802. location = program.uniforms[u];
  803. if ( !location ) continue;
  804. uniform = uniforms[u];
  805. type = uniform.type;
  806. value = uniform.value;
  807. if( type == "i" ) {
  808. _gl.uniform1i( location, value );
  809. } else if( type == "f" ) {
  810. _gl.uniform1f( location, value );
  811. } else if( type == "fv" ) {
  812. _gl.uniform3fv( location, value );
  813. } else if( type == "v2" ) {
  814. _gl.uniform2f( location, value.x, value.y );
  815. } else if( type == "v3" ) {
  816. _gl.uniform3f( location, value.x, value.y, value.z );
  817. } else if( type == "c" ) {
  818. _gl.uniform3f( location, value.r, value.g, value.b );
  819. } else if( type == "t" ) {
  820. _gl.uniform1i( location, value );
  821. texture = uniform.texture;
  822. if ( !texture ) continue;
  823. if ( texture.image instanceof Array && texture.image.length == 6 ) {
  824. setCubeTexture( texture, value );
  825. } else {
  826. setTexture( texture, value );
  827. }
  828. }
  829. }
  830. };
  831. function setCubeTexture( texture, slot ) {
  832. if ( texture.image.length == 6 ) {
  833. if ( !texture.image.__webGLTextureCube &&
  834. !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
  835. texture.image.__webGLTextureCube = _gl.createTexture();
  836. _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
  837. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
  838. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
  839. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, _gl.LINEAR );
  840. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, _gl.LINEAR_MIPMAP_LINEAR );
  841. for ( var i = 0; i < 6; ++i ) {
  842. _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image[ i ] );
  843. }
  844. _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
  845. _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
  846. texture.image.__cubeMapInitialized = true;
  847. }
  848. _gl.activeTexture( _gl.TEXTURE0 + slot );
  849. _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
  850. }
  851. };
  852. function setTexture( texture, slot ) {
  853. if ( !texture.__webGLTexture && texture.image.loaded ) {
  854. texture.__webGLTexture = _gl.createTexture();
  855. _gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
  856. _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
  857. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrap_s ) );
  858. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrap_t ) );
  859. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.mag_filter ) );
  860. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.min_filter ) );
  861. _gl.generateMipmap( _gl.TEXTURE_2D );
  862. _gl.bindTexture( _gl.TEXTURE_2D, null );
  863. }
  864. _gl.activeTexture( _gl.TEXTURE0 + slot );
  865. _gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
  866. };
  867. function setRenderTarget( renderTexture ) {
  868. if ( renderTexture && !renderTexture.__webGLFramebuffer ) {
  869. renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
  870. renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
  871. renderTexture.__webGLTexture = _gl.createTexture();
  872. // Setup renderbuffer
  873. _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
  874. _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );
  875. // Setup texture
  876. _gl.bindTexture( _gl.TEXTURE_2D, renderTexture.__webGLTexture );
  877. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( renderTexture.wrap_s ) );
  878. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( renderTexture.wrap_t ) );
  879. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( renderTexture.mag_filter ) );
  880. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( renderTexture.min_filter ) );
  881. _gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
  882. // Setup framebuffer
  883. _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
  884. _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
  885. _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
  886. // Release everything
  887. _gl.bindTexture( _gl.TEXTURE_2D, null );
  888. _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
  889. _gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
  890. }
  891. var framebuffer, width, height;
  892. if ( renderTexture ) {
  893. framebuffer = renderTexture.__webGLFramebuffer;
  894. width = renderTexture.width;
  895. height = renderTexture.height;
  896. } else {
  897. framebuffer = null;
  898. width = _canvas.width;
  899. height = _canvas.height;
  900. }
  901. if( framebuffer != _oldFramebuffer ) {
  902. _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
  903. _gl.viewport( 0, 0, width, height );
  904. _oldFramebuffer = framebuffer;
  905. }
  906. };
  907. function updateRenderTargetMipmap( renderTarget ) {
  908. _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
  909. _gl.generateMipmap( _gl.TEXTURE_2D );
  910. _gl.bindTexture( _gl.TEXTURE_2D, null );
  911. };
  912. function cacheUniformLocations( program, identifiers ) {
  913. var i, l, id;
  914. for( i = 0, l = identifiers.length; i < l; i++ ) {
  915. id = identifiers[ i ];
  916. program.uniforms[ id ] = _gl.getUniformLocation( program, id );
  917. }
  918. };
  919. function cacheAttributeLocations( program, identifiers ) {
  920. var i, l, id;
  921. for( i = 0, l = identifiers.length; i < l; i++ ) {
  922. id = identifiers[ i ];
  923. program.attributes[ id ] = _gl.getAttribLocation( program, id );
  924. }
  925. };
  926. function getShader( type, string ) {
  927. var shader;
  928. if ( type == "fragment" ) {
  929. shader = _gl.createShader( _gl.FRAGMENT_SHADER );
  930. } else if ( type == "vertex" ) {
  931. shader = _gl.createShader( _gl.VERTEX_SHADER );
  932. }
  933. _gl.shaderSource( shader, string );
  934. _gl.compileShader( shader );
  935. if ( !_gl.getShaderParameter( shader, _gl.COMPILE_STATUS ) ) {
  936. alert( _gl.getShaderInfoLog( shader ) );
  937. return null;
  938. }
  939. return shader;
  940. };
  941. function paramThreeToGL( p ) {
  942. switch ( p ) {
  943. case THREE.RepeatWrapping: return _gl.REPEAT; break;
  944. case THREE.ClampToEdgeWrapping: return _gl.CLAMP_TO_EDGE; break;
  945. case THREE.MirroredRepeatWrapping: return _gl.MIRRORED_REPEAT; break;
  946. case THREE.NearestFilter: return _gl.NEAREST; break;
  947. case THREE.NearestMipMapNearestFilter: return _gl.NEAREST_MIPMAP_NEAREST; break;
  948. case THREE.NearestMipMapLinearFilter: return _gl.NEAREST_MIPMAP_LINEAR; break;
  949. case THREE.LinearFilter: return _gl.LINEAR; break;
  950. case THREE.LinearMipMapNearestFilter: return _gl.LINEAR_MIPMAP_NEAREST; break;
  951. case THREE.LinearMipMapLinearFilter: return _gl.LINEAR_MIPMAP_LINEAR; break;
  952. case THREE.ByteType: return _gl.BYTE; break;
  953. case THREE.UnsignedByteType: return _gl.UNSIGNED_BYTE; break;
  954. case THREE.ShortType: return _gl.SHORT; break;
  955. case THREE.UnsignedShortType: return _gl.UNSIGNED_SHORT; break;
  956. case THREE.IntType: return _gl.INT; break;
  957. case THREE.UnsignedShortType: return _gl.UNSIGNED_INT; break;
  958. case THREE.FloatType: return _gl.FLOAT; break;
  959. case THREE.AlphaFormat: return _gl.ALPHA; break;
  960. case THREE.RGBFormat: return _gl.RGB; break;
  961. case THREE.RGBAFormat: return _gl.RGBA; break;
  962. case THREE.LuminanceFormat: return _gl.LUMINANCE; break;
  963. case THREE.LuminanceAlphaFormat: return _gl.LUMINANCE_ALPHA; break;
  964. }
  965. return 0;
  966. };
  967. function materialNeedsSmoothNormals( material ) {
  968. return material && material.shading != undefined && material.shading == THREE.SmoothShading;
  969. };
  970. function bufferNeedsSmoothNormals( geometryChunk, object ) {
  971. var m, ml, i, l, meshMaterial, needsSmoothNormals = false;
  972. for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
  973. meshMaterial = object.materials[ m ];
  974. if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
  975. for ( i = 0, l = geometryChunk.materials.length; i < l; i++ ) {
  976. if ( materialNeedsSmoothNormals( geometryChunk.materials[ i ] ) ) {
  977. needsSmoothNormals = true;
  978. break;
  979. }
  980. }
  981. } else {
  982. if ( materialNeedsSmoothNormals( meshMaterial ) ) {
  983. needsSmoothNormals = true;
  984. break;
  985. }
  986. }
  987. if ( needsSmoothNormals ) break;
  988. }
  989. return needsSmoothNormals;
  990. };
  991. function allocateLights( lights, maxLights ) {
  992. var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
  993. dirLights = pointLights = maxDirLights = maxPointLights = 0;
  994. for ( l = 0, ll = lights.length; l < ll; l++ ) {
  995. light = lights[ l ];
  996. if ( light instanceof THREE.DirectionalLight ) dirLights++;
  997. if ( light instanceof THREE.PointLight ) pointLights++;
  998. }
  999. if ( ( pointLights + dirLights ) <= maxLights ) {
  1000. maxDirLights = dirLights;
  1001. maxPointLights = pointLights;
  1002. } else {
  1003. maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
  1004. maxPointLights = maxLights - maxDirLights;
  1005. }
  1006. return { 'directional' : maxDirLights, 'point' : maxPointLights };
  1007. };
  1008. /* DEBUG
  1009. function getGLParams() {
  1010. var params = {
  1011. 'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
  1012. 'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
  1013. 'MAX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS ),
  1014. 'MAX_VERTEX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ),
  1015. 'MAX_COMBINED_TEXTURE_IMAGE_UNITS' : _gl.getParameter( _gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ),
  1016. 'MAX_VERTEX_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS ),
  1017. 'MAX_FRAGMENT_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_FRAGMENT_UNIFORM_VECTORS )
  1018. }
  1019. return params;
  1020. };
  1021. function dumpObject( obj ) {
  1022. var p, str = "";
  1023. for ( p in obj ) {
  1024. str += p + ": " + obj[p] + "\n";
  1025. }
  1026. return str;
  1027. }
  1028. */
  1029. };
  1030. THREE.Snippets = {
  1031. fog_pars_fragment: [
  1032. "#ifdef USE_FOG",
  1033. "uniform vec3 fogColor;",
  1034. "#ifdef FOG_EXP2",
  1035. "uniform float fogDensity;",
  1036. "#else",
  1037. "uniform float fogNear;",
  1038. "uniform float fogFar;",
  1039. "#endif",
  1040. "#endif"
  1041. ].join("\n"),
  1042. fog_fragment: [
  1043. "#ifdef USE_FOG",
  1044. "float depth = gl_FragCoord.z / gl_FragCoord.w;",
  1045. "#ifdef FOG_EXP2",
  1046. "const float LOG2 = 1.442695;",
  1047. "float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );",
  1048. "fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );",
  1049. "#else",
  1050. "float fogFactor = smoothstep( fogNear, fogFar, depth );",
  1051. "#endif",
  1052. "gl_FragColor = mix( gl_FragColor, vec4( fogColor, 1.0 ), fogFactor );",
  1053. "#endif"
  1054. ].join("\n"),
  1055. envmap_pars_fragment: [
  1056. "#ifdef USE_ENVMAP",
  1057. "varying vec3 vReflect;",
  1058. "uniform float reflectivity;",
  1059. "uniform samplerCube env_map;",
  1060. "uniform int combine;",
  1061. "#endif"
  1062. ].join("\n"),
  1063. envmap_fragment: [
  1064. "#ifdef USE_ENVMAP",
  1065. "cubeColor = textureCube( env_map, vec3( -vReflect.x, vReflect.yz ) );",
  1066. "if ( combine == 1 ) {",
  1067. "gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
  1068. "} else {",
  1069. "gl_FragColor = gl_FragColor * cubeColor;",
  1070. "}",
  1071. "#endif"
  1072. ].join("\n"),
  1073. envmap_pars_vertex: [
  1074. "#ifdef USE_ENVMAP",
  1075. "varying vec3 vReflect;",
  1076. "uniform float refraction_ratio;",
  1077. "uniform bool useRefract;",
  1078. "#endif"
  1079. ].join("\n"),
  1080. envmap_vertex : [
  1081. "#ifdef USE_ENVMAP",
  1082. "vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
  1083. "vec3 nWorld = mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal;",
  1084. "if ( useRefract ) {",
  1085. "vReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refraction_ratio );",
  1086. "} else {",
  1087. "vReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );",
  1088. "}",
  1089. "#endif"
  1090. ].join("\n"),
  1091. map_pars_fragment: [
  1092. "#ifdef USE_MAP",
  1093. "varying vec2 vUv;",
  1094. "uniform sampler2D map;",
  1095. "#endif"
  1096. ].join("\n"),
  1097. map_pars_vertex: [
  1098. "#ifdef USE_MAP",
  1099. "varying vec2 vUv;",
  1100. "#endif"
  1101. ].join("\n"),
  1102. map_fragment: [
  1103. "#ifdef USE_MAP",
  1104. "mapColor = texture2D( map, vUv );",
  1105. "#endif"
  1106. ].join("\n"),
  1107. map_vertex: [
  1108. "#ifdef USE_MAP",
  1109. "vUv = uv;",
  1110. "#endif"
  1111. ].join("\n"),
  1112. lights_pars_vertex: [
  1113. "uniform bool enableLighting;",
  1114. "uniform vec3 ambientLightColor;",
  1115. "#if MAX_DIR_LIGHTS > 0",
  1116. "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
  1117. "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
  1118. "#endif",
  1119. "#if MAX_POINT_LIGHTS > 0",
  1120. "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
  1121. "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
  1122. "#ifdef PHONG",
  1123. "varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
  1124. "#endif",
  1125. "#endif"
  1126. ].join("\n"),
  1127. lights_vertex: [
  1128. "if ( !enableLighting ) {",
  1129. "vLightWeighting = vec3( 1.0 );",
  1130. "} else {",
  1131. "vLightWeighting = ambientLightColor;",
  1132. "#if MAX_DIR_LIGHTS > 0",
  1133. "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
  1134. "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
  1135. "float directionalLightWeighting = max( dot( transformedNormal, normalize( lDirection.xyz ) ), 0.0 );",
  1136. "vLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;",
  1137. "}",
  1138. "#endif",
  1139. "#if MAX_POINT_LIGHTS > 0",
  1140. "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",
  1141. "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
  1142. "vec3 pointLightVector = normalize( lPosition.xyz - mvPosition.xyz );",
  1143. "float pointLightWeighting = max( dot( transformedNormal, pointLightVector ), 0.0 );",
  1144. "vLightWeighting += pointLightColor[ i ] * pointLightWeighting;",
  1145. "#ifdef PHONG",
  1146. "vPointLightVector[ i ] = pointLightVector;",
  1147. "#endif",
  1148. "}",
  1149. "#endif",
  1150. "}"
  1151. ].join("\n"),
  1152. lights_pars_fragment: [
  1153. "#if MAX_DIR_LIGHTS > 0",
  1154. "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
  1155. "#endif",
  1156. "#if MAX_POINT_LIGHTS > 0",
  1157. "varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
  1158. "#endif",
  1159. "varying vec3 vViewPosition;",
  1160. "varying vec3 vNormal;"
  1161. ].join("\n"),
  1162. lights_fragment: [
  1163. "vec3 normal = normalize( vNormal );",
  1164. "vec3 viewPosition = normalize( vViewPosition );",
  1165. "vec4 mSpecular = vec4( specular, opacity );",
  1166. "#if MAX_POINT_LIGHTS > 0",
  1167. "vec4 pointDiffuse = vec4( 0.0 );",
  1168. "vec4 pointSpecular = vec4( 0.0 );",
  1169. "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",
  1170. "vec3 pointVector = normalize( vPointLightVector[ i ] );",
  1171. "vec3 pointHalfVector = normalize( vPointLightVector[ i ] + vViewPosition );",
  1172. "float pointDotNormalHalf = dot( normal, pointHalfVector );",
  1173. "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",
  1174. "float pointSpecularWeight = 0.0;",
  1175. "if ( pointDotNormalHalf >= 0.0 )",
  1176. "pointSpecularWeight = pow( pointDotNormalHalf, shininess );",
  1177. "pointDiffuse += mColor * pointDiffuseWeight;",
  1178. "pointSpecular += mSpecular * pointSpecularWeight;",
  1179. "}",
  1180. "#endif",
  1181. "#if MAX_DIR_LIGHTS > 0",
  1182. "vec4 dirDiffuse = vec4( 0.0 );",
  1183. "vec4 dirSpecular = vec4( 0.0 );" ,
  1184. "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
  1185. "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
  1186. "vec3 dirVector = normalize( lDirection.xyz );",
  1187. "vec3 dirHalfVector = normalize( lDirection.xyz + vViewPosition );",
  1188. "float dirDotNormalHalf = dot( normal, dirHalfVector );",
  1189. "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
  1190. "float dirSpecularWeight = 0.0;",
  1191. "if ( dirDotNormalHalf >= 0.0 )",
  1192. "dirSpecularWeight = pow( dirDotNormalHalf, shininess );",
  1193. "dirDiffuse += mColor * dirDiffuseWeight;",
  1194. "dirSpecular += mSpecular * dirSpecularWeight;",
  1195. "}",
  1196. "#endif",
  1197. "vec4 totalLight = vec4( ambient, opacity );",
  1198. "#if MAX_DIR_LIGHTS > 0",
  1199. "totalLight += dirDiffuse + dirSpecular;",
  1200. "#endif",
  1201. "#if MAX_POINT_LIGHTS > 0",
  1202. "totalLight += pointDiffuse + pointSpecular;",
  1203. "#endif"
  1204. ].join("\n")
  1205. };
  1206. THREE.UniformsLib = {
  1207. common: {
  1208. "color" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
  1209. "opacity" : { type: "f", value: 1 },
  1210. "map" : { type: "t", value: 0, texture: null },
  1211. "env_map" : { type: "t", value: 1, texture: null },
  1212. "useRefract" : { type: "i", value: 0 },
  1213. "reflectivity" : { type: "f", value: 1 },
  1214. "refraction_ratio": { type: "f", value: 0.98 },
  1215. "combine" : { type: "i", value: 0 },
  1216. "fogDensity": { type: "f", value: 0.00025 },
  1217. "fogNear" : { type: "f", value: 1 },
  1218. "fogFar" : { type: "f", value: 2000 },
  1219. "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
  1220. },
  1221. lights: {
  1222. "enableLighting" : { type: "i", value: 1 },
  1223. "ambientLightColor" : { type: "fv", value: [] },
  1224. "directionalLightDirection" : { type: "fv", value: [] },
  1225. "directionalLightColor" : { type: "fv", value: [] },
  1226. "pointLightPosition" : { type: "fv", value: [] },
  1227. "pointLightColor" : { type: "fv", value: [] }
  1228. }
  1229. };
  1230. THREE.ShaderLib = {
  1231. 'depth': {
  1232. uniforms: { "mNear": { type: "f", value: 1.0 },
  1233. "mFar" : { type: "f", value: 2000.0 } },
  1234. fragment_shader: [
  1235. "uniform float mNear;",
  1236. "uniform float mFar;",
  1237. "void main() {",
  1238. "float depth = gl_FragCoord.z / gl_FragCoord.w;",
  1239. "float color = 1.0 - smoothstep( mNear, mFar, depth );",
  1240. "gl_FragColor = vec4( vec3( color ), 1.0 );",
  1241. "}"
  1242. ].join("\n"),
  1243. vertex_shader: [
  1244. "void main() {",
  1245. "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  1246. "}"
  1247. ].join("\n")
  1248. },
  1249. 'normal': {
  1250. uniforms: { },
  1251. fragment_shader: [
  1252. "varying vec3 vNormal;",
  1253. "void main() {",
  1254. "gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, 1.0 );",
  1255. "}"
  1256. ].join("\n"),
  1257. vertex_shader: [
  1258. "varying vec3 vNormal;",
  1259. "void main() {",
  1260. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1261. "vNormal = normalize( normalMatrix * normal );",
  1262. "gl_Position = projectionMatrix * mvPosition;",
  1263. "}"
  1264. ].join("\n")
  1265. },
  1266. 'basic': {
  1267. uniforms: THREE.UniformsLib[ "common" ],
  1268. fragment_shader: [
  1269. "uniform vec3 color;",
  1270. "uniform float opacity;",
  1271. THREE.Snippets[ "map_pars_fragment" ],
  1272. THREE.Snippets[ "envmap_pars_fragment" ],
  1273. THREE.Snippets[ "fog_pars_fragment" ],
  1274. "void main() {",
  1275. "vec4 mColor = vec4( color, opacity );",
  1276. "vec4 mapColor = vec4( 1.0 );",
  1277. "vec4 cubeColor = vec4( 1.0 );",
  1278. THREE.Snippets[ "map_fragment" ],
  1279. "gl_FragColor = mColor * mapColor;",
  1280. THREE.Snippets[ "envmap_fragment" ],
  1281. THREE.Snippets[ "fog_fragment" ],
  1282. "}"
  1283. ].join("\n"),
  1284. vertex_shader: [
  1285. THREE.Snippets[ "map_pars_vertex" ],
  1286. THREE.Snippets[ "envmap_pars_vertex" ],
  1287. "void main() {",
  1288. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1289. THREE.Snippets[ "map_vertex" ],
  1290. THREE.Snippets[ "envmap_vertex" ],
  1291. "gl_Position = projectionMatrix * mvPosition;",
  1292. "}"
  1293. ].join("\n")
  1294. },
  1295. 'lambert': {
  1296. uniforms: Uniforms.merge( [ THREE.UniformsLib[ "common" ],
  1297. THREE.UniformsLib[ "lights" ] ] ),
  1298. fragment_shader: [
  1299. "uniform vec3 color;",
  1300. "uniform float opacity;",
  1301. "varying vec3 vLightWeighting;",
  1302. THREE.Snippets[ "map_pars_fragment" ],
  1303. THREE.Snippets[ "envmap_pars_fragment" ],
  1304. THREE.Snippets[ "fog_pars_fragment" ],
  1305. "void main() {",
  1306. "vec4 mColor = vec4( color, opacity );",
  1307. "vec4 mapColor = vec4( 1.0 );",
  1308. "vec4 cubeColor = vec4( 1.0 );",
  1309. THREE.Snippets[ "map_fragment" ],
  1310. "gl_FragColor = mColor * mapColor * vec4( vLightWeighting, 1.0 );",
  1311. THREE.Snippets[ "envmap_fragment" ],
  1312. THREE.Snippets[ "fog_fragment" ],
  1313. "}"
  1314. ].join("\n"),
  1315. vertex_shader: [
  1316. "varying vec3 vLightWeighting;",
  1317. THREE.Snippets[ "map_pars_vertex" ],
  1318. THREE.Snippets[ "envmap_pars_vertex" ],
  1319. THREE.Snippets[ "lights_pars_vertex" ],
  1320. "void main() {",
  1321. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1322. THREE.Snippets[ "map_vertex" ],
  1323. THREE.Snippets[ "envmap_vertex" ],
  1324. "vec3 transformedNormal = normalize( normalMatrix * normal );",
  1325. THREE.Snippets[ "lights_vertex" ],
  1326. "gl_Position = projectionMatrix * mvPosition;",
  1327. "}"
  1328. ].join("\n")
  1329. },
  1330. 'phong': {
  1331. uniforms: Uniforms.merge( [ THREE.UniformsLib[ "common" ],
  1332. THREE.UniformsLib[ "lights" ],
  1333. { "ambient" : { type: "c", value: new THREE.Color( 0x050505 ) },
  1334. "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
  1335. "shininess": { type: "f", value: 30 }
  1336. }
  1337. ] ),
  1338. fragment_shader: [
  1339. "uniform vec3 color;",
  1340. "uniform float opacity;",
  1341. "uniform vec3 ambient;",
  1342. "uniform vec3 specular;",
  1343. "uniform float shininess;",
  1344. "varying vec3 vLightWeighting;",
  1345. THREE.Snippets[ "map_pars_fragment" ],
  1346. THREE.Snippets[ "envmap_pars_fragment" ],
  1347. THREE.Snippets[ "fog_pars_fragment" ],
  1348. THREE.Snippets[ "lights_pars_fragment" ],
  1349. "void main() {",
  1350. "vec4 mColor = vec4( color, opacity );",
  1351. "vec4 mapColor = vec4( 1.0 );",
  1352. "vec4 cubeColor = vec4( 1.0 );",
  1353. THREE.Snippets[ "map_fragment" ],
  1354. THREE.Snippets[ "lights_fragment" ],
  1355. "gl_FragColor = mapColor * totalLight * vec4( vLightWeighting, 1.0 );",
  1356. THREE.Snippets[ "envmap_fragment" ],
  1357. THREE.Snippets[ "fog_fragment" ],
  1358. "}"
  1359. ].join("\n"),
  1360. vertex_shader: [
  1361. "#define PHONG",
  1362. "varying vec3 vLightWeighting;",
  1363. "varying vec3 vViewPosition;",
  1364. "varying vec3 vNormal;",
  1365. THREE.Snippets[ "map_pars_vertex" ],
  1366. THREE.Snippets[ "envmap_pars_vertex" ],
  1367. THREE.Snippets[ "lights_pars_vertex" ],
  1368. "void main() {",
  1369. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1370. THREE.Snippets[ "map_vertex" ],
  1371. THREE.Snippets[ "envmap_vertex" ],
  1372. "#ifndef USE_ENVMAP",
  1373. "vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
  1374. "#endif",
  1375. "vViewPosition = cameraPosition - mPosition.xyz;",
  1376. "vec3 transformedNormal = normalize( normalMatrix * normal );",
  1377. "vNormal = transformedNormal;",
  1378. THREE.Snippets[ "lights_vertex" ],
  1379. "gl_Position = projectionMatrix * mvPosition;",
  1380. "}"
  1381. ].join("\n")
  1382. }
  1383. };