Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --# Main
- --[[
- In this demo, I've added a texture from the internet to make the dice more interesting
- I've also added a fake highlight to the dice spots to give them some depth
- --]]
- function setup()
- FieldOfView=45
- CamHeight=300
- Angle=0
- local s=75
- --create the covering for the block, get a picture from the internet
- --only create the dice once we have the image
- http.request("http://fc03.deviantart.net/fs47/i/2009/204/4/b/Blue_Venetian_Glass_Texture_by_powerpuffjazz.jpg",
- function(img,a,b)
- glass=img
- local img2,imgData=createDice(s)
- blk=Block3(s,s,s,img2,imgData)
- end
- )
- end
- function draw()
- background(152, 182, 196, 255)
- while glass==nil do --wait for internet image before drawing
- output:clear()
- print("Please wait while I load the texture from the internet..")
- return
- end
- -- First arg is FOV, second is aspect
- perspective(FieldOfView, WIDTH/HEIGHT)
- -- Position the camera up and back, look at origin
- camera(0,CamHeight,-300, 0,0,0, 0,1,0)
- pushMatrix()
- rotate(Angle,0,1,0)
- blk:draw()
- -- Restore orthographic projection
- ortho()
- -- Restore the view matrix to the identity
- viewMatrix(matrix())
- output.clear()
- print("We create our own dice")
- popMatrix()
- end
- function touched(touch)
- local xx,yy=math.floor(touch.x*3/WIDTH),math.floor(touch.y*3/HEIGHT)
- if xx==0 then Angle=Angle-15 elseif xx==2 then Angle=Angle+15 end
- if yy==0 then CamHeight=CamHeight-50 elseif yy==2 then CamHeight=CamHeight+50 end
- end
- function createDice(s)
- local d=s/5
- local img=glass:copy(1,1,s,s*6) --create a new image with a slice of the texture, the size we need
- --local img=image(s,s*6) --so we don't need this line any more
- --I'm going to create a dot with a whte spot, to give it depth
- --I'll do this with another little image, which I'll create now
- local dot=image(d,d) -- CHANGED next few lines are new
- pushStyle()
- setContext(dot) --draw on my dot
- fill(0, 0, 0, 255)
- ellipse(d/2,d/2,d)
- fill(232, 231, 231, 150) -- add whiteish dot off centre
- ellipse(d/2-d/4,d/2,d/4,d/3)
- setContext(img)
- --add a light blue filter over the texture to make it lighter in color
- fill(200, 208, 211, 85)
- rect(0,0,img.width,img.height)
- fill(192, 184, 156, 255)
- --rect(0,0,s,s*6) --no need to add a background now
- rectMode(CENTER)
- fill(0, 0, 0, 255)
- -- Insert numbers in this sequence - Front, Right, Back, Left, Top, Bottom to tie in with Block class
- --one
- sprite(dot,s/2,s/2) --CHANGED secdot image instead of drawing ellipses
- --two
- local h=s
- sprite(dot,s/3,h+s/2)
- sprite(dot,s*2/3,h+s/2)
- --six
- h=h+s
- sprite(dot,s/4,h+s/3)
- sprite(dot,s/4,h+s*2/3)
- sprite(dot,s/2,h+s/3)
- sprite(dot,s/2,h+s*2/3)
- sprite(dot,s*3/4,h+s/3)
- sprite(dot,s*3/4,h+s*2/3)
- --five
- h = h + s
- sprite(dot,s/4,h+s/4)
- sprite(dot,s*3/4,h+s/4)
- sprite(dot,s/4,h+s*3/4)
- sprite(dot,s*3/4,h+s*3/4)
- sprite(dot,s/2,h+s/2)
- --three
- h = h + s
- sprite(dot,s/4,h+s/2)
- sprite(dot,s/2,h+s/2)
- sprite(dot,s*3/4,h+s/2)
- --four
- h = h + s
- sprite(dot,s/3,h+s/3,d)
- sprite(dot,s*2/3,h+s/3,d)
- sprite(dot,s/3,h+s*2/3,d)
- sprite(dot,s*2/3,h+s*2/3,d)
- --add a border for effect
- local clr=color(188, 206, 215, 255)
- fill(clr)
- stroke(clr)
- strokeWidth(1)
- for i=1,6 do
- local y=(i-1)*s
- line(1,y+1,s,y+1)
- line(1,y+1,1,y+s)
- line(1,y+s,s,y+s)
- line(s,y+1,s,y+s)
- end
- popStyle()
- setContext()
- saveImage("Documents:test1",img)
- local imgData={0,0,1,1/6, 0,1/6,1,2/6, 0,2/6,1,3/6, 0,3/6,1,4/6, 0,4/6,1,5/6, 0,5/6,1,1}
- return img,imgData
- end
- --# Block3
- Block3 = class() --taken from 3D lab project
- --t=either string name of image, or an array of 6 colors, one per block face
- function Block3:init(w,h,d,t,r) --width,height,depth,texture/colors, (optional) texture range (see above)
- self.width=w
- self.height=h
- self.depth=d
- if type(t)=="string" or type(t)=="userdata" then --CHANGED to trap cases where we provide an actual image
- self.type="Image" --CHANGED
- self.tex=t --string name of an image in the library, or the image itself
- --if no limits specified on which part of image to draw, set to 0,1
- if r~=nil then self.texR=r else self.texR={0,0,1,1} end
- else --we are given a table of colors, one per face
- self.type="Colors" --CHANGED
- self.colrs=t
- end
- self.blk=self:createBlock()
- end
- function Block3:createBlock()
- -- all the unique vertices that make up a block
- --There are only 8 corners in a cube - we define them as vertices
- --all measurements are taken from the centre of the block
- --so bottom left front has x of -1/2 width, y of -1/2 height, and z of 1/2 depth
- local w,h,d=self.width,self.height,self.depth
- local v = {
- vec3(-0.5*w, -0.5*h, 0.5*d), -- Left bottom front
- vec3( 0.5*w, -0.5*h, 0.5*d), -- Right bottom front
- vec3( 0.5*w, 0.5*h, 0.5*d), -- Right top front
- vec3(-0.5*w, 0.5*h, 0.5*d), -- Left top front
- vec3(-0.5*w, -0.5*h, -0.5*d), -- Left bottom back
- vec3( 0.5*w, -0.5*h, -0.5*d), -- Right bottom back
- vec3( 0.5*w, 0.5*h, -0.5*d), -- Right top back
- vec3(-0.5*w, 0.5*h, -0.5*d), -- Left top back
- }
- -- now construct a block out of the vertices above
- --there are 6 sides, each made up of 2 triangles, each with 3 vertices
- --so we need to assign 36 vertices in total
- --the 8 vectors are assigned to the 8 corners as follows
- --1,2,3,4 anticlockwise round front starting bottom left
- --5,6,7,8 clockwise round back starting bottom right (assuming you are looking at the back)
- --the first three vectors below use vectors 1,2 and 3. If you look above, you'll
- --see those are for left and right of bottom front, plus right top of front
- --so this is the right hand triangle for the front side
- local cubeverts = {
- -- Front, Right, Back, Left, Top, Bottom
- v[1], v[2], v[3], v[1], v[3], v[4],
- v[2], v[6], v[7], v[2], v[7], v[3],
- v[6], v[5], v[8], v[6], v[8], v[7],
- v[5], v[1], v[4], v[5], v[4], v[8],
- v[4], v[3], v[7], v[4], v[7], v[8],
- v[5], v[6], v[2], v[5], v[2], v[1],
- }
- -- add texture or colors
- if self.type=="Image" then --texture --CHANGED
- if #self.texR==4 then
- --create vectors to be assigned to four corners of each face
- local BL=vec2(self.texR[1],self.texR[2]) --bottom left
- local BR=vec2(self.texR[3],self.texR[2]) --bottom right
- local TR=vec2(self.texR[3],self.texR[4]) --top right
- local TL=vec2(self.texR[1],self.texR[4]) --top left
- -- apply the texture coordinates to each triangle
- --we need to add them to each of the vertexes in the same order as above
- --that means on each face we need to add them in the order BL, BR, TR, BL, TR, TL
- self.texCoords = {}
- for i=1,6 do
- table.insert(self.texCoords,BL)
- table.insert(self.texCoords,BR)
- table.insert(self.texCoords,TR)
- table.insert(self.texCoords,BL)
- table.insert(self.texCoords,TR)
- table.insert(self.texCoords,TL)
- end
- else --user has specified image fractions for each face
- self.texCoords = {}
- local u=0
- for i=1,6 do
- local BL=vec2(self.texR[u+1],self.texR[u+2]) --bottom left
- local BR=vec2(self.texR[u+3],self.texR[u+2]) --bottom right
- local TR=vec2(self.texR[u+3],self.texR[u+4]) --top right
- local TL=vec2(self.texR[u+1],self.texR[u+4]) --top left
- u = u + 4
- table.insert(self.texCoords,BL)
- table.insert(self.texCoords,BR)
- table.insert(self.texCoords,TR)
- table.insert(self.texCoords,BL)
- table.insert(self.texCoords,TR)
- table.insert(self.texCoords,TL)
- end
- end
- else --colors, one per face
- self.texColrs={}
- for i=1,6 do
- for j=1,6 do
- table.insert(self.texColrs,self.colrs[i])
- end
- end
- end
- --put it all together
- local ms = mesh()
- ms.vertices = cubeverts
- ms.texture = self.tex
- if self.texCoords~=nil then ms.texCoords = self.texCoords end
- ms:setColors(255,255,255,255)
- if self.texColrs~=nil then ms.colors=self.texColrs end
- return ms
- end
- function Block3:draw()
- self.blk:draw()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement