1 /**
2 Copyright: Copyright (c) 2016-2018 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 module voxelman.model.obj;
7 
8 import std.algorithm : splitter, startsWith;
9 import std.conv : to;
10 import std..string : lineSplitter, stripLeft;
11 
12 import voxelman.math;
13 
14 import voxelman.container.buffer : Buffer;
15 import voxelman.model.utils : unrollFaces;
16 import voxelman.model.mesh;
17 
18 Vector!(T, 3)[] readObjFile(T)(string fileName)
19 {
20 	import std.file : read;
21 	string data = cast(string)read(fileName);
22 	return parseObj!T(data);
23 }
24 
25 Vector!(T, 3)[] parseObj(T)(string fileData)
26 {
27 	auto lines = fileData.lineSplitter;
28 
29 	Buffer!(Vector!(T, 3)) vertices;
30 	Buffer!Face3 faces;
31 
32 	foreach (line; lines)
33 	{
34 		if (line.startsWith("v "))
35 		{
36 			Vector!(T, 3) v;
37 			string items = cast(string)line[2..$];
38 
39 			size_t i;
40 			foreach(num; items.splitter)
41 			{
42 				v.arrayof[i] = to!T(num);
43 				++i;
44 			}
45 			vertices.put(v);
46 		}
47 		else if (line.startsWith("f "))
48 		{
49 			int[3] face;
50 
51 			size_t i;
52 			foreach (pol; line[2..$].splitter)
53 			{
54 				int ind = to!int(pol.splitter("/").front) - 1;
55 				face[i] = ind;
56 				++i;
57 			}
58 			faces.put(Face3(face));
59 		}
60 	}
61 
62 	return unrollFaces(vertices.data, faces.data);
63 }