Бранимир Караџић 5 years ago
parent
commit
cb604eb1fe
2 changed files with 74 additions and 41 deletions
  1. 72 41
      examples/40-svt/vt.cpp
  2. 2 0
      examples/40-svt/vt.h

+ 72 - 41
examples/40-svt/vt.cpp

@@ -26,7 +26,8 @@ static const int s_channelCount = 4;
 static const int s_tileFileDataOffset = sizeof(VirtualTextureInfo);
 
 // Page
-Page::operator size_t() const {
+Page::operator size_t() const
+{
 	return size_t((uint32_t(m_mip) << 16) | uint32_t((uint16_t(m_x) << 8) | uint16_t(m_y)));
 }
 
@@ -39,13 +40,12 @@ PageCount::PageCount(Page _page, int _count)
 
 int PageCount::compareTo(const PageCount& other) const
 {
-	#define Comparer(a, b) bx::clamp<int>(a - b, -1, 1)
 	if (other.m_page.m_mip != m_page.m_mip)
 	{
-		return Comparer(other.m_page.m_mip, m_page.m_mip);
+		return bx::clamp<int>(other.m_page.m_mip - m_page.m_mip, -1, 1);
 	}
-	return Comparer(other.m_count, m_count);
-	#undef Comparer
+
+	return bx::clamp<int>(other.m_count - m_count, -1, 1);
 }
 
 // VirtualTextureInfo
@@ -55,6 +55,7 @@ VirtualTextureInfo::VirtualTextureInfo()
 	, m_borderSize(0)
 {
 }
+
 int VirtualTextureInfo::GetPageSize() const
 {
 	return m_tileSize + 2 * m_borderSize;
@@ -65,7 +66,6 @@ int VirtualTextureInfo::GetPageTableSize() const
 	return m_virtualTextureSize / m_tileSize;
 }
 
-// StagingPool
 StagingPool::StagingPool(int _width, int _height, int _count, bool _readBack)
 	: m_stagingTextureIndex(0)
 	, m_width(_width)
@@ -107,7 +107,6 @@ void StagingPool::next()
 	m_stagingTextureIndex = (m_stagingTextureIndex + 1) % (int)m_stagingTextures.size();
 }
 
-// PageIndexer
 PageIndexer::PageIndexer(VirtualTextureInfo* _info)
 	: m_info(_info)
 {
@@ -121,6 +120,7 @@ PageIndexer::PageIndexer(VirtualTextureInfo* _info)
 
 	m_offsets.resize(m_mipcount);
 	m_count = 0;
+
 	for (int i = 0; i < m_mipcount; ++i)
 	{
 		m_offsets[i] = m_count;
@@ -129,6 +129,7 @@ PageIndexer::PageIndexer(VirtualTextureInfo* _info)
 
 	// Calculate reverse mapping
 	m_reverse.resize(m_count);
+
 	for (int i = 0; i < m_mipcount; ++i)
 	{
 		int size = m_sizes[i];
@@ -163,7 +164,7 @@ bool PageIndexer::isValid(Page page)
 		return false;
 	}
 
-	else if (page.m_mip >= m_mipcount)
+	if (page.m_mip >= m_mipcount)
 	{
 		return false;
 	}
@@ -172,7 +173,8 @@ bool PageIndexer::isValid(Page page)
 	{
 		return false;
 	}
-	else if (page.m_x >= m_sizes[page.m_mip])
+
+	if (page.m_x >= m_sizes[page.m_mip])
 	{
 		return false;
 	}
@@ -181,7 +183,8 @@ bool PageIndexer::isValid(Page page)
 	{
 		return false;
 	}
-	else if (page.m_y >= m_sizes[page.m_mip])
+
+	if (page.m_y >= m_sizes[page.m_mip])
 	{
 		return false;
 	}
@@ -194,11 +197,11 @@ int PageIndexer::getCount() const
 	return m_count;
 }
 
-int PageIndexer::getMipCount() const {
+int PageIndexer::getMipCount() const
+{
 	return m_mipcount;
 }
 
-// SimpleImage
 SimpleImage::SimpleImage(int _width, int _height, int _channelCount, uint8_t _clearValue)
 	: m_width(_width)
 	, m_height(_height)
@@ -277,7 +280,6 @@ void SimpleImage::mipmap(uint8_t* source, int size, int channels, uint8_t* dest)
 	}
 }
 
-// Quadtree
 Quadtree::Quadtree(Rect _rect, int _level)
 	: m_rectangle(_rect)
 	, m_level(_level)
@@ -352,7 +354,6 @@ void Quadtree::write(SimpleImage& image, int miplevel)
 	write(this, image, miplevel);
 }
 
