artofillusion.object
Class SplineMesh

java.lang.Object
  extended by artofillusion.object.Object3D
      extended by artofillusion.object.SplineMesh
All Implemented Interfaces:
Mesh

public class SplineMesh
extends Object3D
implements Mesh

The SplineMesh class represents a parametric surface defined as a tensor product of spline curves. Depending on the selected smoothing method, the surface may either interpolate or approximate the vertices of the control mesh.


Nested Class Summary
static class SplineMesh.SplineMeshKeyframe
          This class represents a pose of a SplineMesh.
 
Field Summary
 
Fields inherited from class artofillusion.object.Object3D
APPROXIMATELY, CANT_CONVERT, EXACTLY
 
Fields inherited from interface artofillusion.object.Mesh
APPROXIMATING, INTERPOLATING, NO_SMOOTHING, SMOOTH_SHADING
 
Constructor Summary
SplineMesh(java.io.DataInputStream in, Scene theScene)
          The following two methods are used for reading and writing files.
SplineMesh(Vec3[][] v, float[] usmoothness, float[] vsmoothness, int smoothingMethod, boolean uclosed, boolean vclosed)
          v is an array containing the points of the control mesh, with the first index corresponding to the U direction, and the second to the V direction.
 
Method Summary
 void applyPoseKeyframe(Keyframe k)
          Modify this object based on a pose keyframe.
static MeshVertex calcApproxPoint(MeshVertex[] v, float[] s, double[][] oldParam, double[] newParam, int i, int j, int k)
           
static MeshVertex calcInterpPoint(MeshVertex[] v, float[] s, double[][] oldParam, double[] newParam, int i, int j, int k, int m)
          The following two routines are used by subdivideMesh to calculate new point positions for interpolating and approximating subdivision.
 boolean canConvertToActor()
          Allow SplineMeshes to be converted to Actors.
 int canConvertToTriangleMesh()
          Tells whether the object can be converted to a TriangleMesh.
 TriangleMesh convertToTriangleMesh(double tol)
          Return a TriangleMesh which reproduces the shape of this object.
 void copyObject(Object3D obj)
          Copy all the properties of another object, to make this one identical to it.
 MeshViewer createMeshViewer(MeshEditController controller, RowContainer options)
          Get a MeshViewer which can be used for viewing this mesh.
 Object3D duplicate()
          Create a new object which is an exact duplicate of this one.
 void edit(EditingWindow parent, ObjectInfo info, java.lang.Runnable cb)
          Display a window in which the user can edit this object.
 void editGesture(EditingWindow parent, ObjectInfo info, java.lang.Runnable cb, ObjectInfo realObject)
          Edit an object which represents a gesture for an Actor object.
 BoundingBox getBounds()
          Get the bounding box for the mesh.
 Vec3[] getNormals()
          Get an array of normal vectors.
 Object3D getPosableObject()
          SplineMeshes cannot be keyframed directly, since any change to mesh topology would cause all keyframes to become invalid.
 Keyframe getPoseKeyframe()
          Return a Keyframe which describes the current pose of this object.
 Property[] getProperties()
          Get a list of editable properties defined by this object.
 java.lang.Object getPropertyValue(int index)
          Get the value of one of this object's editable properties.
 RenderingMesh getRenderingMesh(double tol, boolean interactive, ObjectInfo info)
          Objects which can be rendered as part of a scene should override this method to return a RenderingMesh which describes the appearance of the object.
 Skeleton getSkeleton()
          Get the skeleton for the object.
 int getSmoothingMethod()
          Get the smoothing method being used for this mesh.
 int getUSize()
          Get the size of the mesh in the U direction.
 float[] getUSmoothness()
          Get the array of U smoothness values.
 MeshVertex getVertex(int u, int v)
          Get a single vertex.
 Vec3[] getVertexPositions()
          Get a list of the positions of all vertices which define the mesh.
 MeshVertex[] getVertices()
          Return the list of vertices for the mesh.
 int getVSize()
          Get the size of the mesh in the V direction.
 float[] getVSmoothness()
          Get the array of V smoothness values.
 WireframeMesh getWireframeMesh()
          Every object should override this method to return a WireframeMesh.
 boolean isClosed()
          Determine whether this mesh is completely closed.
 boolean isEditable()
          If the object can be edited by the user, isEditable() should be overridden to return true.
 boolean isUClosed()
          Determine whether this mesh is closed in the U direction.
 boolean isVClosed()
          Determine whether this mesh is closed in the V direction.
 void makeRightSideOut()
          If necessary, reorder the points in the mesh so that, when converted to a triangle mesh for rendering, the normals will be properly oriented.
 void reverseOrientation()
          Reverse the points along one direction.
 void setClosed(boolean u, boolean v)
          Set whether this mesh is closed in each direction.
 void setMaterial(Material mat, MaterialMapping map)
          When setting the material, we need to clear the caches.
 void setParameterValue(TextureParameter param, ParameterValue val)
          When setting texture parameters, we need to clear the caches.
 void setParameterValues(ParameterValue[] val)
          When setting texture parameters, we need to clear the caches.
 void setPropertyValue(int index, java.lang.Object value)
          Set the value of one of this object's editable properties.
 void setShape(MeshVertex[][] v, float[] usmoothness, float[] vsmoothness)
          This method rebuilds the mesh based on new lists of vertices and smoothness values.
 void setSize(double xsize, double ysize, double zsize)
          Set the size of the mesh.
 void setSkeleton(Skeleton s)
          Set the skeleton for the object.
 void setSmoothingMethod(int method)
          Set the smoothing method.
 void setSmoothness(float[] usmoothness, float[] vsmoothness)
          Set the smoothness values.
 void setTexture(Texture tex, TextureMapping mapping)
          When setting the texture, we need to clear the caches.
 void setVertexPositions(Vec3[] v)
          Set the positions for all the vertices of the mesh.
