scs-sdk/include/scssdk_value.h

248 lines
6 KiB
C
Raw Permalink Normal View History

2023-04-29 05:19:39 +08:00
/**
* @file scssdk_value.h
*
* @brief Structures representing varying type values in the SDK.
*/
#ifndef SCSSDK_VALUE_H
#define SCSSDK_VALUE_H
#include "scssdk.h"
SCSSDK_HEADER
typedef scs_u32_t scs_value_type_t;
const scs_value_type_t SCS_VALUE_TYPE_INVALID = 0;
const scs_value_type_t SCS_VALUE_TYPE_bool = 1;
const scs_value_type_t SCS_VALUE_TYPE_s32 = 2;
const scs_value_type_t SCS_VALUE_TYPE_u32 = 3;
const scs_value_type_t SCS_VALUE_TYPE_u64 = 4;
const scs_value_type_t SCS_VALUE_TYPE_float = 5;
const scs_value_type_t SCS_VALUE_TYPE_double = 6;
const scs_value_type_t SCS_VALUE_TYPE_fvector = 7;
const scs_value_type_t SCS_VALUE_TYPE_dvector = 8;
const scs_value_type_t SCS_VALUE_TYPE_euler = 9;
const scs_value_type_t SCS_VALUE_TYPE_fplacement = 10;
const scs_value_type_t SCS_VALUE_TYPE_dplacement = 11;
const scs_value_type_t SCS_VALUE_TYPE_string = 12;
const scs_value_type_t SCS_VALUE_TYPE_s64 = 13;
const scs_value_type_t SCS_VALUE_TYPE_LAST = SCS_VALUE_TYPE_s64;
/**
* @name Simple data types.
*/
//@{
struct scs_value_bool_t
{
scs_u8_t value; //< Nonzero value is true, zero false.
};
struct scs_value_s32_t
{
scs_s32_t value;
};
struct scs_value_u32_t
{
scs_u32_t value;
};
struct scs_value_u64_t
{
scs_u64_t value;
};
struct scs_value_s64_t
{
scs_s64_t value;
};
struct scs_value_float_t
{
scs_float_t value;
};
struct scs_value_double_t
{
scs_double_t value;
};
//@}
/**
* @brief String value.
*
* The provided value is UTF8 encoded however in some documented
* cases only limited ASCII compatible subset might be present.
*
* The pointer is never NULL.
*/
struct scs_value_string_t
{
scs_string_t value;
};
/**
* @name Vector types.
*
* In local space the X points to right, Y up and Z backwards.
* In world space the X points to east, Y up and Z south.
*/
//@{
struct scs_value_fvector_t
{
scs_float_t x;
scs_float_t y;
scs_float_t z;
};
struct scs_value_dvector_t
{
scs_double_t x;
scs_double_t y;
scs_double_t z;
};
//@}
/**
* @brief Orientation of object.
*/
struct scs_value_euler_t
{
/**
* @brief Heading.
*
* Stored in unit range where <0,1) corresponds to <0,360).
*
* The angle is measured counterclockwise in horizontal plane when looking
* from top where 0 corresponds to forward (north), 0.25 to left (west),
* 0.5 to backward (south) and 0.75 to right (east).
*/
scs_float_t heading;
/**
* @brief Pitch
*
* Stored in unit range where <-0.25,0.25> corresponds to <-90,90>.
*
* The pitch angle is zero when in horizontal direction,
* with positive values pointing up (0.25 directly to zenith),
* and negative values pointing down (-0.25 directly to nadir).
*/
scs_float_t pitch;
/**
* @brief Roll
*
* Stored in unit range where <-0.5,0.5> corresponds to <-180,180>.
*
* The angle is measured in counterclockwise when looking in direction of
* the roll axis.
*/
scs_float_t roll;
};
/**
* @name Combination of position and orientation.
*/
//@{
struct scs_value_fplacement_t
{
scs_value_fvector_t position;
scs_value_euler_t orientation;
};
struct scs_value_dplacement_t
{
scs_value_dvector_t position;
scs_value_euler_t orientation;
scs_u32_t _padding; // Explicit padding.
};
//@}
/**
* @brief Varying type storage for values.
*/
struct scs_value_t
{
/**
* @brief Type of the value.
*/
scs_value_type_t type;
/**
* @brief Explicit alignment for the union.
*/
scs_u32_t _padding;
/**
* @brief Storage.
*/
union {
scs_value_bool_t value_bool;
scs_value_s32_t value_s32;
scs_value_u32_t value_u32;
scs_value_u64_t value_u64;
scs_value_s64_t value_s64;
scs_value_float_t value_float;
scs_value_double_t value_double;
scs_value_fvector_t value_fvector;
scs_value_dvector_t value_dvector;
scs_value_euler_t value_euler;
scs_value_fplacement_t value_fplacement;
scs_value_dplacement_t value_dplacement;
scs_value_string_t value_string;
};
};
scs_check_size(scs_value_s32_t, 4, 4);
scs_check_size(scs_value_u32_t, 4, 4);
scs_check_size(scs_value_u64_t, 8, 8);
scs_check_size(scs_value_s64_t, 8, 8);
scs_check_size(scs_value_float_t, 4, 4);
scs_check_size(scs_value_double_t, 8, 8);
scs_check_size(scs_value_fvector_t, 12, 12);
scs_check_size(scs_value_dvector_t, 24, 24);
scs_check_size(scs_value_fplacement_t, 24, 24);
scs_check_size(scs_value_dplacement_t, 40, 40);
scs_check_size(scs_value_string_t, 4, 8);
scs_check_size(scs_value_t, 48, 48);
/**
* @brief Combination of value and its name.
*/
struct scs_named_value_t
{
/**
* @brief Name of this value.
*
* ASCII subset of UTF-8.
*/
scs_string_t name;
/**
* @brief Zero-based index of the value for array-like values.
*
* For non-array values it is set to SCS_U32_NIL.
*/
scs_u32_t index;
#ifdef SCS_ARCHITECTURE_x64
/**
* @brief Explicit 8-byte alignment for the value part.
*/
scs_u32_t _padding;
#endif
/**
* @brief The value itself.
*/
scs_value_t value;
};
scs_check_size(scs_named_value_t, 56, 64);
SCSSDK_FOOTER
#endif // SCSSDK_VALUE_H
/* eof */