ULRE/src/SceneGraph/Vulkan/VKTileData.cpp

100 lines
2.3 KiB
C++

#include<hgl/graph/VKPhysicalDevice.h>
#include<hgl/graph/TileData.h>
#include<hgl/graph/module/TextureManager.h>
namespace
{
using namespace hgl;
void AnalyseSize(uint &fw,uint &fh,const uint w,const uint h,const uint count,const uint32_t max_texture_size)
{
uint total,tw,th,t;
fw=fh=0;
tw=max_texture_size;
while(tw>=w)
{
th=max_texture_size;
while(th>=h)
{
t=(tw/w)*(th/h);
if(!fw)
{
fw=tw;
fh=th;
total=t;
}
else
{
if(t==count)
{
//正好,就要这么大的
fw=tw;
fh=th;
return;
}
else
if(t>count) //要比要求的最大值大
{
if(t<total) //找到最接近最大值的
{
//比现在选中的更节省
fw=tw;
fh=th;
total=t;
}
}
}
th>>=1;
}
tw>>=1;
}
}//void AnalyseSize
}//namespace
VK_NAMESPACE_BEGIN
TileData *TextureManager::CreateTileData(const VkFormat format,const uint width,const uint height,const uint count)
{
if(!CheckVulkanFormat(format))
return(nullptr);
if(width<=0||height<=0||count<=0)
return(nullptr);
const uint32_t max_2d_texture=GetPhyDevice()->GetMaxImage2D();
uint tex_width,tex_height;
AnalyseSize(tex_width,tex_height,width,height,count,max_2d_texture);
const VulkanFormat *vf=GetVulkanFormat(format);
if(!vf)return(nullptr);
Texture2D *tex=nullptr;
VkExtent2D extent={tex_width,tex_height};
if(RangeCheck(vf->color))
{
tex=CreateTexture2D(new ColorTextureCreateInfo(format,extent));
}
else
if(RangeCheck(vf->depth))
{
tex=CreateTexture2D(new DepthTextureCreateInfo(format,extent));
}
else
return(nullptr);
return(new TileData(this,tex,width,height));
}
VK_NAMESPACE_END