From 4dd2724b4738c66c51296348d5379a7dbcc031fa Mon Sep 17 00:00:00 2001 From: gered Date: Wed, 17 Jul 2013 22:48:23 -0400 Subject: [PATCH] add initial support for initializing TileMeshCollection from a json config --- .../tilemesh/TileMeshCollection.java | 120 +++++++++++++++++- 1 file changed, 116 insertions(+), 4 deletions(-) diff --git a/src/com/blarg/gdx/tilemap3d/tilemesh/TileMeshCollection.java b/src/com/blarg/gdx/tilemap3d/tilemesh/TileMeshCollection.java index c132886..607fe42 100644 --- a/src/com/blarg/gdx/tilemap3d/tilemesh/TileMeshCollection.java +++ b/src/com/blarg/gdx/tilemap3d/tilemesh/TileMeshCollection.java @@ -1,23 +1,33 @@ package com.blarg.gdx.tilemap3d.tilemesh; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.assets.loaders.ModelLoader; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g3d.Model; +import com.badlogic.gdx.graphics.g3d.loader.G3dModelLoader; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import com.badlogic.gdx.utils.JsonReader; import com.blarg.gdx.Bitfield; import com.blarg.gdx.graphics.TextureAtlas; import com.blarg.gdx.tilemap3d.Tile; -import com.blarg.gdx.tilemap3d.tilemesh.CubeTileMesh; -import com.blarg.gdx.tilemap3d.tilemesh.MaterialTileMapping; -import com.blarg.gdx.tilemap3d.tilemesh.ModelTileMesh; -import com.blarg.gdx.tilemap3d.tilemesh.TileMesh; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; + +import java.util.HashMap; +import java.util.Map; public class TileMeshCollection { public final TextureAtlas atlas; Array meshes; public TileMeshCollection(TextureAtlas atlas) { + this(atlas, null); + } + + public TileMeshCollection(TextureAtlas atlas, FileHandle configFile) { if (atlas == null) throw new IllegalArgumentException(); @@ -27,6 +37,13 @@ public class TileMeshCollection { // the first mesh (index = 0) should always be a null one as this has special meaning // in other TileMap-related objects (basically, representing empty space) addMesh(null); + + if (configFile != null) { + JsonTileMeshCollection config; + Json json = new Json(); + config = json.fromJson(JsonTileMeshCollection.class, configFile); + setupFromConfig(config); + } } private int addMesh(TileMesh mesh) { @@ -108,4 +125,99 @@ public class TileMeshCollection { public TileMesh get(int index) { return meshes.items[index]; } + + private void setupFromConfig(JsonTileMeshCollection config) { + if (config.tiles == null) + throw new RuntimeException("Missing tiles section."); + + MaterialTileMapping materialMapping = null; + if (config.materials != null) { + materialMapping = new MaterialTileMapping(); + for (int i = 0; i < config.materials.size(); ++i) { + JsonMaterialMapping mapping = config.materials.get(i); + materialMapping.add( + mapping.name, atlas.get(mapping.tile), + mapping.minU, mapping.maxU, mapping.minV, mapping.maxV + ); + } + } + + Map models = new HashMap(); + ModelLoader loader = new G3dModelLoader(new JsonReader()); + + for (int i = 0; i < config.tiles.size(); ++i) { + JsonTileDefinition tileDef = config.tiles.get(i); + + if (tileDef.model != null && materialMapping == null) + throw new RuntimeException("Missing materials section but using models to define tiles."); + if (tileDef.collisionModel != null && tileDef.collisionShape != null) + throw new RuntimeException("collisionModel and collisionShape cannot both be set."); + + Model model; + Model collisionModel; + byte opaqueSides = 0; + byte lightValue; + boolean alpha; + float translucency; + Color color = new Color(Color.WHITE); + Vector3 scaleToSize = new Vector3(1.0f, 1.0f, 1.0f); + Vector3 positionOffset = new Vector3(0.0f, 0.0f, 0.0f); + Vector3 collisionPositionOffset = new Vector3(0.0f, 0.0f, 0.0f); + + + model = models.get(tileDef.model); + if (model == null) { + model = loader.loadModel(Gdx.files.internal(tileDef.model)); + models.put(tileDef.model, model); + } + + collisionModel = model; // default is to use the same model + + if (tileDef.collisionModel != null) { + //override with a specific collision model + collisionModel = models.get(tileDef.collisionModel); + if (collisionModel == null) { + collisionModel = loader.loadModel(Gdx.files.internal(tileDef.collisionModel)); + models.put(tileDef.collisionModel, collisionModel); + } + } + if (tileDef.collisionShape != null) { + collisionModel = null; // using a shape instead! + throw new NotImplementedException(); + } + + if (tileDef.opaqueSides != null) { + if (tileDef.opaqueSides.contains("ALL")) + opaqueSides = TileMesh.SIDE_ALL; + else { + if (tileDef.opaqueSides.contains("TOP")) + opaqueSides = Bitfield.set(TileMesh.SIDE_TOP, opaqueSides); + if (tileDef.opaqueSides.contains("BOTTOM")) + opaqueSides = Bitfield.set(TileMesh.SIDE_BOTTOM, opaqueSides); + if (tileDef.opaqueSides.contains("FRONT")) + opaqueSides = Bitfield.set(TileMesh.SIDE_FRONT, opaqueSides); + if (tileDef.opaqueSides.contains("BACK")) + opaqueSides = Bitfield.set(TileMesh.SIDE_BACK, opaqueSides); + if (tileDef.opaqueSides.contains("LEFT")) + opaqueSides = Bitfield.set(TileMesh.SIDE_LEFT, opaqueSides); + if (tileDef.opaqueSides.contains("RIGHT")) + opaqueSides = Bitfield.set(TileMesh.SIDE_RIGHT, opaqueSides); + } + } + + lightValue = (byte)tileDef.light; + alpha = tileDef.alpha; + translucency = tileDef.translucency; + if (tileDef.color != null) + color.set(tileDef.color); + if (tileDef.scaleToSize != null) + scaleToSize.set(tileDef.scaleToSize); + if (tileDef.positionOffset != null) + positionOffset.set(tileDef.positionOffset); + if (tileDef.collisionPositionOffset != null) + collisionPositionOffset.set(tileDef.collisionPositionOffset); + + add(model, collisionModel, materialMapping, opaqueSides, lightValue, alpha, translucency, color, scaleToSize, positionOffset, collisionPositionOffset); + } + } }