| author | Radek Brich <radek.brich@devl.cz> | 
| Fri, 02 May 2008 13:27:47 +0200 | |
| branch | pyrit | 
| changeset 91 | 9d66d323c354 | 
| parent 87 | 1081e3dd3f3e | 
| child 92 | 9af5c039b678 | 
| permissions | -rw-r--r-- | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 1 | /* | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 2 | * shapes.h: shape classes | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 3 | * | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 4 | * This file is part of Pyrit Ray Tracer. | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 5 | * | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 6 | * Copyright 2006, 2007, 2008 Radek Brich | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 7 | * | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 9 | * of this software and associated documentation files (the "Software"), to deal | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 10 | * in the Software without restriction, including without limitation the rights | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 12 | * copies of the Software, and to permit persons to whom the Software is | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 13 | * furnished to do so, subject to the following conditions: | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 14 | * | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 15 | * The above copyright notice and this permission notice shall be included in | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 16 | * all copies or substantial portions of the Software. | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 17 | * | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 24 | * THE SOFTWARE. | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 25 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 26 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 27 | #ifndef SHAPES_H | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 28 | #define SHAPES_H | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 29 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 30 | #include "common.h" | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 31 | #include "scene.h" | 
| 79 
062b1c4143f7
material and texture classes moved to material.(cc,h)
 Radek Brich <radek.brich@devl.cz> parents: 
78diff
changeset | 32 | #include "material.h" | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 33 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 34 | /* | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 35 | triangle intersection alghoritm | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 36 | options are: | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 37 | TRI_PLUCKER | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 38 | TRI_BARI | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 39 | TRI_BARI_PRE | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 40 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 41 | #if !defined(TRI_PLUCKER) && !defined(TRI_BARI) && !defined(TRI_BARI_PRE) | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 42 | # define TRI_BARI_PRE | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 43 | #endif | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 44 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 45 | /** | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 46 | * shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 47 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 48 | class Shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 49 | {
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 50 | public: | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 51 | Material *material; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 52 | 	Shape() {};
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 53 | 	virtual ~Shape() {};
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 54 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 55 | // first intersection point | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 56 | virtual bool intersect(const Ray &ray, Float &dist) const = 0; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 57 | |
| 91 | 58 | #ifndef NO_SSE | 
| 85 
907a634e5c02
implement triangle packet intersection
 Radek Brich <radek.brich@devl.cz> parents: 
84diff
changeset | 59 | virtual __m128 intersect_packet(const RayPacket &rays, __m128 &dists) | 
| 84 
6f7fe14782c2
prepare kd-tree traversal for packet tracing (4 rays at once)
 Radek Brich <radek.brich@devl.cz> parents: 
82diff
changeset | 60 | 	{
 | 
| 85 
907a634e5c02
implement triangle packet intersection
 Radek Brich <radek.brich@devl.cz> parents: 
84diff
changeset | 61 | __m128 results; | 
| 
907a634e5c02
implement triangle packet intersection
 Radek Brich <radek.brich@devl.cz> parents: 
84diff
changeset | 62 | ((int*)&results)[0] = intersect(rays[0], ((float*)&dists)[0]) ? -1 : 0; | 
| 
907a634e5c02
implement triangle packet intersection
 Radek Brich <radek.brich@devl.cz> parents: 
84diff
changeset | 63 | ((int*)&results)[1] = intersect(rays[1], ((float*)&dists)[1]) ? -1 : 0; | 
| 
907a634e5c02
implement triangle packet intersection
 Radek Brich <radek.brich@devl.cz> parents: 
84diff
changeset | 64 | ((int*)&results)[2] = intersect(rays[2], ((float*)&dists)[2]) ? -1 : 0; | 
| 
907a634e5c02
implement triangle packet intersection
 Radek Brich <radek.brich@devl.cz> parents: 
84diff
changeset | 65 | ((int*)&results)[3] = intersect(rays[3], ((float*)&dists)[3]) ? -1 : 0; | 
| 
907a634e5c02
implement triangle packet intersection
 Radek Brich <radek.brich@devl.cz> parents: 
84diff
changeset | 66 | return results; | 
| 84 
6f7fe14782c2
prepare kd-tree traversal for packet tracing (4 rays at once)
 Radek Brich <radek.brich@devl.cz> parents: 
82diff
changeset | 67 | }; | 
| 91 | 68 | #endif | 
| 84 
6f7fe14782c2
prepare kd-tree traversal for packet tracing (4 rays at once)
 Radek Brich <radek.brich@devl.cz> parents: 
82diff
changeset | 69 | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 70 | // all intersections (only for CSG) | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 71 | virtual bool intersect_all(const Ray &ray, Float dist, vector<Float> &allts) const = 0; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 72 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 73 | // intersection with AABB | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 74 | virtual bool intersect_bbox(const BBox &bbox) const = 0; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 75 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 76 | // normal at point P | 
| 91 | 77 | virtual const Vector normal(const Vector &P) const = 0; | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 78 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 79 | virtual BBox get_bbox() const = 0; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 80 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 81 | virtual ostream & dump(ostream &st) const = 0; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 82 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 83 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 84 | /** | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 85 | * list of shapes | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 86 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 87 | typedef vector<Shape*> ShapeList; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 88 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 89 | /** | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 90 | * sphere shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 91 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 92 | class Sphere: public Shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 93 | {
 | 
| 91 | 94 | Vector center; | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 95 | Float radius; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 96 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 97 | Float sqr_radius; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 98 | Float inv_radius; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 99 | public: | 
| 91 | 100 | Sphere(const Vector &acenter, const Float aradius, Material *amaterial): | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 101 | center(acenter), radius(aradius), | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 102 | sqr_radius(aradius*aradius), inv_radius(1.0f/aradius) | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 103 | 		{ material = amaterial; }
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 104 | bool intersect(const Ray &ray, Float &dist) const; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 105 | bool intersect_all(const Ray &ray, Float dist, vector<Float> &allts) const; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 106 | bool intersect_bbox(const BBox &bbox) const; | 
| 91 | 107 | 	const Vector normal(const Vector &P) const { return (P - center) * inv_radius; };
 | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 108 | BBox get_bbox() const; | 
| 91 | 109 | 	const Vector getCenter() const { return center; };
 | 
| 84 
6f7fe14782c2
prepare kd-tree traversal for packet tracing (4 rays at once)
 Radek Brich <radek.brich@devl.cz> parents: 
82diff
changeset | 110 | 	Float getRadius() const { return radius; };
 | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 111 | ostream & dump(ostream &st) const; | 
| 91 | 112 | #ifndef NO_SSE | 
| 113 | __m128 intersect_packet(const RayPacket &rays, __m128 &dists); | |
| 114 | #endif | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 115 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 116 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 117 | /** | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 118 | * box shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 119 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 120 | class Box: public Shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 121 | {
 | 
| 91 | 122 | Vector L; | 
| 123 | Vector H; | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 124 | public: | 
| 91 | 125 | Box(const Vector &aL, const Vector &aH, Material *amaterial): L(aL), H(aH) | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 126 | 	{
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 127 | for (int i = 0; i < 3; i++) | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 128 | if (L.cell[i] > H.cell[i]) | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 129 | swap(L.cell[i], H.cell[i]); | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 130 | material = amaterial; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 131 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 132 | bool intersect(const Ray &ray, Float &dist) const; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 133 | 	bool intersect_all(const Ray &ray, Float dist, vector<Float> &allts) const { return false; };
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 134 | bool intersect_bbox(const BBox &bbox) const; | 
| 91 | 135 | const Vector normal(const Vector &P) const; | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 136 | 	BBox get_bbox() const { return BBox(L, H); };
 | 
| 91 | 137 | 	const Vector getL() const { return L; };
 | 
| 138 | 	const Vector getH() const { return H; };
 | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 139 | ostream & dump(ostream &st) const; | 
| 91 | 140 | #ifndef NO_SSE | 
| 141 | __m128 intersect_packet(const RayPacket &rays, __m128 &dists); | |
| 142 | #endif | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 143 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 144 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 145 | /** | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 146 | * triangle vertex | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 147 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 148 | class Vertex | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 149 | {
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 150 | public: | 
| 91 | 151 | Vector P; | 
| 152 | 	Vertex(const Vector &aP): P(aP) {};
 | |
| 82 
930a2d3ecaed
prepare structures for packet tracing
 Radek Brich <radek.brich@devl.cz> parents: 
79diff
changeset | 153 | 	virtual ~Vertex() {};
 | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 154 | virtual ostream & dump(ostream &st) const; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 155 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 156 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 157 | /** | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 158 | * triangle vertex with normal | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 159 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 160 | class NormalVertex: public Vertex | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 161 | {
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 162 | public: | 
| 91 | 163 | Vector N; | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 164 | 	NormalVertex(const NormalVertex *v): Vertex(v->P), N(v->N) {};
 | 
| 91 | 165 | 	NormalVertex(const Vector &aP): Vertex(aP) {};
 | 
| 166 | 	NormalVertex(const Vector &aP, const Vector &aN): Vertex(aP), N(aN) {};
 | |
| 167 | 	const Vector &getNormal() { return N; };
 | |
| 168 | 	void setNormal(const Vector &aN) { N = aN; };
 | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 169 | ostream & dump(ostream &st) const; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 170 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 171 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 172 | /** | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 173 | * triangle shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 174 | */ | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 175 | class Triangle: public Shape | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 176 | {
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 177 | #ifdef TRI_BARI_PRE | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 178 | Float nu, nv, nd; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 179 | int k; // dominant axis | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 180 | Float bnu, bnv; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 181 | Float cnu, cnv; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 182 | #endif | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 183 | #ifdef TRI_BARI | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 184 | int k; // dominant axis | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 185 | #endif | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 186 | #ifdef TRI_PLUCKER | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 187 | Float pla[6], plb[6], plc[6]; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 188 | #endif | 
| 91 | 189 | Vector N; | 
| 190 | const Vector smooth_normal(const Vector &P) const | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 191 | 	{
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 192 | #ifdef TRI_BARI_PRE | 
| 91 | 193 | const Vector &NA = static_cast<NormalVertex*>(A)->N; | 
| 194 | const Vector &NB = static_cast<NormalVertex*>(B)->N; | |
| 195 | const Vector &NC = static_cast<NormalVertex*>(C)->N; | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 196 | 		static const int modulo3[5] = {0,1,2,0,1};
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 197 | register const int ku = modulo3[k+1]; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 198 | register const int kv = modulo3[k+2]; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 199 | const Float pu = P[ku] - A->P[ku]; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 200 | const Float pv = P[kv] - A->P[kv]; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 201 | const Float u = pv * bnu + pu * bnv; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 202 | const Float v = pu * cnv + pv * cnu; | 
| 91 | 203 | Vector n = NA + u * (NB - NA) + v * (NC - NA); | 
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 204 | n.normalize(); | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 205 | return n; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 206 | #else | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 207 | return N; // not implemented for other algorithms | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 208 | #endif | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 209 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 210 | public: | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 211 | Vertex *A, *B, *C; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 212 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 213 | 	Triangle() {};
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 214 | Triangle(Vertex *aA, Vertex *aB, Vertex *aC, Material *amaterial); | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 215 | bool intersect(const Ray &ray, Float &dist) const; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 216 | 	bool intersect_all(const Ray &ray, Float dist, vector<Float> &allts) const {return false;};
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 217 | bool intersect_bbox(const BBox &bbox) const; | 
| 91 | 218 | 	const Vector normal(const Vector &P) const { return (material->smooth ? smooth_normal(P) : N); };
 | 
| 219 | 	const Vector getNormal() const { return N; };
 | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 220 | BBox get_bbox() const; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 221 | ostream & dump(ostream &st) const; | 
| 91 | 222 | #if not defined(NO_SSE) and defined(TRI_BARI_PRE) | 
| 223 | __m128 intersect_packet(const RayPacket &rays, __m128 &dists); | |
| 224 | #endif | |
| 78 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 225 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 226 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 227 | template <class T> class Array | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 228 | {
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 229 | T *array; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 230 | public: | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 231 | 	Array(int n) { array = new T[n]; };
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 232 | 	~Array() { delete[] array; };
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 233 | 	const T &operator[](int i) const { return array[i]; };
 | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 234 | }; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 235 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 236 | typedef Array<Vertex> VertexArray; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 237 | typedef Array<NormalVertex> NormalVertexArray; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 238 | typedef Array<Triangle> TriangleArray; | 
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 239 | |
| 
9569e9f35374
move shapes to extra source file
 Radek Brich <radek.brich@devl.cz> parents: diff
changeset | 240 | #endif |