about summary refs log tree commit diff
path: root/src/game/g_mapres_col.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/g_mapres_col.cpp')
-rw-r--r--src/game/g_mapres_col.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/game/g_mapres_col.cpp b/src/game/g_mapres_col.cpp
new file mode 100644
index 00000000..4b391204
--- /dev/null
+++ b/src/game/g_mapres_col.cpp
@@ -0,0 +1,69 @@
+/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
+#include <engine/e_system.h>
+#include <game/g_vmath.h>
+#include <game/g_math.h>
+#include <math.h>
+#include "../engine/e_interface.h"
+#include "g_mapres_col.h"
+#include "g_mapres.h"
+
+/*
+	Simple collision rutines!
+*/
+struct collision
+{
+	int w, h;
+	unsigned char *data;
+};
+
+static collision col;
+static int global_dividor;
+
+int col_init(int dividor)
+{
+	mapres_collision *c = (mapres_collision*)map_find_item(MAPRES_COLLISIONMAP,0);
+	if(!c)
+	{
+		dbg_msg("mapres_col", "failed!");
+		return 0;
+	}
+	col.w = c->width;
+	col.h = c->height;
+	global_dividor = dividor;
+	col.data = (unsigned char *)map_get_data(c->data_index);
+	return col.data ? 1 : 0;
+}
+
+int col_check_point(int x, int y)
+{
+	int nx = x/global_dividor;
+	int ny = y/global_dividor;
+	if(nx < 0 || nx >= col.w || ny >= col.h)
+		return 1;
+	
+	if(y < 0)
+		return 0; // up == sky == free
+	
+	return col.data[ny*col.w+nx];
+}
+
+// TODO: rewrite this smarter!
+bool col_intersect_line(vec2 pos0, vec2 pos1, vec2 *out)
+{
+	float d = distance(pos0, pos1);
+	
+	for(float f = 0; f < d; f++)
+	{
+		float a = f/d;
+		vec2 pos = mix(pos0, pos1, a);
+		if(col_check_point((int)pos.x, (int)pos.y))
+		{
+			if(out)
+				*out = pos;
+			return true;
+		}
+	}
+	if(out)
+		*out = pos1;
+	return false;
+}