edu.neu.ccs.gui
Class TweakableShape

java.lang.Object
  extended byedu.neu.ccs.gui.BaseShape
      extended byedu.neu.ccs.gui.TweakableShape
All Implemented Interfaces:
Shape, SupportsPropertyChange
Direct Known Subclasses:
TweakableCurve

public class TweakableShape
extends BaseShape

Class TweakableShape implements a BaseShape in which the vertex array and the tangent array may be changed independently of one another.

The derived class TweakableCurve was introduced in 2.4.0 to fix the path strategy to be Path.BEZIER_CUBIC since that is the most common case.

To define a shape in which the tangent array is computed from the vertex array automatically, use the class AutomaticShape.

The internal tangent array will be maintained as non-null by creating an array of zero tangents if needed.

Since:
2.3
Version:
2.4.0

Field Summary
static String ADD_VERTEX_TANGENT
          Bound property name to add one or more vertex-tangent pairs.
static String REMOVE_VERTEX_TANGENT
          Bound property name to remove one or more vertex-tangent pairs.
static String SET_TANGENT
          Bound property name to set one or more tangents.
static String SET_VERTEX
          Bound property name to set one or more vertices.
static String SET_VERTEX_TANGENT
          Bound property name to set one or more vertex-tangent pairs.
 
Fields inherited from class edu.neu.ccs.gui.BaseShape
REMOVE_SHAPE_DATA, SET_CLOSURE_MODE, SET_PATH_STRATEGY, SET_WINDING_RULE, tangent, vertex
 
Constructor Summary
TweakableShape()
          The default constructor with an empty shape.
TweakableShape(float[][] vertex)
          The constructor with the given vertex data.
TweakableShape(float[][] vertex, float[][] tangent)
          The constructor with the given vertex and tangent data.
TweakableShape(float[][] vertex, float[][] tangent, Path.Strategy pathstrategy)
          The constructor with the given vertex and tangent data and the given path strategy.
TweakableShape(float[][] vertex, float[][] tangent, Path.Strategy pathstrategy, ClosureMode closuremode)
          The constructor with the given vertex and tangent data, the given path strategy, and the given closure mode.
TweakableShape(float[][] vertex, float[][] tangent, Path.Strategy pathstrategy, ClosureMode closuremode, WindingRule windingrule)
          The constructor with the given vertex and tangent data, the given path strategy, the given closure mode, and the given winding rule.
 
