/*
Copyright 2006 by Sean Luke and George Mason University
Licensed under the Academic Free License version 3.0
See the file "LICENSE" for more information
*/
package sim.portrayal3d.continuous;
import javax.vecmath.*;
import sim.portrayal.*;
import sim.portrayal3d.*;
import sim.util.*;
import sim.field.continuous.*;
import sim.portrayal3d.inspector.*;
import sim.portrayal.inspector.*;
import com.sun.j3d.utils.picking.*;
/**
* Portrays both Continuous2D and Continuous3D fields.
* 2D fields are spread through the XY plane and are presumed to have Z=0.
*
* @author Gabriel Balan
*/
public class ContinuousPortrayal3D extends SparseFieldPortrayal3D
{
/**
* @see sim.portrayal.SparseFieldPortrayal3D#getLocationOfObjectAsVector3d(Object)
*/
public Vector3d getLocationOfObjectAsVector3d(Object obj, Vector3d putInHere)
{
if (field instanceof Continuous2D)
{
Double2D locationD2d = ((Continuous2D)field).getObjectLocation(obj);
putInHere.x = locationD2d.x;
putInHere.y = locationD2d.y;
putInHere.z = 0;
}
else
{
Double3D locationD3d = ((Continuous3D)field).getObjectLocation(obj);
putInHere.x = locationD3d.x;
putInHere.y = locationD3d.y;
putInHere.z = locationD3d.z;
}
return putInHere;
}
public void setField(Object field)
{
dirtyField = true;
if (field instanceof Continuous3D || field instanceof Continuous2D) this.field = field;
else throw new RuntimeException("Invalid field for ContinuousPortrayal3D3D: " + field);
}
public LocationWrapper completedWrapper(LocationWrapper w, PickIntersection pi, PickResult pr)
{
final Object field = getField();
StableLocation d = null;
if (field instanceof Continuous2D) { d = new StableDouble2D((Continuous2D) field, w.getObject()); }
else { d = new StableDouble3D((Continuous3D) field, w.getObject()); }
final StableLocation loc = d;
return new LocationWrapper( w.getObject(), null, this) // don't care about location
{
public Object getLocation()
{
/*
if(field instanceof Continuous3D)
return ((Continuous3D)field).getObjectLocation(object);
else
return ((Continuous2D)field).getObjectLocation(object);
*/
loc.update();
return loc;
}
public String getLocationName()
{
/*
if(field instanceof Continuous3D)
{
Double3D loc = ((Continuous3D)field).getObjectLocation(object);
if (loc!=null) return loc.toCoordinates();
}
else
{
Double2D loc = ((Continuous2D)field).getObjectLocation(object);
if (loc!=null) return loc.toCoordinates();
}
return null;
*/
loc.update();
return loc.toString();
}
};
}
}