static SplineMesh subdivideMesh(SplineMesh mesh, double tol)
          Subdivide a spline mesh to a desired tolerance.
 void writeToFile(java.io.DataOutputStream out, Scene theScene)
          The following method writes the object's data to an output stream.
 
Methods inherited from class artofillusion.object.Object3D
canSetMaterial, canSetTexture, configurePoseTrack, copyTextureAndMaterial, editKeyframe, getAverageParameterValues, getMaterial, getMaterialMapping, getParameters, getParameterValue, getParameterValues, getTexture, getTextureMapping, readParameterValue, renderObject, sceneChanged, setParameters
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface artofillusion.object.Mesh
getParameters, getParameterValues
 

Constructor Detail

SplineMesh

public SplineMesh(Vec3[][] v,
                  float[] usmoothness,
                  float[] vsmoothness,
                  int smoothingMethod,
                  boolean uclosed,
                  boolean vclosed)
v is an array containing the points of the control mesh, with the first index corresponding to the U direction, and the second to the V direction. The two smoothness arrays give the smoothness values along the U and V directions respectively.


SplineMesh

public SplineMesh(java.io.DataInputStream in,
                  Scene theScene)
           throws java.io.IOException,
                  java.io.InvalidObjectException
The following two methods are used for reading and writing files. The first is a constructor which reads the necessary data from an input stream. The other writes the object's representation to an output stream.

Throws:
java.io.IOException
java.io.InvalidObjectException
Method Detail

duplicate

public Object3D duplicate()
Description copied from class: Object3D
Create a new object which is an exact duplicate of this one.

Specified by:
duplicate in interface Mesh
Specified by:
duplicate in class Object3D

copyObject

public void copyObject(Object3D obj)
Description copied from class: Object3D
Copy all the properties of another object, to make this one identical to it. If the two objects are of different classes, this will throw a ClassCastException.

Specified by:
copyObject in interface Mesh
Specified by:
copyObject in class Object3D

getBounds

public BoundingBox getBounds()
Get the bounding box for the mesh. This is always the bounding box for the unsmoothed control mesh. If the smoothing method is set to approximating, the final surface may not actually touch the sides of this box. If the smoothing method is set to interpolating, the final surface may actually extend outside this box.

Specified by:
getBounds in interface Mesh
Specified by:
getBounds in class Object3D

getVertices

public MeshVertex[] getVertices()
Return the list of vertices for the mesh.

Specified by:
getVertices in interface Mesh

getVertex

public final MeshVertex getVertex(int u,
                                  int v)
Get a single vertex.


getUSize

public final int getUSize()
Get the size of the mesh in the U direction.


getVSize

public final int getVSize()
Get the size of the mesh in the V direction.


getSmoothingMethod

public int getSmoothingMethod()
Get the smoothing method being used for this mesh.


getUSmoothness

public float[] getUSmoothness()
Get the array of U smoothness values.


getVSmoothness

public float[] getVSmoothness()
Get the array of V smoothness values.


getVertexPositions

public Vec3[] getVertexPositions()
Get a list of the positions of all vertices which define the mesh.