Method Summary
 void addVertexTangent(int index, float[] array)
          Adds a new vertex and tangent at the given index with the given array of point and displacement coordinates and makes a new path.
 void addVertexTangent(int index, float[] point, float[] delta)
          Adds a new vertex and tangent at the given index using the given point and delta arrays and makes a new path.
 void addVertexTangent(int index, float x, float y, float dx, float dy)
          Adds a new vertex and tangent at the given index with the given point and displacement coordinates x, y, dx, dy.
 void addVerticesTangents(int index, float[][] array)
          Adds a new sequence of vertices and tangents at the given index extracting data from the given array of type float[K][4] and then makes a new path.
 void addVerticesTangents(int index, float[][] points, float[][] deltas)
          Adds a new sequence of vertices and tangents at the given index using copies of the given points and deltas and then makes a new path.
 void appendVertexTangent(float[] array)
          Appends a new vertex and tangent with the given array of point and displacement coordinates and makes a new path.
 void appendVertexTangent(float[] point, float[] delta)
          Appends a new vertex and tangent using the given point and delta arrays and makes a new path.
 void appendVertexTangent(float x, float y, float dx, float dy)
          Appends a new vertex and tangent with the given point and displacement coordinates x, y, dx, dy.
 void appendVerticesTangents(float[][] array)
          Appends a new sequence of vertices and tangents extracting data from the given array of type float[K][4] and then makes a new path.
 void appendVerticesTangents(float[][] points, float[][] deltas)
          Appends a new sequence of vertices and tangents using copies of the given points and deltas and then makes a new path.
 float[][] removeAllVerticesTangents()
          Removes all vertices and tangents, makes a new path, and returns an array float[N][4] with the vertices and tangents that were removed.
 float[] removeVertexTangent(int index)
          Removes the vertex/tangent at the given index, makes a new path, and returns an array with the data from the removed vertex/tangent as x, y, dx, dy.
 float[][] removeVerticesTangents(int m, int n)
          Removes the vertices and tangents starting at the given index m inclusive and ending at the given index n exclusive, makes a new path, and returns an array float[K][4] with the vertices and tangents that were removed.
 void setTangent(int index, float[] delta)
          Sets the tangent at the given index to the given displacement and makes a new path.
 void setTangent(int index, float dx, float dy)
          Sets the tangent at the given index to the given displacement coordinates and makes a new path.
 void setTangentData(float[][] tangent)
          Sets the tangent data of the shape using a 2-dimensional array of single precision numbers and makes a new path.
 void setTangentViaControlA(int index, float[] control)
          Sets the tangent at the given index to using the given ahead control point and makes a new path.
 void setTangentViaControlA(int index, float x, float y)
          Sets the tangent at the given index using the given coordinates for the ahead control point and makes a new path.
 void setTangentViaControlB(int index, float[] control)
          Sets the tangent at the given index to using the given behind control point and makes a new path.
 void setTangentViaControlB(int index, float x, float y)
          Sets the tangent at the given index using the given coordinates for the behind control point and makes a new path.
 void setVertex(int index, float[] point)
          Sets the vertex at the given index to the given point and makes a new path.
 void setVertex(int index, float x, float y)
          Sets the vertex at the given index to the given point coordinates and makes a new path.
 void setVertexData(float[][] vertex)
          Sets the vertex data of the shape using a 2-dimensional array of single precision numbers and makes a new path.
 void setVertexTangent(int index, float[] array)
          Sets the vertex and tangent at the given index to the given array of point and displacement coordinates and makes a new path.
 void setVertexTangent(int index, float[] point, float[] delta)
          Sets the vertex and tangent at the given index using the given point and delta arrays and makes a new path.
 void setVertexTangent(int index, float x, float y, float dx, float dy)
          Sets the vertex and tangent at the given index to the given point and displacement coordinates and makes a new path.
 void setVertexTangentData(float[][] vertex_tangent)
          Sets the vertex and tangent data of the shape using a 2-dimensional array of single precision numbers and makes a new path.
 void setVertexTangentData(float[][] vertex, float[][] tangent)
          Sets the vertex and tangent data of the shape using a pair of 2-dimensional arrays of single precision numbers and makes a new path.
 
Methods inherited from class edu.neu.ccs.gui.BaseShape
addForwardingListener, addPropertyChangeListener, addPropertyChangeListener, addPropertyChangeListeners, addPropertyChangeListeners, bezierTangentSegmentPoints, closedBezierControlPoints, closedBezierFramePoints, contains, contains, contains, contains, findControlA, findControlA, findControlB, findControlB, findVertex, findVertex, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAX, getAY, getBezierTangentSegmentData, getBounds, getBounds2D, getBX, getBY, getClosedBezierControlData, getClosedBezierFrameData, getClosureMode, getControlA, getControlB, getCubicCurvePoint, getForwardingListener, getOpenBezierControlData, getOpenBezierFrameData, getPath, getPathIterator, getPathIterator, getPathStrategy, getPolygonPoint, getPropertyChangeListeners, getPropertyChangeListeners, getTangent, getTangentData, getTransformedShape, getTransformedShape, getTX, getTY, getVertex, getVertexData, getVertexTangent, getVertexTangentData, getVX, getVY, getWindingRule, hasListeners, intersects, intersects, isTangentNull, length, makeBezierTangentSegments, makeClosedBezierFrame, makeClosedControlDots, makeClosedPolygon, makeOpenBezierFrame, makeOpenControlDots, makeOpenPolygon, makePath, makePolygonDots, openBezierControlPoints, openBezierFramePoints, removeAndAddForwardingListener, removeForwardingListener, removePropertyChangeListener, removePropertyChangeListener, removeShapeData, setClosureMode, setPathStrategy, setWindingRule, setWindingRule
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

SET_VERTEX

public static final String SET_VERTEX
Bound property name to set one or more vertices.

