56 lines
1.0 KiB
C++
56 lines
1.0 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
#include <glm/vec3.hpp>
|
|
|
|
#include "Density.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;
|
|
public:
|
|
std::vector<glm::vec3> vertices;
|
|
std::vector<glm::uvec3> indices;
|
|
std::map<glm::vec3, int, CompareVec3> vertexLookup;
|
|
|
|
std::vector<bool> isocell;
|
|
size_t isocellVersion;
|
|
|
|
Polygonizer(Density &density, float isolevel);
|
|
void setIsoLevel(float isolevel);
|
|
|
|
void updateIsocell();
|
|
|
|
void polygonize(float resolution);
|
|
void polygonize(const glm::vec3 lower, const glm::vec3 upper,
|
|
float isolevel);
|
|
};
|