Add a tool to debug the normal vector in objfiles by rendering them.

This commit is contained in:
Godzil
2020-03-11 16:59:02 +00:00
parent c667ce26d7
commit 420203e95d

View File

@@ -17,10 +17,15 @@
#include <math_helper.h> #include <math_helper.h>
#include <group.h> #include <group.h>
#include <triangle.h> #include <triangle.h>
#include <sphere.h>
#include <smoothtriangle.h> #include <smoothtriangle.h>
#include <transformation.h>
#include <cone.h>
#include <cylinder.h>
#define MIN_ALLOC (2) #define MIN_ALLOC (2)
#define DEFAULT_GROUP (0)
//#define DEBUG_NORMAL
OBJFile::OBJFile() : Shape(Shape::OBJFILE), ignoredLines(0) OBJFile::OBJFile() : Shape(Shape::OBJFILE), ignoredLines(0)
{ {
@@ -358,6 +363,58 @@ static int parseFaceVertex(char *buf, uint32_t &v, uint32_t &vt, uint32_t &vn)
return ret; return ret;
} }
#ifdef DEBUG_NORMAL
Shape *makeVector(Point pos, Vector verNorm, Colour c, double scale = 1)
{
Group *ret = new Group("Vector");
Sphere *sp = new Sphere();
Colour c2 = c;
sp->material.colour = c2;
sp->material.ambient = 1;
sp->material.refractiveIndex = 0;
sp->material.reflective = 0;
sp->material.specular = 0;
sp->materialSet = true;
sp->setTransform(translation(pos.x, pos.y, pos.z) * scaling(0.1, 0.1, 0.1));
ret->addObject(sp);
double theta = atan2(verNorm.x, verNorm.z);
double radius = verNorm.magnitude();
double phi = acos(verNorm.y / radius);
sp = new Sphere();
c2 = c;
c2.x /=3; c2.y /=3; c2.y /=3;
sp->material.colour = c2;
sp->material.ambient = 1;
sp->material.refractiveIndex = 0;
sp->material.transparency = 0;
sp->material.specular = 0;
sp->materialSet = true;
sp->setTransform(translation(pos.x, pos.y, pos.z) * translation(verNorm.x, verNorm.y, verNorm.z) * scaling(0.1, 0.1, 0.1));
ret->addObject(sp);
c2 = c;
c2.x /=2; c2.y /=3; c2.y /=2;
Cone *cn = new Cone();
cn->minCap = 0;
cn->maxCap = 1;
cn->material.colour = c2;
cn->material.ambient = 1;
cn->material.refractiveIndex = 0;
cn->material.reflective = 0;
cn->material.specular = 0;
cn->materialSet = true;
cn->setTransform(translation(pos.x, pos.y, pos.z) * rotationY(theta) * rotationX(phi) * scaling(0.1, radius, 0.1));
ret->addObject(cn);
return ret;
}
#endif
/* Actually execute the line */ /* Actually execute the line */
int OBJFile::execLine(int argc, char *argv[], uint32_t currentLine) int OBJFile::execLine(int argc, char *argv[], uint32_t currentLine)
{ {
@@ -409,18 +466,44 @@ int OBJFile::execLine(int argc, char *argv[], uint32_t currentLine)
} }
else else
{ {
#ifdef DEBUG_NORMAL
this->currentGroup->addObject(makeVector(this->vertices(v[1]),
this->verticesNormal(vn[1]),
Colour(1, 0, 1)));
this->currentGroup->addObject(makeVector(this->vertices(v[2]),
this->verticesNormal(vn[2]),
Colour(0.5, 0, 0.5)));
this->currentGroup->addObject(makeVector(this->vertices(v[3]),
this->verticesNormal(vn[3]),
Colour(0.5, 0, 1)));
t = new SmoothTriangle(this->vertices(v[1]), t = new SmoothTriangle(this->vertices(v[1]),
this->vertices(v[2]), this->vertices(v[2]),
this->vertices(v[3]), this->vertices(v[3]),
this->verticesNormal(vn[1]), this->verticesNormal(vn[1]),
this->verticesNormal(vn[2]), this->verticesNormal(vn[2]),
this->verticesNormal(vn[3])); this->verticesNormal(vn[3]));
#endif
} }
this->currentGroup->addObject(t); this->currentGroup->addObject(t);
ret = 0; ret = 0;
} }
else if (argc > 4) else if (argc > 4)
{ {
#ifdef DEBUG_NORMAL
if (vn[1] != INT32_MAX)
{
for(i = 2; i < (argc); i++)
{
this->currentGroup->addObject(makeVector(this->vertices(v[i]),
this->verticesNormal(vn[i]),
Colour(1, 1, 0)));
}
this->currentGroup->addObject(makeVector(this->vertices(v[1]),
this->verticesNormal(vn[1]),
Colour(0, 1, 0)));
}
#endif
for(i = 2; i < (argc - 1); i++) for(i = 2; i < (argc - 1); i++)
{ {
@@ -440,6 +523,7 @@ int OBJFile::execLine(int argc, char *argv[], uint32_t currentLine)
this->verticesNormal(vn[i]), this->verticesNormal(vn[i]),
this->verticesNormal(vn[i + 1])); this->verticesNormal(vn[i + 1]));
} }
this->currentGroup->addObject(t); this->currentGroup->addObject(t);
} }
ret = 0; ret = 0;