Esempio n. 1
0
        /*
         * =============== 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])); }
             */
        }
Esempio n. 2
0
        /*
         * =============== 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);
        }