-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmetaball.cpp
88 lines (71 loc) · 1.84 KB
/
metaball.cpp
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
#include "MetaBall.h"
#include "modelerdraw.h"
#include "mat.h"
MetaBall::MetaBall(float mult)
{
initialized = false;
ModelerDrawState *mds = ModelerDrawState::Instance();
int quality;
if (mds->m_rayFile) { return; }
// _setupOpenGl();
switch (mds->m_quality)
{
case HIGH:
quality = 120 * mult; break;
case MEDIUM:
quality = 88 * mult; break;
case LOW:
quality = 56 * mult; break;
case POOR:
quality = 24 * mult; break;
}
m_marchingCube = new MarchingCube(quality);
initialized = true;
}
void MetaBall::cal()
{
for (int i = 0; i < m_marchingCube->numVertices; ++i)
{
m_marchingCube->m_vertices[i].value = 0.0f;
m_marchingCube->m_vertices[i].normal.zeroElements();
}
Vec3f ballToPoint;
float squaredRadius;
Vec3f ballPosition;
float normalScale;
for (std::vector<Ball>::iterator it = m_metaBalls.begin(); it != m_metaBalls.end(); it++)
{
squaredRadius = it->squaredRadius;
ballPosition = it->position;
for (int j = 0; j < m_marchingCube->numVertices; j++) {
ballToPoint = m_marchingCube->m_vertices[j].position - ballPosition;
float squaredDistance = ballToPoint.length2();
if (squaredDistance == 0.0f)
squaredDistance = 0.0001f;
m_marchingCube->m_vertices[j].value += squaredRadius / squaredDistance;
normalScale = squaredRadius / (squaredDistance*squaredDistance);
m_marchingCube->m_vertices[j].normal += ballToPoint*normalScale;
}
}
}
void MetaBall::draw(float threshold)
{
cal();
m_marchingCube->drawSurface(threshold);
}
void MetaBall::addBallAbs(Vec3f center, float radius)
{
m_metaBalls.push_back(Ball(center, radius));
}
void MetaBall::addBallRel(float x, float y, float z, float radius)
{
Vec3f center(x, y, z);
Mat4f modelMtx;
glGetFloatv(GL_MODELVIEW_MATRIX, modelMtx[0]);
Vec3f abs = modelMtx * center;
addBallAbs(abs, radius);
}
MetaBall::~MetaBall()
{
delete m_marchingCube;
}