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