shithub: musw

Download patch

ref: b8379bd4d9bd65ae85c7d08554dc6ded0d9e1b7d
parent: 2e058861a4dc6622083d9f603020c2428df92861
author: rodri <rgl@antares-labs.eu>
date: Fri Jun 3 16:36:54 EDT 2022

got rid of GameState.

--- a/dat.h
+++ b/dat.h
@@ -30,7 +30,6 @@
 typedef struct Ship Ship;
 typedef struct Star Star;
 typedef struct Universe Universe;
-typedef struct GameState GameState;
 typedef struct Derivative Derivative;
 typedef struct Conn Conn;
 typedef struct Player Player;
@@ -106,12 +105,6 @@
 	void (*reset)(Universe*);
 };
 
-struct GameState
-{
-	double t, timeacc;
-	Point2 p, v;
-};
-
 struct Derivative
 {
 	Point2 dx; /* v */
@@ -155,9 +148,6 @@
 	Player players[2];	/* the needle and the wedge */
 	Universe *u;
 	Party *prev, *next;
-
-	/* testing */
-	GameState state;
 };
 
 
--- a/fns.h
+++ b/fns.h
@@ -10,8 +10,7 @@
 /*
  * physics
  */
-void integrate(GameState*, double, double);
-void integrateu(Universe*, double, double);
+void integrate(Universe*, double, double);
 
 /*
  * nanosec
--- a/musw.c
+++ b/musw.c
@@ -30,14 +30,7 @@
 };
 ulong kdown;
 
-typedef struct Ball Ball;
-struct Ball
-{
-	Point2 p, v;
-};
-
 RFrame screenrf;
-Ball bouncer;
 Universe *universe;
 VModel *needlemdl;
 Image *skymap;
@@ -123,11 +116,11 @@
 	Matrix T = {
 		1, 0, ship->p.x,
 		0, 1, ship->p.y,
-		0, 0, 1
+		0, 0, 1,
 	}, R = {
 		cos(ship->θ), -sin(ship->θ), 0,
 		sin(ship->θ),  cos(ship->θ), 0,
-		0, 0, 1
+		0, 0, 1,
 	};
 
 	mulm(T, R);
@@ -212,7 +205,7 @@
 	io = ioproc();
 
 	while((n = ioread(io, fd, buf, sizeof buf)) > 0){
-		unpack(buf, n, "PPdPdP", &bouncer.p,
+		unpack(buf, n, "PdPdP",
 			&universe->ships[0].p, &universe->ships[0].θ,
 			&universe->ships[1].p, &universe->ships[1].θ,
 			&universe->star.p);
@@ -279,7 +272,6 @@
 	lockdisplay(display);
 
 	draw(screen, screen->r, skymap, nil, ZP);
-	fillellipse(screen, toscreen(bouncer.p), 2, 2, display->white, ZP);
 
 	drawship(&universe->ships[0], screen);
 	drawship(&universe->ships[1], screen);
--- a/muswd.c
+++ b/muswd.c
@@ -91,8 +91,7 @@
 	Party *p;
 
 	for(p = theparty.next; p != &theparty; p = p->next){
-		n = pack(buf, sizeof buf, "PPdPdP",
-			p->state.p,
+		n = pack(buf, sizeof buf, "PdPdP",
 			p->u->ships[0].p, p->u->ships[0].θ,
 			p->u->ships[1].p, p->u->ships[1].θ,
 			p->u->star.p);
@@ -112,13 +111,6 @@
 }
 
 void
-resetsim(Party *p)
-{
-	memset(&p->state, 0, sizeof p->state);
-	p->state.p = Pt2(0,100,1);
-}
-
-void
 threadsim(void *)
 {
 	uvlong then, now;
@@ -136,7 +128,6 @@
 
 		if(lobby->getcouple(lobby, couple) != -1){
 			newparty(couple);
-			resetsim(theparty.prev);
 			theparty.prev->u->reset(theparty.prev->u);
 		}
 
@@ -146,7 +137,6 @@
 
 		for(p = theparty.next; p != &theparty; p = p->next){
 			p->u->timeacc += frametime/1e9;
-			p->state.timeacc += frametime/1e9;
 
 			while(p->u->timeacc >= Δt){
 				p->u->step(p->u, Δt);
@@ -153,12 +143,6 @@
 				p->u->timeacc -= Δt;
 				p->u->t += Δt;
 			}
-
-			while(p->state.timeacc >= Δt){
-				integrate(&p->state, p->state.t, Δt);
-				p->state.timeacc -= Δt;
-				p->state.t += Δt;
-			}
 		}
 
 		broadcaststate();
@@ -193,8 +177,6 @@
 	Ship *s;
 
 	for(p = theparty.next; p != &theparty; p = p->next, i++){
-		fprint(fd, "%lud p %v	v %v\n",
-			i, p->state.p, p->state.v);
 		for(s = &p->u->ships[0]; s-p->u->ships < nelem(p->u->ships); s++){
 			fprint(fd, "%lud s%lld k%d p %v v %v θ %g ω %g m %g f %d\n",
 				i, s-p->u->ships, s->kind, s->p, s->v, s->θ, s->ω, s->mass, s->fuel);
--- a/physics.c
+++ b/physics.c
@@ -7,108 +7,16 @@
 
 static double G = 6.674e-11;
 
+
 /*
  *	Dynamics stepper
  */
 static Point2
