Skip to content

Commit

Permalink
Merge branch 'v2.15-LTS' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
PopcornFX Bot committed Sep 28, 2023
2 parents 8feee7b + 9efadda commit 7b331b8
Show file tree
Hide file tree
Showing 10 changed files with 130 additions and 103 deletions.
55 changes: 0 additions & 55 deletions Source/PopcornFX/Private/GPUSim/PopcornFXGPUSim.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,59 +95,4 @@ bool StreamBufferByteOffset(const PopcornFX::CParticleStreamToRender_GPU &stream
return _streamOffset.Valid();
}

//----------------------------------------------------------------------------

template <typename _Type, u32 _Stride>
FShaderResourceViewRHIRef StreamBufferSRVToRHI(const PopcornFX::CParticleStreamToRender &stream_GPU, PopcornFX::CGuid streamId, PopcornFX::CGuid &streamOffset)
{
PK_ASSERT(streamId.Valid());

#if (PK_GPU_D3D11 == 1)
if (g_PopcornFXRHIAPI == SUERenderContext::D3D11)
{
const PopcornFX::CParticleStreamToRender_D3D11 &stream = static_cast<const PopcornFX::CParticleStreamToRender_D3D11&>(stream_GPU);

streamOffset = stream.StreamOffset(streamId);
return StreamBufferSRVToRHI(&stream.StreamBuffer(), stream.StreamSizeEst() * _Stride, _Stride/*, DXGI_FORMAT_UNKNOWN*/);
}
#endif // (PK_GPU_D3D11 == 1)
#if (PK_GPU_D3D12 == 1)
if (g_PopcornFXRHIAPI == SUERenderContext::D3D12)
{
const PopcornFX::CParticleStreamToRender_D3D12 &stream = static_cast<const PopcornFX::CParticleStreamToRender_D3D12&>(stream_GPU);

streamOffset = stream.StreamOffset(streamId);
return StreamBufferSRVToRHI(&stream.StreamBuffer(), stream.StreamSizeEst() * _Stride);
}
#endif // (PK_GPU_D3D12 == 1)
PK_ASSERT_NOT_REACHED();
return null;
}

#define DEFINE_StreamBufferSRVToRHI(__type, __stride) \
template FShaderResourceViewRHIRef StreamBufferSRVToRHI<__type, __stride>(const PopcornFX::CParticleStreamToRender &stream_GPU, PopcornFX::CGuid streamId, PopcornFX::CGuid &streamOffset)

DEFINE_StreamBufferSRVToRHI(CFloat4, 16);
DEFINE_StreamBufferSRVToRHI(CFloat3, 12);
DEFINE_StreamBufferSRVToRHI(CFloat2, 8);
DEFINE_StreamBufferSRVToRHI(float, 4);
#undef DEFINE_StreamBufferSRVToRHI

//----------------------------------------------------------------------------
//
// D3D
//
//----------------------------------------------------------------------------

#if (PK_GPU_D3D11 == 1 || PK_GPU_D3D12 == 1)

uint32 _PopcornFXD3DGetRefCount(IUnknown &res)
{
uint32 count = res.AddRef();
res.Release();
return count - 1;
}

#endif // (PK_GPU_D3D11 == 1 || PK_GPU_D3D12 == 1)

#endif // (PK_HAS_GPU != 0)
35 changes: 13 additions & 22 deletions Source/PopcornFX/Private/GPUSim/PopcornFXGPUSim.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

#include "Render/RenderTypesPolicies.h"

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

#if (ENGINE_MAJOR_VERSION == 5)
typedef FRHIBuffer* FVBRHIParamRef;
Expand All @@ -23,35 +23,26 @@
typedef FRHIVertexBuffer* FVBRHIParamRef;
typedef FRHIIndexBuffer* FIBRHIParamRef;
#endif
typedef FRHIComputeShader* FCSRHIParamRef;
typedef FRHIShaderResourceView* FSRVRHIParamRef;
typedef FRHIUnorderedAccessView* FUAVRHIParamRef;
typedef FRHIComputeShader* FCSRHIParamRef;
typedef FRHIShaderResourceView* FSRVRHIParamRef;
typedef FRHIUnorderedAccessView* FUAVRHIParamRef;

#if (PK_HAS_GPU != 0)

FWD_PK_API_BEGIN
class CParticleStreamToRender;
class CParticleStreamToRender_GPU;
FWD_PK_API_END

extern SUERenderContext::ERHIAPI g_PopcornFXRHIAPI;

void SetupPopcornFXRHIAPI(uint32 API);
FWD_PK_API_BEGIN
class CParticleStreamToRender;
class CParticleStreamToRender_GPU;
FWD_PK_API_END

