How to drag and drop Quad?

hello bos…



how to do drag and drop on the quad?

I have a code like this. What should I do


import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

import com.jme.bounding.BoundingBox;
import com.jme.image.Texture;
import com.jme.input.MouseInput;
import com.jme.math.FastMath;
import com.jme.math.Quaternion;
import com.jme.math.Vector2f;
import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jme.renderer.Renderer;
import com.jme.scene.Node;
import com.jme.scene.Spatial;
import com.jme.scene.shape.Quad;
import com.jme.scene.state.AlphaState;
import com.jme.scene.state.TextureState;
import com.jme.system.DisplaySystem;
import com.jme.util.TextureManager;

public class ObjectSelectionManager {

private HashSet<ObjectPickListener> listeners = new HashSet<ObjectPickListener>();

/* Multiselection */
private int           mouseButton = 0;
private boolean       drag = false;
private Vector2f   mouseFirstDownPos;
private Vector2f   screenPos = null;
private ArrayList<Node>  selectableObjects;
private ArrayList<Node>  selection;

private String           displayTex = "textures/unitselection.png";
private DisplaySystem display;

/**
* @param mouseButton mousebutton for action
*/
public ObjectSelectionManager(int mouseButton) {
this.mouseButton = mouseButton;

selectableObjects = new ArrayList<Node>();
selection = new ArrayList<Node>();
display = DisplaySystem.getDisplaySystem();
}

private Spatial createSelectionPointer() {

Quad selectionIndikator = new Quad("ID_INDIKATOR_DISPLAY",1f,1f);
selectionIndikator.setRenderQueueMode(Renderer.QUEUE_TRANSPARENT);
selectionIndikator.setLocalTranslation(new Vector3f(0f,0f,0f));
selectionIndikator.lookAt(selectionIndikator.getWorldTranslation(), new Vector3f(0f,0f,1f) );
selectionIndikator.setLocalRotation(new Quaternion(new float[]{-FastMath.DEG_TO_RAD*90,0f,0f}));

TextureState ts = display.getRenderer().createTextureState();
ts.setTexture(TextureManager.loadTexture(getClass().getClassLoader()
.getResource(displayTex), Texture.MM_LINEAR,Texture.FM_LINEAR,0.0f, true));
ts.setEnabled(true);
selectionIndikator.setRenderState(ts);

AlphaState as = display.getRenderer().createAlphaState();
as.setBlendEnabled(true);
as.setSrcFunction(AlphaState.SB_SRC_ALPHA);
as.setDstFunction(AlphaState.DB_ONE_MINUS_SRC_ALPHA);
as.setTestEnabled(true);
as.setTestFunction(AlphaState.TF_GREATER);
selectionIndikator.setRenderState(as);

return selectionIndikator;
}

public void add(Node spatial) {

// add to selectable objects id posible
selectableObjects.add(spatial);
}

public void remove(Node spatial) {

Spatial i = spatial.getChild("ID_INDIKATOR_DISPLAY");
if(i!=null) {
spatial.detachChild(i);
} else {
System.out.println("ID not found");
}

// remove from selectable
selectableObjects.remove(spatial);

}

public ArrayList<Node> findInRange(Vector2f fromScreenPoint, Vector2f toScreenPoint) {

if(fromScreenPoint.equals(toScreenPoint)) {
fromScreenPoint.x += 50;
fromScreenPoint.y -= 50;
toScreenPoint.x   -= 50;
toScreenPoint.y   += 50;
       }

Camera cam = DisplaySystem.getDisplaySystem().getRenderer().getCamera();
ArrayList<Node> ret = new ArrayList<Node>();

Vector3f screenPos=new Vector3f(0,0,0);
float x,y,h;

float x1 = fromScreenPoint.x;
float y1 = fromScreenPoint.y;
float x2 = toScreenPoint.x;
float y2 = toScreenPoint.y;

/* check for any direction of range*/
if (x1 > x2) {
x2 = fromScreenPoint.x;
x1 = toScreenPoint.x;
}
if (y1 < y2) {
y2 = fromScreenPoint.y;
y1 = toScreenPoint.y;
}

for (Iterator<Node> iter = selectableObjects.iterator(); iter.hasNext();) {
Node s = iter.next();
x = s.getWorldTranslation().x;
y = s.getWorldTranslation().z;
h = s.getWorldTranslation().y;

cam.getScreenCoordinates(new Vector3f(x,h,y),screenPos);

if ((screenPos.x>x1)&&(screenPos.x<x2)&&(screenPos.y>y2)&&(screenPos.y<y1)) {
ret.add(s);
}
}

return ret;
}

public ArrayList<Node> getSelection() {
return selection;
}

public void clearSelection() {

for (Iterator<Node> iter = selection.iterator(); iter.hasNext();) {
removeIndikator(iter.next());
}

selection.clear();
}

public void removeIndikator(Node unit) {
Spatial i = unit.getChild("ID_INDIKATOR_DISPLAY");
if(i!=null) {
unit.detachChild(i);
}
}

private void setSelection(ArrayList<Node> selection) {

clearSelection();

float h = 1f;

for (Iterator<Node> iter = selection.iterator(); iter.hasNext();) {

h += 0.025f;
Node s = iter.next();
Spatial ss = createSelectionPointer();

ss.setLocalTranslation(new Vector3f(0f,h,0f));
ss.setLocalScale(new Vector3f(((BoundingBox)s.getWorldBound()).xExtent+3,((BoundingBox)s.getWorldBound()).xExtent+3,1f));
s.attachChild( ss );

s.updateRenderState();

}

this.selection = selection;
}

@SuppressWarnings("unchecked")
public void addListener(ObjectPickListener listener) {
this.listeners.add(listener);
}

public void removeListener(ObjectPickListener listener) {
this.listeners.remove(listener);
}

public void update(float tpf) {

/* left mouse button klicked */
if ( MouseInput.get().isButtonDown(this.mouseButton) ) {
screenPos = new Vector2f();
screenPos.set(MouseInput.get().getXAbsolute(), MouseInput.get().getYAbsolute());

/* hold mouse down start position */
if (!drag) {
mouseFirstDownPos = screenPos;
drag = true;
}

} else {
/* obmit the last dragposition and reset dragging */
if (drag) {
drag = false;
setSelection(findInRange(mouseFirstDownPos, screenPos));
fireRangeSelectEvent(mouseFirstDownPos, screenPos);
mouseFirstDownPos = null;
}

}

if(drag) {
fireRangeSelectEvent(mouseFirstDownPos, screenPos);
}

}

protected void fireRangeSelectEvent(Vector2f start, Vector2f end) {
for (Iterator<ObjectPickListener> iter = listeners.iterator(); iter.hasNext();) {
if(drag) {
iter.next().onSelect( new SelectionEvent(start, end, drag, null));
}else {
iter.next().onSelect( new SelectionEvent(start, end, drag, getSelection()));
}
}
}

}


thanks