Files
Diddy-Kong-Racing/src/textures_sprites.h
T
Ryan MyersandGitHub 97aaf39e64 Cleanup, and documenting (#583)
* Some amount of documenting in printf.c

* Formatter, and do some mild cleanup and documentation in menu.c

* Fix gSaveMenuObjectIndices

* Use ObjectTransform in MenuAsset as it's what's being passed to cam_push_model_mtx

* Fix warnings and format

* Cleanup some objects.c code and it's usage of casting.

* Add Object to Object_64

* Much better score for func_8000B750

* Match func_8000B750

* Update score

* Do some naming

* Sorry one more better documenting!
2025-05-21 12:56:15 -04:00

179 lines
7.8 KiB
C

#ifndef _TEXTURES_SPRITES_H_
#define _TEXTURES_SPRITES_H_
#include "asset_enums.h"
#include "types.h"
#include "f3ddkr.h"
#include "structs.h"
#include "macros.h"
#include "memory.h"
#include <ultra64.h>
#define TEX_TABLE_2D 0
#define TEX_TABLE_3D 1
// Gets the texture type. E.g: rgba16
#define TEX_FORMAT(x) (x & 0xF)
// Gets the texture render mode type. E.g: transparent
#define TEX_RENDERMODE(x) ((x >> 4) & 0xF)
/**
* First two entries are combine mode.
* Third entry is othermode high word. (Most importantly, the cycle mode and texture filter settings)
* Fourth and fifth entries are render modes.
*/
#define DRAW_TABLE_ENTRY(combine1, combine2, cycleMode, renderMode1, renderMode2) { \
gsDPSetCombineLERP(combine1, combine2), \
gsDPSetOtherMode(cycleMode, DKR_OML_COMMON | renderMode1 | renderMode2), \
}
/**
* Diddy Kong Racing sets up many of the rendermode tables with a certain pattern.
* First two entries are combine mode.
* Third entry is othermode high word. (Most importantly, the cycle mode and texture filter settings)
* Fourth and fifth entries are render modes for no AA or ZB
* Sixth and seventh entries are render modes for for AA, but no ZB
* Eighth and ninth entries are render modes for for ZB, but no AA
* Tenth and eleventh entries are render modes for for AA and ZB
*/
#define DRAW_TABLE_GROUP(combine1, combine2, cycleMode, renderMode1, renderMode2, renderMode1AA, rendermode2AA, renderMode1ZB, rendermode2ZB, renderMode1ZBAA, renderMode2ZBAA) \
{gsDPSetCombineLERP(combine1, combine2), gsDPSetOtherMode(cycleMode, DKR_OML_COMMON | renderMode1 | renderMode2), }, \
{gsDPSetCombineLERP(combine1, combine2), gsDPSetOtherMode(cycleMode, DKR_OML_COMMON | renderMode1AA | rendermode2AA), }, \
{gsDPSetCombineLERP(combine1, combine2), gsDPSetOtherMode(cycleMode, DKR_OML_COMMON | renderMode1ZB | rendermode2ZB), }, \
{gsDPSetCombineLERP(combine1, combine2), gsDPSetOtherMode(cycleMode, DKR_OML_COMMON | renderMode1ZBAA | renderMode2ZBAA), }
enum RenderFlags {
RENDER_NONE,
RENDER_VEHICLE_PART = (1 << 0), // Shares a spot with RENDER_ANTI_ALIASING, since TEX_EDGE enforces anti aliasing unconditionally.
RENDER_ANTI_ALIASING = (1 << 0), // Smooths the edges to improve visual quality.
RENDER_Z_COMPARE = (1 << 1), // Compares depth values with existing geometry to prevent rendering errors.
RENDER_SEMI_TRANSPARENT = (1 << 2), // Renders with translucency enabled, blending with existing geometry.
RENDER_FOG_ACTIVE = (1 << 3), // Applies fog to the geometry.
RENDER_CUTOUT = (1 << 4), // A surface with 1 bit alpha cut out for quick transparency.
RENDER_COLOUR_INDEX = (1 << 5), // Enables palleted textures.
RENDER_CLAMP_X = (1 << 6), // Prevent texture repeating on the X axis.
RENDER_CLAMP_Y = (1 << 7), // Prevent texture repeating on the Y axis.
RENDER_Z_UPDATE = (1 << 8), // Updates the depth buffer when rendering.
RENDER_PRESERVE_COVERAGE = (1 << 9), // Coverage is used to help smooth the image. This won't write over existing coverage values.
RENDER_LINE_SWAP = (1 << 10), // Texture has swapped lines, for speed. Makes the load process slightly different.
RENDER_DECAL = (1 << 11), // Projects a surface on existing geometry, taking precedent to not zfight.
RENDER_UNK_0001000 = (1 << 12),
RENDER_UNK_0002000 = (1 << 13),
RENDER_UNK_0004000 = (1 << 14),
RENDER_UNK_0008000 = (1 << 15),
RENDER_UNK_0010000 = (1 << 16),
RENDER_UNK_0020000 = (1 << 17),
RENDER_UNK_0040000 = (1 << 18),
RENDER_UNK_0080000 = (1 << 19),
RENDER_UNK_0100000 = (1 << 20),
RENDER_UNK_0200000 = (1 << 21),
RENDER_UNK_0400000 = (1 << 22),
RENDER_UNK_0800000 = (1 << 23),
RENDER_UNK_1000000 = (1 << 24),
RENDER_UNK_2000000 = (1 << 25),
RENDER_UNK_4000000 = (1 << 26),
RENDER_VTX_ALPHA = (1 << 27), // Allows use of vertex alpha, disabling fog if necessary.
RENDER_ALL = 0xFFFFFFFF
};
typedef enum TextureRenderModes {
TRANSPARENT,
OPAQUE,
TRANSPARENT_2,
OPAQUE_2
} TextureRenderModes;
typedef enum TransFlags {
OBJ_FLAGS_NONE,
OBJ_FLAGS_UNK_0001 = (1 << 0),
OBJ_FLAGS_UNK_0002 = (1 << 1),
OBJ_FLAGS_UNK_0004 = (1 << 2),
OBJ_FLAGS_UNK_0008 = (1 << 3),
OBJ_FLAGS_UNK_0010 = (1 << 4),
OBJ_FLAGS_DESPAWN_TIME_TRIAL = (1 << 5), // Don't show up in time trial.
OBJ_FLAGS_DESPAWN_MULTIPLAYER = (1 << 6), // Don't show up in 3/4 player.
OBJ_FLAGS_UNK_0080 = (1 << 7),
OBJ_FLAGS_UNK_0100 = (1 << 8),
OBJ_FLAGS_INVIS_PLAYER1 = (1 << 9), // Player 1 cannot see this.
OBJ_FLAGS_INVIS_PLAYER2 = (1 << 10), // Player 2 cannot see this.
OBJ_FLAGS_UNK_0800 = (1 << 11),
OBJ_FLAGS_SHADOW_ONLY = (1 << 12), // Still has a shadow, but the model is invisible.
OBJ_FLAGS_UNK_2000 = (1 << 13),
OBJ_FLAGS_INVISIBLE = (1 << 14), // Invisible, and hidden shadow too.
OBJ_FLAGS_PARTICLE = (1 << 15) // Object is a particle.
} TransFlags;
typedef enum HeaderFlags {
HEADER_FLAGS_NONE,
HEADER_FLAGS_UNK_0001 = (1 << 0),
HEADER_FLAGS_UNK_0002 = (1 << 1),
HEADER_FLAGS_UNK_0004 = (1 << 2),
HEADER_FLAGS_UNK_0008 = (1 << 3),
HEADER_FLAGS_WATER_EFFECT = (1 << 4),
} HeaderFlags;
typedef enum BasicRenderIDs {
DRAW_BASIC_ZB_OFF,
DRAW_BASIC_1CYCLE,
DRAW_BASIC_2CYCLE,
DRAW_BASIC_IDS
} BasicRenderIDs;
typedef struct TextureCacheEntry {
s32 id;
TextureHeader *texture;
} TextureCacheEntry;
typedef struct SpriteCacheEntry {
s32 id;
Sprite *sprite;
} SpriteCacheEntry;
/* Size: 0x28 bytes */
typedef struct TempTexHeader {
/* 0x00 */ TextureHeader header;
/* 0x20 */ u32 uncompressedSize; // Little endian
/* 0x24 */ u8 gzipLevel; // Always 9.
/* 0x25 */ u8 pad25[3]; // padding
} TempTexHeader;
void tex_disable_modes(s32 flags);
void tex_enable_modes(s32 flags);
s32 tex_get_table_2D(void);
s32 tex_get_table_3D(void);
s32 sprite_table_size(void);
void set_texture_colour_tag(s32 tagID);
void rendermode_reset(Gfx **dList);
void tex_primcolour_on(void);
void tex_primcolour_off(void);
void material_set_no_tex_offset(Gfx **dList, TextureHeader *texhead, u32 flags);
void sprite_opaque(s32 setting);
s32 tex_palette_id(s16 paletteID);
void material_set(Gfx **dList, TextureHeader *texhead, s32 flags, s32 texOffset);
void sprite_free(Sprite *sprite);
void tex_free(TextureHeader *tex);
void material_load_simple(Gfx **dList, s32 flags);
// There might be a file boundary here.
void tex_animate_texture(TextureHeader *texture, u32 *triangleBatchInfoFlags, s32 *arg2, s32 updateRate);
void func_8007F1E8(LevelHeader_70 *arg0);
void init_pulsating_light_data(PulsatingLightData *data);
void update_pulsating_light_data(PulsatingLightData *data, s32 timeDelta);
TextureHeader *set_animated_texture_header(TextureHeader *texHead, s32 offset);
TextureHeader *load_texture(s32 arg0);
s32 tex_asset_size(s32 id);
s32 tex_cache_asset_id(s32 cacheID);
s32 load_sprite_info(s32 spriteIndex, s32 *numOfInstancesOut, s32 *unkOut, s32 *numFramesOut, s32 *formatOut,
s32 *sizeOut);
void gfx_init_basic_xlu(Gfx **dList, u32 index, u32 primitiveColor, u32 environmentColor);
void func_8007CA68(s32 arg0, s32 arg1, s32 *arg2, s32 *arg3, s32 *arg4);
Sprite *tex_load_sprite(s32 spriteID, s32 arg1);
void tex_init_textures(void);
void material_set_blinking_lights(Gfx **dList, TextureHeader *texture_list, u32 flags,
s32 texture_index);
void material_init(TextureHeader *tex, Gfx *_dList);
void func_8007CDC0(Sprite *sprite1, Sprite *sprite2, s32 arg2);
#endif