DebugRendererSimple.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2024 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #ifdef JPH_DEBUG_RENDERER
  6. #include <Jolt/Renderer/DebugRendererSimple.h>
  7. JPH_NAMESPACE_BEGIN
  8. DebugRendererSimple::DebugRendererSimple()
  9. {
  10. Initialize();
  11. }
  12. DebugRenderer::Batch DebugRendererSimple::CreateTriangleBatch(const Triangle *inTriangles, int inTriangleCount)
  13. {
  14. BatchImpl *batch = new BatchImpl;
  15. if (inTriangles == nullptr || inTriangleCount == 0)
  16. return batch;
  17. batch->mTriangles.assign(inTriangles, inTriangles + inTriangleCount);
  18. return batch;
  19. }
  20. DebugRenderer::Batch DebugRendererSimple::CreateTriangleBatch(const Vertex *inVertices, int inVertexCount, const uint32 *inIndices, int inIndexCount)
  21. {
  22. BatchImpl *batch = new BatchImpl;
  23. if (inVertices == nullptr || inVertexCount == 0 || inIndices == nullptr || inIndexCount == 0)
  24. return batch;
  25. // Convert indexed triangle list to triangle list
  26. batch->mTriangles.resize(inIndexCount / 3);
  27. for (size_t t = 0; t < batch->mTriangles.size(); ++t)
  28. {
  29. Triangle &triangle = batch->mTriangles[t];
  30. triangle.mV[0] = inVertices[inIndices[t * 3 + 0]];
  31. triangle.mV[1] = inVertices[inIndices[t * 3 + 1]];
  32. triangle.mV[2] = inVertices[inIndices[t * 3 + 2]];
  33. }
  34. return batch;
  35. }
  36. void DebugRendererSimple::DrawGeometry(RMat44Arg inModelMatrix, const AABox &inWorldSpaceBounds, float inLODScaleSq, ColorArg inModelColor, const GeometryRef &inGeometry, ECullMode inCullMode, ECastShadow inCastShadow, EDrawMode inDrawMode)
  37. {
  38. // Figure out which LOD to use
  39. const LOD *lod = inGeometry->mLODs.data();
  40. if (mCameraPosSet)
  41. lod = &inGeometry->GetLOD(Vec3(mCameraPos), inWorldSpaceBounds, inLODScaleSq);
  42. // Draw the batch
  43. const BatchImpl *batch = static_cast<const BatchImpl *>(lod->mTriangleBatch.GetPtr());
  44. for (const Triangle &triangle : batch->mTriangles)
  45. {
  46. RVec3 v0 = inModelMatrix * Vec3(triangle.mV[0].mPosition);
  47. RVec3 v1 = inModelMatrix * Vec3(triangle.mV[1].mPosition);
  48. RVec3 v2 = inModelMatrix * Vec3(triangle.mV[2].mPosition);
  49. Color color = inModelColor * triangle.mV[0].mColor;
  50. switch (inDrawMode)
  51. {
  52. case EDrawMode::Wireframe:
  53. DrawLine(v0, v1, color);
  54. DrawLine(v1, v2, color);
  55. DrawLine(v2, v0, color);
  56. break;
  57. case EDrawMode::Solid:
  58. DrawTriangle(v0, v1, v2, color, inCastShadow);
  59. break;
  60. }
  61. }
  62. }
  63. JPH_NAMESPACE_END
  64. #endif // JPH_DEBUG_RENDERER