Since I had nothing better to do, I wrote the main part down for you:
void get_align_vectors(CVector3 &quad_up, CVector3 &quad_right){ float model_view[16]; CVector3 cam_up_vec = CVector3(0.0f, 1.0f, 0.0f), cam_right_vec = CVector3(1.0f, 0.0f, 0.0f); glGetFloatv(GL_MODELVIEW_MATRIX, model_view); quad_up = apply_matrix_to_vec(transposed(model_view), cam_up_vec); quad_right = apply_matrix_to_vec(transposed(model_view), cam_right_vec); quad_up.normalize(); quad_right.normalize();}void draw_particle(CVector3 quad_up, CVector3 quad_right, CVector3 quad_pos){ CVector3 corner_tr, corner_tl, corner_br, corner_bl; corner_tr = quad_up + quad_right + quad_pos; corner_tl = quad_up - quad_right + quad_pos; corner_br = -quad_up + quad_right + quad_pos; corner_bl = -quad_up - quad_right + quad_pos; glBegin(GL_TRIANGLE_STRIP); glVertex3f(corner_tr.x, corner_tr.y, corner_tr.z); glVertex3f(corner_br.x, etc...); glVertex3f(corner_bl.x, etc...); glVertex3f(corner_tl.x, etc...); glEnd();}void draw_particles(){ CVector3 up, right; get_align_vectors(up, right); for (i = 0; i < nr_quads; i++) draw_particle(up, right, particle.position);}
Note that this is untested and uncompiled, but I believe the theory is sound. I left out the standard matrix/vector functions.
Tom