See Also:
Constant Field Values

SET_TANGENT

public static final String SET_TANGENT
Bound property name to set one or more tangents.

See Also:
Constant Field Values

SET_VERTEX_TANGENT

public static final String SET_VERTEX_TANGENT
Bound property name to set one or more vertex-tangent pairs.

See Also:
Constant Field Values

ADD_VERTEX_TANGENT

public static final String ADD_VERTEX_TANGENT
Bound property name to add one or more vertex-tangent pairs.

See Also:
Constant Field Values

REMOVE_VERTEX_TANGENT

public static final String REMOVE_VERTEX_TANGENT
Bound property name to remove one or more vertex-tangent pairs.

See Also:
Constant Field Values
Constructor Detail

TweakableShape

public TweakableShape()

The default constructor with an empty shape.

The default settings are as follows:


TweakableShape

public TweakableShape(float[][] vertex)

The constructor with the given vertex data.

Preconditions:

If the given vertex array is null then the internal vertex and tangent arrays are set to float[0][2].

Otherwise the vertex array will be cloned and an array of zero tangents will be constructed.

Parameters:
vertex - the vertex data

TweakableShape

public TweakableShape(float[][] vertex,
                      float[][] tangent)

The constructor with the given vertex and tangent data.

Preconditions:

If the given vertex array is null then the given tangent array is ignored and the internal vertex and tangent arrays are set to float[0][2].

Otherwise if the given tangent array is null then the vertex array will be cloned and an array of zero tangents will be constructed.

Otherwise both the vertex and tangent array should be float[N][2] for the same N. These arrays will be cloned to set the internal vertex and tangent data.

Parameters:
vertex - the vertex data
tangent - the tangent data

TweakableShape

public TweakableShape(float[][] vertex,
                      float[][] tangent,
                      Path.Strategy pathstrategy)

The constructor with the given vertex and tangent data and the given path strategy.

Preconditions:

If the given vertex array is null then the given tangent array is ignored and the internal vertex and tangent arrays are set to float[0][2].

Otherwise if the given tangent array is null then the vertex array will be cloned and an array of zero tangents will be constructed.

Otherwise both the vertex and tangent array should be float[N][2] for the same N. These arrays will be cloned to set the internal vertex and tangent data.

Parameters:
vertex - the vertex data
tangent - the tangent data
pathstrategy - the path strategy

TweakableShape

public TweakableShape(float[][] vertex,
                      float[][] tangent,
                      Path.Strategy pathstrategy,
                      ClosureMode closuremode)

The constructor with the given vertex and tangent data, the given path strategy, and the given closure mode.

Preconditions:

If the given vertex array is null then the given tangent array is ignored and the internal vertex and tangent arrays are set to float[0][2].

Otherwise if the given tangent array is null then the vertex array will be cloned and an array of zero tangents will be constructed.

Otherwise both the vertex and tangent array should be float[N][2] for the same N. These arrays will be cloned to set the internal vertex and tangent data.

Parameters:
vertex - the vertex data
tangent - the tangent data
pathstrategy - the path strategy
closuremode - the closure mode

TweakableShape

public TweakableShape(float[][] vertex,
                      float[][] tangent,
                      Path.Strategy pathstrategy,
                      ClosureMode closuremode,
                      WindingRule windingrule)

The constructor with the given vertex and tangent data, the given path strategy, the given closure mode, and the given winding rule.

Preconditions:

If the given vertex array is null then the given tangent array is ignored and the internal vertex and tangent arrays are set to float[0][2].

Otherwise if the given tangent array is null then the vertex array will be cloned and an array of zero tangents will be constructed.

Otherwise both the vertex and tangent array should be float[N][2] for the same N. These arrays will be cloned to set the internal vertex and tangent data.

Parameters:
vertex - the vertex data
tangent - the tangent data
pathstrategy - the path strategy
closuremode - the closure mode
windingrule - the winding rule
Method Detail

setVertexData

public final void setVertexData(float[][] vertex)

Sets the vertex data of the shape using a 2-dimensional array of single precision numbers and makes a new path.

Does not change the current tangent data.

Preconditions:

Does nothing if the preconditions fail.

