I didn’t have anything better to do, so I thought I’d try shadows without using physics objects and raycasting. Don’t know if this is usable or not, but here it is anyways. Besides, I liked working out the math to make it happen. You can show single or multiple shadow sources using the slider. Parameter points 0 shows one shadow source with multiple objects. Points 1 shows multiple shadow sources with multiple objects. Points 2 shows multiple shadow sources with a single object. The difference between points 2 and 3 is, points 2 shows a single shadow per object. Points 3 shows multiple shadows from the sources for the one object. I don’t like the way it works overall, but maybe someone could use it as a starter. Tap near an object to select it and move it around the screen.

supportedOrientations(LANDSCAPE_ANY)
displayMode(OVERLAY)

function setup()
parameter.integer("points",0,2,0,point)
end

function point()
tab={}
if points==2 then
elseif points==1 then
else
end
end

function draw()
background(51, 141, 132, 255)
for a,b in pairs(tab) do
b:drawCirc()
end
for a,b in pairs(tab) do
b:drawMesh()
if points==2 then
b:drawCirc()
end
end
end

function touched(t)
if t.state==BEGAN then
local min=9999
local key=0
for a,b in pairs(tab) do
local d=vec2(t.x,t.y):dist(vec2(b.x2,b.y2))
if d<min then
min=d
key=a
end
if points==2 then
tab[a].id=t.id
end
end
tab[key].id=t.id
return
end
for a,b in pairs(tab) do
b:touched(t)
end
end

-- shadow source(x1,y1)  object(x2,y2)  object size(r2)
self.x1=x1  -- shadow source x,y position
self.y1=y1
self.x2=x2  -- objects x,y position
self.y2=y2
self.tx1=0  -- tangent point 1 x,y position
self.ty1=0
self.tx2=0  -- tangent point 2 x,y position
self.ty2=0
self.m=mesh()   -- mesh
self.fillTab=true
self.ex1=0  -- extented point 1 x,y position
self.ey1=0
self.ex2=0  -- extended point 2 x,y position
self.ey2=0
self.id=0   -- id of moving object
end

self:tangentPoints()
self:extendLines()
self:createMeshTab()
self.m.vertices=self.tab
self.m:setColors(0,0,0)
self.m:draw()
end

fill(255)
ellipse(self.x1,self.y1,8)
fill(255)
ellipse(self.x2,self.y2,self.r2*2+2)
end

if t.state==MOVING and self.id==t.id then
self.x2=t.x
self.y2=t.y
self.fillTab=true
end
if t.state==ENDED and self.id==t.id then
self.id=0
end
end

local p1r=vec2(self.x1,self.y1):dist(vec2(self.x2,self.y2))
local dx=self.x2-self.x1
local dy=self.y2-self.y1
local hyp=math.sqrt(dx^2+dy^2)
local kk=(hyp^2+p1r^2-self.r2^2)/(2*hyp)
self.tx1=self.x1+dx*kk/hyp+(dy/hyp)*math.sqrt(p1r^2-kk^2)
self.ty1=self.y1+dy*kk/hyp-(dx/hyp)*math.sqrt(p1r^2-kk^2)
self.tx2=self.x1+dx*kk/hyp-(dy/hyp)*math.sqrt(p1r^2-kk^2)
self.ty2=self.y1+dy*kk/hyp+(dx/hyp)*math.sqrt(p1r^2-kk^2)
end

self.len=math.sqrt((self.x1-self.tx1)^2+(self.y1-self.ty1)^2)
self.ex1=self.tx1+(self.tx1-self.x1) / self.len * 1500
self.ey1=self.ty1+(self.ty1-self.y1) / self.len * 1500
self.len=math.sqrt((self.x1-self.tx2)^2+(self.y1-self.ty2)^2)
self.ex2=self.tx2+(self.tx2-self.x1) / self.len * 1500
self.ey2=self.ty2+(self.ty2-self.y1) / self.len * 1500
end

if not self.fillTab then
return
end
self.fillTab=false
self.tab={}
table.insert(self.tab,vec2(self.tx1,self.ty1))
table.insert(self.tab,vec2(self.tx2,self.ty2))
table.insert(self.tab,vec2(self.ex1,self.ey1))
table.insert(self.tab,vec2(self.tx1,self.ty1))
table.insert(self.tab,vec2(self.tx2,self.ty2))
table.insert(self.tab,vec2(self.ex2,self.ey2))
table.insert(self.tab,vec2(self.tx1,self.ty1))
table.insert(self.tab,vec2(self.ex1,self.ey1))
table.insert(self.tab,vec2(self.ex2,self.ey2))
end

That’s cool and useful @dave1707, reminds me of a similar love2d project

http://youtu.be/6V5Dtsa6Nd4