#define MOVE_WORLDONLY 3
#define MOVE_HITMODEL 4
-#define AREA_GRID 512
+#define AREA_GRID 128
#define AREA_GRIDNODES (AREA_GRID * AREA_GRID)
typedef struct link_s
struct link_s *prev, *next;
} link_t;
+typedef struct world_physics_s
+{
+ // for ODE physics engine
+ qboolean ode; // if true then ode is activated
+ void *ode_world;
+ void *ode_space;
+ void *ode_contactgroup;
+ // number of constraint solver iterations to use (for dWorldQuickStep)
+ int ode_iterations;
+ // actual step (server frametime / ode_iterations)
+ vec_t ode_step;
+ // time we need to simulate, for constantstep
+ vec_t ode_time;
+ // stats
+ int ode_numobjects; // total objects cound
+ int ode_activeovjects; // active objects count
+ // max velocity for a 1-unit radius object at current step to prevent
+ // missed collisions
+ vec_t ode_movelimit;
+}
+world_physics_t;
+
+struct prvm_prog_s;
+
typedef struct world_s
{
// convenient fields
char filename[MAX_QPATH];
vec3_t mins;
vec3_t maxs;
+ struct prvm_prog_s *prog;
int areagrid_stats_calls;
int areagrid_stats_nodechecks;
vec3_t areagrid_maxs;
vec3_t areagrid_size;
int areagrid_marknumber;
+
+ // if the QC uses a physics engine, the data for it is here
+ world_physics_t physics;
}
world_t;
void World_InsertLinkBefore(link_t *l, link_t *before, int entitynumber);
void World_Init(void);
+void World_Shutdown(void);
-// called after the world model has been loaded, before linking any entities
-void World_SetSize(world_t *world, const char *filename, const vec3_t mins, const vec3_t maxs);
-// unlinks all entities (used before reallocation of edicts)
+/// called after the world model has been loaded, before linking any entities
+void World_SetSize(world_t *world, const char *filename, const vec3_t mins, const vec3_t maxs, struct prvm_prog_s *prog);
+/// unlinks all entities (used before reallocation of edicts)
void World_UnlinkAll(world_t *world);
void World_PrintAreaStats(world_t *world, const char *worldname);
-// call before removing an entity, and before trying to move one,
-// so it doesn't clip against itself
+/// call before removing an entity, and before trying to move one,
+/// so it doesn't clip against itself
void World_UnlinkEdict(struct prvm_edict_s *ent);
-// Needs to be called any time an entity changes origin, mins, maxs
+/// Needs to be called any time an entity changes origin, mins, maxs
void World_LinkEdict(world_t *world, struct prvm_edict_s *ent, const vec3_t mins, const vec3_t maxs);
-// returns list of entities touching a box
+/// \returns list of entities touching a box
int World_EntitiesInBox(world_t *world, const vec3_t mins, const vec3_t maxs, int maxlist, struct prvm_edict_s **list);
+void World_Start(world_t *world);
+void World_End(world_t *world);
+
+// physics macros
+#ifndef ODE_STATIC
+# define ODE_DYNAMIC 1
+#endif
+
+#if defined(ODE_STATIC) || defined(ODE_DYNAMIC)
+# define USEODE 1
+#endif
+
+// update physics
+// this is called by SV_Physics
+void World_Physics_Frame(world_t *world, double frametime, double gravity);
+
+// change physics properties of entity
+struct prvm_edict_s;
+struct edict_odefunc_s;
+void World_Physics_ApplyCmd(struct prvm_edict_s *ed, struct edict_odefunc_s *f);
+
+// remove physics data from entity
+// this is called by entity removal
+void World_Physics_RemoveFromEntity(world_t *world, struct prvm_edict_s *ed);
+void World_Physics_RemoveJointFromEntity(world_t *world, struct prvm_edict_s *ed);
+
#endif