diff --git a/source/include/smoothtriangle.h b/source/include/smoothtriangle.h index 3549702..378803f 100644 --- a/source/include/smoothtriangle.h +++ b/source/include/smoothtriangle.h @@ -23,6 +23,8 @@ class SmoothTriangle : public Triangle public: SmoothTriangle(Point p1, Point p2, Point p3, Vector n1, Vector n2, Vector n3); + + void dumpMe(FILE *fp); }; #endif /* DORAYME_SMOOTHTRIANGLE_H */ diff --git a/source/shapes/objfile.cpp b/source/shapes/objfile.cpp index 976f7b3..c443e59 100644 --- a/source/shapes/objfile.cpp +++ b/source/shapes/objfile.cpp @@ -214,7 +214,20 @@ void OBJFile::dumpMe(FILE * fp) fprintf(fp, "\"Objects\": {\n"); this->baseGroup->dumpMe(fp); fprintf(fp, "},\n"); - + fprintf(fp, "\"Vertices\": {\n"); + for(i = 1; i < this->vertexCount + 1; i++) + { + fprintf(fp, "\"v[%d]\": { \"x\": %f, \"y\": %f, \"z\": %f },\n", i, + this->vertices(i).x, this->vertices(i).y, this->vertices(i).z); + } + fprintf(fp, "},\n"); + fprintf(fp, "\"NormalVertices\": {\n"); + for(i = 1; i < this->vertexNormalCount + 1; i++) + { + fprintf(fp, "\"vn[%d]\": { \"x\": %f, \"y\": %f, \"z\": %f },\n", i, + this->verticesNormal(i).x, this->verticesNormal(i).y, this->verticesNormal(i).z); + } + fprintf(fp, "},\n"); Shape::dumpMe(fp); } diff --git a/source/shapes/shape.cpp b/source/shapes/shape.cpp index 04b7be7..ffc41bc 100644 --- a/source/shapes/shape.cpp +++ b/source/shapes/shape.cpp @@ -91,9 +91,12 @@ BoundingBox Shape::getBounds() void Shape::dumpMe(FILE *fp) { - fprintf(fp, "\"Material\": {\n"); - this->material.dumpMe(fp); - fprintf(fp, "},\n"); + if (this->materialSet) + { + fprintf(fp, "\"Material\": {\n"); + this->material.dumpMe(fp); + fprintf(fp, "},\n"); + } fprintf(fp, "\"DropShadow\": %d,\n", this->dropShadow); fprintf(fp, "\"BoundingBox\": {\n"); this->getBounds().dumpMe(fp); diff --git a/source/shapes/smoothtriangle.cpp b/source/shapes/smoothtriangle.cpp index 4d34a3e..42afbc9 100644 --- a/source/shapes/smoothtriangle.cpp +++ b/source/shapes/smoothtriangle.cpp @@ -25,4 +25,18 @@ Tuple SmoothTriangle::localNormalAt(Tuple point, Intersection *hit) return (this->n2 * hit->u + this->n3 * hit->v + this->n1 * (1 - hit->u - hit->v)).normalise(); +} + +void SmoothTriangle::dumpMe(FILE *fp) +{ + Tuple t = this->n1; + fprintf(fp, "\"n1\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", + t.x, t.y, t.z); + t = this->n2; + fprintf(fp, "\"n2\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", + t.x, t.y, t.z); + t = this->n3; + fprintf(fp, "\"n3\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", + t.x, t.y, t.z); + Triangle::dumpMe(fp); } \ No newline at end of file diff --git a/source/shapes/triangle.cpp b/source/shapes/triangle.cpp index ee43659..8b3195e 100644 --- a/source/shapes/triangle.cpp +++ b/source/shapes/triangle.cpp @@ -73,6 +73,8 @@ BoundingBox Triangle::getLocalBounds() void Triangle::dumpMe(FILE *fp) { fprintf(fp, "\"Type\": \"Triangle\",\n"); + + /* World points*/ Tuple t = this->transformMatrix * this->p1; fprintf(fp, "\"p1\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", t.x, t.y, t.z); @@ -82,5 +84,16 @@ void Triangle::dumpMe(FILE *fp) t = this->transformMatrix * this->p3; fprintf(fp, "\"p3\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", t.x, t.y, t.z); + + /* Local points */ + t = this->p1; + fprintf(fp, "\"lp1\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", + t.x, t.y, t.z); + t = this->p2; + fprintf(fp, "\"lp2\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", + t.x, t.y, t.z); + t = this->p3; + fprintf(fp, "\"lp3\": { \"x\": %f, \"y\": %f, \"z\": %f}, \n", + t.x, t.y, t.z); Shape::dumpMe(fp); } \ No newline at end of file diff --git a/tests/ch15_teapot_objfile.cpp b/tests/ch15_teapot_objfile.cpp index 59ebb7e..afabeba 100644 --- a/tests/ch15_teapot_objfile.cpp +++ b/tests/ch15_teapot_objfile.cpp @@ -36,44 +36,56 @@ int main() /* ----------------------------- */ /* Floor */ - Plane p = Plane(); + Material planesMaterial = Material(); CheckersPattern checkered = CheckersPattern(Colour(0.35, 0.35, 0.35), Colour(0.4, 0.4, 0.4)); - p.material.pattern = &checkered; - p.material.ambient = 1; - p.material.diffuse = 0; - p.material.specular = 0; + planesMaterial.pattern = &checkered; + planesMaterial.ambient = 1; + planesMaterial.diffuse = 0; + planesMaterial.specular = 0; + + + Plane p = Plane(); + p.setMaterial(planesMaterial); p.material.reflective = 0.1; w.addObject(&p); Plane p2 = Plane(); p2.setTransform(translation(0, 0, -10) * rotationX(M_PI/2)); - p2.material.pattern = &checkered; - p2.material.ambient = 1; - p2.material.diffuse = 0; - p2.material.specular = 0; + p2.setMaterial(planesMaterial); w.addObject(&p2); + Material lowPoly = Material(); + lowPoly.colour = Colour(1, 0.3, 0.2); + lowPoly.shininess = 5; + lowPoly.specular = 0.4; + OBJFile teapot = OBJFile("teapot-low.obj"); 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); + teapot.setMaterial(lowPoly); + w.addObject(teapot.getBaseGroup()); + + FILE *fpOut = fopen("lowpoly_teapot.json", "wt"); + if (fpOut) + { + teapot.dumpMe(fpOut); + fclose(fpOut); + } 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); + teapot2.setMaterial(lowPoly);; + w.addObject(teapot2.getBaseGroup()); + + Material highPoly = Material(); + highPoly.colour = Colour(0.3, 1, 0.2); + highPoly.shininess = 5; + highPoly.specular = 0.4; + highPoly.reflective = 0.5; 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); + teapot3.setMaterial(highPoly); + w.addObject(teapot3.getBaseGroup()); /* ----------------------------- */