local tf = love.math.newTransform() local tfTerritory = love.math.newTransform() local tfNodes = love.math.newTransform() local lg = assert( love.graphics ) local Camera = { x = -90, y = 45, w = 360, h = 200, zoom = 1, tf = tf, tfTerritory = tfTerritory, tfNodes = tfNodes } function Camera.GetWorldCoordinate( x, y ) return tf:inverseTransformPoint( x, y ) end function Camera.GetBitmapCoordinate( x, y ) return tfTerritory:inverseTransformPoint( x, y ) end function Camera.GetNodeCoordinate( x, y ) return tfNodes:inverseTransformPoint( x, y ) end function Camera.Zoom( delta ) if Camera.zoom < 25.0 and delta > 0 or --zooming in Camera.zoom > 0.5 and delta < 0 then --zooming out delta = delta * Camera.zoom local cx, cy = Camera.x, Camera.y return Camera.Set( cx, cy, Camera.w + delta, Camera.h * (Camera.w + delta) / Camera.w ) end end function Camera.Translate( x, y ) x = x or 0 y = y or 0 return Camera.Set( math.max(-180, math.min(360, Camera.x + x)), math.min(100, Camera.y + y), Camera.w, Camera.h) end --In world coordinates: top left corner at x, y, extent of 1/w, 1/h. function Camera.Set( x, y, w, h ) Camera.x, Camera.y, Camera.w, Camera.h = x, y, w, h Camera.zoom = w / 800 tf:reset() tf:scale( w / 360, -h / 200 ) tf:translate( 180 - x, -y - 100 ) tfTerritory:reset() tfTerritory:scale( w / 512, h / 285 ) tfTerritory:translate( -x * 512 / 360, y * 512 / 360 ) tfNodes:reset() tfNodes:scale( w / 360, -h / 200 ) tfNodes:translate( 180 - x , -y - 100 ) --tfNodes:translate( -x * 800 / 360, y * 400 / 200 ) end function Camera.Resize( w, h ) w, h = math.min( w, h * 360 / 200 ), math.min( h, w * 200 / 360 ) return Camera.Set( Camera.x, Camera.y, w, h ) end Camera.Resize( lg.getDimensions() ) return Camera