Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
101b90_len_8f0.c File Reference

Go to the source code of this file.

Macros

#define ALIGN4(v)   (((u32)(v) >> 2) << 2)
 
#define SPR_SWIZZLE(base, offset)   ((void*)((s32)(offset) + (s32)(base)))
 

Functions

void spr_swizzle_anim_offsets (s32 arg0, s32 base, void *spriteData)
 
SpriteAnimDataspr_load_sprite (s32 idx, s32 isPlayerSprite, s32 useTailAlloc)
 
void spr_init_player_raster_cache (s32 cacheSize, s32 maxRasterSize)
 
IMG_PTR spr_get_player_raster (s32 rasterIndex, s32 playerSpriteID)
 
void spr_update_player_raster_cache (void)
 
void spr_load_npc_extra_anims (SpriteAnimData *header, u32 *extraAnimList)
 
SpriteComponent ** spr_allocate_components (s32 count)
 

Variables

b32 SpriteUseGeneralHeap
 
HeapNode heap_generalHead
 
HeapNode heap_spriteHead
 
BSS s32 spr_asset_entry [2]
 
BSS s32 PlayerRasterLoadDescBuffer [101]
 
BSS s32 PlayerRasterLoadDescNumLoaded
 
BSS s32 PlayerRasterLoadDescBeginSpriteIndex [SPR_Peach3]
 
BSS s32 PlayerRasterLoadDesc [0x2E0]
 
BSS PlayerRastersHeader PlayerRasterHeader
 
BSS s32 PlayerSpriteRasterSets [SPR_Peach3+1]
 
BSS s32 PlayerRasterCacheSize
 
BSS s32 PlayerRasterMaxSize
 
BSS s32 SpriteDataHeader [3]
 
BSS PlayerSpriteCacheEntry PlayerRasterCache [18]
 

Macro Definition Documentation

◆ ALIGN4

#define ALIGN4 ( v)    (((u32)(v) >> 2) << 2)

Definition at line 34 of file 101b90_len_8f0.c.

Referenced by spr_load_sprite(), and spr_swizzle_anim_offsets().

◆ SPR_SWIZZLE

#define SPR_SWIZZLE ( base,
offset )   ((void*)((s32)(offset) + (s32)(base)))

Definition at line 35 of file 101b90_len_8f0.c.

Referenced by spr_load_sprite(), and spr_swizzle_anim_offsets().

Function Documentation

◆ spr_swizzle_anim_offsets()

void spr_swizzle_anim_offsets ( s32 arg0,
s32 base,
void * spriteData )

Definition at line 37 of file 101b90_len_8f0.c.

37 {
38 SpriteAnimComponent*** animList;
41
42 // required to match, spriteData->animList would be nicer
43 animList = (SpriteAnimComponent***) spriteData;
44 animList += 4;
45
46 while (true) {
47 if (*animList == PTR_LIST_END) {
48 break;
49 }
50 compList = (SpriteAnimComponent**) ((s32)*animList - ALIGN4(base));
51 compList = SPR_SWIZZLE(ALIGN4(spriteData), compList);
52 *animList = compList;
53 while (true) {
54 if (*compList == PTR_LIST_END) {
55 break;
56 }
57 *compList = comp = SPR_SWIZZLE(ALIGN4(spriteData), (s32)*compList - ALIGN4(base));
58 comp->cmdList = SPR_SWIZZLE(ALIGN4(spriteData), (s32)comp->cmdList - ALIGN4(base));
59 compList++;
60 }
61 animList++;
62 }
63}
#define ALIGN4(v)
#define SPR_SWIZZLE(base, offset)
BSS s32 PopupMenu_SelectedIndex
#define PTR_LIST_END
Definition macros.h:41

Referenced by spr_load_sprite().

◆ spr_load_sprite()

SpriteAnimData * spr_load_sprite ( s32 idx,
s32 isPlayerSprite,
s32 useTailAlloc )

Definition at line 65 of file 101b90_len_8f0.c.

