From e57b5715e8e68b76d60065d8f70b308097cb89ca Mon Sep 17 00:00:00 2001 From: Godzil Date: Fri, 6 Mar 2020 15:07:26 +0000 Subject: [PATCH] Smooth triangles! And support for them in the OBJ File parser. Also add an interesting tea party scene! --- README.md | 9 +- external/teapot-lowtri.obj | 274 +++++++++++++++++++++++++++++++ output/ch15_teapot_objfile.png | Bin 0 -> 152744 bytes source/include/cone.h | 2 +- source/include/cube.h | 4 +- source/include/cylinder.h | 5 +- source/include/group.h | 2 +- source/include/intersection.h | 4 +- source/include/objfile.h | 8 +- source/include/plane.h | 4 +- source/include/renderstat.h | 23 +-- source/include/shape.h | 9 +- source/include/smoothtriangle.h | 28 ++++ source/include/sphere.h | 2 +- source/include/testshape.h | 2 +- source/include/triangle.h | 3 +- source/intersect.cpp | 2 +- source/intersection.cpp | 16 +- source/renderstat.cpp | 8 + source/shapes/cone.cpp | 2 +- source/shapes/cube.cpp | 2 +- source/shapes/cylinder.cpp | 2 +- source/shapes/group.cpp | 2 +- source/shapes/objfile.cpp | 129 +++++++++++++-- source/shapes/plane.cpp | 2 +- source/shapes/shape.cpp | 5 +- source/shapes/smoothtriangle.cpp | 28 ++++ source/shapes/sphere.cpp | 2 +- source/shapes/testshape.cpp | 2 +- source/shapes/triangle.cpp | 6 +- tests/CMakeLists.txt | 3 +- tests/arealight_test.cpp | 2 +- tests/ch11_test.cpp | 2 +- tests/ch15_teapot_objfile.cpp | 36 ++-- tests/intersect_test.cpp | 10 ++ tests/objfile_test.cpp | 55 +++++++ tests/smoothtriangle_test.cpp | 83 ++++++++++ tests/test_render.cpp | 2 +- 38 files changed, 705 insertions(+), 75 deletions(-) create mode 100644 external/teapot-lowtri.obj create mode 100644 output/ch15_teapot_objfile.png create mode 100644 source/include/smoothtriangle.h create mode 100644 source/shapes/smoothtriangle.cpp create mode 100644 tests/smoothtriangle_test.cpp diff --git a/README.md b/README.md index 66fe933..db89468 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,12 @@ DoRayMe A Quick and dirty raytracer. -This raytracer is made following the book "[The Ray Tracer Challenge](https://pragprog.com/book/jbtracer/the-ray-tracer-challenge)" by Jamis Buck. +This raytracer is made following the book +"[The Ray Tracer Challenge](https://pragprog.com/book/jbtracer/the-ray-tracer-challenge)" by Jamis Buck. -It is writen in C++ with no STL and use [LodePNG](https://github.com/lvandeve/lodepng) to output PNG file. +It is writen in C++ with no STL and use [LodePNG](https://github.com/lvandeve/lodepng) to output PNG file and use them +as texture, also use [NanoJPEG](https://keyj.emphy.de/nanojpeg/) to use jpeg file as texture, and can use use +[Lua 5.3](https://www.lua.org/) for 3D pattern definition and more to come on the Lua side later.. Examples outputs @@ -65,6 +68,8 @@ Bonus: **From Chapter 14 - Groups & Bounding boxes:** ![Chapter 14 rendering test](output/ch14_test.png) +**From Chapter 15 - Triangles, Wavefrom OBJ files - Smooth trianges:** +![Chapter 15 Triangles and teapots](output/ch15_teapot_objfile.png) **Bonus (from the forum):** diff --git a/external/teapot-lowtri.obj b/external/teapot-lowtri.obj new file mode 100644 index 0000000..560dd14 --- /dev/null +++ b/external/teapot-lowtri.obj @@ -0,0 +1,274 @@ +# +# object Teapot001 +# + +v 7.0000 0.0000 12.0000 +v 4.9700 -4.9700 12.0000 +v 4.9811 -4.9811 12.4922 +v 7.0156 0.0000 12.4922 +v 5.3250 -5.3250 12.0000 +v 7.5000 0.0000 12.0000 +v 0.0000 -7.0000 12.0000 +v 0.0000 -7.0156 12.4922 +v 0.0000 -7.5000 12.0000 +v -5.1387 -4.9700 12.0000 +v -5.0022 -4.9811 12.4922 +v -5.3250 -5.3250 12.0000 +v -7.0000 0.0000 12.0000 +v -7.0156 0.0000 12.4922 +v -7.5000 0.0000 12.0000 +v -4.9700 4.9700 12.0000 +v -4.9811 4.9811 12.4922 +v -5.3250 5.3250 12.0000 +v 0.0000 7.0000 12.0000 +v 0.0000 7.0156 12.4922 +v 0.0000 7.5000 12.0000 +v 4.9700 4.9700 12.0000 +v 4.9811 4.9811 12.4922 +v 5.3250 5.3250 12.0000 +v 6.5453 -6.5453 8.1094 +v 9.2188 0.0000 8.1094 +v 7.1000 -7.1000 4.5000 +v 10.0000 0.0000 4.5000 +v 0.0000 -9.2188 8.1094 +v 0.0000 -10.0000 4.5000 +v -6.5453 -6.5453 8.1094 +v -7.1000 -7.1000 4.5000 +v -9.2188 0.0000 8.1094 +v -10.0000 0.0000 4.5000 +v -6.5453 6.5453 8.1094 +v -7.1000 7.1000 4.5000 +v 0.0000 9.2188 8.1094 +v 0.0000 10.0000 4.5000 +v 6.5453 6.5453 8.1094 +v 7.1000 7.1000 4.5000 +v 6.2125 -6.2125 1.9219 +v 8.7500 0.0000 1.9219 +v 5.3250 -5.3250 0.7500 +v 7.5000 0.0000 0.7500 +v 0.0000 -8.7500 1.9219 +v 0.0000 -7.5000 0.7500 +v -6.2125 -6.2125 1.9219 +v -5.3250 -5.3250 0.7500 +v -8.7500 0.0000 1.9219 +v -7.5000 0.0000 0.7500 +v -6.2125 6.2125 1.9219 +v -5.3250 5.3250 0.7500 +v 0.0000 8.7500 1.9219 +v 0.0000 7.5000 0.7500 +v 6.2125 6.2125 1.9219 +v 5.3250 5.3250 0.7500 +v 4.5595 -4.5595 0.2344 +v 6.4219 0.0000 0.2344 +v 0.0000 0.0000 0.0000 +v 0.0000 -6.4219 0.2344 +v -4.5595 -4.5595 0.2344 +v -6.4219 0.0000 0.2344 +v -4.5595 4.5595 0.2344 +v 0.0000 6.4219 0.2344 +v 4.5595 4.5595 0.2344 +v -8.0000 0.0000 10.1250 +v -7.7500 -1.1250 10.6875 +v -12.5938 -1.1250 10.4766 +v -12.0625 0.0000 9.9844 +v -14.2500 -1.1250 9.0000 +v -13.5000 0.0000 9.0000 +v -7.5000 0.0000 11.2500 +v -13.1250 0.0000 10.9688 +v -15.0000 0.0000 9.0000 +v -7.7500 1.1250 10.6875 +v -12.5938 1.1250 10.4766 +v -14.2500 1.1250 9.0000 +v -13.1719 -1.1250 6.2695 +v -12.6875 0.0000 6.7500 +v -9.7500 -1.1250 3.7500 +v -13.6563 0.0000 5.7891 +v -9.5000 0.0000 3.0000 +v -13.1719 1.1250 6.2695 +v -9.7500 1.1250 3.7500 +v 8.5000 0.0000 7.1250 +v 8.5000 -2.4750 5.0625 +v 12.6875 -1.7062 8.1094 +v 11.9375 0.0000 9.0000 +v 15.0000 -0.9375 12.0000 +v 13.5000 0.0000 12.0000 +v 8.5000 0.0000 3.0000 +v 13.4375 0.0000 7.2187 +v 16.5000 0.0000 12.0000 +v 8.5000 2.4750 5.0625 +v 12.6875 1.7062 8.1094 +v 15.0000 0.9375 12.0000 +v 15.6328 -0.7500 12.3340 +v 14.1250 0.0000 12.2813 +v 15.0000 -0.5625 12.0000 +v 14.0000 0.0000 12.0000 +v 17.1406 0.0000 12.3867 +v 16.0000 0.0000 12.0000 +v 15.6328 0.7500 12.3340 +v 15.0000 0.5625 12.0000 +v 1.1552 -1.1552 14.9063 +v 1.6250 0.0000 14.9063 +v 0.0000 0.0000 15.7500 +v 0.7100 -0.7100 13.5000 +v 1.0000 0.0000 13.5000 +v 0.0000 -1.6250 14.9063 +v 0.0000 -1.0000 13.5000 +v -1.1552 -1.1552 14.9063 +v -0.7100 -0.7100 13.5000 +v -1.6250 0.0000 14.9063 +v -1.0000 0.0000 13.5000 +v -1.1552 1.1552 14.9063 +v -0.7100 0.7100 13.5000 +v 0.0000 1.6250 14.9063 +v 0.0000 1.0000 13.5000 +v 1.1552 1.1552 14.9063 +v 0.7100 0.7100 13.5000 +v 2.9288 -2.9288 12.7500 +v 4.1250 0.0000 12.7500 +v 4.6150 -4.6150 12.0000 +v 6.5000 0.0000 12.0000 +v 0.0000 -4.1250 12.7500 +v 0.0000 -6.5000 12.0000 +v -2.9288 -2.9288 12.7500 +v -4.6150 -4.6150 12.0000 +v -4.1250 0.0000 12.7500 +v -6.5000 0.0000 12.0000 +v -2.9288 2.9288 12.7500 +v -4.6150 4.6150 12.0000 +v 0.0000 4.1250 12.7500 +v 0.0000 6.5000 12.0000 +v 2.9288 2.9288 12.7500 +v 4.6150 4.6150 12.0000 +# 137 vertices + +g Teapot001 +f 1 2 3 4 +f 4 3 5 6 +f 2 7 8 3 +f 3 8 9 5 +f 7 10 11 8 +f 8 11 12 9 +f 10 13 14 11 +f 11 14 15 12 +f 13 16 17 14 +f 14 17 18 15 +f 16 19 20 17 +f 17 20 21 18 +f 19 22 23 20 +f 20 23 24 21 +f 22 1 4 23 +f 23 4 6 24 +f 6 5 25 26 +f 26 25 27 28 +f 5 9 29 25 +f 25 29 30 27 +f 9 12 31 29 +f 29 31 32 30 +f 12 15 33 31 +f 31 33 34 32 +f 15 18 35 33 +f 33 35 36 34 +f 18 21 37 35 +f 35 37 38 36 +f 21 24 39 37 +f 37 39 40 38 +f 24 6 26 39 +f 39 26 28 40 +f 28 27 41 42 +f 42 41 43 44 +f 27 30 45 41 +f 41 45 46 43 +f 30 32 47 45 +f 45 47 48 46 +f 32 34 49 47 +f 47 49 50 48 +f 34 36 51 49 +f 49 51 52 50 +f 36 38 53 51 +f 51 53 54 52 +f 38 40 55 53 +f 53 55 56 54 +f 40 28 42 55 +f 55 42 44 56 +f 44 43 57 58 +f 58 57 59 +f 43 46 60 57 +f 57 60 59 +f 46 48 61 60 +f 60 61 59 +f 48 50 62 61 +f 61 62 59 +f 50 52 63 62 +f 62 63 59 +f 52 54 64 63 +f 63 64 59 +f 54 56 65 64 +f 64 65 59 +f 56 44 58 65 +f 65 58 59 +f 66 67 68 69 +f 69 68 70 71 +f 67 72 73 68 +f 68 73 74 70 +f 72 75 76 73 +f 73 76 77 74 +f 75 66 69 76 +f 76 69 71 77 +f 71 70 78 79 +f 79 78 80 34 +f 70 74 81 78 +f 78 81 82 80 +f 74 77 83 81 +f 81 83 84 82 +f 77 71 79 83 +f 83 79 34 84 +f 85 86 87 88 +f 88 87 89 90 +f 86 91 92 87 +f 87 92 93 89 +f 91 94 95 92 +f 92 95 96 93 +f 94 85 88 95 +f 95 88 90 96 +f 90 89 97 98 +f 98 97 99 100 +f 89 93 101 97 +f 97 101 102 99 +f 93 96 103 101 +f 101 103 104 102 +f 96 90 98 103 +f 103 98 100 104 +f 105 106 107 +f 106 105 108 109 +f 110 105 107 +f 105 110 111 108 +f 112 110 107 +f 110 112 113 111 +f 114 112 107 +f 112 114 115 113 +f 116 114 107 +f 114 116 117 115 +f 118 116 107 +f 116 118 119 117 +f 120 118 107 +f 118 120 121 119 +f 106 120 107 +f 120 106 109 121 +f 109 108 122 123 +f 123 122 124 125 +f 108 111 126 122 +f 122 126 127 124 +f 111 113 128 126 +f 126 128 129 127 +f 113 115 130 128 +f 128 130 131 129 +f 115 117 132 130 +f 130 132 133 131 +f 117 119 134 132 +f 132 134 135 133 +f 119 121 136 134 +f 134 136 137 135 +f 121 109 123 136 +f 136 123 125 137 +# 112 polygons - 16 triangles + diff --git a/output/ch15_teapot_objfile.png b/output/ch15_teapot_objfile.png new file mode 100644 index 0000000000000000000000000000000000000000..57e56474a1f14280df192ac419b41155209aa671 GIT binary patch literal 152744 zcmX6@19T-#)4uVI?M*hu#^%O0H@2N@Y}>ZAvF(j*Y;a@SPX4_Acg~zSQ{6p%s-Eeo z>Zhv1739Pb;qc%9005$-goqLV0C5BWfZYMXzgmc;;yeK0Dt3}0f+}ucXN#LL+AWAM zTXp(-7ut8^@87)lz}pdK7Dk$3E(|~2|KKX|Zo-f`Y-MNXN<_Ro><-7SeP%j>3}bd% zgToc+#CQX748!Uaqu4v75ts&A7cNc+j0TK;9yO{o7;}V!^=7f~1mN&4Ied$KYTC8f zyz>&Z{gUM}*Wh?VTk?uY?EG=8y4JRPJue=B8N1f?^ zr)Gu}H5~YdbZ5%=HDGaA(+0Y5@`PqCo`ea+0(y;n`i8;f9*^T-Ys$tA&YPI6937*g zTts?}^WDkVIM+6oaGcE0^nQR zA`CWB2b&!=ic${^`x4}i)0JOgN;z0IRP7|~6k$*nb2e#sI7m4tMJQ(~4W#BMW%1Ds zj_~a!Hl~Mj76bgCV|GVk6b7B8m~yTN9H+MITIKlpiZS2^DH{-r{dQ|qQXnu$?5U-^SkD3?UpS<68#r{Hxvymmc^u*-$H ztzy8bF2MunruqP{SLh_r?LEZ*2j(N}#W!Kjf+-fDw637*Fq~QUkQv^xYe~w~{p6@t z0iVl^2GEW>j8)6wLL+^xRm141Ylf!7m4=JB)KaJCOS$$wwJgHX`!wbP!4`E*l$D;xb$SL{zH`QNzx5cOZZ{-L85NAGx z`-V8|Fk≀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

)A5$!Ij%iC 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 z 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

