Skip to content

Commit 3ed92a0

Browse files
committed
Added support for rendering textured lines.
1 parent 9e5817d commit 3ed92a0

11 files changed

Lines changed: 96 additions & 16 deletions

File tree

GLLib/GLMesh.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ void GLMesh::AddEdge(int n0, int n1, int groupID)
144144
e.n[1] = n1;
145145
e.vr[0] = Node(n0).r;
146146
e.vr[1] = Node(n1).r;
147+
e.vt[0] = Node(n0).t;
148+
e.vt[1] = Node(n1).t;
147149
e.c[0] = Node(n0).c;
148150
e.c[1] = Node(n1).c;
149151
e.pid = groupID;
@@ -159,6 +161,8 @@ void GLMesh::AddEdge(int* n, int nodes, int gid)
159161
e.n[1] = n[1];
160162
e.vr[0] = Node(n[0]).r;
161163
e.vr[1] = Node(n[1]).r;
164+
e.vt[0] = Node(n[0]).t;
165+
e.vt[1] = Node(n[1]).t;
162166
e.c[0] = Node(n[0]).c;
163167
e.c[1] = Node(n[1]).c;
164168

@@ -171,6 +175,8 @@ void GLMesh::AddEdge(int* n, int nodes, int gid)
171175
e.n[1] = n[2];
172176
e.vr[0] = Node(n[0]).r;
173177
e.vr[1] = Node(n[2]).r;
178+
e.vt[0] = Node(n[0]).t;
179+
e.vt[1] = Node(n[2]).t;
174180
e.c[0] = Node(n[0]).c;
175181
e.c[1] = Node(n[2]).c;
176182
e.pid = gid;
@@ -180,6 +186,8 @@ void GLMesh::AddEdge(int* n, int nodes, int gid)
180186
e.n[1] = n[1];
181187
e.vr[0] = Node(n[2]).r;
182188
e.vr[1] = Node(n[1]).r;
189+
e.vt[0] = Node(n[2]).t;
190+
e.vt[1] = Node(n[1]).t;
183191
e.c[0] = Node(n[2]).c;
184192
e.c[1] = Node(n[1]).c;
185193

@@ -192,6 +200,8 @@ void GLMesh::AddEdge(int* n, int nodes, int gid)
192200
e.n[1] = n[2];
193201
e.vr[0] = Node(n[0]).r;
194202
e.vr[1] = Node(n[2]).r;
203+
e.vt[0] = Node(n[0]).t;
204+
e.vt[1] = Node(n[2]).t;
195205
e.c[0] = Node(n[0]).c;
196206
e.c[1] = Node(n[2]).c;
197207

@@ -202,6 +212,8 @@ void GLMesh::AddEdge(int* n, int nodes, int gid)
202212
e.n[1] = n[3];
203213
e.vr[0] = Node(n[2]).r;
204214
e.vr[1] = Node(n[3]).r;
215+
e.vt[0] = Node(n[2]).t;
216+
e.vt[1] = Node(n[3]).t;
205217
e.c[0] = Node(n[2]).c;
206218
e.c[1] = Node(n[3]).c;
207219

@@ -212,6 +224,8 @@ void GLMesh::AddEdge(int* n, int nodes, int gid)
212224
e.n[1] = n[1];
213225
e.vr[0] = Node(n[3]).r;
214226
e.vr[1] = Node(n[1]).r;
227+
e.vt[0] = Node(n[3]).t;
228+
e.vt[1] = Node(n[1]).t;
215229
e.c[0] = Node(n[3]).c;
216230
e.c[1] = Node(n[1]).c;
217231

GLLib/GLMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class GLMesh
5555
int pid = 0; // GEdge parent local id
5656
int n[2]; // nodes
5757
vec3f vr[2]; // nodal coordinates
58+
vec3f vt[2]; // texture coordinates
5859
GLColor c[2]; // node colors
5960
};
6061

PostGL/PostObject.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,8 @@ void CPostObject::BuildFERenderMesh()
191191
if (pm == nullptr) return;
192192

193193
int nsurf = Faces();
194-
if (nsurf == 0) return;
194+
int nedge = Edges();
195+
if ((nsurf == 0) && (nedge==0)) return;
195196

196197
vector<vector<vec3d>> faceNodeNormals;
197198
if (shellToSolid)

