public static Model loadDSM(String filename) throws IOException {
		File file = new File(filename);
		byte[] fileData = new byte[(int) file.length()];
		DataInputStream dis = new DataInputStream(new FileInputStream(file));
		dis.readFully(fileData);
		dis.close();

		ByteBuffer buffer = ByteBuffer.wrap(fileData);
		buffer.order(ByteOrder.LITTLE_ENDIAN);

		ArrayList<Vector3f> vertexes = new ArrayList<Vector3f>();
		ArrayList<Vector3f> faces = new ArrayList<Vector3f>();

		short vsize = buffer.getShort();

		for (int i = 0; i < vsize; i++) {
			float x = buffer.getFloat();
			float y = buffer.getFloat();
			float z = buffer.getFloat();

			vertexes.add(new Vector3f(x, y, z));
		}

		short fsize = buffer.getShort();

		for (int i = 0; i < fsize; i++) {
			short a = buffer.getShort();
			short b = buffer.getShort();
			short c = buffer.getShort();

			faces.add(new Vector3f(a, b, c));
		}

		int uid = glGenLists(1);
		glNewList(uid, GL_COMPILE);

		glBegin(GL_TRIANGLES);

		for (int i = 0; i < faces.size(); i++) {
			Vector3f a = vertexes.get((int) faces.get(i).x);
			Vector3f b = vertexes.get((int) faces.get(i).y);
			Vector3f c = vertexes.get((int) faces.get(i).z);

			glVertex3f((float) a.x, (float) a.y, (float) a.z);
			glVertex3f((float) b.x, (float) b.y, (float) b.z);
			glVertex3f((float) c.x, (float) c.y, (float) c.z);
		}

		glEnd();

		glEndList();

		return new Model(uid);
	}