You can see "Method1"..., "Method4", inside comments. You need to uncomment the code under each one of these methods to test them. I have also added my comments to indicate the failures in each case.
Can you tell me why it is not working and also how to make it work - that is: to be able to drag red point when I drag cyan point.
Code: Select all
import java.awt.Color;
import java.awt.Font;
import BASIC_TOOLS.ConsolePrinter;
import de.jreality.geometry.CoordinateSystemFactory;
import de.jreality.geometry.IndexedFaceSetFactory;
import de.jreality.geometry.IndexedLineSetFactory;
import de.jreality.geometry.PointSetFactory;
import de.jreality.geometry.Primitives;
import de.jreality.geometry.TubeFactory;
import de.jreality.math.MatrixBuilder;
import de.jreality.plugin.JRViewer;
import de.jreality.scene.Appearance;
import de.jreality.scene.Geometry;
import de.jreality.scene.IndexedFaceSet;
import de.jreality.scene.IndexedLineSet;
import de.jreality.scene.PointSet;
import de.jreality.scene.SceneGraphComponent;
import de.jreality.scene.data.Attribute;
import de.jreality.scene.data.StorageModel;
import de.jreality.shader.DefaultGeometryShader;
import de.jreality.shader.DefaultLineShader;
import de.jreality.shader.DefaultPointShader;
import de.jreality.shader.DefaultPolygonShader;
import de.jreality.shader.RenderingHintsShader;
import de.jreality.shader.ShaderUtility;
import de.jreality.tools.DragEventTool;
import de.jreality.tools.PointDragEvent;
import de.jreality.tools.PointDragListener;
import de.jreality.util.SceneGraphUtility;
public class DragSceneGraphTool {
private SceneGraphComponent sceneGraph;
private SceneGraphComponent cubeOfPoints;
private double d = 20.0;
private SceneGraphComponent sphere;
private SceneGraphComponent sphere2;
private PointSetFactory psf;
private PointSetFactory psf2;
/**
* @param args
*/
public static void main(String[] args) {
DragSceneGraphTool tool = new DragSceneGraphTool();
}
public DragSceneGraphTool(){
sceneGraph = setUpSceneGraph(new double[]{0.0, 0.0, 0.0});
setUpCoordinateSystem(sceneGraph);
setUpTool();
JRViewer.display(sceneGraph);
}
public SceneGraphComponent setUpSceneGraph(double[] loc){
cubeOfPoints = setUpCubeOfPoints();
sphere = setUpTwoPoints(loc);
//backgroundSGC = setUpBackground();
cubeOfPoints.addChild(sphere);
//mobileBall.addChild(backgroundSGC);
return cubeOfPoints;
//return mobileBall;
}
public SceneGraphComponent setUpCubeOfPoints(){
SceneGraphComponent sgc = SceneGraphUtility.createFullSceneGraphComponent("Cube of Points");
PointSetFactory psf = new PointSetFactory();
double [][] vertices = new double[][] {
{-d, -d, d}, {d, -d, d}, {d, d, d}, {-d, d, d},
{-d, -d, -d}, {d, -d, -d}, {d, d, -d}, {-d, d, -d}
};
psf.setVertexCount( vertices.length );
psf.setVertexCoordinates( vertices );
psf.update();
sgc.setGeometry(psf.getPointSet());
Appearance ap = sgc.getAppearance();
DefaultGeometryShader dgs = ShaderUtility.createDefaultGeometryShader(ap, true);
dgs.setShowFaces(false);
dgs.setShowLines(false);
dgs.setShowPoints(true);
DefaultPointShader dpts = (DefaultPointShader) dgs.createPointShader("default");
dpts.setDiffuseColor(Color.BLUE);
dpts.setPointRadius(0.5);
sgc.setAppearance(ap);
return sgc;
}
public void setUpSinglePoint(SceneGraphComponent sgc, double x, double y, double z, Color color, int index){
double [][] vertices = new double[][] {
{x, y, z}
};
if (index == 1){
psf = new PointSetFactory();
psf.setVertexCount( vertices.length );
psf.setVertexCoordinates( vertices );
psf.update();
sgc.setGeometry(psf.getPointSet());
}
if (index == 2){
psf2 = new PointSetFactory();
psf2.setVertexCount( vertices.length );
psf2.setVertexCoordinates( vertices );
psf2.update();
sgc.setGeometry(psf2.getPointSet());
}
Appearance ap = sgc.getAppearance();
DefaultGeometryShader dgs = ShaderUtility.createDefaultGeometryShader(ap, true);
dgs.setShowFaces(false);
dgs.setShowLines(false);
dgs.setShowPoints(true);
DefaultPointShader dpts = (DefaultPointShader) dgs.createPointShader("default");
dpts.setDiffuseColor(color);
dpts.setPointRadius(1.0);
sgc.setAppearance(ap);
}
public SceneGraphComponent setUpTwoPoints(double[] location){
sphere = SceneGraphUtility.createFullSceneGraphComponent("SinglePoint");
setUpSinglePoint(sphere, location[0], location[1], location[2], Color.CYAN, 1);
sphere2 = SceneGraphUtility.createFullSceneGraphComponent("2ndSinglePoint");
setUpSinglePoint(sphere2, location[0]+10.0, location[1] +10.0, location[2] +10.0, Color.RED, 2);
sphere.addChild(sphere2);
MatrixBuilder.euclidean().translate(d, d, d).assignTo(sphere);
return sphere;
}
public void setUpTool() {
System.out.println("Entered setUpTool >>>>");
DragEventTool t = new DragEventTool();
t.addPointDragListener(new PointDragListener() {
public void pointDragStart(PointDragEvent e) {
System.out.println("Entered pointDragStart >>>>");
}
public void pointDragged(PointDragEvent e) {
System.out.println("Entered pointDragged >>>>");
//Method1: Not working, both points do not event move
double[] location = e.getPosition();
sceneGraph = setUpSceneGraph(location);
System.out.println("Location: [" + location[0] + ", " + location[1] + ", " + location[2] + "");
//Method2: Adding a point wrongly shows that array out of bound
//psf.setVertexCoordinates(e.getPosition());
//psf.update();
//Method3: Both points can be move, but indepedently
/* PointSet pointSet = e.getPointSet();
double[][] points=new double[pointSet.getNumPoints()][];
pointSet.getVertexAttributes(Attribute.COORDINATES).toDoubleArrayArray(points);
points[e.getIndex()]=e.getPosition();
pointSet.setVertexAttributes(Attribute.COORDINATES,StorageModel.DOUBLE_ARRAY.array(3).createReadOnly(points));*/
//Method4: Points do not move
/* double[] location = e.getPosition();
System.out.println("Location: [" + location[0] + ", " + location[1] + ", " + location[2] + "");
sphere.getGeometry().getAttributes(Geometry.CATEGORY_VERTEX, Attribute.COORDINATES).toDoubleArray(location);*/
}
public void pointDragEnd(PointDragEvent e) {
System.out.println("Entered pointDragEnd >>>>");
}
});
sceneGraph.addTool(t);
}
public void setUpCoordinateSystem(SceneGraphComponent component) {
// create coordinate system
double axisScale = 5.0;
final CoordinateSystemFactory coords = new CoordinateSystemFactory(
component, axisScale);
// SET PROPERTIES:
Font font = new Font("TimesRoman", Font.PLAIN, 40);
coords.setAxisScale(axisScale);
coords.setLabelScale(0.015);
// coords.showBox(true);
// coords.showBoxArrows(true);
coords.showAxesArrows(true);
coords.showLabels(true);
// coords.setColor(Color.RED);
// coords.setGridColor(Color.GRAY);
coords.setLabelColor(Color.BLACK);
coords.setLabelFont(font);
coords.setColor(Color.BLUE);
// display axes/box/grid
coords.showAxes(true);
// coords.showBox(true);
coords.showGrid(true);
// beautify box
//coords.beautify(true);
}
public int[][] createEdgeIndices(double[][] points) {
int[][] edges = new int[points.length - 1][2];
for (int i = 0; i < points.length - 1; i++) {
edges[i][0] = i;
edges[i][1] = i + 1;
}
return edges;
}
}
Karuna