PickManiplulationRenderer Not Working


Greetings,

Sorry to disturb your weekend. I cannot seem to get a PickManiplulationRenderer to allow direct manipulation of my FlatField, however, if I use a DirectManipulationRenderer it works fine.

Please see the attached code.  In the line:

   display.addReferences( pmr, dataRef );

if you change "pmr" to "dmr" the direct manipulation behaves normaly, but when using "pmr" it does not. I thought that since PickManiplulationRenderer extended DirectManipulationRenderer, that it should behave the same way. It this correct? Is there something wrong in my code?

Many thanks!!

-kevin.

import java.*;
import javax.swing.*;
import javax.swing.event.*;

import java.awt.*;
import java.awt.event.*;

import visad.*;
import java.rmi.RemoteException;
import visad.java3d.*;
import visad.bom.PickManipulationRendererJ3D;

public class coordTest extends JPanel implements ActionListener
{

  private DisplayImpl display;
  private RealType rad, lon;
  private RealTupleType radLon_tt, lonRad_tt;
  private ScalarMap radMap, lonMap;
  private DataReferenceImpl dataRef;
  private DirectManipulationRendererJ3D dmr;
  private PickManipulationRendererJ3D pmr;
  private double[] projMatrix;
  private JButton reset = new JButton("Reset");


  public coordTest() throws VisADException, RemoteException
  {

    reset.addActionListener(this);

    rad = RealType.Radius;
    lon = RealType.Longitude;

    radLon_tt = new RealTupleType(rad, lon);

    radMap = new ScalarMap(rad, Display.Radius);
    lonMap = new ScalarMap(lon, Display.Longitude);


    display = new DisplayImplJ3D( "TextDisplay", new TwoDDisplayRendererJ3D() );
    display.addMap(radMap);
    display.addMap(lonMap);
    radMap.setRange(0.0, 5.0);
    lonMap.setRange(0.0, 359.99);

    ProjectionControl initPC = display.getProjectionControl();
    projMatrix = initPC.getMatrix();
    GraphicsModeControl gmc = display.getGraphicsModeControl();
    gmc.setScaleEnable(true);

    dataRef = new DataReferenceImpl("dataRef");
    dmr = new DirectManipulationRendererJ3D();
    pmr = new PickManipulationRendererJ3D();
    display.addReferences( pmr, dataRef );


    final int size = 20;
    double[][] rad_pts = new double[1][size];
    double[][] lon_pts = new double[1][size];
    for (int i = 0; i < size; ++i)
    {
      rad_pts[0][i] = i * (5.0/size/2.0);
      lon_pts[0][i] = 0.0;;
    }

    Gridded1DDoubleSet rad_set = new Gridded1DDoubleSet(rad, rad_pts, size);
    FunctionType func = new FunctionType(rad, lon);
    final FlatField ff = new FlatField(func, rad_set);
    ff.setSamples(lon_pts);
    dataRef.setData(ff);

    CellImpl cell = new CellImpl()
    {
      public void doAction() throws RemoteException, VisADException
      {

//System.out.println(pmr.getCloseIndex());
System.out.println(dataRef.getData());
/*
        if ( dare.get_any_changed() )
        {
          double[][] newlons = new double[1][size];
          java.util.Arrays.fill(newlons[0], dr.getDirectAxisValue(lon));
          ff.setSamples(newlons);
          dataRef.setData(ff);
        }
*/
      }
    };
    cell.addReference(dataRef);

    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    setAlignmentY(JPanel.TOP_ALIGNMENT);
    setAlignmentX(JPanel.LEFT_ALIGNMENT);
    Component comp = display.getComponent();
    ((JComponent)comp).setPreferredSize( new Dimension(400,400) );


    add(comp);
    add(reset);

  }

  public void actionPerformed(ActionEvent e)
  { resetOrientation(); }


  /**
   * Resets the display projection to its original value.
   * Borrowed from VisAD SpreadSheet
   */
  public void resetOrientation() {
    if (display != null) {
      ProjectionControl pc = display.getProjectionControl();
      if (pc != null) {
        try {
          pc.setMatrix(projMatrix);
        }
        catch (VisADException exc) {
          System.out.println("Cannot reset orientation" + exc);
        }
        catch (RemoteException exc) {
          System.out.println("Cannot reset orientation" + exc);
        }
      }
    }
  }

  public static void main(String[] args) throws VisADException, RemoteException
  {
    JFrame frame = new JFrame("First VisAd Example");
    coordTest me = new coordTest();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(me);
    frame.pack();
    frame.setVisible(true);
  }


  }