oculus2_psprite

annotate src/projectile.c @ 21:dc7af0f549b2

VR point sprite shooting test
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 22 Jan 2015 06:19:52 +0200
parents
children
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 }