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