/* * =============== SV_ClearWorld * * =============== */ public static void SV_ClearWorld() { SV_WORLD.initNodes(); SV_WORLD.sv_numareanodes = 0; SV_WORLD.SV_CreateAreaNode(0, SV_INIT.sv.models[1].mins, SV_INIT.sv.models[1].maxs); /* * Com.p("areanodes:" + sv_numareanodes + " (sollten 32 sein)."); for * (int n = 0; n < sv_numareanodes; n++) { Com.Printf( "|%3i|%2i|%8.2f * |%8.2f|%8.2f|%8.2f| %8.2f|%8.2f|%8.2f|\n", new Vargs() .add(n) * .add(sv_areanodes[n].axis) .add(sv_areanodes[n].dist) * .add(sv_areanodes[n].mins_rst[0]) .add(sv_areanodes[n].mins_rst[1]) * .add(sv_areanodes[n].mins_rst[2]) .add(sv_areanodes[n].maxs_rst[0]) * .add(sv_areanodes[n].maxs_rst[1]) .add(sv_areanodes[n].maxs_rst[2])); } */ }
/* * =============== SV_CreateAreaNode * * Builds a uniformly subdivided tree for the given world size * =============== */ public static areanode_t SV_CreateAreaNode(int depth, float[] mins, float[] maxs) { areanode_t anode; float[] size = { 0, 0, 0 }; float[] mins1 = { 0, 0, 0 }, maxs1 = { 0, 0, 0 }, mins2 = { 0, 0, 0 }, maxs2 = { 0, 0, 0 }; anode = SV_WORLD.sv_areanodes[SV_WORLD.sv_numareanodes]; // just for debugging (rst) // Math3D.VectorCopy(mins, anode.mins_rst); // Math3D.VectorCopy(maxs, anode.maxs_rst); SV_WORLD.sv_numareanodes++; SV_WORLD.ClearLink(anode.trigger_edicts); SV_WORLD.ClearLink(anode.solid_edicts); if (depth == Defines.AREA_DEPTH) { anode.axis = -1; anode.children[0] = anode.children[1] = null; return(anode); } Math3D.VectorSubtract(maxs, mins, size); if (size[0] > size[1]) { anode.axis = 0; } else { anode.axis = 1; } anode.dist = 0.5f * (maxs[anode.axis] + mins[anode.axis]); Math3D.VectorCopy(mins, mins1); Math3D.VectorCopy(mins, mins2); Math3D.VectorCopy(maxs, maxs1); Math3D.VectorCopy(maxs, maxs2); maxs1[anode.axis] = mins2[anode.axis] = anode.dist; anode.children[0] = SV_WORLD.SV_CreateAreaNode(depth + 1, mins2, maxs2); anode.children[1] = SV_WORLD.SV_CreateAreaNode(depth + 1, mins1, maxs1); return(anode); }