This version of documentation is OUTDATED! Please switch to the latest one.

# Unigine::SplineGraph Class

This class is used to manage vertices and segments of spline graphs. UNIGINE's 3D spline system has a wide range of applications, particularly procedural content generation (rivers, roads, pipelines etc.). A spline graph is determined by a set of points p0, p1, ... pn and a set of segments (cubic Bezier splines), that connect some or all of these points.

Each segment is determined by the indices of the starting (pSTART) and ending (pEND) points and tangent vector coordinates at these points, which determine the form of the segment (t START and t END respectively).

Coordinates of the "up" vector are additionally stored for each point of the segment. You can specify this vector to define orientation of geometry or objects, that can be stretched or tiled along the segments of the spline graph. By default this vector is parallel to the Z axis. The "up" vector does not affect the form of the spline segment.

It is possible to obtain an interpolated value for any point belonging to a segment, this can be used for various purposes (e.g. to change road profile). Interpolated "up" vector can be calculated as follows (pseudocode):

Source code (C++)
``````vec3 lerpUpVector(vec3 start_up, vec3 end_up, float t) const
{
float angle = acos(dot(start_up, end_up)) * RAD2DEG;
vec3 rotation_axis = cross(start_up, end_up);

return rotateAxisAngle(rotation_axis, angle * t) * start_up;
}``````

• The C++ API sample <UnigineSDK>/data/samples/worlds/spline_graph_00 . It illustrates:

• Creation of a SplineGraph from scratch.
• Movement of a node along the segments of the SplineGraph.
• The WorldSplineGraph class article to learn how to generate geometry along a spline graph.
• The Spline File Format article to learn how the spline graph data is stored.

## static SplineGraphPtr create()

Default constructor. Creates an empty spline graph.

## static SplineGraphPtr create(const char * name)

Constructor. Creates an empty spline graph with a given name.

### Arguments

• const char * name - Spline graph name.

## static SplineGraphPtr create(const Ptr<SplineGraph> & graph)

Constructor. Creates a spline graph by copying a given source spline graph.

### Arguments

• const Ptr<SplineGraph> & graph - Source spline graph.

## floatgetLength(int index)

Retuns the length of the segment with a given index.

### Arguments

• int index - Segment index.

Segment length.

## intgetNumPoints()

Returns the total number of points in the spline graph.

### Return value

Number of points.

## intgetNumSegments()

Returns the total number of segments in the spline graph.

### Return value

Number of segments.

## intisOwner()

Returns the owner flag. If the pointer is the owner, on its deletion the spline graph also will be deleted. Use grab() and release() functions to change ownership

Owner flag.

## voidsetPoint(int index, const Math::vec3 & point)

Sets new coordinates for the point with a given index.

### Arguments

• int index - Point index.
• const Math::vec3 & point - New point coordinates.

## Math::vec3getPoint(int index)

Returns the coordinates of the point with a given index.

### Arguments

• int index - Point index.

### Return value

Point coordinates.

## Math::vec3getSegmentEndPoint(int index)

Returns the coordinates of the end point for the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

Segment end point coordinates.

## intgetSegmentEndPointIndex(int index)

Returns the index of the end point for the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

Segment end point index.

## voidsetSegmentEndTangent(int index, const Math::vec3 & tangent)

Sets the tangent coordinates for the end point of the segment with a given index.

### Arguments

• int index - Segment index.
• const Math::vec3 & tangent - End point tangent coordinates.

## Math::vec3getSegmentEndTangent(int index)

Returns the tangent coordinates for the end point of the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

End point tangent coordinates.

## voidsetSegmentEndUpVector(int index, const Math::vec3 & up)

Sets the "up" vector coordinates for the end point of the segment with a given index.

## Math::vec3getSegmentEndUpVector(int index)

Returns the "up" vector coordinates for the end point of the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

End point "up" vector coordinates.

## Math::vec3getSegmentStartPoint(int index)

Returns the coordinates of the start point for the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

Segment start point coordinates.

## intgetSegmentStartPointIndex(int index)

Returns the index of the end point for the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

Segment start point index.

## voidsetSegmentStartTangent(int index, const Math::vec3 & tangent)

Sets the tangent coordinates for the start point of the segment with a given index.

### Arguments

• int index - Segment index.
• const Math::vec3 & tangent - Start point tangent coordinates.

## Math::vec3getSegmentStartTangent(int index)

Returns the tangent coordinates for the start point of the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

Start point tangent coordinates.

## voidsetSegmentStartUpVector(int index, const Math::vec3 & up)

Sets the "up" vector coordinates for the start point of the segment with a given index.

## Math::vec3getSegmentStartUpVector(int index)

Returns the "up" vector coordinates for the start point of the segment with a given index.

### Arguments

• int index - Segment index.

### Return value

Start point "up" vector coordinates.

Adds a point with specified coordinates to the spline graph.

### Arguments

• const Math::vec3 & point - Point coordinates.

### Return value

Current number of points in the spline graph.

## intaddSegment(int start_index, const Math::vec3 & start_tangent, const Math::vec3 & start_up, int end_index, const Math::vec3 & end_tangent, const Math::vec3 & end_up)

Adds a segment to the spline graph.

### Arguments

• int start_index - Start point index.
• const Math::vec3 & start_tangent - Start point tangent coordinates.
• const Math::vec3 & start_up - Start point "up" vector coordinates.
• int end_index - End point index.
• const Math::vec3 & end_tangent - End point tangent coordinates.
• const Math::vec3 & end_up - End point "up" vector coordinates.

### Return value

Number of segments in the spline graph if a segment was addes successfully; otherwise, -1

## Math::vec3calcSegmentPoint(int index, float t)

Returns the coordinates of the point on the given segment.

### Arguments

• int index - Segment index.
• float t - Position of the point on the segment, in increments of the segment's length normalized to 1.

### Return value

Coordinates of the point on the given segment.

## Math::vec3calcSegmentTangent(int index, float t)

Returns the tangent coordinates for the point on the given segment.

### Arguments

• int index - Segment index.
• float t - Position of the point on the segment, in increments of the segment's length normalized to 1.

### Return value

Tangent coordinates for the point on the given segment.

## Math::vec3calcSegmentUpVector(int index, float t)

Returns the "up" vector coordinates for the point on the given segment.

### Arguments

• int index - Segment index.
• float t - Position of the point on the segment, in increments of the segment's length normalized to 1.

### Return value

"Up" vector coordinates for the point on the given segment.

## voidclear()

Clears the spline graph.

## voidgrab()

Grabs the spline graph (sets the owner flag to 1). The spline graph should not be handled by the engine after this function is called.

Loads the spline graph from the specified XML-file.

### Arguments

• const char * name - Name of the XML-file to load the spline graph from.

### Return value

1 if the spline graph was successfully loaded; otherwise, 0.

## voidrelease()

Releases the spline graph (sets the owner flag to 0). The spline graph should be handled by the engine after this function is called.

## voidremovePoint(int index)

Removes a point with a given index from the spline graph.
Notice
The segments having this point as a starting or ending one will also be removed from the spline graph.

### Arguments

• int index - Point index.

## voidremoveSegment(int index)

Removes the segment with a given index.

### Arguments

• int index - Segment index.

## intsave(const char * name)

Saves the spline graph to the specified XML-file.

### Arguments

• const char * name - Name of the XML-file to save the spline graph to.

### Return value

1 if the spline graph was successfully saved; otherwise, 0.
Last update: 2018-06-04