Skip to content

Commit

Permalink
Add vscript_trace_filter
Browse files Browse the repository at this point in the history
  • Loading branch information
mtxfellen authored Nov 18, 2024
1 parent 5c38861 commit 36c6fe4
Showing 1 changed file with 140 additions and 0 deletions.
140 changes: 140 additions & 0 deletions scripts/vscripts/trace_filter.nut
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
// by ficool2

if ("TraceFilter_trace" in getroottable())
return;

::World <- ::Entities.FindByClassname(null, "worldspawn");

::TraceFilter_trace <- null;
::TraceFilter_function <- null;
::TraceFilter_entities <- [];
::TraceFilter_entity_mins <- [];
::TraceFilter_entity_maxs <- [];

// do not change
::TRACE_STOP <- 0;
::TRACE_OK_STOP <- 1;
::TRACE_CONTINUE <- 2;
::TRACE_OK_CONTINUE <- 3;

::TraceFilterRecurse <- function(trace)
{
local entity = trace.enthit;
TraceFilter_entities.append(entity);
TraceFilter_entity_mins.append(entity.GetBoundingMins());
TraceFilter_entity_maxs.append(entity.GetBoundingMaxs());
entity.SetSize(Vector(), Vector());

delete trace.enthit;
TraceFilter_function(trace);

if ("enthit" in trace)
{
local new_entity = trace.enthit;
if (new_entity == World) // currently, world always blocks
return;
if (new_entity == entity) // this should not happen
return;
if (trace.filter(new_entity) == TRACE_STOP)
return;
TraceFilterRecurse(trace);
}
}

::TraceGatherRecurse <- function(trace)
{
local entity = trace.enthit;

delete trace.enthit;
TraceFilter_function(trace);

if ("enthit" in trace)
{
local new_entity = trace.enthit;
if (new_entity == World) // currently, world always blocks
return;
if (new_entity == entity) // this should not happen
return;
local result = trace.filter(new_entity);
if (result & 1) // accepted result?
{
local hit = clone(trace);
hit.pos = trace.pos + Vector();
hit.startpos = trace.startpos + Vector();
hit.endpos = trace.endpos + Vector();
hit.plane_normal = trace.plane_normal + Vector();
TraceFilter_trace.hits.append(hit);
}
if (result < 2) // stop?
return;

TraceFilter_entities.append(new_entity);
TraceFilter_entity_mins.append(new_entity.GetBoundingMins());
TraceFilter_entity_maxs.append(new_entity.GetBoundingMaxs());
new_entity.SetSize(Vector(), Vector());

TraceGatherRecurse(trace);
}
}

::TraceFilter <- function(trace)
{
TraceFilter_function(trace);

if ("enthit" in trace)
{
// early out
if (trace.filter(trace.enthit) == TRACE_STOP)
return trace;

TraceFilter_entities.clear();
TraceFilter_entity_mins.clear();
TraceFilter_entity_maxs.clear();

TraceFilterRecurse(trace);

foreach (i, entity in TraceFilter_entities)
entity.SetSize(TraceFilter_entity_mins[i], TraceFilter_entity_maxs[i]);
}
}

::TraceGather <- function(trace)
{
TraceFilter_entities.clear();
TraceFilter_entity_mins.clear();
TraceFilter_entity_maxs.clear();
TraceFilter_trace = trace;

trace.enthit <- null;
trace.hits <- [];
TraceGatherRecurse(trace);

foreach (i, entity in TraceFilter_entities)
entity.SetSize(TraceFilter_entity_mins[i], TraceFilter_entity_maxs[i]);
}

::TraceLineFilter <- function(trace)
{
TraceFilter_function = TraceLineEx;
TraceFilter(trace);
}

::TraceHullFilter <- function(trace)
{
TraceFilter_function = TraceHull;
TraceFilter(trace);
}

::TraceLineGather <- function(trace)
{
TraceFilter_function = TraceLineEx;
TraceGather(trace);
}

::TraceHullGather <- function(trace)
{
TraceFilter_function = TraceHull;
TraceGather(trace);
}


0 comments on commit 36c6fe4

Please sign in to comment.