if (SERVER) then
local function sendPixel(p)
if (type(p) == "table") then
local px = (math.Clamp(p.r or 0, 0, 255) * 16777216) +
(math.Clamp(p.g or 0, 0, 255) * 65536) +
(math.Clamp(p.b or 0, 0, 255) * 256) +
math.Clamp(p.a or 0, 0, 255)
umsg.Long( px )
else
umsg.Long( tonumber(p) or 0 )
end
end
// pixels can either be a table of ulongs (packed in rgba format) or
// a table of Color tables (unpacked r,g,b,a format)
function sendImage(recp, width, height, pixels)
umsg.Start("beginimage", recp)
umsg.Short(width)
umsg.Short(height)
umsg.End()
local nPixels = {}
local inMsg = false
for k,v in pairs(pixels) do
if (!inMsg) then
inMsg = true
nPixels = {}
end
table.insert(nPixels, v)
if (#nPixels >= 62) then
umsg.Start("recievepixels")
umsg.Short(#nPixels)
for _, p in pairs(nPixels) do sendPixel( p ) end
umsg.End()
inMsg = false
end
end
if (inMsg) then
umsg.Start("recievepixels", recp)
umsg.Short(#nPixels)
for _, p in pairs(nPixels) do sendPixel( p ) end
umsg.End()
end
umsg.Start("endimage", recp)
umsg.End()
end
return
end
ImageRec = {}
ImageRec.running = false
ImageRec.width = 0
ImageRec.height = 0
ImageRec.texture = nil
ImageRec.curx = 0
ImageRec.cury = 0
ImageRec.pixels = {}
ImageRec.recieved = {}
local function umsgBeginImage(um)
if (ImageRec.running) then
// TODO: Abort, or something
end
ImageRec.width = um:ReadShort()
ImageRec.height = um:ReadShort()
ImageRec.curx = 0
ImageRec.cury = 0
ImageRec.running = true
ImageRec.texture = GetRenderTarget( "Recieved" .. #ImageRec.texture + 1, ImageRec.width, ImageRec.height, true )
table.insert(ImageRec.recieved, ImageRec.texture)
end
usermessage.Hook("beginimage", umsgBeginImage)
local function umsgEndImage(um)
ImageRec.running = false
// TODO: Cleanup?
end
usermessage.Hook("endimage", umsgEndImage)
local function umsgRecievePixels( um )
local cnt = um:ReadShort()
for i=1,cnt do
local r = um:ReadChar()
local g = um:ReadChar()
local b = um:ReadChar()
local a = um:ReadChar()
table.insert( ImageRec.pixels, Color( r, g, b, a ) )
end
end
usermessage.Hook("recievepixels", umsgRecievePixels)
local function imageDraw()
if (#ImageRec.pixels == 0) then return end
local OldRT = render.GetRenderTarget();
render.SetRenderTarget( ImageRec.texture )
render.SetViewPort( 0, 0, ImageRec.width, ImageRec.height )
cam.Start2D()
for k,v in pairs(ImageRec.pixels) do
surface.SetDrawColor( v.r, v.g, v.b, 255 ) // ignore alpha!
surface.DrawRect( ImageRec.curx, ImageRec.cury, 1, 1 )
ImageRec.curx = ImageRec.curx + 1
if (ImageRec.curx >= ImageRec.Width) then
ImageRec.curx = 0
ImageRec.cury = ImageRec.cury + 1
end
end
ImageRec.pixels = {}
cam.End2D()
render.SetViewPort( 0, 0, ScrW(), ScrH() )
render.SetRenderTarget( OldRT )
end
hook.Add("RenderScene", "RecieveImageDraw", imageDraw)
local function imageCurrent()
if (ImageRec.texture) then
surface.SetDrawColor( 255, 255, 255, 255 )
surface.SetTexture( ImageRec.texture )
surface.DrawTexturedRect( 0, 0, ScrW() / 8, ScrH() / 8 )
end
end
hook.Add("HUDPaint", "DrawRecieve", imageCurrent)