@@ -191,7 +191,7 @@ static void AddSolidBox(DebugDrawRenderData& renderData, const glm::vec3* corner
191191 }
192192}
193193
194- static void AddArcRibbon (DebugDrawRenderData& renderData, const glm::vec3& start, const glm::vec3& initialVelocity, const glm::vec3& acceleration, float duration, int segments, uint32_t color, bool xray) {
194+ static void AddArcRibbon (DebugDrawRenderData& renderData, const glm::vec3& start, const glm::vec3& initialVelocity, const glm::vec3& acceleration, float duration, int segments, uint32_t color, bool xray, const glm::vec3& cameraPos ) {
195195 if (segments < 2 || duration <= 0 .0f ) {
196196 return ;
197197 }
@@ -201,7 +201,6 @@ static void AddArcRibbon(DebugDrawRenderData& renderData, const glm::vec3& start
201201 };
202202
203203 const float arcWidth = ResolveArcWidth (duration);
204- const glm::vec3 worldUp = glm::vec3 (0 .0f , 1 .0f , 0 .0f );
205204 const uint32_t ribbonColor = ScaleColor (color, 0 .95f , 0 .45f );
206205
207206 for (int i = 0 ; i < segments; ++i) {
@@ -215,11 +214,17 @@ static void AddArcRibbon(DebugDrawRenderData& renderData, const glm::vec3& start
215214 }
216215
217216 tangent = glm::normalize (tangent);
218- glm::vec3 right = glm::cross (tangent, worldUp);
217+ const glm::vec3 midPoint = (p0 + p1) * 0 .5f ;
218+ const glm::vec3 toCamera = glm::normalize (cameraPos - midPoint);
219+ const glm::vec3 worldUp = glm::vec3 (0 .0f , 1 .0f , 0 .0f );
220+ glm::vec3 right = glm::cross (tangent, toCamera);
219221 if (glm::length2 (right) <= 0 .000001f ) {
220- right = glm::cross (tangent, glm::vec3 ( 1 . 0f , 0 . 0f , 0 . 0f ) );
222+ right = glm::cross (tangent, worldUp );
221223 if (glm::length2 (right) <= 0 .000001f ) {
222- continue ;
224+ right = glm::cross (tangent, glm::vec3 (1 .0f , 0 .0f , 0 .0f ));
225+ if (glm::length2 (right) <= 0 .000001f ) {
226+ continue ;
227+ }
223228 }
224229 }
225230
@@ -394,6 +399,7 @@ DebugDrawRenderData DebugDraw::TakeRenderData(long frameIdx) {
394399 if (eyeState.IsValid ()) {
395400 renderData.viewProjections [eyeIndex] = eyeState.viewProjection ;
396401 renderData.hasViewProjections [eyeIndex] = true ;
402+ renderData.cameraPos = glm::vec3 (glm::inverse (eyeState.view )[3 ]);
397403 }
398404 s_frameDebugEyeStates[frameIdx][eyeIndex].Reset ();
399405 }
@@ -404,6 +410,7 @@ DebugDrawRenderData DebugDraw::TakeRenderData(long frameIdx) {
404410 if (eyeState.IsValid ()) {
405411 renderData.viewProjections [eyeIndex] = eyeState.viewProjection ;
406412 renderData.hasViewProjections [eyeIndex] = true ;
413+ renderData.cameraPos = glm::vec3 (glm::inverse (eyeState.view )[3 ]);
407414 }
408415 }
409416 }
@@ -525,7 +532,7 @@ DebugDrawRenderData DebugDraw::TakeRenderData(long frameIdx) {
525532 break ;
526533 }
527534
528- AddArcRibbon (renderData, prim.a , prim.b , prim.c , prim.duration , segments, prim.color , prim.xray );
535+ AddArcRibbon (renderData, prim.a , prim.b , prim.c , prim.duration , segments, prim.color , prim.xray , renderData. cameraPos );
529536
530537 auto evaluatePoint = [&](float t) {
531538 return prim.a + prim.b * t + prim.c * (0 .5f * t * t);
0 commit comments