grav

annotate src/sim.cc @ 0:68db0e456733

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 23 May 2014 03:13:47 +0300
parents
children 3d541da6e48c
rev   line source
nuclear@0 1 #include <GL/gl.h>
nuclear@0 2 #include "sim.h"
nuclear@0 3
nuclear@0 4 Particle::Particle()
nuclear@0 5 {
nuclear@0 6 mass = 1.0;
nuclear@0 7 }
nuclear@0 8
nuclear@0 9 void Particle::impulse(const Vector3 &imp)
nuclear@0 10 {
nuclear@0 11 accel += imp;
nuclear@0 12 }
nuclear@0 13
nuclear@0 14 void Particle::step(float dt)
nuclear@0 15 {
nuclear@0 16 Vector3 npos = pos + vel * dt;
nuclear@0 17
nuclear@0 18 vel += accel * dt;
nuclear@0 19 accel.x = accel.y = accel.z = 0.0;
nuclear@0 20
nuclear@0 21 pos = npos;
nuclear@0 22 }
nuclear@0 23
nuclear@0 24
nuclear@0 25 // ---- SimWorld ----
nuclear@0 26 SimWorld::SimWorld()
nuclear@0 27 {
nuclear@0 28 set_world_bounds(1000.0f);
nuclear@0 29 }
nuclear@0 30
nuclear@0 31 void SimWorld::set_world_bounds(float rad)
nuclear@0 32 {
nuclear@0 33 radius_sq = rad * rad;
nuclear@0 34 }
nuclear@0 35
nuclear@0 36 void SimWorld::add_particle(const Particle &p)
nuclear@0 37 {
nuclear@0 38 particles.push_back(p);
nuclear@0 39 }
nuclear@0 40
nuclear@0 41 void SimWorld::step(float dt)
nuclear@0 42 {
nuclear@0 43 std::list<Particle>::iterator it = particles.begin();
nuclear@0 44 while(it != particles.end()) {
nuclear@0 45 Particle *p = &*it;
nuclear@0 46 p->step(dt);
nuclear@0 47
nuclear@0 48 if(p->pos.length_sq() > radius_sq) {
nuclear@0 49 it = particles.erase(it);
nuclear@0 50 } else {
nuclear@0 51 ++it;
nuclear@0 52 }
nuclear@0 53 }
nuclear@0 54 }
nuclear@0 55
nuclear@0 56 void SimWorld::draw() const
nuclear@0 57 {
nuclear@0 58 glBlendFunc(GL_ONE, GL_ONE);
nuclear@0 59 glEnable(GL_BLEND);
nuclear@0 60
nuclear@0 61 glBegin(GL_POINTS);
nuclear@0 62 glColor3f(0.5, 0.6, 0.7);
nuclear@0 63
nuclear@0 64 std::list<Particle>::const_iterator it = particles.begin();
nuclear@0 65 while(it != particles.end()) {
nuclear@0 66 const Particle *p = &*it++;
nuclear@0 67 glVertex3f(p->pos.x, p->pos.y, p->pos.z);
nuclear@0 68 }
nuclear@0 69
nuclear@0 70 glEnd();
nuclear@0 71
nuclear@0 72 glDisable(GL_BLEND);
nuclear@0 73 }