Skip to content

Commit cdec7f1

Browse files
committed
quantities on simple triangle meshes
1 parent b68e6b9 commit cdec7f1

13 files changed

Lines changed: 291 additions & 35 deletions

examples/demo-app/demo_app.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,9 @@ void processFileOBJ(std::string filename) {
190190
polyscope::getSurfaceMesh(niceName)->addFaceScalarQuantity("categorical face", fCat,
191191
polyscope::DataType::CATEGORICAL);
192192

193+
psSimpleMesh->addFaceScalarQuantity("face area", fArea, polyscope::DataType::MAGNITUDE);
194+
psSimpleMesh->addFaceColorQuantity("fColor", fColor);
195+
193196

194197
// size_t nEdges = psMesh->nEdges();
195198

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ extern const ShaderReplacementRule MESH_PROPAGATE_CULLPOS;
3636
extern const ShaderReplacementRule MESH_PROPAGATE_PICK;
3737
extern const ShaderReplacementRule MESH_PROPAGATE_PICK_SIMPLE;
3838
extern const ShaderReplacementRule MESH_PROPAGATE_TYPE_AND_BASECOLOR2_SHADE;
39+
extern const ShaderReplacementRule SIMPLE_MESH_PROPAGATE_FACE_VALUE;
40+
extern const ShaderReplacementRule SIMPLE_MESH_PROPAGATE_FACE_COLOR;
3941

4042

4143
} // namespace backend_openGL3

include/polyscope/simple_triangle_mesh.h

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ class SimpleTriangleMesh;
2424

2525
// Forward declare quantity types
2626
class SimpleTriangleMeshScalarQuantity;
27+
class SimpleTriangleMeshVertexScalarQuantity;
28+
class SimpleTriangleMeshFaceScalarQuantity;
2729
class SimpleTriangleMeshColorQuantity;
30+
class SimpleTriangleMeshVertexColorQuantity;
31+
class SimpleTriangleMeshFaceColorQuantity;
2832

