diff --git a/examples/test.lua b/examples/test.lua index 29043cc..32a7bf6 100644 --- a/examples/test.lua +++ b/examples/test.lua @@ -24,9 +24,8 @@ function love.load() end) circle_image = love.graphics.newImage(circle_canvas:getImageData()) - local t = lightWorld:newImage(circle_image, 150, 150) + local t = lightWorld:newCircle(150, 150, radius) t:setNormalMap(normal_map.generateFlat(circle_image, "top")) - t:setShadowType('circle', 50) end function love.mousepressed(x, y, c) diff --git a/lib/body.lua b/lib/body.lua index 40c57ac..8d1ca54 100644 --- a/lib/body.lua +++ b/lib/body.lua @@ -373,80 +373,6 @@ function body:setShadowType(type, ...) end end -function body:stencil() - if self.shadowType == "circle" then - love.graphics.circle("fill", self.x - self.ox, self.y - self.oy, self.radius) - elseif self.shadowType == "rectangle" then - love.graphics.rectangle("fill", self.x - self.ox, self.y - self.oy, self.width, self.height) - elseif self.shadowType == "polygon" then - love.graphics.polygon("fill", unpack(self.data)) - elseif self.shadowType == "image" then - --love.graphics.rectangle("fill", self.x - self.ox, self.y - self.oy, self.width, self.height) - end -end - -function body:drawShadow(light) - if self.alpha < 1.0 then - love.graphics.setBlendMode("multiplicative") - love.graphics.setColor(self.red, self.green, self.blue) - if self.shadowType == "circle" then - love.graphics.circle("fill", self.x - self.ox, self.y - self.oy, self.radius) - elseif self.shadowType == "rectangle" then - love.graphics.rectangle("fill", self.x - self.ox, self.y - self.oy, self.width, self.height) - elseif self.shadowType == "polygon" then - love.graphics.polygon("fill", unpack(self.data)) - end - end - - if self.shadowType == "image" and self.img then - love.graphics.setBlendMode("alpha") - local length = 1.0 - local shadowRotation = math.atan2((self.x) - light.x, (self.y + self.oy) - light.y) - - self.shadowVert = { - { - math.sin(shadowRotation) * self.imgHeight * length, - (length * math.cos(shadowRotation) + 1.0) * self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, - 0, 0, - self.red, - self.green, - self.blue, - self.alpha * self.fadeStrength * 255 - }, - { - self.imgWidth + math.sin(shadowRotation) * self.imgHeight * length, - (length * math.cos(shadowRotation) + 1.0) * self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, - 1, 0, - self.red, - self.green, - self.blue, - self.alpha * self.fadeStrength * 255 - }, - { - self.imgWidth, - self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, - 1, 1, - self.red, - self.green, - self.blue, - self.alpha * 255 - }, - { - 0, - self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, - 0, 1, - self.red, - self.green, - self.blue, - self.alpha * 255 - } - } - - self.shadowMesh:setVertices(self.shadowVert) - love.graphics.draw(self.shadowMesh, self.x - self.ox, self.y - self.oy, 0, s, s) - end -end - function body:drawNormal() if self.type == "image" and self.normalMesh then love.graphics.setColor(255, 255, 255) @@ -539,6 +465,52 @@ function body:drawCalculatedShadow(light) return self:calculatePolyShadow(light) elseif self.shadowType == "circle" then return self:calculateCircleShadow(light) + elseif self.shadowType == "image" and self.img then + local length = 1.0 + local shadowRotation = math.atan2((self.x) - light.x, (self.y + self.oy) - light.y) + + self.shadowVert = { + { + math.sin(shadowRotation) * self.imgHeight * length, + (length * math.cos(shadowRotation) + 1.0) * self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, + 0, 0, + self.red, + self.green, + self.blue, + self.alpha * self.fadeStrength * 255 + }, + { + self.imgWidth + math.sin(shadowRotation) * self.imgHeight * length, + (length * math.cos(shadowRotation) + 1.0) * self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, + 1, 0, + self.red, + self.green, + self.blue, + self.alpha * self.fadeStrength * 255 + }, + { + self.imgWidth, + self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, + 1, 1, + self.red, + self.green, + self.blue, + self.alpha * 255 + }, + { + 0, + self.imgHeight + (math.cos(shadowRotation) + 1.0) * self.shadowY, + 0, 1, + self.red, + self.green, + self.blue, + self.alpha * 255 + } + } + + love.graphics.setColor(self.red, self.green, self.blue, self.alpha) + self.shadowMesh:setVertices(self.shadowVert) + love.graphics.draw(self.shadowMesh, self.x - self.ox, self.y - self.oy, 0, s, s) end end diff --git a/lib/light.lua b/lib/light.lua index 5c7ef1d..cfcd81d 100644 --- a/lib/light.lua +++ b/lib/light.lua @@ -1,6 +1,5 @@ local _PACKAGE = (...):match("^(.+)[%./][^%./]+") or "" local class = require(_PACKAGE.."/class") -local stencils = require(_PACKAGE..'/stencils') local util = require(_PACKAGE..'/util') local light = class() diff --git a/lib/shaders/shine.glsl b/lib/shaders/shine.glsl deleted file mode 100644 index dde39e4..0000000 --- a/lib/shaders/shine.glsl +++ /dev/null @@ -1,41 +0,0 @@ -#define PI 3.1415926535897932384626433832795 - -extern vec3 lightPosition; -extern vec3 lightColor; -extern float lightRange; -extern float lightSmooth; -extern vec2 lightGlow; -extern float lightDirection; -extern float lightAngle; - -vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords){ - vec4 pixel = Texel(texture, texture_coords); - vec3 lightToPixel = vec3(pixel_coords.x, pixel_coords.y, 0.0) - lightPosition; - float distance = length(lightToPixel); - float att = 1 - distance / lightRange; - - if(lightAngle > 0.0) { - float angle2 = atan(lightPosition.x - pixel_coords.x, pixel_coords.y - lightPosition.y) + PI; - if(lightDirection - lightAngle > 0 && lightDirection + lightAngle < PI * 2) { - if(angle2 < mod(lightDirection + lightAngle, PI * 2) && angle2 > mod(lightDirection - lightAngle, PI * 2)) { - return vec4(0.0, 0.0, 0.0, 1.0); - } - } else { - if(angle2 < mod(lightDirection + lightAngle, PI * 2) || angle2 > mod(lightDirection - lightAngle, PI * 2)) { - return vec4(0.0, 0.0, 0.0, 1.0); - } - } - } - - if (distance <= lightRange) { - if (lightGlow.x < 1.0 && lightGlow.y > 0.0) { - pixel.rgb = clamp(lightColor * pow(att, lightSmooth) + pow(smoothstep(lightGlow.x, 1.0, att), lightSmooth) * lightGlow.y, 0.0, 1.0); - } else { - pixel.rgb = lightColor * pow(att, lightSmooth); - } - } else { - return vec4(0.0, 0.0, 0.0, 1.0); - } - - return pixel; -} diff --git a/lib/stencils.lua b/lib/stencils.lua deleted file mode 100644 index e3ff160..0000000 --- a/lib/stencils.lua +++ /dev/null @@ -1,36 +0,0 @@ -local stencils = {} - -function stencils.shadow(geometry, bodies) - return function() - --cast shadows - for i = 1,#geometry do - if geometry[i].alpha == 1.0 then - love.graphics.polygon("fill", unpack(geometry[i])) - if geometry[i].circle then - love.graphics.arc("fill", unpack(geometry[i].circle)) - end - end - end - -- underneath shadows - for i = 1, #bodies do - if not bodies[i].castsNoShadow then - bodies[i]:stencil() - end - end - end -end - -function stencils.shine(bodies) - return function() - for i = 1, #bodies do - if bodies[i].shine and - (bodies[i].glowStrength == 0.0 or - (bodies[i].type == "image" and not bodies[i].normal)) - then - bodies[i]:stencil() - end - end - end -end - -return stencils