public static bool R_CullBox(ref Vector3 mins, ref Vector3 maxs) { for (int i = 0; i < 4; i++) { if (Mathlib.BoxOnPlaneSide(ref mins, ref maxs, frustum[i]) == 2) { return(true); } } return(false); }
public static void SV_FindTouchedLeafs(edict_t ent, mnodebase_t node) { if (node.contents == q_shared.CONTENTS_SOLID) { return; } // add an efrag if the node is a leaf if (node.contents < 0) { if (ent.num_leafs == q_shared.MAX_ENT_LEAFS) { return; } mleaf_t leaf = (mleaf_t)node; int leafnum = Array.IndexOf(sv.worldmodel.leafs, leaf) - 1; ent.leafnums[ent.num_leafs] = (short)leafnum; ent.num_leafs++; return; } // NODE_MIXED mnode_t n = (mnode_t)node; mplane_t splitplane = n.plane; int sides = Mathlib.BoxOnPlaneSide(ref ent.v.absmin, ref ent.v.absmax, splitplane); // recurse down the contacted sides if ((sides & 1) != 0) { SV_FindTouchedLeafs(ent, n.children[0]); } if ((sides & 2) != 0) { SV_FindTouchedLeafs(ent, n.children[1]); } }
public static void R_SplitEntityOnNode(mnodebase_t node) { if (node.contents == q_shared.CONTENTS_SOLID) { return; } // add an efrag if the node is a leaf if (node.contents < 0) { if (r_pefragtopnode == null) { r_pefragtopnode = node as mnode_t; } mleaf_t leaf = (mleaf_t)(object)node; // grab an efrag off the free list efrag_t ef = cl.free_efrags; if (ef == null) { Con_Printf("Too many efrags!\n"); return; // no free fragments... } cl.free_efrags = cl.free_efrags.entnext; ef.entity = r_addent; // add the entity link // *lastlink = ef; if (_LastObj is entity_t) { ((entity_t)_LastObj).efrag = ef; } else { ((efrag_t)_LastObj).entnext = ef; } _LastObj = ef; // lastlink = &ef->entnext; ef.entnext = null; // set the leaf links ef.leaf = leaf; ef.leafnext = leaf.efrags; leaf.efrags = ef; return; } // NODE_MIXED mnode_t n = node as mnode_t; if (n == null) { return; } mplane_t splitplane = n.plane; int sides = Mathlib.BoxOnPlaneSide(ref r_emins, ref r_emaxs, splitplane); if (sides == 3) { // split on this plane // if this is the first splitter of this bmodel, remember it if (r_pefragtopnode == null) { r_pefragtopnode = n; } } // recurse down the contacted sides if ((sides & 1) != 0) { R_SplitEntityOnNode(n.children[0]); } if ((sides & 2) != 0) { R_SplitEntityOnNode(n.children[1]); } }