Path: blob/master/thirdparty/jolt_physics/Jolt/Renderer/DebugRendererRecorder.cpp
9906 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#include <Jolt/Jolt.h>56#ifdef JPH_DEBUG_RENDERER78#include <Jolt/Renderer/DebugRendererRecorder.h>910JPH_NAMESPACE_BEGIN1112void DebugRendererRecorder::DrawLine(RVec3Arg inFrom, RVec3Arg inTo, ColorArg inColor)13{14lock_guard lock(mMutex);1516mCurrentFrame.mLines.push_back({ inFrom, inTo, inColor });17}1819void DebugRendererRecorder::DrawTriangle(RVec3Arg inV1, RVec3Arg inV2, RVec3Arg inV3, ColorArg inColor, ECastShadow inCastShadow)20{21lock_guard lock(mMutex);2223mCurrentFrame.mTriangles.push_back({ inV1, inV2, inV3, inColor, inCastShadow });24}2526DebugRenderer::Batch DebugRendererRecorder::CreateTriangleBatch(const Triangle *inTriangles, int inTriangleCount)27{28if (inTriangles == nullptr || inTriangleCount == 0)29return new BatchImpl(0);3031lock_guard lock(mMutex);3233mStream.Write(ECommand::CreateBatch);3435uint32 batch_id = mNextBatchID++;36JPH_ASSERT(batch_id != 0);37mStream.Write(batch_id);38mStream.Write((uint32)inTriangleCount);39mStream.WriteBytes(inTriangles, inTriangleCount * sizeof(Triangle));4041return new BatchImpl(batch_id);42}4344DebugRenderer::Batch DebugRendererRecorder::CreateTriangleBatch(const Vertex *inVertices, int inVertexCount, const uint32 *inIndices, int inIndexCount)45{46if (inVertices == nullptr || inVertexCount == 0 || inIndices == nullptr || inIndexCount == 0)47return new BatchImpl(0);4849lock_guard lock(mMutex);5051mStream.Write(ECommand::CreateBatchIndexed);5253uint32 batch_id = mNextBatchID++;54JPH_ASSERT(batch_id != 0);55mStream.Write(batch_id);56mStream.Write((uint32)inVertexCount);57mStream.WriteBytes(inVertices, inVertexCount * sizeof(Vertex));58mStream.Write((uint32)inIndexCount);59mStream.WriteBytes(inIndices, inIndexCount * sizeof(uint32));6061return new BatchImpl(batch_id);62}6364void DebugRendererRecorder::DrawGeometry(RMat44Arg inModelMatrix, const AABox &inWorldSpaceBounds, float inLODScaleSq, ColorArg inModelColor, const GeometryRef &inGeometry, ECullMode inCullMode, ECastShadow inCastShadow, EDrawMode inDrawMode)65{66lock_guard lock(mMutex);6768// See if this geometry was used before69uint32 &geometry_id = mGeometries[inGeometry];70if (geometry_id == 0)71{72mStream.Write(ECommand::CreateGeometry);7374// Create a new ID75geometry_id = mNextGeometryID++;76JPH_ASSERT(geometry_id != 0);77mStream.Write(geometry_id);7879// Save bounds80mStream.Write(inGeometry->mBounds.mMin);81mStream.Write(inGeometry->mBounds.mMax);8283// Save the LODs84mStream.Write((uint32)inGeometry->mLODs.size());85for (const LOD & lod : inGeometry->mLODs)86{87mStream.Write(lod.mDistance);88mStream.Write(static_cast<const BatchImpl *>(lod.mTriangleBatch.GetPtr())->mID);89}90}9192mCurrentFrame.mGeometries.push_back({ inModelMatrix, inModelColor, geometry_id, inCullMode, inCastShadow, inDrawMode });93}9495void DebugRendererRecorder::DrawText3D(RVec3Arg inPosition, const string_view &inString, ColorArg inColor, float inHeight)96{97lock_guard lock(mMutex);9899mCurrentFrame.mTexts.push_back({ inPosition, inString, inColor, inHeight });100}101102void DebugRendererRecorder::EndFrame()103{104lock_guard lock(mMutex);105106mStream.Write(ECommand::EndFrame);107108// Write all lines109mStream.Write((uint32)mCurrentFrame.mLines.size());110for (const LineBlob &line : mCurrentFrame.mLines)111{112mStream.Write(line.mFrom);113mStream.Write(line.mTo);114mStream.Write(line.mColor);115}116mCurrentFrame.mLines.clear();117118// Write all triangles119mStream.Write((uint32)mCurrentFrame.mTriangles.size());120for (const TriangleBlob &triangle : mCurrentFrame.mTriangles)121{122mStream.Write(triangle.mV1);123mStream.Write(triangle.mV2);124mStream.Write(triangle.mV3);125mStream.Write(triangle.mColor);126mStream.Write(triangle.mCastShadow);127}128mCurrentFrame.mTriangles.clear();129130// Write all texts131mStream.Write((uint32)mCurrentFrame.mTexts.size());132for (const TextBlob &text : mCurrentFrame.mTexts)133{134mStream.Write(text.mPosition);135mStream.Write(text.mString);136mStream.Write(text.mColor);137mStream.Write(text.mHeight);138}139mCurrentFrame.mTexts.clear();140141// Write all geometries142mStream.Write((uint32)mCurrentFrame.mGeometries.size());143for (const GeometryBlob &geom : mCurrentFrame.mGeometries)144{145mStream.Write(geom.mModelMatrix);146mStream.Write(geom.mModelColor);147mStream.Write(geom.mGeometryID);148mStream.Write(geom.mCullMode);149mStream.Write(geom.mCastShadow);150mStream.Write(geom.mDrawMode);151}152mCurrentFrame.mGeometries.clear();153}154155JPH_NAMESPACE_END156157#endif // JPH_DEBUG_RENDERER158159160