draw shot ring focus point where shot will land

This commit is contained in:
Josh Holtrop 2012-09-29 21:39:48 -04:00
parent 8f29d08fe9
commit 71368d1ed6
4 changed files with 43 additions and 21 deletions

View File

@ -2,12 +2,13 @@
uniform mat4 projection; uniform mat4 projection;
uniform mat4 modelview; uniform mat4 modelview;
uniform float scale; uniform float scale;
uniform float width;
/* pos.xyz is position, pos.w is offset */ /* pos.xyz is position, pos.w is 0/1 for inner/outer ring */
attribute vec4 pos; attribute vec4 pos;
void main(void) void main(void)
{ {
vec3 pos3 = pos.xyz * (scale + pos.w); vec3 pos3 = pos.xyz * (scale + width * pos.w);
gl_Position = projection * modelview * vec4(pos3, 1); gl_Position = projection * modelview * vec4(pos3, 1);
} }

View File

@ -129,7 +129,7 @@ bool Client::initgl()
CFS.get_file("shaders/shot-ring.v.glsl"), CFS.get_file("shaders/shot-ring.v.glsl"),
CFS.get_file("shaders/shot-ring.f.glsl"), CFS.get_file("shaders/shot-ring.f.glsl"),
"pos", 0, NULL, "pos", 0, NULL,
"projection", "modelview", "scale", NULL)) "projection", "modelview", "scale", "width", NULL))
return false; return false;
if (!m_tank_obj.load("models/tank.obj", load_file)) if (!m_tank_obj.load("models/tank.obj", load_file))
{ {
@ -205,7 +205,7 @@ bool Client::initgl()
shot_ring_attributes[idx++] = x; shot_ring_attributes[idx++] = x;
shot_ring_attributes[idx++] = y; shot_ring_attributes[idx++] = y;
shot_ring_attributes[idx++] = 0.0f; shot_ring_attributes[idx++] = 0.0f;
shot_ring_attributes[idx++] = SHOT_RING_WIDTH; shot_ring_attributes[idx++] = 1.0f;
} }
if (!m_shot_ring_attributes.create(GL_ARRAY_BUFFER, GL_STATIC_DRAW, if (!m_shot_ring_attributes.create(GL_ARRAY_BUFFER, GL_STATIC_DRAW,
&shot_ring_attributes[0], &shot_ring_attributes[0],
@ -248,11 +248,11 @@ void Client::redraw()
if (m_players.size() > 0) if (m_players.size() > 0)
{ {
double dir_x = cos(m_players[current_player]->direction);
double dir_y = sin(m_players[current_player]->direction);
m_modelview.load_identity(); m_modelview.load_identity();
m_modelview.look_at( m_modelview.look_at(
m_players[current_player]->x - dir_x * 25, m_players[current_player]->y - dir_y * 25, 30, m_players[current_player]->x - m_player_dir_x * 25,
m_players[current_player]->y - m_player_dir_y * 25,
30,
m_players[current_player]->x, m_players[current_player]->y, 20, m_players[current_player]->x, m_players[current_player]->y, 20,
0, 0, 1); 0, 0, 1);
@ -543,26 +543,41 @@ void Client::draw_shot_ring()
m_shot_ring_program.use(); m_shot_ring_program.use();
m_shot_ring_attributes.bind(); m_shot_ring_attributes.bind();
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE,
4 * sizeof(GLfloat), NULL);
glEnable(GL_BLEND);
m_modelview.push(); m_modelview.push();
m_modelview.translate(m_players[current_player]->x, m_modelview.translate(m_players[current_player]->x,
m_players[current_player]->y, 0.4); m_players[current_player]->y, 0.4);
m_projection.to_uniform(m_shot_ring_program.uniform("projection")); m_projection.to_uniform(m_shot_ring_program.uniform("projection"));
m_modelview.to_uniform(m_shot_ring_program.uniform("modelview")); m_modelview.to_uniform(m_shot_ring_program.uniform("modelview"));
glUniform1f(m_shot_ring_program.uniform("scale"), m_drawing_shot_distance); glUniform1f(m_shot_ring_program.uniform("scale"),
glDrawArrays(GL_TRIANGLE_STRIP, 0, (NUM_SHOT_RING_STEPS + 1) * 2); m_drawing_shot_distance);
glUniform1f(m_shot_ring_program.uniform("width"), SHOT_RING_WIDTH);
glDisable(GL_BLEND); draw_shot_ring_instance();
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, float mid_dist = m_drawing_shot_distance + SHOT_RING_WIDTH / 2.0;
8 * sizeof(GLfloat), NULL); m_modelview.translate(mid_dist * m_player_dir_x,
glDrawArrays(GL_LINE_STRIP, 0, NUM_SHOT_RING_STEPS + 1); mid_dist * m_player_dir_y, 0.01);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, m_modelview.to_uniform(m_shot_ring_program.uniform("modelview"));
8 * sizeof(GLfloat), (void *) (4 * sizeof(GLfloat))); glUniform1f(m_shot_ring_program.uniform("scale"),
glDrawArrays(GL_LINE_STRIP, 0, NUM_SHOT_RING_STEPS + 1); 0.45 * SHOT_RING_WIDTH);
glUniform1f(m_shot_ring_program.uniform("width"),
0.05 * SHOT_RING_WIDTH);
draw_shot_ring_instance();
m_modelview.pop(); m_modelview.pop();
glDisableVertexAttribArray(0); glDisableVertexAttribArray(0);
} }
} }
void Client::draw_shot_ring_instance()
{
glEnable(GL_BLEND);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE,
4 * sizeof(GLfloat), NULL);
glDrawArrays(GL_TRIANGLE_STRIP, 0, (NUM_SHOT_RING_STEPS + 1) * 2);
glDisable(GL_BLEND);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE,
8 * sizeof(GLfloat), NULL);
glDrawArrays(GL_LINE_STRIP, 0, NUM_SHOT_RING_STEPS + 1);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE,
8 * sizeof(GLfloat), (void *) (4 * sizeof(GLfloat)));
glDrawArrays(GL_LINE_STRIP, 0, NUM_SHOT_RING_STEPS + 1);
}

View File

@ -228,6 +228,9 @@ void Client::update(double elapsed_time)
m_players[current_player]->hover = 0; m_players[current_player]->hover = 0;
} }
m_player_dir_x = cos(m_players[current_player]->direction);
m_player_dir_y = sin(m_players[current_player]->direction);
// Send an update to the server if something has changed // Send an update to the server if something has changed
if((m_players[current_player]->w_pressed != w_pressed) || if((m_players[current_player]->w_pressed != w_pressed) ||
(m_players[current_player]->a_pressed != a_pressed) || (m_players[current_player]->a_pressed != a_pressed) ||

View File

@ -30,7 +30,10 @@ class Client
void draw_sky(); void draw_sky();
void draw_lava(); void draw_lava();
void draw_shot_ring(); void draw_shot_ring();
void draw_shot_ring_instance();
double m_player_dir_x;
double m_player_dir_y;
refptr<sf::Window> m_window; refptr<sf::Window> m_window;
sf::Clock m_clock; sf::Clock m_clock;
Map m_map; Map m_map;