Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

111 Zeilen
2.9 KiB

  1. package roadtrip.view;
  2. import java.util.ArrayList;
  3. import com.jme3.bounding.BoundingVolume;
  4. import com.jme3.math.Vector3f;
  5. import com.jme3.renderer.Camera;
  6. import com.jme3.renderer.RenderManager;
  7. import com.jme3.renderer.ViewPort;
  8. import com.jme3.scene.Node;
  9. import com.jme3.scene.Spatial;
  10. import com.jme3.scene.control.AbstractControl;
  11. import com.jme3.scene.control.Control;
  12. public class HideControl extends AbstractControl
  13. {
  14. private final float distanceToHide;
  15. private ArrayList<Spatial> children;
  16. private boolean hidden;
  17. private BoundingVolume prevBv;
  18. private TargetProvider targetProvider;
  19. public HideControl(float distanceToHide) {
  20. this(distanceToHide, null);
  21. }
  22. public HideControl(float distanceToHide, TargetProvider targetProvider) {
  23. this.distanceToHide = distanceToHide;
  24. this.targetProvider = targetProvider;
  25. }
  26. public void setTargetProvider(TargetProvider targetProvider)
  27. {
  28. this.targetProvider = targetProvider;
  29. }
  30. @Override
  31. public Control cloneForSpatial(Spatial spatial)
  32. {
  33. // TODO
  34. return null;
  35. }
  36. @Override
  37. protected void controlRender(RenderManager rm, ViewPort vp)
  38. {
  39. if (targetProvider == null) {
  40. final Camera cam = vp.getCamera();
  41. targetProvider = new TargetProvider() {
  42. @Override
  43. public Vector3f getTarget() {
  44. return cam.getLocation();
  45. }
  46. };
  47. }
  48. /*BoundingVolume bv = spatial.getWorldBound();
  49. if (bv == null) {
  50. bv = prevBv;
  51. } else {
  52. prevBv = bv;
  53. }
  54. float distance = bv.distanceTo(targetProvider.getTarget());*/
  55. float distance = spatial.getWorldTranslation().distance(targetProvider.getTarget());
  56. if (distance > distanceToHide) {
  57. if (!hidden) {
  58. for (int i = 0; i < children.size(); i++) {
  59. children.get(i).removeFromParent();
  60. }
  61. spatial.updateGeometricState();
  62. hidden = true;
  63. }
  64. } else {
  65. if (hidden) {
  66. for (int i = 0; i < children.size(); i++) {
  67. ((Node) spatial).attachChild(children.get(i));
  68. }
  69. }
  70. spatial.updateGeometricState();
  71. hidden = false;
  72. }
  73. }
  74. @Override
  75. protected void controlUpdate(float tpf)
  76. {
  77. }
  78. @Override
  79. public void setSpatial(Spatial spatial)
  80. {
  81. if (!(spatial instanceof Node)) {
  82. throw new IllegalArgumentException("only Node type is supported");
  83. }
  84. super.setSpatial(spatial);
  85. children = new ArrayList<>(((Node) spatial).getChildren());
  86. }
  87. public interface TargetProvider
  88. {
  89. Vector3f getTarget();
  90. }
  91. }