2
0

DebugRendererRecorder.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #ifdef JPH_DEBUG_RENDERER
  6. #include <Jolt/Renderer/DebugRendererRecorder.h>
  7. JPH_NAMESPACE_BEGIN
  8. void DebugRendererRecorder::DrawLine(RVec3Arg inFrom, RVec3Arg inTo, ColorArg inColor)
  9. {
  10. lock_guard lock(mMutex);
  11. mCurrentFrame.mLines.push_back({ inFrom, inTo, inColor });
  12. }
  13. void DebugRendererRecorder::DrawTriangle(RVec3Arg inV1, RVec3Arg inV2, RVec3Arg inV3, ColorArg inColor, ECastShadow inCastShadow)
  14. {
  15. lock_guard lock(mMutex);
  16. mCurrentFrame.mTriangles.push_back({ inV1, inV2, inV3, inColor, inCastShadow });
  17. }
  18. DebugRenderer::Batch DebugRendererRecorder::CreateTriangleBatch(const Triangle *inTriangles, int inTriangleCount)
  19. {
  20. if (inTriangles == nullptr || inTriangleCount == 0)
  21. return new BatchImpl(0);
  22. lock_guard lock(mMutex);
  23. mStream.Write(ECommand::CreateBatch);
  24. uint32 batch_id = mNextBatchID++;
  25. JPH_ASSERT(batch_id != 0);
  26. mStream.Write(batch_id);
  27. mStream.Write((uint32)inTriangleCount);
  28. mStream.WriteBytes(inTriangles, inTriangleCount * sizeof(Triangle));
  29. return new BatchImpl(batch_id);
  30. }
  31. DebugRenderer::Batch DebugRendererRecorder::CreateTriangleBatch(const Vertex *inVertices, int inVertexCount, const uint32 *inIndices, int inIndexCount)
  32. {
  33. if (inVertices == nullptr || inVertexCount == 0 || inIndices == nullptr || inIndexCount == 0)
  34. return new BatchImpl(0);
  35. lock_guard lock(mMutex);
  36. mStream.Write(ECommand::CreateBatchIndexed);
  37. uint32 batch_id = mNextBatchID++;
  38. JPH_ASSERT(batch_id != 0);
  39. mStream.Write(batch_id);
  40. mStream.Write((uint32)inVertexCount);
  41. mStream.WriteBytes(inVertices, inVertexCount * sizeof(Vertex));
  42. mStream.Write((uint32)inIndexCount);
  43. mStream.WriteBytes(inIndices, inIndexCount * sizeof(uint32));
  44. return new BatchImpl(batch_id);
  45. }
  46. void DebugRendererRecorder::DrawGeometry(RMat44Arg inModelMatrix, const AABox &inWorldSpaceBounds, float inLODScaleSq, ColorArg inModelColor, const GeometryRef &inGeometry, ECullMode inCullMode, ECastShadow inCastShadow, EDrawMode inDrawMode)
  47. {
  48. lock_guard lock(mMutex);
  49. // See if this geometry was used before
  50. uint32 &geometry_id = mGeometries[inGeometry];
  51. if (geometry_id == 0)
  52. {
  53. mStream.Write(ECommand::CreateGeometry);
  54. // Create a new ID
  55. geometry_id = mNextGeometryID++;
  56. JPH_ASSERT(geometry_id != 0);
  57. mStream.Write(geometry_id);
  58. // Save bounds
  59. mStream.Write(inGeometry->mBounds.mMin);
  60. mStream.Write(inGeometry->mBounds.mMax);
  61. // Save the LODs
  62. mStream.Write((uint32)inGeometry->mLODs.size());
  63. for (const LOD & lod : inGeometry->mLODs)
  64. {
  65. mStream.Write(lod.mDistance);
  66. mStream.Write(static_cast<const BatchImpl *>(lod.mTriangleBatch.GetPtr())->mID);
  67. }
  68. }
  69. mCurrentFrame.mGeometries.push_back({ inModelMatrix, inModelColor, geometry_id, inCullMode, inCastShadow, inDrawMode });
  70. }
  71. void DebugRendererRecorder::DrawText3D(RVec3Arg inPosition, const string_view &inString, ColorArg inColor, float inHeight)
  72. {
  73. lock_guard lock(mMutex);
  74. mCurrentFrame.mTexts.push_back({ inPosition, inString, inColor, inHeight });
  75. }
  76. void DebugRendererRecorder::EndFrame()
  77. {
  78. lock_guard lock(mMutex);
  79. mStream.Write(ECommand::EndFrame);
  80. // Write all lines
  81. mStream.Write((uint32)mCurrentFrame.mLines.size());
  82. for (const LineBlob &line : mCurrentFrame.mLines)
  83. {
  84. mStream.Write(line.mFrom);
  85. mStream.Write(line.mTo);
  86. mStream.Write(line.mColor);
  87. }
  88. mCurrentFrame.mLines.clear();
  89. // Write all triangles
  90. mStream.Write((uint32)mCurrentFrame.mTriangles.size());
  91. for (const TriangleBlob &triangle : mCurrentFrame.mTriangles)
  92. {
  93. mStream.Write(triangle.mV1);
  94. mStream.Write(triangle.mV2);
  95. mStream.Write(triangle.mV3);
  96. mStream.Write(triangle.mColor);
  97. mStream.Write(triangle.mCastShadow);
  98. }
  99. mCurrentFrame.mTriangles.clear();
  100. // Write all texts
  101. mStream.Write((uint32)mCurrentFrame.mTexts.size());
  102. for (const TextBlob &text : mCurrentFrame.mTexts)
  103. {
  104. mStream.Write(text.mPosition);
  105. mStream.Write(text.mString);
  106. mStream.Write(text.mColor);
  107. mStream.Write(text.mHeight);
  108. }
  109. mCurrentFrame.mTexts.clear();
  110. // Write all geometries
  111. mStream.Write((uint32)mCurrentFrame.mGeometries.size());
  112. for (const GeometryBlob &geom : mCurrentFrame.mGeometries)
  113. {
  114. mStream.Write(geom.mModelMatrix);
  115. mStream.Write(geom.mModelColor);
  116. mStream.Write(geom.mGeometryID);
  117. mStream.Write(geom.mCullMode);
  118. mStream.Write(geom.mCastShadow);
  119. mStream.Write(geom.mDrawMode);
  120. }
  121. mCurrentFrame.mGeometries.clear();
  122. }
  123. JPH_NAMESPACE_END
  124. #endif // JPH_DEBUG_RENDERER