mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-28 10:35:43 -05:00
Updated ib-compress.
This commit is contained in:
parent
7d81db60e1
commit
227d3f4df1
6 changed files with 58 additions and 13 deletions
42
3rdparty/ib-compress/indexbuffercompression.cpp
vendored
42
3rdparty/ib-compress/indexbuffercompression.cpp
vendored
|
@ -525,8 +525,8 @@ void CompressTriangleCodes1( const Ty* triangles,
|
|||
break;
|
||||
}
|
||||
|
||||
default: // IB_EDGE_NEW, IB_EDGE_CACHED, IB_EDGE_0_NEW, IB_EDGE_1_NEW
|
||||
break;
|
||||
default: // IB_EDGE_NEW, IB_EDGE_CACHED, IB_EDGE_0_NEW, IB_EDGE_1_NEW
|
||||
break;
|
||||
}
|
||||
|
||||
// populate the edge fifo with the 3 most recent edges
|
||||
|
@ -747,6 +747,25 @@ void CompressIndiceCodes1( const Ty* triangles,
|
|||
}
|
||||
}
|
||||
|
||||
// Detects if there are any degenerate triangles in a set of triangles, where there is 1 or more duplicate vertices.
|
||||
template <typename Ty>
|
||||
bool ContainsDegenerates( const Ty* triangles, uint32_t triangleCount )
|
||||
{
|
||||
const Ty* triangleEnd = triangles + ( triangleCount * 3 );
|
||||
bool result = false;
|
||||
|
||||
for ( const Ty* triangle = triangles; triangle < triangleEnd; triangle += 3 )
|
||||
{
|
||||
if ( triangle[ 0 ] == triangle[ 1 ] || triangle[ 0 ] == triangle[ 2 ] || triangle[ 1 ] == triangle[ 2 ] )
|
||||
{
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename Ty>
|
||||
void CompressIndexBuffer( const Ty* triangles,
|
||||
uint32_t triangleCount,
|
||||
|
@ -755,19 +774,34 @@ void CompressIndexBuffer( const Ty* triangles,
|
|||
IndexBufferCompressionFormat format,
|
||||
WriteBitstream& output )
|
||||
{
|
||||
output.WriteVInt( format );
|
||||
|
||||
switch ( format )
|
||||
{
|
||||
case IBCF_PER_INDICE_1:
|
||||
|
||||
output.WriteVInt( IBCF_PER_INDICE_1 );
|
||||
CompressIndiceCodes1<Ty>( triangles, triangleCount, vertexRemap, vertexCount, output );
|
||||
break;
|
||||
|
||||
case IBCF_PER_TRIANGLE_1:
|
||||
|
||||
output.WriteVInt( IBCF_PER_TRIANGLE_1 );
|
||||
CompressTriangleCodes1<Ty>( triangles, triangleCount, vertexRemap, vertexCount, output );
|
||||
break;
|
||||
|
||||
case ICBF_AUTO:
|
||||
|
||||
if ( ContainsDegenerates( triangles, triangleCount ) )
|
||||
{
|
||||
output.WriteVInt( IBCF_PER_INDICE_1 );
|
||||
CompressIndiceCodes1<Ty>( triangles, triangleCount, vertexRemap, vertexCount, output );
|
||||
}
|
||||
else
|
||||
{
|
||||
output.WriteVInt( IBCF_PER_TRIANGLE_1 );
|
||||
CompressTriangleCodes1<Ty>( triangles, triangleCount, vertexRemap, vertexCount, output );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -38,8 +38,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
// Parameters:
|
||||
// [in] triangles - A typical triangle list index buffer (3 indices to vertices per triangle). 16 bit indices.
|
||||
// [in] triangle count - The number of triangles to process.
|
||||
// [out] vertexRemap - This will be populated with re-mappings that map old vertices to new vertices,
|
||||
// where indexing with the old vertex index will get you the new one.
|
||||
// [out] vertexRemap - This will be populated with re-mappings that map old vertices to new vertex locations (a new ordering),
|
||||
// where indexing with the old vertex index will get you the new one. Vertices that are unused will
|
||||
// be mapped to 0xFFFFFFFF.
|
||||
// You should re-order the vertices and removed unused ones based on the vertex remap, instead of storing
|
||||
// the remap.
|
||||
// It should be allocated as a with at least vertexCount entries.
|
||||
// [in] vertexCount - The number of vertices in the mesh. This should be less than 0xFFFFFFFF/2^32 - 1.
|
||||
// [in] format - The compression format to use for encoding - note the format will be encoded with the compressed data so the decompressor can select the correct algorithm.
|
||||
|
|
|
@ -8,7 +8,11 @@ enum IndexBufferCompressionFormat
|
|||
IBCF_PER_INDICE_1 = 0,
|
||||
|
||||
// Per triangle encoding - better compression/speed, does not handle degenerates.
|
||||
IBCF_PER_TRIANGLE_1 = 1
|
||||
IBCF_PER_TRIANGLE_1 = 1,
|
||||
|
||||
// Automatically pick the best encoding dependent on whether degenerate triangles are detected in the mesh.
|
||||
// Will take longer to compress (due to the degenerate triangle check).
|
||||
ICBF_AUTO = 2
|
||||
};
|
||||
|
||||
#endif // -- INDEX_BUFFER_COMPRESSION_FORMAT_H__
|
|
@ -465,6 +465,8 @@ void DecompressIndexBuffer( Ty* triangles, uint32_t triangleCount, ReadBitstream
|
|||
DecompressTriangleCodes1<Ty>( triangles, triangleCount, input );
|
||||
break;
|
||||
|
||||
default: // ICBF_AUTO:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -649,6 +649,10 @@ https://github.com/memononen/SDF
|
|||
|
||||
http://nothings.org
|
||||
|
||||
### Vertex Cache Optimised Index Buffer Compression
|
||||
|
||||
https://github.com/ConorStokes/IndexBufferCompression
|
||||
|
||||
Assets
|
||||
------
|
||||
|
||||
|
|
|
@ -115,7 +115,6 @@ typedef std::vector<Primitive> PrimitiveArray;
|
|||
|
||||
static uint32_t s_obbSteps = 17;
|
||||
|
||||
#define BGFX_CHUNK_MAGIC_GEO BX_MAKEFOURCC('G', 'E', 'O', 0x0)
|
||||
#define BGFX_CHUNK_MAGIC_VB BX_MAKEFOURCC('V', 'B', ' ', 0x1)
|
||||
#define BGFX_CHUNK_MAGIC_IB BX_MAKEFOURCC('I', 'B', ' ', 0x0)
|
||||
#define BGFX_CHUNK_MAGIC_IBC BX_MAKEFOURCC('I', 'B', 'C', 0x0)
|
||||
|
@ -143,7 +142,7 @@ void triangleCompress(bx::WriterI* _writer, uint16_t* _indices, uint32_t _numInd
|
|||
uint32_t* vertexRemap = (uint32_t*)malloc(_numVertices*sizeof(uint32_t) );
|
||||
|
||||
WriteBitstream writer;
|
||||
CompressIndexBuffer(_indices, _numIndices/3, vertexRemap, _numVertices, IBCF_PER_TRIANGLE_1, writer);
|
||||
CompressIndexBuffer(_indices, _numIndices/3, vertexRemap, _numVertices, ICBF_AUTO, writer);
|
||||
writer.Finish();
|
||||
printf( "uncompressed: %10d, compressed: %10d, ratio: %0.2f%%\n"
|
||||
, _numIndices * 2
|
||||
|
@ -155,10 +154,9 @@ void triangleCompress(bx::WriterI* _writer, uint16_t* _indices, uint32_t _numInd
|
|||
uint8_t* outVertexData = (uint8_t*)malloc(_numVertices*_stride);
|
||||
for (uint32_t ii = 0; ii < _numVertices; ++ii)
|
||||
{
|
||||
if (UINT32_MAX != vertexRemap[ii])
|
||||
{
|
||||
memcpy(&outVertexData[vertexRemap[ii]*_stride], &_vertexData[ii*_stride], _stride);
|
||||
}
|
||||
uint32_t remap = vertexRemap[ii];
|
||||
remap = UINT32_MAX == remap ? ii : remap;
|
||||
memcpy(&outVertexData[remap*_stride], &_vertexData[ii*_stride], _stride);
|
||||
}
|
||||
memcpy(_vertexData, outVertexData, _numVertices*_stride);
|
||||
free(outVertexData);
|
||||
|
|
Loading…
Reference in a new issue