1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.renderscript;
18 
19 /**
20  * Vector version of the basic float type.
21  * Provides four float fields packed.
22  */
23 public class Float4 {
24     public float x;
25     public float y;
26     public float z;
27     public float w;
28 
Float4()29     public Float4() {
30     }
31     /** @hide */
Float4(Float4 data)32     public Float4(Float4 data) {
33         this.x = data.x;
34         this.y = data.y;
35         this.z = data.z;
36         this.w = data.w;
37     }
38 
Float4(float x, float y, float z, float w)39     public Float4(float x, float y, float z, float w) {
40         this.x = x;
41         this.y = y;
42         this.z = z;
43         this.w = w;
44     }
45 
46     /** @hide
47      * Vector add
48      *
49      * @param a
50      * @param b
51      * @return
52      */
add(Float4 a, Float4 b)53     public static Float4 add(Float4 a, Float4 b) {
54         Float4 res = new Float4();
55         res.x = a.x + b.x;
56         res.y = a.y + b.y;
57         res.z = a.z + b.z;
58         res.w = a.w + b.w;
59 
60         return res;
61     }
62 
63     /** @hide
64      * Vector add
65      *
66      * @param value
67      */
add(Float4 value)68     public void add(Float4 value) {
69         x += value.x;
70         y += value.y;
71         z += value.z;
72         w += value.w;
73     }
74 
75     /** @hide
76      * Vector add
77      *
78      * @param value
79      */
add(float value)80     public void add(float value) {
81         x += value;
82         y += value;
83         z += value;
84         w += value;
85     }
86 
87     /** @hide
88      * Vector add
89      *
90      * @param a
91      * @param b
92      * @return
93      */
add(Float4 a, float b)94     public static Float4 add(Float4 a, float b) {
95         Float4 res = new Float4();
96         res.x = a.x + b;
97         res.y = a.y + b;
98         res.z = a.z + b;
99         res.w = a.w + b;
100 
101         return res;
102     }
103 
104     /** @hide
105      * Vector subtraction
106      *
107      * @param value
108      */
sub(Float4 value)109     public void sub(Float4 value) {
110         x -= value.x;
111         y -= value.y;
112         z -= value.z;
113         w -= value.w;
114     }
115 
116     /** @hide
117      * Vector subtraction
118      *
119      * @param value
120      */
sub(float value)121     public void sub(float value) {
122         x -= value;
123         y -= value;
124         z -= value;
125         w -= value;
126     }
127 
128     /** @hide
129      * Vector subtraction
130      *
131      * @param a
132      * @param b
133      * @return
134      */
sub(Float4 a, float b)135     public static Float4 sub(Float4 a, float b) {
136         Float4 res = new Float4();
137         res.x = a.x - b;
138         res.y = a.y - b;
139         res.z = a.z - b;
140         res.w = a.w - b;
141 
142         return res;
143     }
144 
145     /** @hide
146      * Vector subtraction
147      *
148      * @param a
149      * @param b
150      * @return
151      */
sub(Float4 a, Float4 b)152     public static Float4 sub(Float4 a, Float4 b) {
153         Float4 res = new Float4();
154         res.x = a.x - b.x;
155         res.y = a.y - b.y;
156         res.z = a.z - b.z;
157         res.w = a.w - b.w;
158 
159         return res;
160     }
161 
162     /** @hide
163      * Vector multiplication
164      *
165      * @param value
166      */
mul(Float4 value)167     public void mul(Float4 value) {
168         x *= value.x;
169         y *= value.y;
170         z *= value.z;
171         w *= value.w;
172     }
173 
174     /** @hide
175      * Vector multiplication
176      *
177      * @param value
178      */
mul(float value)179     public void mul(float value) {
180         x *= value;
181         y *= value;
182         z *= value;
183         w *= value;
184     }
185 
186     /** @hide
187      * Vector multiplication
188      *
189      * @param a
190      * @param b
191      * @return
192      */
mul(Float4 a, Float4 b)193     public static Float4 mul(Float4 a, Float4 b) {
194         Float4 res = new Float4();
195         res.x = a.x * b.x;
196         res.y = a.y * b.y;
197         res.z = a.z * b.z;
198         res.w = a.w * b.w;
199 
200         return res;
201     }
202 
203     /** @hide
204      * Vector multiplication
205      *
206      * @param a
207      * @param b
208      * @return
209      */
mul(Float4 a, float b)210     public static Float4 mul(Float4 a, float b) {
211         Float4 res = new Float4();
212         res.x = a.x * b;
213         res.y = a.y * b;
214         res.z = a.z * b;
215         res.w = a.w * b;
216 
217         return res;
218     }
219 
220     /** @hide
221      * Vector division
222      *
223      * @param value
224      */
div(Float4 value)225     public void div(Float4 value) {
226         x /= value.x;
227         y /= value.y;
228         z /= value.z;
229         w /= value.w;
230     }
231 
232     /** @hide
233      * Vector division
234      *
235      * @param value
236      */
div(float value)237     public void div(float value) {
238         x /= value;
239         y /= value;
240         z /= value;
241         w /= value;
242     }
243 
244     /** @hide
245      * Vector division
246      *
247      * @param a
248      * @param b
249      * @return
250      */
div(Float4 a, float b)251     public static Float4 div(Float4 a, float b) {
252         Float4 res = new Float4();
253         res.x = a.x / b;
254         res.y = a.y / b;
255         res.z = a.z / b;
256         res.w = a.w / b;
257 
258         return res;
259     }
260 
261     /** @hide
262      * Vector division
263      *
264      * @param a
265      * @param b
266      * @return
267      */
div(Float4 a, Float4 b)268     public static Float4 div(Float4 a, Float4 b) {
269         Float4 res = new Float4();
270         res.x = a.x / b.x;
271         res.y = a.y / b.y;
272         res.z = a.z / b.z;
273         res.w = a.w / b.w;
274 
275         return res;
276     }
277 
278     /** @hide
279      * Vector dot Product
280      *
281      * @param a
282      * @return
283      */
dotProduct(Float4 a)284     public float dotProduct(Float4 a) {
285         return (x * a.x) + (y * a.y) + (z * a.z) + (w * a.w);
286     }
287 
288     /** @hide
289      * Vector dot Product
290      *
291      * @param a
292      * @param b
293      * @return
294      */
dotProduct(Float4 a, Float4 b)295     public static float dotProduct(Float4 a, Float4 b) {
296         return (b.x * a.x) + (b.y * a.y) + (b.z * a.z) + (b.w * a.w);
297     }
298 
299     /** @hide
300      * Vector add Multiple
301      *
302      * @param a
303      * @param factor
304      */
addMultiple(Float4 a, float factor)305     public void addMultiple(Float4 a, float factor) {
306         x += a.x * factor;
307         y += a.y * factor;
308         z += a.z * factor;
309         w += a.w * factor;
310     }
311 
312     /** @hide
313      * set vector value by float4
314      *
315      * @param a
316      */
set(Float4 a)317     public void set(Float4 a) {
318         this.x = a.x;
319         this.y = a.y;
320         this.z = a.z;
321         this.w = a.w;
322     }
323 
324     /** @hide
325      * set vector negate
326      */
negate()327     public void negate() {
328         x = -x;
329         y = -y;
330         z = -z;
331         w = -w;
332     }
333 
334     /** @hide
335      * get vector length
336      *
337      * @return
338      */
length()339     public int length() {
340         return 4;
341     }
342 
343     /** @hide
344      * return the element sum of vector
345      *
346      * @return
347      */
elementSum()348     public float elementSum() {
349         return x + y + z + w;
350     }
351 
352     /** @hide
353      * get the vector field value by index
354      *
355      * @param i
356      * @return
357      */
get(int i)358     public float get(int i) {
359         switch (i) {
360         case 0:
361             return x;
362         case 1:
363             return y;
364         case 2:
365             return z;
366         case 3:
367             return w;
368         default:
369             throw new IndexOutOfBoundsException("Index: i");
370         }
371     }
372 
373     /** @hide
374      * set the vector field value by index
375      *
376      * @param i
377      * @param value
378      */
setAt(int i, float value)379     public void setAt(int i, float value) {
380         switch (i) {
381         case 0:
382             x = value;
383             return;
384         case 1:
385             y = value;
386             return;
387         case 2:
388             z = value;
389             return;
390         case 3:
391             w = value;
392             return;
393         default:
394             throw new IndexOutOfBoundsException("Index: i");
395         }
396     }
397 
398     /** @hide
399      * add the vector field value by index
400      *
401      * @param i
402      * @param value
403      */
addAt(int i, float value)404     public void addAt(int i, float value) {
405         switch (i) {
406         case 0:
407             x += value;
408             return;
409         case 1:
410             y += value;
411             return;
412         case 2:
413             z += value;
414             return;
415         case 3:
416             w += value;
417             return;
418         default:
419             throw new IndexOutOfBoundsException("Index: i");
420         }
421     }
422 
423     /** @hide
424      * set the vector field value
425      *
426      * @param x
427      * @param y
428      * @param z
429      * @param w
430      */
setValues(float x, float y, float z, float w)431     public void setValues(float x, float y, float z, float w) {
432         this.x = x;
433         this.y = y;
434         this.z = z;
435         this.w = w;
436     }
437 
438     /** @hide
439      * copy the vector to float array
440      *
441      * @param data
442      * @param offset
443      */
copyTo(float[] data, int offset)444     public void copyTo(float[] data, int offset) {
445         data[offset] = x;
446         data[offset + 1] = y;
447         data[offset + 2] = z;
448         data[offset + 3] = w;
449     }
450 }
451