@@ -37,6 +37,24 @@ out vec4 fragColor;
3737void main() {
3838 fragColor = vec4(vColor, 1.0);
3939}
40+ )" ;
41+
42+ static const char * kMeshVertexShader = R"(
43+ #version 330 core
44+ layout(location = 0) in vec3 aPos;
45+ uniform mat4 uMVP;
46+ void main() {
47+ gl_Position = uMVP * vec4(aPos, 1.0);
48+ }
49+ )" ;
50+
51+ static const char * kMeshFragmentShader = R"(
52+ #version 330 core
53+ uniform vec3 uColor;
54+ out vec4 fragColor;
55+ void main() {
56+ fragColor = vec4(uColor, 1.0);
57+ }
4058)" ;
4159
4260 // ---- Helper: compile a single shader stage ----
@@ -77,6 +95,29 @@ void main() {
7795 glDeleteShader (frag);
7896
7997 vpUniformLoc = glGetUniformLocation (shaderProgram, " uVP" );
98+
99+ // Mesh shader program
100+ GLuint mVert = compileShaderStage (GL_VERTEX_SHADER , kMeshVertexShader );
101+ GLuint mFrag = compileShaderStage (GL_FRAGMENT_SHADER , kMeshFragmentShader );
102+
103+ meshShaderProgram = glCreateProgram ();
104+ glAttachShader (meshShaderProgram, mVert );
105+ glAttachShader (meshShaderProgram, mFrag );
106+ glLinkProgram (meshShaderProgram);
107+
108+ success = 0 ;
109+ glGetProgramiv (meshShaderProgram, GL_LINK_STATUS , &success);
110+ if (!success) {
111+ char log[512 ];
112+ glGetProgramInfoLog (meshShaderProgram, sizeof (log), nullptr , log);
113+ fprintf (stderr, " [CollisionDebugDrawer] Mesh Shader link error:\n %s\n " , log);
114+ }
115+
116+ glDeleteShader (mVert );
117+ glDeleteShader (mFrag );
118+
119+ meshMVPUniformLoc = glGetUniformLocation (meshShaderProgram, " uMVP" );
120+ meshColorUniformLoc = glGetUniformLocation (meshShaderProgram, " uColor" );
80121 }
81122
82123 void CollisionDebugDrawer::initialize () {
@@ -115,7 +156,12 @@ void main() {
115156 glDeleteProgram (shaderProgram);
116157 shaderProgram = 0 ;
117158 }
159+ if (meshShaderProgram) {
160+ glDeleteProgram (meshShaderProgram);
161+ meshShaderProgram = 0 ;
162+ }
118163 lineVertices.clear ();
164+ meshDrawCommands.clear ();
119165 }
120166
121167 // ---- Wireframe generation helpers ----
@@ -213,6 +259,10 @@ void main() {
213259 }
214260 }
215261
262+ void CollisionDebugDrawer::drawMeshWireframe (our::Mesh* mesh, const glm::mat4& transform, const glm::vec3& color) {
263+ meshDrawCommands.push_back ({mesh, transform, color});
264+ }
265+
216266 // ---- btIDebugDraw overrides (still needed since Bullet requires them) ----
217267 void CollisionDebugDrawer::drawLine (const btVector3& from, const btVector3& to, const btVector3& color) {
218268 lineVertices.push_back ({from.getX (), from.getY (), from.getZ (), color.getX (), color.getY (), color.getZ ()});
@@ -243,6 +293,23 @@ void main() {
243293
244294 glUseProgram (0 );
245295
296+ // Render meshes if any
297+ if (!meshDrawCommands.empty ()) {
298+ glUseProgram (meshShaderProgram);
299+ glPolygonMode (GL_FRONT_AND_BACK , GL_LINE );
300+
301+ for (const auto & cmd : meshDrawCommands) {
302+ glm::mat4 MVP = VP * cmd.transform ;
303+ glUniformMatrix4fv (meshMVPUniformLoc, 1 , GL_FALSE , glm::value_ptr (MVP ));
304+ glUniform3fv (meshColorUniformLoc, 1 , glm::value_ptr (cmd.color ));
305+ cmd.mesh ->draw ();
306+ }
307+
308+ glPolygonMode (GL_FRONT_AND_BACK , GL_FILL );
309+ glUseProgram (0 );
310+ meshDrawCommands.clear ();
311+ }
312+
246313 // Restore previous state
247314 if (prevDepthTest) glEnable (GL_DEPTH_TEST );
248315
0 commit comments