1/* graphene-vec4.h: 4-coords vector
2 *
3 * Copyright 2014 Emmanuele Bassi
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 * THE SOFTWARE.
22 */
23
24#pragma once
25
26#if !defined(GRAPHENE_H_INSIDE) && !defined(GRAPHENE_COMPILATION)
27#error "Only graphene.h can be included directly."
28#endif
29
30#include "graphene-types.h"
31
32GRAPHENE_BEGIN_DECLS
33
34/**
35 * graphene_vec4_t:
36 *
37 * A structure capable of holding a vector with four dimensions: x, y, z, and w.
38 *
39 * The contents of the #graphene_vec4_t structure are private and should
40 * never be accessed directly.
41 */
42struct _graphene_vec4_t
43{
44 /*< private >*/
45 GRAPHENE_ALIGNED_DECL (GRAPHENE_PRIVATE_FIELD (graphene_simd4f_t, value), 16);
46};
47
48GRAPHENE_AVAILABLE_IN_1_0
49graphene_vec4_t * graphene_vec4_alloc (void);
50GRAPHENE_AVAILABLE_IN_1_0
51void graphene_vec4_free (graphene_vec4_t *v);
52GRAPHENE_AVAILABLE_IN_1_0
53graphene_vec4_t * graphene_vec4_init (graphene_vec4_t *v,
54 float x,
55 float y,
56 float z,
57 float w);
58GRAPHENE_AVAILABLE_IN_1_0
59graphene_vec4_t * graphene_vec4_init_from_vec4 (graphene_vec4_t *v,
60 const graphene_vec4_t *src);
61GRAPHENE_AVAILABLE_IN_1_0
62graphene_vec4_t * graphene_vec4_init_from_vec3 (graphene_vec4_t *v,
63 const graphene_vec3_t *src,
64 float w);
65GRAPHENE_AVAILABLE_IN_1_0
66graphene_vec4_t * graphene_vec4_init_from_vec2 (graphene_vec4_t *v,
67 const graphene_vec2_t *src,
68 float z,
69 float w);
70GRAPHENE_AVAILABLE_IN_1_0
71graphene_vec4_t * graphene_vec4_init_from_float (graphene_vec4_t *v,
72 const float *src);
73GRAPHENE_AVAILABLE_IN_1_0
74void graphene_vec4_to_float (const graphene_vec4_t *v,
75 float *dest);
76GRAPHENE_AVAILABLE_IN_1_0
77void graphene_vec4_add (const graphene_vec4_t *a,
78 const graphene_vec4_t *b,
79 graphene_vec4_t *res);
80GRAPHENE_AVAILABLE_IN_1_0
81void graphene_vec4_subtract (const graphene_vec4_t *a,
82 const graphene_vec4_t *b,
83 graphene_vec4_t *res);
84GRAPHENE_AVAILABLE_IN_1_0
85void graphene_vec4_multiply (const graphene_vec4_t *a,
86 const graphene_vec4_t *b,
87 graphene_vec4_t *res);
88GRAPHENE_AVAILABLE_IN_1_0
89void graphene_vec4_divide (const graphene_vec4_t *a,
90 const graphene_vec4_t *b,
91 graphene_vec4_t *res);
92GRAPHENE_AVAILABLE_IN_1_0
93float graphene_vec4_dot (const graphene_vec4_t *a,
94 const graphene_vec4_t *b);
95GRAPHENE_AVAILABLE_IN_1_0
96float graphene_vec4_length (const graphene_vec4_t *v);
97GRAPHENE_AVAILABLE_IN_1_0
98void graphene_vec4_normalize (const graphene_vec4_t *v,
99 graphene_vec4_t *res);
100GRAPHENE_AVAILABLE_IN_1_2
101void graphene_vec4_scale (const graphene_vec4_t *v,
102 float factor,
103 graphene_vec4_t *res);
104GRAPHENE_AVAILABLE_IN_1_2
105void graphene_vec4_negate (const graphene_vec4_t *v,
106 graphene_vec4_t *res);
107GRAPHENE_AVAILABLE_IN_1_2
108bool graphene_vec4_equal (const graphene_vec4_t *v1,
109 const graphene_vec4_t *v2);
110GRAPHENE_AVAILABLE_IN_1_2
111bool graphene_vec4_near (const graphene_vec4_t *v1,
112 const graphene_vec4_t *v2,
113 float epsilon);
114
115GRAPHENE_AVAILABLE_IN_1_0
116void graphene_vec4_min (const graphene_vec4_t *a,
117 const graphene_vec4_t *b,
118 graphene_vec4_t *res);
119GRAPHENE_AVAILABLE_IN_1_0
120void graphene_vec4_max (const graphene_vec4_t *a,
121 const graphene_vec4_t *b,
122 graphene_vec4_t *res);
123GRAPHENE_AVAILABLE_IN_1_10
124void graphene_vec4_interpolate (const graphene_vec4_t *v1,
125 const graphene_vec4_t *v2,
126 double factor,
127 graphene_vec4_t *res);
128
129GRAPHENE_AVAILABLE_IN_1_0
130float graphene_vec4_get_x (const graphene_vec4_t *v);
131GRAPHENE_AVAILABLE_IN_1_0
132float graphene_vec4_get_y (const graphene_vec4_t *v);
133GRAPHENE_AVAILABLE_IN_1_0
134float graphene_vec4_get_z (const graphene_vec4_t *v);
135GRAPHENE_AVAILABLE_IN_1_0
136float graphene_vec4_get_w (const graphene_vec4_t *v);
137
138GRAPHENE_AVAILABLE_IN_1_0
139void graphene_vec4_get_xy (const graphene_vec4_t *v,
140 graphene_vec2_t *res);
141GRAPHENE_AVAILABLE_IN_1_0
142void graphene_vec4_get_xyz (const graphene_vec4_t *v,
143 graphene_vec3_t *res);
144
145GRAPHENE_AVAILABLE_IN_1_0
146const graphene_vec4_t * graphene_vec4_zero (void);
147GRAPHENE_AVAILABLE_IN_1_0
148const graphene_vec4_t * graphene_vec4_one (void);
149GRAPHENE_AVAILABLE_IN_1_0
150const graphene_vec4_t * graphene_vec4_x_axis (void);
151GRAPHENE_AVAILABLE_IN_1_0
152const graphene_vec4_t * graphene_vec4_y_axis (void);
153GRAPHENE_AVAILABLE_IN_1_0
154const graphene_vec4_t * graphene_vec4_z_axis (void);
155GRAPHENE_AVAILABLE_IN_1_0
156const graphene_vec4_t * graphene_vec4_w_axis (void);
157
158GRAPHENE_END_DECLS
159

source code of gtk/subprojects/graphene/include/graphene-vec4.h