Fires property change: SET_VERTEX.

Parameters:
vertex - the vertex data

setTangentData

public final void setTangentData(float[][] tangent)

Sets the tangent data of the shape using a 2-dimensional array of single precision numbers and makes a new path.

Does not change the current vertex data.

Preconditions:

If the given tangent array is null, then the internal tangent array will be set to a new array of zeroes.

Does nothing if the preconditions fail.

Fires property change: SET_TANGENT.

Parameters:
tangent - the tangent data

setVertexTangentData

public final void setVertexTangentData(float[][] vertex,
                                       float[][] tangent)

Sets the vertex and tangent data of the shape using a pair of 2-dimensional arrays of single precision numbers and makes a new path.

Preconditions:

If the given vertex array is null then the given tangent array is ignored and the internal vertex and tangent arrays are set to float[0][2].

Otherwise if the given tangent array is null then the vertex array will be cloned and an array of zero tangents will be constructed.

Otherwise both the vertex and tangent array should be float[N][2] for the same N. These arrays will be cloned to set the internal vertex and tangent data.

Does nothing if the preconditions fail.

Fires property change: SET_VERTEX_TANGENT.

Parameters:
vertex - the vertex data
tangent - the tangent data

setVertexTangentData

public final void setVertexTangentData(float[][] vertex_tangent)

Sets the vertex and tangent data of the shape using a 2-dimensional array of single precision numbers and makes a new path.

Conceptually, each row of the array should contain 4 items (x, y, dx, dy).

Preconditions:

If the given vertex_tangent array is null then the internal vertex and tangent arrays are set to float[0][2].

Does nothing if the preconditions fail.

Fires property change: SET_VERTEX_TANGENT.

Parameters:
vertex_tangent - the combined vertex and tangent data

setVertex

public final void setVertex(int index,
                            float x,
                            float y)

Sets the vertex at the given index to the given point coordinates and makes a new path.

Does nothing if the index is not in [0, vertex.length).

Does not change the tangent data.

Fires property change: SET_VERTEX.

Parameters:
index - the vertex index
x - the new x-coordinate for the vertex
y - the new y-coordinate for the vertex

setVertex

public final void setVertex(int index,
                            float[] point)

Sets the vertex at the given index to the given point and makes a new path.

Does nothing if the index is not in [0, vertex.length).

Does nothing if point is not float[2].

Does not change the tangent data.

Fires property change: SET_VERTEX.

Parameters:
index - the vertex index
point - the new position for the vertex

setTangent

public final void setTangent(int index,
                             float dx,
                             float dy)

Sets the tangent at the given index to the given displacement coordinates and makes a new path.

Does nothing if the index is not in [0, vertex.length).

Does not change the vertex data.

Fires property change: SET_TANGENT.

Parameters:
index - the tangent index
dx - the new x-coordinate for the displacement
dy - the new y-coordinate for the displacement

setTangent

public final void setTangent(int index,
                             float[] delta)

Sets the tangent at the given index to the given displacement and makes a new path.

Does nothing if the index is not in [0, vertex.length).

Does nothing if delta is not float[2].

Does not change the vertex data.

Fires property change: SET_TANGENT.

Parameters:
index - the tangent index
delta - the new displacement for the tangent

setTangentViaControlA

public final void setTangentViaControlA(int index,
                                        float x,
                                        float y)

Sets the tangent at the given index using the given coordinates for the ahead control point and makes a new path.

Subtracts ((x,y) - vertex) at the given index to set the tangent coordinates.

Does nothing if the index is not in [0, vertex.length).

Does not change the vertex data.

Fires property change: SET_TANGENT.

Parameters:
index - the tangent index
x - the new x-coordinate for the ahead control point
y - the new y-coordinate for the ahead control point

setTangentViaControlA

public final void setTangentViaControlA(int index,
                                        float[] control)

Sets the tangent at the given index to using the given ahead control point and makes a new path.

Subtracts (control - vertex) at the given index to set the tangent coordinates.

Does nothing if the index is not in [0, vertex.length).

Does nothing if control is not float[2].

Does not change the vertex data.

Fires property change: SET_TANGENT.

