Files
WickedEngine/WickedEngine/wiRenderTarget.cpp
T
2016-03-19 19:55:58 +01:00

255 lines
8.3 KiB
C++

#include "wiRenderTarget.h"
#include "wiRenderer.h"
#include "wiDepthTarget.h"
void wiRenderTarget::clear(){
//textureDesc = { 0 };
numViews = 0;
viewPort = ViewPort();
depth = nullptr;
//retargetted = false;
isCube = false;
}
wiRenderTarget::wiRenderTarget()
{
clear();
}
wiRenderTarget::wiRenderTarget(UINT width, UINT height, int numViews, bool hasDepth, UINT MSAAC, UINT MSAAQ
, DXGI_FORMAT format, UINT mipMapLevelCount)
{
clear();
Initialize(width, height, numViews, hasDepth, MSAAC, MSAAQ, format, mipMapLevelCount);
}
wiRenderTarget::~wiRenderTarget()
{
//for(int i=0;i<numViews;++i){
// if(texture2D[i]) texture2D[i]->Release(); texture2D[i] = NULL;
// if(renderTarget[i]) renderTarget[i]->Release(); renderTarget[i] = NULL;
// if(SAVEDshaderResource[i]) SAVEDshaderResource[i]->Release(); SAVEDshaderResource[i]=NULL;
// if(shaderResource[i] && !retargetted) shaderResource[i]->Release(); shaderResource[i] = NULL;
//}
//texture2D.clear();
//renderTarget.clear();
//shaderResource.clear();
for (unsigned int i = 0; i < renderTargets.size(); ++i)
{
SAFE_DELETE(renderTargets[i]);
}
for (unsigned int i = 0; i < renderTargets_Cube.size(); ++i)
{
SAFE_DELETE(renderTargets_Cube[i]);
}
SAFE_DELETE(depth);
}
void wiRenderTarget::Initialize(UINT width, UINT height, int numViews, bool hasDepth, UINT MSAAC, UINT MSAAQ
, DXGI_FORMAT format, UINT mipMapLevelCount)
{
isCube = false;
this->numViews = numViews;
//texture2D.resize(numViews);
//renderTarget.resize(numViews);
//shaderResource.resize(numViews);
//SAVEDshaderResource.resize(numViews);
renderTargets.resize(numViews);
Texture2DDesc textureDesc;
ZeroMemory(&textureDesc, sizeof(textureDesc));
textureDesc.Width = width;
textureDesc.Height = height;
textureDesc.MipLevels = mipMapLevelCount;
textureDesc.ArraySize = 1;
textureDesc.Format = format;
textureDesc.SampleDesc.Count = MSAAC;
textureDesc.SampleDesc.Quality = MSAAQ;
textureDesc.Usage = USAGE_DEFAULT;
textureDesc.BindFlags = BIND_RENDER_TARGET | BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
if (mipMapLevelCount != 1)
{
textureDesc.MiscFlags = RESOURCE_MISC_GENERATE_MIPS;
}
//RenderTargetViewDesc renderTargetViewDesc;
//renderTargetViewDesc.Format = format;
//renderTargetViewDesc.ViewDimension = (MSAAQ==0 ? RESOURCE_DIMENSION_TEXTURE2D : RESOURCE_DIMENSION_TEXTURE2DMS);
////renderTargetViewDesc.Texture2D.MipSlice = 0;
//
//ShaderResourceViewDesc shaderResourceViewDesc;
//shaderResourceViewDesc.Format = format;
//shaderResourceViewDesc.ViewDimension = (MSAAQ==0 ? RESOURCE_DIMENSION_TEXTURE2D : RESOURCE_DIMENSION_TEXTURE2DMS);
////shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; //from most detailed...
////shaderResourceViewDesc.Texture2D.MipLevels = -1; //...to least detailed
//shaderResourceViewDesc.mipLevels = -1;
//for(int i=0;i<numViews;++i){
// wiRenderer::graphicsDevice->CreateTexture2D(&textureDesc, nullptr, &texture2D[i]);
// wiRenderer::graphicsDevice->CreateRenderTargetView(texture2D[i], &renderTargetViewDesc, &renderTarget[i]);
// wiRenderer::graphicsDevice->CreateShaderResourceView(texture2D[i], &shaderResourceViewDesc, &shaderResource[i]);
//}
for (int i = 0; i < numViews; ++i)
{
wiRenderer::graphicsDevice->CreateTexture2D(&textureDesc, nullptr, &renderTargets[i]);
}
viewPort.Width = (FLOAT)width;
viewPort.Height = (FLOAT)height;
viewPort.MinDepth = 0.0f;
viewPort.MaxDepth = 1.0f;
viewPort.TopLeftX = 0;
viewPort.TopLeftY = 0;
if(hasDepth) {
depth = new wiDepthTarget();
depth->Initialize(width,height,MSAAC,MSAAQ);
}
}
void wiRenderTarget::InitializeCube(UINT size, int numViews, bool hasDepth, DXGI_FORMAT format, UINT mipMapLevelCount)
{
isCube = true;
this->numViews = numViews;
//texture2D.resize(numViews);
//renderTarget.resize(numViews);
//shaderResource.resize(numViews);
//SAVEDshaderResource.resize(numViews);
renderTargets_Cube.resize(numViews);
Texture2DDesc textureDesc;
ZeroMemory(&textureDesc, sizeof(textureDesc));
textureDesc.Width = size;
textureDesc.Height = size;
textureDesc.MipLevels = mipMapLevelCount;
textureDesc.ArraySize = 6;
textureDesc.Format = format;
textureDesc.SampleDesc.Count = 1;
textureDesc.SampleDesc.Quality = 0;
textureDesc.Usage = USAGE_DEFAULT;
textureDesc.BindFlags = BIND_RENDER_TARGET | BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = RESOURCE_MISC_TEXTURECUBE;
if (mipMapLevelCount != 1)
{
textureDesc.MiscFlags |= RESOURCE_MISC_GENERATE_MIPS;
}
//RenderTargetViewDesc renderTargetViewDesc;
//renderTargetViewDesc.Format = format;
//renderTargetViewDesc.ViewDimension = RESOURCE_DIMENSION_TEXTURE2DARRAY;
//// renderTargetViewDesc.Texture2DArray.FirstArraySlice = 0;
////renderTargetViewDesc.Texture2DArray.ArraySize = 6;
//// renderTargetViewDesc.Texture2DArray.MipSlice = 0;
//renderTargetViewDesc.ArraySize = 6;
//
//ShaderResourceViewDesc shaderResourceViewDesc;
//shaderResourceViewDesc.Format = format;
//shaderResourceViewDesc.ViewDimension = RESOURCE_DIMENSION_TEXTURECUBE;
////shaderResourceViewDesc.TextureCube.MostDetailedMip = 0; //from most detailed...
////shaderResourceViewDesc.TextureCube.MipLevels = -1; //...to least detailed
//shaderResourceViewDesc.mipLevels = -1;
//for(int i=0;i<numViews;++i){
// wiRenderer::graphicsDevice->CreateTexture2D(&textureDesc, NULL, &texture2D[i]);
// wiRenderer::graphicsDevice->CreateRenderTargetView(texture2D[i], &renderTargetViewDesc, &renderTarget[i]);
// wiRenderer::graphicsDevice->CreateShaderResourceView(texture2D[i], &shaderResourceViewDesc, &shaderResource[0]);
//}
for (int i = 0; i < numViews; ++i)
{
wiRenderer::graphicsDevice->CreateTextureCube(&textureDesc, nullptr, &renderTargets_Cube[i]);
}
viewPort.Width = (FLOAT)size;
viewPort.Height = (FLOAT)size;
viewPort.MinDepth = 0.0f;
viewPort.MaxDepth = 1.0f;
viewPort.TopLeftX = 0;
viewPort.TopLeftY = 0;
if(hasDepth) {
depth = new wiDepthTarget();
depth->InitializeCube(size);
}
}
void wiRenderTarget::InitializeCube(UINT size, int numViews, bool hasDepth)
{
InitializeCube(size,numViews,hasDepth,DXGI_FORMAT_R8G8B8A8_UNORM);
}
void wiRenderTarget::Activate(GRAPHICSTHREAD threadID)
{
Activate(threadID,0,0,0,0);
}
void wiRenderTarget::Activate(GRAPHICSTHREAD threadID, float r, float g, float b, float a)
{
Set(threadID);
float ClearColor[4] = { r, g, b, a };
for(int i=0;i<numViews;++i)
wiRenderer::graphicsDevice->ClearRenderTarget(GetTexture(i), ClearColor);
if(depth) depth->Clear(threadID);
}
void wiRenderTarget::Activate(GRAPHICSTHREAD threadID, wiDepthTarget* getDepth, float r, float g, float b, float a)
{
Set(threadID,getDepth);
float ClearColor[4] = { r, g, b, a };
for(int i=0;i<numViews;++i)
wiRenderer::graphicsDevice->ClearRenderTarget(GetTexture(i), ClearColor);
}
void wiRenderTarget::Activate(GRAPHICSTHREAD threadID, wiDepthTarget* getDepth)
{
Activate(threadID,getDepth,0,0,0,0);
}
void wiRenderTarget::Deactivate(GRAPHICSTHREAD threadID)
{
wiRenderer::graphicsDevice->BindRenderTargets(0, nullptr, nullptr);
}
void wiRenderTarget::Set(GRAPHICSTHREAD threadID)
{
wiRenderer::graphicsDevice->BindViewports(1, &viewPort);
wiRenderer::graphicsDevice->BindRenderTargets(numViews, (isCube ? (Texture2D**)renderTargets_Cube.data() : renderTargets.data()), (depth ? depth->GetTexture() : nullptr));
}
void wiRenderTarget::Set(GRAPHICSTHREAD threadID, wiDepthTarget* getDepth)
{
depth = getDepth;
wiRenderer::graphicsDevice->BindViewports(1, &viewPort);
wiRenderer::graphicsDevice->BindRenderTargets(numViews, (isCube ? (Texture2D**)renderTargets_Cube.data() : renderTargets.data()), (depth ? depth->GetTexture() : nullptr));
}
//void wiRenderTarget::Retarget(Texture2D* resource)
//{
// retargetted=true;
// for(unsigned int i=0;i<shaderResource.size();++i){
// SAVEDshaderResource[i]=shaderResource[i];
// shaderResource[i]=resource;
// }
//}
//void wiRenderTarget::Restore(){
// if(retargetted){
// for(unsigned int i=0;i<shaderResource.size();++i){
// shaderResource[i]=SAVEDshaderResource[i];
// }
// }
// retargetted=false;
//}
UINT wiRenderTarget::GetMipCount()
{
//if (shaderResource.empty())
// return 0U;
Texture2DDesc desc = GetDesc();
if (desc.MipLevels>0)
return desc.MipLevels;
UINT maxDim = max(desc.Width, desc.Height);
return static_cast<UINT>( log2(static_cast<double>(maxDim)) );
}