-accel(GameState *s, double)
-{
-	static double k = 15, b = 0.1;
-
-	return Vec2(0, -k*s->p.y - b*s->v.y);
-}
-
-static Derivative
-eval(GameState *s0, double t, double Δt, Derivative *d)
-{
-	GameState s;
-	Derivative res;
-
-	s.p = addpt2(s0->p, mulpt2(d->dx, Δt));
-	s.v = addpt2(s0->v, mulpt2(d->dv, Δt));
-
-	res.dx = s.v;
-	res.dv = accel(&s, t+Δt);
-	return res;
-}
-
-/*
- *	Explicit Euler Integrator
- */
-static void
-euler0(GameState *s, double t, double Δt)
-{
-	static Derivative ZD = {0};
-	Derivative d;
-
-	d = eval(s, t, Δt, &ZD);
-
-	s->p = addpt2(s->p, mulpt2(d.dx, Δt));
-	s->v = addpt2(s->v, mulpt2(d.dv, Δt));
-}
-
-/*
- *	Semi-implicit Euler Integrator
- */
-static void
-euler1(GameState *s, double t, double Δt)
-{
-	static Derivative ZD = {0};
-	Derivative d;
-
-	d = eval(s, t, Δt, &ZD);
-
-	s->v = addpt2(s->v, mulpt2(d.dv, Δt));
-	s->p = addpt2(s->p, mulpt2(s->v, Δt));
-}
-
-/*
- *	RK4 Integrator
- */
-static void
-rk4(GameState *s, double t, double Δt)
-{
-	static Derivative ZD = {0};
-	Derivative a, b, c, d;
-	Point2 dxdt, dvdt;
-
-	a = eval(s, t, 0, &ZD);
-	b = eval(s, t, Δt/2, &a);
-	c = eval(s, t, Δt/2, &b);
-	d = eval(s, t, Δt, &c);
-
-	dxdt = divpt2(addpt2(addpt2(a.dx, mulpt2(addpt2(b.dx, c.dx), 2)), d.dx), 6);
-	dvdt = divpt2(addpt2(addpt2(a.dv, mulpt2(addpt2(b.dv, c.dv), 2)), d.dv), 6);
-
-	s->p = addpt2(s->p, mulpt2(dxdt, Δt));
-	s->v = addpt2(s->v, mulpt2(dvdt, Δt));
-}
-
-/*
- *	The Integrator
- */
-void
-integrate(GameState *s, double t, double Δt)
-{
-	//euler0(s, t, Δt);
-	//euler1(s, t, Δt);
-	rk4(s, t, Δt);
-}
-
-/*
- *
- * UNIVERSE MIGRATION. KEEP CALM AND FASTEN YOUR SEAT BELTS.
- *
- */
-
-/*
- * XXX: remember to take thrust into account, based on user input.
- */
-static Point2
 accelship(Universe *u, Particle *p, double)
 {
 	double g, d;
 
+	/* XXX: remember to take thrust into account, based on user input. */
 	d = vec2len(subpt2(u->star.p, p->p));
 	d *= 1e5; /* scale to the 100km/px range */
 	g = G*u->star.mass/(d*d);
@@ -122,7 +30,7 @@
 }
 
 static Derivative