Specified by:
getVertexPositions in interface Mesh

setVertexPositions

public void setVertexPositions(Vec3[] v)
Set the positions for all the vertices of the mesh.

Specified by:
setVertexPositions in interface Mesh

setSmoothingMethod

public void setSmoothingMethod(int method)
Set the smoothing method.


setSmoothness

public void setSmoothness(float[] usmoothness,
                          float[] vsmoothness)
Set the smoothness values.


setShape

public void setShape(MeshVertex[][] v,
                     float[] usmoothness,
                     float[] vsmoothness)
This method rebuilds the mesh based on new lists of vertices and smoothness values.


isUClosed

public boolean isUClosed()
Determine whether this mesh is closed in the U direction.


isVClosed

public boolean isVClosed()
Determine whether this mesh is closed in the V direction.


isClosed

public boolean isClosed()
Determine whether this mesh is completely closed.

Overrides:
isClosed in class Object3D

setClosed

public void setClosed(boolean u,
                      boolean v)
Set whether this mesh is closed in each direction.


setSize

public void setSize(double xsize,
                    double ysize,
                    double zsize)
Set the size of the mesh.

Specified by:
setSize in class Object3D

isEditable

public boolean isEditable()
Description copied from class: Object3D
If the object can be edited by the user, isEditable() should be overridden to return true. edit() should then create a window and allow the user to edit the object.

Overrides:
isEditable in class Object3D

edit

public void edit(EditingWindow parent,
                 ObjectInfo info,
                 java.lang.Runnable cb)
Description copied from class: Object3D
Display a window in which the user can edit this object.

Overrides:
edit in class Object3D
Parameters:
parent - the window from which this command is being invoked
info - the ObjectInfo corresponding to this object
cb - a callback which will be executed when editing is complete. If the user cancels the operation, it will not be called.

editGesture

public void editGesture(EditingWindow parent,
                        ObjectInfo info,
                        java.lang.Runnable cb,
                        ObjectInfo realObject)
Description copied from class: Object3D
Edit an object which represents a gesture for an Actor object. realObject specifies the object in the scene which this is a gesture for.

Overrides:
editGesture in class Object3D

createMeshViewer

public MeshViewer createMeshViewer(MeshEditController controller,
                                   RowContainer options)
Get a MeshViewer which can be used for viewing this mesh.

Specified by:
createMeshViewer in interface Mesh

subdivideMesh

public static SplineMesh subdivideMesh(SplineMesh mesh,
                                       double tol)
Subdivide a spline mesh to a desired tolerance.


calcInterpPoint

public static MeshVertex calcInterpPoint(MeshVertex[] v,
                                         float[] s,
                                         double[][] oldParam,
                                         double[] newParam,
                                         int i,
                                         int j,
                                         int k,
                                         int m)
The following two routines are used by subdivideMesh to calculate new point positions for interpolating and approximating subdivision. v is an array of vertices, s is the array of smoothness values for them, and i, j, k, and m are the indices of the points from which the new point will be calculated.


calcApproxPoint

public static MeshVertex calcApproxPoint(MeshVertex[] v,
                                         float[] s,
                                         double[][] oldParam,
                                         double[] newParam,
                                         int i,
                                         int j,
                                         int k)

getWireframeMesh

public WireframeMesh getWireframeMesh()
Description copied from class: Object3D
Every object should override this method to return a WireframeMesh. This will be used for drawing the object in wireframe mode, and also for drawing "nonrenderable" objects in other rendering modes.

Specified by:
getWireframeMesh in class Object3D

getRenderingMesh

public RenderingMesh getRenderingMesh(double tol,
                                      boolean interactive,
                                      ObjectInfo info)
Description copied from class: Object3D
Objects which can be rendered as part of a scene should override this method to return a RenderingMesh which describes the appearance of the object. All points on the RenderingMesh should be within a distance tol of the true surface. The interactive flag tells whether the resulting Mesh will be rendered in interactive mode. When interactive is set to true, the RenderingMesh should be cached for future use, so that it may be rendered repeatedly without needing to be regenerated.

The ObjectInfo contains additional information which may affect how the object is rendered, such as it location in the scene, texture parameters, etc.

Objects which cannot be rendered directly (lights, cameras, curves, etc.) do not need to override this method.

Overrides:
getRenderingMesh in class Object3D

canConvertToTriangleMesh