-// Static Functions
 Rect Quadtree::getRectangle(int index)
 {
 	int x = m_rectangle.m_x;
@@ -362,16 +363,14 @@ Rect Quadtree::getRectangle(int index)
 
 	switch (index)
 	{
-	case 0:
-	return { x, y, w, h };
-	case 1:
-	return { x + w, y, w, h };
-	case 2:
-	return { x + w, y + h, w, h };
-	case 3:
-	return { x, y + h, w, h };
+	case 0: return { x    , y    , w, h };
+	case 1: return { x + w, y    , w, h };
+	case 2: return { x + w, y + h, w, h };
+	case 3: return { x    , y + h, w, h };
+	default: break;
 	}
-	return { 0,0,0,0 };
+
+	return { 0, 0, 0, 0 };
 }
 
 void Quadtree::write(Quadtree* node, SimpleImage& image, int miplevel)
@@ -462,10 +461,12 @@ PageTable::~PageTable()
 {
 	BX_DELETE(VirtualTexture::getAllocator(), m_quadtree);
 	bgfx::destroy(m_texture);
+
 	for (int i = 0; i < (int)m_images.size(); ++i)
 	{
 		BX_DELETE(VirtualTexture::getAllocator(), m_images[i]);
 	}
+
 	for (int i = 0; i < (int)m_stagingTextures.size(); ++i)
 	{
 		bgfx::destroy(m_stagingTextures[i]);
@@ -478,8 +479,10 @@ void PageTable::update(bgfx::ViewId blitViewId)
 	{
 		return;
 	}
+
 	m_quadtreeDirty = false;
 	auto PageTableSizeLog2 = m_indexer->getMipCount();
+
 	for (int i = 0; i < PageTableSizeLog2; ++i)
 	{
 		m_quadtree->write(*m_images[i], i);
@@ -517,6 +520,7 @@ void PageLoader::loadPage(ReadState& state)
 {
 	int size = m_info->GetPageSize() * m_info->GetPageSize() * s_channelCount;
 	state.m_data.resize(size);
+
 	if (m_colorMipLevels)
 	{
 		copyColor(&state.m_data[0], state.m_page);
@@ -525,6 +529,7 @@ void PageLoader::loadPage(ReadState& state)
 	{
 		m_tileDataFile->readPage(m_indexer->getIndexFromPage(state.m_page), &state.m_data[0]);
 	}
+
 	if (m_showBorders)
 	{
 		copyBorder(&state.m_data[0]);
@@ -561,18 +566,18 @@ void PageLoader::copyColor(uint8_t* image, Page request)
 {
 	static const Color colors[] =
 	{
-		{0, 0, 255, 255},
-		{0, 255, 255, 255},
-		{255, 0, 0, 255},
-		{255, 0, 255, 255},
-		{255, 255, 0, 255},
-		{64, 64, 192, 255},
-		{64, 192, 64, 255},
-		{64, 192, 192, 255},
-		{192, 64, 64, 255},
-		{192, 64, 192, 255},
-		{192, 192, 64, 255},
-		{0, 255, 0, 255}
+		{   0,   0, 255, 255 },
+		{   0, 255, 255, 255 },
+		{ 255,   0,   0, 255 },
+		{ 255,   0, 255, 255 },
+		{ 255, 255,   0, 255 },
+		{  64,  64, 192, 255 },
+		{  64, 192,  64, 255 },
+		{  64, 192, 192, 255 },
+		{ 192,  64,  64, 255 },
+		{ 192,  64, 192, 255 },
+		{ 192, 192,  64, 255 },
+		{   0, 255,   0, 255 },
 	};
 
 	int pagesize = m_info->GetPageSize();
@@ -700,7 +705,15 @@ TextureAtlas::TextureAtlas(VirtualTextureInfo* _info, int _count, int _uploadspe
 	// Create atlas texture
 	int pagesize = m_info->GetPageSize();
 	int size = _count * pagesize;
-	m_texture = bgfx::createTexture2D((uint16_t)size, (uint16_t)size, false, 1, bgfx::TextureFormat::BGRA8, BGFX_SAMPLER_UVW_CLAMP);
+
+	m_texture = bgfx::createTexture2D(
+		  (uint16_t)size
+		, (uint16_t)size
+		, false
+		, 1
+		, bgfx::TextureFormat::BGRA8
+		, BGFX_SAMPLER_UVW_CLAMP
+		);
 }
 
 TextureAtlas::~TextureAtlas()
@@ -721,7 +734,16 @@ void TextureAtlas::uploadPage(Point pt, uint8_t* data, bgfx::ViewId blitViewId)
 
 	// Update texture with new atlas data
 	auto   pagesize = uint16_t(m_info->GetPageSize());
-	bgfx::updateTexture2D(writer, 0, 0, 0, 0, pagesize, pagesize, bgfx::copy(data, pagesize * pagesize * s_channelCount));
+	bgfx::updateTexture2D(
+		  writer
+		, 0
+		, 0
+		, 0
+		, 0
+		, pagesize
+		, pagesize
+		, bgfx::copy(data, pagesize * pagesize * s_channelCount)
+		);
 
 	// Copy the texture part to the actual atlas texture
 	auto xpos = uint16_t(pt.m_x * pagesize);
@@ -744,16 +766,19 @@ FeedbackBuffer::FeedbackBuffer(VirtualTextureInfo* _info, int _width, int _heigh
 	// Setup classes
 	m_indexer = BX_NEW(VirtualTexture::getAllocator(), PageIndexer)(m_info);
 	m_requests.resize(m_indexer->getCount());
+
 	// Initialize and clear buffers
 	m_downloadBuffer.resize(m_width * m_height * s_channelCount);
 	bx::memSet(&m_downloadBuffer[0], 0, m_width * m_height * s_channelCount);
 	clear();
+
 	// Initialize feedback frame buffer
 	bgfx::TextureHandle feedbackFrameBufferTextures[] =
 	{
 		bgfx::createTexture2D(uint16_t(m_width), uint16_t(m_height), false, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_RT),
 		bgfx::createTexture2D(uint16_t(m_width), uint16_t(m_height), false, 1, bgfx::TextureFormat::D24S8, BGFX_TEXTURE_RT),
 	};
+
 	m_feedbackFrameBuffer = bgfx::createFrameBuffer(BX_COUNTOF(feedbackFrameBufferTextures), feedbackFrameBufferTextures, true);
 	m_lastStagingTexture = { bgfx::kInvalidHandle };
 }
@@ -785,12 +810,14 @@ void FeedbackBuffer::download()
 	{
 		return;
 	}
+
 	// Read the texture
 	bgfx::readTexture(m_lastStagingTexture, &m_downloadBuffer[0]);
 	// Loop through pixels and check if anything was written
 	auto data = &m_downloadBuffer[0];
 	auto colors = (Color*)data;
 	auto dataSize = m_width * m_height;
+
 	for (int i = 0; i < dataSize; ++i)
 	{
 		auto& color = colors[i];
@@ -903,7 +930,6 @@ void VirtualTexture::setMipBias(int value)
 
 void VirtualTexture::setUniforms()
 {
-	// Set uniforms
 	struct
 	{
 		struct
@@ -913,6 +939,7 @@ void VirtualTexture::setUniforms()
 			float BorderScale;
 			float BorderOffset;
 		} m_settings_1;
+
 		struct
 		{
 			float MipBias;
@@ -920,8 +947,9 @@ void VirtualTexture::setUniforms()
 			float unused1;
 			float unused2;
 		} m_settings_2;
+
 	} uniforms;
-	// Fill uniforms
+
 	int pagesize = m_info->GetPageSize();
 	uniforms.m_settings_1.VirtualTextureSize = (float)m_info->m_virtualTextureSize;
 	uniforms.m_settings_1.ooAtlasScale = 1.0f / (float)m_atlasCount;
@@ -930,10 +958,10 @@ void VirtualTexture::setUniforms()
 	uniforms.m_settings_2.MipBias = (float)m_mipBias;
 	uniforms.m_settings_2.PageTableSize = (float)m_info->GetPageTableSize();
 	uniforms.m_settings_2.unused1 = uniforms.m_settings_2.unused2 = 0.0f;
-	// Set uniforms
+
 	bgfx::setUniform(u_vt_settings_1, &uniforms.m_settings_1);
 	bgfx::setUniform(u_vt_settings_2, &uniforms.m_settings_2);
-	// Set textures
+
 	bgfx::setTexture(0, s_vt_page_table, m_pageTable->getTexture());
 	bgfx::setTexture(1, s_vt_texture_atlas, m_atlas->getTexture());
 }
@@ -956,6 +984,7 @@ void VirtualTexture::enableShowBoarders(bool enable)
 	{
 		return;
 	}
+
 	m_loader->m_showBorders = enable;
 	clear();
 }
@@ -971,6 +1000,7 @@ void VirtualTexture::enableColorMipLevels(bool enable)
 	{
 		return;
 	}
+
 	m_loader->m_colorMipLevels = enable;
 	clear();
 }
@@ -1232,6 +1262,7 @@ bool TileGenerator::generate(const bx::FilePath& _filePath)
 			}
 		}
 	}
+
 	bx::debugPrintf("Finising\n");
 	// Write header
 	m_tileDataFile->writeInfo();

+ 2 - 0
examples/40-svt/vt.h

@@ -24,6 +24,8 @@
 #include "common.h"
 #include "bgfx_utils.h"
 
+#include <stdio.h> // FILE
+
 namespace vt
 {