2014-05-05 14:50:33 +08:00
|
|
|
|
/****************************************************************************
|
|
|
|
|
Copyright (c) 2011-2013,WebJet Business Division,CYOU
|
|
|
|
|
|
|
|
|
|
http://www.genesis-3d.com.cn
|
|
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
|
THE SOFTWARE.
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
#include "stdneb.h"
|
|
|
|
|
#include "RenderToTexture.h"
|
|
|
|
|
#include "GraphicSystem.h"
|
|
|
|
|
#if __WIN32__
|
|
|
|
|
#include "rendersystem/d3d9/RenderDeviceD3D9.h"
|
|
|
|
|
#include "d3d9/TextureD3D9.h"
|
|
|
|
|
#include "d3d9/D3D9Types.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "addons/resource/imageoperations.h"
|
|
|
|
|
#include "Renderable/QuadRenderable.h"
|
|
|
|
|
|
|
|
|
|
namespace Graphic
|
|
|
|
|
{
|
|
|
|
|
__ImplementClass(RenderToTexture,'RTGS',Core::RefCounted)
|
|
|
|
|
__ImplementClass(RenderToTextureManager,'RTMG',Core::RefCounted);
|
|
|
|
|
__ImplementImageSingleton(RenderToTextureManager);
|
|
|
|
|
|
|
|
|
|
RenderToTexture::RenderToTexture()
|
|
|
|
|
: m_width(1),
|
|
|
|
|
m_height(1)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RenderToTexture::~RenderToTexture()
|
|
|
|
|
{
|
|
|
|
|
Discard();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RenderToTexture::Setup(const int& width, const int& height, const RenderBase::PixelFormat::Code& colorFormat, const uint& flag, const Math::float4& color,
|
|
|
|
|
const bool& useDepth, const float& screenRatio,
|
|
|
|
|
RenderBase::AntiAliasQuality::Code quality,
|
|
|
|
|
const Math::rectangle<int>& resolveRect, const bool& isBackBuffer)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
GPtr<RenderBase::RenderTarget> shareDepthStencilRT = m_shareDepthStencilRT;
|
|
|
|
|
|
|
|
|
|
// Ϊ<><CEAA><EFBFBD><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>buffer<65><72>bug<75><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>m_shareDepthStencilRT<52>ı<EFBFBD><C4B1><EFBFBD>
|
|
|
|
|
Discard();
|
|
|
|
|
m_shareDepthStencilRT = shareDepthStencilRT;
|
|
|
|
|
|
|
|
|
|
m_RT = RenderBase::RenderTarget::Create();
|
|
|
|
|
m_RT->SetDefaultRenderTarget(isBackBuffer);
|
|
|
|
|
m_RT->SetWidth(width);
|
|
|
|
|
m_RT->SetHeight(height);
|
|
|
|
|
|
|
|
|
|
if (resolveRect.right == 0 && resolveRect.left == 0 && resolveRect.top == 0 && resolveRect.bottom == 0)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_RT->SetResolveTextureWidth(resolveRect.width());
|
|
|
|
|
m_RT->SetResolveTextureHeight(resolveRect.height());
|
|
|
|
|
m_RT->SetResolveRect(resolveRect);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_RT->SetScreenSizeRatio(screenRatio);
|
|
|
|
|
m_RT->SetClearColor(color);
|
|
|
|
|
m_RT->SetClearFlags(flag);
|
|
|
|
|
m_RT->SetColorBufferFormat(colorFormat);
|
|
|
|
|
m_RT->SetAntiAliasQuality(quality);
|
|
|
|
|
if (useDepth)
|
|
|
|
|
{
|
|
|
|
|
if (m_shareDepthStencilRT.isvalid())
|
|
|
|
|
{
|
|
|
|
|
m_RT->AddSharedDepthStencilBuffer(m_shareDepthStencilRT);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_RT->AddDepthStencilBuffer();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
m_rtHandle = GraphicSystem::Instance()->CreateRenderTarget(m_RT,m_texHandle);
|
|
|
|
|
|
|
|
|
|
if (!m_quadRenderable.isvalid())
|
|
|
|
|
{
|
|
|
|
|
m_quadRenderable = QuadRenderable::Create();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_quadRenderable->Discard();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_quadRenderable->Setup(width, height);
|
|
|
|
|
|
|
|
|
|
m_width = width;
|
|
|
|
|
m_height = height;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RenderToTexture::ChangeSize(int width,int height)
|
|
|
|
|
{
|
|
|
|
|
m_RT->SetWidth(width);
|
|
|
|
|
m_RT->SetHeight(height);
|
|
|
|
|
GraphicSystem::Instance()->ReSizeRenderTarget(m_rtHandle,width,height);
|
|
|
|
|
|
|
|
|
|
if (m_quadRenderable.isvalid())
|
|
|
|
|
{
|
|
|
|
|
m_quadRenderable->Discard();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_quadRenderable = QuadRenderable::Create();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_quadRenderable->Setup(width, height);
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-23 10:24:40 +08:00
|
|
|
|
RenderBase::AntiAliasQuality::Code RenderToTexture::GetAntiAliasQuality() const
|
|
|
|
|
{
|
|
|
|
|
if (m_RT.isvalid())
|
|
|
|
|
{
|
|
|
|
|
return m_RT->GetAntiAliasQuality();
|
|
|
|
|
}
|
|
|
|
|
return RenderBase::AntiAliasQuality::None;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RenderBase::PixelFormat::Code RenderToTexture::GetColorBufferFormat() const
|
|
|
|
|
{
|
|
|
|
|
if (m_RT.isvalid())
|
|
|
|
|
{
|
|
|
|
|
return m_RT->GetColorBufferFormat();
|
|
|
|
|
}
|
|
|
|
|
return RenderBase::PixelFormat::InvalidPixelFormat;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-05 14:50:33 +08:00
|
|
|
|
void RenderToTexture::Discard()
|
|
|
|
|
{
|
|
|
|
|
if (m_texHandle.IsValid())
|
|
|
|
|
{
|
|
|
|
|
GraphicSystem::Instance()->RemoveTexture(m_texHandle);
|
|
|
|
|
m_texHandle = dummyhandle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_rtHandle.IsValid())
|
|
|
|
|
{
|
|
|
|
|
GraphicSystem::Instance()->RemoveRenderTarget(m_rtHandle);
|
|
|
|
|
m_rtHandle = dummyhandle;
|
|
|
|
|
}
|
|
|
|
|
m_shareDepthStencilRT = 0;
|
|
|
|
|
m_RT = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool RenderToTexture::SaveTexture( const Util::String& path )
|
|
|
|
|
{
|
|
|
|
|
#if __WIN32__
|
|
|
|
|
Core::RefCounted* Ro = this->m_texHandle.AsObject();
|
|
|
|
|
n_assert(Ro!=NULL);
|
|
|
|
|
D3D9::TextureD3D9 * Instance = reinterpret_cast<D3D9::TextureD3D9*>(Ro);
|
|
|
|
|
n_assert(Instance!=NULL);
|
|
|
|
|
|
|
|
|
|
SizeT levelPixelSize =Instance->GetTextureSize();
|
|
|
|
|
|
|
|
|
|
ubyte* data = new ubyte[levelPixelSize];
|
|
|
|
|
n_assert(data!=NULL);
|
|
|
|
|
Instance->GetTextureData(data);
|
|
|
|
|
|
|
|
|
|
GPtr<Resources::ImageRes> textureImageRes = Resources::ImageRes::Create();
|
|
|
|
|
textureImageRes->SetHeight(Instance->GetHeight());
|
|
|
|
|
textureImageRes->SetWidth(Instance->GetWidth());
|
|
|
|
|
textureImageRes->SetPixelFormat(Instance->GetPixelFormat());
|
|
|
|
|
textureImageRes->SetDepth(1);
|
|
|
|
|
textureImageRes->SetMipMapLevel(1);
|
|
|
|
|
textureImageRes->SetNumFace(1);
|
|
|
|
|
textureImageRes->SetImageData(data, levelPixelSize);
|
|
|
|
|
return Resources::ImageOperations::SaveTGAImage(path, textureImageRes);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RenderToTexture::ResetQuad()
|
|
|
|
|
{
|
|
|
|
|
m_quadRenderable->Setup(m_width, m_height);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RenderToTextureManager::RenderToTextureManager()
|
|
|
|
|
{
|
|
|
|
|
__ConstructImageSingleton
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RenderToTextureManager::~RenderToTextureManager()
|
|
|
|
|
{
|
|
|
|
|
__DestructImageSingleton
|
|
|
|
|
m_RenderToTextures.Clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|