65 {
67 s32 base;
68 s32 i;
70 s32* ptr1;
71 IMG_PTR image;
72 s32 count;
73 s32** data;
74 s32** palettes;
75
76 if (isPlayerSprite) {
77 base = SpriteDataHeader[1];
78 } else {
79 base = SpriteDataHeader[2];
80 }
81
82 // read current and next sprite offsets, so we can find the difference
83 nuPiReadRom(base + idx * 4, &spr_asset_entry, sizeof(spr_asset_entry));
84
88
89 ptr1 = (s32*)data;
90 // skip 4 bytes: 'YAY0' signature
91 ptr1++;
92
93 if (useTailAlloc) {
95 } else {
97 }
98 ASSERT_MSG(animData, "out of sprite memory");
99 decode_yay0(data, animData);
100 general_heap_free(data);
101
102 // swizzle raster array
103 data = (s32**)animData->rastersOffset;
104 data = SPR_SWIZZLE(ALIGN4(animData), data);
105 animData->rastersOffset = (SpriteRasterCacheEntry**)data;
106
107 while (true) {
108 ptr1 = *data;
109 if (ptr1 == PTR_LIST_END) {
110 break;
111 }
112 // swizzle each raster cache entry
114 *data++ = ptr1;
115 image = ((SpriteRasterCacheEntry*)ptr1)->image;
116
117 if (!isPlayerSprite) {
118 // swizzle image pointer in the cache entry
119 image = SPR_SWIZZLE(ALIGN4(animData), image);
120 *ptr1 = (s32)image;
121 }
122 }
123
124 if (isPlayerSprite) {
127 // load a range of raster loading desciptors to a buffer and copy contents into PlayerRasterLoadDesc
130 for (i = 0; i < count; i++) {
132 }
133 }
134
135 // swizzle palettes array
136 palettes = SPR_SWIZZLE(ALIGN4(animData), animData->palettesOffset);
137 animData->palettesOffset = (PAL_PTR*)palettes;
138 while (true) {
139 ptr1 = *palettes;
140 if (ptr1 == PTR_LIST_END) {
141 break;
142 }
143 // swizzle each palette pointer
145 *palettes++ = ptr1;
146 }
147
149 return animData;
150}
BSS PlayerRastersHeader PlayerRasterHeader
BSS s32 spr_asset_entry[2]
BSS s32 SpriteDataHeader[3]
BSS s32 PlayerRasterLoadDescBuffer[101]
HeapNode heap_spriteHead
Definition heaps3.c:4
BSS s32 PlayerRasterLoadDesc[0x2E0]
BSS s32 PlayerSpriteRasterSets[SPR_Peach3+1]
BSS s32 PlayerRasterLoadDescNumLoaded
BSS s32 PlayerRasterLoadDescBeginSpriteIndex[SPR_Peach3]
void spr_swizzle_anim_offsets(s32 arg0, s32 base, void *spriteData)
#define PAL_PTR
#define IMG_PTR
#define general_heap_malloc
void * _heap_malloc(HeapNode *head, u32 size)
Definition 43F0.c:77
void * _heap_malloc_tail(HeapNode *head, u32 size)
Definition 43F0.c:151
s32 general_heap_free(void *data)
Definition heap.c:18
void decode_yay0(void *src, void *dst)
#define ASSERT_MSG(condition, msg, args...)
Definition macros.h:65
#define ALIGN8(val)
Definition macros.h:20
Sprite data header.
Definition sprite.h:78

Referenced by spr_load_npc_sprite(), and spr_load_player_sprite().

◆ spr_init_player_raster_cache()

void spr_init_player_raster_cache ( s32 cacheSize,
s32 maxRasterSize )

Definition at line 152 of file 101b90_len_8f0.c.

152 {
153 void* raster;
154 s32 i;
155
157 PlayerRasterCacheSize = cacheSize;
162 raster = _heap_malloc(&heap_spriteHead, maxRasterSize * cacheSize);
163
164 for (i = 0; i < ARRAY_COUNT(PlayerRasterCache); i++) {
165 PlayerRasterCache[i].raster = raster;
166 raster += PlayerRasterMaxSize;
170 }
171
174 }
178}
BSS s32 PlayerRasterCacheSize
BSS s32 PlayerRasterMaxSize
BSS PlayerSpriteCacheEntry PlayerRasterCache[18]
#define ARRAY_COUNT(arr)
Definition macros.h:39

Referenced by spr_init_sprites().

◆ spr_get_player_raster()

IMG_PTR spr_get_player_raster ( s32 rasterIndex,
s32 playerSpriteID )

Definition at line 180 of file 101b90_len_8f0.c.

