Better documentation.

This commit is contained in:
Nev3r 2020-11-14 20:50:34 +01:00
parent cc98be4d23
commit 3a8b2a6fb7
2 changed files with 18 additions and 4 deletions

View file

@ -15,10 +15,15 @@
#include "z_zone.h" #include "z_zone.h"
#include "r_data.h" #include "r_data.h"
// Taggroups are used to list elements of the same tag, for iteration.
// Since elements can now have multiple tags, it means an element may appear
// in several taggroups at the same time. These are built on level load.
taggroup_t* tags_sectors[MAXTAGS + 1]; taggroup_t* tags_sectors[MAXTAGS + 1];
taggroup_t* tags_lines[MAXTAGS + 1]; taggroup_t* tags_lines[MAXTAGS + 1];
taggroup_t* tags_mapthings[MAXTAGS + 1]; taggroup_t* tags_mapthings[MAXTAGS + 1];
/// Adds a tag to a given element's taglist.
/// \warning This does not rebuild the global taggroups, which are used for iteration.
void Tag_Add (taglist_t* list, const mtag_t tag) void Tag_Add (taglist_t* list, const mtag_t tag)
{ {
list->tags = Z_Realloc(list->tags, (list->count + 1) * sizeof(list->tags), PU_LEVEL, NULL); list->tags = Z_Realloc(list->tags, (list->count + 1) * sizeof(list->tags), PU_LEVEL, NULL);
@ -26,6 +31,7 @@ void Tag_Add (taglist_t* list, const mtag_t tag)
} }
/// Sets the first tag entry in a taglist. /// Sets the first tag entry in a taglist.
/// Replicates the old way of accessing element->tag.
void Tag_FSet (taglist_t* list, const mtag_t tag) void Tag_FSet (taglist_t* list, const mtag_t tag)
{ {
if (!list->count) if (!list->count)
@ -38,6 +44,7 @@ void Tag_FSet (taglist_t* list, const mtag_t tag)
} }
/// Gets the first tag entry in a taglist. /// Gets the first tag entry in a taglist.
/// Replicates the old way of accessing element->tag.
mtag_t Tag_FGet (const taglist_t* list) mtag_t Tag_FGet (const taglist_t* list)
{ {
if (list->count) if (list->count)
@ -46,6 +53,7 @@ mtag_t Tag_FGet (const taglist_t* list)
return 0; return 0;
} }
/// Returns true if the given tag exist inside the list.
boolean Tag_Find (const taglist_t* list, const mtag_t tag) boolean Tag_Find (const taglist_t* list, const mtag_t tag)
{ {
size_t i; size_t i;
@ -56,6 +64,7 @@ boolean Tag_Find (const taglist_t* list, const mtag_t tag)
return false; return false;
} }
/// Returns true if at least one tag is shared between two given lists.
boolean Tag_Share (const taglist_t* list1, const taglist_t* list2) boolean Tag_Share (const taglist_t* list1, const taglist_t* list2)
{ {
size_t i; size_t i;
@ -66,6 +75,7 @@ boolean Tag_Share (const taglist_t* list1, const taglist_t* list2)
return false; return false;
} }
/// Returns true if both lists are identical.
boolean Tag_Compare (const taglist_t* list1, const taglist_t* list2) boolean Tag_Compare (const taglist_t* list1, const taglist_t* list2)
{ {
size_t i; size_t i;
@ -80,7 +90,7 @@ boolean Tag_Compare (const taglist_t* list1, const taglist_t* list2)
return true; return true;
} }
/// Search for an element inside a global taggroup.
size_t Taggroup_Find (const taggroup_t *group, const size_t id) size_t Taggroup_Find (const taggroup_t *group, const size_t id)
{ {
size_t i; size_t i;
@ -95,6 +105,7 @@ size_t Taggroup_Find (const taggroup_t *group, const size_t id)
return -1; return -1;
} }
/// Add an element to a global taggroup.
void Taggroup_Add (taggroup_t *garray[], const mtag_t tag, size_t id) void Taggroup_Add (taggroup_t *garray[], const mtag_t tag, size_t id)
{ {
taggroup_t *group; taggroup_t *group;
@ -135,6 +146,7 @@ void Taggroup_Add (taggroup_t *garray[], const mtag_t tag, size_t id)
group->elements[i] = id; group->elements[i] = id;
} }
/// Remove an element from a global taggroup.
void Taggroup_Remove (taggroup_t *garray[], const mtag_t tag, size_t id) void Taggroup_Remove (taggroup_t *garray[], const mtag_t tag, size_t id)
{ {
taggroup_t *group; taggroup_t *group;
@ -191,6 +203,8 @@ static void Taglist_AddToMapthings (const mtag_t tag, const size_t itemid)
Taggroup_Add(tags_mapthings, tag, itemid); Taggroup_Add(tags_mapthings, tag, itemid);
} }
/// After all taglists have been built for each element (sectors, lines, things),
/// the global taggroups, made for iteration, are built here.
void Taglist_InitGlobalTables(void) void Taglist_InitGlobalTables(void)
{ {
size_t i, j; size_t i, j;
@ -338,6 +352,7 @@ INT32 P_FindSpecialLineFromTag(INT16 special, INT16 tag, INT32 start)
// Ingame list manipulation. // Ingame list manipulation.
/// Changes the first tag for a given sector, and updates the global taggroups.
void Tag_SectorFSet (const size_t id, const mtag_t tag) void Tag_SectorFSet (const size_t id, const mtag_t tag)
{ {
sector_t* sec = &sectors[id]; sector_t* sec = &sectors[id];

View file

@ -20,7 +20,7 @@ typedef INT16 mtag_t;
#define MAXTAGS UINT16_MAX #define MAXTAGS UINT16_MAX
#define MTAG_GLOBAL -1 #define MTAG_GLOBAL -1
/// Multitag list. /// Multitag list. Each taggable element will have its own taglist.
typedef struct typedef struct
{ {
mtag_t* tags; mtag_t* tags;
@ -28,16 +28,15 @@ typedef struct
} taglist_t; } taglist_t;
void Tag_Add (taglist_t* list, const mtag_t tag); void Tag_Add (taglist_t* list, const mtag_t tag);
void Tag_FSet (taglist_t* list, const mtag_t tag); void Tag_FSet (taglist_t* list, const mtag_t tag);
mtag_t Tag_FGet (const taglist_t* list); mtag_t Tag_FGet (const taglist_t* list);
boolean Tag_Find (const taglist_t* list, const mtag_t tag); boolean Tag_Find (const taglist_t* list, const mtag_t tag);
boolean Tag_Share (const taglist_t* list1, const taglist_t* list2); boolean Tag_Share (const taglist_t* list1, const taglist_t* list2);
boolean Tag_Compare (const taglist_t* list1, const taglist_t* list2); boolean Tag_Compare (const taglist_t* list1, const taglist_t* list2);
void Tag_SectorFSet (const size_t id, const mtag_t tag); void Tag_SectorFSet (const size_t id, const mtag_t tag);
/// Taggroup list. It is essentially just an element id list.
typedef struct typedef struct
{ {
size_t *elements; size_t *elements;