template <typename _Type, uint32 _Stride>
FShaderResourceViewRHIRef StreamBufferSRVToRHI(const PopcornFX::CParticleStreamToRender &stream_GPU, PopcornFX::CGuid streamId, PopcornFX::CGuid &offset);
extern SUERenderContext::ERHIAPI g_PopcornFXRHIAPI;

bool StreamBufferByteOffset(const PopcornFX::CParticleStreamToRender_GPU &stream_GPU, PopcornFX::CGuid streamId, u32 &streamOffset);
void SetupPopcornFXRHIAPI(uint32 API);

//----------------------------------------------------------------------------
bool StreamBufferByteOffset(const PopcornFX::CParticleStreamToRender_GPU &stream_GPU, PopcornFX::CGuid streamId, u32 &streamOffset);

# if (PK_GPU_D3D11 == 1)
uint32 _PopcornFXD3DGetRefCount(IUnknown &res);
# endif // ((PK_GPU_D3D11 == 1) || (PK_GPU_D3D12 == 1))

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

bool _IsGpuSupportedOnPlatform(const EShaderPlatform &platform);
bool _IsGpuSupportedOnPlatform(const EShaderPlatform &platform);

# if (PK_GPU_D3D11 == 1)
# include "GPUSim/PopcornFXGPUSim_D3D11.h"
Expand Down
19 changes: 9 additions & 10 deletions Source/PopcornFX/Private/GPUSim/PopcornFXGPUSim_D3D11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,23 +63,23 @@ void UpdateBufferStats(TRefCountPtr<ID3D11Buffer> Buffer, bool bAllocating) { }
//
//----------------------------------------------------------------------------

FShaderResourceViewRHIRef StreamBufferSRVToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 bytes, u32 stride, u8 pixelFormat)
FShaderResourceViewRHIRef StreamBufferSRVToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 stride, u8 pixelFormat)
{
#if (ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 3)
FRHICommandListBase &RHICmdList = FRHICommandListExecutor::GetImmediateCommandList();
#endif

#if (ENGINE_MAJOR_VERSION == 5)
FD3D11Buffer *buffer = static_cast<FD3D11Buffer*>(StreamBufferResourceToRHI(stream, bytes, stride));
FD3D11Buffer *buffer = static_cast<FD3D11Buffer*>(StreamBufferResourceToRHI(stream, stride));
#else
FD3D11VertexBuffer *buffer = static_cast<FD3D11VertexBuffer*>(StreamBufferResourceToRHI(stream, bytes, stride));
FD3D11VertexBuffer *buffer = static_cast<FD3D11VertexBuffer*>(StreamBufferResourceToRHI(stream, stride));
#endif // (ENGINE_MAJOR_VERSION == 5)

check(pixelFormat != PF_Unknown);
#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
return RHICmdList.CreateShaderResourceView(buffer, FRHIViewDesc::CreateBufferSRV()
.SetTypeFromBuffer(buffer)
.SetStride(stride));
.SetFormat((EPixelFormat)pixelFormat));
#else
// Create a new SRV from resource
return RHICreateShaderResourceView(buffer, stride, pixelFormat);
Expand All @@ -89,9 +89,9 @@ FShaderResourceViewRHIRef StreamBufferSRVToRHI(const PopcornFX::SParticleStreamB
//----------------------------------------------------------------------------

#if (ENGINE_MAJOR_VERSION == 5)
FRHIBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 bytes, u32 stride)
FRHIBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 stride)
#else
FRHIVertexBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 bytes, u32 stride)
FRHIVertexBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 stride)
#endif // (ENGINE_MAJOR_VERSION == 5)
{
D3D11_BUFFER_DESC desc;
Expand All @@ -108,13 +108,12 @@ FRHIVertexBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamB
// The BUF_UnorderedAccess could technically be left active, but none of the UE plugin shaders are binding any of the PK sim streams as UAV anyways.
const EBufferUsageFlags bufferUsage = BUF_ShaderResource;
#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
FD3D11Buffer *buffer = new FD3D11Buffer(stream->m_Buffer, FRHIBufferDesc(bytes, stride, bufferUsage));
FD3D11Buffer *buffer = new FD3D11Buffer(stream->m_Buffer, FRHIBufferDesc(sizeInBytes, stride, bufferUsage));
#elif (ENGINE_MAJOR_VERSION == 5)
FD3D11Buffer *buffer = new FD3D11Buffer(stream->m_Buffer, bytes, bufferUsage, stride);
FD3D11Buffer *buffer = new FD3D11Buffer(stream->m_Buffer, sizeInBytes, bufferUsage, stride);
#else
FD3D11VertexBuffer *buffer = new FD3D11VertexBuffer(stream->m_Buffer, bytes, bufferUsage);
FD3D11VertexBuffer *buffer = new FD3D11VertexBuffer(stream->m_Buffer, sizeInBytes, bufferUsage);
#endif // (ENGINE_MAJOR_VERSION == 5)
PK_ASSERT(_PopcornFXD3DGetRefCount(*(buffer->Resource)) > 1); // Referenced here and by PopcornFX

return buffer;
}
Expand Down
6 changes: 3 additions & 3 deletions Source/PopcornFX/Private/GPUSim/PopcornFXGPUSim_D3D11.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ struct SParticleStreamBuffer_D3D11;
class CParticleStreamToRender_D3D11;
FWD_PK_API_END

