| 17 | SIZE_ASSERT( FrameHeader, 6 ); |
| 18 | |
| 19 | void LoadObjSprite( const Vfs::FileContent& obj_file, ObjSprite& out_sprite ) |
| 20 | { |
| 21 | unsigned short frame_count; |
| 22 | std::memcpy( &frame_count, obj_file.data(), sizeof(frame_count) ); |
| 23 | |
| 24 | unsigned int max_size[2]= { 0u, 0u }; |
| 25 | |
| 26 | // Calculate max size |
| 27 | { |
| 28 | const unsigned char* ptr= obj_file.data() + sizeof(frame_count); |
| 29 | for( unsigned int f= 0u; f < frame_count; f++ ) |
| 30 | { |
| 31 | const FrameHeader* const header= reinterpret_cast<const FrameHeader*>(ptr); |
| 32 | max_size[0]= std::max( max_size[0], std::max( (unsigned int) header->size[0], (unsigned int) header->x_center * 2u ) ); |
| 33 | max_size[1]= std::max( max_size[1], (unsigned int) header->size[1] ); |
| 34 | ptr+= sizeof(FrameHeader) + header->size[0] * header->size[1]; |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | out_sprite.size[0]= max_size[0]; |
| 39 | out_sprite.size[1]= max_size[1]; |
| 40 | out_sprite.frame_count= frame_count; |
| 41 | out_sprite.data.resize( out_sprite.size[0] * out_sprite.size[1] * out_sprite.frame_count, 255u ); |
| 42 | |
| 43 | const unsigned char* ptr= obj_file.data() + sizeof(frame_count); |
| 44 | for( unsigned int f= 0u; f < frame_count; f++ ) |
| 45 | { |
| 46 | const FrameHeader* const header= reinterpret_cast<const FrameHeader*>(ptr); |
| 47 | |
| 48 | // Shift this frame to center |
| 49 | const unsigned int x_offset= out_sprite.size[0] / 2u - header->x_center; |
| 50 | const unsigned int y_offset= 0u; |
| 51 | PC_ASSERT( out_sprite.size[0] / 2u >= header->x_center ); |
| 52 | PC_ASSERT( x_offset + header->size[0] <= out_sprite.size[0] ); |
| 53 | PC_ASSERT( y_offset + header->size[1] <= out_sprite.size[1] ); |
| 54 | |
| 55 | const unsigned char* const src= ptr + sizeof(FrameHeader); |
| 56 | unsigned char* const dst= out_sprite.data.data() + out_sprite.size[0] * out_sprite.size[1] * f; |
| 57 | |
| 58 | // Copy and flip |
| 59 | for( unsigned int y= 0u; y < header->size[1]; y++ ) |
| 60 | for( unsigned int x= 0u; x < header->size[0]; x++ ) |
| 61 | dst[ x_offset + x + ( y + y_offset ) * out_sprite.size[0] ]= |
| 62 | src[ ( header->size[1] - 1u - y ) + x * header->size[1] ]; |
| 63 | |
| 64 | ptr+= sizeof(FrameHeader) + header->size[0] * header->size[1]; |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | } // namespace PanzerChasm |
no outgoing calls
no test coverage detected