All pastes #293439 Raw Edit

Stuff

public text v1 · immutable
#293439 ·published 2006-12-27 16:35 UTC
rendered paste body
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)