44#include "MT19937.h"
55#include "emitter.h"
66
7+ #define UNROLL_2 (x ) \
8+ x; \
9+ x;
10+
11+ #define UNROLL_3 (x ) \
12+ x; \
13+ x; \
14+ x;
15+
16+ #define UNROLL_4 (x ) \
17+ x; \
18+ x; \
19+ x; \
20+ x;
21+
22+ typedef struct {
23+ int animation_index ;
24+ int length ;
25+ } Fragment ;
26+
27+ typedef struct {
28+ uint32_t * pixels ;
29+ int width , rows , src_offset ;
30+ } BlitDestination ;
31+
32+ typedef struct {
33+ Fragment * fragments ;
34+ BlitDestination * destinations ;
35+ int used_f ;
36+ int alloc_f ;
37+ int dest_count ;
38+ } FragmentationMap ;
39+
740typedef struct DataBlock {
841 float_array positions_x ;
942 float_array positions_y ;
@@ -17,6 +50,7 @@ typedef struct DataBlock {
1750
1851 int num_frames ;
1952 PyObject * animation ;
53+ FragmentationMap frag_map ;
2054
2155 int blend_mode ;
2256 bool ended ;
@@ -25,26 +59,50 @@ typedef struct DataBlock {
2559 void (* updater )(struct DataBlock * , float );
2660} DataBlock ;
2761
28- void
29- UDB_no_acceleration (DataBlock * block , float dt );
62+ /* ====================| Public facing DataBlock functions |==================== */
63+ int
64+ init_data_block (DataBlock * block , Emitter * emitter , vec2 position );
3065
3166void
32- UDB_acceleration_x (DataBlock * block , float dt );
67+ dealloc_data_block (DataBlock * block );
3368
3469void
35- UDB_acceleration_y (DataBlock * block , float dt );
70+ choose_and_set_update_function (DataBlock * block , Emitter * emitter );
3671
3772void
38- UDB_all (DataBlock * block , float dt );
73+ update_data_block (DataBlock * block , float dt );
74+
75+ int
76+ draw_data_block (DataBlock * block , pgSurfaceObject * dest , const int blend_flag );
77+
78+ /* ====================| Internal DataBlock functions |==================== */
79+
80+ int
81+ init_fragmentation_map (DataBlock * block );
3982
4083void
41- update_indices_scalar ( DataBlock * block );
84+ dealloc_fragmentation_map ( FragmentationMap * frag_map );
4285
4386void
44- update_indices (DataBlock * block );
87+ calculate_surface_index_occurrences (DataBlock * block );
4588
4689int
47- init_data_block (DataBlock * block , Emitter * emitter , vec2 position );
90+ populate_destinations_array (pgSurfaceObject * dest , DataBlock * block );
91+
92+ int
93+ calculate_fragmentation_map (pgSurfaceObject * dest , DataBlock * block );
94+
95+ void
96+ blit_fragments_blitcopy (FragmentationMap * frag_map , pgSurfaceObject * dest ,
97+ DataBlock * block );
98+
99+ void
100+ blit_fragments_add (FragmentationMap * frag_map , pgSurfaceObject * dest ,
101+ DataBlock * block );
102+
103+ void
104+ blit_fragments (pgSurfaceObject * dest , FragmentationMap * frag_map , DataBlock * block ,
105+ int blend_flags );
48106
49107int
50108alloc_and_init_positions (DataBlock * block , Emitter * emitter , vec2 position );
62120alloc_and_init_animation_indices (DataBlock * block , Emitter * emitter );
63121
64122void
65- update_data_block (DataBlock * block , float dt );
123+ update_with_acceleration (DataBlock * block , float dt );
66124
67125void
68- choose_and_set_update_function (DataBlock * block , Emitter * emitter );
126+ update_with_no_acceleration (DataBlock * block , float dt );
69127
70- int
71- draw_data_block (DataBlock * block , pgSurfaceObject * dest , const int blend_flag );
128+ void
129+ update_with_acceleration_x (DataBlock * block , float dt );
130+
131+ void
132+ update_with_acceleration_y (DataBlock * block , float dt );
133+
134+ void
135+ update_indices_scalar (DataBlock * block );
136+
137+ void
138+ update_indices (DataBlock * block );
72139
73140void
74141recalculate_particle_count (DataBlock * block );
75142
76143void
77- dealloc_data_block (DataBlock * block );
144+ blit_fragments_add_scalar (FragmentationMap * frag_map , PyObject * * animation ,
145+ int dst_skip );
146+
147+ int FORCEINLINE
148+ RectEmpty (const SDL_Rect * r );
149+
150+ int FORCEINLINE
151+ IntersectRect (int Amin_x , int Amax_x , const int Bmin_x , const int Bmax_x , int Amin_y ,
152+ int Amax_y , const int Bmin_y , const int Bmax_y , SDL_Rect * result );
0 commit comments