las.exe will automatically create multiple rotated versions of a beam composed of the glow you choose, and generates
 a .ini file with the associated glow particles. That way you can make beams composed of very few glows, which is much
less laggy than the usual technique of placing a glow particle every 2 or 3 pixel.

How to use it:

The first thing it will ask you is tha adress(relative or absolute) of the glow you want to use as a base for the beam.
Example:
GreenSmall.bmp

Then it will ask you how long you want the beam to be(in glow length, so if you type 5 and your glow is 5px long the beam
will be 25 px long).

Then it will ask you how many different angles you want to draw(drawing more than 2*pi*lengthInPx is useless.)

Then it will ask you what name you want to give to the .ini file.
Example:
Glows.ini

Then it will ask you the name you want to give to the particles.
Example:
MHGLPR
And the particles will be named MHGLPR0, MHGLPR1 ...etc.


Then it will ask you the lifetime of the particles in ms.

Then it will ask you the filepath to the palder the glows are saved in(which is the one the .exe is in)
Example:
Laser.rte/Glows/

Then it will ask you the initial and final glow strength(0.0 to 1.0).

And that's it, but you still have to use a lua script to use the glows.
Here is an example that uses two series of rotated glows to create a beam(this is the script of the laser gun I made, 
modify it to suit your needs):




function CreateLaserParticle(angle,x,y)		--this creates a glow rotated with an angle at the coordinates x,y
	local nbr = 1000;			--this is the number of glows(the third parameter given to the .exe)
	local apn = 3.14159265358979323846/nbr;
	local an = angle;
	if an < 0 then
		an = an + 3.14159265358979323846;
	end
	local n = math.ceil(an/apn);
	if n > nbr-1 then
		n = nbr-1;
	end
	local i = CreateMOPixel("MHGLPR"..n);	--MHGLPR is the name of the particles(the 5th parameter)
	i.Pos = Vector(x,y);
	MovableMan:AddMO(i);
end

function CreateLaserParticleShort(angle,x,y)	--this is the same as the first function for the second serie of glows
	local nbr = 248;
	local apn = 3.14159265358979323846264/nbr;
	local an = angle;
	if an < 0 then
		an = an + 3.14159265358979323846264;
	end
	local n = math.ceil(an/apn);
	if n > nbr-1 then
		n = nbr-1;
	end
	local i = CreateMOPixel("MHGLPRSH"..n);
	i.Pos = Vector(x,y);
	MovableMan:AddMO(i);
end

function Create(self)
	self.Offset = 104;			--this is how long the first glow is in px
	self.Offset2 = 13;			--and how long the second is
	self.Offset3 = 1;			--this is the offset between two standard(the single non rotated one) glow particles that are used to fill the holes
	self.Range = 1000;			
	self.Vibrations = 0.005; --/1000 rad	--this makes the beam wobble a bit.
	self.Name = "MHGLPR-1";			--this is the name of the standard glow particle(you have to declare this one manually, not the same as MHGLPR1).
	self.Name2 = "MHGLPR-2";		--the name of the impact glow
	self.Name3 = "LRP";			--the name of the impact damaging particle
	self.imvel = 25;			--the maximum velocity of the damaging particle
end

function Destroy(self)
end

function Update(self)
	local m = SceneMan:ShortestDistance(self.Pos, self.MuzzlePos, true);
	local an = math.atan2(m.Y,m.X)+math.random(-1000,1000)*0.001*self.Vibrations;
	local mo = Vector(m.Magnitude*math.cos(an),m.Magnitude*math.sin(an));
	local anan = math.atan2(mo.Y,mo.X);
	if self:IsActivated() then
			local p = Vector();
			local ray = SceneMan:CastObstacleRay(self.MuzzlePos+mo, Vector(self.Range*mo.Normalized.X,self.Range*mo.Normalized.Y), Vector(), p, self.ID, 0, 0);

			if ray < 0 then
				ray = 1000;
			end
			
			local dist = self.Offset/2;
			
			local i = CreateMOPixel(self.Name);
			i.Pos = self.MuzzlePos;
			MovableMan:AddMO(i);
			
			while dist <= ray-self.Offset/2 do
				CreateLaserParticle(anan,self.MuzzlePos.X+mo.Normalized.X*dist,self.MuzzlePos.Y+mo.Normalized.Y*dist);
				dist = dist+self.Offset;
			end
			dist = dist-self.Offset/2+self.Offset2/2;
			while dist <= ray-self.Offset2/2 do
				CreateLaserParticleShort(anan,self.MuzzlePos.X+mo.Normalized.X*dist,self.MuzzlePos.Y+mo.Normalized.Y*dist);
				dist = dist+self.Offset2;
			end
			dist = dist-self.Offset2/2+self.Offset3/2;
			while dist <= ray+24 do
				local i = CreateMOPixel(self.Name);
				i.Pos = self.MuzzlePos+mo.Normalized*dist;
				MovableMan:AddMO(i);
				dist = dist+self.Offset3;
			end
			-- CreateLaserParticle(anan,p.X-mo.Normalized.X*self.Offset/2,p.Y-mo.Normalized.Y*self.Offset/2);
			i = CreateMOPixel(self.Name2);
			i.Pos = p;
			MovableMan:AddMO(i);
			i = CreateMOPixel(self.Name3);
			i.Pos = p;
			local th = math.random(-1000,1000)*0.001;
			local v = math.random(0,self.imvel);
			i.Vel = Vector(v*math.cos(th),v*math.sin(th));
			MovableMan:AddMO(i);
			
		
	end

end