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)