Poi3DLayer: use GdxRenderer3D2, rearrange code (#584)

This commit is contained in:
Gustl22 2018-09-06 17:39:37 +02:00 committed by Emux
parent 131e1a183c
commit 33528a3e61
No known key found for this signature in database
GPG Key ID: 64ED9980896038C3

View File

@ -1,3 +1,19 @@
/*
* Copyright 2014 Hannes Janetzek
* Copyright 2018 Gustl22
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.test.gdx.poi3d; package org.oscim.test.gdx.poi3d;
import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.AssetManager;
@ -29,12 +45,15 @@ import org.slf4j.LoggerFactory;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map.Entry; import java.util.Map.Entry;
/**
* Experimental Layer to display POIs with 3D models.
*/
public class Poi3DLayer extends Layer implements Map.UpdateListener { public class Poi3DLayer extends Layer implements Map.UpdateListener {
static final Logger log = LoggerFactory.getLogger(Poi3DLayer.class); private static final Logger log = LoggerFactory.getLogger(Poi3DLayer.class);
static class Poi3DTileData extends TileData { static class Poi3DTileData extends TileData {
public final List<SymbolItem> symbols = new List<SymbolItem>(); public final List<SymbolItem> symbols = new List<>();
@Override @Override
protected void dispose() { protected void dispose() {
@ -42,21 +61,22 @@ public class Poi3DLayer extends Layer implements Map.UpdateListener {
} }
} }
final static String POI_DATA = Poi3DLayer.class.getSimpleName(); static final String POI_DATA = Poi3DLayer.class.getSimpleName();
final static Tag TREE_TAG = new Tag("natural", "tree"); static final Tag TREE_TAG = new Tag("natural", "tree");
private Poi3DTileData get(MapTile tile) { AssetManager assets;
Poi3DTileData ld = (Poi3DTileData) tile.getData(POI_DATA); GdxRenderer3D2 g3d;
if (ld == null) { boolean loading;
ld = new Poi3DTileData(); Model mModel;
tile.addData(POI_DATA, ld);
}
return ld;
}
GdxRenderer3D g3d;
VectorTileLayer mTileLayer; VectorTileLayer mTileLayer;
LinkedHashMap<Tile, Array<ModelInstance>> mTileMap = new LinkedHashMap<>();
TileSet mTileSet = new TileSet();
TileSet mPrevTiles = new TileSet();
private final String pathToTree;
public Poi3DLayer(Map map, VectorTileLayer tileLayer) { public Poi3DLayer(Map map, VectorTileLayer tileLayer) {
super(map); super(map);
tileLayer.addHook(new TileLoaderProcessHook() { tileLayer.addHook(new TileLoaderProcessHook() {
@ -83,7 +103,7 @@ public class Poi3DLayer extends Layer implements Map.UpdateListener {
}); });
mTileLayer = tileLayer; mTileLayer = tileLayer;
mRenderer = g3d = new GdxRenderer3D(mMap); mRenderer = g3d = new GdxRenderer3D2(mMap);
// Material mat = new // Material mat = new
// Material(ColorAttribute.createDiffuse(Color.BLUE)); // Material(ColorAttribute.createDiffuse(Color.BLUE));
@ -101,33 +121,40 @@ public class Poi3DLayer extends Layer implements Map.UpdateListener {
loading = true; loading = true;
} }
TileSet mTileSet = new TileSet();
TileSet mPrevTiles = new TileSet();
LinkedHashMap<Tile, Array<ModelInstance>> mTileMap =
new LinkedHashMap<>();
boolean loading;
Model mModel;
AssetManager assets;
private final String pathToTree;
private void doneLoading() { private void doneLoading() {
Model model = assets.get(pathToTree, Model.class); Model model = assets.get(pathToTree, Model.class);
for (int i = 0; i < model.nodes.size; i++) { for (int i = 0; i < model.nodes.size; i++) {
Node node = model.nodes.get(i); for (Node node : model.nodes) {
log.debug("loader node " + node.id);
if (node.id.equals("treeA_root")) { /* Use with {@link GdxRenderer3D} */
if (node.hasChildren() && ((Object) g3d) instanceof GdxRenderer3D) {
if (model.nodes.size != 1) {
throw new RuntimeException("Model has more than one node with GdxRenderer: " + model.toString());
}
node = node.getChild(0);
log.debug("loader node " + node.id);
model.nodes.removeIndex(0);
model.nodes.add(node);
}
node.rotation.setFromAxis(1, 0, 0, 90); node.rotation.setFromAxis(1, 0, 0, 90);
mModel = model;
} }
mModel = model;
} }
loading = false; loading = false;
} }
private Poi3DTileData get(MapTile tile) {
Poi3DTileData ld = (Poi3DTileData) tile.getData(POI_DATA);
if (ld == null) {
ld = new Poi3DTileData();
tile.addData(POI_DATA, ld);
}
return ld;
}
@Override @Override
public void onMapEvent(Event ev, MapPosition pos) { public void onMapEvent(Event ev, MapPosition pos) {