ULRE/src/SceneGraph/TileData.cpp

162 lines
4.6 KiB
C++
Raw Normal View History

2020-06-21 02:27:08 +08:00
#include<hgl/graph/TileData.h>
2020-06-21 02:23:11 +08:00
#include<hgl/log/LogInfo.h>
#include<hgl/graph/vulkan/VKDevice.h>
#include<hgl/graph/vulkan/VKBuffer.h>
2020-06-20 19:40:09 +08:00
namespace hgl
{
namespace graph
{
TileData::TileData(Device *dev,Texture2D *tt,const uint tw,const uint th)
2020-06-20 19:40:09 +08:00
{
device=dev;
2020-06-21 02:23:11 +08:00
tile_texture=tt;
tile_width=tw;
tile_height=th;
tile_rows=tile_texture->GetHeight()/tile_height;
tile_cols=tile_texture->GetWidth()/tile_width;
tile_max_count=tile_rows*tile_cols;
tile_count=0;
2020-07-24 17:50:46 +08:00
to_pool.PreMalloc(tile_max_count);
{
int col=0,row=0;
2020-07-24 20:25:30 +08:00
TileObject **to=to_pool.GetInactiveData();
2020-07-24 17:50:46 +08:00
for(uint i=0;i<tile_max_count;i++)
{
(*to)->col =col;
(*to)->row =row;
2020-07-24 20:25:30 +08:00
(*to)->uv_pixel.Set(col*tile_width,
row*tile_height,
0,
0);
2020-07-24 17:50:46 +08:00
2020-07-24 20:25:30 +08:00
++to;
2020-07-24 17:50:46 +08:00
++col;
2020-07-24 20:25:30 +08:00
2020-07-24 17:50:46 +08:00
if(col==tile_cols)
{
++row;
col=0;
}
}
}
tile_bytes=tile_width*tile_height*GetStrideByFormat(tile_texture->GetFormat());
tile_buffer=device->CreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,tile_bytes,nullptr);
2020-06-21 02:23:11 +08:00
}
TileData::~TileData()
{
SAFE_CLEAR(tile_buffer);
2020-06-21 02:23:11 +08:00
SAFE_CLEAR(tile_texture);
}
2020-07-24 20:25:30 +08:00
TileObject *TileData::FindSpace()
2020-06-21 02:23:11 +08:00
{
2020-07-24 20:25:30 +08:00
TileObject *obj;
2020-06-21 02:23:11 +08:00
2020-07-24 17:50:46 +08:00
if(!to_pool.Get(obj))
return(nullptr);
2020-06-21 02:23:11 +08:00
2020-07-24 17:50:46 +08:00
return obj;
2020-06-21 02:23:11 +08:00
}
2020-07-24 20:25:30 +08:00
bool TileData::WriteTile(TileObject *obj,const void *data,const uint bytes,int ctw,int cth)
2020-06-21 02:23:11 +08:00
{
2020-07-24 17:50:46 +08:00
if(!obj||!data||!bytes||ctw<=0||cth<=0)
return(false);
2020-06-21 02:23:11 +08:00
2020-07-24 20:25:30 +08:00
obj->uv_pixel.SetSize( (ctw==-1)?tile_width:ctw,
(cth==-1)?tile_height:cth);
2020-06-21 02:23:11 +08:00
2020-07-24 20:25:30 +08:00
UVFloatFromPixel( obj->uv_float,
obj->uv_pixel,
tile_texture->GetWidth(),
tile_texture->GetHeight());
2020-06-21 02:23:11 +08:00
tile_buffer->Write(data,0,bytes);
device->ChangeTexture2D(tile_texture,
tile_buffer,
2020-07-24 20:25:30 +08:00
obj->uv_pixel.GetLeft(),
obj->uv_pixel.GetTop(),
tile_width,
tile_height);
2020-07-24 17:50:46 +08:00
return(true);
2020-06-21 02:23:11 +08:00
}
/**
* Tile
* @param data
* @param bytes
* @param ctw tile宽度,-1
* @param cth tile高度,-1
* @return Tile创建的对象
*/
2020-07-24 20:25:30 +08:00
TileObject *TileData::Add(const void *data,const uint bytes,const int ctw,const int cth)
{
2020-07-24 17:50:46 +08:00
if(!data||!bytes||ctw<=0||cth<=0)
return(nullptr);
2020-07-24 20:25:30 +08:00
TileObject *obj=FindSpace();
2020-07-24 17:50:46 +08:00
if(!obj)
return(nullptr);
2020-07-24 17:50:46 +08:00
WriteTile(obj,data,bytes,ctw,cth);
tile_count++;
return(obj);
}
/**
* Tile
* @param obj Tile的对象指针
* @return
*/
2020-07-24 20:25:30 +08:00
bool TileData::Delete(TileObject *obj)
{
2020-07-24 17:50:46 +08:00
if(!obj)return(false);
2020-07-24 17:50:46 +08:00
return to_pool.Release(obj);
}
/**
* Tile的数据内容
* @param obj Tile的对象指针
* @param data
* @param bytes
* @param ctw tile宽度,-1
* @param cth tile高度,-1
* @return
*/
2020-07-24 20:25:30 +08:00
bool TileData::Change(TileObject *obj,const void *data,const uint bytes,const int ctw,const int cth)
{
2020-07-24 17:50:46 +08:00
if(!obj||!data||!bytes||ctw<=0||cth<=0)
return(false);
2020-07-24 17:50:46 +08:00
if(!to_pool.IsActive(obj))
return(false);
2020-07-24 17:50:46 +08:00
return WriteTile(obj,data,bytes,ctw,cth);
}
/**
* Tile数据
*/
void TileData::Clear()
{
2020-07-24 20:25:30 +08:00
to_pool.ClearActive();
}
2020-06-20 19:40:09 +08:00
}//namespace graph
}//namespace hgl