MCPcopy Create free account
hub / github.com/Panzerschrek/Chasm-Reverse / LoadObjSprite

Function LoadObjSprite

PanzerChasm/obj.cpp:19–66  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

17SIZE_ASSERT( FrameHeader, 6 );
18
19void 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

Callers 2

LoadEffectsSpritesFunction · 0.85
LoadBMPObjectsSpritesFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected