rev |
line source |
nuclear@21
|
1 #include <stdlib.h>
|
nuclear@21
|
2 #include <GL/glew.h>
|
nuclear@21
|
3 #include "projectile.h"
|
nuclear@21
|
4 #include "sdr.h"
|
nuclear@21
|
5
|
nuclear@21
|
6 #define MAX_DIST_SQ (100.0 * 100.0)
|
nuclear@21
|
7
|
nuclear@21
|
8 struct projectile {
|
nuclear@21
|
9 vec3_t pos, vel;
|
nuclear@21
|
10 struct projectile *next;
|
nuclear@21
|
11 };
|
nuclear@21
|
12
|
nuclear@21
|
13 static struct projectile *plist, *ptail;
|
nuclear@21
|
14 static unsigned int prog;
|
nuclear@21
|
15
|
nuclear@21
|
16 int init_shots(void)
|
nuclear@21
|
17 {
|
nuclear@21
|
18 if(!(prog = create_program_load("sdr/psprite.v.glsl", "sdr/psprite.p.glsl"))) {
|
nuclear@21
|
19 return -1;
|
nuclear@21
|
20 }
|
nuclear@21
|
21 return 0;
|
nuclear@21
|
22 }
|
nuclear@21
|
23
|
nuclear@21
|
24 void shoot(vec3_t orig, vec3_t dir)
|
nuclear@21
|
25 {
|
nuclear@21
|
26 struct projectile *p;
|
nuclear@21
|
27
|
nuclear@21
|
28 if(!(p = malloc(sizeof *p))) {
|
nuclear@21
|
29 return;
|
nuclear@21
|
30 }
|
nuclear@21
|
31 p->pos = orig;
|
nuclear@21
|
32 p->vel = dir;
|
nuclear@21
|
33 p->next = 0;
|
nuclear@21
|
34
|
nuclear@21
|
35 if(plist) {
|
nuclear@21
|
36 ptail->next = p;
|
nuclear@21
|
37 ptail = p;
|
nuclear@21
|
38 } else {
|
nuclear@21
|
39 plist = ptail = p;
|
nuclear@21
|
40 }
|
nuclear@21
|
41 }
|
nuclear@21
|
42
|
nuclear@21
|
43 void update_shots(float dt)
|
nuclear@21
|
44 {
|
nuclear@21
|
45 struct projectile dummy, *pp;
|
nuclear@21
|
46
|
nuclear@21
|
47 dummy.next = plist;
|
nuclear@21
|
48 pp = &dummy;
|
nuclear@21
|
49
|
nuclear@21
|
50 while(pp->next) {
|
nuclear@21
|
51 struct projectile *p = pp->next;
|
nuclear@21
|
52
|
nuclear@21
|
53 p->pos = v3_add(p->pos, v3_scale(p->vel, dt));
|
nuclear@21
|
54
|
nuclear@21
|
55 if(v3_length_sq(p->pos) > MAX_DIST_SQ) {
|
nuclear@21
|
56 void *tmp = p;
|
nuclear@21
|
57 pp->next = p->next;
|
nuclear@21
|
58 free(tmp);
|
nuclear@21
|
59 } else {
|
nuclear@21
|
60 pp = pp->next;
|
nuclear@21
|
61 }
|
nuclear@21
|
62 }
|
nuclear@21
|
63
|
nuclear@21
|
64 plist = dummy.next;
|
nuclear@21
|
65 }
|
nuclear@21
|
66
|
nuclear@21
|
67 void draw_shots(void)
|
nuclear@21
|
68 {
|
nuclear@21
|
69 int vp[4];
|
nuclear@21
|
70 struct projectile *p = plist;
|
nuclear@21
|
71
|
nuclear@21
|
72 glPushAttrib(GL_ENABLE_BIT);
|
nuclear@21
|
73
|
nuclear@21
|
74 glEnable(GL_BLEND);
|
nuclear@21
|
75 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
nuclear@21
|
76
|
nuclear@21
|
77 glDepthMask(0);
|
nuclear@21
|
78
|
nuclear@21
|
79 glEnable(GL_POINT_SPRITE);
|
nuclear@21
|
80 glEnable(GL_PROGRAM_POINT_SIZE);
|
nuclear@21
|
81 glUseProgram(prog);
|
nuclear@21
|
82
|
nuclear@21
|
83 glGetIntegerv(GL_VIEWPORT, vp);
|
nuclear@21
|
84 if(set_uniform_float2(prog, "viewport", vp[2], vp[3]) == -1) {
|
nuclear@21
|
85 fprintf(stderr, "failed to set viewport\n");
|
nuclear@21
|
86 }
|
nuclear@21
|
87
|
nuclear@21
|
88 glBegin(GL_POINTS);
|
nuclear@21
|
89
|
nuclear@21
|
90 while(p) {
|
nuclear@21
|
91 glVertex3f(p->pos.x, p->pos.y, p->pos.z);
|
nuclear@21
|
92 p = p->next;
|
nuclear@21
|
93 }
|
nuclear@21
|
94
|
nuclear@21
|
95 glEnd();
|
nuclear@21
|
96
|
nuclear@21
|
97 glDepthMask(1);
|
nuclear@21
|
98
|
nuclear@21
|
99 glUseProgram(0);
|
nuclear@21
|
100 glPopAttrib();
|
nuclear@21
|
101
|
nuclear@21
|
102
|
nuclear@21
|
103 glDisable(GL_LIGHTING);
|
nuclear@21
|
104 glBegin(GL_LINES);
|
nuclear@21
|
105 glColor3f(0, 1, 0);
|
nuclear@21
|
106 p = plist;
|
nuclear@21
|
107 while(p) {
|
nuclear@21
|
108 float x0 = p->pos.x - 0.5;
|
nuclear@21
|
109 float y0 = p->pos.y - 0.5;
|
nuclear@21
|
110 float x1 = p->pos.x + 0.5;
|
nuclear@21
|
111 float y1 = p->pos.y + 0.5;
|
nuclear@21
|
112 glVertex3f(x0, y0, p->pos.z);
|
nuclear@21
|
113 glVertex3f(x1, y0, p->pos.z);
|
nuclear@21
|
114 glVertex3f(x1, y0, p->pos.z);
|
nuclear@21
|
115 glVertex3f(x1, y1, p->pos.z);
|
nuclear@21
|
116 glVertex3f(x1, y1, p->pos.z);
|
nuclear@21
|
117 glVertex3f(x0, y1, p->pos.z);
|
nuclear@21
|
118 glVertex3f(x0, y1, p->pos.z);
|
nuclear@21
|
119 glVertex3f(x0, y0, p->pos.z);
|
nuclear@21
|
120 p = p->next;
|
nuclear@21
|
121 }
|
nuclear@21
|
122 glEnd();
|
nuclear@21
|
123 glEnable(GL_LIGHTING);
|
nuclear@21
|
124 }
|