⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cl_newfx.pas

📁 雷神之锤2(Quake2)Delphi源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
	VectorCopy (cl.v_right, right);
	VectorCopy (cl.v_up, up);
	VectorMA (move, -0.5, right, move);
	VectorMA (move, -0.5, up, move);

	for i := 0 to 7 do
	begin
		if (free_particles = nil) then
			Exit;

		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;

		p^.time := cl.time;
		VectorClear (p^.accel);

		d := crand()*M_PI;
		c := cos(d)*30;
		s := sin(d)*30;

		p^.alpha := 1.0;
		p^.alphavel := -5.0 / (1+frand());
		p^.color := 223 - (rand() and 7);

		for j := 0 to 2 do
		begin
			p^.org[j] := move[j];
		end;
		VectorScale (vec, 450, p^.vel);
		VectorMA (p^.vel, c, right, p^.vel);
		VectorMA (p^.vel, s, up, p^.vel);
	end;
// Sly 30-Jun-2002 This section was commented in the original source
(*

	ltime = (float) cl.time/1000.0;
	start_pt = fmod(ltime*16.0,step);
	VectorMA (move, start_pt, vec, move);

	VectorScale (vec, step, vec);

//	Com_Printf ("%f"#10, ltime);
	rstep = M_PI/12.0;
	for (i=start_pt ; i<len ; i+=step)
	begin
		if (i>step*5) // don't bother after the 5th ring
			break;

		for (rot = 0; rot < M_PI*2; rot += rstep)
		begin
			if (!free_particles)
				return;

			p = free_particles;
			free_particles = p^.next;
			p^.next = active_particles;
			active_particles = p;

			p^.time = cl.time;
			VectorClear (p^.accel);
//			rot+= fmod(ltime, 12.0)*M_PI;
//			c = cos(rot)/2.0;
//			s = sin(rot)/2.0;
			c = cos(rot)/1.5;
			s = sin(rot)/1.5;

			// trim it so it looks like it's starting at the origin
			if (i < 10)
			begin
				VectorScale (right, c*(i/10.0), dir);
				VectorMA (dir, s*(i/10.0), up, dir);
			end;
			else
			begin
				VectorScale (right, c, dir);
				VectorMA (dir, s, up, dir);
			end;

			p^.alpha = 0.5;
	//		p^.alphavel = -1.0 / (1+frand()*0.2);
			p^.alphavel = -1000.0;
	//		p^.color = 0x74 + (rand()&7);
			p^.color = 223 - (rand()&7);
			for (j=0 ; j<3 ; j++)
			begin
				p^.org[j] = move[j] + dir[j]*3;
	//			p^.vel[j] = dir[j]*6;
				p^.vel[j] = 0;
			end;
		end;
		VectorAdd (move, vec, move);
	end;
*)
end;
{$ENDIF}

(*
===============
CL_ParticleSteamEffect

Puffs with velocity along direction, with some randomness thrown in
===============
*)
procedure CL_ParticleSteamEffect (org, dir: vec3_t; color, count, magnitude: Integer);
var
	i, j: Integer;
	p: cparticle_p;
	d: Single;
	r, u: vec3_t;
begin
//	vectoangles2 (dir, angle_dir);
//	AngleVectors (angle_dir, f, r, u);

	MakeNormalVectors (dir, r, u);

	for i := 0 to count - 1 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;

		p^.time := cl.time;
		p^.color := color + (rand() and 7);

		for j := 0 to 2 do
		begin
			p^.org[j] := org[j] + magnitude*0.1*crand();
//			p^.vel[j] := dir[j]*magnitude;
		end;
		VectorScale (dir, magnitude, p^.vel);
		d := crand()*magnitude/3;
		VectorMA (p^.vel, d, r, p^.vel);
		d := crand()*magnitude/3;
		VectorMA (p^.vel, d, u, p^.vel);

		p^.accel[0] := 0;
    p^.accel[1] := 0;
		p^.accel[2] := -PARTICLE_GRAVITY/2;
		p^.alpha := 1.0;

		p^.alphavel := -1.0 / (0.5 + frand()*0.3);
	end;
end;

procedure CL_ParticleSteamEffect2 (self: pcl_sustain_t);
//vec3_t org, vec3_t dir, int color, int count, int magnitude)
var
	i, j: Integer;
	p: cparticle_p;
	d: Single;
	r, u: vec3_t;
	dir: vec3_t;
begin
//	vectoangles2 (dir, angle_dir);
//	AngleVectors (angle_dir, f, r, u);

	VectorCopy (self^.dir, dir);
	MakeNormalVectors (dir, r, u);

	for i := 0 to self^.count - 1 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;

		p^.time := cl.time;
		p^.color := self^.color + (rand() and 7);

		for j := 0 to 2 do
		begin
			p^.org[j] := self^.org[j] + self^.magnitude*0.1*crand();
