-
Notifications
You must be signed in to change notification settings - Fork 19
/
structs.cpp
65 lines (58 loc) · 2.02 KB
/
structs.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/****************************************************************************************
* Real-Time Particle System - An OpenCL based Particle system developed to run on modern GPUs. Includes SPH fluid simulations.
* version 1.0, September 14th 2011
*
* Copyright (C) 2011 Ian Johnson, Andrew Young, Gordon Erlebacher, Myrna Merced, Evan Bollig
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
****************************************************************************************/
#include "structs.h"
#include <math.h>
namespace rtps
{
float magnitude(float4 vec)
{
return sqrt(vec.x*vec.x + vec.y*vec.y + vec.z*vec.z);
}
float magnitude3(float4 vec)
{
return sqrt(vec.x*vec.x + vec.y*vec.y + vec.z*vec.z);
}
float dist_squared(float4 vec)
{
return vec.x*vec.x + vec.y*vec.y + vec.z*vec.z;
}
float dot(float4 a, float4 b)
{
return a.x*b.x + a.y*b.y + a.z*b.z;
}
float4 normalize(float4 a)
{
float mag = magnitude(a);
return float4(a.x/mag, a.y/mag, a.z/mag, a.w);
}
float4 normalize3(float4 a)
{
float magi = magnitude3(a);
magi = magi < 1.e-8 ? 1. : 1./magi;
return float4(a.x*magi, a.y*magi, a.z*magi, a.w);
}
float4 cross(float4 a, float4 b)
{
return float4(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x, 0);
}
}