버텍스 그릴 순서를 정의해둔 인덱스를 담는 버퍼

BufferCache

동일한 프리미티브 타입에 대한 버텍스 버퍼, 인덱스 버퍼를 캐시

class FBufferCache
{
private:
	TMap <EPrimitiveType, FVertexBufferInfo> VertexBufferCache;
	TMap <EPrimitiveType, FIndexBufferInfo> IndexBufferCache;
	TMap <EPrimitiveType, TArray<FVertexSimple>> PrimitiveVertices;

public:
	FBufferCache();
	~FBufferCache();

	void Init();
	FVertexBufferInfo GetVertexBufferInfo(EPrimitiveType Type);
	FIndexBufferInfo GetIndexBufferInfo(EPrimitiveType Type);

public:
	TArray<FVertexSimple> CreateConeVertices();
	TArray<FVertexSimple> CreateCylinderVertices();

private :
	FVertexBufferInfo CreateVertexBufferInfo(EPrimitiveType Type);
	FIndexBufferInfo CreateIndexBufferInfo(EPrimitiveType Type);
	TArray<UINT> CreateDefaultIndices(int Size);
};

FIndexBufferInfo

struct FIndexBufferInfo
{
public:
	FIndexBufferInfo() = default;
	FIndexBufferInfo(ID3D11Buffer* InIndexBuffer, int InIndexBufferSize)
	{
		IndexBuffer = InIndexBuffer;
		IndexBufferSize = InIndexBufferSize;
	}
	ID3D11Buffer* GetIndexBuffer() const { return IndexBuffer.Get(); }
	int GetSize() const { return IndexBufferSize; }

	Microsoft::WRL::ComPtr<ID3D11Buffer> IndexBuffer;
	int IndexBufferSize;

};

RenderPrimitive

현재 사용중인 프리미티브 타입을 렌더링하기 위한 함수

void URenderer::RenderPrimitive(UPrimitiveComponent* PrimitiveComp)
{
    if (BufferCache == nullptr)
    {
        return;
    }

    // 버텍스
    FVertexBufferInfo VertexInfo = BufferCache->GetVertexBufferInfo(PrimitiveComp->GetType());

    if (VertexInfo.GetVertexBuffer() == nullptr)
    {
        return;
    }

    auto Topology = VertexInfo.GetTopology();
    {
        DeviceContext->IASetPrimitiveTopology(Topology);
        CurrentTopology = Topology;
    }

    ConstantUpdateInfo UpdateInfo{ 
        PrimitiveComp->GetWorldTransform().GetMatrix(),
        PrimitiveComp->GetCustomColor(), 
        PrimitiveComp->IsUseVertexColor()
    };

    UpdateObjectConstantBuffer(UpdateInfo);

    // 인덱스
	FIndexBufferInfo IndexInfo = BufferCache->GetIndexBufferInfo(PrimitiveComp->GetType());

	ID3D11Buffer* VertexBuffer = VertexInfo.GetVertexBuffer();
	ID3D11Buffer* IndexBuffer = IndexInfo.GetIndexBuffer();

	int Size = IndexBuffer ? IndexInfo.GetSize() : VertexInfo.GetSize();

    RenderPrimitiveInternal(VertexBuffer, IndexBuffer, Size);

}