Class Shape3DInt

java.lang.Object
All Implemented Interfaces:
java.awt.datatransfer.Transferable, java.lang.Comparable<InterfaceShape>, AttributeListener, AttributeObject, InterfaceObject, PersistentObject, VariableObject, PopupMenuObject, NamedObject, InterfaceQueryObject, InterfaceShapeQueryObject, VertexDataColumnListener, InterfaceTransferable, TreeObject, CleanableObject, XMLObject, IconObject, org.jogamp.java3d.GeometryUpdater
Direct Known Subclasses:
Box3DInt, Plane3DInt, PointSet3DInt, Polygon3DInt, PolygonSet3DInt, Rect3DInt, SectionSet3DInt, ShapeSet3DInt, Vector3DInt, VectorSet3DInt, Volume3DInt, X3DScene3DInt

public abstract class Shape3DInt
extends InterfaceShape
implements org.jogamp.java3d.GeometryUpdater
Base class for all Shape3D interface objects. Provides default implementations of a number of methods, which should typically be overridden or utilized by subclasses, including:
  • obtaining Java3D scene nodes representing the shape
  • obtaining Shape2DInt objects representing the projection or intersection of this 3D shape, and maintaining a link with this object to update and/or query it when necessary with a particular plane, and particular projection limits
  • obtaining a Shape3DTreeNode for insertion into a JTree
  • setting and accessing vertex-wise data
  • linking to a DataSource with vertex-wise index data
  • obtaining an XML encoding of this shape and its attributes
  • obtaining an InterfacePopupMenu and handling its events
Since:
1.0
Version:
1.0
Author:
Andrew Reid
  • Field Details

    • shape3d

      public Shape3D shape3d
    • drawEngine2D

      public DrawingEngine drawEngine2D
    • idStr

      public java.lang.String idStr
    • children2D

      protected java.util.ArrayList<Shape2DInt> children2D
    • parent2D

      protected Shape2DInt parent2D
    • nodeListener

      protected ShapeListener nodeListener
    • hasCameraListener

      protected boolean hasCameraListener
    • boundBox

      public Box3D boundBox
    • boundSphere

      public Sphere3D boundSphere
    • centerPt

      public org.jogamp.vecmath.Point3f centerPt
    • scene3DObject

      protected org.jogamp.java3d.BranchGroup scene3DObject
    • sceneNode

      protected ShapeSceneNode sceneNode
    • boundBoxNode

      public org.jogamp.java3d.BranchGroup boundBoxNode
    • bounds_shape

      protected org.jogamp.java3d.Shape3D bounds_shape
    • group_node

      protected org.jogamp.java3d.BranchGroup group_node
    • bounds_group

      protected org.jogamp.java3d.BranchGroup bounds_group
    • shape_group

      protected org.jogamp.java3d.BranchGroup shape_group
    • vertices_group

      protected org.jogamp.java3d.BranchGroup vertices_group
    • selected_vertices_group

      protected org.jogamp.java3d.BranchGroup selected_vertices_group
    • has_3d_node

      protected boolean has_3d_node
    • vertex_shape_transformer

      protected Shape3DInt.VertexShapeTransformer vertex_shape_transformer
    • creatable_scene_node

      protected boolean creatable_scene_node
  • Constructor Details

    • Shape3DInt

      public Shape3DInt()
  • Method Details

    • getGeometryInstance

      public Shape getGeometryInstance()
      Description copied from class: InterfaceShape
      Returns an instance of this InterfaceShape's geometry class.
      Specified by:
      getGeometryInstance in class InterfaceShape
      Returns:
    • init

      protected void init()
    • getParentAttribute

      protected Attribute<?> getParentAttribute​(java.lang.String attrName)
      Specified by:
      getParentAttribute in class InterfaceShape
    • isHeritableAttribute

      public boolean isHeritableAttribute​(java.lang.String name)
      Description copied from class: InterfaceShape
      Is this parent attribute inherited by a child shape?
      Specified by:
      isHeritableAttribute in class InterfaceShape
      Returns:
    • isInheritingAttribute

      public boolean isInheritingAttribute​(Attribute<?> attribute)
      Description copied from class: InterfaceShape
      Does this child attribute inherit values from a parent shape?
      Specified by:
      isInheritingAttribute in class InterfaceShape
      Returns:
    • getLabelFont

      public java.awt.Font getLabelFont()
      Specified by:
      getLabelFont in class InterfaceShape
    • setLabelFont

      public void setLabelFont​(java.awt.Font font)
      Specified by:
      setLabelFont in class InterfaceShape
    • getLabelScale

      public float getLabelScale()
      Specified by:
      getLabelScale in class InterfaceShape
    • setLabelScale

      public void setLabelScale​(float scale)
      Specified by:
      setLabelScale in class InterfaceShape
    • getLabelColour

      public java.awt.Color getLabelColour()
      Specified by:
      getLabelColour in class InterfaceShape
    • setLabelColour

      public void setLabelColour​(java.awt.Color colour)
      Specified by:
      setLabelColour in class InterfaceShape
    • hasAlpha

      public boolean hasAlpha()
      Description copied from class: InterfaceShape
      Queries whether this shape has transparency.
      Specified by:
      hasAlpha in class InterfaceShape
      Returns:
    • hasAlpha

      public void hasAlpha​(boolean b)
      Description copied from class: InterfaceShape
      Specifies whether this shape has transparency.
      Specified by:
      hasAlpha in class InterfaceShape
    • getAlpha

      public float getAlpha()
      Description copied from class: InterfaceShape
      Gets the current transparency level for this shape.
      Specified by:
      getAlpha in class InterfaceShape
      Returns:
    • setAlpha

      public void setAlpha​(float f)
      Description copied from class: InterfaceShape
      Sets the current transparency level for this shape.
      Specified by:
      setAlpha in class InterfaceShape
    • showVertices

      public boolean showVertices()
      Description copied from class: InterfaceShape
      Queries whether the vertices of this shape are visible.
      Specified by:
      showVertices in class InterfaceShape
      Returns:
    • showVertices

      public void showVertices​(boolean b)
      Description copied from class: InterfaceShape
      Specifies whether the vertices of this shape are visible.
      Specified by:
      showVertices in class InterfaceShape
    • getVertexScale

      public float getVertexScale()
      Description copied from class: InterfaceShape
      Returns the scale of this shape's vertices
      Specified by:
      getVertexScale in class InterfaceShape
      Returns:
    • getVertexScale

      public float getVertexScale​(int i)
      Returns the scale for vertex i; this depends on whether ScaleVertexValues is set.
      Parameters:
      i -
      Returns:
    • getVertex

      public org.jogamp.vecmath.Point3f getVertex​(int i)
      Returns the vertex at index i.
      Parameters:
      i -
      Returns:
    • getVertices

      public java.util.ArrayList<org.jogamp.vecmath.Point3f> getVertices()
    • getVertexColour

      public java.awt.Color getVertexColour()
      Description copied from class: InterfaceShape
      Returns the colour of this shape's vertices.
      Specified by:
      getVertexColour in class InterfaceShape
      Returns:
    • getVertexColour

      public java.awt.Color getVertexColour​(int i)
      Returns the colour of vertex i; depends on whether the ShowData attribute is true, and this shape has a current vertex data column.
      Parameters:
      i -
      Returns:
    • getLineColour

      public java.awt.Color getLineColour()
      Description copied from class: InterfaceShape
      Returns the colour of this shape's lines/edges.
      Specified by:
      getLineColour in class InterfaceShape
      Returns:
    • getLineStyle

      public java.awt.Stroke getLineStyle()
      Description copied from class: InterfaceShape
      Returns the line/edge style for this shape.
      Specified by:
      getLineStyle in class InterfaceShape
      Returns:
    • setLineStyle

      public void setLineStyle​(java.awt.Stroke s)
      Description copied from class: InterfaceShape
      Returns the line/edge style for this shape.
      Specified by:
      setLineStyle in class InterfaceShape
    • getGeometry

      public Shape getGeometry()
      Description copied from class: InterfaceShape
      Returns the Shape associated with this object
      Specified by:
      getGeometry in class InterfaceShape
      Returns:
    • setGeometry

      public boolean setGeometry​(Shape geometry)
      Description copied from class: InterfaceShape
      Sets the Shape associated with this object. If the class type is incorrect, returns false
      Specified by:
      setGeometry in class InterfaceShape
      Returns:
    • getFullName

      public java.lang.String getFullName()
      Description copied from class: InterfaceShape
      Returns a full name of this shape, including its parent model and shape sets, separated by dots.
      Overrides:
      getFullName in class InterfaceShape
      Returns:
    • hasCameraListener

      public boolean hasCameraListener()
    • releaseScene3DChildren

      protected void releaseScene3DChildren()
    • getVertexCount

      public int getVertexCount()
      Description copied from class: InterfaceShape
      Returns the number of vertices defining the geometry of this shape.
      Specified by:
      getVertexCount in class InterfaceShape
      Returns:
    • setSelectedVertices

      public void setSelectedVertices​(java.util.ArrayList<java.lang.Integer> indices)
    • getTreeLabel

      public java.lang.String getTreeLabel()
      Description copied from interface: TreeObject
      Returns the label text to appear in a tree node.
      Specified by:
      getTreeLabel in interface TreeObject
      Overrides:
      getTreeLabel in class AbstractInterfaceObject
      Returns:
    • setIcon

      protected void setIcon()
      Overrides:
      setIcon in class InterfaceShape
    • setCreatableSceneNode

      protected void setCreatableSceneNode​(boolean b)
    • getClosestVertex

      public int getClosestVertex​(org.jogamp.vecmath.Point3f point)
      Returns the index of the vertex of this shape which is closest to point.
      Parameters:
      point -
      Returns:
    • getIcon

      public final javax.swing.Icon getIcon()
    • setParent2D

      public void setParent2D​(Shape2DInt parent)
    • getParent2D

      public Shape2DInt getParent2D()
    • destroy

      public void destroy()
      Description copied from interface: InterfaceObject
      Destroy this object (prepare it to be removed from memory)
      Specified by:
      destroy in interface InterfaceObject
      Overrides:
      destroy in class AbstractInterfaceObject
    • registerCameraListener

      public void registerCameraListener​(Camera3D c)
    • deregisterCameraListener

      public void deregisterCameraListener​(Camera3D c)
    • getCameraListener

      public Camera3DListener getCameraListener()
    • contains

      public boolean contains​(org.jogamp.vecmath.Point3d thisPoint)
    • drawShape2D

      public void drawShape2D​(java.awt.Graphics2D g, DrawingEngine d)
      Description copied from class: InterfaceShape
      ABSTRACT METHODS
      Specified by:
      drawShape2D in class InterfaceShape
    • drawShape2D

      public void drawShape2D​(java.awt.Graphics2D g, DrawingEngine d, Plane3D p, float above_dist, float below_dist)
      Draw this shape as it is intersected by plane p, as well as its projection from distances <= spacing / 2, if required. Method calls the protected method draw2D(), which should be overridden (rather than this one) by all subclasses wishing to draw their shapes in 2D.
      Parameters:
      g - Graphics2D where this shape will be drawn
      d - DrawEngine that will do the drawing
      p - Plane in R3 that (possibly) intersects the shape
      spacing - Thickness of the section from which to project this shape to the plane p.
    • drawShape2D

      public void drawShape2D​(java.awt.Graphics2D g, DrawingEngine d, Plane3D p, float above_dist, float below_dist, boolean listen)
      Draw this shape as it is intersected by plane p, as well as its projection from distances <= spacing / 2, if required. Method calls the protected method draw2D(), which should be overridden (rather than this one) by all subclasses wishing to draw their shapes in 2D.
      Parameters:
      g - Graphics2D where this shape will be drawn
      d - DrawEngine that will do the drawing
      p - Plane in R3 that (possibly) intersects the shape
      above_dist - Thickness of the above part of the section from which to project this shape to the plane p.
      below_dist - Thickness of the above part of the section from which to project this shape to the plane p.
      transform - Transform to apply to the shape before rendering; can be null
    • clear2DChildren

      public void clear2DChildren()
      Clears the currently set 2D children for this shape
    • draw2D

      protected void draw2D​(Shape2DInt shape2d, java.awt.Graphics2D g, DrawingEngine d, Plane3D p, float above_dist, float below_dist)
    • getShape2DInt

      public Shape2DInt getShape2DInt​(Plane3D plane, float above_dist, float below_dist)
    • getShape2DInt

      public Shape2DInt getShape2DInt​(Plane3D p, float above_dist, float below_dist, boolean listen)
      Determines a 2D shape which is the projection of this 3D shape onto plane, within the projection limits defined by above_dist and below_dist.
      Parameters:
      plane - The plane on which to project this shape
      above_dist - The projection limit above the plane
      above_dist - The projection limit below the plane
      listen -
    • crossesPlane

      public boolean crossesPlane​(Plane3D plane)
      Convenience method which determines whether this shape cross plane.
      Parameters:
      plane -
      Returns:
    • getShape2D

      protected Shape2DInt getShape2D​(Plane3D plane, float above_dist, float below_dist)
      To be overridden by subclasses implementing a 2D representation
      Parameters:
      plane - Plane on which to render
      above_dist - Distance above plane within which to project a shape
      below_dist - Distance below plane within which to project a shape
      Returns:
    • getShape2D

      protected Shape2DInt getShape2D​(Plane3D plane, float above_dist, float below_dist, org.jogamp.vecmath.Matrix4d transform)
      To be overridden by subclasses implementing a 2D representation
      Parameters:
      plane - Plane on which to render
      above_dist - Distance above plane within which to project a shape
      below_dist - Distance below plane within which to project a shape
      matrix - Transformation matrix to apply; can be null
      Returns:
    • addShape2DChild

      public void addShape2DChild​(Shape2DInt shape)
    • removeShape2DChild

      public void removeShape2DChild​(Shape2DInt shape)
    • getBoundSphere

      public Sphere3D getBoundSphere()
    • getBoundBox

      public Box3D getBoundBox()
    • getCenterOfGravity

      public org.jogamp.vecmath.Point3f getCenterOfGravity()
    • getGeometricCenter

      public org.jogamp.vecmath.Point3f getGeometricCenter()
    • getProximity

      public double getProximity​(org.jogamp.vecmath.Point3d thisPoint)
    • getShape

      public Shape3D getShape()
    • getVertexSelection

      public VertexSelection getVertexSelection()
      Description copied from class: InterfaceShape
      Returns a list of the currently selected vertices for this shape.
      Specified by:
      getVertexSelection in class InterfaceShape
    • setVertexSelection

      public void setVertexSelection​(VertexSelection selection)
      Specified by:
      setVertexSelection in class InterfaceShape
    • setShowSelectedVertices

      public void setShowSelectedVertices​(boolean b)
    • updateVertices

      public void updateVertices()
      Updates the vertices
    • updateSelectedVertices

      public void updateSelectedVertices()
      Updates the scene graph with the current vertex selection options
    • getDimensions

      public int[] getDimensions()
      Description copied from interface: VariableObject
      Returns the dimensions of this object as an array of integers
      Specified by:
      getDimensions in interface VariableObject
      Returns:
      the dimensions of this object
    • issueTreeNode

      public InterfaceTreeNode issueTreeNode()
      Issues a new tree node for this ShapeInt. Creates the node and then calls InterfaceShape.setTreeNode(mgui.interfaces.trees.InterfaceTreeNode) to construct it. setTreeNode should be overridden by subclasses.
      Specified by:
      issueTreeNode in interface TreeObject
      Overrides:
      issueTreeNode in class AbstractInterfaceObject
      Returns:
      a new InterfaceTreeNode, which is an instance of Shape3DTreeNode.
    • setShape

      public void setShape​(Shape3D newShape)
    • updateShape

      public void updateShape()
      Updates the geometric bounds of this ShapeInt. Does not call setScene3DObject().
      Specified by:
      updateShape in class InterfaceShape
    • toString

      public java.lang.String toString()
      Overrides:
      toString in class java.lang.Object
    • getScene3DObject

      public org.jogamp.java3d.BranchGroup getScene3DObject​(ShapeSelectionSet selSet)
    • getScene3DObject

      public org.jogamp.java3d.BranchGroup getScene3DObject()
      Returns a BranchGroup representing this ShapeInt. This node is subject to change, and therefore is not the Java3D node that should be inserted into a Java3D graph. This should instead be retrieved using getShapeSceneNode, which returns a stable node.

      TODO: reconsider the access modifier of this method. Should probably be protected to avoid confusion and undesired external access.

      Returns:
      the scene node representing this ShapeInt
    • setBoundBoxNode

      protected void setBoundBoxNode()
      Sets a bounding box node for this ShapeInt, that can be retrieved using getBoundBoxNode().

      TODO: reconsider the access modifier of this method; probably doesn't need to be public

    • getModifiedAttribute

      public Attribute<?> getModifiedAttribute()
      Specified by:
      getModifiedAttribute in class InterfaceShape
    • getBoundBoxNode

      public org.jogamp.java3d.BranchGroup getBoundBoxNode()
      Return's this shape's bounding box node. If it hasn't yet been set, this method will set the bounding box node first.
      Returns:
      boundBoxNode - A BranchGroup that can be attached to a Java3D scene for rendering
    • setScene3DObject

      public void setScene3DObject()
      Sets this ShapeInt's Java3D scene node from its current geometry and rendering attributes. This node should be retrieved using the getShapeSceneNode() method. A scene node will only created if one of these conditions is met:
      • The shape is auxiliary (i.e., not a model shape, but a helper shape such as a section polygon)
      • The shape is associated with a ShapeModel3D, and this model is live (is associated with at least one Java3D scene graph).
      Subclasses which call this super method should always check that a scene node has indeed been created.
      Parameters:
      make_live -
    • setScene3DObject

      public void setScene3DObject​(boolean make_live)
      Sets this ShapeInt's Java3D scene node from its current geometry and rendering attributes. This node should be retrieved using the getShapeSceneNode() method. A scene node will only created if one of these conditions is met:
      • The shape is auxiliary (i.e., not a model shape, but a helper shape such as a section polygon)
      • The shape is associated with a ShapeModel3D, and this model is live (is associated with at least one Java3D scene graph).
      Subclasses which call this super method should always check that a scene node has indeed been created.
      Parameters:
      make_live -
    • setShapeSceneNode

      public void setShapeSceneNode()
      Sets the scene node for this shape, either by creating a new node or setting the current shape node to an existing scene node.

      The scene node can be attached to a Java3D Locale object for rendering.

    • attributeUpdated

      public void attributeUpdated​(AttributeEvent e)
      Responds to an update in one of this shape's attributes.

      Subclasses should override and call this super method AFTER handling the attribute change appropriately. Subclasses should also override needsRedraw() to indicate whether the scene node should be regenerated.

      Specified by:
      attributeUpdated in interface AttributeListener
      Parameters:
      e - an AttributeEvent specifying which attribute has been changed
    • geometryChanged

      public void geometryChanged()
      Called when this shape's geometry has changed
    • fireShapeModified

      public void fireShapeModified()
      Description copied from class: InterfaceShape
      Notifies this shape that it has been modified and should inform its listeners
      Overrides:
      fireShapeModified in class InterfaceShape
    • fireShapeListeners

      protected void fireShapeListeners​(ShapeEvent e)
      Overrides:
      fireShapeListeners in class InterfaceShape
    • fireChildren2D

      public void fireChildren2D​(ShapeEvent e)
      Fires a ShapeEvent for this shape's 2D children
    • fireChildren2DModified

      public void fireChildren2DModified()
      Fires a shape modified event for this shape's 2D children
    • updateChildren2D

      protected void updateChildren2D​(Attribute<?> a)
      Updates an attribute of this shape's 2D children.
      Parameters:
      a -
    • getInheritingAttribute

      public Attribute<?> getInheritingAttribute​(Attribute<?> attribute)
      Returns the 2D attribute inheriting from a 3D attribute. Use when InheritFromParent=true. Subclasses should override this method if certain 3D attributes are not intended to be inherited (e.g., vertex scales).
      Parameters:
      name -
      Returns:
      The inheriting attribute, or null if attribute is not heritable
    • needsRedraw

      public boolean needsRedraw​(Attribute<?> a)
      Description copied from class: InterfaceShape
      Returns true if a change to attribute will require a redraw of this shape.
      Specified by:
      needsRedraw in class InterfaceShape
      Returns:
    • hasParentShape

      public boolean hasParentShape()
      Description copied from class: InterfaceShape
      Is this shape a child of another shape? Usually this refers to shapes which produce themselves in a different dimensionality; e.g., a 3D shape represented on a 2D plane.
      Specified by:
      hasParentShape in class InterfaceShape
      Returns:
    • getShapeSceneNode

      public ShapeSceneNode getShapeSceneNode()
      Returns this ShapeInt's Java3D node. This node is stable, meaning that only its children are subject to change; the node is regenerated only when this method is called for the first time, or if it has been destroyed. Thus it is suitable for insertion into a Java3D scene graph.
      Returns:
      a
    • getShapeSceneNode

      public ShapeSceneNode getShapeSceneNode​(ShapeSelectionSet s)
    • setLive

      public void setLive​(boolean live)
      Sets the live status of this shape's scene 3D object node.

      If live is true, adds the scene 3D object node to the shape scene node if one exists.

      If live is false, detaches the scene 3D object node to the shape scene node if it is currently live.

      Parameters:
      live -
    • isLive

      public boolean isLive()
    • updateData

      public void updateData​(org.jogamp.java3d.Geometry geometry)
      Specified by:
      updateData in interface org.jogamp.java3d.GeometryUpdater
    • getDTD

      public java.lang.String getDTD()
      Description copied from interface: XMLObject
      Returns the Data Type Declaration (DTD) for this object's XML representation

      See http://en.wikipedia.org/wiki/Document_Type_Definition for a description.

      Specified by:
      getDTD in interface XMLObject
      Returns:
    • getLocalName

      public java.lang.String getLocalName()
      Description copied from interface: XMLObject
      Returns the local name associated with this XML object.
      Specified by:
      getLocalName in interface XMLObject
      Returns:
    • getShortXML

      public java.lang.String getShortXML​(int tab)
      Description copied from interface: XMLObject
      Returns a short XML representation of this object.
      Specified by:
      getShortXML in interface XMLObject
      Returns:
    • getPopupMenu

      public InterfacePopupMenu getPopupMenu​(java.util.List<java.lang.Object> selected)
      Subclasses should override this if necessary and call super.getPopupMenu() to get this top-level menu and add items to it.
      Specified by:
      getPopupMenu in interface PopupMenuObject
      Returns:
    • getPopupMenuLength

      protected int getPopupMenuLength()
    • setGraphic3DPopupMenu

      public void setGraphic3DPopupMenu​(InterfacePopupMenu menu)
      Subclasses should override this if necessary and call super.getGraphic3DPopupMenu() to get this top-level menu and add items to it.
    • handlePopupEvent

      public void handlePopupEvent​(java.awt.event.ActionEvent e)
      Description copied from interface: PopupMenuObject
      Handles an event on this object's popup menu.
      Specified by:
      handlePopupEvent in interface PopupMenuObject
    • copyAttributes

      public boolean copyAttributes​(InterfaceShape source_shape)
      Description copied from class: InterfaceShape
      Copies attributes to this shape. The shape should determine which attributes may be copied.
      Overrides:
      copyAttributes in class InterfaceShape
      Returns:
    • getVertexAppearance

      protected org.jogamp.java3d.Appearance getVertexAppearance​(int i)
      Returns the appearance of vertex i.
      Parameters:
      i -
      Returns:
    • setCurrentColumn

      public void setCurrentColumn​(java.lang.String key, boolean update)
      Overrides:
      setCurrentColumn in class InterfaceShape
    • showPopupMenu

      public void showPopupMenu​(java.awt.event.MouseEvent e)
      Description copied from interface: PopupMenuObject
      Shows a popup menu at the point of the given MouseEvent.
      Specified by:
      showPopupMenu in interface PopupMenuObject
    • getTransferData

      public java.lang.Object getTransferData​(java.awt.datatransfer.DataFlavor flavor) throws java.awt.datatransfer.UnsupportedFlavorException, java.io.IOException
      Specified by:
      getTransferData in interface java.awt.datatransfer.Transferable
      Throws:
      java.awt.datatransfer.UnsupportedFlavorException
      java.io.IOException
    • getTransferDataFlavors

      public java.awt.datatransfer.DataFlavor[] getTransferDataFlavors()
      Specified by:
      getTransferDataFlavors in interface java.awt.datatransfer.Transferable
    • isDataFlavorSupported

      public boolean isDataFlavorSupported​(java.awt.datatransfer.DataFlavor flavor)
      Specified by:
      isDataFlavorSupported in interface java.awt.datatransfer.Transferable
    • performTransfer

      public boolean performTransfer​(javax.swing.TransferHandler.TransferSupport support)
      Moves a list of shapes to a position above this shape in its parent set. Does nothing if this shape does not have a parent set.
      Specified by:
      performTransfer in interface InterfaceTransferable
      Returns:
      true if successful.