# DynaValues and LWValues

The DynaValue data type defined in lwdyna.h is a union of containers for values of various base types. DynaValues are used as function arguments, with commands and requesters, for example, when the function must accept values of multiple types. LWValues are a variation on DynaValues used by Panels and defined in lwpanel.h.

The DynaValue typedef looks like this.

typedef union un_DynaValue { DynaType type; DyValString str; DyValInt intv; DyValFloat flt; DyValIVector ivec; DyValFVector fvec; DyValCustom cust; } DynaValue;

The elements of this union each support a different base type, and each base type can
underlie several DynaTypes. (Two DynaTypes, `DY_NULL`

and `DY_TEXT`

, have no
underlying value.)

### Strings

typedef struct st_DyValString { DY_STRING DynaType type; DY_SURFACE char *buf; int bufLen; } DyValString;

`bufLen`

is the size of `buf`

in characters. For the `DY_SURFACE`

type, `buf`

contains the surface name.

### Integers

typedef struct st_DyValInt { DY_INTEGER DynaType type; DY_BOOLEAN int value; DY_CHOICE int defVal; DY_FONT } DyValInt; DY_LAYERS

The value in `defVal`

is used by requesters to reset control values. The value
for `DY_CHOICE`

and `DY_FONT`

is a 0-based index into a list. The value for `DY_LAYERS`

is a set of bitfields corresponding to layer numbers.

### Floating-Point Numbers

typedef struct st_DyValFloat { DY_FLOAT DynaType type; DY_DISTANCE double value; double defVal; } DyValFloat;

`DY_DIST`

values are distances in meters.

### Integer Vectors

typedef struct st_DyValIVector { DY_VINT DynaType type; int val[3]; int defVal; } DyValIVector;

### Floating-Point Vectors

typedef struct st_DyValFVector { DY_VFLOAT DynaType type; DY_VDIST double val[3]; double defVal; } DyValFVector;

### Custom Values

typedef struct st_DyValCustom { DY_CUSTOM DynaType type; int val[4]; } DyValCustom;

`DY_CUSTOM`

is used to encode values that don't fit one of the standard types.
The interpretation of the values in the `val`

array will depend on the context in
which this type is used.

The Dynamic Conversion global provides a facility for converting between DynaValues of different types.

## LWValues

Panels adds a generic pointer type to the list of types, but in all other respects, LWValues differ from DynaValues in name only. Structurally they're equivalent.

typedef union un_LWValue { LWType type; LWValString str; LWValInt intv; LWValFloat flt; LWValIVector ivec; LWValFVector fvec; LWValPointer ptr; LWValCustom cust; } LWValue;

Although lwpanel.h defines others, only five LWTypes are needed to describe the values of all LWPanels controls.

LWT_STRING LWT_INTEGER LWT_FLOAT LWT_VINT LWT_VFLOAT