qtT;)RG4<|Qmk3qItq1zkT5YEelnAIB^eB+Hj z4{od2hryp)#pfvQz3GjoUyqw_A7ql?q#ISc6s|fSPcsY(A(A99t@a394x&LzR-?Cq zz;F-Fvzl&@b1tQHUdU172l3WNCv=$y=!e@|_h%59bz+dn;V6Nl=;Z-M;kJD*H+X^& zKR?x@{Mqy}$8DfwgGHt#dRF&f>SeE=)qf0}XZ0IzOoj7#|HoinU!7qPr*m)K5i#tm zU*S%x+3qvP`*mR;GD(_wH^e21ry6vgggt{o2-CbHg4n2CO*-^e6b!GHgbNLh<}iKI zH5^9GE4IsuZxu+-iRxMCkXLVsE1oxP5~>) zacFa^D|Q7@j|wMMyaJY_@jN*1GjF^a)-PeKyY|R?Su|Z5>y9$=UKY+vxM%Pj#U{;? z!(Wfvyn`-X%g(#>5`)?_woG=fpjO^{b_HkB6-Yq#JxS0!Iy+7-k#o&+!I)M}po!YH=@1xNpOB6b~L3W+3pmC0Uk~eRBp?f4!;_K4J;`= zDU&zHk|whuh(qFyCD0C$*9T?XybdfwWUJcTYP>oJPKU2>hw^{V=@*MiS>fE}1ono= uRw+Gcyjn830WqbWXQ0;Lk|EN&k^cv=vJap`>gsa<0000 class Cube : public Shape { -private: +protected: void checkAxis(double axeOrigin, double axeDirection, double *axeMin, double *axeMax); Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); public: Cube() : Shape(SHAPE_CUBE) { stats.addCube(); }; diff --git a/source/include/cylinder.h b/source/include/cylinder.h index 33576aa..c8455d3 100644 --- a/source/include/cylinder.h +++ b/source/include/cylinder.h @@ -16,10 +16,11 @@ #include class Cylinder : public Shape { -private: + +protected: Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); bool checkCap(Ray r, double t); void intersectCaps(Ray r, Intersect &xs); diff --git a/source/include/group.h b/source/include/group.h index fefacad..a389cf0 100644 --- a/source/include/group.h +++ b/source/include/group.h @@ -27,7 +27,7 @@ private: protected: Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); BoundingBox bounds; diff --git a/source/include/intersection.h b/source/include/intersection.h index 3786e71..d691799 100644 --- a/source/include/intersection.h +++ b/source/include/intersection.h @@ -74,8 +74,10 @@ public: double t; Shape *object; + double u, v; + public: - Intersection(double t, Shape *object) : t(t), object(object) { stats.addIntersection(); }; + Intersection(double t, Shape *object, double u = NAN, double v = NAN) : t(t), object(object), u(u), v(v) { stats.addIntersection(); }; bool nothing() { return (this->object == nullptr); }; Computation prepareComputation(Ray r, Intersect *xs = nullptr); diff --git a/source/include/objfile.h b/source/include/objfile.h index 47a4bcd..1920ae7 100644 --- a/source/include/objfile.h +++ b/source/include/objfile.h @@ -26,9 +26,13 @@ private: Point* *vertexList; uint32_t vertexCount; + uint32_t allocatedVertexNormalCount; + Vector* *vertexNormalList; + uint32_t vertexNormalCount; + private: Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); public: /* Some stats */ @@ -37,6 +41,7 @@ public: protected: void addGroup(Group *group); void addVertex(Point *vertex); + void addVertexNormal(Vector *vertexNormal); void parseLine(char *line, uint32_t currentLine); int execLine(int argc, char *argv[], uint32_t currentLine); @@ -50,6 +55,7 @@ public: /* OBJ file expect the first vertice to be 1 and not 0 */ Point vertices(uint32_t i) { return *this->vertexList[i - 1]; }; + Vector verticesNormal(uint32_t i) { return *this->vertexNormalList[i - 1]; }; Group *groups(uint32_t i) { return this->faceGroupList[i]; }; Intersect intersect(Ray r); BoundingBox getLocalBounds(); diff --git a/source/include/plane.h b/source/include/plane.h index 638b2da..278aa92 100644 --- a/source/include/plane.h +++ b/source/include/plane.h @@ -13,9 +13,9 @@ class Plane : public Shape { -private: +protected: Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); public: Plane() : Shape(SHAPE_PLANE) { stats.addPlane(); }; diff --git a/source/include/renderstat.h b/source/include/renderstat.h index 2611f89..b485541 100644 --- a/source/include/renderstat.h +++ b/source/include/renderstat.h @@ -14,15 +14,16 @@ class RenderStats { private: - uint64_t coneCount; /* Total number of cones */ - uint64_t cylinderCount; /* Total number of cylinder */ - uint64_t cubeCount; /* Total number of cubes */ - uint64_t groupCount; /* Total number of groups */ - uint64_t lightCount; /* Total number of light */ - uint64_t planeCount; /* Total number of plane */ - uint64_t sphereCount; /* Total number of sphere */ - uint64_t triangleCount; /* Total number of triangle */ - uint64_t objfileCount; /* Total number of OBJ File */ + uint64_t coneCount; /* Total number of cones */ + uint64_t cylinderCount; /* Total number of cylinder */ + uint64_t cubeCount; /* Total number of cubes */ + uint64_t groupCount; /* Total number of groups */ + uint64_t lightCount; /* Total number of light */ + uint64_t planeCount; /* Total number of plane */ + uint64_t sphereCount; /* Total number of sphere */ + uint64_t triangleCount; /* Total number of triangle */ + uint64_t smoothTriangleCount; /* Total number of smooth triangle */ + uint64_t objfileCount; /* Total number of OBJ File */ uint64_t pixelCount; /* Total number of rendered pixels */ uint64_t rayCount; /* Total number of rays */ @@ -40,7 +41,7 @@ private: public: RenderStats() : coneCount(0), cylinderCount(0), cubeCount(0), groupCount(0), lightCount(0), planeCount(0), sphereCount(0), triangleCount(0), pixelCount(0), rayCount(0), lightRayEmitedCount(0), reflectionRayCount(0), refractedRayCount(0), - intersectCount(0), intersectionCount(0), reallocCallCount(0), mallocCallCount(0), + intersectCount(0), intersectionCount(0), reallocCallCount(0), mallocCallCount(0), smoothTriangleCount(0), discardedIntersectCount(0), maxDepthAttained(UINT64_MAX), maxIntersectOnARay(0), objfileCount(0) {}; #ifdef RENDER_STATS void addCone(); @@ -52,6 +53,7 @@ public: void addSphere(); void addOBJFile(); void addTriangle(); + void addSmoothTriangle(); void printStats(); void addPixel(); void addRay(); @@ -74,6 +76,7 @@ public: static void addPlane() {}; static void addSphere() {}; static void addTriangle() {}; + static void addSmoothTriangle() {}; static void printStats() {}; static void addPixel() {}; static void addRay() {}; diff --git a/source/include/shape.h b/source/include/shape.h index 5087d4d..072996d 100644 --- a/source/include/shape.h +++ b/source/include/shape.h @@ -30,17 +30,19 @@ enum ShapeType SHAPE_GROUP, SHAPE_TRIANGLE, SHAPE_OBJFILE, + SHAPE_SMOOTHTRIANGLE, }; /* Base class for all object that can be presented in the world */ class Shape { -private: +protected: ShapeType type; Matrix localTransformMatrix; + protected: virtual Intersect localIntersect(Ray r) = 0; - virtual Tuple localNormalAt(Tuple point) = 0; + virtual Tuple localNormalAt(Tuple point, Intersection *hit) = 0; public: Matrix transformMatrix; @@ -50,13 +52,14 @@ public: Material material; bool dropShadow; Shape *parent; + bool materialSet; public: Shape(ShapeType = SHAPE_NONE); virtual Intersect intersect(Ray r); virtual Intersect intersectOOB(Ray r) { return this->intersect(r); }; - Tuple normalAt(Tuple point); + Tuple normalAt(Tuple point, Intersection *hit = nullptr); /* Bounding box points are always world value */ virtual BoundingBox getLocalBounds(); diff --git a/source/include/smoothtriangle.h b/source/include/smoothtriangle.h new file mode 100644 index 0000000..3549702 --- /dev/null +++ b/source/include/smoothtriangle.h @@ -0,0 +1,28 @@ +/* + * DoRayMe - a quick and dirty Raytracer + * Smooth Triangle header + * + * Created by Manoël Trapier + * Copyright (c) 2020 986-Studio. + * + */ +#ifndef DORAYME_SMOOTHTRIANGLE_H +#define DORAYME_SMOOTHTRIANGLE_H + +#include + +class SmoothTriangle : public Triangle +{ +public: + Vector n1; + Vector n2; + Vector n3; + +protected: + Tuple localNormalAt(Tuple point, Intersection *hit); + +public: + SmoothTriangle(Point p1, Point p2, Point p3, Vector n1, Vector n2, Vector n3); +}; + +#endif /* DORAYME_SMOOTHTRIANGLE_H */ diff --git a/source/include/sphere.h b/source/include/sphere.h index cf69822..da00c9e 100644 --- a/source/include/sphere.h +++ b/source/include/sphere.h @@ -19,7 +19,7 @@ class Sphere : public Shape { protected: Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); public: Sphere() : Shape(SHAPE_SPHERE) { stats.addSphere(); }; diff --git a/source/include/testshape.h b/source/include/testshape.h index b441f83..42598a9 100644 --- a/source/include/testshape.h +++ b/source/include/testshape.h @@ -17,7 +17,7 @@ class TestShape : public Shape { private: Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); public: Ray localRay; diff --git a/source/include/triangle.h b/source/include/triangle.h index f813853..ff642b9 100644 --- a/source/include/triangle.h +++ b/source/include/triangle.h @@ -14,8 +14,9 @@ class Triangle : public Shape { +protected: Intersect localIntersect(Ray r); - Tuple localNormalAt(Tuple point); + Tuple localNormalAt(Tuple point, Intersection *hit = nullptr); public: Tuple p1, p2, p3; diff --git a/source/intersect.cpp b/source/intersect.cpp index 2fc6f2d..c90b011 100644 --- a/source/intersect.cpp +++ b/source/intersect.cpp @@ -60,7 +60,7 @@ void Intersect::add(Intersection i) this->list = (Intersection **)realloc(this->list, sizeof(Intersection *) * this->allocated); } - this->list[this->num++] = new Intersection(i.t, i.object); + this->list[this->num++] = new Intersection(i.t, i.object, i.u, i.v); stats.setMaxIntersect(this->num); diff --git a/source/intersection.cpp b/source/intersection.cpp index cd04c4c..20d0249 100644 --- a/source/intersection.cpp +++ b/source/intersection.cpp @@ -16,7 +16,18 @@ Computation Intersection::prepareComputation(Ray r, Intersect *xs) double n2 = 1.0; Tuple hitP = r.position(this->t); - Tuple normalV = this->object->normalAt(hitP); + Tuple normalV; + + if (xs != nullptr) + { + Intersection hit = xs->hit(); + normalV = this->object->normalAt(hitP, &hit); + } + else + { + normalV = this->object->normalAt(hitP, nullptr); + } + Tuple eyeV = -r.direction; bool inside = false; @@ -70,8 +81,9 @@ Computation Intersection::prepareComputation(Ray r, Intersect *xs) } Shape *s = this->object; + /* For now don't get root group material */ - //while(s->parent != nullptr) { s = s->parent; } + while((!s->materialSet) && (s->parent != nullptr)) { s = s->parent; } return Computation(this->object, this->t, diff --git a/source/renderstat.cpp b/source/renderstat.cpp index 0ecb8f3..1c1113f 100644 --- a/source/renderstat.cpp +++ b/source/renderstat.cpp @@ -61,6 +61,12 @@ void RenderStats::addTriangle() this->triangleCount++; }; +void RenderStats::addSmoothTriangle() +{ +#pragma omp atomic + this->smoothTriangleCount++; +}; + void RenderStats::addOBJFile() { #pragma omp atomic @@ -154,6 +160,8 @@ void RenderStats::printStats() printf("Planes : %lld\n", this->planeCount); printf("Spheres : %lld\n", this->sphereCount); printf("Triangles : %lld\n", this->triangleCount); + printf("Smooth Triangles : %lld\n", this->smoothTriangleCount); + printf("OBJ File : %lld\n", this->objfileCount); printf("==================================================\n"); printf("Pixel rendered : %lld\n", this->pixelCount); printf("Ray casted : %lld\n", this->rayCount); diff --git a/source/shapes/cone.cpp b/source/shapes/cone.cpp index 7172584..3f755c6 100644 --- a/source/shapes/cone.cpp +++ b/source/shapes/cone.cpp @@ -99,7 +99,7 @@ Intersect Cone::localIntersect(Ray r) return ret; } -Tuple Cone::localNormalAt(Tuple point) +Tuple Cone::localNormalAt(Tuple point, Intersection *hit) { /* Compute the square of the distance from the Y axis */ double dist = point.x * point.x + point.z * point.z; diff --git a/source/shapes/cube.cpp b/source/shapes/cube.cpp index 6ee6fa7..a1847e8 100644 --- a/source/shapes/cube.cpp +++ b/source/shapes/cube.cpp @@ -59,7 +59,7 @@ Intersect Cube::localIntersect(Ray r) return ret; } -Tuple Cube::localNormalAt(Tuple point) +Tuple Cube::localNormalAt(Tuple point, Intersection *hit) { double maxC = max3(fabs(point.x), fabs(point.y), fabs(point.z)); diff --git a/source/shapes/cylinder.cpp b/source/shapes/cylinder.cpp index 07f3509..e41f879 100644 --- a/source/shapes/cylinder.cpp +++ b/source/shapes/cylinder.cpp @@ -90,7 +90,7 @@ Intersect Cylinder::localIntersect(Ray r) return ret; } -Tuple Cylinder::localNormalAt(Tuple point) +Tuple Cylinder::localNormalAt(Tuple point, Intersection *hit) { /* Compute the square of the distance from the Y axis */ double dist = point.x * point.x + point.z * point.z; diff --git a/source/shapes/group.cpp b/source/shapes/group.cpp index 32e0a92..7ce62ff 100644 --- a/source/shapes/group.cpp +++ b/source/shapes/group.cpp @@ -72,7 +72,7 @@ Intersect Group::localIntersect(Ray r) return Intersect(); } -Tuple Group::localNormalAt(Tuple point) +Tuple Group::localNormalAt(Tuple point, Intersection *hit) { return Vector(1, 0, 0); } diff --git a/source/shapes/objfile.cpp b/source/shapes/objfile.cpp index 7db6aa5..50896c4 100644 --- a/source/shapes/objfile.cpp +++ b/source/shapes/objfile.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #define MIN_ALLOC (2) #define DEFAULT_GROUP (0) @@ -33,6 +34,11 @@ OBJFile::OBJFile() : Shape(SHAPE_OBJFILE), ignoredLines(0) this->vertexList = (Point **)calloc(sizeof(Point **), MIN_ALLOC); this->vertexCount = 0; + + this->allocatedVertexNormalCount = MIN_ALLOC; + this->vertexNormalList = (Vector **)calloc(sizeof(Vector **), MIN_ALLOC); + this->vertexNormalCount = 0; + /* There is always a default group */ this->addGroup(new Group()); }; @@ -89,13 +95,24 @@ void OBJFile::addVertex(Point *vertex) this->vertexList[this->vertexCount++] = vertex; } +void OBJFile::addVertexNormal(Vector *vertexNormal) +{ + if ((this->vertexNormalCount + 1) > this->allocatedVertexNormalCount) + { + this->allocatedVertexNormalCount *= 2; + this->vertexNormalList = (Vector **)realloc(this->vertexNormalList, sizeof(Vector **) * this->allocatedVertexNormalCount); + } + + this->vertexNormalList[this->vertexNormalCount++] = vertexNormal; +} + Intersect OBJFile::intersect(Ray r) { Intersect ret; int i, j; if (this->faceGroupCount > 0) { - //if (this->bounds.intesectMe(r)) + if (this->bounds.intesectMe(r)) { for (i = 0 ; i < this->faceGroupCount ; i++) { @@ -118,7 +135,7 @@ Intersect OBJFile::localIntersect(Ray r) return Intersect(); } -Tuple OBJFile::localNormalAt(Tuple point) +Tuple OBJFile::localNormalAt(Tuple point, Intersection *hit) { return Vector(0, 1, 0); } @@ -262,11 +279,51 @@ void OBJFile::parseLine(char *line, uint32_t currentLine) } } +static int parseFaceVertex(char *buf, uint32_t &v, uint32_t &vt, uint32_t &vn) +{ + uint32_t bufPos = 0; + uint32_t lineLength = strlen(buf); + char *tmp = buf; + vt = INT32_MAX; + vn = INT32_MAX; + int ret = 0; + int token = 0; + + while(bufPos < lineLength) + { + char *next = strchr(buf, '/'); + if (next != nullptr) + { + *next = '\0'; + bufPos = next - buf; + } + else + { + bufPos = lineLength; + } + + if (strlen(buf) > 0) + { + switch(token) + { + case 0: v = atol(buf); break; + case 1: vt = atol(buf); break; + case 2: vn = atol(buf); break; + default: printf("ERROR: Too many entry for a face vertice!"); ret = 1; + } + } + buf = next + 1; + token++; + } + + return ret; +} + /* Actually execute the line */ int OBJFile::execLine(int argc, char *argv[], uint32_t currentLine) { int ret = 1; - if (strncmp(argv[0], "v", 1) == 0) + if (strncmp(argv[0], "v", 2) == 0) { /* Vertice entry */ if (argc != 4) @@ -279,25 +336,71 @@ int OBJFile::execLine(int argc, char *argv[], uint32_t currentLine) ret = 0; } } - else if (strncmp(argv[0], "f", 1) == 0) + else if (strncmp(argv[0], "vn", 3) == 0) { - /* Vertice entry */ + /* Vertice Normal entry */ + if (argc != 4) + { + printf("ERROR: Malformed file at line %d: Vertices normal expect 3 parameters!\n", currentLine); + } + else + { + this->addVertexNormal(new Vector(atof(argv[1]), atof(argv[2]), atof(argv[3]))); + ret = 0; + } + } + else if (strncmp(argv[0], "f", 2) == 0) + { + /* Faces entry */ + int i; + uint32_t v[MAX_ARGS], vt[MAX_ARGS], vn[MAX_ARGS]; + for(i = 1; i < argc; i++) + { + parseFaceVertex(argv[i], v[i], vt[i], vn[i]); + } + if (argc == 4) { - Shape *t = new Triangle(this->vertices(atoi(argv[1])), - this->vertices(atoi(argv[2])), - this->vertices(atoi(argv[3]))); + Shape *t; + if (vn[1] == INT32_MAX) + { + t = new Triangle(this->vertices(v[1]), + this->vertices(v[2]), + this->vertices(v[3])); + } + else + { + t = new SmoothTriangle(this->vertices(v[1]), + this->vertices(v[2]), + this->vertices(v[3]), + this->verticesNormal(vn[1]), + this->verticesNormal(vn[2]), + this->verticesNormal(vn[3])); + } this->faceGroupList[this->faceGroupCount - 1]->addObject(t); ret = 0; } else if (argc > 4) { - int i; for(i = 2; i < (argc - 1); i++) { - Shape *t = new Triangle(this->vertices(atoi(argv[1])), - this->vertices(atoi(argv[i])), - this->vertices(atoi(argv[i+1]))); + + Shape *t; + if (vn[1] == INT32_MAX) + { + t = new Triangle(this->vertices(v[1]), + this->vertices(v[i]), + this->vertices(v[i + 1])); + } + else + { + t = new SmoothTriangle(this->vertices(v[1]), + this->vertices(v[i]), + this->vertices(v[i + 1]), + this->verticesNormal(vn[1]), + this->verticesNormal(vn[i]), + this->verticesNormal(vn[i + 1])); + } this->faceGroupList[this->faceGroupCount - 1]->addObject(t); } ret = 0; @@ -307,7 +410,7 @@ int OBJFile::execLine(int argc, char *argv[], uint32_t currentLine) printf("ERROR: Malformed file at line %d: Too few/many parameters!\n", currentLine); } } - else if (strncmp(argv[0], "g", 1) == 0) + else if (strncmp(argv[0], "g", 2) == 0) { if (argc == 2) { diff --git a/source/shapes/plane.cpp b/source/shapes/plane.cpp index 74f37ca..bf65cf2 100644 --- a/source/shapes/plane.cpp +++ b/source/shapes/plane.cpp @@ -30,7 +30,7 @@ Intersect Plane::localIntersect(Ray r) return ret; } -Tuple Plane::localNormalAt(Tuple point) +Tuple Plane::localNormalAt(Tuple point, Intersection *hit) { return Vector(0, 1, 0); } diff --git a/source/shapes/shape.cpp b/source/shapes/shape.cpp index 5259b27..04b7be7 100644 --- a/source/shapes/shape.cpp +++ b/source/shapes/shape.cpp @@ -20,6 +20,7 @@ Shape::Shape(ShapeType type) this->type = type; this->localTransformMatrix = Matrix4().identity(); this->updateTransform(); + this->materialSet = false; } Intersect Shape::intersect(Ray r) @@ -37,11 +38,11 @@ Tuple Shape::normalToWorld(Tuple normalVector) return world_normal.normalise(); }; -Tuple Shape::normalAt(Tuple point) +Tuple Shape::normalAt(Tuple point, Intersection *hit) { Tuple local_point = this->worldToObject(point); - Tuple local_normal = this->localNormalAt(local_point); + Tuple local_normal = this->localNormalAt(local_point, hit); Tuple world_normal = this->normalToWorld(local_normal); diff --git a/source/shapes/smoothtriangle.cpp b/source/shapes/smoothtriangle.cpp new file mode 100644 index 0000000..9991d80 --- /dev/null +++ b/source/shapes/smoothtriangle.cpp @@ -0,0 +1,28 @@ +/* + * DoRayMe - a quick and dirty Raytracer + * Smooth Triangle implementation + * + * Created by Manoël Trapier + * Copyright (c) 2020 986-Studio. + * + */ +#include +#include +#include +#include +#include +#include + +SmoothTriangle::SmoothTriangle(Point p1, Point p2, Point p3, Vector n1, Vector n2, Vector n3) : Triangle(p1, p2, p3), + n1(n1), n2(n2), n3(n3) +{ + this->type = SHAPE_SMOOTHTRIANGLE; + stats.addSmoothTriangle(); +} + +Tuple SmoothTriangle::localNormalAt(Tuple point, Intersection *hit) +{ + return (this->n2 * hit->u + + this->n3 * hit->v + + this->n1 * (1 - hit->u - hit->v)).normalise(); +} \ No newline at end of file diff --git a/source/shapes/sphere.cpp b/source/shapes/sphere.cpp index b294fc6..e141d2a 100644 --- a/source/shapes/sphere.cpp +++ b/source/shapes/sphere.cpp @@ -35,7 +35,7 @@ Intersect Sphere::localIntersect(Ray r) return ret; } -Tuple Sphere::localNormalAt(Tuple point) +Tuple Sphere::localNormalAt(Tuple point, Intersection *hit) { return (point - Point(0, 0, 0)).normalise(); } diff --git a/source/shapes/testshape.cpp b/source/shapes/testshape.cpp index 6334818..23210d2 100644 --- a/source/shapes/testshape.cpp +++ b/source/shapes/testshape.cpp @@ -19,7 +19,7 @@ Intersect TestShape::localIntersect(Ray r) return Intersect(); } -Tuple TestShape::localNormalAt(Tuple point) +Tuple TestShape::localNormalAt(Tuple point, Intersection *hit) { return Vector(point.x, point.y, point.z); } \ No newline at end of file diff --git a/source/shapes/triangle.cpp b/source/shapes/triangle.cpp index 0e31514..01f7a1d 100644 --- a/source/shapes/triangle.cpp +++ b/source/shapes/triangle.cpp @@ -1,6 +1,6 @@ /* * DoRayMe - a quick and dirty Raytracer - * Cone implementation + * Triangle implementation * * Created by Manoël Trapier * Copyright (c) 2020 986-Studio. @@ -49,12 +49,12 @@ Intersect Triangle::localIntersect(Ray r) } double t = f * this->e2.dot(originCrossE1); - ret.add(Intersection(t, this)); + ret.add(Intersection(t, this, u, v)); return ret; } -Tuple Triangle::localNormalAt(Tuple point) +Tuple Triangle::localNormalAt(Tuple point, Intersection *hit) { return this->normal; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index da12918..a1cb74d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -10,7 +10,7 @@ link_libraries(rayonnement) set(TESTS_SRC math_test.cpp tuple_test.cpp colour_test.cpp canvas_test.cpp matrix_test.cpp transformation_test.cpp ray_test.cpp intersect_test.cpp sphere_test.cpp light_test.cpp material_test.cpp world_test.cpp camera_test.cpp shape_test.cpp plane_test.cpp pattern_test.cpp cube_test.cpp cylinder_test.cpp cone_test.cpp group_test.cpp - boundingbox_test.cpp triangle_test.cpp sequence_test.cpp objfile_test.cpp) + boundingbox_test.cpp triangle_test.cpp sequence_test.cpp objfile_test.cpp smoothtriangle_test.cpp) add_executable(testMyRays) target_include_directories(testMyRays PUBLIC ${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR}) @@ -147,6 +147,7 @@ add_test(NAME Chapter12_Test COMMAND $) add_test(NAME Chapter13_Test COMMAND $) add_test(NAME Chapter13_ConeBonus COMMAND $) add_test(NAME Chapter14_Test COMMAND $) +add_test(NAME Chapter15_Teapots COMMAND $) add_test(NAME AreaLight_Test COMMAND $) add_test(NAME UVMap_CheckeredSphere COMMAND $) add_test(NAME UVMap_CheckeredPlane COMMAND $) diff --git a/tests/arealight_test.cpp b/tests/arealight_test.cpp index b692558..e534a96 100644 --- a/tests/arealight_test.cpp +++ b/tests/arealight_test.cpp @@ -80,7 +80,7 @@ int main() /* ----------------------------- */ /* Set the camera */ - Camera camera = Camera(400, 160, 0.7854); + Camera camera = Camera(40, 16, 0.7854); camera.setTransform(viewTransform(Point(-3, 1, 2.5), Point(0, 0.5, 0), Vector(0, 1, 0))); diff --git a/tests/ch11_test.cpp b/tests/ch11_test.cpp index d40642c..3900cf7 100644 --- a/tests/ch11_test.cpp +++ b/tests/ch11_test.cpp @@ -104,7 +104,7 @@ int main() bg4.material.shininess = 50; w.addObject(&bg4); - /* Forground balls */ + /* Foreground balls */ /* Red sphere */ Sphere redBall = Sphere(); diff --git a/tests/ch15_teapot_objfile.cpp b/tests/ch15_teapot_objfile.cpp index cd6289c..59ebb7e 100644 --- a/tests/ch15_teapot_objfile.cpp +++ b/tests/ch15_teapot_objfile.cpp @@ -28,9 +28,9 @@ int main() World w = World(); /* Add lights */ - Light light1 = Light(POINT_LIGHT, Point(0, 20, 2), Colour(1, 1, 1)); + Light light1 = Light(POINT_LIGHT, Point(50, 100, 20), Colour(.5, .5, .5)); w.addLight(&light1); - Light light2 = Light(POINT_LIGHT, Point(0, 2, 20), Colour(1, 1, 1)); + Light light2 = Light(POINT_LIGHT, Point(2, 50, 100), Colour(.5, .5, .5)); w.addLight(&light2); /* ----------------------------- */ @@ -42,6 +42,7 @@ int main() p.material.ambient = 1; p.material.diffuse = 0; p.material.specular = 0; + p.material.reflective = 0.1; w.addObject(&p); Plane p2 = Plane(); @@ -53,26 +54,31 @@ int main() w.addObject(&p2); OBJFile teapot = OBJFile("teapot-low.obj"); - teapot.setTransform(rotationY(M_PI) * rotationX(-M_PI/2) * scaling(0.4, 0.4, 0.4)); - teapot.material.colour = Colour(1, 0.2, 0.1); - teapot.material.ambient = 0.2; - teapot.material.specular = 0.2; - teapot.material.diffuse = 20; + teapot.setTransform(translation(7, 0, 3) * rotationY(M_PI*23/22) * rotationX(-M_PI/2) * scaling(0.3, 0.3, 0.3)); + teapot.material.colour = Colour(1, 0.3, 0.2); + teapot.material.shininess = 5; + teapot.material.specular = 0.4; w.addObject(&teapot); - /* ----------------------------- */ + OBJFile teapot2 = OBJFile("teapot-lowtri.obj"); + teapot2.setTransform(translation(-7, 0, 3) * rotationY(-M_PI*46/22) * rotationX(-M_PI/2) * scaling(0.3, 0.3, 0.3)); + teapot2.material.colour = Colour(1, 0.3, 0.2); + teapot2.material.shininess = 5; + teapot2.material.specular = 0.4; + w.addObject(&teapot2); - FILE *fpOut = fopen("teapot_worlddump.json", "wt"); - if (fpOut) - { - w.dumpMe(fpOut); - fclose(fpOut); - } + OBJFile teapot3= OBJFile("teapot.obj"); + teapot3.setTransform(translation(0, 0, -5) * rotationY(-M_PI) * rotationX(-M_PI/2) * scaling(0.4, 0.4, 0.4)); + teapot3.material.colour = Colour(0.3, 1, 0.2); + teapot3.material.shininess = 5; + teapot3.material.specular = 0.4; + teapot3.material.reflective = 0.5; + w.addObject(&teapot3); /* ----------------------------- */ /* Set the camera */ - Camera camera = Camera(800, 400, M_PI/2); + Camera camera = Camera(80, 40, M_PI/2); camera.setTransform(viewTransform(Point(0, 7, 13), Point(0, 1, 0), Vector(0, 1, 0))); diff --git a/tests/intersect_test.cpp b/tests/intersect_test.cpp index 0998b36..989bb4e 100644 --- a/tests/intersect_test.cpp +++ b/tests/intersect_test.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -302,4 +303,13 @@ TEST(IntersectTest, The_Schlick_approximation_with_small_angle_and_n2_gt_n1) ASSERT_TRUE(double_equal(reflectance, 0.48873)); set_equal_precision(FLT_EPSILON); +} + +TEST(IntersectTest, An_intersection_can_encapsulage_u_and_v) +{ + Triangle s = Triangle(Point(0, 1, 0), Point(-1, 0, 0), Point(1, 0, 0)); + Intersection i = Intersection(3.5, &s, 0.2, 0.4); + + ASSERT_EQ(i.u, 0.2); + ASSERT_EQ(i.v, 0.4); } \ No newline at end of file diff --git a/tests/objfile_test.cpp b/tests/objfile_test.cpp index 31a0cd7..49e2eef 100644 --- a/tests/objfile_test.cpp +++ b/tests/objfile_test.cpp @@ -10,6 +10,7 @@ #include #include #include +#include TEST(OBJFileTest, Ignoring_unrecognised_lines) { @@ -118,4 +119,58 @@ TEST(OBJFileTest, Triangle_in_groups) ASSERT_EQ(t2->p1, parser.vertices(1)); ASSERT_EQ(t2->p2, parser.vertices(3)); ASSERT_EQ(t2->p3, parser.vertices(4)); +} + +TEST(OBJFileTest, Vertex_normal_record) +{ + const char file[] = "vn 0 0 1\n" + "vn 0.707 0 -0.707\n" + "vn 1 2 3\n"; + + OBJFile parser = OBJFile(); + parser.parseOBJFile(file); + + ASSERT_EQ(parser.verticesNormal(1), Vector(0, 0, 1)); + ASSERT_EQ(parser.verticesNormal(2), Vector(0.707, 0, -0.707)); + ASSERT_EQ(parser.verticesNormal(3), Vector(1, 2, 3)); +} + +TEST(OBJFileTest, Faces_with_normal) +{ + const char file[] = "v 0 1 0\n" + "v -1 0 0\n" + "v 1 0 0\n" + "\n" + "vn -1 0 0\n" + "vn 1 0 0\n" + "vn 0 1 0\n" + "\n" + "f 1//3 2//1 3//2\n" + "f 1/0/3 2/102/1 3/14/2\n"; + + OBJFile parser = OBJFile(); + parser.parseOBJFile(file); + + Group *g0 = parser.groups(0); + + SmoothTriangle *t1 = (SmoothTriangle *)(*g0)[0]; + SmoothTriangle *t2 = (SmoothTriangle *)(*g0)[1]; + + ASSERT_EQ(t1->p1, parser.vertices(1)); + ASSERT_EQ(t1->p2, parser.vertices(2)); + ASSERT_EQ(t1->p3, parser.vertices(3)); + + ASSERT_EQ(t1->n1, parser.verticesNormal(3)); + ASSERT_EQ(t1->n2, parser.verticesNormal(1)); + ASSERT_EQ(t1->n3, parser.verticesNormal(2)); + + ASSERT_EQ(t2->p1, parser.vertices(1)); + ASSERT_EQ(t2->p2, parser.vertices(2)); + ASSERT_EQ(t2->p3, parser.vertices(3)); + + ASSERT_EQ(t2->n1, parser.verticesNormal(3)); + ASSERT_EQ(t2->n2, parser.verticesNormal(1)); + ASSERT_EQ(t2->n3, parser.verticesNormal(2)); + + } \ No newline at end of file diff --git a/tests/smoothtriangle_test.cpp b/tests/smoothtriangle_test.cpp new file mode 100644 index 0000000..f81ab15 --- /dev/null +++ b/tests/smoothtriangle_test.cpp @@ -0,0 +1,83 @@ +/* + * DoRayMe - a quick and dirty Raytracer + * Smooth Triangle unit tests + * + * Created by Manoël Trapier + * Copyright (c) 2020 986-Studio. + * + */ +#include +#include +#include + +class SmoothTriTest : public SmoothTriangle +{ +public: + SmoothTriTest(Point p1, Point p2, Point p3, Vector n1, Vector n2, Vector n3) : SmoothTriangle(p1, p2, p3, n1, n2, n3) {}; + Intersect doLocalIntersect(Ray ray) + { + return this->localIntersect(ray); + }; + + Tuple doLocalNormalAt(Tuple point, Intersection *hit) + { + return this->localNormalAt(point, hit); + }; +}; + +Point p1 = Point(0, 1, 0); +Point p2 = Point(-1, 0, 0); +Point p3 = Point(1, 0, 0); +Vector n1 = Vector(0, 1, 0); +Vector n2 = Vector(-1, 0, 0); +Vector n3 = Vector(1, 0, 0); + +SmoothTriTest tri = SmoothTriTest(p1, p2, p3, n1, n2, n3); + +TEST(SmoothTriangleTest, Construcring_a_smooth_triangle) +{ + ASSERT_EQ(tri.p1, p1); + ASSERT_EQ(tri.p2, p2); + ASSERT_EQ(tri.p3, p3); + ASSERT_EQ(tri.n1, n1); + ASSERT_EQ(tri.n2, n2); + ASSERT_EQ(tri.n3, n3); +} + +TEST(SmoothTriangleTest, An_intersection_with_a_smooth_triangle_stores_u_v) +{ + Ray r = Ray(Point(-0.2, 0.3, -2), Vector(0, 0, 1)); + + Intersect xs = tri.doLocalIntersect(r); + + ASSERT_TRUE(double_equal(xs[0].u, 0.45)); + ASSERT_TRUE(double_equal(xs[0].v, 0.25)); +} + +TEST(SmoothTriangleTest, A_smooth_triangle_uses_u_v_to_interpolate_the_normal) +{ + Intersection i = Intersection(1, &tri, 0.45, 0.25); + + Tuple n = tri.doLocalNormalAt(Point(0, 0, 0), &i); + + /* Temporary lower the precision */ + set_equal_precision(0.00001); + + ASSERT_EQ(n, Vector(-0.5547, 0.83205, 0)); + + set_equal_precision(FLT_EPSILON); +} + +TEST(SmoothTriangleTest, Preparing_a_normal_on_a_smooth_triangle) +{ + Intersection i = Intersection(1, &tri, 0.45, 0.25); + + Tuple n = tri.normalAt(Point(0, 0, 0), &i); + + /* Temporary lower the precision */ + set_equal_precision(0.00001); + + ASSERT_EQ(n, Vector(-0.5547, 0.83205, 0)); + + set_equal_precision(FLT_EPSILON); +} diff --git a/tests/test_render.cpp b/tests/test_render.cpp index 8e8fbd2..827a66b 100644 --- a/tests/test_render.cpp +++ b/tests/test_render.cpp @@ -119,7 +119,7 @@ int main() /* ----------------------------- */ /* Set the camera */ - Camera camera = Camera(1280, 900, deg_to_rad(90)); + Camera camera = Camera(40, 10, deg_to_rad(90)); camera.setTransform(viewTransform(Point(-2, 2.5, -3.5), Point(2, 0, 3), Vector(0, 1, 0)));