/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.pepsoft.worldpainter.objects;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.vecmath.Point3i;
import org.pepsoft.minecraft.Entity;
import org.pepsoft.minecraft.Material;
import org.pepsoft.minecraft.TileEntity;
/**
*
* @author pepijn
*/
public class SkewedObject extends AbstractObject {
public SkewedObject(WPObject object, float xSkew, float ySkew) {
this.object = object;
this.xSkew = xSkew;
this.ySkew = ySkew;
objectDimensions = object.getDimensions();
dx = (int) (objectDimensions.z * xSkew);
dy = (int) (objectDimensions.z * ySkew);
// System.out.println("xSkew: " + xSkew + ", ySkew: " + ySkew + ", dx: " + dx + ", dy: " + dy);
dimensions = new Point3i(objectDimensions.x + dx, objectDimensions.y + dy, objectDimensions.z);
// Point3i orig = object.getOrigin();
// int originX = orig.x + (int) (orig.z * xSkew);
// if (dx < 0) {
// originX -= dx;
// }
// int originY = orig.y + (int) (orig.z * ySkew);
// if (dy < 0) {
// originY -= dy;
// }
// origin = new Point3i(originX, originY, orig.z);
attributes = (object.getAttributes() != null) ? new HashMap<>(object.getAttributes()) : new HashMap<>();
// TODO: skew offset
}
@Override
public Point3i getDimensions() {
return dimensions;
}
@Override
public Material getMaterial(int x, int y, int z) {
Point3i coords = translate(x, y, z);
return object.getMaterial(coords.x, coords.y, coords.z);
}
@Override
public boolean getMask(int x, int y, int z) {
Point3i coords = translate(x, y, z);
if ((coords.x < 0) || (coords.x >= objectDimensions.x) || (coords.y < 0) || (coords.y >= objectDimensions.y)) {
// Outside original object's bounding box
return false;
} else {
return object.getMask(coords.x, coords.y, coords.z);
}
}
@Override
public List<Entity> getEntities() {
throw new UnsupportedOperationException();
}
@Override
public List<TileEntity> getTileEntities() {
throw new UnsupportedOperationException();
}
@Override
public String getName() {
return object.getName();
}
@Override
public void setName(String name) {
throw new UnsupportedOperationException("Not supported");
}
@Override
public Map<String, Serializable> getAttributes() {
return attributes;
}
@Override
public void setAttributes(Map<String, Serializable> attributes) {
throw new UnsupportedOperationException("Not supported");
}
@Override
public <T extends Serializable> void setAttribute(AttributeKey<T> key, T value) {
throw new UnsupportedOperationException("Not supported");
}
private Point3i translate(int x, int y, int z) {
return new Point3i(
x - (int) (z * xSkew) + ((dx < 0) ? dx : 0),
y - (int) (z * ySkew) + ((dy < 0) ? dy : 0),
z);
}
private final WPObject object;
private final int dx, dy;
private final Point3i objectDimensions, dimensions;
private final float xSkew, ySkew;
private final Map<String, Serializable> attributes;
private static final long serialVersionUID = 1L;
}