[nexuiz-commits] r6517 - trunk/data/qcsrc/client

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Apr 17 05:21:25 EDT 2009


Author: div0
Date: 2009-04-17 05:21:25 -0400 (Fri, 17 Apr 2009)
New Revision: 6517

Added:
   trunk/data/qcsrc/client/bgmscript.qc
   trunk/data/qcsrc/client/bgmscript.qh
   trunk/data/qcsrc/client/wall.qc
Log:
as always, forgot some files


Added: trunk/data/qcsrc/client/bgmscript.qc
===================================================================
--- trunk/data/qcsrc/client/bgmscript.qc	                        (rev 0)
+++ trunk/data/qcsrc/client/bgmscript.qc	2009-04-17 09:21:25 UTC (rev 6517)
@@ -0,0 +1,169 @@
+float bgmscriptbuf;
+float bgmscriptbufsize;
+float bgmscriptbufloaded;
+
+.float bgmscriptline;
+.float bgmscriptline0;
+.float bgmscriptvelocity;
+.float bgmscripttime;
+.float bgmscriptstate;
+.float bgmscriptstatetime;
+.float bgmscriptdelta;
+
+float GetAttackDecaySustainAmplitude(float a, float d, float s, float t)
+{
+	// phase:
+	//   attack: from 0 to 1, in time a for a full length
+	//   decay: from 1 to s, in time d
+	//   sustain: s
+	
+	if(a)
+		if(t <= a)
+			return max(0, t / a);
+
+	if(d)
+		if(t <= a + d)
+			return max(0, ((t - a) / d)) * (s - 1) + 1;
+
+	return s;
+}
+
+float GetReleaseAmplitude(float s, float r, float t)
+{
+	if(r)
+		return s * (1 - min(1, t / r));
+	
+	return 0;
+}
+
+float GetAttackTime(float a, float amp)
+{
+	return amp * a;
+}
+
+float GetReleaseTime(float s, float r, float amp)
+{
+	if(s)
+		return (1 - amp / s) * r;
+
+	return 0;
+}
+
+void BGMScript_Init()
+{
+	string s;
+	float fh;
+	bgmscriptbuf = bgmscriptbufsize = 0;
+	bgmscriptbufloaded = 1;
+	s = strcat("maps/", mi_shortname, ".bgs");
+	fh = fopen(s, FILE_READ);
+	if(fh < 0)
+		return;
+	bgmscriptbuf = buf_create();
+	while((s = fgets(fh)))
+	{
+		bufstr_set(bgmscriptbuf, bgmscriptbufsize, s);
+		++bgmscriptbufsize;
+	}
+	fclose(fh);
+}
+
+void BGMScript_InitEntity(entity e)
+{
+	if(e.bgmscript != "")
+	{
+		if(!bgmscriptbufloaded)
+			BGMScript_Init();
+
+		string mychar;
+		float i;
+
+		e.bgmscriptline0 = -1;
+		for(i = 0; i < bgmscriptbufsize; ++i)
+		{
+			tokenize_sane(bufstr_get(bgmscriptbuf, i));
+			if(argv(0) == e.bgmscript)
+				break;
+		}
+		e.bgmscriptline = e.bgmscriptline0 = i;
+		if(i >= bgmscriptbufsize)
+		{
+			print("func_pointparticles: bgmscript does not define ", mychar, "\n");
+			e.bgmscript = "";
+		}
+	}
+}
+
+float BGMScript(entity e)
+{
+	float t;
+	float amp;
+
+	if(e.bgmscript == "")
+		return 1;
+	
+	if(cvar("bgmvolume") <= 0)
+		return -1;
+
+	e.just_toggled = FALSE;
+
+	t = gettime(GETTIME_CDTRACK);
+	if(t < e.bgmscripttime)
+	{
+		e.bgmscriptline = e.bgmscriptline0;
+		e.bgmscripttime = 0;
+		e.bgmscriptstatetime = t - drawframetime - e.bgmscriptdelta; // FIXME this causes a tiny hitch
+	}
+
+	// find the CURRENT line
+	for(;;)
+	{
+		tokenize_sane(bufstr_get(bgmscriptbuf, e.bgmscriptline));
+		if(stof(argv(1)) >= t)
+			break;
+		if(argv(0) != e.bgmscript)
+		{
+			// end of bgmscript, will revert to beginning later
+			break;
+		}
+		else if(t >= stof(argv(1)))
+		{
+			e.bgmscriptline += 1;
+			e.bgmscripttime = stof(argv(1));
+
+			if(e.bgmscriptstate)
+				amp = GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscripttime - e.bgmscriptstatetime) * e.bgmscriptvelocity;
+			else
+				amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
+
+			// time code reached!
+			e.bgmscriptvelocity = stof(argv(2));
+			if(e.bgmscriptvelocity > 0)
+				e.just_toggled = e.bgmscriptstate = TRUE;
+			else
+				e.just_toggled = e.bgmscriptstate = FALSE;
+
+			if(e.bgmscriptstate)
+				e.bgmscriptstatetime = e.bgmscripttime - GetAttackTime(e.bgmscriptattack, amp / e.bgmscriptvelocity);
+			else
+			{
+				e.bgmscriptstatetime = e.bgmscripttime - GetReleaseTime(e.bgmscriptsustain, e.bgmscriptrelease, amp);
+				amp = GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, e.bgmscripttime - e.bgmscriptstatetime);
+			}
+		}
+	}
+
+	if(e.bgmscriptstate)
+	{
+		// attack, decay or sustain
+		e.bgmscriptdelta = t - e.bgmscriptstatetime;
+		return GetAttackDecaySustainAmplitude(e.bgmscriptattack, e.bgmscriptdecay, e.bgmscriptsustain, e.bgmscriptdelta) * e.bgmscriptvelocity;
+	}
+	else
+	{
+		// release
+		e.bgmscriptdelta = t - e.bgmscriptstatetime;
+		return GetReleaseAmplitude(e.bgmscriptsustain, e.bgmscriptrelease, self.bgmscriptdelta);
+	}
+}
+

