asteroidgen/src/Polygoniser.h

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);
};