Explorar el Código

Fixed BC7 decoding.

Branimir Karadžić hace 7 años
padre
commit
518cbe9709
Se han modificado 1 ficheros con 46 adiciones y 8 borrados
  1. 46 8
      src/image.cpp

+ 46 - 8
src/image.cpp

@@ -986,6 +986,13 @@ namespace bimg
 				imageDecodeToBgra8(_dst, _src, _width, _height, _width*4, _srcFormat);
 				return true;
 
+			case TextureFormat::RGBA32F:
+				{
+					bx::DefaultAllocator allocator;
+					imageDecodeToRgba32f(&allocator, _dst, _src, _width, _height, 1, _width*16, _srcFormat);
+				}
+				return true;
+
 			default:
 				break;
 			}
@@ -1485,7 +1492,10 @@ namespace bimg
 		{
 			const uint16_t pos   = m_bitPos / 8;
 			const uint16_t shift = m_bitPos & 7;
-			const uint16_t data  = *( (uint16_t*)&m_data[pos]);
+			const uint16_t data  = 15 > pos
+				? *( (uint16_t*)&m_data[pos])
+				:       uint16_t(m_data[pos])
+				;
 			m_bitPos += _numBits;
 			return uint8_t( (data >> shift) & ( (1 << _numBits)-1) );
 		}
@@ -1495,7 +1505,10 @@ namespace bimg
 			const uint16_t bitPos = m_bitPos + _offset;
 			const uint16_t pos    = bitPos / 8;
 			const uint16_t shift  = bitPos & 7;
-			const uint16_t data   = *( (uint16_t*)&m_data[pos]);
+			const uint16_t data   = 15 > pos
+				? *( (uint16_t*)&m_data[pos])
+				:       uint16_t(m_data[pos])
+				;
 			return uint8_t( (data >> shift) & ( (1 << _numBits)-1) );
 		}
 
@@ -1574,7 +1587,7 @@ namespace bimg
 			for (uint8_t ii = 0; ii < mi.numSubsets; ++ii)
 			{
 				const uint8_t pda = bit.read(modePBits);
-				const uint8_t pdb = 0 != mi.sharedPBits ? bit.read(modePBits) : pda;
+				const uint8_t pdb = 0 == mi.sharedPBits ? bit.read(modePBits) : pda;
 
 				epR[ii*2+0] |= pda;
 				epR[ii*2+1] |= pdb;
@@ -1614,8 +1627,8 @@ namespace bimg
 
 		const uint8_t* factors[] =
 		{
-			s_bptcFactors[mi.indexBits[0]-2],
-			hasIndexBits1 ? s_bptcFactors[mi.indexBits[1]-2] : s_bptcFactors[0],
+			                s_bptcFactors[mi.indexBits[0]-2],
+			hasIndexBits1 ? s_bptcFactors[mi.indexBits[1]-2] : factors[0],
 		};
 
 		uint16_t offset[2] =
@@ -1651,13 +1664,13 @@ namespace bimg
 				const uint8_t anchor = idx == indexAnchor;
 				const uint8_t num[2] =
 				{
-					uint8_t(mi.indexBits[0] - anchor),
+					uint8_t(                mi.indexBits[0] - anchor    ),
 					uint8_t(hasIndexBits1 ? mi.indexBits[1] - anchor : 0),
 				};
 
 				const uint8_t index[2] =
 				{
-					bit.peek(offset[0], num[0]),
+					                bit.peek(offset[0], num[0]),
 					hasIndexBits1 ? bit.peek(offset[1], num[1]) : index[0],
 				};
 
@@ -1686,7 +1699,7 @@ namespace bimg
 				default:                  break;
 				};
 
-				uint8_t* bgra = &_dst[(yy*4+xx)*4];
+				uint8_t* bgra = &_dst[idx*4];
 				bgra[0] = bb;
 				bgra[1] = gg;
 				bgra[2] = rr;
@@ -3756,6 +3769,31 @@ namespace bimg
 				}
 				break;
 
+			case TextureFormat::BC6H:
+				{
+					uint32_t width  = _width/4;
+					uint32_t height = _height/4;
+
+					const uint8_t* srcData = src;
+
+					for (uint32_t yy = 0; yy < height; ++yy)
+					{
+						for (uint32_t xx = 0; xx < width; ++xx)
+						{
+							float tmp[16*4];
+							decodeBlockBc6(tmp, srcData);
+							srcData += 16;
+
+							uint8_t* block = (uint8_t*)&dst[yy*_dstPitch*4 + xx*64];
+							bx::memCopy(&block[0*_dstPitch], &tmp[ 0], 64);
+							bx::memCopy(&block[1*_dstPitch], &tmp[16], 64);
+							bx::memCopy(&block[2*_dstPitch], &tmp[32], 64);
+							bx::memCopy(&block[3*_dstPitch], &tmp[48], 64);
+						}
+					}
+				}
+				break;
+
 			case TextureFormat::RGBA32F:
 				bx::memCopy(dst, src, _dstPitch*_height);
 				break;