WebGLRenderer.js 73 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212
  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. // camera matrices caches
  20. _frustum = [
  21. new THREE.Vector4(),
  22. new THREE.Vector4(),
  23. new THREE.Vector4(),
  24. new THREE.Vector4(),
  25. new THREE.Vector4(),
  26. new THREE.Vector4()
  27. ],
  28. _projScreenMatrix = new THREE.Matrix4(),
  29. _projectionMatrixArray = new Float32Array( 16 ),
  30. _viewMatrixArray = new Float32Array( 16 ),
  31. _vector3 = new THREE.Vector4(),
  32. // parameters defaults
  33. antialias = true,
  34. clearColor = new THREE.Color( 0x000000 ),
  35. clearAlpha = 0;
  36. if ( parameters ) {
  37. if ( parameters.antialias !== undefined ) antialias = parameters.antialias;
  38. if ( parameters.clearColor !== undefined ) clearColor.setHex( parameters.clearColor );
  39. if ( parameters.clearAlpha !== undefined ) clearAlpha = parameters.clearAlpha;
  40. }
  41. this.domElement = _canvas;
  42. this.autoClear = true;
  43. initGL( antialias, clearColor, clearAlpha );
  44. this.context = _gl;
  45. //alert( dumpObject( getGLParams() ) );
  46. this.lights = {
  47. ambient: [ 0, 0, 0 ],
  48. directional: { length: 0, colors: new Array(), positions: new Array() },
  49. point: { length: 0, colors: new Array(), positions: new Array() }
  50. };
  51. this.setSize = function ( width, height ) {
  52. _canvas.width = width;
  53. _canvas.height = height;
  54. _gl.viewport( 0, 0, _canvas.width, _canvas.height );
  55. };
  56. this.setClearColorHex = function( hex, alpha ) {
  57. var color = new THREE.Color( hex );
  58. _gl.clearColor( color.r, color.g, color.b, alpha );
  59. };
  60. this.setClearColor = function( color, alpha ) {
  61. _gl.clearColor( color.r, color.g, color.b, alpha );
  62. };
  63. this.clear = function () {
  64. _gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT );
  65. };
  66. this.setupLights = function ( program, lights ) {
  67. var l, ll, light, r = 0, g = 0, b = 0,
  68. color, position, intensity,
  69. zlights = this.lights,
  70. dcolors = zlights.directional.colors,
  71. dpositions = zlights.directional.positions,
  72. pcolors = zlights.point.colors,
  73. ppositions = zlights.point.positions,
  74. dlength = 0,
  75. plength = 0,
  76. doffset = 0,
  77. poffset = 0;
  78. for ( l = 0, ll = lights.length; l < ll; l++ ) {
  79. light = lights[ l ];
  80. color = light.color;
  81. position = light.position;
  82. intensity = light.intensity;
  83. if ( light instanceof THREE.AmbientLight ) {
  84. r += color.r;
  85. g += color.g;
  86. b += color.b;
  87. } else if ( light instanceof THREE.DirectionalLight ) {
  88. doffset = dlength * 3;
  89. dcolors[ doffset ] = color.r * intensity;
  90. dcolors[ doffset + 1 ] = color.g * intensity;
  91. dcolors[ doffset + 2 ] = color.b * intensity;
  92. dpositions[ doffset ] = position.x;
  93. dpositions[ doffset + 1 ] = position.y;
  94. dpositions[ doffset + 2 ] = position.z;
  95. dlength += 1;
  96. } else if( light instanceof THREE.PointLight ) {
  97. poffset = plength * 3;
  98. pcolors[ poffset ] = color.r * intensity;
  99. pcolors[ poffset + 1 ] = color.g * intensity;
  100. pcolors[ poffset + 2 ] = color.b * intensity;
  101. ppositions[ poffset ] = position.x;
  102. ppositions[ poffset + 1 ] = position.y;
  103. ppositions[ poffset + 2 ] = position.z;
  104. plength += 1;
  105. }
  106. }
  107. // null eventual remains from removed lights
  108. // (this is to avoid if in shader)
  109. for( l = dlength * 3; l < dcolors.length; l++ ) dcolors[ l ] = 0.0;
  110. for( l = plength * 3; l < pcolors.length; l++ ) pcolors[ l ] = 0.0;
  111. zlights.point.length = plength;
  112. zlights.directional.length = dlength;
  113. zlights.ambient[ 0 ] = r;
  114. zlights.ambient[ 1 ] = g;
  115. zlights.ambient[ 2 ] = b;
  116. };
  117. this.createParticleBuffers = function( geometry ) {
  118. geometry.__webGLVertexBuffer = _gl.createBuffer();
  119. geometry.__webGLColorBuffer = _gl.createBuffer();
  120. };
  121. this.createLineBuffers = function( geometry ) {
  122. geometry.__webGLVertexBuffer = _gl.createBuffer();
  123. geometry.__webGLColorBuffer = _gl.createBuffer();
  124. geometry.__webGLLineBuffer = _gl.createBuffer();
  125. };
  126. this.createMeshBuffers = function( geometryChunk ) {
  127. geometryChunk.__webGLVertexBuffer = _gl.createBuffer();
  128. geometryChunk.__webGLNormalBuffer = _gl.createBuffer();
  129. geometryChunk.__webGLTangentBuffer = _gl.createBuffer();
  130. geometryChunk.__webGLColorBuffer = _gl.createBuffer();
  131. geometryChunk.__webGLUVBuffer = _gl.createBuffer();
  132. geometryChunk.__webGLUV2Buffer = _gl.createBuffer();
  133. geometryChunk.__webGLFaceBuffer = _gl.createBuffer();
  134. geometryChunk.__webGLLineBuffer = _gl.createBuffer();
  135. };
  136. this.initLineBuffers = function( geometry ) {
  137. var nvertices = geometry.vertices.length;
  138. geometry.__vertexArray = new Float32Array( nvertices * 3 );
  139. geometry.__colorArray = new Float32Array( nvertices * 3 );
  140. geometry.__lineArray = new Uint16Array( nvertices );
  141. geometry.__webGLLineCount = nvertices;
  142. };
  143. this.initParticleBuffers = function( geometry ) {
  144. var nvertices = geometry.vertices.length;
  145. geometry.__vertexArray = new Float32Array( nvertices * 3 );
  146. geometry.__colorArray = new Float32Array( nvertices * 3 );
  147. geometry.__sortArray = [];
  148. geometry.__webGLParticleCount = nvertices;
  149. };
  150. this.initMeshBuffers = function( geometryChunk, object ) {
  151. var f, fl, nvertices = 0, ntris = 0, nlines = 0,
  152. obj_faces = object.geometry.faces,
  153. chunk_faces = geometryChunk.faces;
  154. for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
  155. fi = chunk_faces[ f ];
  156. face = obj_faces[ fi ];
  157. if ( face instanceof THREE.Face3 ) {
  158. nvertices += 3;
  159. ntris += 1;
  160. nlines += 3;
  161. } else if ( face instanceof THREE.Face4 ) {
  162. nvertices += 4;
  163. ntris += 2;
  164. nlines += 4;
  165. }
  166. }
  167. // TODO: only create arrays for attributes existing in the object
  168. geometryChunk.__vertexArray = new Float32Array( nvertices * 3 );
  169. geometryChunk.__normalArray = new Float32Array( nvertices * 3 );
  170. geometryChunk.__tangentArray = new Float32Array( nvertices * 4 );
  171. geometryChunk.__colorArray = new Float32Array( nvertices * 3 );
  172. geometryChunk.__uvArray = new Float32Array( nvertices * 2 );
  173. geometryChunk.__uv2Array = new Float32Array( nvertices * 2 );
  174. geometryChunk.__faceArray = new Uint16Array( ntris * 3 );
  175. geometryChunk.__lineArray = new Uint16Array( nlines * 2 );
  176. geometryChunk.__needsSmoothNormals = bufferNeedsSmoothNormals ( geometryChunk, object );
  177. geometryChunk.__webGLFaceCount = ntris * 3;
  178. geometryChunk.__webGLLineCount = nlines * 2;
  179. };
  180. this.setMeshBuffers = function ( geometryChunk, object, hint ) {
  181. var f, fl, fi, face, vertexNormals, faceNormal, normal,
  182. uv, uv2, v1, v2, v3, v4, t1, t2, t3, t4,
  183. c1, c2, c3, c4,
  184. m, ml, i,
  185. vn, uvi, uv2i,
  186. vertexIndex = 0,
  187. offset = 0,
  188. offset_uv = 0,
  189. offset_uv2 = 0,
  190. offset_face = 0,
  191. offset_normal = 0,
  192. offset_tangent = 0,
  193. offset_line = 0,
  194. offset_color = 0,
  195. vertexArray = geometryChunk.__vertexArray,
  196. uvArray = geometryChunk.__uvArray,
  197. uv2Array = geometryChunk.__uv2Array,
  198. normalArray = geometryChunk.__normalArray,
  199. tangentArray = geometryChunk.__tangentArray,
  200. colorArray = geometryChunk.__colorArray,
  201. faceArray = geometryChunk.__faceArray,
  202. lineArray = geometryChunk.__lineArray,
  203. needsSmoothNormals = geometryChunk.__needsSmoothNormals,
  204. geometry = object.geometry, // this is shared for all chunks
  205. dirtyVertices = geometry.__dirtyVertices,
  206. dirtyElements = geometry.__dirtyElements,
  207. dirtyUvs = geometry.__dirtyUvs,
  208. dirtyNormals = geometry.__dirtyNormals,
  209. dirtyTangents = geometry.__dirtyTangents,
  210. dirtyColors = geometry.__dirtyColors,
  211. vertices = geometry.vertices,
  212. chunk_faces = geometryChunk.faces,
  213. obj_faces = geometry.faces,
  214. obj_uvs = geometry.uvs,
  215. obj_uvs2 = geometry.uvs2,
  216. obj_colors = geometry.colors;
  217. for ( f = 0, fl = chunk_faces.length; f < fl; f++ ) {
  218. fi = chunk_faces[ f ];
  219. face = obj_faces[ fi ];
  220. uv = obj_uvs[ fi ];
  221. uv2 = obj_uvs2[ fi ];
  222. vertexNormals = face.vertexNormals;
  223. faceNormal = face.normal;
  224. if ( face instanceof THREE.Face3 ) {
  225. if ( dirtyVertices ) {
  226. v1 = vertices[ face.a ].position;
  227. v2 = vertices[ face.b ].position;
  228. v3 = vertices[ face.c ].position;
  229. vertexArray[ offset ] = v1.x;
  230. vertexArray[ offset + 1 ] = v1.y;
  231. vertexArray[ offset + 2 ] = v1.z;
  232. vertexArray[ offset + 3 ] = v2.x;
  233. vertexArray[ offset + 4 ] = v2.y;
  234. vertexArray[ offset + 5 ] = v2.z;
  235. vertexArray[ offset + 6 ] = v3.x;
  236. vertexArray[ offset + 7 ] = v3.y;
  237. vertexArray[ offset + 8 ] = v3.z;
  238. offset += 9;
  239. }
  240. if ( dirtyColors && obj_colors.length ) {
  241. c1 = obj_colors[ face.a ];
  242. c2 = obj_colors[ face.b ];
  243. c3 = obj_colors[ face.c ];
  244. colorArray[ offset_color ] = c1.r;
  245. colorArray[ offset_color + 1 ] = c1.g;
  246. colorArray[ offset_color + 2 ] = c1.b;
  247. colorArray[ offset_color + 3 ] = c2.r;
  248. colorArray[ offset_color + 4 ] = c2.g;
  249. colorArray[ offset_color + 5 ] = c2.b;
  250. colorArray[ offset_color + 6 ] = c3.r;
  251. colorArray[ offset_color + 7 ] = c3.g;
  252. colorArray[ offset_color + 8 ] = c3.b;
  253. offset_color += 9;
  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. tangentArray[ offset_tangent ] = t1.x;
  260. tangentArray[ offset_tangent + 1 ] = t1.y;
  261. tangentArray[ offset_tangent + 2 ] = t1.z;
  262. tangentArray[ offset_tangent + 3 ] = t1.w;
  263. tangentArray[ offset_tangent + 4 ] = t2.x;
  264. tangentArray[ offset_tangent + 5 ] = t2.y;
  265. tangentArray[ offset_tangent + 6 ] = t2.z;
  266. tangentArray[ offset_tangent + 7 ] = t2.w;
  267. tangentArray[ offset_tangent + 8 ] = t3.x;
  268. tangentArray[ offset_tangent + 9 ] = t3.y;
  269. tangentArray[ offset_tangent + 10 ] = t3.z;
  270. tangentArray[ offset_tangent + 11 ] = t3.w;
  271. offset_tangent += 12;
  272. }
  273. if( dirtyNormals ) {
  274. if ( vertexNormals.length == 3 && needsSmoothNormals ) {
  275. for ( i = 0; i < 3; i ++ ) {
  276. vn = vertexNormals[ i ];
  277. normalArray[ offset_normal ] = vn.x;
  278. normalArray[ offset_normal + 1 ] = vn.y;
  279. normalArray[ offset_normal + 2 ] = vn.z;
  280. offset_normal += 3;
  281. }
  282. } else {
  283. for ( i = 0; i < 3; i ++ ) {
  284. normalArray[ offset_normal ] = faceNormal.x;
  285. normalArray[ offset_normal + 1 ] = faceNormal.y;
  286. normalArray[ offset_normal + 2 ] = faceNormal.z;
  287. offset_normal += 3;
  288. }
  289. }
  290. }
  291. if ( dirtyUvs && uv ) {
  292. for ( i = 0; i < 3; i ++ ) {
  293. uvi = uv[ i ];
  294. uvArray[ offset_uv ] = uvi.u;
  295. uvArray[ offset_uv + 1 ] = uvi.v;
  296. offset_uv += 2;
  297. }
  298. }
  299. if ( dirtyUvs && uv2 ) {
  300. for ( i = 0; i < 3; i ++ ) {
  301. uv2i = uv2[ i ];
  302. uv2Array[ offset_uv2 ] = uv2i.u;
  303. uv2Array[ offset_uv2 + 1 ] = uv2i.v;
  304. offset_uv2 += 2;
  305. }
  306. }
  307. if( dirtyElements ) {
  308. faceArray[ offset_face ] = vertexIndex;
  309. faceArray[ offset_face + 1 ] = vertexIndex + 1;
  310. faceArray[ offset_face + 2 ] = vertexIndex + 2;
  311. offset_face += 3;
  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 + 1;
  317. lineArray[ offset_line + 5 ] = vertexIndex + 2;
  318. offset_line += 6;
  319. vertexIndex += 3;
  320. }
  321. } else if ( face instanceof THREE.Face4 ) {
  322. if ( dirtyVertices ) {
  323. v1 = vertices[ face.a ].position;
  324. v2 = vertices[ face.b ].position;
  325. v3 = vertices[ face.c ].position;
  326. v4 = vertices[ face.d ].position;
  327. vertexArray[ offset ] = v1.x;
  328. vertexArray[ offset + 1 ] = v1.y;
  329. vertexArray[ offset + 2 ] = v1.z;
  330. vertexArray[ offset + 3 ] = v2.x;
  331. vertexArray[ offset + 4 ] = v2.y;
  332. vertexArray[ offset + 5 ] = v2.z;
  333. vertexArray[ offset + 6 ] = v3.x;
  334. vertexArray[ offset + 7 ] = v3.y;
  335. vertexArray[ offset + 8 ] = v3.z;
  336. vertexArray[ offset + 9 ] = v4.x;
  337. vertexArray[ offset + 10 ] = v4.y;
  338. vertexArray[ offset + 11 ] = v4.z;
  339. offset += 12;
  340. }
  341. if ( dirtyColors && obj_colors.length ) {
  342. c1 = obj_colors[ face.a ];
  343. c2 = obj_colors[ face.b ];
  344. c3 = obj_colors[ face.c ];
  345. c3 = obj_colors[ face.d ];
  346. colorArray[ offset_color ] = c1.r;
  347. colorArray[ offset_color + 1 ] = c1.g;
  348. colorArray[ offset_color + 2 ] = c1.b;
  349. colorArray[ offset_color + 3 ] = c2.r;
  350. colorArray[ offset_color + 4 ] = c2.g;
  351. colorArray[ offset_color + 5 ] = c2.b;
  352. colorArray[ offset_color + 6 ] = c3.r;
  353. colorArray[ offset_color + 7 ] = c3.g;
  354. colorArray[ offset_color + 8 ] = c3.b;
  355. colorArray[ offset_color + 9 ] = c4.r;
  356. colorArray[ offset_color + 10 ] = c4.g;
  357. colorArray[ offset_color + 11 ] = c4.b;
  358. offset_color += 12;
  359. }
  360. if ( dirtyTangents && geometry.hasTangents ) {
  361. t1 = vertices[ face.a ].tangent;
  362. t2 = vertices[ face.b ].tangent;
  363. t3 = vertices[ face.c ].tangent;
  364. t4 = vertices[ face.d ].tangent;
  365. tangentArray[ offset_tangent ] = t1.x;
  366. tangentArray[ offset_tangent + 1 ] = t1.y;
  367. tangentArray[ offset_tangent + 2 ] = t1.z;
  368. tangentArray[ offset_tangent + 3 ] = t1.w;
  369. tangentArray[ offset_tangent + 4 ] = t2.x;
  370. tangentArray[ offset_tangent + 5 ] = t2.y;
  371. tangentArray[ offset_tangent + 6 ] = t2.z;
  372. tangentArray[ offset_tangent + 7 ] = t2.w;
  373. tangentArray[ offset_tangent + 8 ] = t3.x;
  374. tangentArray[ offset_tangent + 9 ] = t3.y;
  375. tangentArray[ offset_tangent + 10 ] = t3.z;
  376. tangentArray[ offset_tangent + 11 ] = t3.w;
  377. tangentArray[ offset_tangent + 12 ] = t4.x;
  378. tangentArray[ offset_tangent + 13 ] = t4.y;
  379. tangentArray[ offset_tangent + 14 ] = t4.z;
  380. tangentArray[ offset_tangent + 15 ] = t4.w;
  381. offset_tangent += 16;
  382. }
  383. if( dirtyNormals ) {
  384. if ( vertexNormals.length == 4 && needsSmoothNormals ) {
  385. for ( i = 0; i < 4; i ++ ) {
  386. vn = vertexNormals[ i ];
  387. normalArray[ offset_normal ] = vn.x;
  388. normalArray[ offset_normal + 1 ] = vn.y;
  389. normalArray[ offset_normal + 2 ] = vn.z;
  390. offset_normal += 3;
  391. }
  392. } else {
  393. for ( i = 0; i < 4; i ++ ) {
  394. normalArray[ offset_normal ] = faceNormal.x;
  395. normalArray[ offset_normal + 1 ] = faceNormal.y;
  396. normalArray[ offset_normal + 2 ] = faceNormal.z;
  397. offset_normal += 3;
  398. }
  399. }
  400. }
  401. if ( dirtyUvs && uv ) {
  402. for ( i = 0; i < 4; i ++ ) {
  403. uvi = uv[ i ];
  404. uvArray[ offset_uv ] = uvi.u;
  405. uvArray[ offset_uv + 1 ] = uvi.v;
  406. offset_uv += 2;
  407. }
  408. }
  409. if ( dirtyUvs && uv2 ) {
  410. for ( i = 0; i < 4; i ++ ) {
  411. uv2i = uv2[ i ];
  412. uv2Array[ offset_uv2 ] = uv2i.u;
  413. uv2Array[ offset_uv2 + 1 ] = uv2i.v;
  414. offset_uv2 += 2;
  415. }
  416. }
  417. if( dirtyElements ) {
  418. faceArray[ offset_face ] = vertexIndex;
  419. faceArray[ offset_face + 1 ] = vertexIndex + 1;
  420. faceArray[ offset_face + 2 ] = vertexIndex + 2;
  421. faceArray[ offset_face + 3 ] = vertexIndex;
  422. faceArray[ offset_face + 4 ] = vertexIndex + 2;
  423. faceArray[ offset_face + 5 ] = vertexIndex + 3;
  424. offset_face += 6;
  425. lineArray[ offset_line ] = vertexIndex;
  426. lineArray[ offset_line + 1 ] = vertexIndex + 1;
  427. lineArray[ offset_line + 2 ] = vertexIndex;
  428. lineArray[ offset_line + 3 ] = vertexIndex + 3;
  429. lineArray[ offset_line + 4 ] = vertexIndex + 1;
  430. lineArray[ offset_line + 5 ] = vertexIndex + 2;
  431. lineArray[ offset_line + 6 ] = vertexIndex + 2;
  432. lineArray[ offset_line + 7 ] = vertexIndex + 3;
  433. offset_line += 8;
  434. vertexIndex += 4;
  435. }
  436. }
  437. }
  438. if ( dirtyVertices ) {
  439. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
  440. _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
  441. }
  442. if ( dirtyColors && obj_colors.length ) {
  443. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLColorBuffer );
  444. _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
  445. }
  446. if ( dirtyNormals ) {
  447. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
  448. _gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );
  449. }
  450. if ( dirtyTangents && geometry.hasTangents ) {
  451. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
  452. _gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );
  453. }
  454. if ( dirtyUvs && offset_uv > 0 ) {
  455. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
  456. _gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );
  457. }
  458. if ( dirtyUvs && offset_uv2 > 0 ) {
  459. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUV2Buffer );
  460. _gl.bufferData( _gl.ARRAY_BUFFER, uv2Array, hint );
  461. }
  462. if( dirtyElements ) {
  463. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
  464. _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );
  465. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
  466. _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
  467. }
  468. };
  469. this.setLineBuffers = function( geometry, hint ) {
  470. var v, c, vertex, offset,
  471. vertices = geometry.vertices,
  472. colors = geometry.colors,
  473. vl = vertices.length,
  474. cl = colors.length,
  475. vertexArray = geometry.__vertexArray,
  476. colorArray = geometry.__colorArray,
  477. lineArray = geometry.__lineArray,
  478. dirtyVertices = geometry.__dirtyVertices,
  479. dirtyColors = geometry.__dirtyColors,
  480. dirtyElements = geometry.__dirtyElements;
  481. if ( dirtyVertices ) {
  482. for ( v = 0; v < vl; v++ ) {
  483. vertex = vertices[ v ].position;
  484. offset = v * 3;
  485. vertexArray[ offset ] = vertex.x;
  486. vertexArray[ offset + 1 ] = vertex.y;
  487. vertexArray[ offset + 2 ] = vertex.z;
  488. }
  489. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
  490. _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
  491. }
  492. if ( dirtyColors ) {
  493. for ( c = 0; c < cl; c++ ) {
  494. color = colors[ c ];
  495. offset = c * 3;
  496. colorArray[ offset ] = color.r;
  497. colorArray[ offset + 1 ] = color.g;
  498. colorArray[ offset + 2 ] = color.b;
  499. }
  500. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
  501. _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
  502. }
  503. // yeah, this is silly as order of element indices is currently fixed
  504. // though this could change if some use case arises
  505. if ( dirtyElements ) {
  506. for ( v = 0; v < vl; v++ ) {
  507. lineArray[ v ] = v;
  508. }
  509. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometry.__webGLLineBuffer );
  510. _gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );
  511. }
  512. };
  513. this.setParticleBuffers = function( geometry, hint, object, camera ) {
  514. var v, c, vertex, offset,
  515. vertices = geometry.vertices,
  516. vl = vertices.length,
  517. colors = geometry.colors,
  518. cl = colors.length,
  519. vertexArray = geometry.__vertexArray,
  520. colorArray = geometry.__colorArray,
  521. sortArray = geometry.__sortArray,
  522. dirtyVertices = geometry.__dirtyVertices,
  523. dirtyElements = geometry.__dirtyElements,
  524. dirtyColors = geometry.__dirtyColors;
  525. if ( object.sortParticles ) {
  526. _projScreenMatrix.multiplySelf( object.matrix );
  527. for ( v = 0; v < vl; v++ ) {
  528. vertex = vertices[ v ].position;
  529. _vector3.copy( vertex );
  530. _projScreenMatrix.multiplyVector3( _vector3 );
  531. sortArray[ v ] = [ _vector3.z, v ];
  532. }
  533. sortArray.sort( function(a,b) { return b[0] - a[0]; } );
  534. for ( v = 0; v < vl; v++ ) {
  535. vertex = vertices[ sortArray[v][1] ].position;
  536. offset = v * 3;
  537. vertexArray[ offset ] = vertex.x;
  538. vertexArray[ offset + 1 ] = vertex.y;
  539. vertexArray[ offset + 2 ] = vertex.z;
  540. }
  541. for ( c = 0; c < cl; c++ ) {
  542. offset = c * 3;
  543. color = colors[ sortArray[c][1] ];
  544. colorArray[ offset ] = color.r;
  545. colorArray[ offset + 1 ] = color.g;
  546. colorArray[ offset + 2 ] = color.b;
  547. }
  548. } else {
  549. if ( dirtyVertices ) {
  550. for ( v = 0; v < vl; v++ ) {
  551. vertex = vertices[ v ].position;
  552. offset = v * 3;
  553. vertexArray[ offset ] = vertex.x;
  554. vertexArray[ offset + 1 ] = vertex.y;
  555. vertexArray[ offset + 2 ] = vertex.z;
  556. }
  557. }
  558. if ( dirtyColors ) {
  559. for ( c = 0; c < cl; c++ ) {
  560. color = colors[ c ];
  561. offset = c * 3;
  562. colorArray[ offset ] = color.r;
  563. colorArray[ offset + 1 ] = color.g;
  564. colorArray[ offset + 2 ] = color.b;
  565. }
  566. }
  567. }
  568. if ( dirtyVertices || object.sortParticles ) {
  569. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLVertexBuffer );
  570. _gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );
  571. }
  572. if ( dirtyColors || object.sortParticles ) {
  573. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webGLColorBuffer );
  574. _gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );
  575. }
  576. };
  577. function setMaterialShaders( material, shaders ) {
  578. material.fragment_shader = shaders.fragment_shader;
  579. material.vertex_shader = shaders.vertex_shader;
  580. material.uniforms = Uniforms.clone( shaders.uniforms );
  581. };
  582. function refreshUniformsCommon( material, fog ) {
  583. // premultiply alpha
  584. material.uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
  585. // pure color
  586. //material.uniforms.color.value.setHex( material.color.hex );
  587. material.uniforms.opacity.value = material.opacity;
  588. material.uniforms.map.texture = material.map;
  589. material.uniforms.light_map.texture = material.light_map;
  590. material.uniforms.env_map.texture = material.env_map;
  591. material.uniforms.reflectivity.value = material.reflectivity;
  592. material.uniforms.refraction_ratio.value = material.refraction_ratio;
  593. material.uniforms.combine.value = material.combine;
  594. material.uniforms.useRefract.value = material.env_map && material.env_map.mapping instanceof THREE.CubeRefractionMapping;
  595. if ( fog ) {
  596. material.uniforms.fogColor.value.setHex( fog.color.hex );
  597. if ( fog instanceof THREE.Fog ) {
  598. material.uniforms.fogNear.value = fog.near;
  599. material.uniforms.fogFar.value = fog.far;
  600. } else if ( fog instanceof THREE.FogExp2 ) {
  601. material.uniforms.fogDensity.value = fog.density;
  602. }
  603. }
  604. };
  605. function refreshUniformsLine( material, fog ) {
  606. material.uniforms.diffuse.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
  607. material.uniforms.opacity.value = material.opacity;
  608. if ( fog ) {
  609. material.uniforms.fogColor.value.setHex( fog.color.hex );
  610. if ( fog instanceof THREE.Fog ) {
  611. material.uniforms.fogNear.value = fog.near;
  612. material.uniforms.fogFar.value = fog.far;
  613. } else if ( fog instanceof THREE.FogExp2 ) {
  614. material.uniforms.fogDensity.value = fog.density;
  615. }
  616. }
  617. };
  618. function refreshUniformsParticle( material, fog ) {
  619. material.uniforms.psColor.value.setRGB( material.color.r * material.opacity, material.color.g * material.opacity, material.color.b * material.opacity );
  620. material.uniforms.opacity.value = material.opacity;
  621. material.uniforms.size.value = material.size;
  622. material.uniforms.map.texture = material.map;
  623. if ( fog ) {
  624. material.uniforms.fogColor.value.setHex( fog.color.hex );
  625. if ( fog instanceof THREE.Fog ) {
  626. material.uniforms.fogNear.value = fog.near;
  627. material.uniforms.fogFar.value = fog.far;
  628. } else if ( fog instanceof THREE.FogExp2 ) {
  629. material.uniforms.fogDensity.value = fog.density;
  630. }
  631. }
  632. };
  633. function refreshUniformsPhong( material ) {
  634. //material.uniforms.ambient.value.setHex( material.ambient.hex );
  635. //material.uniforms.specular.value.setHex( material.specular.hex );
  636. material.uniforms.ambient.value.setRGB( material.ambient.r, material.ambient.g, material.ambient.b );
  637. material.uniforms.specular.value.setRGB( material.specular.r, material.specular.g, material.specular.b );
  638. material.uniforms.shininess.value = material.shininess;
  639. };
  640. function refreshLights( material, lights ) {
  641. material.uniforms.enableLighting.value = lights.directional.length + lights.point.length;
  642. material.uniforms.ambientLightColor.value = lights.ambient;
  643. material.uniforms.directionalLightColor.value = lights.directional.colors;
  644. material.uniforms.directionalLightDirection.value = lights.directional.positions;
  645. material.uniforms.pointLightColor.value = lights.point.colors;
  646. material.uniforms.pointLightPosition.value = lights.point.positions;
  647. };
  648. this.initMaterial = function( material, lights, fog ) {
  649. if ( !material.program ) {
  650. var u, identifiers, parameters, maxLightCount;
  651. if ( material instanceof THREE.MeshDepthMaterial ) {
  652. setMaterialShaders( material, THREE.ShaderLib[ 'depth' ] );
  653. } else if ( material instanceof THREE.MeshNormalMaterial ) {
  654. setMaterialShaders( material, THREE.ShaderLib[ 'normal' ] );
  655. } else if ( material instanceof THREE.MeshBasicMaterial ) {
  656. setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
  657. } else if ( material instanceof THREE.MeshLambertMaterial ) {
  658. setMaterialShaders( material, THREE.ShaderLib[ 'lambert' ] );
  659. } else if ( material instanceof THREE.MeshPhongMaterial ) {
  660. setMaterialShaders( material, THREE.ShaderLib[ 'phong' ] );
  661. } else if ( material instanceof THREE.LineBasicMaterial ) {
  662. setMaterialShaders( material, THREE.ShaderLib[ 'basic' ] );
  663. } else if ( material instanceof THREE.ParticleBasicMaterial ) {
  664. setMaterialShaders( material, THREE.ShaderLib[ 'particle_basic' ] );
  665. }
  666. // heuristics to create shader parameters according to lights in the scene
  667. // (not to blow over maxLights budget)
  668. maxLightCount = allocateLights( lights, 4 );
  669. parameters = { fog: fog, map: material.map, env_map: material.env_map, light_map: material.light_map, vertex_colors: material.vertex_colors,
  670. maxDirLights: maxLightCount.directional, maxPointLights: maxLightCount.point };
  671. material.program = buildProgram( material.fragment_shader, material.vertex_shader, parameters );
  672. identifiers = [ 'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'objectMatrix', 'cameraPosition' ];
  673. for( u in material.uniforms ) {
  674. identifiers.push(u);
  675. }
  676. cacheUniformLocations( material.program, identifiers );
  677. cacheAttributeLocations( material.program, [ "position", "normal", "uv", "uv2", "tangent", "color" ] );
  678. }
  679. };
  680. this.setProgram = function( camera, lights, fog, material, object ) {
  681. this.initMaterial( material, lights, fog );
  682. var program = material.program;
  683. if( program != _oldProgram ) {
  684. _gl.useProgram( program );
  685. _oldProgram = program;
  686. }
  687. this.loadCamera( program, camera );
  688. this.loadMatrices( program, object );
  689. if ( material instanceof THREE.MeshPhongMaterial ||
  690. material instanceof THREE.MeshLambertMaterial ) {
  691. this.setupLights( program, lights );
  692. refreshLights( material, this.lights );
  693. }
  694. if ( material instanceof THREE.MeshBasicMaterial ||
  695. material instanceof THREE.MeshLambertMaterial ||
  696. material instanceof THREE.MeshPhongMaterial ) {
  697. refreshUniformsCommon( material, fog );
  698. }
  699. if ( material instanceof THREE.LineBasicMaterial ) {
  700. refreshUniformsLine( material, fog );
  701. }
  702. if ( material instanceof THREE.ParticleBasicMaterial ) {
  703. refreshUniformsParticle( material, fog );
  704. }
  705. if ( material instanceof THREE.MeshPhongMaterial ) {
  706. refreshUniformsPhong( material );
  707. }
  708. if ( material instanceof THREE.MeshDepthMaterial ) {
  709. material.uniforms.mNear.value = camera.near;
  710. material.uniforms.mFar.value = camera.far;
  711. material.uniforms.opacity.value = material.opacity;
  712. }
  713. if ( material instanceof THREE.MeshNormalMaterial ) {
  714. material.uniforms.opacity.value = material.opacity;
  715. }
  716. setUniforms( program, material.uniforms );
  717. return program;
  718. };
  719. this.renderBuffer = function ( camera, lights, fog, material, geometryChunk, object ) {
  720. var program, attributes, linewidth, primitives;
  721. program = this.setProgram( camera, lights, fog, material, object );
  722. attributes = program.attributes;
  723. // vertices
  724. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLVertexBuffer );
  725. _gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );
  726. _gl.enableVertexAttribArray( attributes.position );
  727. // colors
  728. if ( attributes.color >= 0 ) {
  729. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLColorBuffer );
  730. _gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );
  731. _gl.enableVertexAttribArray( attributes.color );
  732. }
  733. // normals
  734. if ( attributes.normal >= 0 ) {
  735. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLNormalBuffer );
  736. _gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
  737. _gl.enableVertexAttribArray( attributes.normal );
  738. }
  739. // tangents
  740. if ( attributes.tangent >= 0 ) {
  741. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLTangentBuffer );
  742. _gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );
  743. _gl.enableVertexAttribArray( attributes.tangent );
  744. }
  745. // uvs
  746. if ( attributes.uv >= 0 ) {
  747. if ( geometryChunk.__webGLUVBuffer ) {
  748. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUVBuffer );
  749. _gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );
  750. _gl.enableVertexAttribArray( attributes.uv );
  751. } else {
  752. _gl.disableVertexAttribArray( attributes.uv );
  753. }
  754. }
  755. if ( attributes.uv2 >= 0 ) {
  756. if ( geometryChunk.__webGLUV2Buffer ) {
  757. _gl.bindBuffer( _gl.ARRAY_BUFFER, geometryChunk.__webGLUV2Buffer );
  758. _gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 );
  759. _gl.enableVertexAttribArray( attributes.uv2 );
  760. } else {
  761. _gl.disableVertexAttribArray( attributes.uv2 );
  762. }
  763. }
  764. // render lines
  765. if ( material.wireframe || material instanceof THREE.LineBasicMaterial ) {
  766. linewidth = material.wireframe_linewidth !== undefined ? material.wireframe_linewidth :
  767. material.linewidth !== undefined ? material.linewidth : 1;
  768. primitives = material instanceof THREE.LineBasicMaterial && object.type == THREE.LineStrip ? _gl.LINE_STRIP : _gl.LINES;
  769. _gl.lineWidth( linewidth );
  770. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLLineBuffer );
  771. _gl.drawElements( primitives, geometryChunk.__webGLLineCount, _gl.UNSIGNED_SHORT, 0 );
  772. // render particles
  773. } else if ( material instanceof THREE.ParticleBasicMaterial ) {
  774. _gl.drawArrays( _gl.POINTS, 0, geometryChunk.__webGLParticleCount );
  775. // render triangles
  776. } else {
  777. _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryChunk.__webGLFaceBuffer );
  778. _gl.drawElements( _gl.TRIANGLES, geometryChunk.__webGLFaceCount, _gl.UNSIGNED_SHORT, 0 );
  779. }
  780. };
  781. function renderBufferImmediate( object, program ) {
  782. if ( ! object.__webGLVertexBuffer ) object.__webGLVertexBuffer = _gl.createBuffer();
  783. if ( ! object.__webGLNormalBuffer ) object.__webGLNormalBuffer = _gl.createBuffer();
  784. if ( object.hasPos ) {
  785. _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLVertexBuffer );
  786. _gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );
  787. _gl.enableVertexAttribArray( program.attributes.position );
  788. _gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 0, 0 );
  789. }
  790. if ( object.hasNormal ) {
  791. _gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webGLNormalBuffer );
  792. _gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );
  793. _gl.enableVertexAttribArray( program.attributes.normal );
  794. _gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 0, 0 );
  795. }
  796. _gl.drawArrays( _gl.TRIANGLES, 0, object.count );
  797. object.count = 0;
  798. };
  799. this.renderPass = function ( camera, lights, fog, object, geometryChunk, blending, transparent ) {
  800. var i, l, m, ml, material, meshMaterial;
  801. for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
  802. meshMaterial = object.materials[ m ];
  803. if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
  804. for ( i = 0, l = geometryChunk.materials.length; i < l; i++ ) {
  805. material = geometryChunk.materials[ i ];
  806. if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
  807. this.setBlending( material.blending );
  808. this.setDepthTest( material.depth_test );
  809. this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
  810. }
  811. }
  812. } else {
  813. material = meshMaterial;
  814. if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
  815. this.setBlending( material.blending );
  816. this.setDepthTest( material.depth_test );
  817. this.renderBuffer( camera, lights, fog, material, geometryChunk, object );
  818. }
  819. }
  820. }
  821. };
  822. this.renderPassImmediate = function ( camera, lights, fog, object, blending, transparent ) {
  823. var i, l, m, ml, material, program;
  824. for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
  825. material = object.materials[ m ];
  826. if ( material && material.blending == blending && ( material.opacity < 1.0 == transparent ) ) {
  827. this.setBlending( material.blending );
  828. this.setDepthTest( material.depth_test );
  829. program = this.setProgram( camera, lights, fog, material, object );
  830. object.render( function( object ) { renderBufferImmediate( object, program ); } );
  831. }
  832. }
  833. };
  834. function setObjectFaces( object ) {
  835. if( object.doubleSided ) {
  836. _gl.disable( _gl.CULL_FACE );
  837. } else {
  838. _gl.enable( _gl.CULL_FACE );
  839. if( object.flipSided ) {
  840. _gl.frontFace( _gl.CW );
  841. }
  842. else {
  843. _gl.frontFace( _gl.CCW );
  844. }
  845. }
  846. };
  847. function computeFrustum( m ) {
  848. _frustum[ 0 ].set( m.n41 - m.n11, m.n42 - m.n12, m.n43 - m.n13, m.n44 - m.n14 );
  849. _frustum[ 1 ].set( m.n41 + m.n11, m.n42 + m.n12, m.n43 + m.n13, m.n44 + m.n14 );
  850. _frustum[ 2 ].set( m.n41 + m.n21, m.n42 + m.n22, m.n43 + m.n23, m.n44 + m.n24 );
  851. _frustum[ 3 ].set( m.n41 - m.n21, m.n42 - m.n22, m.n43 - m.n23, m.n44 - m.n24 );
  852. _frustum[ 4 ].set( m.n41 - m.n31, m.n42 - m.n32, m.n43 - m.n33, m.n44 - m.n34 );
  853. _frustum[ 5 ].set( m.n41 + m.n31, m.n42 + m.n32, m.n43 + m.n33, m.n44 + m.n34 );
  854. var i, plane;
  855. for ( i = 0; i < 5; i ++ ) {
  856. plane = _frustum[ i ];
  857. plane.divideScalar( Math.sqrt( plane.x * plane.x + plane.y * plane.y + plane.z * plane.z ) );
  858. }
  859. };
  860. function isInFrustum( object ) {
  861. var distance, matrix = object.matrix,
  862. radius = - object.geometry.boundingSphere.radius * Math.max( object.scale.x, Math.max( object.scale.y, object.scale.z ) );
  863. for ( var i = 0; i < 6; i ++ ) {
  864. distance = _frustum[ i ].x * matrix.n14 + _frustum[ i ].y * matrix.n24 + _frustum[ i ].z * matrix.n34 + _frustum[ i ].w;
  865. if ( distance <= radius ) return false;
  866. }
  867. return true;
  868. };
  869. this.render = function( scene, camera, renderTarget, clear ) {
  870. var o, ol, oil, webGLObject, object, buffer,
  871. lights = scene.lights,
  872. fog = scene.fog,
  873. ol;
  874. camera.autoUpdateMatrix && camera.updateMatrix();
  875. _viewMatrixArray.set( camera.matrix.flatten() );
  876. _projectionMatrixArray.set( camera.projectionMatrix.flatten() );
  877. _projScreenMatrix.multiply( camera.projectionMatrix, camera.matrix );
  878. computeFrustum( _projScreenMatrix );
  879. this.initWebGLObjects( scene, camera );
  880. setRenderTarget( renderTarget, clear !== undefined ? clear : true );
  881. if ( this.autoClear ) {
  882. this.clear();
  883. }
  884. // set matrices
  885. ol = scene.__webGLObjects.length;
  886. for ( o = 0; o < ol; o++ ) {
  887. webGLObject = scene.__webGLObjects[ o ];
  888. object = webGLObject.object;
  889. if ( object.visible && ( ! ( object instanceof THREE.Mesh ) || isInFrustum( object ) ) ) {
  890. if( object.autoUpdateMatrix ) {
  891. object.updateMatrix();
  892. object._objectMatrixArray.set( object.matrix.flatten() );
  893. }
  894. this.setupMatrices( object, camera );
  895. webGLObject.render = true;
  896. } else {
  897. webGLObject.render = false;
  898. }
  899. }
  900. oil = scene.__webGLObjectsImmediate.length;
  901. for ( o = 0; o < oil; o++ ) {
  902. object = scene.__webGLObjectsImmediate[ o ].object;
  903. if ( object.visible ) {
  904. if( object.autoUpdateMatrix ) {
  905. object.updateMatrix();
  906. object._objectMatrixArray.set( object.matrix.flatten() );
  907. }
  908. this.setupMatrices( object, camera );
  909. }
  910. }
  911. // opaque pass
  912. for ( o = 0; o < ol; o++ ) {
  913. webGLObject = scene.__webGLObjects[ o ];
  914. if ( webGLObject.render ) {
  915. object = webGLObject.object;
  916. buffer = webGLObject.buffer;
  917. setObjectFaces( object );
  918. this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, false );
  919. }
  920. }
  921. // opaque pass (immediate simulator)
  922. for ( o = 0; o < oil; o++ ) {
  923. object = scene.__webGLObjectsImmediate[ o ].object;
  924. if ( object.visible ) {
  925. setObjectFaces( object );
  926. this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, false );
  927. }
  928. }
  929. // transparent pass
  930. for ( o = 0; o < ol; o++ ) {
  931. webGLObject = scene.__webGLObjects[ o ];
  932. if ( webGLObject.render ) {
  933. object = webGLObject.object;
  934. buffer = webGLObject.buffer;
  935. setObjectFaces( object );
  936. // opaque blended materials
  937. this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, false );
  938. this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, false );
  939. // transparent blended materials
  940. this.renderPass( camera, lights, fog, object, buffer, THREE.AdditiveBlending, true );
  941. this.renderPass( camera, lights, fog, object, buffer, THREE.SubtractiveBlending, true );
  942. // transparent normal materials
  943. this.renderPass( camera, lights, fog, object, buffer, THREE.NormalBlending, true );
  944. // billboard materials
  945. this.renderPass( camera, lights, fog, object, buffer, THREE.BillboardBlending, false );
  946. }
  947. }
  948. // transparent pass (immediate simulator)
  949. for ( o = 0; o < oil; o++ ) {
  950. object = scene.__webGLObjectsImmediate[ o ].object;
  951. if ( object.visible ) {
  952. setObjectFaces( object );
  953. this.renderPassImmediate( camera, lights, fog, object, THREE.NormalBlending, true );
  954. }
  955. }
  956. // Generate mipmap if we're using any kind of mipmap filtering
  957. if ( renderTarget && renderTarget.min_filter !== THREE.NearestFilter && renderTarget.min_filter !== THREE.LinearFilter ) {
  958. updateRenderTargetMipmap( renderTarget );
  959. }
  960. };
  961. this.initWebGLObjects = function( scene, camera ) {
  962. function add_buffer( objmap, id, buffer, object ) {
  963. if ( objmap[ id ] == undefined ) {
  964. scene.__webGLObjects.push( { buffer: buffer, object: object } );
  965. objmap[ id ] = 1;
  966. }
  967. };
  968. function add_buffer_immediate( objmap, id, object ) {
  969. if ( objmap[ id ] == undefined ) {
  970. scene.__webGLObjectsImmediate.push( { object: object } );
  971. objmap[ id ] = 1;
  972. }
  973. };
  974. var o, ol, object, g, geometry, geometryChunk, objmap;
  975. if ( !scene.__webGLObjects ) {
  976. scene.__webGLObjects = [];
  977. scene.__webGLObjectsMap = {};
  978. scene.__webGLObjectsImmediate = [];
  979. }
  980. for ( o = 0, ol = scene.objects.length; o < ol; o++ ) {
  981. object = scene.objects[ o ];
  982. geometry = object.geometry;
  983. if ( scene.__webGLObjectsMap[ object.id ] == undefined ) {
  984. scene.__webGLObjectsMap[ object.id ] = {};
  985. object._modelViewMatrix = new THREE.Matrix4();
  986. object._normalMatrixArray = new Float32Array( 9 );
  987. object._modelViewMatrixArray = new Float32Array( 16 );
  988. object._objectMatrixArray = new Float32Array( 16 );
  989. object._objectMatrixArray.set( object.matrix.flatten() );
  990. }
  991. objmap = scene.__webGLObjectsMap[ object.id ];
  992. if ( object instanceof THREE.Mesh ) {
  993. // create separate VBOs per geometry chunk
  994. for ( g in geometry.geometryChunks ) {
  995. geometryChunk = geometry.geometryChunks[ g ];
  996. // initialise VBO on the first access
  997. if( ! geometryChunk.__webGLVertexBuffer ) {
  998. this.createMeshBuffers( geometryChunk );
  999. this.initMeshBuffers( geometryChunk, object );
  1000. geometry.__dirtyVertices = true;
  1001. geometry.__dirtyElements = true;
  1002. geometry.__dirtyUvs = true;
  1003. geometry.__dirtyNormals = true;
  1004. geometry.__dirtyTangents = true;
  1005. geometry.__dirtyColors = true;
  1006. }
  1007. if( geometry.__dirtyVertices || geometry.__dirtyElements ||
  1008. geometry.__dirtyUvs || geometry.__dirtyNormals ||
  1009. geometry.__dirtyColors || geometry.__dirtyTangents ) {
  1010. this.setMeshBuffers( geometryChunk, object, _gl.DYNAMIC_DRAW );
  1011. }
  1012. // create separate wrapper per each use of VBO
  1013. add_buffer( objmap, g, geometryChunk, object );
  1014. }
  1015. geometry.__dirtyVertices = false;
  1016. geometry.__dirtyElements = false;
  1017. geometry.__dirtyUvs = false;
  1018. geometry.__dirtyNormals = false;
  1019. geometry.__dirtyTangents = false;
  1020. geometry.__dirtyColors = false;
  1021. } else if ( object instanceof THREE.Line ) {
  1022. if( ! geometry.__webGLVertexBuffer ) {
  1023. this.createLineBuffers( geometry );
  1024. this.initLineBuffers( geometry );
  1025. geometry.__dirtyVertices = true;
  1026. geometry.__dirtyElements = true;
  1027. geometry.__dirtyColors = true;
  1028. }
  1029. if( geometry.__dirtyVertices || geometry.__dirtyColors ) {
  1030. this.setLineBuffers( geometry, _gl.DYNAMIC_DRAW );
  1031. }
  1032. add_buffer( objmap, 0, geometry, object );
  1033. geometry.__dirtyVertices = false;
  1034. geometry.__dirtyElements = false;
  1035. geometry.__dirtyColors = false;
  1036. } else if ( object instanceof THREE.ParticleSystem ) {
  1037. if( ! geometry.__webGLVertexBuffer ) {
  1038. this.createParticleBuffers( geometry );
  1039. this.initParticleBuffers( geometry );
  1040. geometry.__dirtyVertices = true;
  1041. geometry.__dirtyColors = true;
  1042. }
  1043. if( geometry.__dirtyVertices || geometry.__dirtyColors || object.sortParticles ) {
  1044. this.setParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object, camera );
  1045. }
  1046. add_buffer( objmap, 0, geometry, object );
  1047. geometry.__dirtyVertices = false;
  1048. geometry.__dirtyColors = false;
  1049. } else if ( object instanceof THREE.MarchingCubes ) {
  1050. add_buffer_immediate( objmap, 0, object );
  1051. }/*else if ( object instanceof THREE.Particle ) {
  1052. }*/
  1053. }
  1054. };
  1055. this.removeObject = function ( scene, object ) {
  1056. var o, ol, zobject;
  1057. for ( o = scene.__webGLObjects.length - 1; o >= 0; o-- ) {
  1058. zobject = scene.__webGLObjects[ o ].object;
  1059. if ( object == zobject ) {
  1060. scene.__webGLObjects.splice( o, 1 );
  1061. }
  1062. }
  1063. };
  1064. this.setupMatrices = function ( object, camera ) {
  1065. object._modelViewMatrix.multiplyToArray( camera.matrix, object.matrix, object._modelViewMatrixArray );
  1066. object._normalMatrix = THREE.Matrix4.makeInvert3x3( object._modelViewMatrix ).transposeIntoArray( object._normalMatrixArray );
  1067. };
  1068. this.loadMatrices = function ( program, object ) {
  1069. _gl.uniformMatrix4fv( program.uniforms.viewMatrix, false, _viewMatrixArray );
  1070. _gl.uniformMatrix4fv( program.uniforms.projectionMatrix, false, _projectionMatrixArray );
  1071. _gl.uniformMatrix4fv( program.uniforms.modelViewMatrix, false, object._modelViewMatrixArray );
  1072. _gl.uniformMatrix3fv( program.uniforms.normalMatrix, false, object._normalMatrixArray );
  1073. _gl.uniformMatrix4fv( program.uniforms.objectMatrix, false, object._objectMatrixArray );
  1074. };
  1075. this.loadCamera = function( program, camera ) {
  1076. _gl.uniform3f( program.uniforms.cameraPosition, camera.position.x, camera.position.y, camera.position.z );
  1077. };
  1078. this.setDepthTest = function( test ) {
  1079. if( test ) {
  1080. _gl.enable( _gl.DEPTH_TEST );
  1081. } else {
  1082. _gl.disable( _gl.DEPTH_TEST );
  1083. }
  1084. };
  1085. this.setBlending = function( blending ) {
  1086. switch ( blending ) {
  1087. case THREE.AdditiveBlending:
  1088. _gl.blendEquation( _gl.FUNC_ADD );
  1089. _gl.blendFunc( _gl.ONE, _gl.ONE );
  1090. break;
  1091. case THREE.SubtractiveBlending:
  1092. //_gl.blendEquation( _gl.FUNC_SUBTRACT );
  1093. _gl.blendFunc( _gl.DST_COLOR, _gl.ZERO );
  1094. break;
  1095. case THREE.BillboardBlending:
  1096. _gl.blendEquation( _gl.FUNC_ADD );
  1097. _gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA);
  1098. break;
  1099. default:
  1100. _gl.blendEquation( _gl.FUNC_ADD );
  1101. _gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
  1102. break;
  1103. }
  1104. };
  1105. this.setFaceCulling = function ( cullFace, frontFace ) {
  1106. if ( cullFace ) {
  1107. if ( !frontFace || frontFace == "ccw" ) {
  1108. _gl.frontFace( _gl.CCW );
  1109. } else {
  1110. _gl.frontFace( _gl.CW );
  1111. }
  1112. if( cullFace == "back" ) {
  1113. _gl.cullFace( _gl.BACK );
  1114. } else if( cullFace == "front" ) {
  1115. _gl.cullFace( _gl.FRONT );
  1116. } else {
  1117. _gl.cullFace( _gl.FRONT_AND_BACK );
  1118. }
  1119. _gl.enable( _gl.CULL_FACE );
  1120. } else {
  1121. _gl.disable( _gl.CULL_FACE );
  1122. }
  1123. };
  1124. this.supportsVertexTextures = function() {
  1125. return maxVertexTextures() > 0;
  1126. };
  1127. function maxVertexTextures() {
  1128. return _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );
  1129. };
  1130. function initGL( antialias, clearColor, clearAlpha ) {
  1131. try {
  1132. _gl = _canvas.getContext( 'experimental-webgl', { antialias: antialias } );
  1133. } catch(e) { console.log(e) }
  1134. if (!_gl) {
  1135. alert("WebGL not supported");
  1136. throw "cannot create webgl context";
  1137. }
  1138. _gl.clearColor( 0, 0, 0, 1 );
  1139. _gl.clearDepth( 1 );
  1140. _gl.enable( _gl.DEPTH_TEST );
  1141. _gl.depthFunc( _gl.LEQUAL );
  1142. _gl.frontFace( _gl.CCW );
  1143. _gl.cullFace( _gl.BACK );
  1144. _gl.enable( _gl.CULL_FACE );
  1145. _gl.enable( _gl.BLEND );
  1146. _gl.blendFunc( _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );
  1147. _gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );
  1148. };
  1149. function buildProgram( fragment_shader, vertex_shader, parameters ) {
  1150. var program = _gl.createProgram(),
  1151. prefix_fragment = [
  1152. "#ifdef GL_ES",
  1153. "precision highp float;",
  1154. "#endif",
  1155. "#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
  1156. "#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
  1157. parameters.fog ? "#define USE_FOG" : "",
  1158. parameters.fog instanceof THREE.FogExp2 ? "#define FOG_EXP2" : "",
  1159. parameters.map ? "#define USE_MAP" : "",
  1160. parameters.env_map ? "#define USE_ENVMAP" : "",
  1161. parameters.light_map ? "#define USE_LIGHTMAP" : "",
  1162. parameters.vertex_colors ? "#define USE_COLOR" : "",
  1163. "uniform mat4 viewMatrix;",
  1164. "uniform vec3 cameraPosition;",
  1165. ""
  1166. ].join("\n"),
  1167. prefix_vertex = [
  1168. maxVertexTextures() > 0 ? "#define VERTEX_TEXTURES" : "",
  1169. "#define MAX_DIR_LIGHTS " + parameters.maxDirLights,
  1170. "#define MAX_POINT_LIGHTS " + parameters.maxPointLights,
  1171. parameters.map ? "#define USE_MAP" : "",
  1172. parameters.env_map ? "#define USE_ENVMAP" : "",
  1173. parameters.light_map ? "#define USE_LIGHTMAP" : "",
  1174. parameters.vertex_colors ? "#define USE_COLOR" : "",
  1175. "uniform mat4 objectMatrix;",
  1176. "uniform mat4 modelViewMatrix;",
  1177. "uniform mat4 projectionMatrix;",
  1178. "uniform mat4 viewMatrix;",
  1179. "uniform mat3 normalMatrix;",
  1180. "uniform vec3 cameraPosition;",
  1181. "attribute vec3 position;",
  1182. "attribute vec3 normal;",
  1183. "attribute vec3 color;",
  1184. "attribute vec2 uv;",
  1185. "attribute vec2 uv2;",
  1186. ""
  1187. ].join("\n");
  1188. _gl.attachShader( program, getShader( "fragment", prefix_fragment + fragment_shader ) );
  1189. _gl.attachShader( program, getShader( "vertex", prefix_vertex + vertex_shader ) );
  1190. _gl.linkProgram( program );
  1191. if ( !_gl.getProgramParameter( program, _gl.LINK_STATUS ) ) {
  1192. alert( "Could not initialise shaders\n"+
  1193. "VALIDATE_STATUS: " + _gl.getProgramParameter( program, _gl.VALIDATE_STATUS ) + ", gl error [" + _gl.getError() + "]" );
  1194. //console.log( prefix_fragment + fragment_shader );
  1195. //console.log( prefix_vertex + vertex_shader );
  1196. }
  1197. //console.log( prefix_fragment + fragment_shader );
  1198. //console.log( prefix_vertex + vertex_shader );
  1199. program.uniforms = {};
  1200. program.attributes = {};
  1201. return program;
  1202. };
  1203. function setUniforms( program, uniforms ) {
  1204. var u, uniform, value, type, location, texture;
  1205. for( u in uniforms ) {
  1206. location = program.uniforms[u];
  1207. if ( !location ) continue;
  1208. uniform = uniforms[u];
  1209. type = uniform.type;
  1210. value = uniform.value;
  1211. if( type == "i" ) {
  1212. _gl.uniform1i( location, value );
  1213. } else if( type == "f" ) {
  1214. _gl.uniform1f( location, value );
  1215. } else if( type == "fv1" ) {
  1216. _gl.uniform1fv( location, value );
  1217. } else if( type == "fv" ) {
  1218. _gl.uniform3fv( location, value );
  1219. } else if( type == "v2" ) {
  1220. _gl.uniform2f( location, value.x, value.y );
  1221. } else if( type == "v3" ) {
  1222. _gl.uniform3f( location, value.x, value.y, value.z );
  1223. } else if( type == "c" ) {
  1224. _gl.uniform3f( location, value.r, value.g, value.b );
  1225. } else if( type == "t" ) {
  1226. _gl.uniform1i( location, value );
  1227. texture = uniform.texture;
  1228. if ( !texture ) continue;
  1229. if ( texture.image instanceof Array && texture.image.length == 6 ) {
  1230. setCubeTexture( texture, value );
  1231. } else {
  1232. setTexture( texture, value );
  1233. }
  1234. }
  1235. }
  1236. };
  1237. function setCubeTexture( texture, slot ) {
  1238. if ( texture.image.length == 6 ) {
  1239. if ( !texture.image.__webGLTextureCube &&
  1240. !texture.image.__cubeMapInitialized && texture.image.loadCount == 6 ) {
  1241. texture.image.__webGLTextureCube = _gl.createTexture();
  1242. _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
  1243. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );
  1244. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );
  1245. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MAG_FILTER, _gl.LINEAR );
  1246. _gl.texParameteri( _gl.TEXTURE_CUBE_MAP, _gl.TEXTURE_MIN_FILTER, _gl.LINEAR_MIPMAP_LINEAR );
  1247. for ( var i = 0; i < 6; ++i ) {
  1248. _gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image[ i ] );
  1249. }
  1250. _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );
  1251. _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );
  1252. texture.image.__cubeMapInitialized = true;
  1253. }
  1254. _gl.activeTexture( _gl.TEXTURE0 + slot );
  1255. _gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webGLTextureCube );
  1256. }
  1257. };
  1258. function setTexture( texture, slot ) {
  1259. if ( !texture.__webGLTexture && texture.image.loaded ) {
  1260. texture.__webGLTexture = _gl.createTexture();
  1261. _gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
  1262. _gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, _gl.RGBA, _gl.UNSIGNED_BYTE, texture.image );
  1263. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrap_s ) );
  1264. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrap_t ) );
  1265. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.mag_filter ) );
  1266. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.min_filter ) );
  1267. _gl.generateMipmap( _gl.TEXTURE_2D );
  1268. _gl.bindTexture( _gl.TEXTURE_2D, null );
  1269. }
  1270. _gl.activeTexture( _gl.TEXTURE0 + slot );
  1271. _gl.bindTexture( _gl.TEXTURE_2D, texture.__webGLTexture );
  1272. };
  1273. function setRenderTarget( renderTexture, clear ) {
  1274. if ( renderTexture && !renderTexture.__webGLFramebuffer ) {
  1275. renderTexture.__webGLFramebuffer = _gl.createFramebuffer();
  1276. renderTexture.__webGLRenderbuffer = _gl.createRenderbuffer();
  1277. renderTexture.__webGLTexture = _gl.createTexture();
  1278. // Setup renderbuffer
  1279. _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
  1280. _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTexture.width, renderTexture.height );
  1281. // Setup texture
  1282. _gl.bindTexture( _gl.TEXTURE_2D, renderTexture.__webGLTexture );
  1283. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, paramThreeToGL( renderTexture.wrap_s ) );
  1284. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, paramThreeToGL( renderTexture.wrap_t ) );
  1285. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( renderTexture.mag_filter ) );
  1286. _gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( renderTexture.min_filter ) );
  1287. _gl.texImage2D( _gl.TEXTURE_2D, 0, paramThreeToGL( renderTexture.format ), renderTexture.width, renderTexture.height, 0, paramThreeToGL( renderTexture.format ), paramThreeToGL( renderTexture.type ), null );
  1288. // Setup framebuffer
  1289. _gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTexture.__webGLFramebuffer );
  1290. _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, renderTexture.__webGLTexture, 0 );
  1291. _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTexture.__webGLRenderbuffer );
  1292. // Release everything
  1293. _gl.bindTexture( _gl.TEXTURE_2D, null );
  1294. _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
  1295. _gl.bindFramebuffer( _gl.FRAMEBUFFER, null);
  1296. }
  1297. var framebuffer, width, height;
  1298. if ( renderTexture ) {
  1299. framebuffer = renderTexture.__webGLFramebuffer;
  1300. width = renderTexture.width;
  1301. height = renderTexture.height;
  1302. } else {
  1303. framebuffer = null;
  1304. width = _canvas.width;
  1305. height = _canvas.height;
  1306. }
  1307. if( framebuffer != _oldFramebuffer ) {
  1308. _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
  1309. _gl.viewport( 0, 0, width, height );
  1310. if ( clear ) {
  1311. _gl.clear( _gl.COLOR_BUFFER_BIT | _gl.DEPTH_BUFFER_BIT );
  1312. }
  1313. _oldFramebuffer = framebuffer;
  1314. }
  1315. };
  1316. function updateRenderTargetMipmap( renderTarget ) {
  1317. _gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webGLTexture );
  1318. _gl.generateMipmap( _gl.TEXTURE_2D );
  1319. _gl.bindTexture( _gl.TEXTURE_2D, null );
  1320. };
  1321. function cacheUniformLocations( program, identifiers ) {
  1322. var i, l, id;
  1323. for( i = 0, l = identifiers.length; i < l; i++ ) {
  1324. id = identifiers[ i ];
  1325. program.uniforms[ id ] = _gl.getUniformLocation( program, id );
  1326. }
  1327. };
  1328. function cacheAttributeLocations( program, identifiers ) {
  1329. var i, l, id;
  1330. for( i = 0, l = identifiers.length; i < l; i++ ) {
  1331. id = identifiers[ i ];
  1332. program.attributes[ id ] = _gl.getAttribLocation( program, id );
  1333. }
  1334. };
  1335. function getShader( type, string ) {
  1336. var shader;
  1337. if ( type == "fragment" ) {
  1338. shader = _gl.createShader( _gl.FRAGMENT_SHADER );
  1339. } else if ( type == "vertex" ) {
  1340. shader = _gl.createShader( _gl.VERTEX_SHADER );
  1341. }
  1342. _gl.shaderSource( shader, string );
  1343. _gl.compileShader( shader );
  1344. if ( !_gl.getShaderParameter( shader, _gl.COMPILE_STATUS ) ) {
  1345. alert( _gl.getShaderInfoLog( shader ) );
  1346. return null;
  1347. }
  1348. return shader;
  1349. };
  1350. function paramThreeToGL( p ) {
  1351. switch ( p ) {
  1352. case THREE.RepeatWrapping: return _gl.REPEAT; break;
  1353. case THREE.ClampToEdgeWrapping: return _gl.CLAMP_TO_EDGE; break;
  1354. case THREE.MirroredRepeatWrapping: return _gl.MIRRORED_REPEAT; break;
  1355. case THREE.NearestFilter: return _gl.NEAREST; break;
  1356. case THREE.NearestMipMapNearestFilter: return _gl.NEAREST_MIPMAP_NEAREST; break;
  1357. case THREE.NearestMipMapLinearFilter: return _gl.NEAREST_MIPMAP_LINEAR; break;
  1358. case THREE.LinearFilter: return _gl.LINEAR; break;
  1359. case THREE.LinearMipMapNearestFilter: return _gl.LINEAR_MIPMAP_NEAREST; break;
  1360. case THREE.LinearMipMapLinearFilter: return _gl.LINEAR_MIPMAP_LINEAR; break;
  1361. case THREE.ByteType: return _gl.BYTE; break;
  1362. case THREE.UnsignedByteType: return _gl.UNSIGNED_BYTE; break;
  1363. case THREE.ShortType: return _gl.SHORT; break;
  1364. case THREE.UnsignedShortType: return _gl.UNSIGNED_SHORT; break;
  1365. case THREE.IntType: return _gl.INT; break;
  1366. case THREE.UnsignedShortType: return _gl.UNSIGNED_INT; break;
  1367. case THREE.FloatType: return _gl.FLOAT; break;
  1368. case THREE.AlphaFormat: return _gl.ALPHA; break;
  1369. case THREE.RGBFormat: return _gl.RGB; break;
  1370. case THREE.RGBAFormat: return _gl.RGBA; break;
  1371. case THREE.LuminanceFormat: return _gl.LUMINANCE; break;
  1372. case THREE.LuminanceAlphaFormat: return _gl.LUMINANCE_ALPHA; break;
  1373. }
  1374. return 0;
  1375. };
  1376. function materialNeedsSmoothNormals( material ) {
  1377. return material && material.shading != undefined && material.shading == THREE.SmoothShading;
  1378. };
  1379. function bufferNeedsSmoothNormals( geometryChunk, object ) {
  1380. var m, ml, i, l, meshMaterial, needsSmoothNormals = false;
  1381. for ( m = 0, ml = object.materials.length; m < ml; m++ ) {
  1382. meshMaterial = object.materials[ m ];
  1383. if ( meshMaterial instanceof THREE.MeshFaceMaterial ) {
  1384. for ( i = 0, l = geometryChunk.materials.length; i < l; i++ ) {
  1385. if ( materialNeedsSmoothNormals( geometryChunk.materials[ i ] ) ) {
  1386. needsSmoothNormals = true;
  1387. break;
  1388. }
  1389. }
  1390. } else {
  1391. if ( materialNeedsSmoothNormals( meshMaterial ) ) {
  1392. needsSmoothNormals = true;
  1393. break;
  1394. }
  1395. }
  1396. if ( needsSmoothNormals ) break;
  1397. }
  1398. return needsSmoothNormals;
  1399. };
  1400. function allocateLights( lights, maxLights ) {
  1401. var l, ll, light, dirLights, pointLights, maxDirLights, maxPointLights;
  1402. dirLights = pointLights = maxDirLights = maxPointLights = 0;
  1403. for ( l = 0, ll = lights.length; l < ll; l++ ) {
  1404. light = lights[ l ];
  1405. if ( light instanceof THREE.DirectionalLight ) dirLights++;
  1406. if ( light instanceof THREE.PointLight ) pointLights++;
  1407. }
  1408. if ( ( pointLights + dirLights ) <= maxLights ) {
  1409. maxDirLights = dirLights;
  1410. maxPointLights = pointLights;
  1411. } else {
  1412. maxDirLights = Math.ceil( maxLights * dirLights / ( pointLights + dirLights ) );
  1413. maxPointLights = maxLights - maxDirLights;
  1414. }
  1415. return { 'directional' : maxDirLights, 'point' : maxPointLights };
  1416. };
  1417. /* DEBUG
  1418. function getGLParams() {
  1419. var params = {
  1420. 'MAX_VARYING_VECTORS': _gl.getParameter( _gl.MAX_VARYING_VECTORS ),
  1421. 'MAX_VERTEX_ATTRIBS': _gl.getParameter( _gl.MAX_VERTEX_ATTRIBS ),
  1422. 'MAX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS ),
  1423. 'MAX_VERTEX_TEXTURE_IMAGE_UNITS': _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ),
  1424. 'MAX_COMBINED_TEXTURE_IMAGE_UNITS' : _gl.getParameter( _gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS ),
  1425. 'MAX_VERTEX_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS ),
  1426. 'MAX_FRAGMENT_UNIFORM_VECTORS': _gl.getParameter( _gl.MAX_FRAGMENT_UNIFORM_VECTORS )
  1427. }
  1428. return params;
  1429. };
  1430. function dumpObject( obj ) {
  1431. var p, str = "";
  1432. for ( p in obj ) {
  1433. str += p + ": " + obj[p] + "\n";
  1434. }
  1435. return str;
  1436. }
  1437. */
  1438. };
  1439. THREE.Snippets = {
  1440. // FOG
  1441. fog_pars_fragment: [
  1442. "#ifdef USE_FOG",
  1443. "uniform vec3 fogColor;",
  1444. "#ifdef FOG_EXP2",
  1445. "uniform float fogDensity;",
  1446. "#else",
  1447. "uniform float fogNear;",
  1448. "uniform float fogFar;",
  1449. "#endif",
  1450. "#endif"
  1451. ].join("\n"),
  1452. fog_fragment: [
  1453. "#ifdef USE_FOG",
  1454. "float depth = gl_FragCoord.z / gl_FragCoord.w;",
  1455. "#ifdef FOG_EXP2",
  1456. "const float LOG2 = 1.442695;",
  1457. "float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );",
  1458. "fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );",
  1459. "#else",
  1460. "float fogFactor = smoothstep( fogNear, fogFar, depth );",
  1461. "#endif",
  1462. "gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );",
  1463. "#endif"
  1464. ].join("\n"),
  1465. // ENVIRONMENT MAP
  1466. envmap_pars_fragment: [
  1467. "#ifdef USE_ENVMAP",
  1468. "varying vec3 vReflect;",
  1469. "uniform float reflectivity;",
  1470. "uniform samplerCube env_map;",
  1471. "uniform int combine;",
  1472. "#endif"
  1473. ].join("\n"),
  1474. envmap_fragment: [
  1475. "#ifdef USE_ENVMAP",
  1476. "vec4 cubeColor = textureCube( env_map, vec3( -vReflect.x, vReflect.yz ) );",
  1477. "if ( combine == 1 ) {",
  1478. //"gl_FragColor = mix( gl_FragColor, cubeColor, reflectivity );",
  1479. "gl_FragColor = vec4( mix( gl_FragColor.xyz, cubeColor.xyz, reflectivity ), opacity );",
  1480. "} else {",
  1481. "gl_FragColor = gl_FragColor * cubeColor;",
  1482. "}",
  1483. "#endif"
  1484. ].join("\n"),
  1485. envmap_pars_vertex: [
  1486. "#ifdef USE_ENVMAP",
  1487. "varying vec3 vReflect;",
  1488. "uniform float refraction_ratio;",
  1489. "uniform bool useRefract;",
  1490. "#endif"
  1491. ].join("\n"),
  1492. envmap_vertex : [
  1493. "#ifdef USE_ENVMAP",
  1494. "vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
  1495. "vec3 nWorld = mat3( objectMatrix[0].xyz, objectMatrix[1].xyz, objectMatrix[2].xyz ) * normal;",
  1496. "if ( useRefract ) {",
  1497. "vReflect = refract( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ), refraction_ratio );",
  1498. "} else {",
  1499. "vReflect = reflect( normalize( mPosition.xyz - cameraPosition ), normalize( nWorld.xyz ) );",
  1500. "}",
  1501. "#endif"
  1502. ].join("\n"),
  1503. // COLOR MAP (particles)
  1504. map_particle_pars_fragment: [
  1505. "#ifdef USE_MAP",
  1506. "uniform sampler2D map;",
  1507. "#endif"
  1508. ].join("\n"),
  1509. map_particle_fragment: [
  1510. "#ifdef USE_MAP",
  1511. "gl_FragColor = gl_FragColor * texture2D( map, gl_PointCoord );",
  1512. "#endif"
  1513. ].join("\n"),
  1514. // COLOR MAP (triangles)
  1515. map_pars_fragment: [
  1516. "#ifdef USE_MAP",
  1517. "varying vec2 vUv;",
  1518. "uniform sampler2D map;",
  1519. "#endif"
  1520. ].join("\n"),
  1521. map_pars_vertex: [
  1522. "#ifdef USE_MAP",
  1523. "varying vec2 vUv;",
  1524. "#endif"
  1525. ].join("\n"),
  1526. map_fragment: [
  1527. "#ifdef USE_MAP",
  1528. "gl_FragColor = gl_FragColor * texture2D( map, vUv );",
  1529. "#endif"
  1530. ].join("\n"),
  1531. map_vertex: [
  1532. "#ifdef USE_MAP",
  1533. "vUv = uv;",
  1534. "#endif"
  1535. ].join("\n"),
  1536. // LIGHT MAP
  1537. lightmap_pars_fragment: [
  1538. "#ifdef USE_LIGHTMAP",
  1539. "varying vec2 vUv2;",
  1540. "uniform sampler2D light_map;",
  1541. "#endif"
  1542. ].join("\n"),
  1543. lightmap_pars_vertex: [
  1544. "#ifdef USE_LIGHTMAP",
  1545. "varying vec2 vUv2;",
  1546. "#endif"
  1547. ].join("\n"),
  1548. lightmap_fragment: [
  1549. "#ifdef USE_LIGHTMAP",
  1550. "gl_FragColor = gl_FragColor * texture2D( light_map, vUv2 );",
  1551. "#endif"
  1552. ].join("\n"),
  1553. lightmap_vertex: [
  1554. "#ifdef USE_LIGHTMAP",
  1555. "vUv2 = uv2;",
  1556. "#endif"
  1557. ].join("\n"),
  1558. lights_pars_vertex: [
  1559. "uniform bool enableLighting;",
  1560. "uniform vec3 ambientLightColor;",
  1561. "#if MAX_DIR_LIGHTS > 0",
  1562. "uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];",
  1563. "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
  1564. "#endif",
  1565. "#if MAX_POINT_LIGHTS > 0",
  1566. "uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
  1567. "uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
  1568. "#ifdef PHONG",
  1569. "varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
  1570. "#endif",
  1571. "#endif"
  1572. ].join("\n"),
  1573. // LIGHTS
  1574. lights_vertex: [
  1575. "if ( !enableLighting ) {",
  1576. "vLightWeighting = vec3( 1.0 );",
  1577. "} else {",
  1578. "vLightWeighting = ambientLightColor;",
  1579. "#if MAX_DIR_LIGHTS > 0",
  1580. "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
  1581. "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
  1582. "float directionalLightWeighting = max( dot( transformedNormal, normalize( lDirection.xyz ) ), 0.0 );",
  1583. "vLightWeighting += directionalLightColor[ i ] * directionalLightWeighting;",
  1584. "}",
  1585. "#endif",
  1586. "#if MAX_POINT_LIGHTS > 0",
  1587. "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",
  1588. "vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
  1589. "vec3 pointLightVector = normalize( lPosition.xyz - mvPosition.xyz );",
  1590. "float pointLightWeighting = max( dot( transformedNormal, pointLightVector ), 0.0 );",
  1591. "vLightWeighting += pointLightColor[ i ] * pointLightWeighting;",
  1592. "#ifdef PHONG",
  1593. "vPointLightVector[ i ] = pointLightVector;",
  1594. "#endif",
  1595. "}",
  1596. "#endif",
  1597. "}"
  1598. ].join("\n"),
  1599. lights_pars_fragment: [
  1600. "#if MAX_DIR_LIGHTS > 0",
  1601. "uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];",
  1602. "#endif",
  1603. "#if MAX_POINT_LIGHTS > 0",
  1604. "varying vec3 vPointLightVector[ MAX_POINT_LIGHTS ];",
  1605. "#endif",
  1606. "varying vec3 vViewPosition;",
  1607. "varying vec3 vNormal;"
  1608. ].join("\n"),
  1609. lights_fragment: [
  1610. "vec3 normal = normalize( vNormal );",
  1611. "vec3 viewPosition = normalize( vViewPosition );",
  1612. "vec4 mColor = vec4( diffuse, opacity );",
  1613. "vec4 mSpecular = vec4( specular, opacity );",
  1614. "#if MAX_POINT_LIGHTS > 0",
  1615. "vec4 pointDiffuse = vec4( 0.0 );",
  1616. "vec4 pointSpecular = vec4( 0.0 );",
  1617. "for( int i = 0; i < MAX_POINT_LIGHTS; i++ ) {",
  1618. "vec3 pointVector = normalize( vPointLightVector[ i ] );",
  1619. "vec3 pointHalfVector = normalize( vPointLightVector[ i ] + vViewPosition );",
  1620. "float pointDotNormalHalf = dot( normal, pointHalfVector );",
  1621. "float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",
  1622. "float pointSpecularWeight = 0.0;",
  1623. "if ( pointDotNormalHalf >= 0.0 )",
  1624. "pointSpecularWeight = pow( pointDotNormalHalf, shininess );",
  1625. "pointDiffuse += mColor * pointDiffuseWeight;",
  1626. "pointSpecular += mSpecular * pointSpecularWeight;",
  1627. "}",
  1628. "#endif",
  1629. "#if MAX_DIR_LIGHTS > 0",
  1630. "vec4 dirDiffuse = vec4( 0.0 );",
  1631. "vec4 dirSpecular = vec4( 0.0 );" ,
  1632. "for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
  1633. "vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );",
  1634. "vec3 dirVector = normalize( lDirection.xyz );",
  1635. "vec3 dirHalfVector = normalize( lDirection.xyz + vViewPosition );",
  1636. "float dirDotNormalHalf = dot( normal, dirHalfVector );",
  1637. "float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
  1638. "float dirSpecularWeight = 0.0;",
  1639. "if ( dirDotNormalHalf >= 0.0 )",
  1640. "dirSpecularWeight = pow( dirDotNormalHalf, shininess );",
  1641. "dirDiffuse += mColor * dirDiffuseWeight;",
  1642. "dirSpecular += mSpecular * dirSpecularWeight;",
  1643. "}",
  1644. "#endif",
  1645. "vec4 totalLight = vec4( ambient, opacity );",
  1646. "#if MAX_DIR_LIGHTS > 0",
  1647. "totalLight += dirDiffuse + dirSpecular;",
  1648. "#endif",
  1649. "#if MAX_POINT_LIGHTS > 0",
  1650. "totalLight += pointDiffuse + pointSpecular;",
  1651. "#endif",
  1652. "gl_FragColor = gl_FragColor * totalLight;"
  1653. ].join("\n"),
  1654. // VERTEX COLORS
  1655. color_pars_fragment: [
  1656. "#ifdef USE_COLOR",
  1657. "varying vec3 vColor;",
  1658. "#endif"
  1659. ].join("\n"),
  1660. color_fragment: [
  1661. "#ifdef USE_COLOR",
  1662. "gl_FragColor = gl_FragColor * vec4( vColor, opacity );",
  1663. "#endif"
  1664. ].join("\n"),
  1665. color_pars_vertex: [
  1666. "#ifdef USE_COLOR",
  1667. "varying vec3 vColor;",
  1668. "#endif"
  1669. ].join("\n"),
  1670. color_vertex: [
  1671. "#ifdef USE_COLOR",
  1672. "vColor = color;",
  1673. "#endif"
  1674. ].join("\n")
  1675. };
  1676. THREE.UniformsLib = {
  1677. common: {
  1678. "diffuse" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
  1679. "opacity" : { type: "f", value: 1.0 },
  1680. "map" : { type: "t", value: 0, texture: null },
  1681. "light_map" : { type: "t", value: 2, texture: null },
  1682. "env_map" : { type: "t", value: 1, texture: null },
  1683. "useRefract" : { type: "i", value: 0 },
  1684. "reflectivity" : { type: "f", value: 1.0 },
  1685. "refraction_ratio": { type: "f", value: 0.98 },
  1686. "combine" : { type: "i", value: 0 },
  1687. "fogDensity": { type: "f", value: 0.00025 },
  1688. "fogNear" : { type: "f", value: 1 },
  1689. "fogFar" : { type: "f", value: 2000 },
  1690. "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
  1691. },
  1692. lights: {
  1693. "enableLighting" : { type: "i", value: 1 },
  1694. "ambientLightColor" : { type: "fv", value: [] },
  1695. "directionalLightDirection" : { type: "fv", value: [] },
  1696. "directionalLightColor" : { type: "fv", value: [] },
  1697. "pointLightPosition" : { type: "fv", value: [] },
  1698. "pointLightColor" : { type: "fv", value: [] }
  1699. },
  1700. particle: {
  1701. "psColor" : { type: "c", value: new THREE.Color( 0xeeeeee ) },
  1702. "opacity" : { type: "f", value: 1.0 },
  1703. "size" : { type: "f", value: 1.0 },
  1704. "map" : { type: "t", value: 0, texture: null },
  1705. "fogDensity": { type: "f", value: 0.00025 },
  1706. "fogNear" : { type: "f", value: 1 },
  1707. "fogFar" : { type: "f", value: 2000 },
  1708. "fogColor" : { type: "c", value: new THREE.Color( 0xffffff ) }
  1709. }
  1710. };
  1711. THREE.ShaderLib = {
  1712. 'depth': {
  1713. uniforms: { "mNear": { type: "f", value: 1.0 },
  1714. "mFar" : { type: "f", value: 2000.0 },
  1715. "opacity" : { type: "f", value: 1.0 }
  1716. },
  1717. fragment_shader: [
  1718. "uniform float mNear;",
  1719. "uniform float mFar;",
  1720. "uniform float opacity;",
  1721. "void main() {",
  1722. "float depth = gl_FragCoord.z / gl_FragCoord.w;",
  1723. "float color = 1.0 - smoothstep( mNear, mFar, depth );",
  1724. "gl_FragColor = vec4( vec3( color ), opacity );",
  1725. "}"
  1726. ].join("\n"),
  1727. vertex_shader: [
  1728. "void main() {",
  1729. "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
  1730. "}"
  1731. ].join("\n")
  1732. },
  1733. 'normal': {
  1734. uniforms: { "opacity" : { type: "f", value: 1.0 } },
  1735. fragment_shader: [
  1736. "uniform float opacity;",
  1737. "varying vec3 vNormal;",
  1738. "void main() {",
  1739. "gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );",
  1740. "}"
  1741. ].join("\n"),
  1742. vertex_shader: [
  1743. "varying vec3 vNormal;",
  1744. "void main() {",
  1745. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1746. "vNormal = normalize( normalMatrix * normal );",
  1747. "gl_Position = projectionMatrix * mvPosition;",
  1748. "}"
  1749. ].join("\n")
  1750. },
  1751. 'basic': {
  1752. uniforms: THREE.UniformsLib[ "common" ],
  1753. fragment_shader: [
  1754. "uniform vec3 diffuse;",
  1755. "uniform float opacity;",
  1756. THREE.Snippets[ "color_pars_fragment" ],
  1757. THREE.Snippets[ "map_pars_fragment" ],
  1758. THREE.Snippets[ "lightmap_pars_fragment" ],
  1759. THREE.Snippets[ "envmap_pars_fragment" ],
  1760. THREE.Snippets[ "fog_pars_fragment" ],
  1761. "void main() {",
  1762. "gl_FragColor = vec4( diffuse, opacity );",
  1763. THREE.Snippets[ "map_fragment" ],
  1764. THREE.Snippets[ "lightmap_fragment" ],
  1765. THREE.Snippets[ "color_fragment" ],
  1766. THREE.Snippets[ "envmap_fragment" ],
  1767. THREE.Snippets[ "fog_fragment" ],
  1768. "}"
  1769. ].join("\n"),
  1770. vertex_shader: [
  1771. THREE.Snippets[ "map_pars_vertex" ],
  1772. THREE.Snippets[ "lightmap_pars_vertex" ],
  1773. THREE.Snippets[ "envmap_pars_vertex" ],
  1774. THREE.Snippets[ "color_pars_vertex" ],
  1775. "void main() {",
  1776. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1777. THREE.Snippets[ "map_vertex" ],
  1778. THREE.Snippets[ "lightmap_vertex" ],
  1779. THREE.Snippets[ "envmap_vertex" ],
  1780. THREE.Snippets[ "color_vertex" ],
  1781. "gl_Position = projectionMatrix * mvPosition;",
  1782. "}"
  1783. ].join("\n")
  1784. },
  1785. 'lambert': {
  1786. uniforms: Uniforms.merge( [ THREE.UniformsLib[ "common" ],
  1787. THREE.UniformsLib[ "lights" ] ] ),
  1788. fragment_shader: [
  1789. "uniform vec3 diffuse;",
  1790. "uniform float opacity;",
  1791. "varying vec3 vLightWeighting;",
  1792. THREE.Snippets[ "color_pars_fragment" ],
  1793. THREE.Snippets[ "map_pars_fragment" ],
  1794. THREE.Snippets[ "lightmap_pars_fragment" ],
  1795. THREE.Snippets[ "envmap_pars_fragment" ],
  1796. THREE.Snippets[ "fog_pars_fragment" ],
  1797. "void main() {",
  1798. "gl_FragColor = vec4( diffuse, opacity );",
  1799. "gl_FragColor = gl_FragColor * vec4( vLightWeighting, 1.0 );",
  1800. THREE.Snippets[ "map_fragment" ],
  1801. THREE.Snippets[ "lightmap_fragment" ],
  1802. THREE.Snippets[ "color_fragment" ],
  1803. THREE.Snippets[ "envmap_fragment" ],
  1804. THREE.Snippets[ "fog_fragment" ],
  1805. "}"
  1806. ].join("\n"),
  1807. vertex_shader: [
  1808. "varying vec3 vLightWeighting;",
  1809. THREE.Snippets[ "map_pars_vertex" ],
  1810. THREE.Snippets[ "lightmap_pars_vertex" ],
  1811. THREE.Snippets[ "envmap_pars_vertex" ],
  1812. THREE.Snippets[ "lights_pars_vertex" ],
  1813. THREE.Snippets[ "color_pars_vertex" ],
  1814. "void main() {",
  1815. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1816. THREE.Snippets[ "map_vertex" ],
  1817. THREE.Snippets[ "lightmap_vertex" ],
  1818. THREE.Snippets[ "envmap_vertex" ],
  1819. THREE.Snippets[ "color_vertex" ],
  1820. "vec3 transformedNormal = normalize( normalMatrix * normal );",
  1821. THREE.Snippets[ "lights_vertex" ],
  1822. "gl_Position = projectionMatrix * mvPosition;",
  1823. "}"
  1824. ].join("\n")
  1825. },
  1826. 'phong': {
  1827. uniforms: Uniforms.merge( [ THREE.UniformsLib[ "common" ],
  1828. THREE.UniformsLib[ "lights" ],
  1829. { "ambient" : { type: "c", value: new THREE.Color( 0x050505 ) },
  1830. "specular" : { type: "c", value: new THREE.Color( 0x111111 ) },
  1831. "shininess": { type: "f", value: 30 }
  1832. }
  1833. ] ),
  1834. fragment_shader: [
  1835. "uniform vec3 diffuse;",
  1836. "uniform float opacity;",
  1837. "uniform vec3 ambient;",
  1838. "uniform vec3 specular;",
  1839. "uniform float shininess;",
  1840. "varying vec3 vLightWeighting;",
  1841. THREE.Snippets[ "color_pars_fragment" ],
  1842. THREE.Snippets[ "map_pars_fragment" ],
  1843. THREE.Snippets[ "lightmap_pars_fragment" ],
  1844. THREE.Snippets[ "envmap_pars_fragment" ],
  1845. THREE.Snippets[ "fog_pars_fragment" ],
  1846. THREE.Snippets[ "lights_pars_fragment" ],
  1847. "void main() {",
  1848. "gl_FragColor = vec4( vLightWeighting, 1.0 );",
  1849. THREE.Snippets[ "lights_fragment" ],
  1850. THREE.Snippets[ "map_fragment" ],
  1851. THREE.Snippets[ "lightmap_fragment" ],
  1852. THREE.Snippets[ "color_fragment" ],
  1853. THREE.Snippets[ "envmap_fragment" ],
  1854. THREE.Snippets[ "fog_fragment" ],
  1855. "}"
  1856. ].join("\n"),
  1857. vertex_shader: [
  1858. "#define PHONG",
  1859. "varying vec3 vLightWeighting;",
  1860. "varying vec3 vViewPosition;",
  1861. "varying vec3 vNormal;",
  1862. THREE.Snippets[ "map_pars_vertex" ],
  1863. THREE.Snippets[ "lightmap_pars_vertex" ],
  1864. THREE.Snippets[ "envmap_pars_vertex" ],
  1865. THREE.Snippets[ "lights_pars_vertex" ],
  1866. THREE.Snippets[ "color_pars_vertex" ],
  1867. "void main() {",
  1868. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1869. THREE.Snippets[ "map_vertex" ],
  1870. THREE.Snippets[ "lightmap_vertex" ],
  1871. THREE.Snippets[ "envmap_vertex" ],
  1872. THREE.Snippets[ "color_vertex" ],
  1873. "#ifndef USE_ENVMAP",
  1874. "vec4 mPosition = objectMatrix * vec4( position, 1.0 );",
  1875. "#endif",
  1876. "vViewPosition = cameraPosition - mPosition.xyz;",
  1877. "vec3 transformedNormal = normalize( normalMatrix * normal );",
  1878. "vNormal = transformedNormal;",
  1879. THREE.Snippets[ "lights_vertex" ],
  1880. "gl_Position = projectionMatrix * mvPosition;",
  1881. "}"
  1882. ].join("\n")
  1883. },
  1884. 'particle_basic': {
  1885. uniforms: THREE.UniformsLib[ "particle" ],
  1886. fragment_shader: [
  1887. "uniform vec3 psColor;",
  1888. "uniform float opacity;",
  1889. THREE.Snippets[ "color_pars_fragment" ],
  1890. THREE.Snippets[ "map_particle_pars_fragment" ],
  1891. THREE.Snippets[ "fog_pars_fragment" ],
  1892. "void main() {",
  1893. "gl_FragColor = vec4( psColor, opacity );",
  1894. THREE.Snippets[ "map_particle_fragment" ],
  1895. THREE.Snippets[ "color_fragment" ],
  1896. THREE.Snippets[ "fog_fragment" ],
  1897. "}"
  1898. ].join("\n"),
  1899. vertex_shader: [
  1900. "uniform float size;",
  1901. THREE.Snippets[ "color_pars_vertex" ],
  1902. "void main() {",
  1903. THREE.Snippets[ "color_vertex" ],
  1904. "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
  1905. "gl_Position = projectionMatrix * mvPosition;",
  1906. "gl_PointSize = size;",
  1907. //"gl_PointSize = 10.0 + 6.0 * mvPosition.z;";
  1908. "}"
  1909. ].join("\n")
  1910. }
  1911. };
粤ICP备19079148号