Created
July 1, 2013 06:50
-
-
Save dermotbalson/5898835 to your computer and use it in GitHub Desktop.
touche
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function setup() | |
size=50 --size of circles | |
n=30 --number of circles | |
img=0 --image we will use throughout | |
counter=0 --for showing text on screen when we have a hit | |
b={} --table of circles | |
for i=1,n do --create circles | |
p={} --table to hold details for each circle | |
p.id=i --id number of circle | |
p.m=mesh() --create mesh for circle, one per circle | |
img=image(size,size) --create drawing on an image | |
setContext(img) | |
fill(math.random(0,255),math.random(0,255),math.random(0,255)) | |
ellipse(size/2,size/2,size) | |
fill(0) | |
fontSize(24) | |
text(i,size/2,size/2) --draw id number on circle | |
setContext() --done drawing our image | |
p.m:addRect(0,0,size,size) --add circle to mesh | |
p.m:setRectTex(1,0,0,1,1) | |
p.m.texture=img | |
--random position | |
p.x,p.y,p.z=math.random(-100,100),math.random(-200,200),-math.random(300,1000) | |
table.insert(b,p) --add to table of circles | |
end | |
--insert an ordinary image that can't be touched | |
img=readImage("Planet Cute:Character Princess Girl") | |
p={} | |
p.id=0 | |
p.m=mesh() | |
p.m:addRect(0,0,img.width,img.height) --add circle to mesh | |
p.m:setRectTex(1,0,0,1,1) | |
p.m.texture=img | |
--random position | |
p.x,p.y,p.z=math.random(-100,100),math.random(-200,200),-math.random(300,1000) | |
table.insert(b,p) --add to table of circles | |
table.sort(b,function(i,j) return i.z<j.z end) --sort by distance | |
parameter.integer("FPS",0,60,60) --show running speed on screen | |
end | |
function draw() | |
FPS=FPS*.9+.1/DeltaTime | |
if T~=nil then | |
img=image(WIDTH,HEIGHT) | |
setContext(img) | |
else | |
background(80) | |
end | |
--if we've had a touch, draw to an image instead of the screen, just this one time | |
perspective() | |
camera(0,0,-200,0,0,-1000,0,1,0) | |
--draw all circle meshes | |
for i,p in pairs(b) do | |
pushMatrix() | |
translate(p.x,p.y,p.z) | |
--if we've had a touch, set the shader, and id number | |
--the shader will put this id number in all the pixels of the circle image | |
--(transparent pixels will be discarded) | |
if T~=nil then | |
p.m.shader=shader(idShader.vertexShader,idShader.fragmentShader) | |
p.m.shader.id=p.id/255 | |
end | |
p.m:draw() | |
if T~=nil then p.m.shader=nil end --remove shader afterwards | |
popMatrix() | |
end | |
--if we've had a touch, stop drawing on the image, and test for a hit on the image | |
if T~=nil then | |
setContext() | |
message=testHit() --message showing what we hit | |
counter=120 | |
d=vec2(T.x,T.y) | |
T=nil | |
end | |
--all the code below does is to draw the message on the screen if we had a touch | |
if counter>0 then --show for as long as counter>0, currently 2 seconds | |
ortho() --this and next statement required to allow us to draw text on a 3D screen | |
viewMatrix(matrix()) | |
pushStyle() | |
fill(255) | |
ellipse(d.x,d.y,20) | |
textMode(CORNER) | |
fontSize(36) | |
text(message,50,HEIGHT-50) --message | |
popStyle() | |
counter=counter-1 --decrement counter | |
end | |
end | |
function touched(touch) | |
--if we have a touch, store the x,y details | |
if touch.state==ENDED then | |
T=vec2(touch.x,touch.y) | |
end | |
end | |
--test pixel that was touched | |
--if it was a circle, it will have a colour of r,0,0 where r = id of circle | |
function testHit() | |
local r,g,b=img:get(T.x,T.y) | |
if g+b==0 and r>0 then | |
return "You touched "..r | |
else return "You missed!" | |
end | |
end | |
idShader = { | |
vertexShader = [[ | |
uniform mat4 modelViewProjection; | |
attribute vec4 position; | |
attribute vec4 color; | |
attribute vec2 texCoord; | |
varying lowp vec4 vColor; | |
varying highp vec2 vTexCoord; | |
void main() | |
{ | |
vColor = color; | |
vTexCoord = texCoord; | |
gl_Position = modelViewProjection * position; | |
} | |
]], | |
fragmentShader = [[ | |
precision highp float; | |
uniform lowp sampler2D texture; | |
uniform float id; | |
varying lowp vec4 vColor; | |
varying highp vec2 vTexCoord; | |
void main() | |
{ | |
lowp vec4 col=texture2D(texture, vTexCoord); | |
if (col.a<0.2) discard; | |
else gl_FragColor = vec4(id,0.,0.,1.); | |
} | |
]]} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment