/*
Copyright (C) 1996-1997 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

typedef struct
{
  vec3_t  normal;
  float dist;
} pmplane_t;

typedef struct
{
  qboolean  allsolid; // if true, plane is not valid
  qboolean  startsolid; // if true, the initial point was in a solid area
  qboolean  inopen, inwater;
  float   fraction;   // time completed, 1.0 = didn't hit anything
  vec3_t    endpos;     // final position
  pmplane_t   plane;      // surface normal at impact
  int     ent;      // entity the surface is on
} pmtrace_t;


#define MAX_PHYSENTS  32
typedef struct
{
  vec3_t  origin;
  model_t *model;   // only for bsp models
  vec3_t  mins, maxs; // only for non-bsp models
  int   info;   // for client or server to identify
} physent_t;


typedef struct
{
  int   sequence; // just for debugging prints

  // player state
  vec3_t  origin;
  vec3_t  angles;
  vec3_t  velocity;
  int   oldbuttons;
  float   waterjumptime;
  qboolean  dead;
  int   spectator;

  // world state
  int   numphysent;
  physent_t physents[MAX_PHYSENTS]; // 0 should be the world

  // input
  usercmd_t cmd;

  // results
  int   numtouch;
  int   touchindex[MAX_PHYSENTS];
} playermove_t;

typedef struct {
  float gravity;
  float stopspeed;
  float maxspeed;
  float spectatormaxspeed;
  float accelerate;
  float airaccelerate;
  float wateraccelerate;
  float friction;
  float waterfriction;
  float entgravity;
} movevars_t;


extern  movevars_t    movevars;
extern  playermove_t  pmove;
extern  int   onground;
extern  int   waterlevel;
extern  int   watertype;

void PlayerMove (void);
void Pmove_Init (void);

int PM_HullPointContents (hull_t *hull, int num, vec3_t p);

int PM_PointContents (vec3_t point);
qboolean PM_TestPlayerPosition (vec3_t point);
pmtrace_t PM_PlayerMove (vec3_t start, vec3_t stop);
