[nexuiz-commits] r6211 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Wed Mar 18 07:22:23 EDT 2009
Author: div0
Date: 2009-03-18 07:22:22 -0400 (Wed, 18 Mar 2009)
New Revision: 6211
Modified:
trunk/data/qcsrc/server/bots.qc
trunk/data/qcsrc/server/extensions.qh
Log:
use checkpvs() for bot waypointing
redstarrepublic now relinks twice as fast
Modified: trunk/data/qcsrc/server/bots.qc
===================================================================
--- trunk/data/qcsrc/server/bots.qc 2009-03-18 06:27:29 UTC (rev 6210)
+++ trunk/data/qcsrc/server/bots.qc 2009-03-18 11:22:22 UTC (rev 6211)
@@ -486,6 +486,9 @@
from.wp00 = to;from.wp00mincost = c;return;
};
+// fields you can query using prvm_global server to get some statistics about waypoint linking culling
+float relink_total, relink_walkculled, relink_pvsculled, relink_lengthculled;
+
// relink this spawnfunc_waypoint
// (precompile a list of all reachable waypoints from this spawnfunc_waypoint)
// (SLOW!)
@@ -496,9 +499,8 @@
//dprint("waypoint_think wpisbox = ", ftos(self.wpisbox), "\n");
sm1 = self.origin + self.mins;
sm2 = self.origin + self.maxs;
- e = find(world, classname, "waypoint");
stepheightvec = cvar("sv_stepheight") * '0 0 1';
- while (e)
+ for(e = world; (e = find(e, classname, "waypoint")); )
{
if (boxesoverlap(self.absmin, self.absmax, e.absmin, e.absmax))
{
@@ -507,6 +509,12 @@
}
else
{
+ ++relink_total;
+ if(!checkpvs(self.origin, e))
+ {
+ ++relink_pvsculled;
+ continue;
+ }
sv = e.origin;
sv_x = bound(sm1_x, sv_x, sm2_x);
sv_y = bound(sm1_y, sv_y, sm2_y);
@@ -519,38 +527,41 @@
ev_z = bound(em1_z, ev_z, em2_z);
dv = ev - sv;
dv_z = 0;
- if (vlen(dv) < 1050) // max search distance in XY
+ if (vlen(dv) >= 1050) // max search distance in XY
{
- navigation_testtracewalk = 0;
- if (!self.wpisbox)
+ ++relink_lengthculled;
+ continue;
+ }
+ navigation_testtracewalk = 0;
+ if (!self.wpisbox)
+ {
+ tracebox(sv - PL_MIN_z * '0 0 1', PL_MIN, PL_MAX, sv, FALSE, self);
+ if (!trace_startsolid)
{
- tracebox(sv - PL_MIN_z * '0 0 1', PL_MIN, PL_MAX, sv, FALSE, self);
- if (!trace_startsolid)
- {
- //dprint("sv deviation", vtos(trace_endpos - sv), "\n");
- sv = trace_endpos + '0 0 1';
- }
+ //dprint("sv deviation", vtos(trace_endpos - sv), "\n");
+ sv = trace_endpos + '0 0 1';
}
- if (!e.wpisbox)
+ }
+ if (!e.wpisbox)
+ {
+ tracebox(ev - PL_MIN_z * '0 0 1', PL_MIN, PL_MAX, ev, FALSE, e);
+ if (!trace_startsolid)
{
- tracebox(ev - PL_MIN_z * '0 0 1', PL_MIN, PL_MAX, ev, FALSE, e);
- if (!trace_startsolid)
- {
- //dprint("ev deviation", vtos(trace_endpos - ev), "\n");
- ev = trace_endpos + '0 0 1';
- }
+ //dprint("ev deviation", vtos(trace_endpos - ev), "\n");
+ ev = trace_endpos + '0 0 1';
}
- //traceline(self.origin, e.origin, FALSE, world);
- //if (trace_fraction == 1)
- if (!self.wpisbox)
- if (tracewalk(self, sv, PL_MIN, PL_MAX, ev, MOVE_NOMONSTERS))
- waypoint_addlink(self, e);
- if (!e.wpisbox)
- if (tracewalk(e, ev, PL_MIN, PL_MAX, sv, MOVE_NOMONSTERS))
- waypoint_addlink(e, self);
}
+ //traceline(self.origin, e.origin, FALSE, world);
+ //if (trace_fraction == 1)
+ if (!self.wpisbox && tracewalk(self, sv, PL_MIN, PL_MAX, ev, MOVE_NOMONSTERS))
+ waypoint_addlink(self, e);
+ else
+ relink_walkculled += 0.5;
+ if (!e.wpisbox && tracewalk(e, ev, PL_MIN, PL_MAX, sv, MOVE_NOMONSTERS))
+ waypoint_addlink(e, self);
+ else
+ relink_walkculled += 0.5;
}
- e = find(e, classname, "waypoint");
}
navigation_testtracewalk = 0;
};
@@ -759,6 +770,7 @@
void waypoint_schedulerelinkall()
{
local entity head;
+ relink_total = relink_walkculled = relink_pvsculled = relink_lengthculled = 0;
head = findchain(classname, "waypoint");
while (head)
{
Modified: trunk/data/qcsrc/server/extensions.qh
===================================================================
--- trunk/data/qcsrc/server/extensions.qh 2009-03-18 06:27:29 UTC (rev 6210)
+++ trunk/data/qcsrc/server/extensions.qh 2009-03-18 11:22:22 UTC (rev 6211)
@@ -639,6 +639,18 @@
//description:
//similar to find() but returns a chain of entities like findradius.
+//DP_QC_FINDCHAIN_TOFIELD
+//idea: div0
+//darkplaces implementation: div0
+//builtin definitions:
+entity(.string fld, float match, .entity tofield) findradius_tofield = #22;
+entity(.string fld, string match, .entity tofield) findchain_tofield = #402;
+entity(.string fld, float match, .entity tofield) findchainflags_tofield = #450;
+entity(.string fld, float match, .entity tofield) findchainfloat_tofield = #403;
+//description:
+//similar to findchain() etc, but stores the chain into .tofield instead of .chain
+//actually, the .entity tofield is an optional field of the the existing findchain* functions
+
//DP_QC_FINDCHAINFLAGS
//idea: Sajt
//darkplaces implementation: LordHavoc
@@ -1783,6 +1795,14 @@
//description:
//sv_jumpstep allows stepping up onto stairs while airborn, sv_stepheight controls how high a single step can be.
+//FTE_QC_CHECKPVS
+//idea: Urre
+//darkplaces implementation: div0
+//builtin definitions:
+float checkpvs(vector viewpos, entity viewee) = #240;
+//description:
+//returns true if viewee can be seen from viewpos according to PVS data
+
//FTE_STRINGS
//idea: many
//darkplaces implementation: KrimZon
More information about the nexuiz-commits
mailing list