1
0
mirror of https://github.com/Dejvino/roadtrip synced 2025-07-06 22:02:23 +00:00
roadtrip/src/roadtrip/view/HideControl.java

111 lines
2.9 KiB
Java

package roadtrip.view;
import java.util.ArrayList;
import com.jme3.bounding.BoundingVolume;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.AbstractControl;
import com.jme3.scene.control.Control;
public class HideControl extends AbstractControl
{
private final float distanceToHide;
private ArrayList<Spatial> children;
private boolean hidden;
private BoundingVolume prevBv;
private TargetProvider targetProvider;
public HideControl(float distanceToHide) {
this(distanceToHide, null);
}
public HideControl(float distanceToHide, TargetProvider targetProvider) {
this.distanceToHide = distanceToHide;
this.targetProvider = targetProvider;
}
public void setTargetProvider(TargetProvider targetProvider)
{
this.targetProvider = targetProvider;
}
@Override
public Control cloneForSpatial(Spatial spatial)
{
// TODO
return null;
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp)
{
if (targetProvider == null) {
final Camera cam = vp.getCamera();
targetProvider = new TargetProvider() {
@Override
public Vector3f getTarget() {
return cam.getLocation();
}
};
}
/*BoundingVolume bv = spatial.getWorldBound();
if (bv == null) {
bv = prevBv;
} else {
prevBv = bv;
}
float distance = bv.distanceTo(targetProvider.getTarget());*/
float distance = spatial.getWorldTranslation().distance(targetProvider.getTarget());
if (distance > distanceToHide) {
if (!hidden) {
for (int i = 0; i < children.size(); i++) {
children.get(i).removeFromParent();
}
spatial.updateGeometricState();
hidden = true;
}
} else {
if (hidden) {
for (int i = 0; i < children.size(); i++) {
((Node) spatial).attachChild(children.get(i));
}
}
spatial.updateGeometricState();
hidden = false;
}
}
@Override
protected void controlUpdate(float tpf)
{
}
@Override
public void setSpatial(Spatial spatial)
{
if (!(spatial instanceof Node)) {
throw new IllegalArgumentException("only Node type is supported");
}
super.setSpatial(spatial);
children = new ArrayList<>(((Node) spatial).getChildren());
}
public interface TargetProvider
{
Vector3f getTarget();
}
}