{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreih6qdooziy55tcrrz6zwq2sh47f5n3rlvcwiftxisqwqga437rvqa",
    "uri": "at://did:plc:dxjzgxe7cvirxkwfjr2tjspt/app.bsky.feed.post/3mlu7xvr3igj2"
  },
  "path": "/t/problem-between-tiles/49591#post_1",
  "publishedAt": "2026-05-15T00:42:23.000Z",
  "site": "https://hub.jmonkeyengine.org",
  "textContent": "Hello,\n\nin my game I generate tiles and put those side by side. In the following picture is possible to see that there is a small section between those tiles. I would like to see some sugestions to resolve this problem.\n\n\n    package Terrain.buffer_utils.writers.position;\n\n    import Terrain.buffer_utils.HeightMapReader;\n    import Terrain.buffer_utils.MeshBuffer;\n    import Terrain.location.GeoEnum;\n    import Terrain.location.Position3D;\n    import Terrain.utils.Tile;\n    import Terrain.utils.TileID;\n    import com.config.WorldConfig;\n    import jdk.incubator.vector.*;\n\n    import java.lang.foreign.MemorySegment;\n    import java.lang.foreign.ValueLayout;\n    import java.nio.ByteOrder;\n\n    import static com.config.WorldConfig.TILE_PIXELS;\n\n    public class PositionWriter {\n\n        static final float PLANET_RADIUS = 6371000f;\n        static final float STEP = (WorldConfig.TILE_LENGTH / (TILE_PIXELS - 1));\n        static final VectorSpecies<Float> FLOAT_VECTOR_SPECIES = FloatVector.SPECIES_PREFERRED;\n        static final VectorSpecies<Integer> INT_SPECIES = IntVector.SPECIES_PREFERRED;\n        static final VectorSpecies<Short> SHORT_SPECIES = ShortVector.SPECIES_PREFERRED;\n\n\n        static final int TILE_PIXELS_BOUND_SHORT = SHORT_SPECIES.loopBound(WorldConfig.TILE_PIXELS);\n        static final int F_LENGTH = FLOAT_VECTOR_SPECIES.length();\n        static final int I_LENGTH = INT_SPECIES.length();\n        static final int S_LENGTH = SHORT_SPECIES.length();\n        static final int SHORT_VECTOR_LOOP_BOUND = TILE_PIXELS_BOUND_SHORT - S_LENGTH;\n        static final int INT_TO_FLOAT_GROUP_RATIO = INT_SPECIES.length() / F_LENGTH;\n        static final int SHORT_TO_INT_GROUP_RATIO = S_LENGTH / INT_SPECIES.length();\n        static final int TAIL_START_J = TILE_PIXELS_BOUND_SHORT;\n        static final int TAIL_LENGTH = TILE_PIXELS - TAIL_START_J;\n        static final FloatVector INDEX = FloatVector.fromArray(FLOAT_VECTOR_SPECIES, createIndex(), 0).mul(STEP);\n        static final float HEIGHT_SCALE = 3200.0f / (256f * 256f);\n        static final FloatVector ONE = FloatVector.broadcast(FLOAT_VECTOR_SPECIES, 1f);\n        static final float NORMALIZED_HEIGHT_SCALE = HEIGHT_SCALE / PLANET_RADIUS;\n        static final FloatVector NORMALIZED_HEIGHT_SCALE_VECTOR = FloatVector.broadcast(FLOAT_VECTOR_SPECIES, NORMALIZED_HEIGHT_SCALE);\n        static final float RADIUS_NORMALIZED_OFFSET = -200f / PLANET_RADIUS + 1f;\n        static final FloatVector RADIUS_NORMALIZED_OFFSET_VECTOR = FloatVector.broadcast(FLOAT_VECTOR_SPECIES, RADIUS_NORMALIZED_OFFSET);\n        private static final float[] meshData = new float[TILE_PIXELS * TILE_PIXELS * 3];\n        static final short[] shortArray = new short[TAIL_LENGTH];\n        static final float[] tmp = new float[F_LENGTH * 3];\n        private static final ValueLayout.OfShort OF_SHORT = ValueLayout.JAVA_SHORT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN);\n\n        private static float[] createIndex() {\n            float[] a = new float[F_LENGTH];\n            for (int i = 0; i < F_LENGTH; i++)\n                a[i] = i;\n            return a;\n        }\n\n        public static void writePositions(Tile tile) {\n            TileID tileId = tile.getTileId();\n            GeoEnum face = tileId.face();\n            MeshBuffer buffer = tile.getBuffer();\n            MemorySegment heightMap = HeightMapReader.getInstance().getMapData(tileId);\n            CubePlane plane = switch (face) {\n                case TOP, BOTTOM -> CubePlane.HORIZONTAL;\n                case FRONT, BACK -> CubePlane.FRONTAL;\n                case LEFT, RIGHT -> CubePlane.PERFIL;\n            };\n            writePlane(tile.start(), heightMap, plane);\n            buffer.setPositionData(meshData);\n        }\n\n        static void writePlane(Position3D start, MemorySegment heightMap, CubePlane layout) {\n            float f = layout.fixedBase(start);\n            float rowBase = layout.rowBase(start);\n            float colBase = layout.colBase(start);\n            FloatVector fixedVec = FloatVector.broadcast(FLOAT_VECTOR_SPECIES, f);\n            FloatVector rowVec = FloatVector.broadcast(FLOAT_VECTOR_SPECIES, rowBase);\n            int offset = 0;\n            for (int i = 0; i < TILE_PIXELS; i++, rowVec = rowVec.add(STEP)) {\n                FloatVector colVec = INDEX.add(colBase);\n                for (int j = 0; j <= SHORT_VECTOR_LOOP_BOUND; j += S_LENGTH) {\n                    ShortVector heightVec = ShortVector.fromMemorySegment(SHORT_SPECIES, heightMap, ((long) i * TILE_PIXELS + j) * Short.BYTES, ByteOrder.LITTLE_ENDIAN);\n                    for (int k = 0; k < SHORT_TO_INT_GROUP_RATIO; k++) {\n                        IntVector unsigned = (IntVector) heightVec.convertShape(VectorOperators.S2I, INT_SPECIES, k).lanewise(VectorOperators.AND, 0xFFFF);\n                        for (int h = 0; h < INT_TO_FLOAT_GROUP_RATIO; h++, colVec = colVec.add(STEP * F_LENGTH)) {\n                            FloatVector fv = (FloatVector) unsigned.convertShape(VectorOperators.I2F, FLOAT_VECTOR_SPECIES, h);\n                            FloatVector heightVecNormalized = fv.fma(NORMALIZED_HEIGHT_SCALE_VECTOR, RADIUS_NORMALIZED_OFFSET_VECTOR);\n                            FloatVector xVec = layout.wx(fixedVec, rowVec, colVec);\n                            FloatVector yVec = layout.wy(fixedVec, rowVec, colVec);\n                            FloatVector zVec = layout.wz(fixedVec, rowVec, colVec);\n                            FloatVector len = xVec.fma(xVec, yVec.fma(yVec, zVec.mul(zVec)));\n                            FloatVector invLen = ONE.div(len.sqrt()).mul(heightVecNormalized);\n                            FloatVector nx = xVec.mul(invLen);\n                            FloatVector ny = yVec.mul(invLen);\n                            FloatVector nz = zVec.mul(invLen);\n                            nx.intoArray(tmp, 0);\n                            ny.intoArray(tmp, F_LENGTH);\n                            nz.intoArray(tmp, F_LENGTH * 2);\n                            for (int lane = 0; lane < F_LENGTH; lane++) {\n                                meshData[offset++] = tmp[lane];\n                                meshData[offset++] = tmp[lane + F_LENGTH];\n                                meshData[offset++] = tmp[lane + F_LENGTH * 2];\n                            }\n                        }\n                    }\n                }\n                long tailOffsetBytes = ((long) i * TILE_PIXELS + TAIL_START_J) * Short.BYTES;\n                MemorySegment.copy(heightMap, ValueLayout.JAVA_SHORT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN), tailOffsetBytes, shortArray, 0, TAIL_LENGTH);\n                float r = rowBase + STEP * i;\n                for (int s = TAIL_START_J; s < TILE_PIXELS; s++) {\n                    float c = colBase + STEP * s;\n                    float len = (float) Math.sqrt(Math.fma(c, c, Math.fma(r, r, f * f)));\n                    int u = Short.toUnsignedInt(shortArray[s - TAIL_START_J]);\n                    float height =Math.fma(u, NORMALIZED_HEIGHT_SCALE, RADIUS_NORMALIZED_OFFSET);\n                    float inv = height / len;\n                    float wx = layout.sx(f, r, c);\n                    float wy = layout.sy(f, r, c);\n                    float wz = layout.sz(f, r, c);\n                    meshData[offset++] = (wx * inv);\n                    meshData[offset++] = (wy * inv);\n                    meshData[offset++] = (wz * inv);\n                }\n            }\n        }\n\n    }\n\n\nThanks.",
  "title": "Problem between tiles"
}