package clientdata.visitors.terrain.layers;
import org.apache.mina.core.buffer.IoBuffer;
public class BoundaryCircle extends BoundaryLayer {
float x, z, rad;
private float radiusSquared;
public BoundaryCircle() {
type = LayerType.BCIR;
}
@Override
public boolean isContained(float px, float pz) {
return (Math.pow(px-x, 2) + Math.pow(pz-z, 2)) < Math.pow(rad, 2);
}
@Override
public float process(float px, float pz) {
//float dist = (float) (Math.pow(px-x, 2) + Math.pow(pz-z, 2));
//float r2 = (float) Math.pow(rad, 2);
float v3 = x - px;
float v4 = z - pz;
float dist = v4 * v4 + v3 * v3;
if( dist <= radiusSquared) {
float fCircle = (float) Math.pow((1.0 - feather_amount) * rad, 2);
if(dist > fCircle) {
return 1.0f - (dist-fCircle) / (radiusSquared-fCircle);
} else {
return 1.0f;
}
} else {
return 0.0f;
}
}
@Override
public void loadData(IoBuffer buffer) {
x = buffer.getFloat();
z = buffer.getFloat();
rad = buffer.getFloat();
radiusSquared = rad * rad;
feather_type = buffer.getInt();
feather_amount = buffer.getFloat();
if (feather_amount < 0)
feather_amount = 0;
else if (feather_amount > 1)
feather_amount = 1;
}
@Override
public float getMinX() {
return x - rad;
}
@Override
public float getMinZ() {
return z - rad;
}
@Override
public float getMaxX() {
return x + rad;
}
@Override
public float getMaxZ() {
return z + rad;
}
}