Skip to content

Commit

Permalink
feat: make better support for Tile object mesh.
Browse files Browse the repository at this point in the history
  • Loading branch information
闫茂源 committed Apr 17, 2024
1 parent 091c33b commit bef7082
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 133 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.jme3.asset.AssetKey;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector4f;
import com.jme3.renderer.queue.RenderQueue;
import com.jme3.scene.Geometry;
Expand Down Expand Up @@ -469,7 +470,7 @@ private void readAnimation(Tile tile, Node parent) {
public void createVisual(Tileset tileset, TiledMap map) {

Point offset = tileset.getTileOffset();
Point origin = new Point(0, map.getTileHeight());
Vector2f origin = new Vector2f(0, map.getTileHeight());

List<Tile> tiles = tileset.getTiles();
for (Tile tile : tiles) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ private int renderStaggerX(TileLayer layer, Point startTile) {

if (layer.isNeedUpdateAt(rowX, y)) {

Geometry visual = tile.getVisual().clone();
Geometry visual = copySprite(tile);

flip(visual, tile);

Expand Down Expand Up @@ -178,7 +178,7 @@ private int renderStaggerY(TileLayer layer, Point startTile) {

if (layer.isNeedUpdateAt(rowX, rowY)) {

Geometry visual = tile.getVisual().clone();
Geometry visual = copySprite(tile);

flip(visual, tile);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public Spatial render(TileLayer layer) {

private void updateTile(TileLayer layer, int x, int y, int z, Tile tile) {
if (layer.isNeedUpdateAt(x, y)) {
Geometry visual = tile.getVisual().clone();
Geometry visual = copySprite(tile);
visual.setQueueBucket(Bucket.Gui);

flip(visual, tile);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,10 @@ protected Spatial render(ImageLayer layer) {
*/
public abstract Point screenToTileCoords(float x, float y);

protected Geometry copySprite(Tile tile) {
return tile.getVisual().clone(false);
}

/**
* Flip the tile
*
Expand All @@ -319,18 +323,9 @@ protected void flip(Geometry visual, Tile tile) {
// no flip
return;
}
if (map.getOrientation() == Orientation.HEXAGONAL) {
// hexagonal tile can't be flipped
TileMesh mesh = (TileMesh) visual.getMesh();
TileMesh newMesh = new TileMesh(mesh, tile.isFlippedHorizontally(), tile.isFlippedVertically(),
tile.isFlippedAntiDiagonally(), tile.isRotatedHexagonal120());
visual.setMesh(newMesh);
} else {
TileMesh mesh = (TileMesh) visual.getMesh();
TileMesh newMesh = new TileMesh(mesh, tile.isFlippedHorizontally(), tile.isFlippedVertically(),
tile.isFlippedAntiDiagonally());
visual.setMesh(newMesh);
}
TileMesh mesh = (TileMesh) visual.getMesh();
TileMesh newMesh = new TileMesh(mesh.getCoord(), mesh.getSize(), mesh.getOffset(), mesh.getOrigin(), tile.getGid(), map.getOrientation());
visual.setMesh(newMesh);
}

private static final class CompareTopdown implements Comparator<MapObject> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Vector2f;
import com.jme3.renderer.queue.RenderQueue;
import com.jme3.scene.*;
import io.github.jmecn.tiled.animation.AnimatedTileControl;
import io.github.jmecn.tiled.core.*;
import io.github.jmecn.tiled.enums.FillMode;
import io.github.jmecn.tiled.enums.Orientation;
import io.github.jmecn.tiled.math2d.Point;
import io.github.jmecn.tiled.render.shape.*;
import io.github.jmecn.tiled.util.ObjectMesh;

Expand Down Expand Up @@ -212,81 +215,57 @@ private void image(MapObject obj) {
}

private void tile(MapObject obj) {
// The tile
Tile tile = obj.getTile();
Geometry geometry = new Geometry(obj.getName(), getTileMesh(obj));
geometry.setQueueBucket(RenderQueue.Bucket.Gui);

Geometry visual = tile.getVisual().clone();
visual.setName(obj.getName());
visual.setQueueBucket(RenderQueue.Bucket.Gui);
Tile tile = obj.getTile();
if (tile.getMaterial() != null) {
geometry.setMaterial(tile.getMaterial());
} else {
geometry.setMaterial(tile.getTileset().getMaterial());
}

float th = tile.getHeight();
float tw = tile.getWidth();
if (tile.isAnimated()) {
geometry.setBatchHint(Spatial.BatchHint.Never);
AnimatedTileControl control = new AnimatedTileControl(tile);
geometry.addControl(control);
}

// When the object has a gid set, then it is represented by
// the image of the tile with that global ID. The image
// alignment currently depends on the map orientation.
obj.setVisual(geometry);
}

// In orthogonal, it's aligned to the bottom-left
float[] vertices = new float[]{
0, 0, -th,
tw, 0, -th,
tw, 0, 0,
0, 0, 0};
private TileMesh getTileMesh(MapObject obj) {
Tile tile = obj.getTile();
float tw = tile.getWidth();

// In isometric, it's aligned to the bottom-center.
if (map.getOrientation() == Orientation.ISOMETRIC) {
for (int i = 0; i < vertices.length; i += 3) {
vertices[i] -= tw * 0.5f;
Point coord = new Point(tile.getX(), tile.getY());
Point size = new Point(tile.getWidth(), tile.getHeight());
Point offset;
if (tile.getTileset() != null) {
Tileset tileset = tile.getTileset();
offset = tileset.getTileOffset();
// scale the tile
if (tileset.getFillMode() == FillMode.STRETCH) {
size.set((int) obj.getWidth(), (int) obj.getHeight());
}
} else {
offset = new Point(0, 0);
}

Mesh mesh = visual.getMesh();
mesh.setBuffer(VertexBuffer.Type.Position, 3, vertices);

flip(visual, obj.getTile());

// scale the tile
if (tile.getTileset().getFillMode() == FillMode.STRETCH) {
visual.setLocalScale((float) obj.getWidth() / tile.getWidth(), 1, (float) obj.getHeight() / tile.getHeight());
Vector2f origin = new Vector2f(0, 0);// In orthogonal, it's aligned to the bottom-left
if (map.getOrientation() == Orientation.ISOMETRIC) {
origin.set(-tw * 0.5f, 0);// In isometric, it's aligned to the bottom-center.
}

obj.setVisual(visual);
// When the object has a gid set, then it is represented by
// the image of the tile with that global ID. The image
// alignment currently depends on the map orientation.
return new TileMesh(coord, size, offset, origin, tile.getGid(), map.getOrientation());
}

private void text(MapObject obj) {
// TODO render text
ObjectText objectText = obj.getTextData();
}


/**
* Flip the tile
*
* @param visual The spatial for this tile.
* @param tile The image of this tile.
*/
protected void flip(Spatial visual, Tile tile) {
if (tile.isFlippedHorizontally()) {
visual.rotate(0, 0, FastMath.PI);
visual.move(tile.getWidth(), 0, 0);
}

if (tile.isFlippedVertically()) {
visual.rotate(FastMath.PI, 0, 0);
visual.move(0, 0, tile.getHeight());
}

/*
* <pre>
* [ *]
* [ * ]
* [ * ]
* [* ]
* </pre>
*/
if (tile.isFlippedAntiDiagonally()) {
// TODO flip diagonally
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public Spatial render(TileLayer layer) {
}

if (layer.isNeedUpdateAt(x, y)) {
Geometry visual = tile.getVisual().clone();
Geometry visual = copySprite(tile);
flip(visual, tile);
Vector2f pixelCoord = tileToScreenCoords(x, y);
visual.move(pixelCoord.x, tileZIndex, pixelCoord.y);
Expand Down
Loading

0 comments on commit bef7082

Please sign in to comment.