--- a/src/proto2/NetworkUDP.cc Mon Nov 24 22:05:19 2008 +0000
+++ b/src/proto2/NetworkUDP.cc Mon Nov 24 22:09:29 2008 +0000
@@ -11,6 +11,9 @@
// connect signal
slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
+
+ // nonblocking
+ socket.set_nonblocking(true);
}
NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
@@ -21,6 +24,9 @@
// connect signal
slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
+
+ // nonblocking
+ socket.set_nonblocking(true);
}
void NetworkUDP::on_recv (void) {
@@ -28,22 +34,26 @@
NetworkPacket pkt;
NetworkAddress src;
- // attempt to recv
- try {
- ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
+ // receieve as many packets as possible
+ do {
+ // attempt to recv a packet
+ try {
+ ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
- } catch (CL_Error &e) {
- if (errno == EAGAIN)
- return;
- else
- throw;
- }
-
- // set packet data size
- pkt.set_data_size(ret);
+ } catch (CL_Error &e) {
+ if (errno == EAGAIN)
+ return;
+ else
+ throw;
+ }
+
+ // set packet data size
+ pkt.set_data_size(ret);
- // handle packet
- _sig_packet(pkt, src);
+ // handle packet
+ _sig_packet(pkt, src);
+
+ } while (true);
}
bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
--- a/src/proto2/Physics.cc Mon Nov 24 22:05:19 2008 +0000
+++ b/src/proto2/Physics.cc Mon Nov 24 22:09:29 2008 +0000
@@ -8,7 +8,7 @@
#include <assert.h>
PhysicsWorld::PhysicsWorld (Vector gravity, Vector dimensions)
- : tick_timer(PHYSICS_TICK_MS), gravity(gravity), dimensions(dimensions), terrain(dimensions.x, std::vector<TerrainType>(dimensions.y, DIRT)) {
+ : tick_timer(PHYSICS_TICK_MS), tick_counter(0), gravity(gravity), dimensions(dimensions), terrain(dimensions.x, std::vector<TerrainType>(dimensions.y, DIRT)) {
generateTerrain(1337);
@@ -26,6 +26,12 @@
for (std::vector<PhysicsObject*>::iterator i = objects.begin(); i != objects.end(); i++) {
(*i)->tick();
}
+
+ tick_counter++;
+}
+
+uint32_t PhysicsWorld::getTick (void) {
+ return tick_counter;
}
PhysicsObject::PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity)
--- a/src/proto2/Physics.hh Mon Nov 24 22:05:19 2008 +0000
+++ b/src/proto2/Physics.hh Mon Nov 24 22:09:29 2008 +0000
@@ -26,6 +26,8 @@
private:
CL_Timer tick_timer;
+
+ uint32_t tick_counter;
protected:
std::vector<PhysicsObject*> objects;
@@ -45,6 +47,8 @@
void addObject (PhysicsObject *object);
void tick (void);
+ uint32_t getTick (void);
+
void generateTerrain (int seed);
bool collided (Vector oldPos, Vector newPos);