power_play/src/base/base_resource.c

93 lines
2.4 KiB
C

////////////////////////////////////////////////////////////
//~ Bootstrap
void BootstrapResources(u64 archive_strings_count, String *archive_strings)
{
Arena *perm = PermArena();
for (u64 archive_string_index = 0; archive_string_index < archive_strings_count; ++archive_string_index)
{
String archive = archive_strings[archive_string_index];
if (archive.len > 0)
{
BB_Buff bb = BB_BuffFromString(archive);
BB_Reader br = BB_ReaderFromBuff(&bb);
u64 magic = BB_ReadUBits(&br, 64);
Assert(magic == ResourceEmbeddedMagic);
// Create & insert entries
u64 num_entries = BB_ReadUBits(&br, 64);
for (u64 i = 0; i < num_entries; ++i)
{
u64 name_start = BB_ReadUBits(&br, 64);
u64 name_len = BB_ReadUBits(&br, 64);
u64 data_start = BB_ReadUBits(&br, 64);
u64 data_len = BB_ReadUBits(&br, 64);
ResourceEntry *entry = PushStruct(perm, ResourceEntry);
entry->name = STRING(name_len, archive.text + name_start);
entry->data = STRING(data_len, archive.text + data_start);
entry->hash = HashFnv64(Fnv64Basis, entry->name);
ResourceEntryBin *bin = &Base.resource.bins[entry->hash % countof(Base.resource.bins)];
SllQueuePushN(bin->first, bin->last, entry, next_in_bin);
SllQueuePushN(Base.resource.first_entry, Base.resource.last_entry, entry, next);
}
Base.resource.entries_count += num_entries;
}
}
}
////////////////////////////////////////////////////////////
//~ Resource ops
b32 IsResourceNil(ResourceKey resource)
{
return resource.v == 0;
}
ResourceKey ResourceKeyFromStore(ResourceStore *store, String name)
{
ResourceKey result = Zi;
result.v = HashFnv64(store->v, name);
return result;
}
ResourceEntry *ResourceEntryFromHash(u64 hash)
{
ResourceEntry *result = 0;
ResourceEntryBin *bin = &Base.resource.bins[hash % countof(Base.resource.bins)];
for (ResourceEntry *e = bin->first; e; e = e->next_in_bin)
{
if (e->hash == hash)
{
result = e;
break;
}
}
return result;
}
String DataFromResource(ResourceKey resource)
{
String result = Zi;
ResourceEntry *entry = ResourceEntryFromHash(resource.v);
if (entry)
{
result = entry->data;
}
return result;
}
String NameFromResource(ResourceKey resource)
{
String result = Zi;
ResourceEntry *entry = ResourceEntryFromHash(resource.v);
if (entry)
{
result = entry->name;
}
return result;
}