FShaderResourceViewRHIRef StreamBufferSRVToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 bytes, u32 stride, u8 pixelFormat = PF_R32_FLOAT);
FShaderResourceViewRHIRef StreamBufferSRVToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 stride, u8 pixelFormat = PF_R32_FLOAT);
#if (ENGINE_MAJOR_VERSION == 5)
FRHIBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 bytes, u32 stride);
FRHIBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 stride);
#else
FRHIVertexBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 bytes, u32 stride);
FRHIVertexBuffer *StreamBufferResourceToRHI(const PopcornFX::SParticleStreamBuffer_D3D11 *stream, u32 stride);
#endif // (ENGINE_MAJOR_VERSION == 5)

//----------------------------------------------------------------------------
Expand Down
10 changes: 10 additions & 0 deletions Source/PopcornFX/Private/GPUSim/PopcornFXGPUSim_D3D12.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,16 @@ namespace D3D12RHI

//----------------------------------------------------------------------------

namespace D3D12RHI
{
void VerifyD3D12Result(HRESULT Result, const ANSICHAR* Code, const ANSICHAR* Filename, uint32 Line, ID3D12Device* Device, FString Message)
{
check(FAILED(Result));
}
}

//----------------------------------------------------------------------------

FD3D12Resource::FD3D12Resource(FD3D12Device* ParentDevice,
FRHIGPUMask VisibleNodes,
ID3D12Resource* InResource,
Expand Down
10 changes: 10 additions & 0 deletions Source/PopcornFX/Private/Internal/FileSystemController_UE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,11 @@ CFileSystemController_UE::~CFileSystemController_UE()

PopcornFX::PFileStream CFileSystemController_UE::OpenStream(const CString &path, IFileSystem::EAccessPolicy mode, bool pathNotVirtual)
{
if (!IsInGameThread())
{
CLog::Log(PK_INFO, "CFileSystemController_UE OpenStream: cannot load UE packages outside the main thread ('%s' pathNotVirtual:%d)", path.Data(), pathNotVirtual);
return null;
}
CFileStreamFS_UE *fs = CFileStreamFS_UE::Open(this, path, pathNotVirtual, mode);
if (fs != null)
FS_DEBUG_LOG(PK_INFO, "CFileSystemController_UE OpenStream OK '%s' pathNotVirtual:%d", path.Data(), pathNotVirtual);
Expand All @@ -240,6 +245,11 @@ PopcornFX::PFileStream CFileSystemController_UE::OpenStream(const CString &path

bool CFileSystemController_UE::Exists(const CString &path, bool pathNotVirtual /*= false*/)
{
if (!IsInGameThread())
{
CLog::Log(PK_INFO, "CFileSystemController_UE Exists: cannot load UE packages outside the main thread ('%s' pathNotVirtual:%d)", path.Data(), pathNotVirtual);
return false;
}
UObject *uobject = LoadUObject(path, pathNotVirtual);
if (uobject != null)
FS_DEBUG_LOG(PK_INFO, "CFileSystemController_UE Exists OK '%s' pathNotVirtual:%d", path.Data(), pathNotVirtual);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,7 @@ void CBatchDrawer_Billboard_CPUBB::_IssueDrawCall_Billboard(const SUERenderConte
vsUniforms.DynamicParameterMask = matDesc.m_DynamicParameterMask;

vsUniformsBillboard.RendererType = static_cast<u32>(PopcornFX::Renderer_Billboard);
vsUniformsBillboard.TotalParticleCount = desc.m_TotalParticleCount;
vsUniformsBillboard.CapsulesOffset = m_CapsulesOffset;
vsUniformsBillboard.InColorsOffset = m_AdditionalStreamOffsets[StreamOffset_Colors].OffsetForShaderConstant();
vsUniformsBillboard.InEmissiveColorsOffset = m_AdditionalStreamOffsets[StreamOffset_EmissiveColors].OffsetForShaderConstant();
Expand Down
62 changes: 50 additions & 12 deletions Source/PopcornFX/Private/Render/BatchDrawer_Billboard_GPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ bool FPopcornFXAtlasRectsVertexBuffer::_LoadRects(const PopcornFX::TMemoryView<c
m_AtlasRectsCount = rects.Count();
return true;
}

//----------------------------------------------------------------------------
//
// FPopcornFXDrawRequestsBuffer
Expand Down Expand Up @@ -204,6 +205,50 @@ void FPopcornFXDrawRequestsBuffer::Unmap()
}
}

//----------------------------------------------------------------------------
//
// FNullFloat4Buffer
//
//----------------------------------------------------------------------------

#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
void FNullFloat4Buffer::InitRHI(FRHICommandListBase &RHICmdList)
#else
void FNullFloat4Buffer::InitRHI()
#endif // (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
{
// Note: buffer is not initialized, only meant to calm down UE not letting bind null descriptors.
// Draw calls binding this null buffer will access its data.

const u32 totalByteCount = 4 * sizeof(float); // Whatever
#if (ENGINE_MAJOR_VERSION == 5)
FRHIResourceCreateInfo info(TEXT("PopcornFX Null Float4 buffer"));
#else
FRHIResourceCreateInfo info;
#endif // (ENGINE_MAJOR_VERSION == 5)
const EBufferUsageFlags usage = BUF_Dynamic | BUF_ShaderResource;

#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
VertexBufferRHI = RHICmdList.CreateBuffer(totalByteCount, usage, 0, ERHIAccess::VertexOrIndexBuffer | ERHIAccess::SRVMask, info);
SRV = RHICmdList.CreateShaderResourceView(VertexBufferRHI, sizeof(CFloat4), PF_A32B32G32R32F);
#else
VertexBufferRHI = RHICreateVertexBuffer(totalByteCount, usage, info); // TODO: Stride
SRV = RHICreateShaderResourceView(VertexBufferRHI, sizeof(CFloat4), PF_A32B32G32R32F);
#endif // (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
}

//----------------------------------------------------------------------------

void FNullFloat4Buffer::ReleaseRHI()
{
SRV.SafeRelease();
FVertexBuffer::ReleaseRHI();
}

//----------------------------------------------------------------------------

TGlobalResource<FNullFloat4Buffer> GPopcornFXNullFloat4Buffer;

//----------------------------------------------------------------------------
//
// FPopcornFXGPUBillboardCollector
Expand Down Expand Up @@ -904,7 +949,7 @@ bool CBatchDrawer_Billboard_GPUBB::LaunchCustomTasks(PopcornFX::SRenderContext &
if (renderContext.m_API == SUERenderContext::D3D11)
{
const PopcornFX::CParticleStreamToRender_D3D11 &stream_D3D11 = static_cast<const PopcornFX::CParticleStreamToRender_D3D11&>(dr.StreamToRender());
copyParams.m_LiveParticleCount = StreamBufferSRVToRHI(&stream_D3D11.StreamSizeBuf(), sizeof(u32) * 4, sizeof(u32), PF_R32_UINT);
copyParams.m_LiveParticleCount = StreamBufferSRVToRHI(&stream_D3D11.StreamSizeBuf(), sizeof(u32), PF_R32_UINT /* debug layer errors if not specified correctly */);
}
#endif
#if (PK_GPU_D3D12 == 1)
Expand Down Expand Up @@ -1066,14 +1111,14 @@ bool CBatchDrawer_Billboard_GPUBB::_FillDrawCallUniforms_GPU(u32 drId,
if (renderContext.m_API == SUERenderContext::D3D11)
{
const PopcornFX::CParticleStreamToRender_D3D11 &stream_D3D11 = static_cast<const PopcornFX::CParticleStreamToRender_D3D11&>(dr->StreamToRender());
m_SimDataSRVRef = StreamBufferSRVToRHI(&stream_D3D11.StreamBuffer(), stream_D3D11.StreamSizeEst(), sizeof(float), PF_R32_UINT);
m_SimDataSRVRef = StreamBufferSRVToRHI(&stream_D3D11.StreamBuffer(), sizeof(float), PF_R32_UINT /* debug layer errors if not specified correctly */);
}
#endif
#if (PK_GPU_D3D12 == 1)
if (renderContext.m_API == SUERenderContext::D3D12)
{
const PopcornFX::CParticleStreamToRender_D3D12 &stream_D3D12 = static_cast<const PopcornFX::CParticleStreamToRender_D3D12&>(dr->StreamToRender());
m_SimDataSRVRef = StreamBufferSRVToRHI(&stream_D3D12.StreamBuffer(), sizeof(u32));
m_SimDataSRVRef = StreamBufferSRVToRHI(&stream_D3D12.StreamBuffer(), sizeof(float));
}
#endif
PK_ASSERT(m_SimDataSRVRef.IsValid());
Expand Down Expand Up @@ -1191,15 +1236,8 @@ void CBatchDrawer_Billboard_GPUBB::_IssueDrawCall_Billboard(const SUERenderConte
vsUniformsGPUBillboard.InDynamicParameter3sOffset = m_AdditionalStreamOffsets[StreamOffset_DynParam3s].Valid() ? static_cast<s32>(m_AdditionalStreamOffsets[StreamOffset_DynParam3s] / sizeof(float)) : -1;
vsUniformsGPUBillboard.AtlasRectCount = m_AtlasRects.m_AtlasRectsCount;

if (m_AtlasRects.m_AtlasBufferSRV != null)
vsUniformsGPUBillboard.AtlasBuffer = m_AtlasRects.m_AtlasBufferSRV;
else
vsUniformsGPUBillboard.AtlasBuffer = vsUniforms.InSimData; // Dummy SRV

if (gpuStorage)
vsUniformsGPUBillboard.DrawRequests = vsUniforms.InSimData;
else
vsUniformsGPUBillboard.DrawRequests = m_DrawRequests.m_DrawRequestsBufferSRV; // Dummy SRV
vsUniformsGPUBillboard.AtlasBuffer = m_AtlasRects.m_AtlasBufferSRV == null ? GPopcornFXNullFloat4Buffer.SRV : m_AtlasRects.m_AtlasBufferSRV;
vsUniformsGPUBillboard.DrawRequests = gpuStorage ? GPopcornFXNullFloat4Buffer.SRV : m_DrawRequests.m_DrawRequestsBufferSRV;

vertexFactory->m_VSUniformBuffer = FPopcornFXUniformsRef::CreateUniformBufferImmediate(vsUniforms, UniformBuffer_SingleFrame);
vertexFactory->m_GPUBillboardVSUniformBuffer = FPopcornFXGPUBillboardVSUniformsRef::CreateUniformBufferImmediate(vsUniformsGPUBillboard, UniformBuffer_SingleFrame);
Expand Down
34 changes: 33 additions & 1 deletion Source/PopcornFX/Private/Render/BatchDrawer_Billboard_GPU.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ class FPopcornFXGPUVertexFactory;
class FPopcornFXUniforms;
class FPopcornFXGPUBillboardVSUniforms;

//----------------------------------------------------------------------------
//
// Atlas buffer (holds CRectangleList rects)
//
//----------------------------------------------------------------------------

PK_FIXME("Should be build from PopcornFXFile")
struct FPopcornFXAtlasRectsVertexBuffer
{
//FStructuredBufferRHIRef m_AtlasBuffer_Structured;
Expand Down Expand Up @@ -47,6 +50,10 @@ struct FPopcornFXAtlasRectsVertexBuffer
bool _LoadRects(const PopcornFX::TMemoryView<const CFloat4> &rects);
};

//----------------------------------------------------------------------------
//
// Draw requests buffer (holds batching data, not currently supported by the GPU sim)
//
//----------------------------------------------------------------------------

struct FPopcornFXDrawRequestsBuffer
Expand All @@ -71,6 +78,31 @@ struct FPopcornFXDrawRequestsBuffer
bool m_Mapped = false;
};

//----------------------------------------------------------------------------
//
// Null Float4 buffer
//
//----------------------------------------------------------------------------

class FNullFloat4Buffer : public FVertexBuffer
{
public:
#if (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
virtual void InitRHI(FRHICommandListBase &RHICmdList) override;
#else
virtual void InitRHI() override;
#endif // (ENGINE_MAJOR_VERSION == 5) && (ENGINE_MINOR_VERSION >= 3)
virtual void ReleaseRHI() override;

FShaderResourceViewRHIRef SRV;
};

extern TGlobalResource<FNullFloat4Buffer> GPopcornFXNullFloat4Buffer;

//----------------------------------------------------------------------------
//
// Drawer
//
//----------------------------------------------------------------------------

class CBatchDrawer_Billboard_GPUBB : public PopcornFX::CRendererBatchJobs_Billboard_GPUBB
Expand Down
Loading

0 comments on commit 7b331b8

Please sign in to comment.