/*
  Copyright (C) 2010-2011  Charles Pence <charles@charlespence.net>
  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 3 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, see <http://www.gnu.org/licenses/>.
*/

#define    TOP_RANGE        16            // soldier uniform colors
#define    BOTTOM_RANGE    96

//=============================================================================

typedef struct efrag_s
{
    struct mleaf_s        *leaf;
    struct efrag_s        *leafnext;
    struct entity_s        *entity;
    struct efrag_s        *entnext;
} efrag_t;


typedef struct entity_s
{
    qboolean                forcelink;        // model changed

    int                        update_type;

    entity_state_t            baseline;        // to fill in defaults in updates

    double                    msgtime;        // time of last update
    vec3_t                    msg_origins[2];    // last two updates (0 is newest)
    vec3_t                    origin;
    vec3_t                    msg_angles[2];    // last two updates (0 is newest)
    vec3_t                    angles;
    struct model_s            *model;            // NULL = no model
    struct efrag_s            *efrag;            // linked list of efrags
    int                        frame;
    float                    syncbase;        // for client-side animations
    qboolean                recolor;
    int                        effects;        // light, particals, etc
    float                   alphaval;
    int                        skinnum;        // for Alias models
    int                        visframe;        // last frame this entity was
                                            //  found in an active leaf

    int                        dlightframe;    // dynamic lighting
    int                        dlightbits;

    struct mnode_s            *topnode;        // for bmodels, first world node
                                            //  that splits bmodel, or NULL if
                                            //  not split
} entity_t;

typedef struct
{
    vec3_t origin;
    vec3_t forward, right, up;
    
    vec3_t viewangles;

    float fov_x, fov_y;
} refdef_t;


//
// refresh
//
extern    int        reinit_surfcache;


extern    refdef_t    r_refdef;

extern    struct texture_s    *r_notexture_mip;


void R_Init(void);
void R_Shutdown(void);
void R_InitEfrags(void);
void R_RenderView(void);        // must set r_refdef first
void R_InitSky(struct texture_s *mt);    // called at level load

void R_AddEfrags (entity_t *ent);
void R_RemoveEfrags (entity_t *ent);

void R_NewMap (void);


void R_ParseParticleEffect (void);
void R_RunParticleEffect (vec3_t org, vec3_t dir, int color, int count);
void R_RocketTrail (vec3_t start, vec3_t end, int type);

void R_DarkFieldParticles (entity_t *ent);
void R_EntityParticles (entity_t *ent);
void R_BlobExplosion (vec3_t org);
void R_ParticleExplosion (vec3_t org);
void R_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength);
void R_LavaSplash (vec3_t org);
void R_TeleportSplash (vec3_t org);

void R_PushDlights (void);
