-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSolidFactory.cpp
More file actions
126 lines (115 loc) · 4.52 KB
/
SolidFactory.cpp
File metadata and controls
126 lines (115 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "SolidFactory.h"
#include <Core/Exceptions.h>
#include <Logging/Logger.h>
#include "MshObjLoader.h"
#include "TetGenLoader.h"
#include "TypeConverter.h"
using namespace OpenEngine;
Solid* SolidFactory::Create(std::string name) {
logger.info << "Loading solid: " << name << logger.end;
Solid* solid = new Solid();
ISolidLoader* loader = NULL;
std::string dataDir = "projects/FractureSim/data/solids/";
float scale = 1.0;
if (name == "tetrahedron") {
//tetrahedra: vpool: 4, body tetrahedra: 1, surface triangles: 4
loader = new TetGenLoader
(dataDir + "tetrahedron.1.node",
dataDir + "tetrahedron.1.ele",
dataDir + "tetrahedron.1.smesh");
scale = 5.0;
} else if (name == "box") {
//box: vpool: 14, body tetrahedra: 17, surface triangles: 24
loader = new TetGenLoader
(dataDir + "box.1.node",
dataDir + "box.1.ele",
dataDir + "box.1.smesh");
scale = 10;
} else if (name == "sphere") {
//sphere: vpool: 119, body tetrahedra: 328, surface triangles: 212
loader = new TetGenLoader
(dataDir + "sphere.1.node",
dataDir + "sphere.1.ele",
dataDir + "sphere.1.smesh");
scale = 0.3;
} else if (name == "bar_20x20x20" || name == "bar20") {
loader = new TetGenLoader
(dataDir + "bar_20x20x20.1.node",
dataDir + "bar_20x20x20.1.ele",
dataDir + "bar_20x20x20.1.smesh");
scale = 1;
} else if (name == "bar_10x10x10" || name == "bar10") {
loader = new TetGenLoader
(dataDir + "bar_10x10x10.1.node",
dataDir + "bar_10x10x10.1.ele",
dataDir + "bar_10x10x10.1.smesh");
scale = 1;
} else if (name == "bar_5x5x5" || name == "bar5") {
loader = new TetGenLoader
(dataDir + "bar_5x5x5.1.node",
dataDir + "bar_5x5x5.1.ele",
dataDir + "bar_5x5x5.1.smesh");
scale = 1;
} else if (name == "bar_2_5x2_5x2_5" || name == "bar2_5") {
loader = new TetGenLoader
(dataDir + "bar_2_5x2_5x2_5.1.node",
dataDir + "bar_2_5x2_5x2_5.1.ele",
dataDir + "bar_2_5x2_5x2_5.1.smesh");
scale = 1;
} else if (name == "tooth_slice") {
loader = new TetGenLoader
(dataDir + "tooth_slice.1.node",
dataDir + "tooth_slice.1.ele",
dataDir + "tooth_slice.1.smesh");
scale = 10;
} else if (name == "tooth_noslice") {
loader = new TetGenLoader
(dataDir + "tooth_noslice.1.node",
dataDir + "tooth_noslice.1.ele",
dataDir + "tooth_noslice.1.smesh");
scale = 10;
} else if (name == "tooth_slice_simple") {
loader = new TetGenLoader
(dataDir + "tooth_slice_simple.1.node",
dataDir + "tooth_slice_simple.1.ele",
dataDir + "tooth_slice_simple.1.smesh");
scale = 10;
} else if (name == "tooth_noslice_simple") {
loader = new TetGenLoader
(dataDir + "tooth_noslice_simple.1.node",
dataDir + "tooth_noslice_simple.1.ele",
dataDir + "tooth_noslice_simple.1.smesh");
scale = 10;
} else if (name == "test_tooth") {
loader = new TetGenLoader
(dataDir + "test_tooth.1.node",
dataDir + "test_tooth.1.ele",
dataDir + "test_tooth.1.smesh");
scale = 5.0;
} else if (name == "test_tooth_high_res") {
loader = new TetGenLoader
(dataDir + "test_tooth_high_res.1.node",
dataDir + "test_tooth_high_res.1.ele",
dataDir + "test_tooth_high_res.1.smesh");
scale = 5.0;
} else
throw Core::Exception("unknown solid");
loader->Load();
logger.info << "number of vertices: "
<< loader->GetVertexPool().size() << logger.end;
logger.info << "number of body tetrahedra: "
<< loader->GetBody().size() << logger.end;
logger.info << "number of surface triangles: "
<< loader->GetSurface().size() << logger.end;
CHECK_FOR_CUDA_ERROR();
solid = new Solid();
solid->state = new TetrahedralTLEDState();
solid->vertexpool = TypeConverter
::ConvertToVertexPool(loader->GetVertexPool());
solid->body = TypeConverter
::ConvertToBody(loader->GetBody());
solid->surface = TypeConverter
::ConvertToSurface(loader->GetSurface());
solid->vertexpool->Scale(scale);
return solid;
}