180 {
183 s32 idx = -1;
184 s32 i;
185
186 for (i = 0; i < PlayerRasterCacheSize; i++) {
187 if (PlayerRasterCache[i].lazyDeleteTime != 0) {
188 if (PlayerRasterCache[i].rasterIndex == rasterIndex && PlayerRasterCache[i].spriteIndex == playerSpriteID) {
190 return PlayerRasterCache[i].raster;
191 }
192 } else if (idx == -1) {
193 idx = i;
194 }
195 }
196
197 if (idx == -1) {
198 return nullptr;
199 }
200
202 cacheEntry->rasterIndex = rasterIndex;
203 cacheEntry->spriteIndex = playerSpriteID;
204 cacheEntry->lazyDeleteTime = 2;
205
206 // each player raster load descriptor has image size (in bytes) and relative offset packed into one word
207 // upper three nibbles give size / 16, lower 5 give offset
209 nuPiReadRom(SpriteDataHeader[0] + (playerRasterInfo & 0xFFFFF), cacheEntry->raster, (playerRasterInfo >> 0x10) & 0xFFF0);
210 return cacheEntry->raster;
211}

Referenced by spr_draw_component(), and spr_get_player_raster_info().

◆ spr_update_player_raster_cache()

void spr_update_player_raster_cache ( void )

Definition at line 213 of file 101b90_len_8f0.c.

213 {
214 s32 i;
215
217
218 for (i = 0; i < PlayerRasterCacheSize; i++) {
219 if (PlayerRasterCache[i].lazyDeleteTime != 0) {
221 }
222 }
223}
void func_8013A4D0(void)
Definition imgfx.c:266

Referenced by spr_render_init().

◆ spr_load_npc_extra_anims()

void spr_load_npc_extra_anims ( SpriteAnimData * header,
u32 * extraAnimList )

Definition at line 225 of file 101b90_len_8f0.c.

225 {
226 u8* src;
227 s32 imgID;
228 s32 rasterSize;
230 u16 animCmd;
231 u16* cmdList;
233 u8* dataPos;
234 void* copyEnd;
237 void* writePos;
241 // one extra required for 'done' sentinel
242 s32 sawRaster[100 + 1];
243 s32 i;
244
245 for (i = 0; i < ARRAY_COUNT(sawRaster) - 1; i++) {
246 sawRaster[i] = false;
247 }
248
249 while ((extraAnimID = *extraAnimList++) != -1) {
250 compList = header->animListStart[extraAnimID & 0xFF];
251 while ((comp = *compList++) != PTR_LIST_END) {
252 cmdList = comp->cmdList;
253 remaining = (s16) comp->cmdListSize / 2;
254 while (remaining > 0) {
255 animCmd = *cmdList++;
256 remaining--;
257 switch (animCmd & 0xF000) {
258 case 0x1000:
259 i = animCmd; // required to match
260 imgID = i & 0xFF;
261 if (imgID < ARRAY_COUNT(sawRaster) - 1) {
262 sawRaster[imgID] = true;
263 }
264 break;
265 case 0x3000:
266 cmdList++;
267 remaining--;
268 // fallthrough
269 case 0x4000:
270 cmdList++;
271 remaining--;
272 // fallthrough
273 case 0x7000:
274 case 0x5000:
275 cmdList++;
276 remaining--;
277 // fallthrough
278 case 0x0000:
279 case 0x2000:
280 case 0x6000:
281 case 0x8000:
282 break;
283 }
284 }
285 }
286 }
287
288 rasterList = header->rastersOffset;
289 raster = *rasterList;
290 dataPos = raster->image;
291
292 for (i = 0; i < ARRAY_COUNT(sawRaster) - 1; i++) {
293 if ((raster = *rasterList) == PTR_LIST_END) {
294 break;
295 }
296 if (sawRaster[i]) {
297 src = raster->image;
298 rasterSize = (raster->width * raster->height) / 2;
299 copyEnd = &dataPos[rasterSize];
300 rasterSize += 8;
301 if (dataPos != src) {
302 raster->image = dataPos;
303 bcopy(src, dataPos, rasterSize);
304 }
306 dataPos += rasterSize;
307 }
308 rasterList++;
309 }
310 // sentinel value to mark end of valid data
311 sawRaster[i] = true;
312
314
315 // copy raster list
316 rasterList = header->rastersOffset;
317 header->rastersOffset = writePos;
318
319 for (i = 0; i < ARRAY_COUNT(sawRaster) - 1; i++) {
320 raster = *rasterList++;
321 if (sawRaster[i]) {
322 *(SpriteRasterCacheEntry**) writePos = raster;
323 } else {
325 }
326 writePos += 4;
327 if (raster == PTR_LIST_END) {
328 break;
329 }
330 }
331
332 // copy palette list
333 oldPalList = header->palettesOffset;
334 header->palettesOffset = writePos;
335
336 for (i = 0; i < ARRAY_COUNT(sawRaster) - 1; i++) {
337 raster = (SpriteRasterCacheEntry*)*oldPalList++; // required to match
338 *(u16**)writePos = (u16*)raster;
339 writePos += 4;
340 if (raster == PTR_LIST_END) {
341 break;
342 }
343 }
344
345 _heap_realloc(&heap_spriteHead, header, (s32)writePos - (s32)header);
346}
void * _heap_realloc(HeapNode *heapNodeList, void *addr, u32 newSize)
Definition 43F0.c:284
SpriteAnimComponent ** animListStart[VLA]
Definition sprite.h:83
SpriteRasterCacheEntry ** rastersOffset
Definition sprite.h:79
PAL_PTR * palettesOffset
Definition sprite.h:80

