1*d86ed7fbStbbdev /*
2*d86ed7fbStbbdev     Copyright (c) 2005-2020 Intel Corporation
3*d86ed7fbStbbdev 
4*d86ed7fbStbbdev     Licensed under the Apache License, Version 2.0 (the "License");
5*d86ed7fbStbbdev     you may not use this file except in compliance with the License.
6*d86ed7fbStbbdev     You may obtain a copy of the License at
7*d86ed7fbStbbdev 
8*d86ed7fbStbbdev         http://www.apache.org/licenses/LICENSE-2.0
9*d86ed7fbStbbdev 
10*d86ed7fbStbbdev     Unless required by applicable law or agreed to in writing, software
11*d86ed7fbStbbdev     distributed under the License is distributed on an "AS IS" BASIS,
12*d86ed7fbStbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d86ed7fbStbbdev     See the License for the specific language governing permissions and
14*d86ed7fbStbbdev     limitations under the License.
15*d86ed7fbStbbdev */
16*d86ed7fbStbbdev 
17*d86ed7fbStbbdev /*
18*d86ed7fbStbbdev     The original source for this example is
19*d86ed7fbStbbdev     Copyright (c) 1994-2008 John E. Stone
20*d86ed7fbStbbdev     All rights reserved.
21*d86ed7fbStbbdev 
22*d86ed7fbStbbdev     Redistribution and use in source and binary forms, with or without
23*d86ed7fbStbbdev     modification, are permitted provided that the following conditions
24*d86ed7fbStbbdev     are met:
25*d86ed7fbStbbdev     1. Redistributions of source code must retain the above copyright
26*d86ed7fbStbbdev        notice, this list of conditions and the following disclaimer.
27*d86ed7fbStbbdev     2. Redistributions in binary form must reproduce the above copyright
28*d86ed7fbStbbdev        notice, this list of conditions and the following disclaimer in the
29*d86ed7fbStbbdev        documentation and/or other materials provided with the distribution.
30*d86ed7fbStbbdev     3. The name of the author may not be used to endorse or promote products
31*d86ed7fbStbbdev        derived from this software without specific prior written permission.
32*d86ed7fbStbbdev 
33*d86ed7fbStbbdev     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
34*d86ed7fbStbbdev     OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35*d86ed7fbStbbdev     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36*d86ed7fbStbbdev     ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37*d86ed7fbStbbdev     DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
38*d86ed7fbStbbdev     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39*d86ed7fbStbbdev     OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40*d86ed7fbStbbdev     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41*d86ed7fbStbbdev     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42*d86ed7fbStbbdev     OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43*d86ed7fbStbbdev     SUCH DAMAGE.
44*d86ed7fbStbbdev */
45*d86ed7fbStbbdev 
46*d86ed7fbStbbdev /*
47*d86ed7fbStbbdev  * vector.cpp - This file contains all of the vector arithmetic functions.
48*d86ed7fbStbbdev  */
49*d86ed7fbStbbdev 
50*d86ed7fbStbbdev #include "machine.hpp"
51*d86ed7fbStbbdev #include "types.hpp"
52*d86ed7fbStbbdev #include "macros.hpp"
53*d86ed7fbStbbdev 
54*d86ed7fbStbbdev flt VDot(vector *a, vector *b) {
55*d86ed7fbStbbdev     return (a->x * b->x + a->y * b->y + a->z * b->z);
56*d86ed7fbStbbdev }
57*d86ed7fbStbbdev 
58*d86ed7fbStbbdev void VCross(vector *a, vector *b, vector *c) {
59*d86ed7fbStbbdev     c->x = (a->y * b->z) - (a->z * b->y);
60*d86ed7fbStbbdev     c->y = (a->z * b->x) - (a->x * b->z);
61*d86ed7fbStbbdev     c->z = (a->x * b->y) - (a->y * b->x);
62*d86ed7fbStbbdev }
63*d86ed7fbStbbdev 
64*d86ed7fbStbbdev flt VLength(vector *a) {
65*d86ed7fbStbbdev     return (flt)sqrt((a->x * a->x) + (a->y * a->y) + (a->z * a->z));
66*d86ed7fbStbbdev }
67*d86ed7fbStbbdev 
68*d86ed7fbStbbdev void VNorm(vector *a) {
69*d86ed7fbStbbdev     flt len;
70*d86ed7fbStbbdev 
71*d86ed7fbStbbdev     len = sqrt((a->x * a->x) + (a->y * a->y) + (a->z * a->z));
72*d86ed7fbStbbdev     if (len != 0.0) {
73*d86ed7fbStbbdev         a->x /= len;
74*d86ed7fbStbbdev         a->y /= len;
75*d86ed7fbStbbdev         a->z /= len;
76*d86ed7fbStbbdev     }
77*d86ed7fbStbbdev }
78*d86ed7fbStbbdev 
79*d86ed7fbStbbdev void VAdd(vector *a, vector *b, vector *c) {
80*d86ed7fbStbbdev     c->x = (a->x + b->x);
81*d86ed7fbStbbdev     c->y = (a->y + b->y);
82*d86ed7fbStbbdev     c->z = (a->z + b->z);
83*d86ed7fbStbbdev }
84*d86ed7fbStbbdev 
85*d86ed7fbStbbdev void VSub(vector *a, vector *b, vector *c) {
86*d86ed7fbStbbdev     c->x = (a->x - b->x);
87*d86ed7fbStbbdev     c->y = (a->y - b->y);
88*d86ed7fbStbbdev     c->z = (a->z - b->z);
89*d86ed7fbStbbdev }
90*d86ed7fbStbbdev 
91*d86ed7fbStbbdev void VAddS(flt a, vector *A, vector *B, vector *C) {
92*d86ed7fbStbbdev     C->x = (a * A->x) + B->x;
93*d86ed7fbStbbdev     C->y = (a * A->y) + B->y;
94*d86ed7fbStbbdev     C->z = (a * A->z) + B->z;
95*d86ed7fbStbbdev }
96*d86ed7fbStbbdev 
97*d86ed7fbStbbdev vector Raypnt(ray *a, flt t) {
98*d86ed7fbStbbdev     vector temp;
99*d86ed7fbStbbdev 
100*d86ed7fbStbbdev     temp.x = a->o.x + (a->d.x * t);
101*d86ed7fbStbbdev     temp.y = a->o.y + (a->d.y * t);
102*d86ed7fbStbbdev     temp.z = a->o.z + (a->d.z * t);
103*d86ed7fbStbbdev 
104*d86ed7fbStbbdev     return temp;
105*d86ed7fbStbbdev }
106*d86ed7fbStbbdev 
107*d86ed7fbStbbdev void VScale(vector *a, flt s) {
108*d86ed7fbStbbdev     a->x *= s;
109*d86ed7fbStbbdev     a->y *= s;
110*d86ed7fbStbbdev     a->z *= s;
111*d86ed7fbStbbdev }
112*d86ed7fbStbbdev 
113*d86ed7fbStbbdev void ColorAddS(color *a, color *b, flt s) {
114*d86ed7fbStbbdev     a->r += b->r * s;
115*d86ed7fbStbbdev     a->g += b->g * s;
116*d86ed7fbStbbdev     a->b += b->b * s;
117*d86ed7fbStbbdev }
118*d86ed7fbStbbdev 
119*d86ed7fbStbbdev void ColorAccum(color *a, color *b) {
120*d86ed7fbStbbdev     a->r += b->r;
121*d86ed7fbStbbdev     a->g += b->g;
122*d86ed7fbStbbdev     a->b += b->b;
123*d86ed7fbStbbdev }
124*d86ed7fbStbbdev 
125*d86ed7fbStbbdev void ColorScale(color *a, flt s) {
126*d86ed7fbStbbdev     a->r *= s;
127*d86ed7fbStbbdev     a->g *= s;
128*d86ed7fbStbbdev     a->b *= s;
129*d86ed7fbStbbdev }
130