[Change] Some corrections for rendering weapons with delta time.

This commit is contained in:
Allanis 2013-12-15 17:30:50 +00:00
parent 19b8f38acf
commit 389a7b5746
3 changed files with 32 additions and 19 deletions

View File

@ -455,23 +455,26 @@ static void update_routine(double dt) {
* -- Text and GUI.
*/
static void render_all(void) {
double dt;
dt = (paused) ? 0. : cur_dt;
/* Setup. */
spfx_start(cur_dt);
spfx_start(dt);
/* BG. */
space_render(cur_dt);
space_render(dt);
planets_render();
player_renderBG();
weapons_render(WEAPON_LAYER_BG);
weapons_render(WEAPON_LAYER_BG, dt);
/* N. */
pilots_render();
weapons_render(WEAPON_LAYER_FG);
weapons_render(WEAPON_LAYER_FG, dt);
spfx_render(SPFX_LAYER_BACK);
/* FG. */
player_render();
spfx_render(SPFX_LAYER_FRONT);
space_renderOverlay(cur_dt);
space_renderOverlay(dt);
player_renderGUI();
display_fps(cur_dt);
display_fps(dt); /* Exception. */
}

View File

@ -65,6 +65,7 @@ typedef struct Weapon_ {
int voice; /**< Weapons voice. */
double lockon; /**< Some weapons have a lockon delay. */
double timer; /**< Mainly used to see when the weapon was fired. */
double anim; /**< Used for beam weapon graphics. */
/* Update position and render. */
void(*update)(struct Weapon_*, const double, WeaponLayer); /**< Update the weapon. */
@ -91,7 +92,7 @@ static Weapon* weapon_create(const Outfit* outfit, const double dir,
const unsigned int parent,
const unsigned int target);
static void weapon_render(const Weapon* w);
static void weapon_render(Weapon* w, const double dt);
static void weapons_updateLayer(const double dt, const WeaponLayer layer);
static void weapon_update(Weapon* w, const double dt, WeaponLayer layer);
static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer, Vec2* pos);
@ -386,8 +387,9 @@ static void weapons_updateLayer(const double dt, const WeaponLayer layer) {
*
* @brief Render all the weapons in a layer.
* @param layer Layer to render.
* @param Current delta tick.
*/
void weapons_render(const WeaponLayer layer) {
void weapons_render(const WeaponLayer layer, const double dt) {
Weapon** wlayer;
int* nlayer;
int i;
@ -403,16 +405,16 @@ void weapons_render(const WeaponLayer layer) {
break;
}
for(i = 0; i < (*nlayer); i++)
weapon_render(wlayer[i]);
weapon_render(wlayer[i], dt);
}
/**
* @fn static void weapon_render(const Weapon* w)
* @fn static void weapon_render(Weapon* w, const double dt)
*
* @brief Render an individual weapon.
* @param w Weapon to render.
*/
static void weapon_render(const Weapon* w) {
static void weapon_render(Weapon* w, const double dt) {
int sx, sy;
double x, y;
glTexture* gfx;
@ -457,34 +459,42 @@ static void weapon_render(const Weapon* w) {
/* Start fading. */
ACOLOUR(cWhite, 0.);
glTexCoord2d(0., 0.);
glTexCoord2d(w->anim, 0.);
glVertex2d(-gfx->sh/2., 0.);
glTexCoord2d(0., 1.);
glTexCoord2d(w->anim, 1.);
glVertex2d(+gfx->sh/2., 0.);
/* Full Strength. */
COLOUR(cWhite);
glTexCoord2d(10. / gfx->sw, 0.);
glTexCoord2d(w->anim+10. / gfx->sw, 0.);
glVertex2d(-gfx->sh/2., 10.);
glTexCoord2d(10. / gfx->sw, 1.);
glTexCoord2d(w->anim+10. / gfx->sw, 1.);
glVertex2d(+gfx->sh/2., 10.);
glTexCoord2d(0.8*w->outfit->u.bem.range / gfx->sw, 0.);
glTexCoord2d(w->anim+0.8*w->outfit->u.bem.range / gfx->sw, 0.);
glVertex2d(+gfx->sh/2., 0.8*w->outfit->u.bem.range);
glTexCoord2d(w->anim+0.8*w->outfit->u.bem.range / gfx->sw, 1.);
glVertex2d(+gfx->sh/2., 0.8*w->outfit->u.bem.range);
/* Fades out. */
ACOLOUR(cWhite, 0.);
glTexCoord2d(w->outfit->u.bem.range / gfx->sw, 0.);
glTexCoord2d(w->anim+w->outfit->u.bem.range / gfx->sw, 0.);
glVertex2d(-gfx->sh/2., w->outfit->u.bem.range);
glTexCoord2d(w->outfit->u.bem.range / gfx->sw, 1.);
glTexCoord2d(w->anim+w->outfit->u.bem.range / gfx->sw, 1.);
glVertex2d(+gfx->sh/2., w->outfit->u.bem.range);
glEnd();
/* Do the beam movement. */
w->anim -= 5. * dt;
if(w->anim <= -gfx->sw)
w->anim += gfx->sw;
/* Clean up. */
glDisable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);

View File

@ -28,7 +28,7 @@ void weapon_explode(double x, double y, double radius,
/* Update. */
void weapons_update(const double dt);
void weapons_render(const WeaponLayer layer);
void weapons_render(const WeaponLayer layer, const double dt);
/* Clean. */
void weapon_clear(void);