//			p^.vel[j] := dir[j]*magnitude;
		end;
		VectorScale (dir, self^.magnitude, p^.vel);
		d := crand()*self^.magnitude/3;
		VectorMA (p^.vel, d, r, p^.vel);
		d := crand()*self^.magnitude/3;
		VectorMA (p^.vel, d, u, p^.vel);

		p^.accel[0] := 0;
    p^.accel[1] := 0;
		p^.accel[2] := -PARTICLE_GRAVITY/2;
		p^.alpha := 1.0;

		p^.alphavel := -1.0 / (0.5 + frand()*0.3);
	end;
	self^.nextthink := self^.nextthink + self^.thinkinterval;
end;

(*
===============
CL_TrackerTrail
===============
*)
procedure CL_TrackerTrail (start, end_: vec3_t; particleColor: Integer);
var
	move: vec3_t;
	vec: vec3_t;
	forward_,right,up,angle_dir: vec3_t;
	len: Single;
	j: Integer;
	p: cparticle_p;
	dec: Integer;
	dist: Single;
begin
	VectorCopy (start, move);
	VectorSubtract (end_, start, vec);
	len := VectorNormalize (vec);

	VectorCopy(vec, forward_);
	vectoangles2 (forward_, angle_dir);
	AngleVectors (angle_dir, @forward_, @right, @up);

	dec := 3;
	VectorScale (vec, 3, vec);

	// FIXME: this is a really silly way to have a loop
	while (len > 0) do
	begin
		len := len - dec;

		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := -2.0;
		p^.color := particleColor;
		dist := DotProduct(move, forward_);
		VectorMA(move, 8 * cos(dist), up, p^.org);
		for j := 0 to 2 do
		begin
//			p^.org[j] := move[j] + crand();
			p^.vel[j] := 0;
			p^.accel[j] := 0;
		end;
		p^.vel[2] := 5;

		VectorAdd (move, vec, move);
	end;
end;

procedure CL_Tracker_Shell(origin: vec3_t);
var
	dir: vec3_t;
	i: Integer;
	p: cparticle_p;
begin
	for i := 0 to 299 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := INSTANT_PARTICLE;
		p^.color := 0;

		dir[0] := crand();
		dir[1] := crand();
		dir[2] := crand();
		VectorNormalize(dir);

		VectorMA(origin, 40, dir, p^.org);
	end;
end;

procedure CL_MonsterPlasma_Shell(origin: vec3_t);
var
	dir: vec3_t;
	i: Integer;
	p: cparticle_p;
begin
	for i := 0 to 39 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := INSTANT_PARTICLE;
		p^.color := $e0;

		dir[0] := crand();
		dir[1] := crand();
		dir[2] := crand();
		VectorNormalize(dir);

		VectorMA(origin, 10, dir, p^.org);
//		VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
	end;
end;

procedure CL_Widowbeamout (self: pcl_sustain_t);
const
	colortable: array [0..3] of Integer = (2*8,13*8,21*8,18*8);
var
	dir: vec3_t;
	i: Integer;
	p: cparticle_p;
	ratio: Single;
begin
	ratio := 1.0 - ((self^.endtime - cl.time)/2100.0);

	for i := 0 to 299 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := INSTANT_PARTICLE;
		p^.color := colortable[rand() and 3];

		dir[0] := crand();
		dir[1] := crand();
		dir[2] := crand();
		VectorNormalize(dir);

		VectorMA(self^.org, (45.0 * ratio), dir, p^.org);
//		VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
	end;
end;

procedure CL_Nukeblast (self: pcl_sustain_t);
const
	colortable: array [0..3] of Integer = (110, 112, 114, 116);
var
	dir: vec3_t;
	i: Integer;
	p: cparticle_p;
	ratio: Single;
begin
	ratio := 1.0 - ((self^.endtime - cl.time)/1000.0);

	for i := 0 to 699 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := INSTANT_PARTICLE;
		p^.color := colortable[rand() and 3];

		dir[0] := crand();
		dir[1] := crand();
		dir[2] := crand();
		VectorNormalize(dir);

		VectorMA(self^.org, (200.0 * ratio), dir, p^.org);
//		VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
	end;
end;

procedure CL_WidowSplash (org: vec3_t);
const
  colortable: array [0..3] of Integer = (2*8,13*8,21*8,18*8);
var
	i: Integer;
	p: cparticle_p;
	dir: vec3_t;
begin
	for i := 0 to 255 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;

		p^.time := cl.time;
		p^.color := colortable[rand() and 3];

		dir[0] := crand();
		dir[1] := crand();
		dir[2] := crand();
		VectorNormalize(dir);
		VectorMA(org, 45.0, dir, p^.org);
		VectorMA(vec3_origin, 40.0, dir, p^.vel);

		p^.accel[0] := 0;
    p^.accel[1] := 0;
		p^.alpha := 1.0;

		p^.alphavel := -0.8 / (0.5 + frand()*0.3);
	end;

end;

procedure CL_Tracker_Explode(origin: vec3_t);
var
	dir, backdir: vec3_t;
	i: Integer;
	p: cparticle_p;
