Skip to content

Commit 3fa1cb7

Browse files
authored
add integer buffer types and sparse volume grid structure (#386)
* initial sparse volume grid * initial impl for sparse volume grid quantities * add edges test * change rendering strategy for edges and normals * ui width tweak * add integer vector types * more fixes to add vector int buffers * fix slice planes for sparse grid * fix tests and shader bug * fix up node value indexing * avoid reallocation in point cloud * use random colors for demo * test picking * split sparse volume quantities to separate classes, improve picking * fix includes for Windows * fix node indexing convention * run formatter * comment fixes
1 parent 150d201 commit 3fa1cb7

29 files changed

+2673
-111
lines changed

examples/demo-app/demo_app.cpp

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
#include "polyscope/point_cloud.h"
1313
#include "polyscope/render/managed_buffer.h"
1414
#include "polyscope/simple_triangle_mesh.h"
15+
#include "polyscope/sparse_volume_grid.h"
1516
#include "polyscope/surface_mesh.h"
1617
#include "polyscope/types.h"
1718
#include "polyscope/view.h"
1819
#include "polyscope/volume_grid.h"
1920
#include "polyscope/volume_mesh.h"
2021

2122
#include <iostream>
23+
#include <set>
2224
#include <unordered_set>
2325
#include <utility>
2426

@@ -544,6 +546,90 @@ void addVolumeGrid() {
544546
}
545547

546548

549+
void addSparseVolumeGrid() {
550+
glm::vec3 origin{-1., -1., -1.};
551+
int32_t N = 20;
552+
glm::vec3 cellWidth{1.0f / N, 1.0f / N, 1.0f / N};
553+
554+
// Build a spherical shell of occupied cells
555+
std::vector<glm::ivec3> occupiedCells;
556+
for (int i = -N; i <= N; i++) {
557+
for (int j = -N; j <= N; j++) {
558+
for (int k = -N; k <= N; k++) {
559+
glm::vec3 cellCenter = origin + (glm::vec3(i, j, k) + 0.5f) * cellWidth;
560+
float dist = glm::length(cellCenter - origin);
561+
if (dist >= 0.35f && dist <= 1.0f) {
562+
occupiedCells.push_back({i, j, k});
563+
}
564+
}
565+
}
566+
}
567+
// Gather all unique nodes for the occupied cells
568+
// Node (ci+dx, cj+dy, ck+dz) for dx,dy,dz in {0,1}
569+
std::set<std::tuple<int, int, int>> nodeSet;
570+
for (const auto& ci : occupiedCells) {
571+
for (int dx = 0; dx < 2; dx++) {
572+
for (int dy = 0; dy < 2; dy++) {
573+
for (int dz = 0; dz < 2; dz++) {
574+
nodeSet.insert({ci.x + dx, ci.y + dy, ci.z + dz});
575+
}
576+
}
577+
}
578+
}
579+
580+
std::cout << "adding sparse volume grid with " << occupiedCells.size() << " cells" << std::endl;
581+
polyscope::SparseVolumeGrid* psGrid =
582+
polyscope::registerSparseVolumeGrid("sparse grid", origin, cellWidth, occupiedCells);
583+
584+
// Cell scalar: distance from origin
585+
{
586+
std::vector<float> cellDist(occupiedCells.size());
587+
for (size_t i = 0; i < occupiedCells.size(); i++) {
588+
glm::vec3 cellCenter = origin + (glm::vec3(occupiedCells[i]) + 0.5f) * cellWidth;
589+
cellDist[i] = glm::length(cellCenter - origin);
590+
}
591+
psGrid->addCellScalarQuantity("cell distance", cellDist);
592+
}
593+
594+
// Node scalar: x-coordinate at node positions
595+
{
596+
597+
std::vector<glm::ivec3> nodeIndices;
598+
std::vector<float> nodeValues;
599+
for (const auto& nodeInds : nodeSet) {
600+
int32_t ni, nj, nk;
601+
std::tie(ni, nj, nk) = nodeInds;
602+
nodeIndices.push_back({ni, nj, nk});
603+
glm::vec3 nodePos = origin + glm::vec3(ni, nj, nk) * cellWidth;
604+
nodeValues.push_back(nodePos.x);
605+
}
606+
psGrid->addNodeScalarQuantity("node x-coord", nodeIndices, nodeValues);
607+
}
608+
609+
// Cell color: random colors
610+
{
611+
std::vector<glm::vec3> cellColors(occupiedCells.size());
612+
for (size_t i = 0; i < occupiedCells.size(); i++) {
613+
cellColors[i] = glm::vec3{polyscope::randomUnit(), polyscope::randomUnit(), polyscope::randomUnit()};
614+
}
615+
psGrid->addCellColorQuantity("cell color", cellColors);
616+
}
617+
618+
// Node color: random colors
619+
{
620+
std::vector<glm::ivec3> nodeIndices;
621+
std::vector<glm::vec3> nodeColors;
622+
for (const auto& nodeInds : nodeSet) {
623+
int32_t ni, nj, nk;
624+
std::tie(ni, nj, nk) = nodeInds;
625+
nodeIndices.push_back({ni, nj, nk});
626+
nodeColors.push_back(glm::vec3{polyscope::randomUnit(), polyscope::randomUnit(), polyscope::randomUnit()});
627+
}
628+
psGrid->addNodeColorQuantity("node color", nodeIndices, nodeColors);
629+
}
630+
}
631+
632+
547633
void loadFloatingImageData(polyscope::CameraView* targetView = nullptr) {
548634

549635
// load an image from disk as example data
@@ -864,6 +950,10 @@ void callback() {
864950
addVolumeGrid();
865951
}
866952

953+
if (ImGui::Button("add sparse volume grid")) {
954+
addSparseVolumeGrid();
955+
}
956+
867957
// ImPlot
868958
// dummy data
869959
if (ImGui::TreeNode("ImPlot")) {
@@ -911,7 +1001,7 @@ int main(int argc, char** argv) {
9111001
// polyscope::view::windowWidth = 600;
9121002
// polyscope::view::windowHeight = 800;
9131003
// polyscope::options::maxFPS = -1;
914-
polyscope::options::verbosity = 101;
1004+
polyscope::options::verbosity = 200;
9151005
polyscope::options::enableRenderErrorChecks = true;
9161006
polyscope::options::allowHeadlessBackends = true;
9171007

include/polyscope/numeric_helpers.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,19 @@ inline bool allComponentsFinite<glm::vec4>(const glm::vec4& x) {
7272
return glm::all(glm::isfinite(x));
7373
}
7474

75+
template <>
76+
inline bool allComponentsFinite<glm::ivec2>(const glm::ivec2& x) {
77+
return true;
78+
}
79+
template <>
80+
inline bool allComponentsFinite<glm::ivec3>(const glm::ivec3& x) {
81+
return true;
82+
}
83+
template <>
84+
inline bool allComponentsFinite<glm::ivec4>(const glm::ivec4& x) {
85+
return true;
86+
}
87+
7588
template <>
7689
inline bool allComponentsFinite<glm::uvec2>(const glm::uvec2& x) {
7790
return true;

include/polyscope/render/engine.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ enum class RenderDataType {
4747
Matrix44Float,
4848
Float,
4949
Int,
50+
Vector2Int,
51+
Vector3Int,
52+
Vector4Int,
5053
UInt,
5154
Vector2UInt,
5255
Vector3UInt,
@@ -78,6 +81,9 @@ class AttributeBuffer {
7881
virtual void setData(const std::vector<float>& data) = 0;
7982
virtual void setData(const std::vector<double>& data) = 0;
8083
virtual void setData(const std::vector<int32_t>& data) = 0;
84+
virtual void setData(const std::vector<glm::ivec2>& data) = 0;
85+
virtual void setData(const std::vector<glm::ivec3>& data) = 0;
86+
virtual void setData(const std::vector<glm::ivec4>& data) = 0;
8187
virtual void setData(const std::vector<uint32_t>& data) = 0;
8288
virtual void setData(const std::vector<glm::uvec2>& data) = 0;
8389
virtual void setData(const std::vector<glm::uvec3>& data) = 0;
@@ -107,6 +113,9 @@ class AttributeBuffer {
107113
virtual glm::vec3 getData_vec3(size_t ind) = 0;
108114
virtual glm::vec4 getData_vec4(size_t ind) = 0;
109115
virtual int getData_int(size_t ind) = 0;
116+
virtual glm::ivec2 getData_ivec2(size_t ind) = 0;
117+
virtual glm::ivec3 getData_ivec3(size_t ind) = 0;
118+
virtual glm::ivec4 getData_ivec4(size_t ind) = 0;
110119
virtual uint32_t getData_uint32(size_t ind) = 0;
111120
virtual glm::uvec2 getData_uvec2(size_t ind) = 0;
112121
virtual glm::uvec3 getData_uvec3(size_t ind) = 0;
@@ -119,6 +128,9 @@ class AttributeBuffer {
119128
virtual std::vector<glm::vec3> getDataRange_vec3(size_t ind, size_t count) = 0;
120129
virtual std::vector<glm::vec4> getDataRange_vec4(size_t ind, size_t count) = 0;
121130
virtual std::vector<int> getDataRange_int(size_t ind, size_t count) = 0;
131+
virtual std::vector<glm::ivec2> getDataRange_ivec2(size_t ind, size_t count) = 0;
132+
virtual std::vector<glm::ivec3> getDataRange_ivec3(size_t ind, size_t count) = 0;
133+
virtual std::vector<glm::ivec4> getDataRange_ivec4(size_t ind, size_t count) = 0;
122134
virtual std::vector<uint32_t> getDataRange_uint32(size_t ind, size_t count) = 0;
123135
virtual std::vector<glm::uvec2> getDataRange_uvec2(size_t ind, size_t count) = 0;
124136
virtual std::vector<glm::uvec3> getDataRange_uvec3(size_t ind, size_t count) = 0;
@@ -155,6 +167,9 @@ class TextureBuffer {
155167
virtual void setData(const std::vector<float>& data) = 0;
156168
virtual void setData(const std::vector<double>& data) = 0;
157169
virtual void setData(const std::vector<int32_t>& data) = 0;
170+
virtual void setData(const std::vector<glm::ivec2>& data) = 0;
171+
virtual void setData(const std::vector<glm::ivec3>& data) = 0;
172+
virtual void setData(const std::vector<glm::ivec4>& data) = 0;
158173
virtual void setData(const std::vector<uint32_t>& data) = 0;
159174
virtual void setData(const std::vector<glm::uvec2>& data) = 0;
160175
virtual void setData(const std::vector<glm::uvec3>& data) = 0;
@@ -364,6 +379,9 @@ class ShaderProgram {
364379
virtual void setUniform(std::string name, glm::vec4 val) = 0;
365380
virtual void setUniform(std::string name, std::array<float, 3> val) = 0;
366381
virtual void setUniform(std::string name, float x, float y, float z, float w) = 0;
382+
virtual void setUniform(std::string name, glm::ivec2 val) = 0;
383+
virtual void setUniform(std::string name, glm::ivec3 val) = 0;
384+
virtual void setUniform(std::string name, glm::ivec4 val) = 0;
367385
virtual void setUniform(std::string name, glm::uvec2 val) = 0;
368386
virtual void setUniform(std::string name, glm::uvec3 val) = 0;
369387
virtual void setUniform(std::string name, glm::uvec4 val) = 0;

include/polyscope/render/managed_buffer.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,11 @@ class ManagedBufferRegistry {
290290
ManagedBufferMap<std::array<glm::vec3,2>> managedBufferMap_arr2vec3;
291291
ManagedBufferMap<std::array<glm::vec3,3>> managedBufferMap_arr3vec3;
292292
ManagedBufferMap<std::array<glm::vec3,4>> managedBufferMap_arr4vec3;
293-
ManagedBufferMap<uint32_t> managedBufferMap_uint32;
294293
ManagedBufferMap<int32_t> managedBufferMap_int32;
294+
ManagedBufferMap<glm::ivec2> managedBufferMap_ivec2;
295+
ManagedBufferMap<glm::ivec3> managedBufferMap_ivec3;
296+
ManagedBufferMap<glm::ivec4> managedBufferMap_ivec4;
297+
ManagedBufferMap<uint32_t> managedBufferMap_uint32;
295298
ManagedBufferMap<glm::uvec2> managedBufferMap_uvec2;
296299
ManagedBufferMap<glm::uvec3> managedBufferMap_uvec3;
297300
ManagedBufferMap<glm::uvec4> managedBufferMap_uvec4;

include/polyscope/render/mock_opengl/mock_gl_engine.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ class GLAttributeBuffer : public AttributeBuffer {
2727
void setData(const std::vector<float>& data) override;
2828
void setData(const std::vector<double>& data) override;
2929
void setData(const std::vector<int32_t>& data) override;
30+
void setData(const std::vector<glm::ivec2>& data) override;
31+
void setData(const std::vector<glm::ivec3>& data) override;
32+
void setData(const std::vector<glm::ivec4>& data) override;
3033
void setData(const std::vector<uint32_t>& data) override;
3134
void setData(const std::vector<glm::uvec2>& data) override;
3235
void setData(const std::vector<glm::uvec3>& data) override;
@@ -46,6 +49,9 @@ class GLAttributeBuffer : public AttributeBuffer {
4649
glm::vec3 getData_vec3(size_t ind) override;
4750
glm::vec4 getData_vec4(size_t ind) override;
4851
int getData_int(size_t ind) override;
52+
glm::ivec2 getData_ivec2(size_t ind) override;
53+
glm::ivec3 getData_ivec3(size_t ind) override;
54+
glm::ivec4 getData_ivec4(size_t ind) override;
4955
uint32_t getData_uint32(size_t ind) override;
5056
glm::uvec2 getData_uvec2(size_t ind) override;
5157
glm::uvec3 getData_uvec3(size_t ind) override;
@@ -58,6 +64,9 @@ class GLAttributeBuffer : public AttributeBuffer {
5864
std::vector<glm::vec3> getDataRange_vec3(size_t ind, size_t count) override;
5965
std::vector<glm::vec4> getDataRange_vec4(size_t ind, size_t count) override;
6066
std::vector<int> getDataRange_int(size_t ind, size_t count) override;
67+
std::vector<glm::ivec2> getDataRange_ivec2(size_t ind, size_t count) override;
68+
std::vector<glm::ivec3> getDataRange_ivec3(size_t ind, size_t count) override;
69+
std::vector<glm::ivec4> getDataRange_ivec4(size_t ind, size_t count) override;
6170
std::vector<uint32_t> getDataRange_uint32(size_t ind, size_t count) override;
6271
std::vector<glm::uvec2> getDataRange_uvec2(size_t ind, size_t count) override;
6372
std::vector<glm::uvec3> getDataRange_uvec3(size_t ind, size_t count) override;
@@ -113,6 +122,9 @@ class GLTextureBuffer : public TextureBuffer {
113122
void setData(const std::vector<float>& data) override;
114123
void setData(const std::vector<double>& data) override;
115124
void setData(const std::vector<int32_t>& data) override;
125+
void setData(const std::vector<glm::ivec2>& data) override;
126+
void setData(const std::vector<glm::ivec3>& data) override;
127+
void setData(const std::vector<glm::ivec4>& data) override;
116128
void setData(const std::vector<uint32_t>& data) override;
117129
void setData(const std::vector<glm::uvec2>& data) override;
118130
void setData(const std::vector<glm::uvec3>& data) override;
@@ -257,6 +269,9 @@ class GLShaderProgram : public ShaderProgram {
257269
void setUniform(std::string name, glm::vec4 val) override;
258270
void setUniform(std::string name, std::array<float, 3> val) override;
259271
void setUniform(std::string name, float x, float y, float z, float w) override;
272+
void setUniform(std::string name, glm::ivec2 val) override;
273+
void setUniform(std::string name, glm::ivec3 val) override;
274+
void setUniform(std::string name, glm::ivec4 val) override;
260275
void setUniform(std::string name, glm::uvec2 val) override;
261276
void setUniform(std::string name, glm::uvec3 val) override;
262277
void setUniform(std::string name, glm::uvec4 val) override;

include/polyscope/render/opengl/gl_engine.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class GLAttributeBuffer : public AttributeBuffer {
5555
void setData(const std::vector<float>& data) override;
5656
void setData(const std::vector<double>& data) override;
5757
void setData(const std::vector<int32_t>& data) override;
58+
void setData(const std::vector<glm::ivec2>& data) override;
59+
void setData(const std::vector<glm::ivec3>& data) override;
60+
void setData(const std::vector<glm::ivec4>& data) override;
5861
void setData(const std::vector<uint32_t>& data) override;
5962
void setData(const std::vector<glm::uvec2>& data) override;
6063
void setData(const std::vector<glm::uvec3>& data) override;
@@ -74,6 +77,9 @@ class GLAttributeBuffer : public AttributeBuffer {
7477
glm::vec3 getData_vec3(size_t ind) override;
7578
glm::vec4 getData_vec4(size_t ind) override;
7679
int getData_int(size_t ind) override;
80+
glm::ivec2 getData_ivec2(size_t ind) override;
81+
glm::ivec3 getData_ivec3(size_t ind) override;
82+
glm::ivec4 getData_ivec4(size_t ind) override;
7783
uint32_t getData_uint32(size_t ind) override;
7884
glm::uvec2 getData_uvec2(size_t ind) override;
7985
glm::uvec3 getData_uvec3(size_t ind) override;
@@ -86,6 +92,9 @@ class GLAttributeBuffer : public AttributeBuffer {
8692
std::vector<glm::vec3> getDataRange_vec3(size_t ind, size_t count) override;
8793
std::vector<glm::vec4> getDataRange_vec4(size_t ind, size_t count) override;
8894
std::vector<int> getDataRange_int(size_t ind, size_t count) override;
95+
std::vector<glm::ivec2> getDataRange_ivec2(size_t ind, size_t count) override;
96+
std::vector<glm::ivec3> getDataRange_ivec3(size_t ind, size_t count) override;
97+
std::vector<glm::ivec4> getDataRange_ivec4(size_t ind, size_t count) override;
8998
std::vector<uint32_t> getDataRange_uint32(size_t ind, size_t count) override;
9099
std::vector<glm::uvec2> getDataRange_uvec2(size_t ind, size_t count) override;
91100
std::vector<glm::uvec3> getDataRange_uvec3(size_t ind, size_t count) override;
@@ -145,6 +154,9 @@ class GLTextureBuffer : public TextureBuffer {
145154
void setData(const std::vector<float>& data) override;
146155
void setData(const std::vector<double>& data) override;
147156
void setData(const std::vector<int32_t>& data) override;
157+
void setData(const std::vector<glm::ivec2>& data) override;
158+
void setData(const std::vector<glm::ivec3>& data) override;
159+
void setData(const std::vector<glm::ivec4>& data) override;
148160
void setData(const std::vector<uint32_t>& data) override;
149161
void setData(const std::vector<glm::uvec2>& data) override;
150162
void setData(const std::vector<glm::uvec3>& data) override;
@@ -300,6 +312,9 @@ class GLShaderProgram : public ShaderProgram {
300312
void setUniform(std::string name, glm::vec4 val) override;
301313
void setUniform(std::string name, std::array<float, 3> val) override;
302314
void setUniform(std::string name, float x, float y, float z, float w) override;
315+
void setUniform(std::string name, glm::ivec2 val) override;
316+
void setUniform(std::string name, glm::ivec3 val) override;
317+
void setUniform(std::string name, glm::ivec4 val) override;
303318
void setUniform(std::string name, glm::uvec2 val) override;
304319
void setUniform(std::string name, glm::uvec3 val) override;
305320
void setUniform(std::string name, glm::uvec4 val) override;

include/polyscope/render/opengl/shaders/grid_shaders.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,16 @@ extern const ShaderStageSpecification FLEX_GRIDCUBE_PLANE_FRAG_SHADER;
2020
extern const ShaderReplacementRule GRIDCUBE_PROPAGATE_NODE_VALUE;
2121
extern const ShaderReplacementRule GRIDCUBE_PROPAGATE_CELL_VALUE;
2222
extern const ShaderReplacementRule GRIDCUBE_WIREFRAME;
23+
extern const ShaderReplacementRule GRIDCUBE_PLANE_WIREFRAME;
2324
extern const ShaderReplacementRule GRIDCUBE_CONSTANT_PICK;
2425
extern const ShaderReplacementRule GRIDCUBE_CULLPOS_FROM_CENTER;
26+
extern const ShaderReplacementRule GRIDCUBE_PLANE_CULLPOS_FROM_CENTER;
27+
28+
// Attribute-based rules for sparse volume grid quantities
29+
extern const ShaderReplacementRule GRIDCUBE_PROPAGATE_ATTR_CELL_SCALAR;
30+
extern const ShaderReplacementRule GRIDCUBE_PROPAGATE_ATTR_CELL_COLOR;
31+
extern const ShaderReplacementRule GRIDCUBE_PROPAGATE_ATTR_NODE_SCALAR;
32+
extern const ShaderReplacementRule GRIDCUBE_PROPAGATE_ATTR_NODE_COLOR;
2533

2634

2735
} // namespace backend_openGL3

0 commit comments

Comments
 (0)