{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreig434ijbi6ogc4ax4kj3dg76mxgelfns43w75btc7ytlnyxq3qkdy",
"uri": "at://did:plc:dxjzgxe7cvirxkwfjr2tjspt/app.bsky.feed.post/3mlckokx3qkg2"
},
"path": "/t/jme-3-10-0-alpha4/49585#post_7",
"publishedAt": "2026-05-07T23:49:08.000Z",
"site": "https://hub.jmonkeyengine.org",
"tags": [
"https://drive.google.com/drive/folders/1mnwaMuswKaG4m853MOhAhKX7jg30mcsW?usp=sharing",
"@Override"
],
"textContent": "https://drive.google.com/drive/folders/1mnwaMuswKaG4m853MOhAhKX7jg30mcsW?usp=sharing\n\nThis is a main, where every frame I update get x y z of player and show tiles if needed.\nWhen I need new tiles, I will assign the correct image to the tile.\n\nThe images I use are 16 grey scale, so have only one channel.\n\n\n package com.worldgame;\n\n import Terrain.TileManager;\n import Terrain.TileMeshBuilder;\n import Terrain.location.Position3D;\n import Terrain.utils.Tile;\n import Terrain.utils.TileID;\n import com.config.AppSettingsConfig;\n import com.jme3.app.SimpleApplication;\n import com.jme3.material.Material;\n import com.jme3.material.RenderState;\n import com.jme3.math.ColorRGBA;\n import com.jme3.math.Vector3f;\n import com.jme3.scene.Geometry;\n import com.jme3.scene.Mesh;\n import com.jme3.system.AppSettings;\n import com.jme3.texture.Texture;\n\n import java.util.HashMap;\n import java.util.Set;\n\n public class WorldGame extends SimpleApplication {\n private TileManager terrainDataManager;\n private final HashMap<TileID, Geometry> renderedTiles = new HashMap<>();\n private final HashMap<String, Texture> textureCache = new HashMap<>();\n public static void main(String\n args) {\n WorldGame app = new WorldGame();\n AppSettings settings = AppSettingsConfig.getInstance().getSettings();\n app.setSettings(settings);\n app.start();\n }\n\n @Override\n public void simpleInitApp() {assetManager.registerLocator(\n \"C:\\\\software\\\\eclipse_workspace\\\\WorldGame\\\\src\\\\main\\\\resources\\\\heightData\",\n com.jme3.asset.plugins.FileLocator.class\n );\n\n cam.setLocation(new Vector3f(0, 1f, 0f));\n Vector3f playerPos = cam.getLocation();\n cam.lookAt(new Vector3f(0f, 0f, 0f), Vector3f.UNIT_Y);\n cam.setFrustumPerspective(90f, (float) cam.getWidth() / cam.getHeight(), 0.00001f, 1000f);\n float[] earthCenter = new float[]{0f, 0f, 0f};\n viewPort.setBackgroundColor(ColorRGBA.White); // Purple/indigo nyan color\n terrainDataManager = new TileManager(\n new Position3D(playerPos.x, playerPos.y, playerPos.z),\n new Position3D(earthCenter[0], earthCenter[1], earthCenter[2])\n );\n Set<Tile> tiles = terrainDataManager.getTilesToRender();\n for (Tile t : tiles) {\n addTile(t);\n }\n flyCam.setMoveSpeed(0.01f);\n\n System.out.println(\"=== Scene Tree ===\");\n printSceneTree(rootNode, 0);\n }\n\n @Override\n public void simpleUpdate(float tpf) {\n Vector3f playerPos = cam.getLocation();\n boolean playerChangedTile = terrainDataManager.setPlayerTile(\n new Position3D(playerPos.x, playerPos.y, playerPos.z));\n // First frame: same tile as constructor → setPlayerTile false; still need to attach meshes.\n if (playerChangedTile) {\n Set<Tile> tiles = terrainDataManager.getTilesToRender();\n\n for (Tile t : tiles) {\n if (!renderedTiles.containsKey(t.getTileId())) {\n addTile(t);\n }\n }\n\n renderedTiles.entrySet().removeIf(entry -> {\n boolean stillVisible = tiles.stream().anyMatch(t -> t.getTileId() == entry.getKey());\n if (!stillVisible) {\n entry.getValue().removeFromParent();\n }\n return !stillVisible;\n });\n }\n }\n\n private void addTile(Tile t) {\n Mesh m = TileMeshBuilder.getInstance().buildMeshFromTile(t.getBuffer());\n Geometry g = new Geometry(\"tile_\" + t.hashCode(), m);\n\n Material mat = new Material(assetManager, \"Common/MatDefs/Misc/Unshaded.j3md\");\n TileID id = t.getTileId();\n Texture tex = getTexture(id);\n mat.setTexture(\"ColorMap\", tex);\n mat.getAdditionalRenderState().setWireframe(false);\n mat.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off);\n g.setMaterial(mat);\n\n rootNode.attachChild(g);\n renderedTiles.put(t.getTileId(), g);\n }\n\n private void printSceneTree(com.jme3.scene.Spatial node, int depth) {\n String indent = \" \".repeat(depth);\n System.out.println(indent + node.getName() + \" (\" + node.getClass().getSimpleName() + \")\");\n if (node instanceof com.jme3.scene.Node n) {\n for (com.jme3.scene.Spatial child : n.getChildren()) {\n printSceneTree(child, depth + 1);\n }\n }\n }private Texture getTexture(TileID id) {\n String path = id.face() + \"/\" + id.row() + \"_\" + id.col() + \".png\";\n return textureCache.computeIfAbsent(path, p -> assetManager.loadTexture(p));\n }\n }\n",
"title": "jME 3.10.0-alpha4"
}