[nexuiz-commits] r8238 - in trunk/data: . qcsrc/common qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sun Nov 8 03:45:46 EST 2009
Author: div0
Date: 2009-11-08 03:45:44 -0500 (Sun, 08 Nov 2009)
New Revision: 8238
Modified:
trunk/data/balance.cfg
trunk/data/balance25.cfg
trunk/data/balanceHavoc.cfg
trunk/data/balanceNexrun.cfg
trunk/data/balanceSamual.cfg
trunk/data/qcsrc/common/mathlib.qc
trunk/data/qcsrc/server/cl_weaponsystem.qc
Log:
now with REAL linear falloff (old formula was wrong)
Modified: trunk/data/balance.cfg
===================================================================
--- trunk/data/balance.cfg 2009-11-08 08:35:12 UTC (rev 8237)
+++ trunk/data/balance.cfg 2009-11-08 08:45:44 UTC (rev 8238)
@@ -184,7 +184,8 @@
// 2: forward + solid circle
// 3: forward + normal distribution 3D - varies velocity
// 4: forward + normal distribution on a plane
-// 5: forward + circle with linear falloff
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
set g_balance_falldamage_deadminspeed 150
set g_balance_falldamage_minspeed 1400
set g_balance_falldamage_factor 0.15
Modified: trunk/data/balance25.cfg
===================================================================
--- trunk/data/balance25.cfg 2009-11-08 08:35:12 UTC (rev 8237)
+++ trunk/data/balance25.cfg 2009-11-08 08:45:44 UTC (rev 8238)
@@ -184,7 +184,8 @@
// 2: forward + solid circle
// 3: forward + normal distribution 3D - varies velocity
// 4: forward + normal distribution on a plane
-// 5: forward + circle with linear falloff
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
set g_balance_falldamage_deadminspeed 150
set g_balance_falldamage_minspeed 1400
set g_balance_falldamage_factor 0.15
Modified: trunk/data/balanceHavoc.cfg
===================================================================
--- trunk/data/balanceHavoc.cfg 2009-11-08 08:35:12 UTC (rev 8237)
+++ trunk/data/balanceHavoc.cfg 2009-11-08 08:45:44 UTC (rev 8238)
@@ -184,7 +184,8 @@
// 2: forward + solid circle
// 3: forward + normal distribution 3D - varies velocity
// 4: forward + normal distribution on a plane
-// 5: forward + circle with linear falloff
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
set g_balance_falldamage_deadminspeed 150
set g_balance_falldamage_minspeed 1400
set g_balance_falldamage_factor 0.15
Modified: trunk/data/balanceNexrun.cfg
===================================================================
--- trunk/data/balanceNexrun.cfg 2009-11-08 08:35:12 UTC (rev 8237)
+++ trunk/data/balanceNexrun.cfg 2009-11-08 08:45:44 UTC (rev 8238)
@@ -185,7 +185,8 @@
// 2: forward + solid circle
// 3: forward + normal distribution 3D - varies velocity
// 4: forward + normal distribution on a plane
-// 5: forward + circle with linear falloff
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
set g_balance_falldamage_deadminspeed 150
set g_balance_falldamage_minspeed 675
set g_balance_falldamage_factor 0.25
Modified: trunk/data/balanceSamual.cfg
===================================================================
--- trunk/data/balanceSamual.cfg 2009-11-08 08:35:12 UTC (rev 8237)
+++ trunk/data/balanceSamual.cfg 2009-11-08 08:45:44 UTC (rev 8238)
@@ -185,7 +185,8 @@
// 2: forward + solid circle
// 3: forward + normal distribution 3D - varies velocity
// 4: forward + normal distribution on a plane
-// 5: forward + circle with linear falloff
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
set g_balance_falldamage_deadminspeed 150
set g_balance_falldamage_minspeed 1400
set g_balance_falldamage_factor 0.15
Modified: trunk/data/qcsrc/common/mathlib.qc
===================================================================
--- trunk/data/qcsrc/common/mathlib.qc 2009-11-08 08:35:12 UTC (rev 8237)
+++ trunk/data/qcsrc/common/mathlib.qc 2009-11-08 08:45:44 UTC (rev 8238)
@@ -158,7 +158,7 @@
float cbrt(float x)
{
- return pow(x, 1.0/3.0);
+ return copysign(pow(fabs(x), 1.0/3.0), x);
}
float hypot(float x, float y)
{
Modified: trunk/data/qcsrc/server/cl_weaponsystem.qc
===================================================================
--- trunk/data/qcsrc/server/cl_weaponsystem.qc 2009-11-08 08:35:12 UTC (rev 8237)
+++ trunk/data/qcsrc/server/cl_weaponsystem.qc 2009-11-08 08:45:44 UTC (rev 8238)
@@ -1266,6 +1266,64 @@
return v - (v * p) * p;
}
+vector solve_cubic_pq(float p, float q)
+{
+ float D, u, v, a;
+ D = q*q/4.0 + p*p*p/27.0;
+ if(D < 0)
+ {
+ // irreducibilis
+ a = 1.0/3.0 * acos(-q/2.0 * sqrt(-27.0/(p*p*p)));
+ u = sqrt(-4.0/3.0 * p);
+ // a in range 0..pi/3
+ // cos(a)
+ // cos(a + 2pi/3)
+ // cos(a + 4pi/3)
+ return
+ u *
+ (
+ '1 0 0' * cos(a + 2.0/3.0*M_PI)
+ +
+ '0 1 0' * cos(a + 4.0/3.0*M_PI)
+ +
+ '0 0 1' * cos(a)
+ );
+ }
+ else if(D == 0)
+ {
+ // simple
+ if(p == 0)
+ return '0 0 0';
+ u = 3*q/p;
+ v = -u/2;
+ if(u >= v)
+ return '1 1 0' * v + '0 0 1' * u;
+ else
+ return '0 1 1' * v + '1 0 0' * u;
+ }
+ else
+ {
+ // cardano
+ u = cbrt(-q/2.0 + sqrt(D));
+ v = cbrt(-q/2.0 - sqrt(D));
+ return '1 1 1' * (u + v);
+ }
+}
+vector solve_cubic_abcd(float a, float b, float c, float d)
+{
+ // y = 3*a*x + b
+ // x = (y - b) / 3a
+ float p, q;
+ vector v;
+ p = (9*a*c - 3*b*b);
+ q = (27*a*a*d - 9*a*b*c + 2*b*b*b);
+ v = solve_cubic_pq(p, q);
+ v = (v - b * '1 1 1') * (1.0 / (3.0 * a));
+ if(a < 0)
+ v += '1 0 -1' * (v_z - v_x); // swap x, z
+ return v;
+}
+
vector findperpendicular(vector v)
{
vector p;
@@ -1279,30 +1337,18 @@
{
float sigma;
vector v1, v2;
- float dx, dy, r, t;
+ float dx, dy, r;
float sstyle;
if(spread <= 0)
return forward;
sstyle = cvar("g_projectiles_spread_style");
+
if(sstyle == 0)
{
// this is the baseline for the spread value!
// standard deviation: sqrt(2/5)
+ // density function: sqrt(1-r^2)
return forward + randomvec() * spread;
- /*
- (%i1) integrate(r^2 * 2*%pi*r * sqrt(1-r^2), r, 0, 1);
- 4 %pi
- (%o1) -----
- 15
- (%i2) integrate(2*%pi*r * sqrt(1-r^2), r, 0, 1);
- 2 %pi
- (%o2) -----
- 3
- (%i3) %o1/%o2;
- 2
- (%o3) -
- 5
- */
}
else if(sstyle == 1)
{
@@ -1315,27 +1361,16 @@
sigma = spread * 0.89442719099991587855; // match baseline stddev
v1 = findperpendicular(forward);
v2 = cross(forward, v1);
- do
- {
- dx = -1 + 2 * random();
- dy = -1 + 2 * random();
- }
- while(dx * dx + dy * dy >= 1);
- return normalize(forward + (v1 * dx + v2 * dy) * sigma);
- /*
- (%i4) integrate(r^2 * 2*%pi*r, r, 0, 1);
- %pi
- (%o4) ---
- 2
- (%i5) integrate(2*%pi*r, r, 0, 1);
- (%o5) %pi
- (%i6) %o4 / %o5;
- 1
- (%o6) -
- 2
- */
+ // random point on unit circle
+ dx = random() * 2 * M_PI;
+ dy = sin(dx);
+ dx = cos(dx);
+ // radius in our dist function
+ r = random();
+ r = sqrt(r);
+ return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
}
- else if(sstyle == 3)
+ else if(sstyle == 3) // gauss 3d
{
sigma = spread * 0.63245553203368; // match baseline stddev
v1 = forward;
@@ -1344,7 +1379,7 @@
v1_z += gsl_ran_gaussian(sigma);
return v1;
}
- else if(sstyle == 4)
+ else if(sstyle == 4) // gauss 2d
{
sigma = spread * 0.63245553203368; // match baseline stddev
v1_x = gsl_ran_gaussian(sigma);
@@ -1352,44 +1387,37 @@
v1_z = gsl_ran_gaussian(sigma);
return normalize(forward + cliptoplane(v1, forward));
}
- else if(sstyle == 5)
+ else if(sstyle == 5) // 1-r
{
sigma = spread * 1.154700538379252; // match baseline stddev
v1 = findperpendicular(forward);
v2 = cross(forward, v1);
- do
- {
- dx = -1 + 2 * random();
- dy = -1 + 2 * random();
- }
- while(dx * dx + dy * dy >= 1);
- // now we want a LINEAR falloff, though...
- // i.e. radius X has a multiplied-in probability multiplier of 1-X
- r = sqrt(dx * dx + dy * dy);
- if(r > 0)
- {
- t = 1 - sqrt(1 - r);
- dx *= t/r;
- dy *= t/r;
- }
- return normalize(forward + (v1 * dx + v2 * dy) * sigma);
- /*
- (%i7) integrate(r^2 * 2*%pi*r * (1-r), r, 0, 1);
- %pi
- (%o7) ---
- 10
- (%i8) integrate(2*%pi*r * (1-r), r, 0, 1);
- %pi
- (%o8) ---
- 3
- (%i9) %o7 / %o8;
- 3
- (%o9) --
- 10
- */
+ // random point on unit circle
+ dx = random() * 2 * M_PI;
+ dy = sin(dx);
+ dx = cos(dx);
+ // radius in our dist function
+ r = random();
+ r = solve_cubic_abcd(-2, 3, 0, -r) * '0 1 0';
+ return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
}
+ else if(sstyle == 6) // 1-r^2
+ {
+ sigma = spread * 1.095445115010332; // match baseline stddev
+ v1 = findperpendicular(forward);
+ v2 = cross(forward, v1);
+ // random point on unit circle
+ dx = random() * 2 * M_PI;
+ dy = sin(dx);
+ dx = cos(dx);
+ // radius in our dist function
+ r = random();
+ r = sqrt(1 - r);
+ r = sqrt(1 - r);
+ return normalize(forward + (v1 * dx + v2 * dy) * r * sigma);
+ }
else
- error("g_projectiles_spread_style must be 0 (sphere), 1 (flattened sphere), 2 (circle), 3 (gauss 3D), 4 (gauss plane), 5 (linear falloff)!");
+ error("g_projectiles_spread_style must be 0 (sphere), 1 (flattened sphere), 2 (circle), 3 (gauss 3D), 4 (gauss plane), 5 (linear falloff), 6 (quadratic falloff)!");
return '0 0 0';
}
More information about the nexuiz-commits
mailing list