Parameters:
index - the tangent index
control - the ahead control point

setTangentViaControlB

public final void setTangentViaControlB(int index,
                                        float x,
                                        float y)

Sets the tangent at the given index using the given coordinates for the behind control point and makes a new path.

Subtracts (vertex - (x,y)) at the given index to set the tangent coordinates.

Does nothing if the index is not in [0, vertex.length).

Does not change the vertex data.

Fires property change: SET_TANGENT.

Parameters:
index - the tangent index
x - the new x-coordinate for the behind control point
y - the new y-coordinate for the behind control point

setTangentViaControlB

public final void setTangentViaControlB(int index,
                                        float[] control)

Sets the tangent at the given index to using the given behind control point and makes a new path.

Subtracts (vertex - control) at the given index to set the tangent coordinates.

Does nothing if the index is not in [0, vertex.length).

Does nothing if control is not float[2].

Does not change the vertex data.

Fires property change: SET_TANGENT.

Parameters:
index - the tangent index
control - the behind control point

setVertexTangent

public final void setVertexTangent(int index,
                                   float x,
                                   float y,
                                   float dx,
                                   float dy)

Sets the vertex and tangent at the given index to the given point and displacement coordinates and makes a new path.

Does nothing if the index is not in [0, vertex.length).

Fires property change: SET_VERTEX_TANGENT.

Parameters:
index - the vertex/tangent index
x - the new x-coordinate for the vertex
y - the new y-coordinate for the vertex
dx - the new x-coordinate for the displacement
dy - the new y-coordinate for the displacement

setVertexTangent

public final void setVertexTangent(int index,
                                   float[] point,
                                   float[] delta)

Sets the vertex and tangent at the given index using the given point and delta arrays and makes a new path.

Conceptually, the point array should contain 2 items (x, y) and the delta array 2 items (dx, dy).

Does nothing if the index is not in [0, vertex.length).

Does nothing if the arrays are not float[2].

Fires property change: SET_VERTEX_TANGENT.

Parameters:
index - the vertex/tangent index
point - the array with x, y
delta - the array with dx, dy

setVertexTangent

public final void setVertexTangent(int index,
                                   float[] array)

Sets the vertex and tangent at the given index to the given array of point and displacement coordinates and makes a new path.

Conceptually, the array should contain 4 items (x, y, dx, dy).

Does nothing if the index is not in [0, vertex.length).

Does nothing if the array is not float[4].

Fires property change: SET_VERTEX_TANGENT.

Parameters:
index - the vertex/tangent index
array - the array with x, y, dx, dy

addVertexTangent

public final void addVertexTangent(int index,
                                   float x,
                                   float y,
                                   float dx,
                                   float dy)

Adds a new vertex and tangent at the given index with the given point and displacement coordinates x, y, dx, dy.

If index is 0, the insertion is at the front.

If index is vertex.length, the insertion is at the end.

Forces the given index into the range:

  0 <= index <= vertex.length

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
index - the vertex/tangent index
x - the x-coordinate for the vertex
y - the y-coordinate for the vertex
dx - the x-coordinate for the tangent
dy - the y-coordinate for the tangent

addVertexTangent

public final void addVertexTangent(int index,
                                   float[] point,
                                   float[] delta)

Adds a new vertex and tangent at the given index using the given point and delta arrays and makes a new path.

Conceptually, the point array should contain 2 items (x, y) and the delta array 2 items (dx, dy).

If index is 0, the insertion is at the front.

If index is vertex.length, the insertion is at the end.

Forces the given index into the range:

  0 <= index <= vertex.length

Does nothing if the arrays are not float[2].

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
index - the vertex/tangent index
point - the array with x, y
delta - the array with dx, dy

addVertexTangent

public final void addVertexTangent(int index,
                                   float[] array)

Adds a new vertex and tangent at the given index with the given array of point and displacement coordinates and makes a new path.

Conceptually, the array should contain 4 items (x, y, dx, dy).

If index is 0, the insertion is at the front.

If index is vertex.length, the insertion is at the end.

Forces the given index into the range:

  0 <= index <= vertex.length

Does nothing if array is not float[4].

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
index - the vertex index
array - the array with x, y, dx, dy

