-- Original xXxMoNkEyMaNxXx and xii -- fork mieki256 -- request love2d 11.3 -- -- usage: -- tp = require "perspective" -- img = love.graphics.newImage("textures/uvcheckermap01-512.png") -- vt = { {100,100}, {400,100}, {400,400}, {100,400} } -- tp:quad(img, vt[1], vt[2], vt[3], vt[4]) -- draw Perspective = {} Perspective.cw = true --clockwise Perspective.glsl = love.graphics.newShader("shader.fs") Perspective.glsl:send("p0", {0,0}) Perspective.glsl:send("rep", {1,1}) Perspective.on = function(self) love.graphics.setShader(self.glsl) end Perspective.off = function(self) love.graphics.setShader() end Perspective.preload = function(self, loadup) if loadup then self:on() else self:off() end end Perspective.setRepeat = function(self, origin, size) self.glsl:send("p0", origin) self.glsl:send("rep", size) end Perspective.fast = function(self, img, v1, v2, v3, v4) self.glsl:send("img", img) self.glsl:send("v1", v2) self.glsl:send("v2", v3) self.glsl:send("v3", v4) self.glsl:send("v4", v1) love.graphics.polygon("fill", v1[1], v1[2], v2[1], v2[2], v3[1], v3[2], v4[1], v4[2]) end Perspective.setShaderOnly = function(self, img, v1, v2, v3, v4) if (img and v4) then love.graphics.setShader(self.glsl) self.glsl:send("img", img) if self.cw then self.glsl:send("v1", v2) self.glsl:send("v2", v3) self.glsl:send("v3", v4) self.glsl:send("v4", v1) else self.glsl:send("v1", v2) self.glsl:send("v2", v1) self.glsl:send("v3", v4) self.glsl:send("v4", v3) end else love.graphics.setShader() end end Perspective.quad = function(self, img, v1, v2, v3, v4) self:setShaderOnly(img, v1, v2, v3, v4) if v4 then love.graphics.polygon("fill", v1[1], v1[2], v2[1], v2[2], v3[1], v3[2], v4[1], v4[2]) else --img acts as a vertex love.graphics.polygon("fill", img[1], img[2], v1[1], v1[2], v2[1], v2[2], v3[1], v3[2]) end love.graphics.setShader() end return Perspective --[[ Complete API - This was made to be a module, PLEASE USE IT AS A MODULE .cw=false -Counter clockwise vertex order starting at top left. .cw=true -Clockwise vertex order starting at top left. :preload(loadup): -loadup==true sets pixel effect to polygon texturer, -loadup==false clears any pixel effect. *NOTE: preload(false) must be done to draw blank polygons after textured ones. :setRepeat(origin, size): -Makes the image repeat every 'size' starting at 'origin'. -The default is origin = {0,0}, size = {1,1} . :quad(image, v1, v2, v3, v4) - Draws a polygon. -if 'image' is nil, the function will prepare to make it blank. :quad(v1, v2, v3, v4) - draws a polygon with no image. :fast(image, v1, v2, v3, v4) - draws a polygon with 'image' on it. -slightly(!!!) faster than quad. -Must include an image. -Must call :preload(true) beforehand. Info: Vertices are in the form {x,y}. Vertices go clockwise from the top left. v1---v2 | img | v4---v3 ]]