62 lines
1.2 KiB
C++
62 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
#include "types.h"
|
|
#include "Density.h"
|
|
#include "ProgressMonitor.h"
|
|
|
|
struct CompareVec3 {
|
|
bool operator()(const glm::vec3 &lhs, const glm::vec3 &rhs) {
|
|
static const float epsilon = 1e-5;
|
|
if (lhs.x < rhs.x - epsilon)
|
|
return true;
|
|
else if (lhs.x > rhs.x + epsilon)
|
|
return false;
|
|
else {
|
|
if (lhs.y < rhs.y - epsilon)
|
|
return true;
|
|
else if (lhs.y > rhs.y + epsilon)
|
|
return false;
|
|
else {
|
|
if (lhs.z < rhs.z - epsilon)
|
|
return true;
|
|
else if (lhs.z > rhs.z + epsilon)
|
|
return false;
|
|
else {
|
|
return false;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
class Polygonizer {
|
|
Density &density;
|
|
float isolevel;
|
|
|
|
std::vector<bool> isocell;
|
|
size_t isocellVersion;
|
|
float isocellIsolevel;
|
|
|
|
void polygonize(const glm::vec3 &lower, const glm::vec3 &upper,
|
|
float isolevel);
|
|
|
|
void calculateLayer(std::vector<float> &layer, float resolution, size_t nSamples, float z);
|
|
|
|
public:
|
|
vec3v_t vertices;
|
|
uvec3v_t indices;
|
|
std::map<glm::vec3, int, CompareVec3> vertexLookup;
|
|
|
|
|
|
Polygonizer(Density &density, float isolevel);
|
|
void setIsoLevel(float isolevel);
|
|
|
|
void updateIsocell();
|
|
|
|
void polygonize(float resolution, ProgressMonitor &progress);
|
|
};
|