addVerticesTangents

public final void addVerticesTangents(int index,
                                      float[][] points,
                                      float[][] deltas)

Adds a new sequence of vertices and tangents at the given index using copies of the given points and deltas and then makes a new path.

If index is 0, the insertion is at the front.

If index is vertex.length, the insertion is at the end.

Forces the given index into the range:

  0 <= index <= vertex.length

Does nothing if the given arrays are null or do not have the form float[K][2] for the same K.

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
index - the start index
points - the new vertices to add
deltas - the new tangents to add

addVerticesTangents

public final void addVerticesTangents(int index,
                                      float[][] array)

Adds a new sequence of vertices and tangents at the given index extracting data from the given array of type float[K][4] and then makes a new path.

Conceptually, the each row of the array should contain 4 items (x, y, dx, dy).

If index is 0, the insertion is at the front.

If index is vertex.length, the insertion is at the end.

Forces the given index into the range:

  0 <= index <= vertex.length

Does nothing if the given array is null or does not have the form float[K][4].

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
index - the start index
array - the new vertices and tangents to add

appendVertexTangent

public final void appendVertexTangent(float x,
                                      float y,
                                      float dx,
                                      float dy)

Appends a new vertex and tangent with the given point and displacement coordinates x, y, dx, dy.

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
x - the x-coordinate for the vertex
y - the y-coordinate for the vertex
dx - the x-coordinate for the tangent
dy - the y-coordinate for the tangent

appendVertexTangent

public final void appendVertexTangent(float[] point,
                                      float[] delta)

Appends a new vertex and tangent using the given point and delta arrays and makes a new path.

Conceptually, the point array should contain 2 items (x, y) and the delta array 2 items (dx, dy).

Does nothing if the arrays are not float[2].

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
point - the array with x, y
delta - the array with dx, dy

appendVertexTangent

public final void appendVertexTangent(float[] array)

Appends a new vertex and tangent with the given array of point and displacement coordinates and makes a new path.

Conceptually, the array should contain 4 items (x, y, dx, dy).

Does nothing if array is not float[4].

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
array - the array with x, y, dx, dy

appendVerticesTangents

public final void appendVerticesTangents(float[][] points,
                                         float[][] deltas)

Appends a new sequence of vertices and tangents using copies of the given points and deltas and then makes a new path.

Does nothing if the given arrays are null or do not have the form float[K][2] for the same K.

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
points - the new vertices to append
deltas - the new tangents to append

appendVerticesTangents

public final void appendVerticesTangents(float[][] array)

Appends a new sequence of vertices and tangents extracting data from the given array of type float[K][4] and then makes a new path.

Conceptually, the each row of the array should contain 4 items (x, y, dx, dy).

Does nothing if the given array is null or does not have the form float[K][4].

Fires property change: ADD_VERTEX_TANGENT.

Parameters:
array - the new vertices and tangents to append

removeVertexTangent

public final float[] removeVertexTangent(int index)

Removes the vertex/tangent at the given index, makes a new path, and returns an array with the data from the removed vertex/tangent as x, y, dx, dy.

If the index is not in [0, vertex.length) then removes nothing and returns null.

Fires property change: REMOVE_VERTEX_TANGENT.

Parameters:
index - the vertex index

removeVerticesTangents

public final float[][] removeVerticesTangents(int m,
                                              int n)

Removes the vertices and tangents starting at the given index m inclusive and ending at the given index n exclusive, makes a new path, and returns an array float[K][4] with the vertices and tangents that were removed.

Conceptually, the each row of the array returned should contain 4 items (x, y, dx, dy).

Forces m and n into range if needed.

Returns an array of length 0 if no nodes are removed.

Fires property change: REMOVE_VERTEX_TANGENT.

Parameters:
m - the starting index inclusive
n - the ending index exclusive

removeAllVerticesTangents

public final float[][] removeAllVerticesTangents()

Removes all vertices and tangents, makes a new path, and returns an array float[N][4] with the vertices and tangents that were removed.

Conceptually, the each row of the array returned should contain 4 items (x, y, dx, dy).

Fires property change: REMOVE_VERTEX_TANGENT.