2933
struct SimpleTriangleMeshPickResult {
3034
// this does nothing for now, just matching pattern from other structures
@@ -64,12 +68,19 @@ class SimpleTriangleMesh : public Structure {
6468

6569
// Scalars
6670
template <class T>
67-
SimpleTriangleMeshScalarQuantity* addVertexScalarQuantity(std::string name, const T& values,
68-
DataType type = DataType::STANDARD);
71+
SimpleTriangleMeshVertexScalarQuantity* addVertexScalarQuantity(std::string name, const T& values,
72+
DataType type = DataType::STANDARD);
73+
74+
template <class T>
75+
SimpleTriangleMeshFaceScalarQuantity* addFaceScalarQuantity(std::string name, const T& values,
76+
DataType type = DataType::STANDARD);
6977

7078
// Colors
7179
template <class T>
72-
SimpleTriangleMeshColorQuantity* addVertexColorQuantity(std::string name, const T& values);
80+
SimpleTriangleMeshVertexColorQuantity* addVertexColorQuantity(std::string name, const T& values);
81+
82+
template <class T>
83+
SimpleTriangleMeshFaceColorQuantity* addFaceColorQuantity(std::string name, const T& values);
7384

7485
// === Mutate
7586

@@ -134,10 +145,13 @@ class SimpleTriangleMesh : public Structure {
134145
void setPickUniforms(render::ShaderProgram& p);
135146

136147
// === Quantity adder implementations
137-
SimpleTriangleMeshScalarQuantity* addVertexScalarQuantityImpl(std::string name, const std::vector<float>& data,
138-
DataType type);
139-
SimpleTriangleMeshColorQuantity* addVertexColorQuantityImpl(std::string name,
140-
const std::vector<glm::vec3>& colors);
148+
SimpleTriangleMeshVertexScalarQuantity* addVertexScalarQuantityImpl(std::string name, const std::vector<float>& data,
149+
DataType type);
150+
SimpleTriangleMeshFaceScalarQuantity* addFaceScalarQuantityImpl(std::string name, const std::vector<float>& data,
151+
DataType type);
152+
SimpleTriangleMeshVertexColorQuantity* addVertexColorQuantityImpl(std::string name,
153+
const std::vector<glm::vec3>& colors);
154+
SimpleTriangleMeshFaceColorQuantity* addFaceColorQuantityImpl(std::string name, const std::vector<glm::vec3>& colors);
141155

142156
// == Picking related things
143157
size_t pickStart;

include/polyscope/simple_triangle_mesh.ipp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,31 @@ void SimpleTriangleMesh::update(const V& newPositions, const F& newFaces) {
4545
// =====================================================
4646

4747
template <class T>
48-
SimpleTriangleMeshScalarQuantity* SimpleTriangleMesh::addVertexScalarQuantity(std::string name, const T& values,
49-
DataType type) {
48+
SimpleTriangleMeshVertexScalarQuantity* SimpleTriangleMesh::addVertexScalarQuantity(std::string name, const T& values,
49+
DataType type) {
5050
validateSize(values, nVertices(), "vertex scalar quantity " + name);
5151
return addVertexScalarQuantityImpl(name, standardizeArray<float, T>(values), type);
5252
}
5353

5454
template <class T>
55-
SimpleTriangleMeshColorQuantity* SimpleTriangleMesh::addVertexColorQuantity(std::string name, const T& values) {
55+
SimpleTriangleMeshFaceScalarQuantity* SimpleTriangleMesh::addFaceScalarQuantity(std::string name, const T& values,
56+
DataType type) {
57+
validateSize(values, nFaces(), "face scalar quantity " + name);
58+
return addFaceScalarQuantityImpl(name, standardizeArray<float, T>(values), type);
59+
}
60+
61+
template <class T>
62+
SimpleTriangleMeshVertexColorQuantity* SimpleTriangleMesh::addVertexColorQuantity(std::string name, const T& values) {
5663
validateSize(values, nVertices(), "vertex color quantity " + name);
5764
return addVertexColorQuantityImpl(name, standardizeVectorArray<glm::vec3, 3>(values));
5865
}
5966

67+
template <class T>
68+
SimpleTriangleMeshFaceColorQuantity* SimpleTriangleMesh::addFaceColorQuantity(std::string name, const T& values) {
69+
validateSize(values, nFaces(), "face color quantity " + name);
70+
return addFaceColorQuantityImpl(name, standardizeVectorArray<glm::vec3, 3>(values));
71+
}
72+
6073

6174
// Shorthand to get a mesh from polyscope
6275
inline SimpleTriangleMesh* getSimpleTriangleMesh(std::string name) {

include/polyscope/simple_triangle_mesh_color_quantity.h

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,39 @@ class SimpleTriangleMeshColorQuantity : public SimpleTriangleMeshQuantity,
2020
virtual void refresh() override;
2121
virtual std::string niceName() override;
2222

23-
std::string definedOn;
23+
const std::string definedOn;
2424

2525
protected:
26-
void createProgram();
2726
std::shared_ptr<render::ShaderProgram> program;
27+
28+
virtual void createProgram() = 0;
29+
};
30+
31+
32+
// ========================================================
33+
// ========== Vertex Color ==========
34+
// ========================================================
35+
36+
class SimpleTriangleMeshVertexColorQuantity : public SimpleTriangleMeshColorQuantity {
37+
public:
38+
SimpleTriangleMeshVertexColorQuantity(std::string name, const std::vector<glm::vec3>& colors,
39+
SimpleTriangleMesh& mesh);
40+
41+
virtual void createProgram() override;
2842
};
2943

44+
45+
// ========================================================
46+
// ========== Face Color ==========
47+
// ========================================================
48+
49+
class SimpleTriangleMeshFaceColorQuantity : public SimpleTriangleMeshColorQuantity {
50+
public:
51+
SimpleTriangleMeshFaceColorQuantity(std::string name, const std::vector<glm::vec3>& colors,
52+
SimpleTriangleMesh& mesh);
53+
54+
virtual void createProgram() override;
55+
};
56+
57+
3058
} // namespace polyscope

include/polyscope/simple_triangle_mesh_scalar_quantity.h

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,39 @@ class SimpleTriangleMeshScalarQuantity : public SimpleTriangleMeshQuantity,
2222
virtual void refresh() override;
2323
virtual std::string niceName() override;
2424

25+
const std::string definedOn;
2526

2627
protected:
27-
std::string definedOn;
2828
std::shared_ptr<render::ShaderProgram> program;
2929

30-
void createProgram();
30+
virtual void createProgram() = 0;
3131
};
3232

33+
34+
// ========================================================
35+
// ========== Vertex Scalar ==========
36+
// ========================================================
37+
38+
class SimpleTriangleMeshVertexScalarQuantity : public SimpleTriangleMeshScalarQuantity {
39+
public:
40+
SimpleTriangleMeshVertexScalarQuantity(std::string name, const std::vector<float>& values, SimpleTriangleMesh& mesh,
41+
DataType dataType = DataType::STANDARD);
42+
43+
virtual void createProgram() override;
44+
};
45+
46+
47+
// ========================================================
48+
// ========== Face Scalar ==========
49+
// ========================================================
50+
51+
class SimpleTriangleMeshFaceScalarQuantity : public SimpleTriangleMeshScalarQuantity {
52+
public:
53+
SimpleTriangleMeshFaceScalarQuantity(std::string name, const std::vector<float>& values, SimpleTriangleMesh& mesh,
54+
DataType dataType = DataType::STANDARD);
55+
56+
virtual void createProgram() override;
57+
};
58+
59+
3360
} // namespace polyscope

src/render/mock_opengl/mock_gl_engine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2233,6 +2233,8 @@ void MockGLEngine::populateDefaultShadersAndRules() {
22332233
registerShaderRule("MESH_PROPAGATE_TYPE_AND_BASECOLOR2_SHADE", MESH_PROPAGATE_TYPE_AND_BASECOLOR2_SHADE);
22342234
registerShaderRule("MESH_PROPAGATE_PICK", MESH_PROPAGATE_PICK);
22352235
registerShaderRule("MESH_PROPAGATE_PICK_SIMPLE", MESH_PROPAGATE_PICK_SIMPLE);
2236+
registerShaderRule("SIMPLE_MESH_PROPAGATE_FACE_VALUE", SIMPLE_MESH_PROPAGATE_FACE_VALUE);
2237+
registerShaderRule("SIMPLE_MESH_PROPAGATE_FACE_COLOR", SIMPLE_MESH_PROPAGATE_FACE_COLOR);
22362238

22372239
// volume gridcube things
22382240
registerShaderRule("GRIDCUBE_PROPAGATE_NODE_VALUE", GRIDCUBE_PROPAGATE_NODE_VALUE);

src/render/opengl/gl_engine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2716,6 +2716,8 @@ void GLEngine::populateDefaultShadersAndRules() {
27162716
registerShaderRule("MESH_PROPAGATE_TYPE_AND_BASECOLOR2_SHADE", MESH_PROPAGATE_TYPE_AND_BASECOLOR2_SHADE);
27172717
registerShaderRule("MESH_PROPAGATE_PICK", MESH_PROPAGATE_PICK);
27182718
registerShaderRule("MESH_PROPAGATE_PICK_SIMPLE", MESH_PROPAGATE_PICK_SIMPLE);
2719+
registerShaderRule("SIMPLE_MESH_PROPAGATE_FACE_VALUE", SIMPLE_MESH_PROPAGATE_FACE_VALUE);
2720+
registerShaderRule("SIMPLE_MESH_PROPAGATE_FACE_COLOR", SIMPLE_MESH_PROPAGATE_FACE_COLOR);
27192721

27202722
// volume gridcube things
27212723
registerShaderRule("GRIDCUBE_PROPAGATE_NODE_VALUE", GRIDCUBE_PROPAGATE_NODE_VALUE);

src/render/opengl/shaders/surface_mesh_shaders.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,40 @@ const ShaderReplacementRule MESH_PROPAGATE_PICK_SIMPLE ( // this one does faces
731731
);
732732

733733

734+
// Uses gl_PrimitiveID to look up per-face scalar data from a 1D texture.
735+
// Requires indexed triangle drawing (DrawMode::IndexedTriangles) where primitive index == face index.
736+
const ShaderReplacementRule SIMPLE_MESH_PROPAGATE_FACE_VALUE(
737+
/* rule name */ "SIMPLE_MESH_PROPAGATE_FACE_VALUE",
738+
{ /* replacement sources */
739+
{"FRAG_DECLARATIONS", R"(
740+
uniform sampler1D t_faceValues;
741+
)"},
742+
{"GENERATE_SHADE_VALUE", R"(
743+
float shadeValue = texelFetch(t_faceValues, gl_PrimitiveID, 0).r;
744+
)"},
745+
},
746+
/* uniforms */ {},
747+
/* attributes */ {},
748+
/* textures */ {{"t_faceValues", 1}}
749+
);
750+
751+
// Uses gl_PrimitiveID to look up per-face color data from a 1D texture.
752+
// Requires indexed triangle drawing (DrawMode::IndexedTriangles) where primitive index == face index.
753+
const ShaderReplacementRule SIMPLE_MESH_PROPAGATE_FACE_COLOR(
754+
/* rule name */ "SIMPLE_MESH_PROPAGATE_FACE_COLOR",
755+
{ /* replacement sources */
756+
{"FRAG_DECLARATIONS", R"(
757+
uniform sampler1D t_faceColors;
758+
)"},
759+
{"GENERATE_SHADE_VALUE", R"(
760+
vec3 shadeColor = texelFetch(t_faceColors, gl_PrimitiveID, 0).rgb;
761+
)"},
762+
},
763+
/* uniforms */ {},
764+
/* attributes */ {},
765+
/* textures */ {{"t_faceColors", 1}}
766+
);
767+
734768
// clang-format on
735769

736770
} // namespace backend_openGL3

src/simple_triangle_mesh.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -355,19 +355,34 @@ glm::vec3 SimpleTriangleMesh::getBackFaceColor() { return backFaceColor.get(); }
355355

356356
// === Quantity adder implementations
357357

358-
SimpleTriangleMeshScalarQuantity* SimpleTriangleMesh::addVertexScalarQuantityImpl(std::string name,
359-
const std::vector<float>& data,
360-
DataType type) {
358+
SimpleTriangleMeshVertexScalarQuantity*
359+
SimpleTriangleMesh::addVertexScalarQuantityImpl(std::string name, const std::vector<float>& data, DataType type) {
361360
checkForQuantityWithNameAndDeleteOrError(name);
362-
SimpleTriangleMeshScalarQuantity* q = new SimpleTriangleMeshScalarQuantity(name, data, "vertex", *this, type);
361+
SimpleTriangleMeshVertexScalarQuantity* q = new SimpleTriangleMeshVertexScalarQuantity(name, data, *this, type);
363362
addQuantity(q);
364363
return q;
365364
}
366365

367-
SimpleTriangleMeshColorQuantity* SimpleTriangleMesh::addVertexColorQuantityImpl(std::string name,
368-
const std::vector<glm::vec3>& colors) {
366+
SimpleTriangleMeshFaceScalarQuantity*
367+
SimpleTriangleMesh::addFaceScalarQuantityImpl(std::string name, const std::vector<float>& data, DataType type) {
369368
checkForQuantityWithNameAndDeleteOrError(name);
370-
SimpleTriangleMeshColorQuantity* q = new SimpleTriangleMeshColorQuantity(name, colors, "vertex", *this);
369+
SimpleTriangleMeshFaceScalarQuantity* q = new SimpleTriangleMeshFaceScalarQuantity(name, data, *this, type);
370+
addQuantity(q);
371+
return q;
372+
}
373+
374+
SimpleTriangleMeshVertexColorQuantity*
375+
SimpleTriangleMesh::addVertexColorQuantityImpl(std::string name, const std::vector<glm::vec3>& colors) {
376+
checkForQuantityWithNameAndDeleteOrError(name);
377+
SimpleTriangleMeshVertexColorQuantity* q = new SimpleTriangleMeshVertexColorQuantity(name, colors, *this);
378+
addQuantity(q);
379+
return q;
380+
}
381+
382+
SimpleTriangleMeshFaceColorQuantity*
383+
SimpleTriangleMesh::addFaceColorQuantityImpl(std::string name, const std::vector<glm::vec3>& colors) {
384+
checkForQuantityWithNameAndDeleteOrError(name);
385+
SimpleTriangleMeshFaceColorQuantity* q = new SimpleTriangleMeshFaceColorQuantity(name, colors, *this);
371386
addQuantity(q);
372387
return q;
373388
}

0 commit comments

Comments
 (0)