Replace some per-frame physics loops with intrusive lists 761/head
authorMario <mario.mario@y7mail.com>
Sat, 18 Jan 2020 21:33:46 +0000 (07:33 +1000)
committerMario <mario.mario@y7mail.com>
Sat, 18 Jan 2020 21:33:46 +0000 (07:33 +1000)
qcsrc/common/physics/movetypes/movetypes.qc
qcsrc/ecs/lib.qh
qcsrc/server/defs.qh
qcsrc/server/g_world.qc

index 9d32cf3d5bb8347fd40c2eecdadf33d23f5b4429..68d4c366016f922f0374e54a69a8b34ac1c9dfdd 100644 (file)
@@ -7,6 +7,8 @@ void set_movetype(entity this, int mt)
        if (mt == MOVETYPE_PHYSICS || mt == MOVETYPE_PUSH || mt == MOVETYPE_FAKEPUSH) {
                this.move_qcphysics = false;
        }
+       if(!IL_CONTAINS(g_moveables, this))
+               IL_PUSH(g_moveables, this); // add it to the moveable entities list (even if it doesn't move!) logic: if an object never sets its movetype, we assume it never does anything notable
        this.movetype = (this.move_qcphysics) ? MOVETYPE_NONE : mt;
 }
 #elif defined(CSQC)
index 2d48e577b8da2bf72b5ae3fa8cf19da46d8b89aa..192136b6253225e014490f4d4e100f2ddfca30e9 100644 (file)
@@ -1,24 +1,29 @@
 #pragma once
 
+IntrusiveList g_events;
+IntrusiveList g_components;
+STATIC_INIT(components) { g_events = IL_NEW(); g_components = IL_NEW(); }
+
 /** Components always interpolate from the previous state */
 #define COMPONENT(com) \
        void com_##com##_interpolate(entity it, float a); \
        .bool com_##com
 
-#define FOREACH_COMPONENT(com, body) FOREACH_ENTITY_FLOAT(com_##com, true, body)
+#define FOREACH_COMPONENT(com, body) IL_EACH(g_components, it.com_##com, body)
 
 
 #define EVENT(T, args) .bool evt_##T##_listener; .void args evt_##T
 
 #define emit(T, ...) \
        MACRO_BEGIN \
-       FOREACH_ENTITY_FLOAT_ORDERED(evt_##T##_listener, true, it.evt_##T(__VA_ARGS__)); \
+       IL_EACH(g_events, it.evt_##T##_listener, it.evt_##T(__VA_ARGS__)); \
        MACRO_END
 
 #define subscribe(listener, T, fn) \
        MACRO_BEGIN \
        listener.evt_##T = (fn); \
        listener.evt_##T##_listener = true; \
+       IL_PUSH(g_events, listener); \
        MACRO_END
 
 
index b1d73f6a3124c87110d254d1f2bc73f739003d38..29621f61d83ff80fc73163281d1a9bd0c33da6f8 100644 (file)
@@ -412,6 +412,7 @@ IntrusiveList g_locations;
 IntrusiveList g_saved_team;
 IntrusiveList g_monster_targets;
 IntrusiveList g_pathlib_nodes;
+IntrusiveList g_moveables;
 STATIC_INIT(defs)
 {
        g_monsters = IL_NEW();
@@ -433,4 +434,5 @@ STATIC_INIT(defs)
        g_saved_team = IL_NEW();
        g_monster_targets = IL_NEW();
        g_pathlib_nodes = IL_NEW();
+       g_moveables = IL_NEW();
 }
index c3dc5be39f605369ca208c79ec61490d9bdda3cd..82e67a4067e84f53a522fe8d3c9a5834f2d2bc3e 100644 (file)
@@ -2108,7 +2108,7 @@ void Physics_Frame()
        if(autocvar_sv_freezenonclients)
                return;
 
-       FOREACH_ENTITY_FLOAT(pure_data, false,
+       IL_EACH(g_moveables, true,
        {
                if(IS_CLIENT(it) || it.classname == "" || it.move_movetype == MOVETYPE_PUSH || it.move_movetype == MOVETYPE_FAKEPUSH || it.move_movetype == MOVETYPE_PHYSICS)
                        continue;
@@ -2134,7 +2134,7 @@ void Physics_Frame()
        if(autocvar_sv_gameplayfix_delayprojectiles >= 0)
                return;
 
-       FOREACH_ENTITY_FLOAT(move_qcphysics, true,
+       IL_EACH(g_moveables, it.move_qcphysics,
        {
                if(IS_CLIENT(it) || is_pure(it) || it.classname == "" || it.move_movetype == MOVETYPE_NONE)
                        continue;