#ifndef RTS_RECT_H #define RTS_RECT_H //enable CUDA_CALLABLE macro #include "rts/cuda/callable.h" #include "rts/math/vector.h" #include "rts/math/point.h" #include "rts/math/triangle.h" #include "rts/math/quaternion.h" #include #include namespace rts{ //template for a quadangle class in ND space template struct quad { /* C------------------>O ^ ^ | | Y | | | | | A---------X-------->B */ /*T A[N]; T B[N]; T C[N];*/ rts::point A; rts::vector X; rts::vector Y; CUDA_CALLABLE quad() { } CUDA_CALLABLE quad(point a, point b, point c) { A = a; X = b - a; Y = c - a; } /**************************************************************** Constructor - create a quad from two points and a normal ****************************************************************/ CUDA_CALLABLE quad(rts::point pMin, rts::point pMax, rts::vector normal) { //assign the corner point A = pMin; //compute the vector from pMin to pMax rts::vector v0; v0 = pMax - pMin; //compute the cross product of A and the plane normal rts::vector v1; v1 = v0.cross(normal); //calculate point B rts::point B; B = A + v0 * 0.5f + v1 * 0.5f; //calculate rtsPoint C rts::point C; C = A + v0 * 0.5f - v1 * 0.5f; //calculate X and Y X = B - A; Y = C - A; } /******************************************************************* Constructor - create a quad from a position, normal, and rotation *******************************************************************/ CUDA_CALLABLE quad(rts::point c, rts::vector normal, T width, T height, T theta) { //compute the X direction - start along world-space X Y = rts::vector(0, 1, 0); if(Y == normal) Y = rts::vector(0, 0, 1); X = Y.cross(normal).norm(); std::cout< q; q.CreateRotation(theta, normal); X = q.toMatrix3() * X; Y = normal.cross(X); //normalize everything X = X.norm(); Y = Y.norm(); //scale to match the quad width and height X = X * width; Y = Y * height; //set the corner of the plane A = c - X * 0.5f - Y * 0.5f; std::cout< n() { return (X.cross(Y)).norm(); } CUDA_CALLABLE rts::point p(T a, T b) { rts::point result; //given the two parameters a, b = [0 1], returns the position in world space result = A + X * a + Y * b; return result; } CUDA_CALLABLE rts::point operator()(T a, T b) { return p(a, b); } std::string toStr() { std::stringstream ss; ss<<"A = "<