BowlerKernel
manipulation.java
Go to the documentation of this file.
1 package com.neuronrobotics.bowlerkernel.Bezier3d;
2 
3 import java.util.ArrayList;
4 import javafx.scene.paint.Color;
5 import java.util.HashMap;
6 
7 import com.neuronrobotics.bowlerstudio.physics.TransformFactory;
8 import com.neuronrobotics.sdk.addons.kinematics.math.*;
9 
10 import eu.mihosoft.vrl.v3d.CSG;
11 import eu.mihosoft.vrl.v3d.Vector3d;
12 import javafx.event.EventHandler;
13 import javafx.event.EventType;
14 import javafx.scene.input.MouseEvent;
15 import javafx.scene.paint.Color;
16 import javafx.scene.transform.Affine;
17 import javafx.scene.paint.PhongMaterial;
18 
19 public class manipulation {
20  HashMap<EventType<MouseEvent>, EventHandler<MouseEvent>> map = new HashMap<>();
21  double startx = 0;
22  double starty = 0;
23  double newx = 0;
24  double newy = 0;
25  double newz = 0;
26  TransformNR camFrame = null;
27  boolean dragging = false;
28  double depth = 0;
30  };
31 
32  private ArrayList<Runnable> eventListeners = new ArrayList<>();
33  private ArrayList<Runnable> saveListeners = new ArrayList<>();
34  private ArrayList<manipulation> dependants = new ArrayList<>();
35  private Affine manipulationMatrix;
37  private CSG manip;
40  private PhongMaterial color;// = new PhongMaterial(getColor());
41  private PhongMaterial highlight = new PhongMaterial(Color.GOLD);
42 
43  private enum DragState {
44  IDLE, Dragging
45  }
46 
48 
49  public void addEventListener(Runnable r) {
50  if (eventListeners.contains(r))
51  return;
52  eventListeners.add(r);
53  }
54 
55  public void addDependant(manipulation r) {
56  if (dependants.contains(r))
57  return;
58  dependants.add(r);
59  }
60 
61  public void addSaveListener(Runnable r) {
62  if (saveListeners.contains(r))
63  return;
64  saveListeners.add(r);
65  }
66 
67  public void clearListeners() {
68  // TODO Auto-generated method stub
69  saveListeners.clear();
70  eventListeners.clear();
71  }
72 
73  private void fireMove(TransformNR trans, TransformNR camFrame2) {
74  for (manipulation R : dependants) {
75  R.performMove(trans, camFrame2);
76  }
77  for (Runnable R : eventListeners) {
78  R.run();
79  }
80  }
81 
82  private void fireSave() {
83  new Thread(() -> {
84  for (Runnable R : saveListeners) {
85  R.run();
86  }
87  }).start();
88  }
89 
90  public manipulation(Affine mm, Vector3d o, CSG m, TransformNR p) {
91  this.manipulationMatrix = mm;
92  this.orintation = o;
93  this.manip = m;
94  color = new PhongMaterial(m.getColor());
95  this.globalPose = p;
96  currentPose = p.copy();
97  getUi().runLater(() -> {
98  try {
100  } catch (Throwable t) {
101  t.printStackTrace();
102  }
103  });
104 
105  map.put(MouseEvent.ANY, new EventHandler<MouseEvent>() {
106  @Override
107  public void handle(MouseEvent event) {
108  String name = event.getEventType().getName();
109  switch (name) {
110  case "MOUSE_PRESSED":
111  pressed(event);
112  break;
113  case "MOUSE_DRAGGED":
114  dragged(event);
115  break;
116  case "MOUSE_RELEASED":
117  release(event);
118  break;
119  case "MOUSE_MOVED":
120  // ignore
121  break;
122  case "MOUSE_ENTERED":
123  m.getMesh().setMaterial(highlight);
124  break;
125  case "MOUSE_EXITED":
126  if (state == DragState.IDLE)
127  m.getMesh().setMaterial(color);
128  break;
129  default:
130  // System.out.println("UNKNOWN! Mouse event "+name);
131  break;
132  }
133 
134  }
135  });
136  manip.getStorage().set("manipulator", map);
138  }
139 
140  private void pressed(MouseEvent event) {
141  state = DragState.Dragging;
142  new Thread(() -> {
143  camFrame = getUi().getCamerFrame();
144  depth = -1600 / getUi().getCamerDepth();
145  event.consume();
146  dragging = false;
147  for (manipulation R : dependants) {
148  R.camFrame = getUi().getCamerFrame();
149  R.depth = -1600 / getUi().getCamerDepth();
150  R.dragging = false;
151  }
152  }).start();
153  }
154 
155  private void release(MouseEvent event) {
156  mouseRelease(event);
157  for (manipulation R : dependants)
158  R.mouseRelease(event);
159  state = DragState.IDLE;
160  manip.getMesh().setMaterial(color);
161  }
162 
163  private void dragged(MouseEvent event) {
164  getUi().runLater(() -> {
165  setDragging(event);
166  double deltx = (startx - event.getScreenX());
167  double delty = (starty - event.getScreenY());
168  TransformNR trans = new TransformNR(deltx / depth, delty / depth, 0, new RotationNR());
169 
170  performMove(trans, camFrame);
171  });
172  event.consume();
173  }
174 
175  public boolean isMoving() {
176  return state == DragState.Dragging;
177  }
178 
179  private void mouseRelease(MouseEvent event) {
180  if (dragging) {
181  dragging = false;
182  globalPose.setX(newx);
183  globalPose.setY(newy);
184  globalPose.setZ(newz);
185  event.consume();
186  fireSave();
187  }
188  }
189 
190  private void setDragging(MouseEvent event) {
191  if (dragging == false) {
192  startx = event.getScreenX();
193  starty = event.getScreenY();
194  }
195  dragging = true;
196  for (manipulation R : dependants) {
197  R.setDragging(event);
198  }
199  }
200 
201  private void performMove(TransformNR trans, TransformNR camFrame2) {
202  TransformNR globalTMP = camFrame2.copy();
203  globalTMP.setX(0);
204  globalTMP.setY(0);
205  globalTMP.setZ(0);
206  TransformNR global = globalTMP.times(trans);
207  newx = (global.getX() * orintation.x + globalPose.getX());
208  newy = (global.getY() * orintation.y + globalPose.getY());
209  newz = (global.getZ() * orintation.z + globalPose.getZ());
210  global.setX(newx);
211  global.setY(newy);
212  global.setZ(newz);
213 
214  global.setRotation(new RotationNR());
215  setGlobal(global);
216  // System.out.println(" drag "+global.getX()+" , "+global.getY()+" ,
217  // "+global.getZ()+" "+deltx+" "+delty);
218  fireMove(trans, camFrame2);
219  }
220 
221  private void setGlobal(TransformNR global) {
222  currentPose.setX(newx);
223  currentPose.setY(newy);
224  currentPose.setZ(newz);
225  getUi().runLater(() -> {
226  TransformFactory.nrToAffine(global, manipulationMatrix);
227  });
228  }
229 
231  return ui;
232  }
233 
234  public static void setUi(IInteractiveUIElementProvider ui) {
235  manipulation.ui = ui;
236  }
237 
238  public void set(double newX, double newY, double newZ) {
239  newx = newX;
240  newy = newY;
241  newz = newZ;
242  globalPose.setX(newX);
243  globalPose.setY(newY);
244  globalPose.setZ(newZ);
245  setGlobal(new TransformNR(newX, newY, newZ, new RotationNR()));
246  for (Runnable R : eventListeners) {
247  R.run();
248  }
249 
250  }
251 
252 }
manipulation(Affine mm, Vector3d o, CSG m, TransformNR p)
void performMove(TransformNR trans, TransformNR camFrame2)
static void setUi(IInteractiveUIElementProvider ui)
void fireMove(TransformNR trans, TransformNR camFrame2)
static IInteractiveUIElementProvider ui
static IInteractiveUIElementProvider getUi()
MeshView getMesh()
Definition: CSG.java:252
CSG setManipulator(Affine manipulator)
Definition: CSG.java:235
PropertyStorage getStorage()
Definition: CSG.java:2459
void set(String key, Object property)
static Vector3d y(double y)
Definition: Vector3d.java:484
static Vector3d z(double z)
Definition: Vector3d.java:494
static Vector3d x(double x)
Definition: Vector3d.java:474