#pragma once
#include "Bindable.h"
/*
상수 버퍼를 Wrapping 하는 클래스.
Map, UnMap을 data를 Set하면 자동으로 처리해주고 VSSetConstantBuffers를 해주는 함수 SetBuffer를 제공한다.
*/
template<typename T>
class CBuffer :public Bindable
{
protected:
T _data;
wrl::ComPtr<ID3D11Buffer> buffer;
public:
CBuffer(Graphics& gfx) :
Bindable(gfx)
{
D3D11_BUFFER_DESC desc = {};
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = sizeof(T) + 16 - (sizeof(T) % 16);
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;
desc.StructureByteStride = 0;
HRESULT hr;
GFX_THROW_HR(gfx.device.CreateBuffer(&desc, nullptr, buffer.GetAddressOf()));
}
void ApplyChanges()
{
HRESULT hr;
D3D11_MAPPED_SUBRESOURCE mappedResource;
GFX_THROW_HR(gfx.context.Map(buffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource));
CopyMemory(mappedResource.pData, &_data, sizeof(T));
gfx.context.Unmap(buffer.Get(), 0);
}
virtual void SetBuffer(UINT num) = 0;
DEFINEPROPERTY:
PROPERTY(T&, data);
GET(data) { return _data; }
SET(data)
{
//CONSOLE("CALL : Constant Buffer Set data");
_data = value;
ApplyChanges();
}
READONLY_PROPERTY(wrl::ComPtr<ID3D11Buffer>&, cbuf);
GET(cbuf) { return buffer; }
};
template <typename T>
class VertexCBuffer : public CBuffer<T>
{
using CBuffer<T>::buffer;
using Bindable::_gfx;
public:
VertexCBuffer(Graphics& gfx) :
CBuffer<T>(gfx)
{
}
void SetBuffer(UINT num) override {
_gfx.context.VSSetConstantBuffers(num, 1, buffer.GetAddressOf());
}
};
template <typename T>
class PixelCBuffer : public CBuffer<T>
{
using CBuffer<T>::buffer;
using Bindable::_gfx;
public:
PixelCBuffer(Graphics& gfx) :
CBuffer<T>(gfx)
{}
void SetBuffer(UINT num) override {
_gfx.context.PSSetConstantBuffers(num, 1, buffer.GetAddressOf());
}
};
가상 클래스 CBuffer를 상속하는 VertexCBuffer, PixelCBuffer 클래스를 만들어서 SetBuffer함수를 호출하려고 보니 gfx를 사용할 수 없다는 컴파일 에러가 났다. 해결방법은 위에 코드와 같이 내가 어떤 클래스의 어떤 변수를 쓸 것인지 using 선언을 통해 선언해주어야 한다는 것이다.
아직 이유는 모르겠다. 아직 템플릿을 어떻게 해야할 지 모르겠다.
'Programming' 카테고리의 다른 글
구 & 광선 교차 판정 하기 (1) | 2020.02.12 |
---|---|
[C++] 비트 연산 활용 연습 (0) | 2020.01.30 |
Enum Template 응용 :: 강제 형 변환하여 char 데이터 배열을 원하는 타입으로 출력 (0) | 2020.01.22 |
Template 연구 - Enum과 Template 임의 다중 상속 (0) | 2020.01.21 |
Variadic Template :: arguments 분리하여 변수로 사용하기 (0) | 2020.01.20 |