This is what I'm getting:
And:
It's important to note that there are 3 meshes that make up this model. The first being the spokes, the second being the emblem in the middle of said spokes and he third being the rim pictured above. You can see a little from the top picture and much better in the second picture the disruption at one side with all the lines running through the middle to it. The general shape is there but it seems like there is one little bit that's just not working right.
Alright, onto the code. I hope someone can see some fault in my horribly ugly logic that I'm not seeing....be gentle.
else if (Buffer.substr(0, 1) == "f")
{
if (MatName == "")
{
std::stringstream ss;
ss << Mesh_Identifier++;
MatName = ss.str();
std::vector<boost::shared_ptr<vec3>> Vertex_Vec;
Vertex_Map_It = Vertex_Map.insert(std::pair<std::string, std::vector<boost::shared_ptr<vec3>>>(MatName, Vertex_Vec));
std::vector<boost::shared_ptr<vec3>> Texcoord_Vec;
Texcoord_Map_It = Texcoord_Map.insert(std::pair<std::string, std::vector<boost::shared_ptr<vec3>>>(MatName, Texcoord_Vec));
std::vector<boost::shared_ptr<vec3>> Normal_Vec;
Normal_Map_It = Normal_Map.insert(std::pair<std::string, std::vector<boost::shared_ptr<vec3>>>(MatName, Normal_Vec));
}
if (New_Mesh == true)
{
std::cout << "Face New_Mesh" << std::endl;
New_Mesh = false;
}
int iVertex;
int iTexcoord;
int iNormal;
int NumNodes = 0;
boost::shared_ptr<Node> NewNode;
boost::shared_ptr<Node> FirstNode;
boost::shared_ptr<Node> LastNode;
line >> line_type;
while (line.good())
{
NewNode.reset(new Node);
NumNodes++;
size_t found;
int NumSlashes = 0;
std::string SubLine;
line >> SubLine;
found = SubLine.find("//");
if (found != SubLine.npos)
{
SubLine.replace(SubLine.find("//"), 2, " ");
std::istringstream Values(SubLine);
Values >> iVertex >> iNormal;
NewNode->Vertex = Vertex_Vector[abs(iVertex)-1];
NewNode->Normal = Normal_Vector[abs(iNormal)-1];
NumSlashes = 999;
break;
}
else
{
while (true)
{
found = SubLine.find('/');
if (found != SubLine.npos)
{
NumSlashes += 1;
SubLine.replace(found, 1, " ");
}
else
{
break;
}
}
std::istringstream Values(SubLine);
if (NumSlashes == 0)
{
Values >> iVertex;
NewNode->Vertex = Vertex_Vector[abs(iVertex)-1];
}
if (NumSlashes == 1)
{
Values >> iVertex >> iTexcoord;
NewNode->Vertex = Vertex_Vector[abs(iVertex)-1];
NewNode->Texcoord = Texcoord_Vector[abs(iTexcoord)-1];
}
if (NumSlashes == 2)
{
Values >> iVertex >> iTexcoord >> iNormal;
NewNode->Vertex = Vertex_Vector[abs(iVertex)-1];
NewNode->Texcoord = Texcoord_Vector[abs(iTexcoord)-1];
NewNode->Normal = Normal_Vector[abs(iNormal)-1];
}
}
if (FirstNode == NULL)
{
FirstNode = NewNode;
}
if (LastNode == NULL)
{
LastNode = NewNode;
}
else
{
NewNode->PrevNode = LastNode;
NewNode->NextNode = FirstNode;
LastNode->NextNode = NewNode;
LastNode = NewNode;
FirstNode->PrevNode = NewNode;
}
}
//Make sure our Doubly Linked List is doubly linked all the way around.
for (boost::shared_ptr<Node> Temp = FirstNode; Temp->NextNode != FirstNode; Temp = Temp->NextNode)
{
Temp->NextNode->PrevNode = Temp;
}
if (NumNodes > 3)
{
boost::shared_ptr<Node> Triangle = FirstNode;
while(true)
{
if (Triangle->NextNode->NextNode->NextNode == Triangle)
{
if (Triangle->PrevNode->Vertex != NULL) Vertex_Map_It->second.push_back(Triangle->PrevNode->Vertex);
if (Triangle->PrevNode->Normal != NULL) Normal_Map_It->second.push_back(Triangle->PrevNode->Normal);
if (Triangle->PrevNode->Texcoord != NULL) Texcoord_Map_It->second.push_back(Triangle->PrevNode->Texcoord);
if (Triangle->Vertex != NULL) Vertex_Map_It->second.push_back(Triangle->Vertex);
if (Triangle->Normal != NULL) Normal_Map_It->second.push_back(Triangle->Normal);
if (Triangle->Texcoord != NULL) Texcoord_Map_It->second.push_back(Triangle->Texcoord);
if (Triangle->NextNode->Vertex != NULL) Vertex_Map_It->second.push_back(Triangle->NextNode->Vertex);
if (Triangle->NextNode->Normal != NULL) Normal_Map_It->second.push_back(Triangle->NextNode->Normal);
if (Triangle->NextNode->Texcoord != NULL) Texcoord_Map_It->second.push_back(Triangle->NextNode->Texcoord);
break;
}
bool Pure_Tri = true;
for (boost::shared_ptr<Node> Point = FirstNode->NextNode->NextNode; Point->NextNode != Triangle->PrevNode; Point = Point->NextNode)
{
vec3 v0 = *(Triangle->PrevNode->Vertex) - *(Triangle->Vertex);
vec3 v1 = *(Triangle->NextNode->Vertex) - *(Triangle->Vertex);
vec3 v2 = *(Point->Vertex) - *(Point->Vertex);
float dot00 = v0.DotProduct(v0);
float dot01 = v0.DotProduct(v1);
float dot02 = v0.DotProduct(v2);
float dot11 = v1.DotProduct(v1);
float dot12 = v1.DotProduct(v2);
float invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
float u = (dot11 * dot02 - dot01 * dot12) * invDenom;
float v = (dot00 * dot12 - dot01 * dot02) * invDenom;
if (u >= 0 && v >= 0 && u + v < 1)
{
Pure_Tri = false;
break;
}
}
if (Pure_Tri == true)
{
if (Triangle->PrevNode->Vertex != NULL) Vertex_Map_It->second.push_back(Triangle->PrevNode->Vertex);
if (Triangle->PrevNode->Normal != NULL) Normal_Map_It->second.push_back(Triangle->PrevNode->Normal);
if (Triangle->PrevNode->Texcoord != NULL) Texcoord_Map_It->second.push_back(Triangle->PrevNode->Texcoord);
if (Triangle->Vertex != NULL) Vertex_Map_It->second.push_back(Triangle->Vertex);
if (Triangle->Normal != NULL) Normal_Map_It->second.push_back(Triangle->Normal);
if (Triangle->Texcoord != NULL) Texcoord_Map_It->second.push_back(Triangle->Texcoord);
if (Triangle->NextNode->Vertex != NULL) Vertex_Map_It->second.push_back(Triangle->NextNode->Vertex);
if (Triangle->NextNode->Normal != NULL) Normal_Map_It->second.push_back(Triangle->NextNode->Normal);
if (Triangle->NextNode->Texcoord != NULL) Texcoord_Map_It->second.push_back(Triangle->NextNode->Texcoord);
boost::shared_ptr<Node> Temp = Triangle->NextNode;
Triangle->PrevNode->NextNode = Triangle->NextNode;
Triangle->NextNode->PrevNode = Triangle->PrevNode;
Triangle = Temp;
}
else
{
Triangle = Triangle->NextNode;
}
}
}
else if (NumNodes == 3)
{
boost::shared_ptr<Node> Temp = FirstNode;
while(true)
{
if (Temp->Vertex != NULL) Vertex_Map_It->second.push_back(Temp->Vertex);
if (Temp->Normal != NULL) Normal_Map_It->second.push_back(Temp->Normal);
if (Temp->Texcoord != NULL) Texcoord_Map_It->second.push_back(Temp->Texcoord);
if (Temp->NextNode == FirstNode) break;
else Temp = Temp->NextNode;
}
}
else if (NumNodes < 3)
{
std::cout << "Less than 3 nodes!" << std::endl;
system("PAUSE");
}
}