mirror of
https://github.com/Dejvino/roadtrip
synced 2025-07-06 22:02:23 +00:00
111 lines
2.9 KiB
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();
|
|
}
|
|
}
|