Reinstate min/max methods

This commit is contained in:
Matt Keeter 2014-03-08 13:47:51 -08:00
parent fc0f4d267c
commit cef3c92b11
3 changed files with 52 additions and 23 deletions

View file

@ -23,7 +23,6 @@ Canvas::~Canvas()
void Canvas::load_mesh(Mesh* m) void Canvas::load_mesh(Mesh* m)
{ {
mesh = new GLMesh(m); mesh = new GLMesh(m);
/*
center = QVector3D(m->xmin() + m->xmax(), center = QVector3D(m->xmin() + m->xmax(),
m->ymin() + m->ymax(), m->ymin() + m->ymax(),
m->zmin() + m->zmax()) / 2; m->zmin() + m->zmax()) / 2;
@ -31,7 +30,6 @@ void Canvas::load_mesh(Mesh* m)
pow(m->xmax() - m->xmin(), 2) + pow(m->xmax() - m->xmin(), 2) +
pow(m->ymax() - m->ymin(), 2) + pow(m->ymax() - m->ymin(), 2) +
pow(m->zmax() - m->zmin(), 2)); pow(m->zmax() - m->zmin(), 2));
*/
update(); update();
delete m; delete m;

View file

@ -3,9 +3,39 @@
#include <QVector3D> #include <QVector3D>
#include <algorithm> #include <algorithm>
#include <cmath>
#include "mesh.h" #include "mesh.h"
////////////////////////////////////////////////////////////////////////////////
Mesh::Mesh(std::vector<GLfloat> v, std::vector<GLuint> i)
: vertices(v), indices(i)
{
// Nothing to do here
}
float Mesh::min(size_t start) const
{
float v = vertices[start];
for (size_t i=start; i < vertices.size(); i += 3)
{
v = fmin(v, vertices[i]);
}
return v;
}
float Mesh::max(size_t start) const
{
float v = vertices[start];
for (size_t i=start; i < vertices.size(); i += 3)
{
v = fmax(v, vertices[i]);
}
return v;
}
////////////////////////////////////////////////////////////////////////////////
struct Vec3 struct Vec3
{ {
GLfloat x, y, z; GLfloat x, y, z;
@ -22,12 +52,9 @@ struct Vec3
} }
}; };
typedef std::pair<Vec3, GLuint> Vec3i;
Mesh::Mesh(std::vector<GLfloat> v, std::vector<GLuint> i) ////////////////////////////////////////////////////////////////////////////////
: vertices(v), indices(i)
{
// Nothing to do here
}
Mesh* Mesh::load_stl(const QString& filename) Mesh* Mesh::load_stl(const QString& filename)
{ {
@ -46,7 +73,7 @@ Mesh* Mesh::load_stl(const QString& filename)
data >> tri_count; data >> tri_count;
// Extract vertices into an array of xyz, unsigned pairs // Extract vertices into an array of xyz, unsigned pairs
QVector<std::pair<Vec3, GLuint>> verts(tri_count*3); QVector<Vec3i> verts(tri_count*3);
// Store vertices in the array, processing one triangle at a time. // Store vertices in the array, processing one triangle at a time.
for (auto v=verts.begin(); v != verts.end(); v += 3) for (auto v=verts.begin(); v != verts.end(); v += 3)
@ -89,15 +116,16 @@ Mesh* Mesh::load_stl(const QString& filename)
} }
indices[v.second] = vertex_count - 1; indices[v.second] = vertex_count - 1;
} }
verts.resize(vertex_count);
// Finally, pack unique vertices into a flat array. std::vector<float> flat_verts;
std::vector<GLfloat> unique_verts(vertex_count*3); flat_verts.reserve(vertex_count*3);
for (size_t i=0; i < vertex_count; ++i) for (auto v : verts)
{ {
unique_verts[3*i] = verts[i].first.x; flat_verts.push_back(v.first.x);
unique_verts[3*i + 1] = verts[i].first.y; flat_verts.push_back(v.first.y);
unique_verts[3*i + 2] = verts[i].first.z; flat_verts.push_back(v.first.z);
} }
return new Mesh(unique_verts, indices); return new Mesh(flat_verts, indices);
} }

View file

@ -11,14 +11,17 @@ class Mesh
public: public:
Mesh(std::vector<GLfloat> vertices, std::vector<GLuint> indices); Mesh(std::vector<GLfloat> vertices, std::vector<GLuint> indices);
static Mesh* load_stl(const QString& filename); static Mesh* load_stl(const QString& filename);
/*
float xmin() const { return vertices.row(0).minCoeff(); } float min(size_t start) const;
float xmax() const { return vertices.row(0).maxCoeff(); } float max(size_t start) const;
float ymin() const { return vertices.row(1).minCoeff(); }
float ymax() const { return vertices.row(1).maxCoeff(); } float xmin() const { return min(0); }
float zmin() const { return vertices.row(2).minCoeff(); } float ymin() const { return min(1); }
float zmax() const { return vertices.row(2).maxCoeff(); } float zmin() const { return min(2); }
*/ float xmax() const { return max(0); }
float ymax() const { return max(1); }
float zmax() const { return max(2); }
private: private:
std::vector<GLfloat> vertices; std::vector<GLfloat> vertices;
std::vector<GLuint> indices; std::vector<GLuint> indices;