asteroidgen/src/Polygoniser.h

62 lines
1.2 KiB
C
Raw Normal View History

2017-10-26 12:49:45 +02:00
#pragma once
#include <vector>
#include <map>
2017-11-02 03:44:44 +01:00
#include "types.h"
2017-10-26 12:49:45 +02:00
#include "Density.h"
2017-11-02 03:44:44 +01:00
#include "ProgressMonitor.h"
2017-10-26 12:49:45 +02:00
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 {
2017-10-29 05:16:22 +01:00
Density &density;
float isolevel;
2017-10-26 12:49:45 +02:00
2017-10-29 05:16:22 +01:00
std::vector<bool> isocell;
size_t isocellVersion;
2017-11-02 03:44:44 +01:00
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;
2017-10-26 12:49:45 +02:00
2017-10-29 05:16:22 +01:00
Polygonizer(Density &density, float isolevel);
void setIsoLevel(float isolevel);
2017-10-26 12:49:45 +02:00
2017-10-29 05:16:22 +01:00
void updateIsocell();
2017-10-26 12:49:45 +02:00
2017-11-02 03:44:44 +01:00
void polygonize(float resolution, ProgressMonitor &progress);
2017-10-26 12:49:45 +02:00
};