| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- Getting Started
- ================================
- Types:
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- **cglm** uses **glm** prefix for all functions e.g. glm_lookat. You can see supported types in common header file:
- .. code-block:: c
- :linenos:
- typedef float vec3[3];
- typedef int ivec3[3];
- typedef CGLM_ALIGN(16) float vec4[4];
- typedef vec3 mat3[3];
- typedef vec4 mat4[4];
- typedef vec4 versor;
- As you can see types don't store extra informations in favor of space.
- You can send these values e.g. matrix to OpenGL directly without casting or calling a function like *value_ptr*
- Aligment is Required:
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- **vec4** and **mat4** requires 16 byte aligment because vec4 and mat4 operations are
- vectorized by SIMD instructions (SSE/AVX).
- Allocations:
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *cglm* doesn't alloc any memory on heap. So it doesn't provide any allocator.
- You must allocate memory yourself. You should alloc memory for out parameters too if you pass pointer of memory location.
- When allocating memory don't forget that **vec4** and **mat4** requires aligment.
- **NOTE:** Unaligned vec4 and unaligned mat4 operations will be supported in the future. Check todo list.
- Because you may want to multiply a CGLM matrix with external matrix.
- There is no guarantee that non-CGLM matrix is aligned. Unaligned types will have *u* prefix e.g. **umat4**
- Array vs Struct:
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *cglm* uses arrays for vector and matrix types. So you can't access individual
- elements like vec.x, vec.y, vec.z... You must use subscript to access vector elements
- e.g. vec[0], vec[1], vec[2].
- Also I think it is more meaningful to access matrix elements with subscript
- e.g **matrix[2][3]** instead of **matrix._23**. Since matrix is array of vectors,
- vectors are also defined as array. This makes types homogeneous.
- **Return arrays?**
- Since C doesn't support return arrays, cglm also doesn't support this feature.
- Function design:
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- .. image:: cglm-intro.png
- :width: 492px
- :height: 297px
- :align: center
- cglm provides a few way to call a function to do same operation.
- * Inline - *glm_, glm_u*
- * Pre-compiled - *glmc_, glmc_u*
- For instance **glm_mat4_mul** is inline (all *glm_* functions are inline), to make it non-inline (pre-compiled),
- call it as **glmc_mat4_mul** from library, to use unaligned version use **glm_umat4_mul** (todo).
- Most functions have **dest** parameter for output. For instance mat4_mul func looks like this:
- .. code-block:: c
- CGLM_INLINE
- void
- glm_mat4_mul(mat4 m1, mat4 m2, mat4 dest)
- The dest parameter is out parameter. Result will be stored in **dest**.
- Also in this case matrix multiplication order is dest = m1 * m2.
- * Changing parameter order will change the multiplication order.
- * You can pass all parameter same (this is similar to m1 `*=` m1), you can pass **dest** as m1 or m2 (this is similar to m1 `*=` m2)
- **v** postfix in function names
- -------------------------------
- You may see **v** postfix in some function names, v stands for vector.
- For instance consider a function that accepts three parameters x, y, z.
- This function may be overloaded by **v** postfix to accept vector (vec3) instead of separate parameters.
- In some places the v means that it will be apply to a vector.
- **_to** postfix in function names
- ---------------------------------
- *_to* version of function will store the result in specified parameter instead of in-out parameter.
- Some functions don't have _to prefix but they still behave like this e.g. glm_mat4_mul.
|