add TilePrefab
This commit is contained in:
parent
9ba2a0a142
commit
a1f3a737b8
|
@ -65,6 +65,15 @@ public final class Tile {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Tile set(Tile other) {
|
||||||
|
this.tile = other.tile;
|
||||||
|
this.flags = other.flags;
|
||||||
|
this.tileLight = other.tileLight;
|
||||||
|
this.skyLight = other.skyLight;
|
||||||
|
this.color = other.color;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Tile setCustomColor(final Color color) {
|
public Tile setCustomColor(final Color color) {
|
||||||
return setCustomColor(color.toIntBits());
|
return setCustomColor(color.toIntBits());
|
||||||
}
|
}
|
||||||
|
|
204
src/com/blarg/gdx/tilemap3d/prefabs/TilePrefab.java
Normal file
204
src/com/blarg/gdx/tilemap3d/prefabs/TilePrefab.java
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
package com.blarg.gdx.tilemap3d.prefabs;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.math.Vector3;
|
||||||
|
import com.badlogic.gdx.math.collision.BoundingBox;
|
||||||
|
import com.blarg.gdx.tilemap3d.Tile;
|
||||||
|
import com.blarg.gdx.tilemap3d.TileContainer;
|
||||||
|
|
||||||
|
public class TilePrefab {
|
||||||
|
public enum Rotation {
|
||||||
|
ROT0(0),
|
||||||
|
ROT90(90),
|
||||||
|
ROT180(180),
|
||||||
|
ROT270(270);
|
||||||
|
|
||||||
|
int value;
|
||||||
|
|
||||||
|
private Rotation(int value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int value() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Tile[] data;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int depth;
|
||||||
|
final BoundingBox bounds = new BoundingBox();
|
||||||
|
final BoundingBox tmpBounds = new BoundingBox();
|
||||||
|
|
||||||
|
Rotation rotation;
|
||||||
|
int rotationWidth;
|
||||||
|
int rotationDepth;
|
||||||
|
int rotationXOffset;
|
||||||
|
int rotationZOffset;
|
||||||
|
int rotationXMultiplier;
|
||||||
|
int rotationZMultiplier;
|
||||||
|
int rotationXPreMultiplier;
|
||||||
|
int rotationZPreMultiplier;
|
||||||
|
final BoundingBox rotationBounds = new BoundingBox();
|
||||||
|
final BoundingBox tmpRotationBounds = new BoundingBox();
|
||||||
|
|
||||||
|
public int getWidth() {
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getHeight() {
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDepth() {
|
||||||
|
return depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundingBox getBounds() {
|
||||||
|
tmpBounds.set(bounds);
|
||||||
|
return tmpBounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Rotation getRotation() {
|
||||||
|
return rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRotationAngle() {
|
||||||
|
return rotation.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRotatedWidth() {
|
||||||
|
return rotationWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRotatedDepth() {
|
||||||
|
return rotationDepth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BoundingBox getRotatedBounds() {
|
||||||
|
tmpRotationBounds.set(rotationBounds);
|
||||||
|
return tmpRotationBounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TilePrefab(int width, int height, int depth) {
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
this.depth = depth;
|
||||||
|
|
||||||
|
bounds.min.set(Vector3.Zero);
|
||||||
|
bounds.max.set(width, height, depth);
|
||||||
|
|
||||||
|
int numTiles = width * height * depth;
|
||||||
|
data = new Tile[numTiles];
|
||||||
|
for (int i = 0; i < numTiles; ++i)
|
||||||
|
data[i] = new Tile();
|
||||||
|
|
||||||
|
rotate(Rotation.ROT0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tile get(int x, int y, int z) {
|
||||||
|
int index = getIndexOf(x, y, z);
|
||||||
|
return data[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rotate(Rotation rotation) {
|
||||||
|
this.rotation = rotation;
|
||||||
|
|
||||||
|
switch (rotation)
|
||||||
|
{
|
||||||
|
case ROT0:
|
||||||
|
rotationWidth = width;
|
||||||
|
rotationDepth = depth;
|
||||||
|
rotationXOffset = 0;
|
||||||
|
rotationZOffset = 0;
|
||||||
|
rotationXMultiplier = 1;
|
||||||
|
rotationZMultiplier = rotationWidth;
|
||||||
|
rotationXPreMultiplier = 1;
|
||||||
|
rotationZPreMultiplier = 1;
|
||||||
|
rotationBounds.min.set(Vector3.Zero);
|
||||||
|
rotationBounds.max.set(rotationWidth, height, rotationDepth);
|
||||||
|
break;
|
||||||
|
case ROT90:
|
||||||
|
rotationWidth = depth;
|
||||||
|
rotationDepth = width;
|
||||||
|
rotationXOffset = rotationWidth - 1;
|
||||||
|
rotationZOffset = 0;
|
||||||
|
rotationXMultiplier = rotationDepth;
|
||||||
|
rotationZMultiplier = 1;
|
||||||
|
rotationXPreMultiplier = -1;
|
||||||
|
rotationZPreMultiplier = 1;
|
||||||
|
rotationBounds.min.set(Vector3.Zero);
|
||||||
|
rotationBounds.max.set(rotationWidth, height, rotationDepth);
|
||||||
|
break;
|
||||||
|
case ROT180:
|
||||||
|
rotationWidth = width;
|
||||||
|
rotationDepth = depth;
|
||||||
|
rotationXOffset = rotationWidth - 1;
|
||||||
|
rotationZOffset = rotationDepth - 1;
|
||||||
|
rotationXMultiplier = 1;
|
||||||
|
rotationZMultiplier = rotationWidth;
|
||||||
|
rotationXPreMultiplier = -1;
|
||||||
|
rotationZPreMultiplier = -1;
|
||||||
|
rotationBounds.min.set(Vector3.Zero);
|
||||||
|
rotationBounds.max.set(rotationWidth, height, rotationDepth);
|
||||||
|
break;
|
||||||
|
case ROT270:
|
||||||
|
rotationWidth = depth;
|
||||||
|
rotationDepth = width;
|
||||||
|
rotationXOffset = 0;
|
||||||
|
rotationZOffset = rotationDepth - 1;
|
||||||
|
rotationXMultiplier = rotationDepth;
|
||||||
|
rotationZMultiplier = 1;
|
||||||
|
rotationXPreMultiplier = 1;
|
||||||
|
rotationZPreMultiplier = -1;
|
||||||
|
rotationBounds.min.set(Vector3.Zero);
|
||||||
|
rotationBounds.max.set(rotationWidth, height, rotationDepth);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tile getWithRotation(int x, int y, int z) {
|
||||||
|
int index = getIndexOfWithRotation(x, y, z);
|
||||||
|
return data[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void placeIn(TileContainer destination, int minX, int minY, int minZ, Rotation rotation, boolean copyEmptyTiles) {
|
||||||
|
if (destination == null)
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
|
||||||
|
if (!this.rotation.equals(rotation))
|
||||||
|
rotate(rotation);
|
||||||
|
if (!((minX + rotationWidth) < destination.getWidth()))
|
||||||
|
throw new RuntimeException("Destination not large enough.");
|
||||||
|
if (!((minY + height) < destination.getHeight()))
|
||||||
|
throw new RuntimeException("Destination not large enough.");
|
||||||
|
if (!((minZ + rotationDepth) < destination.getDepth()))
|
||||||
|
throw new RuntimeException("Destination not large enough.");
|
||||||
|
|
||||||
|
for (int y = 0; y < height; ++y)
|
||||||
|
{
|
||||||
|
for (int z = 0; z < rotationDepth; ++z)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < rotationWidth; ++x)
|
||||||
|
{
|
||||||
|
Tile sourceTile = getWithRotation(x, y, z);
|
||||||
|
if (!copyEmptyTiles && sourceTile.isEmptySpace())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Tile destTile = destination.get(minX + x, minY + y, minZ + z);
|
||||||
|
destTile.set(sourceTile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getIndexOf(int x, int y, int z) {
|
||||||
|
return (y * width * depth) + (z * width) + x;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getIndexOfWithRotation(int x, int y, int z) {
|
||||||
|
return (y * rotationWidth * rotationDepth)
|
||||||
|
+ ((rotationZPreMultiplier * z + rotationZOffset) * rotationZMultiplier)
|
||||||
|
+ ((rotationXPreMultiplier * x + rotationXOffset) * rotationXMultiplier);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue