rendered paste body public class OBJImporter
{
public class ObjSurface
{
public List<Vector2> uvcoords;
public List<int> indexList;
public string name;
public ObjSurface()
{
uvcoords = new List<Vector2>();
indexList = new List<int>();
}
}
public static ModelObject Load(GraphicsDevice Device)
{
StreamReader reader = new StreamReader("belltower.obj");
List<ObjSurface> objSurfaces = new List<ObjSurface>();
ObjSurface currentSurface = new ObjSurface();
bool hasSurface = false;
List<Vector3> verticies = new List<Vector3>();
List<Vector2> uvcoords = new List<Vector2>();
int indCount = 0; // total number of indicies
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
line = line.Trim();
if (line.Length < 1)
continue;
switch (line[0])
{
case 'o': // object name
break;
case 'v': // vertex
if (line[1] == 't') // uv coord
{
string data = line.Substring(3);
string[] values = data.Split(' ');
Vector2 coord = new Vector2(float.Parse(values[0]), float.Parse(values[1]));
currentSurface.uvcoords.Add(coord);
uvcoords.Add(coord);
}
else
{
string data = line.Substring(2);
string[] values = data.Split(' ');
Vector3 vert = new Vector3(float.Parse(values[0]), float.Parse(values[1]), float.Parse(values[2]));
verticies.Add(vert);
}
break;
case 'f': // face
string fData = line.Substring(2);
string[] fValues = fData.Split(' ');
for (int i = 0; i < fValues.Length; i++)
{
string[] index = fValues[i].Split('/');
currentSurface.indexList.Add(int.Parse(index[0]));
indCount++;
}
break;
case 'u': // assume usemtl option
string surfaceName = line.Substring(7);
if (hasSurface)
objSurfaces.Add(currentSurface);
currentSurface = new ObjSurface();
currentSurface.name = surfaceName;
hasSurface = true;
//Console.WriteLine(surfaceName);
break;
}
}
reader.Close();
foreach (ObjSurface objSurf in objSurfaces)
Console.WriteLine("Surface: " + objSurf.name + ", UVs: " + objSurf.uvcoords.Count + ", Indicies: " + objSurf.indexList.Count);
VertexPositionTexture[] vpt = new VertexPositionTexture[verticies.Count];
for(int i = 0; i < verticies.Count; i++)
{
vpt[i] = new VertexPositionTexture(verticies[i], uvcoords[i]);
}
ModelObject modelObject = new ModelObject();
ModelSurface surface = new ModelSurface();
VertexBuffer vertexBuffer = new VertexBuffer(Device, VertexPositionTexture.SizeInBytes * verticies.Count, ResourceUsage.None, ResourceManagementMode.Automatic);
vertexBuffer.SetData<VertexPositionTexture>(vpt);
surface.VertexBuffer = vertexBuffer;
short[] indicies = new short[indCount];
int currentInd = 0;
for (int s = 0; s < objSurfaces.Count; s++)
{
for (int i = 0; i < objSurfaces[s].indexList.Count; i++)
{
indicies[currentInd] = (short)(objSurfaces[s].indexList[i] - 1);
currentInd++;
}
}
surface.IndexBuffer = new IndexBuffer(Device, typeof(short), indCount, ResourceUsage.None, ResourceManagementMode.Automatic);
surface.IndexBuffer.SetData<short>(indicies);
int baseVert = 0;
foreach (ObjSurface objSurf in objSurfaces)
{
ModelSurfacePart part = new ModelSurfacePart();
part.BaseVertex = 0;
part.NumVertices = objSurf.indexList.Count;
part.PrimitiveCount = objSurf.indexList.Count / 3;
part.StartIndex = baseVert;
part.StreamOffset = 0;
part.VertexDeclaration = new VertexDeclaration(Device, VertexPositionTexture.VertexElements);
part.VertexStride = VertexPositionTexture.SizeInBytes;
baseVert += objSurf.indexList.Count;
if (File.Exists(objSurf.name + ".tga"))
{
part.texture = Texture2D.FromFile(Device, objSurf.name + ".tga");
part.hasTexture = true;
}
else
part.hasTexture = false;
surface.SurfaceParts.Add(part);
}
modelObject.Surfaces.Add(surface);
return modelObject;
}
}