]> Git Repo - raytracer.git/blob - geometry.h
first commit
[raytracer.git] / geometry.h
1 #include <cmath>
2 #include <cassert>
3 #include <iostream>
4
5
6 #ifndef __GEOMETRY_H__
7 #define __GEOMETRY_H__
8 template <size_t DIM> struct vec {
9           float& operator[](const size_t i)       { assert(i<DIM); return data[i]; }
10     const float& operator[](const size_t i) const { assert(i<DIM); return data[i]; }
11     float data[DIM] = {};
12 };
13
14 template<size_t DIM> vec<DIM> operator*(const vec<DIM> &lhs, const float rhs) {
15     vec<DIM> ret;
16     for (size_t i=DIM; i--; ret[i]=lhs[i]*rhs);
17     return ret;
18 }
19
20 template<size_t DIM> float operator*(const vec<DIM>& lhs, const vec<DIM>& rhs) {
21     float ret = 0;
22     for (size_t i=DIM; i--; ret+=lhs[i]*rhs[i]);
23     return ret;
24 }
25
26 template<size_t DIM> vec<DIM> operator+(vec<DIM> lhs, const vec<DIM>& rhs) {
27     for (size_t i=DIM; i--; lhs[i]+=rhs[i]);
28     return lhs;
29 }
30
31 template<size_t DIM> vec<DIM> operator-(vec<DIM> lhs, const vec<DIM>& rhs) {
32     for (size_t i=DIM; i--; lhs[i]-=rhs[i]);
33     return lhs;
34 }
35
36 template<size_t DIM> vec<DIM> operator-(const vec<DIM> &lhs) {
37     return lhs*(-1.f);
38 }
39
40 template <> struct vec<3> {
41           float& operator[](const size_t i)       { assert(i<3); return i==0 ? x : (1==i ? y : z); }
42     const float& operator[](const size_t i) const { assert(i<3); return i==0 ? x : (1==i ? y : z); }
43     float norm() { return std::sqrt(x*x+y*y+z*z); }
44     vec<3> & normalize(float l=1) { *this = (*this)*(l/norm()); return *this; }
45     float x = 0, y = 0, z = 0;
46 };
47
48 typedef vec<3> vec3;
49 typedef vec<4> vec4;
50
51 inline vec3 cross(vec3 v1, vec3 v2) {
52     return { v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x };
53 }
54
55 template <size_t DIM> std::ostream& operator<<(std::ostream& out, const vec<DIM>& v) {
56     for (size_t i=0; i<DIM; i++)
57         out << v[i] << " " ;
58     return out ;
59 }
60
61 #endif //__GEOMETRY_H__
62
This page took 0.025433 seconds and 4 git commands to generate.