public int canConvertToTriangleMesh()
Description copied from class: Object3D
Tells whether the object can be converted to a TriangleMesh. It should return one of the following values: CANT_CONVERT: The object cannot be converted to a TriangleMesh. EXACTLY: The object can be represented exactly by a TriangleMesh. APPROXIMATELY: The object can be converted to a TriangleMesh. However, the resulting mesh will not be exactly the same shape as the original object. If a class overrides this method, it must also override convertToTriangleMesh().

Overrides:
canConvertToTriangleMesh in class Object3D

convertToTriangleMesh

public TriangleMesh convertToTriangleMesh(double tol)
Description copied from class: Object3D
Return a TriangleMesh which reproduces the shape of this object. If canConvertToTriangleMesh() returned APPROXIMATELY, this method should return a TriangleMesh which reproduces the object to within the specified tolerance. That is, no point on the mesh should be further than tol from the corresponding point on the original surface. If canConvertToTriangleMesh() returned EXACTLY, then tol should be ignored. If canConvertToTriangleMesh() return CANT_CONVERT, this method returns null.

Overrides:
convertToTriangleMesh in class Object3D

setTexture

public void setTexture(Texture tex,
                       TextureMapping mapping)
When setting the texture, we need to clear the caches.

Overrides:
setTexture in class Object3D

setMaterial

public void setMaterial(Material mat,
                        MaterialMapping map)
When setting the material, we need to clear the caches.

Overrides:
setMaterial in class Object3D

setParameterValues

public void setParameterValues(ParameterValue[] val)
When setting texture parameters, we need to clear the caches.

Overrides:
setParameterValues in class Object3D

setParameterValue

public void setParameterValue(TextureParameter param,
                              ParameterValue val)
When setting texture parameters, we need to clear the caches.

Overrides:
setParameterValue in class Object3D

getSkeleton

public Skeleton getSkeleton()
Get the skeleton for the object.

Specified by:
getSkeleton in interface Mesh
Overrides:
getSkeleton in class Object3D

setSkeleton

public void setSkeleton(Skeleton s)
Set the skeleton for the object.

Specified by:
setSkeleton in interface Mesh

writeToFile

public void writeToFile(java.io.DataOutputStream out,
                        Scene theScene)
                 throws java.io.IOException
Description copied from class: Object3D
The following method writes the object's data to an output stream. Subclasses should override this method, but also call super.writeToFile() to save information about materials, etc. In addition to this method, every Object3D must include a constructor with the signature public Classname(DataInputStream in, Scene theScene) throws IOException, InvalidObjectException which reconstructs the object by reading its data from an input stream. This constructor, similarly, should call the overridden constructor to read information about materials, etc.

Overrides:
writeToFile in class Object3D
Throws:
java.io.IOException

makeRightSideOut

public void makeRightSideOut()
If necessary, reorder the points in the mesh so that, when converted to a triangle mesh for rendering, the normals will be properly oriented.


reverseOrientation

public void reverseOrientation()
Reverse the points along one direction. This will cause all the normal vectors to be flipped.


getNormals

public Vec3[] getNormals()
Get an array of normal vectors. This calculates a single normal for each vertex, ignoring smoothness values.

Specified by:
getNormals in interface Mesh

getProperties

public Property[] getProperties()
Description copied from class: Object3D
Get a list of editable properties defined by this object.

Overrides:
getProperties in class Object3D

getPropertyValue

public java.lang.Object getPropertyValue(int index)
Description copied from class: Object3D
Get the value of one of this object's editable properties.

Overrides:
getPropertyValue in class Object3D
Parameters:
index - the index of the property to get

setPropertyValue

public void setPropertyValue(int index,
                             java.lang.Object value)
Description copied from class: Object3D
Set the value of one of this object's editable properties.

Overrides:
setPropertyValue in class Object3D
Parameters:
index - the index of the property to set
value - the value to set for the property

getPoseKeyframe

public Keyframe getPoseKeyframe()
Return a Keyframe which describes the current pose of this object.

Specified by:
getPoseKeyframe in class Object3D

applyPoseKeyframe

public void applyPoseKeyframe(Keyframe k)
Modify this object based on a pose keyframe.

Specified by:
applyPoseKeyframe in class Object3D

canConvertToActor

public boolean canConvertToActor()
Allow SplineMeshes to be converted to Actors.

Overrides:
canConvertToActor in class Object3D

getPosableObject

public Object3D getPosableObject()
SplineMeshes cannot be keyframed directly, since any change to mesh topology would cause all keyframes to become invalid. Return an actor for this mesh.

Overrides:
getPosableObject in class Object3D


Copyright © 1999-2011 by Peter Eastman.