Added: trunk/data/qcsrc/client/bgmscript.qh
===================================================================
--- trunk/data/qcsrc/client/bgmscript.qh	                        (rev 0)
+++ trunk/data/qcsrc/client/bgmscript.qh	2009-04-17 09:21:25 UTC (rev 6517)
@@ -0,0 +1,10 @@
+.string bgmscript;
+.float bgmscriptattack;
+.float bgmscriptdecay;
+.float bgmscriptsustain;
+.float bgmscriptrelease;
+
+.float just_toggled;
+
+void BGMScript_InitEntity(entity e);
+float BGMScript(entity e);

Added: trunk/data/qcsrc/client/wall.qc
===================================================================
--- trunk/data/qcsrc/client/wall.qc	                        (rev 0)
+++ trunk/data/qcsrc/client/wall.qc	2009-04-17 09:21:25 UTC (rev 6517)
@@ -0,0 +1,109 @@
+.float lip;
+
+void Ent_Wall_Draw()
+{
+	float f;
+	vector save;
+
+	InterpolateOrigin_Do();
+
+	save = self.origin;
+	f = BGMScript(self);
+	if(f >= 0)
+	{
+		if(self.lip < 0) // < 0: alpha goes from 1 to 1-|lip| when toggled (toggling subtracts lip)
+			self.alpha = 1 + self.lip * f;
+		else // > 0: alpha goes from 1-|lip| to 1 when toggled (toggling adds lip)
+			self.alpha = 1 - self.lip * (1 - f);
+		self.origin = self.origin + self.movedir * f;
+	}
+	else
+	{
+		self.alpha = 1;
+	}
+
+	R_AddEntity(self);
+
+	self.origin = save;
+}
+
+void Ent_Wall_Remove()
+{
+	if(self.bgmscript)
+		strunzone(self.bgmscript);
+	self.bgmscript = string_null;
+}
+
+void Ent_Wall()
+{
+	float f;
+	InterpolateOrigin_Undo();
+	self.iflags = IFLAG_ANGLES;
+
+	f = ReadByte();
+
+	if(f & 1)
+	{
+		if(f & 0x40)
+			self.colormap = ReadShort();
+		else
+			self.colormap = 0;
+	}
+
+	if(f & 2)
+	{
+		self.origin_x = ReadCoord();
+		self.origin_y = ReadCoord();
+		self.origin_z = ReadCoord();
+	}
+
+	if(f & 4)
+	{
+		if(f & 0x10)
+		{
+			self.angles_x = ReadAngle();
+			self.angles_y = ReadAngle();
+			self.angles_z = ReadAngle();
+		}
+		else
+			self.angles = '0 0 0';
+	}
+
+	if(f & 8)
+	{
+		self.modelindex = ReadShort();
+		self.solid = ReadByte();
+		self.scale = ReadByte() / 16.0;
+		if(f & 0x20)
+		{
+			self.mins_x = ReadCoord();
+			self.mins_y = ReadCoord();
+			self.mins_z = ReadCoord();
+			self.maxs_x = ReadCoord();
+			self.maxs_y = ReadCoord();
+			self.maxs_z = ReadCoord();
+		}
+		else
+			self.mins = self.maxs = '0 0 0';
+		if(self.bgmscript)
+			strunzone(self.bgmscript);
+		self.bgmscript = strzone(ReadString());
+		if(self.bgmscript != "")
+		{
+			self.bgmscriptattack = ReadByte() / 64.0;
+			self.bgmscriptdecay = ReadByte() / 64.0;
+			self.bgmscriptsustain = ReadByte() / 255.0;
+			self.bgmscriptrelease = ReadByte() / 64.0;
+			self.movedir_x = ReadCoord();
+			self.movedir_y = ReadCoord();
+			self.movedir_z = ReadCoord();
+			self.lip = ReadByte() / 255.0;
+		}
+		BGMScript_InitEntity(self);
+	}
+
+	InterpolateOrigin_Note();
+
+	self.entremove = Ent_Wall_Remove;
+	self.draw = Ent_Wall_Draw;
+}



More information about the nexuiz-commits mailing list