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