begin
	for i := 0 to 299 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := -1.0;
		p^.color := 0;

		dir[0] := crand();
		dir[1] := crand();
		dir[2] := crand();
		VectorNormalize(dir);
		VectorScale(dir, -1, backdir);

		VectorMA(origin, 64, dir, p^.org);
		VectorScale(backdir, 64, p^.vel);
	end;

end;

(*
===============
CL_TagTrail

===============
*)
procedure CL_TagTrail (start, end_: vec3_t; color: Single);
var
	move: vec3_t;
	vec: vec3_t;
	len: Single;
	j: Integer;
	p: cparticle_p;
	dec: Integer;
begin
	VectorCopy (start, move);
	VectorSubtract (end_, start, vec);
	len := VectorNormalize (vec);

	dec := 5;
	VectorScale (vec, 5, vec);

	while (len >= 0) do
	begin
		len := len - dec;

		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := -1.0 / (0.8+frand()*0.2);
		p^.color := color;
		for j := 0 to 2 do
		begin
			p^.org[j] := move[j] + crand()*16;
			p^.vel[j] := crand()*5;
			p^.accel[j] := 0;
		end;

		VectorAdd (move, vec, move);
	end;
end;

(*
===============
CL_ColorExplosionParticles
===============
*)
procedure CL_ColorExplosionParticles (org: vec3_t; color, run: Integer);
var
	i, j: Integer;
	p: cparticle_p;
begin
	for i := 0 to 127 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;

		p^.time := cl.time;
		p^.color := color + (rand() mod run);

		for j := 0 to 2 do
		begin
			p^.org[j] := org[j] + ((rand() mod 32)-16);
			p^.vel[j] := (rand() mod 256)-128;
		end;

		p^.accel[0] := 0;
    p^.accel[1] := 0;
		p^.accel[2] := -PARTICLE_GRAVITY;
		p^.alpha := 1.0;

		p^.alphavel := -0.4 / (0.6 + frand()*0.2);
	end;
end;

(*
===============
CL_ParticleSmokeEffect - like the steam effect, but unaffected by gravity
===============
*)
procedure CL_ParticleSmokeEffect (org, dir: vec3_t; color, count, magnitude: Integer);
var
	i, j: Integer;
	p: cparticle_p;
	d: Single;
	r, u: vec3_t;
begin
	MakeNormalVectors (dir, r, u);

	for i := 0 to count - 1 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;

		p^.time := cl.time;
		p^.color := color + (rand() and 7);

		for j := 0 to 2 do
		begin
			p^.org[j] := org[j] + magnitude*0.1*crand();
//			p^.vel[j] := dir[j]*magnitude;
		end;
		VectorScale (dir, magnitude, p^.vel);
		d := crand()*magnitude/3;
		VectorMA (p^.vel, d, r, p^.vel);
		d := crand()*magnitude/3;
		VectorMA (p^.vel, d, u, p^.vel);

		p^.accel[0] := 0;
    p^.accel[1] := 0;
    p^.accel[2] := 0;
		p^.alpha := 1.0;

		p^.alphavel := -1.0 / (0.5 + frand()*0.3);
	end;
end;

(*
===============
CL_BlasterParticles2

Wall impact puffs (Green)
===============
*)
procedure CL_BlasterParticles2 (org, dir: vec3_t; color: Cardinal);
var
	i, j: Integer;
	p: cparticle_p;
	d: Single;
	count: Integer;
begin
	count := 40;
	for i := 0 to count - 1 do
	begin
		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;

		p^.time := cl.time;
		p^.color := color + Cardinal(rand() and 7);

		d := rand() and 15;
		for j := 0 to 2 do
		begin
			p^.org[j] := org[j] + ((rand() and 7)-4) + d*dir[j];
			p^.vel[j] := dir[j] * 30 + crand()*40;
		end;

		p^.accel[0] := 0;
    p^.accel[1] := 0;
		p^.accel[2] := -PARTICLE_GRAVITY;
		p^.alpha := 1.0;

		p^.alphavel := -1.0 / (0.5 + frand()*0.3);
	end;
end;

(*
===============
CL_BlasterTrail2

Green!
===============
*)
procedure CL_BlasterTrail2 (start, end_: vec3_t);
var
	move: vec3_t;
	vec: vec3_t;
	len: Single;
	j: Integer;
	p: cparticle_p;
	dec: Integer;
begin
	VectorCopy (start, move);
	VectorSubtract (end_, start, vec);
	len := VectorNormalize (vec);

	dec := 5;
	VectorScale (vec, 5, vec);

	// FIXME: this is a really silly way to have a loop
	while (len > 0) do
	begin
		len := len - dec;

		if (free_particles = nil) then
			Exit;
		p := free_particles;
		free_particles := p^.next;
		p^.next := active_particles;
		active_particles := p;
		VectorClear (p^.accel);

		p^.time := cl.time;

		p^.alpha := 1.0;
		p^.alphavel := -1.0 / (0.3+frand()*0.2);
		p^.color := $d0;
		for j := 0 to 2 do
		begin
			p^.org[j] := move[j] + crand();
			p^.vel[j] := crand()*5;
			p^.accel[j] := 0;
		end;

		VectorAdd (move, vec, move);
	end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -