From 4cb7006de99f61e4bb1d43a70401de0fd1878166 Mon Sep 17 00:00:00 2001 From: jacob Date: Wed, 27 Aug 2025 04:25:44 -0500 Subject: [PATCH] res refactor progress --- build.bat | 4 +- src/base/base_string.c | 23 ++++++++ src/base/base_string.h | 1 + src/gpu/gpu.lay | 1 + src/meta/meta.c | 108 +++++++++++++++++++++++++++++++--- src/pp/pp.c | 26 ++++---- src/pp/pp.h | 5 ++ src/pp/pp.lay | 12 +--- src/pp/pp_ent.h | 2 +- src/pp/pp_step.c | 46 +++++++-------- src/{resource => res}/res.c | 7 ++- src/{resource => res}/res.h | 13 +++- src/{resource => res}/res.lay | 0 src/sprite/sprite.c | 28 ++------- src/sprite/sprite.h | 23 ++------ 15 files changed, 198 insertions(+), 101 deletions(-) rename src/{resource => res}/res.c (74%) rename src/{resource => res}/res.h (55%) rename src/{resource => res}/res.lay (100%) diff --git a/build.bat b/build.bat index 89106691..3363547e 100644 --- a/build.bat +++ b/build.bat @@ -11,7 +11,7 @@ set meta_rebuild_code=1317212284 ::- Meta build :meta_build if not exist meta.exe ( - echo [Meta build] + echo ====== Meta build ===== %meta_build_cmd% set "rc=!errorlevel!" if !rc! NEQ 0 ( @@ -20,7 +20,7 @@ if not exist meta.exe ( ) ::- Program build -echo [Build] +echo ======== Build ======== %program_build_cmd% set "rc=!errorlevel!" if !rc! NEQ 0 ( diff --git a/src/base/base_string.c b/src/base/base_string.c index 3737950e..320edd2e 100644 --- a/src/base/base_string.c +++ b/src/base/base_string.c @@ -467,6 +467,7 @@ String TrimLeft(String s, String pattern) while (StringStartsWith(result, pattern)) { result.text += pattern.len; + result.len -= pattern.len; } return result; } @@ -486,6 +487,28 @@ String Trim(String s, String pattern) return TrimLeft(TrimRight(s, pattern), pattern); } +String TrimWhitespace(String s) +{ + b32 stop = 0; + while (!stop) + { + if (StringStartsWith(s, Lit("\n")) || StringStartsWith(s, Lit("\r")) || StringStartsWith(s, Lit(" "))) + { + s.text += 1; + s.len -= 1; + } + else if (StringEndsWith(s, Lit("\n")) || StringEndsWith(s, Lit("\r")) || StringEndsWith(s, Lit(" "))) + { + s.len -= 1; + } + else + { + stop = 1; + } + } + return s; +} + //////////////////////////////// //~ Formatting diff --git a/src/base/base_string.h b/src/base/base_string.h index 433c17c8..57ef5b70 100644 --- a/src/base/base_string.h +++ b/src/base/base_string.h @@ -87,6 +87,7 @@ b32 StringEndsWith(String str, String substring); String TrimLeft(String s, String pattern); String TrimRight(String s, String pattern); String Trim(String s, String pattern); +String TrimWhitespace(String s); //////////////////////////////// //~ String list helpers diff --git a/src/gpu/gpu.lay b/src/gpu/gpu.lay index 3e96aa06..680600a7 100644 --- a/src/gpu/gpu.lay +++ b/src/gpu/gpu.lay @@ -2,6 +2,7 @@ //- Dependencies @Dep platform +@Dep res //- Api @IncludeC gpu.h diff --git a/src/meta/meta.c b/src/meta/meta.c index 6a9e7ed7..e4cffa01 100644 --- a/src/meta/meta.c +++ b/src/meta/meta.c @@ -244,6 +244,8 @@ Enum(L_ParseMode) L_ParseMode_ShaderPS, L_ParseMode_ShaderCS, L_ParseMode_Startup, + L_ParseMode_EmbedDir_StoreName, + L_ParseMode_EmbedDir_DirName, L_ParseMode_DefaultWindowsImpl, }; @@ -259,6 +261,7 @@ Struct(L_BlobItem) { L_BlobItem *next; String s; + String store_name; String token_file; i64 token_pos; }; @@ -283,6 +286,7 @@ Struct(L_Blob) L_BlobItemList pixel_shaders; L_BlobItemList compute_shaders; L_BlobItemList startup_functions; + L_BlobItemList embed_dirs; L_BlobItemList default_windows_impls; L_BlobItemList errors; @@ -329,9 +333,18 @@ L_ParseResult L_ParseBlobsFromPaths(Arena *arena, StringList paths) L_Blob *blob = PushStruct(arena, L_Blob); SllQueuePush(result.first_blob, result.last_blob, blob); blob->id = result.blobs_count++; - for (L_Token *token = tokens.first->next; !token->eof; token = token->next) + String store_name = Lit(""); + for (L_Token *token = tokens.first->next; token; token = token->next) { String s = token->s; + if (token->eof) + { + if (mode != L_ParseMode_None) + { + L_PushBlobItem(arena, &blob->errors, file, token->pos, Lit("Unexpected end of file")); + } + break; + } if (mode == L_ParseMode_None) { if (EqString(s, Lit("@Layer"))) mode = L_ParseMode_LayerName; @@ -342,6 +355,7 @@ L_ParseResult L_ParseBlobsFromPaths(Arena *arena, StringList paths) else if (EqString(s, Lit("@ShaderPS"))) mode = L_ParseMode_ShaderPS; else if (EqString(s, Lit("@ShaderCS"))) mode = L_ParseMode_ShaderCS; else if (EqString(s, Lit("@Startup"))) mode = L_ParseMode_Startup; + else if (EqString(s, Lit("@EmbedDir"))) mode = L_ParseMode_EmbedDir_StoreName; else if (EqString(s, Lit("@DefaultWindowsImpl"))) mode = L_ParseMode_DefaultWindowsImpl; else { @@ -403,6 +417,19 @@ L_ParseResult L_ParseBlobsFromPaths(Arena *arena, StringList paths) L_PushBlobItem(arena, &blob->startup_functions, file, token->pos, s); mode = L_ParseMode_None; } break; + case L_ParseMode_EmbedDir_StoreName: + { + store_name = s; + mode = L_ParseMode_EmbedDir_DirName; + } break; + case L_ParseMode_EmbedDir_DirName: + { + String embed_dir_name = s; + L_BlobItem *item = L_PushBlobItem(arena, &blob->embed_dirs, file, token->pos, embed_dir_name); + item->store_name = PushString(arena, store_name); + store_name = Lit(""); + mode = L_ParseMode_None; + } break; case L_ParseMode_DefaultWindowsImpl: { L_PushBlobItem(arena, &blob->default_windows_impls, file, token->pos, s); @@ -455,6 +482,7 @@ Struct(L_TopoItem) { L_TopoItem *next; String s; + String store_name; String token_file; i64 token_pos; }; @@ -470,6 +498,7 @@ Struct(L_Topo) { L_TopoItemList c_includes; L_TopoItemList startup_functions; + L_TopoItemList embed_dirs; L_TopoItemList errors; }; @@ -687,6 +716,14 @@ L_Topo L_TopoFromLayerName(Arena *arena, StringList starting_layer_names, String String s = PushString(arena, bitem->s); L_PushTopoItem(arena, &result.startup_functions, file, bitem->token_pos, s); } + /* Embed dirs */ + for (L_BlobItem *bitem = blob->embed_dirs.first; bitem; bitem = bitem->next) + { + String file = PushString(arena, bitem->token_file); + String s = PushString(arena, bitem->s); + L_TopoItem *titem = L_PushTopoItem(arena, &result.embed_dirs, file, bitem->token_pos, s); + titem->store_name = PushString(arena, bitem->store_name); + } } /* Process errors of untouched blobs */ @@ -828,7 +865,7 @@ void StartupMeta(void) } } - //- Generate C + //- Generate C file String c_out_file = F_GetFull(arena, Lit("pp_gen.c")); if (errors.count <= 0) { @@ -882,7 +919,29 @@ void StartupMeta(void) F_ClearWrite(c_out_file, c_out); } + //- Generate archive file + String archive_out_file = F_GetFull(arena, Lit("embeds.arc")); + { + for (L_TopoItem *item = topo.embed_dirs.first; item; item = item->next) + { + String parent = F_GetParentDir(item->token_file); + String dir = StringF(arena, "%F%F", FmtString(parent), FmtString(item->s)); + if (F_IsDir(dir)) + { + String full = F_GetFull(arena, dir); + String line = StringF(arena, "#include \"%F\"", FmtString(full)); + // PushStringToList(arena, &c_out_lines, line); + } + else + { + String e = StringF(arena, "Dir '%F' not found", FmtString(dir)); + PushError(arena, &errors, item->token_file, item->token_pos, e); + } + } + } + //- Echo meta errors + i32 ret = errors.count > 0; for (Error *e = errors.first; e; e = e->next) { String s = e->s; @@ -930,9 +989,7 @@ void StartupMeta(void) //- Msvc { - PushStringToList(arena, &flags_msvc, Lit("-Fe:pp.exe")); PushStringToList(arena, &flags_msvc, Lit("-nologo")); - PushStringToList(arena, &compiler_flags_msvc, Lit("-Fo:pp_gen.obj")); PushStringToList(arena, &compiler_flags_msvc, Lit("-diagnostics:column")); /* Debug info */ @@ -958,6 +1015,7 @@ void StartupMeta(void) { PushStringToList(arena, &flags_clang, Lit("-std=c99")); PushStringToList(arena, &flags_clang, Lit("-fno-finite-loops")); + PushStringToList(arena, &flags_clang, Lit("-fno-strict-aliasing")); PushStringToList(arena, &flags_clang, Lit("-g -gcodeview")); PushStringToList(arena, &flags_clang, Lit("-O0")); PushStringToList(arena, &flags_clang, Lit("-msse4.2")); @@ -980,6 +1038,43 @@ void StartupMeta(void) } } + //- Compile C + String c_out_obj_file = Lit("pp_gen.obj"); + if (ret == 0) + { + Echo(Lit("[Compiling]")); + String cmd = StringF(arena, + "cl /c %F -Fo:%F %F %F %F %F", + FmtString(c_out_file), + FmtString(c_out_obj_file), + FmtString(StringFromList(arena, flags_msvc, Lit(" "))), + FmtString(StringFromList(arena, compiler_flags_msvc, Lit(" "))), + FmtString(StringFromList(arena, warning_flags_msvc, Lit(" "))), + FmtString(StringFromList(arena, compiler_defs, Lit(" ")))); + OS_CommandResult result = OS_RunCommand(arena, cmd); + String output = TrimWhitespace(result.output); + Echo(output); + ret = result.code; + } + + //- Link + String exe_file = Lit("pp.exe"); + if (ret == 0) + { + Echo(Lit("[Linking]")); + String cmd = StringF(arena, + "link %F /OUT:%F %F %F", + FmtString(c_out_obj_file), + FmtString(exe_file), + FmtString(StringFromList(arena, flags_msvc, Lit(" "))), + FmtString(StringFromList(arena, linker_flags_msvc, Lit(" ")))); + OS_CommandResult result = OS_RunCommand(arena, cmd); + String output = TrimWhitespace(result.output); + Echo(output); + ret = result.code; + } + +#if 0 //- Generate compiler cmds String msvc_cmd_str = ZI; String clang_cmd_str = ZI; @@ -1009,13 +1104,11 @@ void StartupMeta(void) } //- Compile C - i32 ret = errors.count > 0; if (ret == 0) { - Echo(Lit("Compiling...")); + Echo(Lit("Compiling")); String cmd_str = msvc_cmd_str; // String cmd_str = clang_cmd_str; OS_CommandResult result = OS_RunCommand(arena, cmd_str); - ret = result.code; String output = result.output; output = Trim(output, Lit("\n")); output = Trim(output, Lit("\r")); @@ -1031,6 +1124,7 @@ void StartupMeta(void) } ret = result.code; } +#endif ExitNow(ret); } diff --git a/src/pp/pp.c b/src/pp/pp.c index 5191f286..283dd02a 100644 --- a/src/pp/pp.c +++ b/src/pp/pp.c @@ -457,8 +457,8 @@ MergesortCompareFuncDef(EntitySortCmp, arg_a, arg_b, _) if (result == 0) { /* Sort by sprite */ - u64 a_cmp = a->sprite.r.hash; - u64 b_cmp = b->sprite.r.hash; + u64 a_cmp = a->sprite.hash; + u64 b_cmp = b->sprite.hash; result = (a_cmp < b_cmp) - (a_cmp > b_cmp); } if (result == 0) @@ -1152,7 +1152,7 @@ void UpdateUser(P_Window *window) if (!IsValidAndActive(ent)) continue; //if (S_IsTagNil(ent->sprite)) continue; - S_Tag sprite = ent->sprite; + R_Tag sprite = ent->sprite; Entity *parent = EntityFromId(g->ss_blended, ent->parent); @@ -1214,10 +1214,10 @@ void UpdateUser(P_Window *window) #endif /* Draw sprite */ - if (!S_IsTagNil(sprite)) + if (!R_IsTagNil(sprite)) { - S_Sheet *sheet = S_SheetFromTagAsync(sprite); - S_Texture *texture = S_TextureFromTagAsync(sprite); + S_Sheet *sheet = S_SheetFromResourceAsync(sprite); + S_Texture *texture = S_TextureFromResourceAsync(sprite); /* TODO: Fade in placeholder if texture isn't loaded */ if (sheet->loaded && texture->loaded) @@ -1244,8 +1244,8 @@ void UpdateUser(P_Window *window) if (HasProp(ent, Prop_TileChunk)) { Vec2I32 chunk_index = ent->tile_chunk_index; - S_Tag tile_sprite = S_TagFromName(Lit("sprite/tile.ase")); - S_Texture *tile_texture = S_TextureFromTagAsync(tile_sprite); + R_Tag tile_sprite = R_TagFromStore(&GameResources, Lit("sprite/tile.ase")); + S_Texture *tile_texture = S_TextureFromResourceAsync(tile_sprite); if (tile_texture->loaded) { f32 tile_size = 1.f / SIM_TILES_PER_UNIT_SQRT; @@ -1311,7 +1311,7 @@ void UpdateUser(P_Window *window) /* Draw focus arrow */ if (ent == local_control || EqId(ent->id, g->debug_following)) { - S_Sheet *sheet = S_SheetFromTagAsync(ent->sprite); + S_Sheet *sheet = S_SheetFromResourceAsync(ent->sprite); S_Slice slice = S_SliceFromNameIndex(sheet, Lit("attach.wep"), ent->animation_frame); Vec2 start = MulXformV2(sprite_xform, slice.center); start = MulXformV2(g->world_to_ui_xf, start); @@ -1325,7 +1325,7 @@ void UpdateUser(P_Window *window) /* Draw slices */ if (!S_IsTagNil(ent->sprite)) { - S_Sheet *sheet = S_SheetFromTagAsync(sprite); + S_Sheet *sheet = S_SheetFromResourceAsync(sprite); u32 quad_color = Rgba32F(1, 0, 0.5, 1); u32 point_color = Rgba32F(1, 0, 0, 1); @@ -1754,8 +1754,8 @@ void UpdateUser(P_Window *window) { __profn("Draw crosshair"); Vec2 crosshair_pos = g->ui_cursor; - S_Tag crosshair = S_TagFromPath(Lit("sprite/crosshair.ase")); - S_Texture *t = S_TextureFromTagAsync(crosshair); + R_Tag crosshair = R_TagFromStore(GameResources, Lit("sprite/crosshair.ase")); + S_Texture *t = S_TextureFromResourceAsync(crosshair); Vec2 size = VEC2(t->width, t->height); Xform xf = XformFromTrs(TRS(.t = crosshair_pos, .s = size)); D_DrawUiRect(g->render_sig, D_UIRECTPARAMS(.xf = xf, .texture = t->gpu_resource)); @@ -1773,7 +1773,7 @@ void UpdateUser(P_Window *window) } else { - S_Texture *t = S_TextureFromTagAsync(S_TagFromPath(Lit("sprite/crosshair.ase"))); + S_Texture *t = S_TextureFromResourceAsync(R_TagFromStore(GameResources, Lit("sprite/crosshair.ase"))); Vec2 size = VEC2(t->width, t->height); Rect cursor_clip = RectFromVec2(g->ui_screen_offset, g->ui_size); cursor_clip.pos = AddVec2(cursor_clip.pos, MulVec2(size, 0.5f)); diff --git a/src/pp/pp.h b/src/pp/pp.h index f6e4cc5f..51a50027 100644 --- a/src/pp/pp.h +++ b/src/pp/pp.h @@ -270,6 +270,11 @@ Struct(SharedUserState) extern SharedUserState shared_user_state; +//////////////////////////////// +//~ Resources + +R_DeclStore(GameResources); + //////////////////////////////// //~ Startup diff --git a/src/pp/pp.lay b/src/pp/pp.lay index 2d986c83..a323c55b 100644 --- a/src/pp/pp.lay +++ b/src/pp/pp.lay @@ -30,16 +30,8 @@ @IncludeC pp.c @IncludeGpu pp_draw.gpu -//- Shaders -@ShaderVS MaterialVS -@ShaderPS MaterialPS -@ShaderCS FloodCS -@ShaderVS UiBlitVS -@ShaderPS UiBlitPS -@ShaderVS UiRectVS -@ShaderPS UiRectPS -@ShaderVS UiShapeVS -@ShaderPS UiShapePS +//- Embeds +@EmbedDir GameResources pp_res //- Startup @Startup StartupSim diff --git a/src/pp/pp_ent.h b/src/pp/pp_ent.h index 7ec5c2ed..cb9a8ea4 100644 --- a/src/pp/pp_ent.h +++ b/src/pp/pp_ent.h @@ -247,7 +247,7 @@ Struct(Entity) //- Sprite - S_Tag sprite; + R_Tag sprite; String sprite_span_name; u32 sprite_tint; Vec3 sprite_emittance; diff --git a/src/pp/pp_step.c b/src/pp/pp_step.c index 25a4fcf9..c0e4f5ad 100644 --- a/src/pp/pp_step.c +++ b/src/pp/pp_step.c @@ -36,7 +36,7 @@ void ResetSimAccel(Snapshot *ss, SimAccel *accel) Entity *SpawnTestSmg(Entity *parent) { Entity *e = AcquireSyncSrc(parent); - e->sprite = S_TagFromName(Lit("sprite/gun.ase")); + e->sprite = R_TagFromStore(&GameResources, Lit("sprite/gun.ase")); EnableProp(e, Prop_Attached); e->attach_slice = Lit("attach.wep"); @@ -52,7 +52,7 @@ Entity *SpawnTestSmg(Entity *parent) Entity *SpawnTestLauncher(Entity *parent) { Entity *e = AcquireSyncSrc(parent); - e->sprite = S_TagFromName(Lit("sprite/gun.ase")); + e->sprite = R_TagFromStore(&GameResources, Lit("sprite/gun.ase")); EnableProp(e, Prop_Attached); e->attach_slice = Lit("attach.wep"); @@ -68,7 +68,7 @@ Entity *SpawnTestLauncher(Entity *parent) Entity *SpawnTestChucker(Entity *parent) { Entity *chucker = AcquireSyncSrc(parent); - chucker->sprite = S_TagFromName(Lit("sprite/gun.ase")); + chucker->sprite = R_TagFromStore(&GameResources, Lit("sprite/gun.ase")); EnableProp(chucker, Prop_Attached); chucker->attach_slice = Lit("attach.wep"); @@ -119,12 +119,12 @@ Entity *SpawnTestEmployee(Entity *parent) { EnableProp(e, Prop_Test); - e->sprite = S_TagFromName(Lit("sprite/tim.ase")); + e->sprite = R_TagFromStore(&GameResources, Lit("sprite/tim.ase")); e->mass_unscaled = 10; e->inertia_unscaled = 5; } - //e->sprite = S_TagFromName(Lit("sprite/box_rounded.ase")); + //e->sprite = R_TagFromStore(GameResources, Lit("sprite/box_rounded.ase")); //e->sprite_span_name = Lit("idle.unarmed"); //e->sprite_span_name = Lit("idle.one_handed"); e->sprite_span_name = Lit("idle.two_handed"); @@ -257,7 +257,7 @@ void SpawnTestEntities2(Entity *parent, Vec2 pos) Xform xf = XformFromTrs(TRS(.t = pos, .r = rot, .s = size)); SetXform(e, xf); - e->sprite = S_TagFromName(Lit("sprite/tile.ase")); + e->sprite = R_TagFromStore(&GameResources, Lit("sprite/tile.ase")); e->layer = Layer_Shoulders; //e->sprite_tint = Alpha32F(ColorBlue, 0.75); @@ -299,7 +299,7 @@ void SpawnTestEntities2(Entity *parent, Vec2 pos) Xform xf = XformFromTrs(.t = pos, .r = r, .s = size); SetXform(e, xf); - e->sprite = S_TagFromName(Lit("sprite/bullet.ase")); + e->sprite = R_TagFromStore(GameResources, Lit("sprite/bullet.ase")); e->sprite_collider_slice = Lit("shape"); e->layer = Layer_Shoulders; @@ -327,7 +327,7 @@ void SpawnTestEntities3(Entity *parent, Vec2 pos) Xform xf = XformFromTrs(TRS(.t = pos, .r = r, .s = size)); SetXform(e, xf); - e->sprite = S_TagFromName(Lit("sprite/box.ase")); + e->sprite = R_TagFromStore(&GameResources, Lit("sprite/box.ase")); e->layer = Layer_Shoulders; e->sprite_tint = ColorRed; @@ -350,8 +350,8 @@ void SpawnTestEntities4(Entity *parent, Vec2 pos) Xform xf = XformFromTrs(TRS(.t = pos, .r = r, .s = size)); SetXform(e, xf); - //e->sprite = S_TagFromName(Lit("sprite/box.ase")); - e->sprite = S_TagFromName(Lit("sprite/tile.ase")); + //e->sprite = R_TagFromStore(GameResources, Lit("sprite/box.ase")); + e->sprite = R_TagFromStore(&GameResources, Lit("sprite/tile.ase")); e->layer = Layer_Shoulders; EnableProp(e, Prop_LightTest); @@ -380,10 +380,10 @@ void SpawnTestTile(Snapshot *world, Vec2 world_pos) SetXform(e, xf); e->layer = Layer_Walls; - e->sprite = S_TagFromName(Lit("sprite/tile.ase")); + e->sprite = R_TagFromStore(GameResources, Lit("sprite/tile.ase")); e->sprite_tint = ColorRed; - S_Sheet *sheet = S_SheetFromTagAwait(e->sprite); + S_Sheet *sheet = S_SheetFromResourceAwait(e->sprite); e->sprite_local_xform = XformFromTrs(.s = DivVec2(sheet->frame_size, PIXELS_PER_UNIT)); EnableProp(e, Prop_Solid); @@ -783,7 +783,7 @@ CollisionCallbackFuncDef(OnEntityCollision, data, step_ctx) { Xform xf = XformFromTrs(TRS(.t = point, .r = RandF64FromState(&step_ctx->rand, 0, Tau))); Entity *decal = AcquireSyncSrc(root); - decal->sprite = S_TagFromName(Lit("sprite/blood.ase")); + decal->sprite = R_TagFromStore(&GameResources, Lit("sprite/blood.ase")); decal->sprite_tint = Rgba32F(1, 1, 1, 0.25f); decal->layer = Layer_FloorDecals; SetXform(decal, xf); @@ -1249,9 +1249,9 @@ void StepSim(SimStepCtx *ctx) { Entity *ent = &world->ents[ent_index]; if (!ShouldSimulate(ent)) continue; - if (S_IsTagNil(ent->sprite)) continue; + if (R_IsTagNil(ent->sprite)) continue; - S_Sheet *sheet = S_SheetFromTagAwait(ent->sprite); + S_Sheet *sheet = S_SheetFromResourceAwait(ent->sprite); /* Update animation */ { @@ -1359,8 +1359,8 @@ void StepSim(SimStepCtx *ctx) if (!HasProp(ent, Prop_Attached)) continue; Entity *parent = EntityFromId(world, ent->parent); - S_Tag parent_sprite = parent->sprite; - S_Sheet *parent_sheet = S_SheetFromTagAwait(parent_sprite); + R_Tag parent_sprite = parent->sprite; + S_Sheet *parent_sheet = S_SheetFromResourceAwait(parent_sprite); Xform parent_sprite_xf = parent->sprite_local_xform; @@ -1450,9 +1450,9 @@ void StepSim(SimStepCtx *ctx) { if (primary_triggered) { - S_Tag sprite = ent->sprite; + R_Tag sprite = ent->sprite; u32 animation_frame = ent->animation_frame; - S_Sheet *sheet = S_SheetFromTagAwait(sprite); + S_Sheet *sheet = S_SheetFromResourceAwait(sprite); Xform sprite_local_xform = ent->sprite_local_xform; S_Slice out_slice = S_SliceFromName(sheet, Lit("out"), animation_frame); Vec2 rel_pos = MulXformV2(sprite_local_xform, out_slice.center); @@ -1477,7 +1477,7 @@ void StepSim(SimStepCtx *ctx) bullet->local_collider.points[0] = VEC2(0, 0); bullet->local_collider.count = 1; #else - bullet->sprite = S_TagFromName(Lit("sprite/bullet.ase")); + bullet->sprite = R_TagFromStore(GameResources, Lit("sprite/bullet.ase")); bullet->sprite_collider_slice = Lit("shape"); #endif } @@ -1499,9 +1499,9 @@ void StepSim(SimStepCtx *ctx) { if (primary_triggered) { - S_Tag sprite = ent->sprite; + R_Tag sprite = ent->sprite; u32 animation_frame = ent->animation_frame; - S_Sheet *sheet = S_SheetFromTagAwait(sprite); + S_Sheet *sheet = S_SheetFromResourceAwait(sprite); Xform sprite_local_xform = ent->sprite_local_xform; S_Slice out_slice = S_SliceFromName(sheet, Lit("out"), animation_frame); Vec2 rel_pos = MulXformV2(sprite_local_xform, out_slice.center); @@ -1673,7 +1673,7 @@ void StepSim(SimStepCtx *ctx) Vec2 sprite_hold_pos; Vec2 sprite_hold_dir; { - S_Sheet *sheet = S_SheetFromTagAwait(ent->sprite); + S_Sheet *sheet = S_SheetFromResourceAwait(ent->sprite); S_Slice slice = S_SliceFromName(sheet, Lit("attach.wep"), ent->animation_frame); sprite_hold_pos = slice.center; sprite_hold_dir = slice.dir; diff --git a/src/resource/res.c b/src/res/res.c similarity index 74% rename from src/resource/res.c rename to src/res/res.c index 102d0099..9403be86 100644 --- a/src/resource/res.c +++ b/src/res/res.c @@ -2,7 +2,12 @@ //////////////////////////////// //~ Tag helpers -R_Tag R_TagFromName(String name) +b32 R_IsTagNil(R_Tag tag) +{ + return tag.hash == 0; +} + +R_Tag R_TagFromStore(R_Store *store, String name) { R_Tag result = ZI; return result; diff --git a/src/resource/res.h b/src/res/res.h similarity index 55% rename from src/resource/res.h rename to src/res/res.h index bf08da7f..cfdae0a2 100644 --- a/src/resource/res.h +++ b/src/res/res.h @@ -6,10 +6,21 @@ Struct(R_Tag) u64 hash; }; +//////////////////////////////// +//~ Store types + +#define R_DeclStore(name) extern R_Store name + +Struct(R_Store) +{ + i32 _; +}; + //////////////////////////////// //~ Tag helpers -R_Tag R_TagFromName(String name); +b32 R_IsTagNil(R_Tag tag); +R_Tag R_TagFromStore(R_Store *store, String name); //////////////////////////////// //~ Resource operations diff --git a/src/resource/res.lay b/src/res/res.lay similarity index 100% rename from src/resource/res.lay rename to src/res/res.lay diff --git a/src/sprite/sprite.c b/src/sprite/sprite.c index 36d5c516..5b96b620 100644 --- a/src/sprite/sprite.c +++ b/src/sprite/sprite.c @@ -9,36 +9,16 @@ void S_Startup(void) { } -//////////////////////////////// -//~ Tag helpers - -b32 S_IsTagNil(S_Tag tag) -{ - return 0; -} - -S_Tag S_TagFromName(String name) -{ - S_Tag result = ZI; - return result; -} - -S_Tag S_TagFromResource(R_Tag resource) -{ - S_Tag result = ZI; - return result; -} - //////////////////////////////// //~ Texture operations -S_Texture *S_TextureFromTagAwait(S_Tag tag) +S_Texture *S_TextureFromResourceAwait(R_Tag resource) { S_Texture *result = &S_NilTexture; return result; } -S_Texture *S_TextureFromTagAsync(S_Tag tag) +S_Texture *S_TextureFromResourceAsync(R_Tag resource) { S_Texture *result = &S_NilTexture; return result; @@ -47,13 +27,13 @@ S_Texture *S_TextureFromTagAsync(S_Tag tag) //////////////////////////////// //~ Sheet operations -S_Sheet *S_SheetFromTagAwait(S_Tag tag) +S_Sheet *S_SheetFromResourceAwait(R_Tag resource) { S_Sheet *result = &S_NilSheet; return result; } -S_Sheet *S_SheetFromTagAsync(S_Tag tag) +S_Sheet *S_SheetFromResourceAsync(R_Tag resource) { S_Sheet *result = &S_NilSheet; return result; diff --git a/src/sprite/sprite.h b/src/sprite/sprite.h index c553850d..e35d4dc5 100644 --- a/src/sprite/sprite.h +++ b/src/sprite/sprite.h @@ -1,11 +1,3 @@ -//////////////////////////////// -//~ Tag types - -Struct(S_Tag) -{ - R_Tag r; -}; - //////////////////////////////// //~ Texture types @@ -108,24 +100,17 @@ extern S_SharedState S_shared_state; void S_Startup(void); -//////////////////////////////// -//~ Tag helpers - -b32 S_IsTagNil(S_Tag tag); -S_Tag S_TagFromName(String name); -S_Tag S_TagFromResource(R_Tag resource); - //////////////////////////////// //~ Texture operations -S_Texture *S_TextureFromTagAwait(S_Tag tag); -S_Texture *S_TextureFromTagAsync(S_Tag tag); +S_Texture *S_TextureFromResource(R_Tag resource); +S_Texture *S_TextureFromResourceAsync(R_Tag resource); //////////////////////////////// //~ Sheet operations -S_Sheet *S_SheetFromTagAwait(S_Tag tag); -S_Sheet *S_SheetFromTagAsync(S_Tag tag); +S_Sheet *S_SheetFromResourceAwait(R_Tag resource); +S_Sheet *S_SheetFromResourceAsync(R_Tag resource); S_Span S_SpanFromName(S_Sheet *sheet, String name); S_Frame S_FrameFromIndex(S_Sheet *sheet, u64 index);