Go a bit deeper in parsing the OBJ file. Now we parse each lines into token, and it's now ready to try to execute them.
This commit is contained in:
@@ -36,6 +36,8 @@ protected:
|
|||||||
void addGroup(Shape *group);
|
void addGroup(Shape *group);
|
||||||
void addVertex(Tuple *vertex);
|
void addVertex(Tuple *vertex);
|
||||||
|
|
||||||
|
void parseLine(char *line);
|
||||||
|
int execLine(int argc, char *argv[]);
|
||||||
BoundingBox bounds;
|
BoundingBox bounds;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -44,8 +46,15 @@ public:
|
|||||||
|
|
||||||
int parseOBJFile(const char *content);
|
int parseOBJFile(const char *content);
|
||||||
|
|
||||||
|
|
||||||
|
Intersect intersect(Ray r);
|
||||||
BoundingBox getLocalBounds();
|
BoundingBox getLocalBounds();
|
||||||
bool haveFiniteBounds() { return true; };
|
BoundingBox getBounds();
|
||||||
|
|
||||||
|
void updateBoundingBox();
|
||||||
|
void updateTransform();
|
||||||
|
|
||||||
|
void dumpMe(FILE * fp);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* DORAYME_OBJFILE_H */
|
#endif /* DORAYME_OBJFILE_H */
|
||||||
|
|||||||
@@ -157,7 +157,6 @@ void Group::updateTransform()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We are force to do them all the time */
|
|
||||||
if (this->unboxableObjectCount > 0)
|
if (this->unboxableObjectCount > 0)
|
||||||
{
|
{
|
||||||
for(i = 0; i < this->unboxableObjectCount; i++)
|
for(i = 0; i < this->unboxableObjectCount; i++)
|
||||||
|
|||||||
@@ -88,17 +88,83 @@ void OBJFile::addVertex(Tuple *vertex)
|
|||||||
this->vertexList[this->vertexCount++] = vertex;
|
this->vertexList[this->vertexCount++] = vertex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Intersect OBJFile::intersect(Ray r)
|
||||||
|
{
|
||||||
|
Intersect ret;
|
||||||
|
int i, j;
|
||||||
|
if (this->faceGroupCount > 0)
|
||||||
|
{
|
||||||
|
if (this->bounds.intesectMe(r))
|
||||||
|
{
|
||||||
|
for (i = 0 ; i < this->faceGroupCount ; i++)
|
||||||
|
{
|
||||||
|
Intersect xs = this->faceGroupList[i]->intersect(r);
|
||||||
|
if (xs.count() > 0)
|
||||||
|
{
|
||||||
|
for (j = 0 ; j < xs.count() ; j++)
|
||||||
|
{
|
||||||
|
ret.add(xs[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
Intersect OBJFile::localIntersect(Ray r)
|
Intersect OBJFile::localIntersect(Ray r)
|
||||||
{
|
{
|
||||||
|
return Intersect();
|
||||||
}
|
}
|
||||||
|
|
||||||
Tuple OBJFile::localNormalAt(Tuple point)
|
Tuple OBJFile::localNormalAt(Tuple point)
|
||||||
{
|
{
|
||||||
|
return Vector(0, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BoundingBox OBJFile::getLocalBounds()
|
BoundingBox OBJFile::getLocalBounds()
|
||||||
|
{
|
||||||
|
return this->bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
BoundingBox OBJFile::getBounds()
|
||||||
|
{
|
||||||
|
if (this->bounds.isEmpty()) { this->updateBoundingBox(); }
|
||||||
|
return this->bounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OBJFile::updateBoundingBox()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
this->bounds.reset();
|
||||||
|
|
||||||
|
for(i = 0; i < this->faceGroupCount; i++)
|
||||||
|
{
|
||||||
|
if (this->faceGroupList[i]->haveFiniteBounds())
|
||||||
|
{
|
||||||
|
BoundingBox objB = this->faceGroupList[i]->getBounds();
|
||||||
|
this->bounds | objB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OBJFile::updateTransform()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
Shape::updateTransform();
|
||||||
|
for (i = 0 ; i < this->faceGroupCount ; i++)
|
||||||
|
{
|
||||||
|
this->faceGroupList[i]->updateTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Once the full stack being notified of the changes, let's update the
|
||||||
|
* bounding box
|
||||||
|
*/
|
||||||
|
this->updateBoundingBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OBJFile::dumpMe(FILE * fp)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -129,17 +195,59 @@ int OBJFile::parseOBJFile(const char *content)
|
|||||||
}
|
}
|
||||||
if (lineLength >= MAX_LINE_LENGTH)
|
if (lineLength >= MAX_LINE_LENGTH)
|
||||||
{
|
{
|
||||||
printf("ERROR: Line %d is too long! (%d)\n", currentLineNum);
|
printf("ERROR: Line %d is too long! (%d)\n", currentLineNum, lineLength);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
memset(lineBuff, 0, MAX_LINE_LENGTH);
|
memset(lineBuff, 0, MAX_LINE_LENGTH);
|
||||||
strncpy(lineBuff, bufferPos, lineLength);
|
strncpy(lineBuff, bufferPos, lineLength);
|
||||||
|
|
||||||
printf("line %d = %s\n", currentLineNum, lineBuff);
|
this->parseLine(lineBuff);
|
||||||
|
|
||||||
bufferPos += lineLength + 1;
|
bufferPos += lineLength + 1;
|
||||||
currentLineNum++;
|
currentLineNum++;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAX_ARGS (15)
|
||||||
|
|
||||||
|
/* Parse the line into a couple ofr argc/argv using space as argument separator */
|
||||||
|
void OBJFile::parseLine(char *line)
|
||||||
|
{
|
||||||
|
char *argv[MAX_ARGS];
|
||||||
|
uint32_t argc = 0;
|
||||||
|
|
||||||
|
char *buffer = line;
|
||||||
|
uint32_t lineLength = strlen(line);
|
||||||
|
uint32_t linePos = 0;
|
||||||
|
|
||||||
|
/* First argument */
|
||||||
|
argv[argc++] = line;
|
||||||
|
|
||||||
|
while(linePos < lineLength)
|
||||||
|
{
|
||||||
|
char *next = strchr(buffer, ' ');
|
||||||
|
if (next != nullptr)
|
||||||
|
{
|
||||||
|
*next = '\0';
|
||||||
|
linePos = next - line;
|
||||||
|
buffer = next + 1;
|
||||||
|
argv[argc++] = buffer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
linePos = lineLength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->execLine(argc, argv))
|
||||||
|
{
|
||||||
|
this->ignoredLines++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Actually execute the line */
|
||||||
|
int OBJFile::execLine(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user