{
  "$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"
}