RHILib/rhiLineMesh.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ namespace rhi {
5656
for (int j = 0; j < 2; ++j, ++v) {
5757
GLMesh::NODE nd;
5858
nd.r = e.vr[j];
59+
nd.t = e.vt[j];
5960
nd.c = e.c[j];
6061
(*v) = nd;
6162
}
@@ -72,6 +73,7 @@ namespace rhi {
7273
for (int j = 0; j < 2; ++j, ++v) {
7374
GLMesh::NODE nd;
7475
nd.r = e.vr[j];
76+
nd.t = e.vt[j];
7577
nd.c = e.c[j];
7678
(*v) = nd;
7779
}

RHILib/rhiLineRenderPass.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,19 @@ SOFTWARE.*/
3030

3131
void LineRenderPass::create(QRhiSwapChain* sc, QRhiBuffer* globalBuf)
3232
{
33+
// prep 1D texture
34+
QImage img(QSize(1024, 1), QImage::Format_RGBA8888);
35+
img.fill(Qt::white);
36+
m_tex1D.create(img);
37+
3338
m_globalBuf = globalBuf;
3439

3540
QRhiRenderPassDescriptor* rp = sc->renderPassDescriptor();
3641
int sampleCount = sc->sampleCount();
3742

3843
LineShader lineShader(m_rhi);
3944

40-
m_sr.reset(lineShader.createShaderResource(m_rhi, m_globalBuf));
45+
m_sr.reset(lineShader.createShaderResource(m_rhi, m_globalBuf, m_tex1D));
4146

4247
m_pl.reset(m_rhi->newGraphicsPipeline());
4348
m_pl->setRenderPassDescriptor(rp);
@@ -70,5 +75,34 @@ rhi::Mesh* LineRenderPass::newMesh(const GLMesh* mesh)
7075

7176
rhi::MeshShaderResource* LineRenderPass::createShaderResource()
7277
{
73-
return LineShader::createShaderResource(m_rhi, m_globalBuf);
78+
return LineShader::createShaderResource(m_rhi, m_globalBuf, m_tex1D);
79+
}
80+
81+
void LineRenderPass::update(QRhiResourceUpdateBatch* u)
82+
{
83+
if (m_tex1D.needsUpload)
84+
{
85+
m_tex1D.upload(u);
86+
m_tex1D.needsUpload = false;
87+
}
88+
89+
rhi::MeshRenderPass::update(u);
7490
}
91+
92+
void LineRenderPass::setTexture1D(GLTexture1D& tex)
93+
{
94+
if (tex.DoUpdate())
95+
{
96+
// update texture data
97+
QImage img(tex.Size(), 1, QImage::Format_RGBA8888);
98+
for (int i = 0; i < tex.Size(); ++i)
99+
{
100+
GLColor c = tex.sample((float)i / (tex.Size() - 1.f));
101+
img.setPixelColor(i, 0, QColor(c.r, c.g, c.b, c.a));
102+
}
103+
m_tex1D.image = img;
104+
m_tex1D.needsUpload = true;
105+
tex.Update(false);
106+
}
107+
}
108+

RHILib/rhiLineRenderPass.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,25 @@ SOFTWARE.*/
2626
#pragma once
2727
#include "rhiMeshRenderPass.h"
2828
#include "rhiMesh.h"
29+
#include <GLLib/GLTexture1D.h>
2930

3031
class LineRenderPass : public rhi::MeshRenderPass
3132
{
3233
public:
33-
LineRenderPass(QRhi* rhi) : MeshRenderPass(rhi) {}
34+
LineRenderPass(QRhi* rhi) : MeshRenderPass(rhi), m_tex1D(rhi) {}
3435

3536
void create(QRhiSwapChain* sc, QRhiBuffer* globalBuf);
3637

3738
rhi::Mesh* newMesh(const GLMesh* mesh) override;
3839

3940
rhi::MeshShaderResource* createShaderResource() override;
4041

42+
void update(QRhiResourceUpdateBatch* u) override;
43+
44+
void setTexture1D(GLTexture1D& tex1D);
45+
4146
private:
4247
std::unique_ptr<rhi::MeshShaderResource> m_sr;
4348
QRhiBuffer* m_globalBuf = nullptr;
49+
rhi::Texture m_tex1D;
4450
};

RHILib/rhiRenderer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,10 @@ void rhiRenderer::renderGMeshNodes(const GLMesh& mesh, bool cacheMesh)
488488

489489
void rhiRenderer::setTexture(GLTexture1D& tex)
490490
{
491+
bool modified = tex.DoUpdate();
491492
m_solidPass->setTexture1D(tex);
493+
tex.Update(modified);
494+
m_linePass->setTexture1D(tex);
492495
}
493496

494497
void rhiRenderer::setTexture(GLTexture3D& tex)

RHILib/rhiShader.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,17 @@ rhi::MeshShaderResource* PointShader::createShaderResource(QRhi* rhi, QRhiBuffer
106106
class LineShaderResource : public rhi::MeshShaderResource
107107
{
108108
public:
109-
enum { MV, COL, CLIP, VCOL };
109+
enum { MV, COL, CLIP, VCOL, TEX };
110110

111111
public:
112-
LineShaderResource(QRhi* rhi, QRhiBuffer* globalBuf) : rhi::MeshShaderResource(rhi)
112+
LineShaderResource(QRhi* rhi, QRhiBuffer* globalBuf, rhi::Texture& tex1D) : rhi::MeshShaderResource(rhi)
113113
{
114114
m_data.create({
115115
{rhi::UniformBlock::MAT4, "mv"},
116116
{rhi::UniformBlock::VEC4, "col"},
117117
{rhi::UniformBlock::INT , "useClipping" },
118-
{rhi::UniformBlock::INT , "useVertexColor" }
118+
{rhi::UniformBlock::INT , "useVertexColor" },
119+
{rhi::UniformBlock::INT , "useTexture" }
119120
});
120121

121122
// create the buffer
@@ -129,7 +130,8 @@ class LineShaderResource : public rhi::MeshShaderResource
129130
srb.reset(rhi->newShaderResourceBindings());
130131
srb->setBindings({
131132
QRhiShaderResourceBinding::uniformBuffer(0, visibility, globalBuf),
132-
QRhiShaderResourceBinding::uniformBuffer(1, visibility, ubuf.get())
133+
QRhiShaderResourceBinding::uniformBuffer(1, visibility, ubuf.get()),
134+
QRhiShaderResourceBinding::sampledTexture(2, visibility, tex1D.texture.get(), tex1D.sampler.get())
133135
});
134136
srb->create();
135137
}
@@ -143,6 +145,7 @@ class LineShaderResource : public rhi::MeshShaderResource
143145
m_data.setVec4(COL, diffuse);
144146
m_data.setInt (CLIP, (m.doClipping ? 1 : 0));
145147
m_data.setInt (VCOL, (m.mat.diffuseMap == GLMaterial::VERTEX_COLOR ? 1 : 0));
148+
m_data.setInt (TEX , (m.mat.diffuseMap == GLMaterial::TEXTURE_1D ? 1 : 0));
146149
}
147150
};
148151

@@ -155,18 +158,19 @@ QRhiVertexInputLayout LineShader::meshLayout()
155158
{
156159
QRhiVertexInputLayout meshLayout;
157160
meshLayout.setBindings({
158-
{ 7 * sizeof(float) }
161+
{ 10 * sizeof(float) }
159162
});
160163
meshLayout.setAttributes({
161164
{ 0, 0, QRhiVertexInputAttribute::Float3, 0 }, // position
162-
{ 0, 1, QRhiVertexInputAttribute::Float4, 3 * sizeof(float) } // color
165+
{ 0, 1, QRhiVertexInputAttribute::Float3, 3 * sizeof(float) }, // texture coordinate
166+
{ 0, 2, QRhiVertexInputAttribute::Float4, 6 * sizeof(float) } // color
163167
});
164168
return meshLayout;
165169
}
166170

167-
rhi::MeshShaderResource* LineShader::createShaderResource(QRhi* rhi, QRhiBuffer* globalBuf)
171+
rhi::MeshShaderResource* LineShader::createShaderResource(QRhi* rhi, QRhiBuffer* globalBuf, rhi::Texture& tex1D)
168172
{
169-
return new LineShaderResource(rhi, globalBuf);
173+
return new LineShaderResource(rhi, globalBuf, tex1D);
170174
}
171175

172176
class ColorShaderResource : public rhi::MeshShaderResource

RHILib/rhiShader.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,13 @@ class LineShader : public rhi::Shader
8989
public:
9090
struct Vertex {
9191
vec3f r; // position
92+
vec3f t; // texture coordinate
9293
float c[4] = { 0.f }; // color
9394

9495
void operator = (const GLMesh::NODE& nd)
9596
{
9697
r = nd.r;
98+
t = nd.t;
9799
nd.c.toFloat(c);
98100
}
99101
};
@@ -103,7 +105,7 @@ class LineShader : public rhi::Shader
103105

104106
QRhiVertexInputLayout meshLayout() override;
105107

106-
static rhi::MeshShaderResource* createShaderResource(QRhi* rhi, QRhiBuffer* globalBuf);
108+
static rhi::MeshShaderResource* createShaderResource(QRhi* rhi, QRhiBuffer* globalBuf, rhi::Texture& tex1D);
107109
};
108110

109111
class SolidShader : public rhi::Shader

RHILib/shaders/lines.frag

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
// input
44
layout(location = 0) in vec3 v_pos;
5-
layout(location = 1) in vec4 v_col;
5+
layout(location = 1) in vec3 v_tex;
6+
layout(location = 2) in vec4 v_col;
67

78
// output
89
layout(location = 0) out vec4 fragColor;
@@ -26,8 +27,11 @@ layout(std140, binding = 1) uniform MeshBlock {
2627
vec4 col;
2728
int useClipping;
2829
int useVertexColor;
30+
int useTexture;
2931
} mesh;
3032

33+
layout(binding = 2) uniform sampler2D smp;
34+
3135
void main()
3236
{
3337
// clip-plane
@@ -39,6 +43,11 @@ void main()
3943

4044
vec4 col = mesh.col;
4145
if (mesh.useVertexColor > 0) col = v_col;
46+
// textured rendering
47+
if (mesh.useTexture > 0)
48+
{
49+
col.xyz = texture(smp, v_tex.xy).xyz;
50+
}
4251

4352
fragColor = col;
4453
}

0 commit comments

Comments
 (0)