1. André Schnabel
  2. MeshViewer

Commits

André Schnabel  committed 329d82b

Initial commit

  • Participants
  • Branches default

Comments (0)

Files changed (8)

File .classpath

View file
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/libgdx"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

File .project

View file
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>MeshViewer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

File .settings/org.eclipse.jdt.core.prefs

View file
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6

File src/com/andreschnabel/meshviewer/Main.java

View file
+package com.andreschnabel.meshviewer;
+
+import com.badlogic.gdx.Game;
+import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
+import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
+
+public class Main extends Game {
+
+	@Override
+	public void create() {
+		setScreen(new MainScreen());
+	}
+
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
+		config.useGL20 = false;
+		config.title = "MeshViewer";
+		config.width = 640;
+		config.height = 480;
+		config.vSyncEnabled = true;
+		new LwjglApplication(new Main(), config);
+	}
+
+}

File src/com/andreschnabel/meshviewer/MainScreen.java

View file
+package com.andreschnabel.meshviewer;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.Input.Buttons;
+import com.badlogic.gdx.Input.Keys;
+import com.badlogic.gdx.Screen;
+import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.GL10;
+import com.badlogic.gdx.graphics.GLCommon;
+import com.badlogic.gdx.graphics.Mesh;
+import com.badlogic.gdx.graphics.PerspectiveCamera;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.VertexAttribute;
+import com.badlogic.gdx.graphics.VertexAttributes.Usage;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.math.Intersector;
+import com.badlogic.gdx.math.Matrix4;
+import com.badlogic.gdx.math.Vector3;
+import com.badlogic.gdx.math.collision.Ray;
+
+public class MainScreen implements Screen {
+	
+	private Vector3 origin = new Vector3();
+
+	private Vector3[] positions = null;
+	private List<Vector3> morePositions = new LinkedList<Vector3>();
+
+	private boolean wasReleased;
+
+	private float[] verts;
+	private short[] indcs;
+	
+	private float[] txCoordsForBlock(int row, int col) {		
+		float minU = col * TXFACTOR;
+		float maxU = (col+1) * TXFACTOR;
+		float minV = row * TXFACTOR;
+		float maxV = (row+1)*TXFACTOR;
+		
+		float[] txCrds = {
+			minU, minV,
+			maxU, minV,
+			maxU, maxV,
+			minU, maxV,
+		}; 
+		
+		return txCrds;
+	}
+	
+	private void reloadMesh() {
+		float[] posCrds =  {
+			-0.5f, -0.5f, 0.5f,	
+			0.5f, -0.5f, 0.5f,	
+			0.5f, 0.5f, 0.5f,	
+			-0.5f, 0.5f, 0.5f,	
+			
+			-0.5f, -0.5f, -0.5f,	
+			0.5f, -0.5f, -0.5f,	
+			0.5f, 0.5f, -0.5f,
+			-0.5f, 0.5f, -0.5f,
+		};
+		
+		float[] txCrds = txCoordsForBlock(1, 11);
+		
+		short[] posIndcs = {
+			0,1,2,
+			2,3,0,
+			
+			6,5,4,
+			4,7,6,
+			
+			0,4,5,
+			5,1,0,
+			
+			0,7,4,
+			3,7,0,
+			
+			6,2,1,
+			1,5,6,
+			
+			6,7,3,
+			3,2,6,
+		};
+		
+		short[] txIndcs = {
+			0,1,2,
+			2,3,0,
+			
+			0,1,2,
+			2,3,0,
+			
+			0,1,2,
+			2,3,0,
+			
+			0,2,1,
+			3,2,0,
+			
+			0,1,2,
+			2,3,0,
+			
+			0,1,2,
+			2,3,0,
+		};
+		
+		positions = new Vector3[posCrds.length / 3];
+		for(int i=0; i<positions.length; i++)
+			positions[i] = new Vector3(posCrds[i*3], posCrds[i*3+1], posCrds[i*3+2]);
+		
+		short[] indcs = new short[posIndcs.length];
+		for(short i=0; i<indcs.length; i++)
+			indcs[i] = i;
+		
+		int numCoords = (USE_POS ? 3 : 0) + (USE_TXCRD ? 2 : 0) + (USE_COLOR ? 4 : 0);
+		float[] verts = new float[indcs.length * numCoords];
+		
+		assert(!USE_COLOR);
+		
+		for(int i=0; i<posIndcs.length; i++) {
+			verts[i*numCoords+0] = posCrds[posIndcs[i]*3+0];
+			verts[i*numCoords+1] = posCrds[posIndcs[i]*3+1];
+			verts[i*numCoords+2] = posCrds[posIndcs[i]*3+2];
+			
+			verts[i*numCoords+3] = txCrds[txIndcs[i]*2+0];
+			verts[i*numCoords+4] = txCrds[txIndcs[i]*2+1];
+		}
+		
+		mesh.setVertices(verts);
+		mesh.setIndices(indcs);
+		
+		this.verts = verts;
+		this.indcs = indcs;
+		
+		if(Gdx.input.isKeyPressed(Keys.SPACE) && wasReleased) {
+			
+			System.out.print("float *coords = {");
+			
+			for(int i=0; i<verts.length; i++) {
+				if(i % numCoords == 0)
+					System.out.println();
+				else if(i % numCoords == 3)
+					System.out.print("\t");
+				
+				System.out.print(String.format("%.2f", verts[i]).replace(',', '.') + ", ");
+			}
+			
+			System.out.println("\n};");
+			
+			wasReleased = false;
+		}		
+		if(!Gdx.input.isKeyPressed(Keys.SPACE)) wasReleased = true;
+	}
+	
+	private enum TransformMode {
+		TRANSFORM_CAM,
+		TRANSFORM_MESH
+	}
+	
+	private TransformMode tmode;
+	
+	private static final boolean USE_POS = true;
+	private static final boolean USE_TXCRD = true;
+	private static final boolean USE_COLOR = false;
+
+	private static final float MOV_SPEED = 10.0f;
+	private static final float ROT_SPEED = 100.0f;
+	
+	private GLCommon gl;
+	private Texture tex = new Texture("data/texmap.png");
+	private Mesh mesh;
+	private PerspectiveCamera cam = new PerspectiveCamera(80, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
+
+	private Vector3 invOrigin;
+	
+	private static final int TXMAP_SIZE = 256;
+	private static final int TX_SIZE = 16;
+	private static final float TXFACTOR = (float)TX_SIZE / TXMAP_SIZE;
+	
+	private BitmapFont bfont = new BitmapFont(Gdx.files.internal("data/font.fnt"), false);
+	private SpriteBatch sb = new SpriteBatch();
+
+	@Override
+	public void show() {
+		this.gl = Gdx.gl;
+
+		VertexAttribute[] attributeArray = genAttributeArray();
+		
+		mesh = new Mesh(true, 100, 100, attributeArray);
+		
+		tex.bind();
+		
+		cam.position.add(0.0f, 0.0f, 2.0f);
+		
+		if(tmode == TransformMode.TRANSFORM_CAM)
+			Gdx.input.setCursorCatched(true);
+		
+		gl.glClearColor(0.6f, 0.8f, 1.0f, 1.0f);
+		
+		cam.near = 0.01f;
+		cam.far = 1024.0f;
+		
+		invOrigin = origin.cpy().mul(-1);
+		
+		gl.glEnable(GL10.GL_TEXTURE_2D);
+		gl.glEnable(GL10.GL_DEPTH_TEST);
+		
+		bfont.setColor(Color.RED);
+	}
+
+	private VertexAttribute[] genAttributeArray() {
+		List<VertexAttribute> attributes = new LinkedList<VertexAttribute>();
+		if(USE_POS)
+			attributes.add(new VertexAttribute(Usage.Position, 3, "pos"));
+		if(USE_COLOR)
+			attributes.add(new VertexAttribute(Usage.Color, 4, "col"));
+		if(USE_TXCRD)
+			attributes.add(new VertexAttribute(Usage.TextureCoordinates, 2, "txcrd"));
+		
+		VertexAttribute[] attributeArray = attributes.toArray(new VertexAttribute[0]);
+		return attributeArray;
+	}
+
+	@Override
+	public void resize(int width, int height) {
+	}
+	
+	@Override
+	public void render(float delta) {		
+		if(Gdx.input.isKeyPressed(Keys.ESCAPE))
+			Gdx.app.exit();
+		
+		reloadMesh();
+		
+		boolean meshCtrl = false;
+		
+		if(tmode == TransformMode.TRANSFORM_CAM)
+			cameraControl(delta);
+		else { 
+			meshControl(delta);
+			meshCtrl = true;
+		}
+		
+		gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
+		
+		cam.update();
+		cam.apply(Gdx.gl10);
+		
+		if(meshCtrl) {
+			Gdx.gl10.glPushMatrix();
+			Gdx.gl10.glRotatef(meshRotY, 0.0f, 1.0f, 0.0f);
+			Gdx.gl10.glRotatef(meshRotX, 1.0f, 0.0f, 0.0f);
+		}
+		
+		gl.glEnable(GL10.GL_TEXTURE_2D);
+		gl.glEnable(GL10.GL_CULL_FACE);
+		tex.bind();	
+		drawMeshAt(invOrigin);
+		gl.glDisable(GL10.GL_CULL_FACE);
+		
+		if(meshCtrl) {
+			Gdx.gl10.glPopMatrix();
+		}
+		
+		if(positions != null) {
+			Matrix4 rotMx = new Matrix4();
+			rotMx.rotate(0.0f, 1.0f, 0.0f, meshRotY);
+			rotMx.rotate(1.0f, 0.0f, 0.0f, meshRotX);
+			
+			sb.begin();
+			int i;
+			for(i=0; i<positions.length; i++) {
+				Vector3 tmp = positions[i].add(invOrigin);
+				tmp = tmp.rot(rotMx);
+				drawVertexIndicator(tmp, String.valueOf(i));
+			}
+			
+			for(Vector3 pos : morePositions) {
+				drawVertexIndicator(pos, String.valueOf(i++));
+			}
+			
+			sb.end();
+		}
+	}
+	
+	private void drawVertexIndicator(Vector3 vxPos, String text) {		
+		Vector3 pixelPos = vxPos.cpy();
+		cam.project(pixelPos);		
+		bfont.draw(sb, text, pixelPos.x, pixelPos.y);		
+	}
+	
+	private float meshRotY, meshRotX;
+
+	private boolean btnReleased;
+	
+	private void meshControl(float delta) {
+		if(Gdx.input.isKeyPressed(Keys.LEFT)) {
+			meshRotY += ROT_SPEED * delta;
+		}
+		if(Gdx.input.isKeyPressed(Keys.RIGHT)) {
+			meshRotY -= ROT_SPEED * delta;
+		}
+		if(Gdx.input.isKeyPressed(Keys.UP)) {
+			meshRotX -= ROT_SPEED * delta;
+		}
+		if(Gdx.input.isKeyPressed(Keys.DOWN)) {
+			meshRotX += ROT_SPEED * delta;
+		}
+		
+		meshRotY += Gdx.input.getDeltaX() * delta * ROT_SPEED * 0.125f;
+		meshRotX += Gdx.input.getDeltaY() * delta * ROT_SPEED * 0.125f;
+		
+		if(Gdx.input.isButtonPressed(Buttons.LEFT) && btnReleased) {
+			Ray r = cam.getPickRay(Gdx.input.getX(), Gdx.input.getY());
+			Vector3 isection = new Vector3();
+			if(Intersector.intersectRayTriangles(r, verts, indcs, 5, isection)) {
+				morePositions.add(isection);
+			}
+			btnReleased = false;
+		}
+		
+		if(!Gdx.input.isButtonPressed(Buttons.LEFT)) btnReleased = true;
+	}
+
+	private void drawMeshAt(Vector3 pos) {
+		Gdx.gl10.glPushMatrix();
+		Gdx.gl10.glTranslatef(pos.x, pos.y, pos.z);
+		mesh.render(GL10.GL_TRIANGLES);
+		Gdx.gl10.glPopMatrix();
+	}
+
+	private void cameraControl(float delta) {
+		Vector3 right = cam.direction.cpy().crs(cam.up);
+		
+		float movSpeed = MOV_SPEED * delta;
+		float rotSpeed = ROT_SPEED * delta;
+		
+		if(Gdx.input.isKeyPressed(Keys.W) || Gdx.input.isKeyPressed(Keys.UP))
+			cam.position.add(cam.direction.cpy().mul(movSpeed));
+		if(Gdx.input.isKeyPressed(Keys.A))
+			cam.position.add(right.cpy().mul(-movSpeed));
+		if(Gdx.input.isKeyPressed(Keys.S) || Gdx.input.isKeyPressed(Keys.DOWN))
+			cam.position.add(cam.direction.cpy().mul(-movSpeed));
+		if(Gdx.input.isKeyPressed(Keys.D))
+			cam.position.add(right.cpy().mul(movSpeed));
+		
+		if(Gdx.input.isKeyPressed(Keys.LEFT)) {
+			cam.rotate(rotSpeed, 0.0f, 1.0f, 0.0f);
+		}
+		if(Gdx.input.isKeyPressed(Keys.RIGHT)) {
+			cam.rotate(-rotSpeed, 0.0f, 1.0f, 0.0f);
+		}
+		
+		cam.rotate(Gdx.input.getDeltaX() * 0.025f, 0.0f, 1.0f, 0.0f);
+		right = cam.direction.cpy().crs(cam.up);
+		cam.rotate(Gdx.input.getDeltaY() * 0.025f, right.x, right.y, right.z);
+	}
+
+	@Override
+	public void hide() {
+	}
+
+	@Override
+	public void pause() {
+	}
+
+	@Override
+	public void resume() {
+	}
+
+	@Override
+	public void dispose() {
+		tex.dispose();
+	}
+
+}

File src/data/font.fnt

View file
+info face="DejaVu Sans Mono" size=14 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
+common lineHeight=14 base=11 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0
+page id=0 file="font.png"
+chars count=191
+char id=32   x=147   y=41    width=1     height=1     xoffset=0     yoffset=11    xadvance=7     page=0  chnl=15
+char id=33   x=251   y=12    width=1     height=9     xoffset=3     yoffset=2     xadvance=7     page=0  chnl=15
+char id=34   x=92    y=43    width=3     height=3     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=35   x=106   y=33    width=7     height=8     xoffset=0     yoffset=3     xadvance=7     page=0  chnl=15
+char id=36   x=209   y=0     width=5     height=11    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=37   x=65    y=23    width=7     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=38   x=122   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=39   x=254   y=33    width=1     height=3     xoffset=3     yoffset=2     xadvance=7     page=0  chnl=15
+char id=40   x=251   y=0     width=3     height=11    xoffset=3     yoffset=1     xadvance=7     page=0  chnl=15
+char id=41   x=12    y=14    width=3     height=11    xoffset=2     yoffset=1     xadvance=7     page=0  chnl=15
+char id=42   x=21    y=45    width=5     height=6     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=43   x=114   y=33    width=7     height=7     xoffset=0     yoffset=4     xadvance=7     page=0  chnl=15
+char id=44   x=96    y=43    width=2     height=3     xoffset=2     yoffset=9     xadvance=7     page=0  chnl=15
+char id=45   x=139   y=41    width=3     height=1     xoffset=2     yoffset=7     xadvance=7     page=0  chnl=15
+char id=46   x=118   y=41    width=1     height=2     xoffset=3     yoffset=9     xadvance=7     page=0  chnl=15
+char id=47   x=36    y=12    width=6     height=10    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=48   x=129   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=49   x=94    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=50   x=136   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=51   x=143   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=52   x=150   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=53   x=157   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=54   x=164   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=55   x=108   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=56   x=171   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=57   x=178   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=58   x=252   y=33    width=1     height=6     xoffset=3     yoffset=5     xadvance=7     page=0  chnl=15
+char id=59   x=249   y=33    width=2     height=7     xoffset=2     yoffset=5     xadvance=7     page=0  chnl=15
+char id=60   x=0     y=46    width=6     height=6     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=61   x=78    y=43    width=6     height=3     xoffset=1     yoffset=6     xadvance=7     page=0  chnl=15
+char id=62   x=14    y=46    width=6     height=6     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=63   x=76    y=33    width=5     height=9     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=64   x=50    y=12    width=6     height=10    xoffset=1     yoffset=3     xadvance=7     page=0  chnl=15
+char id=65   x=185   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=66   x=192   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=67   x=199   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=68   x=206   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=69   x=213   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=70   x=220   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=71   x=227   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=72   x=234   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=73   x=70    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=74   x=28    y=34    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=75   x=241   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=76   x=248   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=77   x=0     y=36    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=78   x=101   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=79   x=7     y=36    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=80   x=14    y=36    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=81   x=202   y=0     width=6     height=11    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=82   x=9     y=26    width=7     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=83   x=21    y=35    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=84   x=25    y=24    width=7     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=85   x=73    y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=86   x=80    y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=87   x=33    y=23    width=7     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=88   x=87    y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=89   x=41    y=23    width=7     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=90   x=94    y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=91   x=16    y=13    width=2     height=11    xoffset=3     yoffset=1     xadvance=7     page=0  chnl=15
+char id=92   x=29    y=12    width=6     height=10    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=93   x=19    y=13    width=2     height=11    xoffset=2     yoffset=1     xadvance=7     page=0  chnl=15
+char id=94   x=85    y=43    width=6     height=3     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=95   x=122   y=41    width=7     height=1     xoffset=0     yoffset=13    xadvance=7     page=0  chnl=15
+char id=96   x=106   y=42    width=3     height=2     xoffset=2     yoffset=1     xadvance=7     page=0  chnl=15
+char id=97   x=203   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=98   x=159   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=99   x=197   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=100  x=63    y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=101  x=191   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=102  x=57    y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=103  x=81    y=12    width=5     height=10    xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=104  x=87    y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=105  x=135   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=106  x=12    y=0     width=3     height=13    xoffset=2     yoffset=1     xadvance=7     page=0  chnl=15
+char id=107  x=129   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=108  x=165   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=109  x=185   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=110  x=179   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=111  x=173   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=112  x=141   y=12    width=5     height=10    xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=113  x=111   y=12    width=5     height=10    xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=114  x=167   y=33    width=5     height=7     xoffset=2     yoffset=4     xadvance=7     page=0  chnl=15
+char id=115  x=161   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=116  x=40    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=117  x=233   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=118  x=227   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=119  x=122   y=33    width=7     height=7     xoffset=0     yoffset=4     xadvance=7     page=0  chnl=15
+char id=120  x=209   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=121  x=195   y=12    width=5     height=10    xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=122  x=215   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=123  x=0     y=14    width=5     height=11    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=124  x=22    y=0     width=1     height=12    xoffset=3     yoffset=1     xadvance=7     page=0  chnl=15
+char id=125  x=245   y=0     width=5     height=11    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=126  x=99    y=43    width=6     height=2     xoffset=1     yoffset=6     xadvance=7     page=0  chnl=15
+char id=160  x=149   y=41    width=1     height=1     xoffset=0     yoffset=11    xadvance=7     page=0  chnl=15
+char id=161  x=253   y=12    width=1     height=9     xoffset=3     yoffset=2     xadvance=7     page=0  chnl=15
+char id=162  x=6     y=14    width=5     height=11    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=163  x=88    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=164  x=7     y=46    width=6     height=6     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=165  x=17    y=25    width=7     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=166  x=249   y=12    width=1     height=10    xoffset=3     yoffset=3     xadvance=7     page=0  chnl=15
+char id=167  x=123   y=12    width=5     height=10    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=168  x=143   y=41    width=3     height=1     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=169  x=146   y=33    width=7     height=7     xoffset=0     yoffset=3     xadvance=7     page=0  chnl=15
+char id=170  x=244   y=33    width=4     height=7     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=171  x=34    y=43    width=6     height=5     xoffset=1     yoffset=5     xadvance=7     page=0  chnl=15
+char id=172  x=71    y=43    width=6     height=3     xoffset=1     yoffset=6     xadvance=7     page=0  chnl=15
+char id=173  x=135   y=41    width=3     height=1     xoffset=2     yoffset=7     xadvance=7     page=0  chnl=15
+char id=174  x=130   y=33    width=7     height=7     xoffset=0     yoffset=3     xadvance=7     page=0  chnl=15
+char id=175  x=130   y=41    width=4     height=1     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=176  x=66    y=43    width=4     height=4     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=177  x=138   y=33    width=7     height=7     xoffset=0     yoffset=4     xadvance=7     page=0  chnl=15
+char id=178  x=58    y=43    width=3     height=5     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=179  x=53    y=43    width=4     height=5     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=180  x=110   y=42    width=3     height=2     xoffset=3     yoffset=1     xadvance=7     page=0  chnl=15
+char id=181  x=43    y=12    width=6     height=10    xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=182  x=22    y=13    width=6     height=10    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=183  x=120   y=41    width=1     height=2     xoffset=3     yoffset=6     xadvance=7     page=0  chnl=15
+char id=184  x=114   y=41    width=3     height=2     xoffset=2     yoffset=11    xadvance=7     page=0  chnl=15
+char id=185  x=62    y=43    width=3     height=5     xoffset=2     yoffset=2     xadvance=7     page=0  chnl=15
+char id=186  x=239   y=33    width=4     height=7     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=187  x=27    y=45    width=6     height=5     xoffset=1     yoffset=5     xadvance=7     page=0  chnl=15
+char id=188  x=32    y=0     width=7     height=11    xoffset=0     yoffset=1     xadvance=7     page=0  chnl=15
+char id=189  x=160   y=0     width=6     height=11    xoffset=0     yoffset=1     xadvance=7     page=0  chnl=15
+char id=190  x=24    y=0     width=7     height=11    xoffset=0     yoffset=1     xadvance=7     page=0  chnl=15
+char id=191  x=58    y=33    width=5     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=192  x=104   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=193  x=97    y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=194  x=83    y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=195  x=146   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=196  x=118   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=197  x=181   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=198  x=49    y=23    width=7     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=199  x=76    y=0     width=6     height=11    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=200  x=111   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=201  x=69    y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=202  x=195   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=203  x=188   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=204  x=239   y=0     width=5     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=205  x=233   y=0     width=5     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=206  x=227   y=0     width=5     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=207  x=221   y=0     width=5     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=208  x=57    y=23    width=7     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=209  x=174   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=210  x=153   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=211  x=139   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=212  x=132   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=213  x=125   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=214  x=167   y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=215  x=47    y=43    width=5     height=5     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=216  x=0     y=26    width=8     height=9     xoffset=0     yoffset=2     xadvance=7     page=0  chnl=15
+char id=217  x=90    y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=218  x=62    y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=219  x=55    y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=220  x=48    y=0     width=6     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=221  x=40    y=0     width=7     height=11    xoffset=0     yoffset=0     xadvance=7     page=0  chnl=15
+char id=222  x=115   y=23    width=6     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=223  x=171   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=224  x=177   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=225  x=183   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=226  x=75    y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=227  x=189   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=228  x=52    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=229  x=215   y=0     width=5     height=11    xoffset=1     yoffset=0     xadvance=7     page=0  chnl=15
+char id=230  x=221   y=33    width=5     height=7     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=231  x=34    y=33    width=5     height=9     xoffset=1     yoffset=4     xadvance=7     page=0  chnl=15
+char id=232  x=147   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=233  x=201   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=234  x=207   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=235  x=64    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=236  x=213   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=237  x=219   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=238  x=225   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=239  x=46    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=240  x=231   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=241  x=237   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=242  x=243   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=243  x=69    y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=244  x=93    y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=245  x=153   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=246  x=100   y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=247  x=41    y=43    width=5     height=5     xoffset=1     yoffset=5     xadvance=7     page=0  chnl=15
+char id=248  x=154   y=33    width=6     height=7     xoffset=0     yoffset=4     xadvance=7     page=0  chnl=15
+char id=249  x=99    y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=250  x=105   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=251  x=117   y=12    width=5     height=10    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=252  x=82    y=33    width=5     height=9     xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15
+char id=253  x=6     y=0     width=5     height=13    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=254  x=0     y=0     width=5     height=13    xoffset=1     yoffset=1     xadvance=7     page=0  chnl=15
+char id=255  x=16    y=0     width=5     height=12    xoffset=1     yoffset=2     xadvance=7     page=0  chnl=15

File src/data/font.png

Added
New image

File src/data/texmap.png

Added
New image