---
name: "dtk_create_complex_shape"
section: "3"
platform: "linux"
package: "libdrawtk-dev"
version: "2.0-2.1"
release: "Debian 8 (Jessie)"
platforms: ["linux"]
url: "https://new.carta.tech/dtk_create_complex_shape"
---

# dtk\_create\_complex\_shape(3)

Creates or modify a shape to display custom and evolving content

## NAME

dtk\_create\_complex\_shape - Creates or modify a shape to display custom and evolving content

## SYNOPSIS

**#include \<drawtk.h\>**

**dtk\_hshape dtk\_create\_complex\_shape(dtk\_hshape** *shp***,**\
                     **unsigned int** *nvert***, const float \****vertpos***,**\
                     **const float \****vertcolor***, const float \****texcoords***,**\
                     **unsigned int** *nind***, const unsigned int \****ind***,**\
                     **unsigned int** *type***, dtk\_htex** *tex***);**\

## DESCRIPTION

**dtk\_create\_complex\_shape**() creates a shape displaying a complex, custom and possibly evolving content described by vertex attribute buffers (*vertpos*, *vertcolor* and *texcoords*) and an array *ind* containing the indices of vertices whose order describes how to connect the vertices altogether in order to form primitives (controlled by *type*). *tex* can be used to specify a texture to be mapped onto the shape.

*vertpos* should point to an array of *nvert* pairs of float values corresponding of the position (x,y) of each vertex. *vertcolor* should point to an array of *nvert* quatuples of float values corresponding of the color (R,G,B,A) of each vertex. *texcoords* can be either **NULL** or can point to an array of *nvert* pairs of float values corresponding to the texture coordinates (u,v) of the vertex. If *texcoords* is **NULL**, no texture will be used even if *tex* is  not null.

*ind* should point to an array of *nind* indices of the vertices in the vertex attribute buffers. This list of indices determines how the vertices form the primitives and depends on *type* zhich can take one the following value (See OpenGL manual to have detail):

- **DTK\_TRIANGLE\_STRIP**

  The first three vertices defines the first triangle (and their order is significant). Each subsequent vertex defines a new triangle using that point along with two vertices from the previous triangle.

- **DTK\_TRIANGLE\_FAN**

  A triangle fan is the same as a triangle strip with one exception: the first vertex of the list is always the first vertex of each triangle.

- **DTK\_TRIANGLES**

  Separate triangles are specified. Every 3 indices defines in the order a triangle. If *nind* is not a multiple of 3, the excedent 1 or 2 indices  are ignored.

- **DTK\_LINE\_STRIP**

  A series of one or more connected line segments is specified by enclosing a series of two or more endpoints. In this case, the ith index specifies the end point of the i-1st segment and the start point of the ith  segment.

- **DTK\_LINES**

  Individual line segments, each specified by a pair of vertices. If *nind* is odd, then the last index is ignored.

*shp* can be used to modify a previously created shape. If it is non-null, the handle will be used to modify the shape referenced by *shp*: no new shape is created and the returned value is ensured to be *shp* in case of success, *NULL* otherwise. If *shp* is *NULL*, the function will attempt to create a new shape.

The arrays *vertpos*, *vertcolor*, *texcoords* and *ind* are not copied into internal structures of the created shape. This allows one to dynamically change any aspect of the shape. However, in return it forces to **keep the buffers allocated during the whole life time of the shape**.

## RETURN VALUE

In case of success the function returns the handle to the newly created or modified shape. If the *shp* argument is non-null, the handle returned is the same value. In case of error, *NULL* is returned.

## THREAD SAFETY

The data contained into the buffers are accessed only during the creation and the draw of the shape. So if the data is updated in a different thread than the one used for drawing, some locking is needed.

## SEE ALSO

[**dtk\_create\_shape**(3)](/dtk_create_shape/3.md)
