From 1df451ec48e78ec9d73a01d02d767cf1ca741847 Mon Sep 17 00:00:00 2001 From: Marcus Ihde Date: Wed, 19 Mar 2014 23:22:46 +0100 Subject: [PATCH] Add glow animation and chromatic aberration. --- gfx/cone_normal.png | Bin 1337 -> 1353 bytes gfx/led.png | Bin 0 -> 1431 bytes gfx/led2.png | Bin 0 -> 967 bytes gfx/led3.png | Bin 0 -> 1345 bytes gfx/led_glow.png | Bin 0 -> 1370 bytes gfx/led_glow2.png | Bin 0 -> 1019 bytes gfx/led_glow3.png | Bin 0 -> 1316 bytes gfx/led_normal.png | Bin 0 -> 981 bytes gfx/machine.png | Bin 1244 -> 1223 bytes gfx/machine2.png | Bin 1346 -> 1351 bytes gfx/machine2_glow.png | Bin 988 -> 1082 bytes gfx/machine_glow.png | Bin 979 -> 990 bytes gfx/water.png | Bin 11007 -> 37290 bytes light.lua | 55 +++++++++++++---- main.lua | 100 +++++++++++++++++++++++++------ postshader.lua | 37 ++++++++++-- shader/chromatic_aberration.glsl | 13 ++++ shader/glow.glsl | 20 +++++++ 18 files changed, 190 insertions(+), 35 deletions(-) create mode 100644 gfx/led.png create mode 100644 gfx/led2.png create mode 100644 gfx/led3.png create mode 100644 gfx/led_glow.png create mode 100644 gfx/led_glow2.png create mode 100644 gfx/led_glow3.png create mode 100644 gfx/led_normal.png create mode 100644 shader/chromatic_aberration.glsl create mode 100644 shader/glow.glsl diff --git a/gfx/cone_normal.png b/gfx/cone_normal.png index 879997fb75f33d0819ca6c4f60a12161ecd4a828..34c52753b26e2bc648c3137f787f0207fddb5196 100644 GIT binary patch delta 219 zcmV<103`pp3dstvR0ImQ000iR0UVE8L6cqtD1WX=L_t(IPwkV*5`r)gL=zO3sJMl8 zkGuT;7skml(UhDlkM@P3ACR7@LD;Be6yFP9NGTDewf2?+g>#QlRO&i_0;sBr-!R4i zLI6jEsz8 zP#_{A0u};EFu_G3k|LrI2_~3g1Pzp7z$PvxCi@IXO8MCAb7P53f8FNXy8gO7IH^3W-ZdN{vcD0udNi zR5S>Z|JaQJB{*z$K$0k?<N2bPDNB8 zb~7$DE;u(kfL#Cp1r$j{K~zXf?N)0roM#kvSwT=Cl2#LmwHLQ#kzJQ{iED^Phms6c z_xt_2!XgM0i6o6MObjD2mXaDFLS#`PEaQ??7P+-XsTx024IN`T=wozDJN>4a$qc{x z&DnR(d(L^k^E~IAcX!2-l9ICb?7_>$@afyL=l=xnE$v?=+Or;K?^lBNGX3Cy{hcC* zieZ!dmXm&YHl=;mCC~KJs?Bc-G(v8$avSN<#n{@F4H{o*w!I^yhToz_6e1q0#jVb> z)uOI(XTHF^yop`aX7+m7yGdxfL;4>K!tM)mg)<3{zW?fOM^xibQrk=a>TchvuGr?$ zh=#$e-l^1%S1yGO(1X8ume@LmEwAg%7bVT1_5FQgiDOe)qi@rH{i6cw#7r(h0=?8K z&6pCif;OP0gx+NG_*+|BB9X|dsM|2Jj-A)UxzP@C3~nU^BoLsJSgxH=2D-G!qRJMN z>UK_Dm!)vZb$HgDAOWyPKN!YKcb|=ojrH~Qm6etJpTN|2-zY<%M^pfZINv z*7^G9>fCkhGMFaDzICg*NRf}kPVPOFbS|?@z9GyUuzy{vs<>l4Y z?Xab#B`~{C)`|cqXj@=S&+Kov(GP+I0H~W>K@PfxS_3b}36>MSxkg#_s5p?CUTZy- z(~wr*T{peH%Y(}ofWhhF9`woa-U|#KVsL~Y!KI!b;~qW_s_o5u`U8sVRnd-eL&v~` z)b*han3k)<^97>|DNiPPXO=cMHyfY7tLc9kz<+vCFo}u6S&U!az%05#kN^-+M^qEz zgek(jLov$!7CP)ZI*b@3t@t}2hgs5!EyWbU%SgG0I|K{7uppQq0VW~+ySG3W(=>vC z0Vs?-sDKs}lo+_s1{50PzzHr~h|)K|!wUiYc&=<~s5_I=b%EJLD5jBG3rhW+CklRhv18H?> z8M2JLw!ECCoTS_VWtOtMj=U^YR!U7u#Z<*1r$F+kq__-8LY9QBl93Y4!`mz&O@X06 zar2~~_c02MwaLgc2#z+6;lfV9z%W6>aFj;?E#E7hGEcqxVEK~vT} zF0HOavtk}*sA-rpAiDN!HDgV7Fq>EUb!OS^(967lOm1*?>c!&g1PR2X#N|F#6h9y# zE+Z*%PzoeS3eqwv@&^vds!>!(^4nVoyoiA!MiPfECM98F&Cp|0AY?67Lo+&!aa`N* zBte421ec`5&jb7|!a{A+c^6nNRtG66;6bs_Q`Axw|5Pq2@=QdyJtT$e78`RmA^x17 zFUR{!ODT<`Ftg5sH%|oy}6UwINd}3fRJEXRAS@euMy`Z`1g5UY;x@kB)NW zrJawD`z$WjIXLJvERhioG0{%`e&(>ijsSp7OZ5O)xH2<5p@UgqfF)?3QY`6?zK#qG8~eHcB(gFvFf#=B zgt!(L7c(4?VEC`t(9m$?$Pu8jQ7{?;BPRqJj*GYgeal(k5n0T@z_$y88AbP-T>=V9 zmbgZg1m~xflqVLYG6W=M=9TFAxrQi|8S9zqS(sZl!~zvrc)B=-SokL=BplVex?Zh=#(1H;m7{IoUH_e24&r NwWq6}%Q~loCIDGWJ$(QG literal 0 HcmV?d00001 diff --git a/gfx/led3.png b/gfx/led3.png new file mode 100644 index 0000000000000000000000000000000000000000..61dd0b187b1a79166e831face9a87aff32efaa1c GIT binary patch literal 1345 zcmeAS@N?(olHy`uVBq!ia0vp^3P3E!!3-p;uDp>3QY`6?zK#qG8~eHcB(gFvFf#=B zgt!(L7hecqxD>>2EsWtt1jDT;hI?@g4-yz2B{4inVR)9t@FIiZRTjgW9ENv!3?B*@ zJ{2*1DPj0l#_*$p;a3&IpBjdLbqxO-82>ji{cmFa-^}vAh4p_c+y6H9|Lq+AJ2?M$ za{ce({@=~>zlZmKFW>(@{{Q^~|0f9kpD6TylJNh@BLAm|{+}xLf13FJ=@S2ENdBKG z^?#Q1|JgGC=g9t_EBAk%{Qvn1{}(9!U#Rqdk@Ei~s{fa3G&D3EIdTN(qfsy#0u+V- z-!|(~pb?w}9+AZi417C5m~jW2_WHRs#!w6kfOPoMo||KOeK`=ZwEoC6-ZzmKxo+9YJUr0l&c5jIt}kZ| zE%HkOo}TJ%2)@<3=zgrS%cRzr&h{t9(tKRGoN4MQf6p>@Zf%AZ9CY&Al&upSYvebPjma%=WhLH47)$I U!{gs2c~H{vboFyt=akR{02jAUqyPW_ literal 0 HcmV?d00001 diff --git a/gfx/led_glow.png b/gfx/led_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..2b22eed1cd3b56c0f4b36111bb074d13fa6ff362 GIT binary patch literal 1370 zcmV-g1*Q6lP)N2bPDNB8 zb~7$DE;u(kfL#Cp1lLJKK~zXf?Nxb<6LlCRM*Tw~i6|Nc6ivi~pklZ^Ap(o6&~tju zv@_GY-R`n1t4I(1a>)YSPVebVJDpD3op!qm;u0VRf}%tsB1i;0)@S&4 z{w6V@dHM3b_ulvWCcj=IMqGPcyMb#ra20PLYrDid{!EyDPh0)~Pns{FHlxEOW*9nW zJRdili|Nja)IT}<<+5kE;2O?YFQN+M-x58nc>lxhMW+F{8V_CzT*h%~=&$`tG4m_$ z_yrj1#zDVT{g-6+f<&K3CZ;<9j!f2e8U$6O&gPwG_PlVc;=71Iia1qtpVL?%vp=PX zBRg9fWzVUC>-)6jD2PO#%sY>Z)QO_|hpg?pitp#4Zal}i67wTmjHsbAyyF-Eg)<%k zNtzGuTG+3#Kp?*Ya^0YyfFahXe`J(KNrZ2yyLTGba#r_ zFx1U~mpxmKuFQzkCU7;h<3Q&=SXKX561^Fa*)PCrfo(barET~MfdwB*Cw*Iw?Uxuj`bq-UL&$8V|@!5iT=8 z6%xG$0n8TNuOWY+b3@L)GNxOqu|N&2+Pj#}JKGDcPLWzFv)w?72nu9};(bY?yBd+z z(90fd?abODRsYLH_cG|<72k@1_BF`kkP@>zX%1+9(E^G$)EA7_0&OM64?ftjyy}k} z>{Hk&$R$GrA0V#TQ0wpuH#9PEHPG8&5xR%$! z3(KC?qPrzUJY8@tP(ucRoL3JUOU(0I=RPb_^V61Ra`w4#!)&;HK|NZC2+QoEUj3}B zZ4N{PG!_)yvzyVDMr6LsK9#mi0j~w-CQOeA_2Xfwq3JpMM2uu@_a{sfc*g^9F(uKH(P}Kn+U_VZ6VjG35`E85_tb&*$>6oX zM2M&&H7;Qq4J%{49Z9qR@3=Fj8wC+b&Ug!SHT0m&-Ybw}HGk|z_P31}$eRl=}A zRXzjJ-0QZcgJ)iAgZCelI9yq%xENY_M3ReNX0t_`V}i~xGqK9coqLC c|M#o@1)1anxZQpxd;kCd07*qoM6N<$g3-f#E&u=k literal 0 HcmV?d00001 diff --git a/gfx/led_glow2.png b/gfx/led_glow2.png new file mode 100644 index 0000000000000000000000000000000000000000..c18cd92b2faf6520e51be43911c633234eab00b1 GIT binary patch literal 1019 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 N002ovPDHLkV1gdGwzmKP diff --git a/gfx/machine2.png b/gfx/machine2.png index f0f4ec7a3466262016c2fe9db19acdd2532502ac..956a463ab2b257dc0ffee22323540ba3e825682f 100644 GIT binary patch delta 249 zcmVh000iN z0poJqQ7Xb>k000iQ z0nW&|rITI+D1WC(L_t(IPo0xN7KAVeL#xi*|HvZ=gcd~?!@^hiB?993g?+;04<0P| z4YMOd05j^4$Ut6Jk|BU54l>%fk$*t{4wJeT>je|s`$$kb=UvZe4B$8_p#KUUq)=Px zN!3Sk2RW-M#ukyW@7}C>g+IakO1y}2mrx$P54zNgXFVC>0_v=m^+~X8wOsmmM-Q-t ujd9^n? ztQ}^O5h1iivn>xPw9zJ}Na3Je6wI%L(P4f-5z%W9yu*8!AN<~I{z$>28nFbxDL_=V z0H@XJPN2BN0|bEu>2d0gQFS|Ad4+9w--@jAp%Nh=3XB2MKpL0_n2WKT=rAe(~l?t+g)RSlZyhnE5=Xxm@Z+OW8 zl6`#)lOwt2Bm23YA7LhwTW{^ZB#Pyq9b)bdsk^@U79h`Q%A=CSj#-DVann9A)L^P@ z(%Y`Oo*Q=fH|#}O*^;?Bus=Cw9rs+mc>Yqt;u8+2Rz4?HKPo=HUTG6D-;hPOSCx><+puF0HLr;%vI0oE%qo&p9KJ(oU&#n^V7M eD4^3PWT7t-vq!NsP}Y^o>7c=EHNB~GJ@^NWm*cMh delta 151 zcmdnRaff|^4Vyg!Lp=k-W(UTfjFSTx|4B{^wt2w7z`$AH5n0T@z_$&A8PA>AxpZ<6 zvqqAyr;B5Vg@1B_1ZxN8tDnm{r-UW| D_GC1Q diff --git a/gfx/machine_glow.png b/gfx/machine_glow.png index 897c0da0c0fee652013805d63773bc59cc833576..4cb1f4e5235aa53b718ed30f01d55d061cf57a0a 100644 GIT binary patch delta 163 zcmcc2evf^Eji~&8Bl-U+|K%C}%NzZd2QsGpmp`#F@CB2klNi?q1_lPs0*}aI1_r*J zAk4UfO??04AZCpee@_?35DWje6Eyi43b Pw2{Hn)z4*}Q$iB}!kRsi delta 149 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 a?f(NxrEO@5>>$Me0000>*AOi+u!GIqyAQuMY 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 diff --git a/light.lua b/light.lua index 648e3fe..82b12bf 100644 --- a/light.lua +++ b/light.lua @@ -39,10 +39,13 @@ function love.light.newWorld() o.reflectionMap2 = love.graphics.newCanvas() o.glowBlur = 1.0 o.isGlowBlur = false + o.glowTimer = 0.0 + o.glowDown = false o.refractionStrength = 8.0 o.pixelShadow = love.graphics.newCanvas() o.pixelShadow2 = love.graphics.newCanvas() o.shader = love.graphics.newShader("shader/poly_shadow.glsl") + o.glowShader = love.graphics.newShader("shader/glow.glsl") o.normalShader = love.graphics.newShader("shader/normal.glsl") o.refractionShader = love.graphics.newShader("shader/refraction.glsl") o.refractionShader:send("screen", {love.window.getWidth(), love.window.getHeight()}) @@ -234,7 +237,7 @@ function love.light.newWorld() love.graphics.setBlendMode("alpha") -- create glow map - if o.changed then + --if o.changed then o.glowMap:clear(0, 0, 0) love.graphics.setCanvas(o.glowMap) for i = 1, #o.circle do @@ -255,17 +258,34 @@ function love.light.newWorld() love.graphics.polygon("fill", unpack(o.poly[i].data)) end end - for i = 1, #o.img do - if o.img[i].glow then - love.graphics.setColor(o.img[i].glowRed, o.img[i].glowGreen, o.img[i].glowBlue) - love.graphics.draw(o.img[i].glow, o.img[i].x - o.img[i].ox2 + LOVE_LIGHT_TRANSLATE_X, o.img[i].y - o.img[i].oy2 + LOVE_LIGHT_TRANSLATE_Y) - else - love.graphics.setColor(0, 0, 0) - love.graphics.draw(o.img[i].img, o.img[i].x - o.img[i].ox2 + LOVE_LIGHT_TRANSLATE_X, o.img[i].y - o.img[i].oy2 + LOVE_LIGHT_TRANSLATE_Y) + + if o.glowDown then + o.glowTimer = math.max(0.0, o.glowTimer - love.timer.getDelta()) + if o.glowTimer == 0.0 then + o.glowDown = not o.glowDown + end + else + o.glowTimer = math.min(o.glowTimer + love.timer.getDelta(), 1.0) + if o.glowTimer == 1.0 then + o.glowDown = not o.glowDown end end + + for i = 1, #o.img do + if o.img[i].glow then + love.graphics.setShader(o.glowShader) + o.glowShader:send("glowImage", o.img[i].glow) + o.glowShader:send("glowTime", love.timer.getTime()) + love.graphics.setColor(255, 255, 255) + else + love.graphics.setShader() + love.graphics.setColor(0, 0, 0) + end + love.graphics.draw(o.img[i].img, o.img[i].x - o.img[i].ox2 + LOVE_LIGHT_TRANSLATE_X, o.img[i].y - o.img[i].oy2 + LOVE_LIGHT_TRANSLATE_Y) + end + love.graphics.setShader() o.isGlowBlur = false - end + --end -- create refraction map if o.changed then @@ -282,7 +302,7 @@ function love.light.newWorld() end end for i = 1, #o.img do - if o.img[i].img then + if not o.img[i].refractive and o.img[i].img then love.graphics.setColor(0, 0, 0) love.graphics.draw(o.img[i].img, o.img[i].x - o.img[i].ox2 + LOVE_LIGHT_TRANSLATE_X, o.img[i].y - o.img[i].oy2 + LOVE_LIGHT_TRANSLATE_Y) end @@ -538,7 +558,7 @@ function love.light.newWorld() end -- get polygon count o.getObjectCount = function() - return #o.poly + #o.circle + return #o.poly + #o.circle + #o.img end -- get circle count o.getCircleCount = function() @@ -548,6 +568,10 @@ function love.light.newWorld() o.getPolygonCount = function() return #o.poly end + -- get image count + o.getImageCount = function() + return #o.img + end -- get polygon o.getPoints = function(n) return unpack(o.poly[n].data) @@ -1046,6 +1070,7 @@ function love.light.newImage(p, img, x, y, width, height, ox, oy) o.glowStrength = 0.0 o.refractionStrength = 1.0 o.reflective = true + o.refractive = false o.type = "image" p.changed = true o.data = { @@ -1147,6 +1172,14 @@ function love.light.newImage(p, img, x, y, width, height, ox, oy) o.glassAlpha = alpha p.changed = true end + -- set reflective on other objects on/off + o.setReflective = function(reflective) + o.reflective = reflective + end + -- set refractive on other objects on/off + o.setRefractive = function(refractive) + o.refractive = refractive + end -- set image o.setImage = function(img) o.img = img diff --git a/main.lua b/main.lua index cec1087..04436ac 100644 --- a/main.lua +++ b/main.lua @@ -63,6 +63,13 @@ function love.load() tile_glow = love.graphics.newImage("gfx/tile_glow.png") refraction_normal = love.graphics.newImage("gfx/refraction_normal.png") water = love.graphics.newImage("gfx/water.png") + led = love.graphics.newImage("gfx/led.png") + led2 = love.graphics.newImage("gfx/led2.png") + led3 = love.graphics.newImage("gfx/led3.png") + led_normal = love.graphics.newImage("gfx/led_normal.png") + led_glow = love.graphics.newImage("gfx/led_glow.png") + led_glow2 = love.graphics.newImage("gfx/led_glow2.png") + led_glow3 = love.graphics.newImage("gfx/led_glow3.png") -- light world lightRange = 400 @@ -75,6 +82,7 @@ function love.load() mouseLight.setGlowStrength(0.3) mouseLight.setSmooth(lightSmooth) lightDirection = 0.0 + colorAberration = 0.0 -- init physic world initScene() @@ -105,6 +113,7 @@ function love.update(dt) mx = love.mouse.getX() my = love.mouse.getY() lightDirection = lightDirection + dt + colorAberration = math.max(0.0, colorAberration - dt * 10.0) if love.keyboard.isDown("w") then for i = 1, phyCnt do @@ -179,7 +188,9 @@ function love.update(dt) end end if phyLight[i].getType() == "refraction" then - phyLight[i].setTileOffset(tileX, tileY) + --if math.mod(i, 2) == 0 then + phyLight[i].setTileOffset(tileX, tileY) + --end if offsetChanged then phyLight[i].setPosition(phyLight[i].getX() + (offsetX - offsetOldX), phyLight[i].getY() + (offsetY - offsetOldY)) end @@ -218,12 +229,19 @@ function love.draw() end end - love.graphics.setBlendMode("multiplicative") for i = 1, phyCnt do if phyLight[i].getType() == "refraction" then if not normalOn then - love.graphics.setColor(255, 255, 255, 127) - love.graphics.draw(water, phyLight[i].x - phyLight[i].ox, phyLight[i].y - phyLight[i].oy) + --if math.mod(i, 2) == 0 then + love.graphics.setBlendMode("alpha") + love.graphics.setColor(255, 255, 255, 191) + love.graphics.draw(water, phyLight[i].x - phyLight[i].ox, phyLight[i].y - phyLight[i].oy) + --else + --love.graphics.setBlendMode("multiplicative") + --math.randomseed(i) + --love.graphics.setColor(math.random(0, 255), math.random(0, 255), math.random(0, 255)) + --love.graphics.rectangle("fill", phyLight[i].x - phyLight[i].ox, phyLight[i].y - phyLight[i].oy, 128, 128) + --end end end end @@ -363,7 +381,12 @@ function love.draw() -- draw shader if bloomOn then - love.postshader.draw("bloom") + if colorAberration > 0.0 then + love.postshader.addEffect("blur", 2.0, 2.0) + love.postshader.addEffect("chromatic", math.sin(lightDirection * 10.0) * colorAberration, math.cos(lightDirection * 10.0) * colorAberration, math.cos(lightDirection * 10.0) * colorAberration, math.sin(lightDirection * 10.0) * -colorAberration, math.sin(lightDirection * 10.0) * colorAberration, math.cos(lightDirection * 10.0) * -colorAberration) + end + love.postshader.addEffect("bloom") + love.postshader.draw() end end @@ -429,7 +452,7 @@ function love.keypressed(k, u) shadowBlur = 0.0 end lightWorld.setBlur(shadowBlur) - elseif k == "f6" then + elseif k == "f6" or k == "b" then bloomOn = not bloomOn elseif k == "f7" then textureOn = not textureOn @@ -478,15 +501,54 @@ function love.keypressed(k, u) phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) phyFixture[phyCnt]:setRestitution(0.5) elseif k == "4" then - -- add image - phyCnt = phyCnt + 1 - phyLight[phyCnt] = lightWorld.newImage(machine, mx, my, 32, 24, 16, 36) - phyLight[phyCnt].setNormalMap(machine_normal) - phyLight[phyCnt].setGlowMap(machine_glow) - phyBody[phyCnt] = love.physics.newBody(physicWorld, mx, my, "dynamic") - phyShape[phyCnt] = love.physics.newRectangleShape(0, 0, 32, 24) - phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) - phyFixture[phyCnt]:setRestitution(0.5) + -- add glow image + local r = lightWorld.getImageCount() % 5 + if r == 0 then + phyCnt = phyCnt + 1 + phyLight[phyCnt] = lightWorld.newImage(machine, mx, my, 32, 24, 16, 36) + phyLight[phyCnt].setNormalMap(machine_normal) + phyLight[phyCnt].setGlowMap(machine_glow) + phyBody[phyCnt] = love.physics.newBody(physicWorld, mx, my, "dynamic") + phyShape[phyCnt] = love.physics.newRectangleShape(0, 0, 32, 24) + phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) + phyFixture[phyCnt]:setRestitution(0.5) + elseif r == 1 then + phyCnt = phyCnt + 1 + phyLight[phyCnt] = lightWorld.newImage(machine2, mx, my, 24, 12, 12, 28) + phyLight[phyCnt].setNormalMap(machine2_normal) + phyLight[phyCnt].setGlowMap(machine2_glow) + phyBody[phyCnt] = love.physics.newBody(physicWorld, mx, my, "dynamic") + phyShape[phyCnt] = love.physics.newRectangleShape(0, 0, 24, 32) + phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) + phyFixture[phyCnt]:setRestitution(0.5) + elseif r == 2 then + phyCnt = phyCnt + 1 + phyLight[phyCnt] = lightWorld.newImage(led, mx, my, 32, 6, 16, 27) + phyLight[phyCnt].setNormalMap(led_normal) + phyLight[phyCnt].setGlowMap(led_glow) + phyBody[phyCnt] = love.physics.newBody(physicWorld, mx, my, "dynamic") + phyShape[phyCnt] = love.physics.newRectangleShape(0, 0, 32, 6) + phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) + phyFixture[phyCnt]:setRestitution(0.5) + elseif r == 3 then + phyCnt = phyCnt + 1 + phyLight[phyCnt] = lightWorld.newImage(led2, mx, my, 32, 6, 16, 27) + phyLight[phyCnt].setNormalMap(led_normal) + phyLight[phyCnt].setGlowMap(led_glow2) + phyBody[phyCnt] = love.physics.newBody(physicWorld, mx, my, "dynamic") + phyShape[phyCnt] = love.physics.newRectangleShape(0, 0, 32, 6) + phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) + phyFixture[phyCnt]:setRestitution(0.5) + elseif r == 4 then + phyCnt = phyCnt + 1 + phyLight[phyCnt] = lightWorld.newImage(led3, mx, my, 32, 6, 16, 27) + phyLight[phyCnt].setNormalMap(led_normal) + phyLight[phyCnt].setGlowMap(led_glow3) + phyBody[phyCnt] = love.physics.newBody(physicWorld, mx, my, "dynamic") + phyShape[phyCnt] = love.physics.newRectangleShape(0, 0, 32, 6) + phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) + phyFixture[phyCnt]:setRestitution(0.5) + end elseif k == "5" then -- add image phyCnt = phyCnt + 1 @@ -553,10 +615,6 @@ function love.keypressed(k, u) elseif k == "0" then phyCnt = phyCnt + 1 phyLight[phyCnt] = lightWorld.newRefraction(refraction_normal, mx, my) - --phyBody[phyCnt] = love.physics.newBody(physicWorld, mx, my, "dynamic") - --phyShape[phyCnt] = love.physics.newRectangleShape(0, 0, phyLight[phyCnt].getWidth(), phyLight[phyCnt].getHeight()) - --phyFixture[phyCnt] = love.physics.newFixture(phyBody[phyCnt], phyShape[phyCnt]) - --phyFixture[phyCnt]:setRestitution(0.5) elseif k == "l" then -- add light local r = lightWorld.getLightCount() % 3 @@ -573,5 +631,9 @@ function love.keypressed(k, u) light.setGlowStrength(0.3) math.randomseed(love.timer.getTime()) light.setAngle(math.random(1, 5) * 0.1 * math.pi) + elseif k == "c" then + if colorAberration == 0.0 then + colorAberration = 3.0 + end end end \ No newline at end of file diff --git a/postshader.lua b/postshader.lua index e96e7ed..28aaa3d 100644 --- a/postshader.lua +++ b/postshader.lua @@ -5,6 +5,7 @@ LOVE_POSTSHADER_LAST_BUFFER = nil LOVE_POSTSHADER_BLURV = love.graphics.newShader("shader/blurv.glsl") LOVE_POSTSHADER_BLURH = love.graphics.newShader("shader/blurh.glsl") LOVE_POSTSHADER_CONTRAST = love.graphics.newShader("shader/contrast.glsl") +LOVE_POSTSHADER_CHROMATIC_ABERRATION = love.graphics.newShader("shader/chromatic_aberration.glsl") LOVE_POSTSHADER_BLURV:send("screen", {love.window.getWidth(), love.window.getHeight()}) LOVE_POSTSHADER_BLURH:send("screen", {love.window.getWidth(), love.window.getHeight()}) @@ -17,9 +18,11 @@ love.postshader.setBuffer = function(path) else love.graphics.setCanvas(LOVE_POSTSHADER_BUFFER_RENDER) end + LOVE_POSTSHADER_LAST_BUFFER = love.graphics.getCanvas() end -love.postshader.draw = function(shader) +love.postshader.addEffect = function(shader, ...) + args = {...} LOVE_POSTSHADER_LAST_BUFFER = love.graphics.getCanvas() if shader == "bloom" then @@ -36,7 +39,7 @@ love.postshader.draw = function(shader) love.graphics.setShader(LOVE_POSTSHADER_CONTRAST) love.graphics.draw(LOVE_POSTSHADER_BUFFER_BACK) - love.graphics.setCanvas(LOVE_LIGHTMAP_LAST_BUFFER) + love.graphics.setCanvas(LOVE_POSTSHADER_LAST_BUFFER) love.graphics.setShader() love.graphics.setColor(255, 255, 255) love.graphics.draw(LOVE_POSTSHADER_BUFFER_RENDER) @@ -46,8 +49,8 @@ love.postshader.draw = function(shader) love.graphics.setBlendMode("alpha") elseif shader == "blur" then -- Blur Shader - LOVE_POSTSHADER_BLURV:send("steps", 2.0) - LOVE_POSTSHADER_BLURH:send("steps", 2.0) + LOVE_POSTSHADER_BLURV:send("steps", args[1] or 2.0) + LOVE_POSTSHADER_BLURH:send("steps", args[2] or 2.0) love.graphics.setCanvas(LOVE_POSTSHADER_BUFFER_BACK) love.graphics.setBlendMode("alpha") @@ -57,9 +60,33 @@ love.postshader.draw = function(shader) love.graphics.setShader(LOVE_POSTSHADER_BLURH) love.graphics.draw(LOVE_POSTSHADER_BUFFER_BACK) - love.graphics.setCanvas(LOVE_LIGHTMAP_LAST_BUFFER) + love.graphics.setCanvas(LOVE_POSTSHADER_LAST_BUFFER) + love.graphics.setShader() + love.graphics.setColor(255, 255, 255) + love.graphics.draw(LOVE_POSTSHADER_BUFFER_BACK) + elseif shader == "chromatic" then + -- Blur Shader + LOVE_POSTSHADER_CHROMATIC_ABERRATION:send("redStrength", {args[1] or 0.0, args[2] or 0.0}) + LOVE_POSTSHADER_CHROMATIC_ABERRATION:send("greenStrength", {args[3] or 0.0, args[4] or 0.0}) + LOVE_POSTSHADER_CHROMATIC_ABERRATION:send("blueStrength", {args[5] or 0.0, args[6] or 0.0}) + love.graphics.setCanvas(LOVE_POSTSHADER_BUFFER_BACK) + love.graphics.setBlendMode("alpha") + + love.graphics.setShader(LOVE_POSTSHADER_CHROMATIC_ABERRATION) + love.graphics.draw(LOVE_POSTSHADER_BUFFER_RENDER) + + love.graphics.setCanvas(LOVE_POSTSHADER_LAST_BUFFER) love.graphics.setShader() love.graphics.setColor(255, 255, 255) love.graphics.draw(LOVE_POSTSHADER_BUFFER_BACK) end +end + +love.postshader.draw = function() + if LOVE_POSTSHADER_LAST_BUFFER then + love.graphics.setCanvas() + love.graphics.setShader() + love.graphics.setColor(255, 255, 255) + love.graphics.draw(LOVE_POSTSHADER_LAST_BUFFER) + end end \ No newline at end of file diff --git a/shader/chromatic_aberration.glsl b/shader/chromatic_aberration.glsl new file mode 100644 index 0000000..6d6909c --- /dev/null +++ b/shader/chromatic_aberration.glsl @@ -0,0 +1,13 @@ +extern vec2 screen = vec2(800.0, 600.0); +extern vec2 redStrength = vec2(4.0, 3.0); +extern vec2 greenStrength = vec2(-2.0, -1.0); +extern vec2 blueStrength = vec2(1.0, -3.0); + +vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords) { + vec2 pSize = vec2(1.0 / screen.x, 1.0 / screen.y); + float colRed = Texel(texture, vec2(texture_coords.x + pSize.x * redStrength.x, texture_coords.y - pSize.y * redStrength.y)).r; + float colGreen = Texel(texture, vec2(texture_coords.x + pSize.x * greenStrength.x, texture_coords.y - pSize.y * greenStrength.y)).g; + float colBlue = Texel(texture, vec2(texture_coords.x + pSize.x * blueStrength.x, texture_coords.y - pSize.y * blueStrength.y)).b; + + return vec4(colRed, colGreen, colBlue, 1.0); +} \ No newline at end of file diff --git a/shader/glow.glsl b/shader/glow.glsl new file mode 100644 index 0000000..2b5d456 --- /dev/null +++ b/shader/glow.glsl @@ -0,0 +1,20 @@ +extern Image glowImage; + +extern float glowTime; + +vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords) { + vec3 glowInfo = Texel(glowImage, texture_coords).rgb; + + if(glowInfo.r != glowInfo.g) { + float glowStrength = glowTime + glowInfo.b; + if(mod(glowStrength, 2.0) < 1.0) { + glowInfo.b = mod(glowStrength, 1.0); + } else { + glowInfo.b = 1.0 - mod(glowStrength, 1.0); + } + + return Texel(texture, texture_coords) * (glowInfo.g + glowInfo.b * (glowInfo.r - glowInfo.g)); + } + + return vec4(Texel(texture, texture_coords).rgb * glowInfo.r, 1.0); +} \ No newline at end of file