Referenced by spr_load_npc_sprite().

◆ spr_allocate_components()

SpriteComponent ** spr_allocate_components ( s32 count)

Definition at line 348 of file 101b90_len_8f0.c.

348 {
350 SpriteComponent** listStart;
354 s32 i;
355
356 // data will contain a -1 terminated list, followed by the SpriteComponents
357 // corresponding to that list
358 listSize = (count + 1) * 4;
359 totalSize = (count * sizeof(SpriteComponent)) + listSize;
360
363 listPos = listStart;
365 } else {
367 listPos = listStart;
369 }
370
371 component = (SpriteComponent*)((s32)(component) + (listSize / 4) * 4);
372
373 // fill list values
374 for (i = 0; i < count; i++) {
375 *listPos++ = component;
376 component++;
377 }
379
380 return listStart;
381}
HeapNode heap_generalHead
Definition heaps3.c:3
b32 SpriteUseGeneralHeap
Definition sprite.c:10

Referenced by spr_load_npc_sprite(), and spr_update_player_sprite().

Variable Documentation

◆ SpriteUseGeneralHeap

b32 SpriteUseGeneralHeap
extern

Definition at line 10 of file sprite.c.

Referenced by spr_allocate_components(), spr_free_sprite(), and spr_init_sprites().

◆ heap_generalHead

HeapNode heap_generalHead
extern

Definition at line 3 of file heaps3.c.

Referenced by spr_allocate_components().

◆ heap_spriteHead

HeapNode heap_spriteHead
extern

◆ spr_asset_entry

BSS s32 spr_asset_entry[2]

Definition at line 21 of file 101b90_len_8f0.c.

Referenced by spr_load_sprite().

◆ PlayerRasterLoadDescBuffer

BSS s32 PlayerRasterLoadDescBuffer[101]

Definition at line 22 of file 101b90_len_8f0.c.

Referenced by spr_load_sprite().

◆ PlayerRasterLoadDescNumLoaded

BSS s32 PlayerRasterLoadDescNumLoaded

Definition at line 23 of file 101b90_len_8f0.c.

Referenced by spr_init_player_raster_cache(), and spr_load_sprite().

◆ PlayerRasterLoadDescBeginSpriteIndex

BSS s32 PlayerRasterLoadDescBeginSpriteIndex[SPR_Peach3]

◆ PlayerRasterLoadDesc

BSS s32 PlayerRasterLoadDesc[0x2E0]

Definition at line 25 of file 101b90_len_8f0.c.

Referenced by spr_get_player_raster(), and spr_load_sprite().

◆ PlayerRasterHeader

BSS PlayerRastersHeader PlayerRasterHeader

Definition at line 27 of file 101b90_len_8f0.c.

Referenced by spr_init_player_raster_cache(), and spr_load_sprite().

◆ PlayerSpriteRasterSets

BSS s32 PlayerSpriteRasterSets[SPR_Peach3+1]

Definition at line 28 of file 101b90_len_8f0.c.

Referenced by spr_init_player_raster_cache(), and spr_load_sprite().

◆ PlayerRasterCacheSize

BSS s32 PlayerRasterCacheSize

◆ PlayerRasterMaxSize

BSS s32 PlayerRasterMaxSize

Definition at line 30 of file 101b90_len_8f0.c.

Referenced by spr_init_player_raster_cache().

◆ SpriteDataHeader

BSS s32 SpriteDataHeader[3]

◆ PlayerRasterCache