-evalu(Universe *u, Particle *p0, double t, double Δt, Derivative *d, Point2 (*a)(Universe*,Particle*,double))
+eval(Universe *u, Particle *p0, double t, double Δt, Derivative *d, Point2 (*accel)(Universe*,Particle*,double))
 {
 	Particle p;
 	Derivative res;
@@ -131,33 +39,39 @@
 	p.v = addpt2(p0->v, mulpt2(d->dv, Δt));
 
 	res.dx = p.v;
-	res.dv = a(u, &p, t+Δt);
+	res.dv = accel(u, &p, t+Δt);
 	return res;
 }
 
+/*
+ *	Semi-implicit Euler Integrator
+ */
 static void
-euler1u(Universe *u, Particle *p, double t, double Δt)
+euler1(Universe *u, Particle *p, double t, double Δt, Point2 (*accel)(Universe*,Particle*,double))
 {
 	static Derivative ZD = {0};
 	Derivative d;
 
-	d = evalu(u, p, t, Δt, &ZD);
+	d = eval(u, p, t, Δt, &ZD, accel);
 
 	p->v = addpt2(p->v, mulpt2(d.dv, Δt));
 	p->p = addpt2(p->p, mulpt2(p->v, Δt));
 }
 
+/*
+ *	RK4 Integrator
+ */
 static void
-rk4u(Universe *u, Particle *p, double t, double Δt, Point2 (*acc)(Universe*,Particle*,double))
+rk4(Universe *u, Particle *p, double t, double Δt, Point2 (*accel)(Universe*,Particle*,double))
 {
 	static Derivative ZD = {0};
 	Derivative a, b, c, d;
 	Point2 dxdt, dvdt;
 
-	a = evalu(u, p, t, 0, &ZD, acc);
-	b = evalu(u, p, t, Δt/2, &a, acc);
-	c = evalu(u, p, t, Δt/2, &b, acc);
-	d = evalu(u, p, t, Δt, &c, acc);
+	a = eval(u, p, t, 0, &ZD, accel);
+	b = eval(u, p, t, Δt/2, &a, accel);
+	c = eval(u, p, t, Δt/2, &b, accel);
+	d = eval(u, p, t, Δt, &c, accel);
 
 	dxdt = divpt2(addpt2(addpt2(a.dx, mulpt2(addpt2(b.dx, c.dx), 2)), d.dx), 6);
 	dvdt = divpt2(addpt2(addpt2(a.dv, mulpt2(addpt2(b.dv, c.dv), 2)), d.dv), 6);
@@ -166,15 +80,18 @@
 	p->v = addpt2(p->v, mulpt2(dvdt, Δt));
 }
 
+/*
+ *	The Integrator
+ */
 void
-integrateu(Universe *u, double t, double Δt)
+integrate(Universe *u, double t, double Δt)
 {
 	int i, j;
 
 	for(i = 0; i < nelem(u->ships); i++){
-		rk4u(u, &u->ships[i], t, Δt, accelship);
+		rk4(u, &u->ships[i], t, Δt, accelship);
 		for(j = 0; j < nelem(u->ships[i].rounds); j++)
 			if(u->ships[i].rounds[j].fired)
-				euler1u(u, &u->ships[i].rounds[j], t, Δt, accelbullet);
+				euler1(u, &u->ships[i].rounds[j], t, Δt, accelbullet);
 	}
 }
--- a/universe.c
+++ b/universe.c
@@ -8,7 +8,7 @@
 static void
 universe_step(Universe *u, double Δt)
 {
-	integrateu(u, u->t, Δt);
+	integrate(u, u->t, Δt);
 }
 
 static void