2
0

DebugRendererRecorder.cpp 4.3 KB

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