90 lines
2 KiB
C++
90 lines
2 KiB
C++
// This source code is property of the Computer Graphics and Visualization
|
|
// chair of the TU Dresden. Do not distribute!
|
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
|
|
|
#pragma once
|
|
|
|
#include <gui/AbstractViewer.h>
|
|
#include <gui/SliderHelper.h>
|
|
#include <util/OpenMeshUtils.h>
|
|
|
|
#include "AABBTree.h"
|
|
#include "HashGrid.h"
|
|
#include "Point.h"
|
|
#include "LineSegment.h"
|
|
#include "Triangle.h"
|
|
|
|
#include <gui/ShaderPool.h>
|
|
|
|
class Viewer : public nse::gui::AbstractViewer
|
|
{
|
|
public:
|
|
Viewer();
|
|
|
|
void drawContents();
|
|
|
|
private:
|
|
|
|
enum PrimitiveType
|
|
{
|
|
Vertex, Edge, Tri
|
|
};
|
|
|
|
void SetupGUI();
|
|
void MeshUpdated();
|
|
|
|
void FindClosestPoint(const Eigen::Vector3f& p);
|
|
void BuildGridVBO();
|
|
void BuildRayVBOs();
|
|
|
|
template <typename Grid>
|
|
void BuildGridVBO(const Grid& grid)
|
|
{
|
|
std::vector<Eigen::Vector4f> positions;
|
|
for (auto it = grid.NonEmptyCellsBegin(); it != grid.NonEmptyCellsEnd(); ++it)
|
|
{
|
|
auto box = grid.CellBounds(it->first);
|
|
AddBoxVertices(box, positions);
|
|
}
|
|
|
|
ShaderPool::Instance()->simpleShader.bind();
|
|
gridVAO.bind();
|
|
gridPositions.uploadData(positions).bindToAttribute("position");
|
|
gridVAO.unbind();
|
|
gridIndices = (GLuint)positions.size();
|
|
}
|
|
|
|
void AddBoxVertices(const Box& box, std::vector<Eigen::Vector4f>& positions);
|
|
|
|
nanogui::ComboBox* shadingBtn;
|
|
nanogui::CheckBox* chkRenderMesh;
|
|
nanogui::CheckBox* chkRenderGrid;
|
|
nanogui::CheckBox* chkRenderRay;
|
|
int raySteps;
|
|
|
|
nse::gui::VectorInput* sldQuery, *sldRayOrigin, *sldRayDir;
|
|
nanogui::ComboBox* cmbPrimitiveType;
|
|
|
|
HEMesh polymesh;
|
|
float bboxMaxLength;
|
|
MeshRenderer renderer;
|
|
|
|
AABBTree<Point> vertexTree;
|
|
AABBTree<LineSegment> edgeTree;
|
|
AABBTree<Triangle> triangleTree;
|
|
|
|
HashGrid<Point> vertexGrid;
|
|
HashGrid<LineSegment> edgeGrid;
|
|
HashGrid<Triangle> triangleGrid;
|
|
|
|
nse::gui::GLBuffer closestPositions;
|
|
nse::gui::GLVertexArray closestVAO;
|
|
|
|
nse::gui::GLBuffer gridPositions;
|
|
nse::gui::GLVertexArray gridVAO;
|
|
GLuint gridIndices;
|
|
|
|
nse::gui::GLBuffer rayPositions, rayCellsPositions;
|
|
nse::gui::GLVertexArray rayVAO, rayCellsVAO;
|
|
GLuint rayCellsIndices;
|
|
};
|