From 174e5a04527dd301e064feff186b8be6b7d7ace9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Sun, 16 Oct 2022 01:48:23 +0200 Subject: [PATCH] custom dim sprites --- art/furnace.aseprite | Bin 0 -> 7625 bytes art/gen/bigtree.png | Bin 0 -> 24186 bytes art/gen/coal.png | Bin 778 -> 824 bytes art/gen/furnace-export.png | Bin 0 -> 1046 bytes art/gen/furnace.png | Bin 0 -> 5877 bytes art/gen/test-tall.png | Bin 0 -> 592 bytes art/gen/wood.png | Bin 254 -> 278 bytes code/foundation/src/debug/debug_ui.c | 1 + code/foundation/src/debug/debug_ui_actions.c | 11 ++++++++++ code/foundation/src/gen/texgen_fallback.c | 4 +++- code/foundation/src/gui/inventory.c | 5 ++++- code/foundation/src/lists/assets_ids.h | 1 + code/foundation/src/lists/assets_list.c | 1 + code/foundation/src/lists/blocks_list.c | 1 + code/foundation/src/lists/items_list.c | 1 + code/foundation/src/models/assets.h | 2 ++ code/games/sandbox/src/renderer.c | 22 +++++++++++++------ 17 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 art/furnace.aseprite create mode 100644 art/gen/bigtree.png create mode 100644 art/gen/furnace-export.png create mode 100644 art/gen/furnace.png create mode 100644 art/gen/test-tall.png diff --git a/art/furnace.aseprite b/art/furnace.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..ac4b9148723481cbf1965a42429d68ef9082866f GIT binary patch literal 7625 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 NtPGQ7SN`YV{{Via5s?4@ literal 0 HcmV?d00001 diff --git a/art/gen/bigtree.png b/art/gen/bigtree.png new file mode 100644 index 0000000000000000000000000000000000000000..b436c49c56ffa9e730a1fdd9d0cdc66d8e313b6e GIT binary patch literal 24186 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 V3Iq_xY()S7002ovPDHLkV1ibfNxT36 literal 0 HcmV?d00001 diff --git a/art/gen/coal.png b/art/gen/coal.png index 5b3fde89dfe42cd15481aa66fd756627f899401c..18e8cec65f10e850fa020cb9970923ff8d29d814 100644 GIT binary patch delta 788 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 literal 0 HcmV?d00001 diff --git a/art/gen/test-tall.png b/art/gen/test-tall.png new file mode 100644 index 0000000000000000000000000000000000000000..da05aeae9b6dbf3067b5fafb9e60fadd07ba7638 GIT binary patch literal 592 zcmeAS@N?(olHy`uVBq!ia0vp^4nUm1!3HGP9xZtRq!^2X+?^QKos)UVz`(@i>Eakt zG3V_ZL%+iY5^l0bE+i{NSTHDSmoo)6IwdXuU@Yv(OXM=je05`8y}k23^KBdd z{?(uMHYC?N{m9|7!SRdcfBhR8zG!~zo2!*8m5MbL)ps)QdJ+5Nlt?9=3RXNp;4VhABqW>8LSw3SuQYUs5J07C^MEY%sR?#P|xOX%X;l!Ou|QF2c{PcCPEJE3nro~ zlmZ#&!64h;mycGf@}`~oD*t8 ZcIOv!=9CDTP6GOk!PC{xWt~$(69BkGU;_XE literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|c6hothE&XX zd*LAGVF!Vu0qSp;2#Y`36?C+0QuFFUs~e}2TGvBSg z^Y{PWlD`aG3s_B9FEGtw%3$>gV+TT2ks1-N&jJ7_J}iXS;(eu QKtC{ey85}Sb4q9e01x0-ZU6uP diff --git a/code/foundation/src/debug/debug_ui.c b/code/foundation/src/debug/debug_ui.c index a6c934e..1d78554 100644 --- a/code/foundation/src/debug/debug_ui.c +++ b/code/foundation/src/debug/debug_ui.c @@ -143,6 +143,7 @@ static debug_item items[] = { { .kind = DITEM_BUTTON, .name = "spawn furnace", .on_click = ActSpawnFurnace }, { .kind = DITEM_BUTTON, .name = "spawn demo blueprint", .on_click = ActSpawnDemoHouseItem }, { .kind = DITEM_BUTTON, .name = "spawn random durability icemaker", .on_click = ActSpawnDurabilityTest }, + { .kind = DITEM_BUTTON, .name = "spawn sprite tall test", .on_click = ActSpawnTallTest }, { .kind = DITEM_LIST, .name = "demo npcs", diff --git a/code/foundation/src/debug/debug_ui_actions.c b/code/foundation/src/debug/debug_ui_actions.c index a4543dd..a0b061b 100644 --- a/code/foundation/src/debug/debug_ui_actions.c +++ b/code/foundation/src/debug/debug_ui_actions.c @@ -85,6 +85,17 @@ ActSpawnFurnace(void) { entity_set_position(e, dest->x, dest->y); } +void +ActSpawnTallTest(void) { + ecs_entity_t e = item_spawn(ASSET_TEST_TALL, 32); + ecs_entity_t plr = camera_get().ent_id; + + Position const* origin = ecs_get(world_ecs(), plr, Position); + Position * dest = ecs_get_mut(world_ecs(), e, Position); + *dest = *origin; + entity_set_position(e, dest->x, dest->y); +} + void ActSpawnDemoHouseItem(void) { ecs_entity_t e = item_spawn(ASSET_BLUEPRINT, 1); diff --git a/code/foundation/src/gen/texgen_fallback.c b/code/foundation/src/gen/texgen_fallback.c index 5615ea7..e0c7e99 100644 --- a/code/foundation/src/gen/texgen_fallback.c +++ b/code/foundation/src/gen/texgen_fallback.c @@ -35,7 +35,8 @@ Texture2D texgen_build_sprite_fallback(asset_id id) { case ASSET_HILL: return LoadTexEco("rock"); case ASSET_LAVA: return LoadTexEco("lava"); case ASSET_WOOD: return LoadTexEco("wood"); - case ASSET_TREE: return LoadTexEco("tree"); + case ASSET_TREE: return LoadTexEco("bigtree"); + case ASSET_TEST_TALL: return LoadTexEco("test-tall"); // case ASSET_WATER: return LoadTexEco("water"); case ASSET_BELT: @@ -46,6 +47,7 @@ Texture2D texgen_build_sprite_fallback(asset_id id) { // NOTE(zaklaus): devices case ASSET_CHEST: return LoadTexEco("chest"); + case ASSET_FURNACE: return LoadTexEco("furnace-export"); default: return GenColorEco(PINK); break; } diff --git a/code/foundation/src/gui/inventory.c b/code/foundation/src/gui/inventory.c index ab06325..ee60153 100644 --- a/code/foundation/src/gui/inventory.c +++ b/code/foundation/src/gui/inventory.c @@ -116,7 +116,10 @@ void inventory_render_held_item(bool is_player){ Vector2 mpos = GetMousePosition(); mpos.x -= 32; mpos.y -= 32; - DrawTexturePro(GetSpriteTexture2D(assets_find(inv->held_item.kind)), ASSET_SRC_RECT(), ASSET_DST_RECT(mpos.x, mpos.y), (Vector2){0.5f,0.5f}, 0.0f, ColorAlpha(WHITE, 0.8f)); + Texture2D tex = GetSpriteTexture2D(assets_find(inv->held_item.kind)); + float aspect = tex.width/(float)tex.height; + float size = WORLD_BLOCK_SIZE * aspect; + DrawTexturePro(tex, ASSET_SRC_RECT_TEX(tex.width, tex.height), ASSET_DST_RECT_TEX(mpos.x, mpos.y, size, WORLD_BLOCK_SIZE), (Vector2){0.5f,0.5f}, 0.0f, ColorAlpha(WHITE, 0.8f)); DrawTextEco(zpl_bprintf("%d", inv->held_item.quantity), mpos.x, mpos.y, 16, RAYWHITE, 0.0f); if (!inv->is_inside && IsMouseButtonReleased(MOUSE_LEFT_BUTTON) && !inv2->is_inside) { diff --git a/code/foundation/src/lists/assets_ids.h b/code/foundation/src/lists/assets_ids.h index 51b54cb..91d00cc 100644 --- a/code/foundation/src/lists/assets_ids.h +++ b/code/foundation/src/lists/assets_ids.h @@ -34,6 +34,7 @@ typedef enum { ASSET_COAL, ASSET_IRON_ORE, ASSET_IRON_INGOT, + ASSET_TEST_TALL, ASSET_BELT, ASSET_BELT_LEFT, diff --git a/code/foundation/src/lists/assets_list.c b/code/foundation/src/lists/assets_list.c index 5b6faa5..56bf4d9 100644 --- a/code/foundation/src/lists/assets_list.c +++ b/code/foundation/src/lists/assets_list.c @@ -32,6 +32,7 @@ static asset assets[] = { ASSET_TEX(ASSET_HILL_SNOW), ASSET_TEX(ASSET_HOLE), ASSET_TEX(ASSET_WOOD), + ASSET_TEX(ASSET_TEST_TALL), ASSET_TEX(ASSET_TREE), ASSET_TEX(ASSET_BELT), diff --git a/code/foundation/src/lists/blocks_list.c b/code/foundation/src/lists/blocks_list.c index 4de963f..cedacf9 100644 --- a/code/foundation/src/lists/blocks_list.c +++ b/code/foundation/src/lists/blocks_list.c @@ -19,6 +19,7 @@ static block blocks[] = { BLOCK(ASSET_TREE, BLOCK_FLAG_COLLISION|BLOCK_FLAG_DESTROY_ON_COLLISION, '@', .drag = 1.0f , .friction = 1.0f, .bounce = 0.0f), BLOCK(ASSET_CHEST, BLOCK_FLAG_ENTITY, 'C'), BLOCK(ASSET_FURNACE, BLOCK_FLAG_ENTITY, 'F'), + BLOCK(ASSET_TEST_TALL, BLOCK_FLAG_COLLISION, '.'), BLOCK(ASSET_BELT_LEFT, 0, '@', .drag = 1.0f , .friction = 1.0f, .velx = -150.0f), BLOCK(ASSET_BELT_RIGHT, 0, '@', .drag = 1.0f , .friction = 1.0f, .velx = 150.0f), diff --git a/code/foundation/src/lists/items_list.c b/code/foundation/src/lists/items_list.c index 876aa20..0dd0c3a 100644 --- a/code/foundation/src/lists/items_list.c +++ b/code/foundation/src/lists/items_list.c @@ -8,6 +8,7 @@ static item_desc items[] = { ITEM_SELF(ASSET_FENCE, 64), ITEM_ENERGY(ASSET_WOOD, ASSET_FURNACE, 64, 15.0f), ITEM_HOLD(ASSET_TREE, 64), + ITEM_SELF(ASSET_TEST_TALL, 64), // ITEM_BLUEPRINT(ASSET_BLUEPRINT, 1, 4, 4, "]]]]]CF] ]]]]]"), ITEM_BLUEPRINT(ASSET_BLUEPRINT, 1, 4, 4, PROT({ ASSET_WOOD,ASSET_WOOD,ASSET_WOOD,ASSET_WOOD, diff --git a/code/foundation/src/models/assets.h b/code/foundation/src/models/assets.h index 03115fd..63aba06 100644 --- a/code/foundation/src/models/assets.h +++ b/code/foundation/src/models/assets.h @@ -24,3 +24,5 @@ void *assets_get_tex(uint16_t id); // NOTE(zaklaus): client only #define ASSET_SRC_RECT() ((Rectangle){0, 0, 64, 64}) #define ASSET_DST_RECT(x,y) ((Rectangle){x, y, 64, 64}) +#define ASSET_SRC_RECT_TEX(w,h) ((Rectangle){0, 0, (float)w, (float)h}) +#define ASSET_DST_RECT_TEX(x,y,w,h) ((Rectangle){x, y, (float)w, (float)h}) diff --git a/code/games/sandbox/src/renderer.c b/code/games/sandbox/src/renderer.c index a152377..2ccffc2 100644 --- a/code/games/sandbox/src/renderer.c +++ b/code/games/sandbox/src/renderer.c @@ -60,7 +60,8 @@ void renderer_draw_entry(uint64_t key, entity_view *data, game_world_render_entr tex.texture.height *= (int32_t)scale; DrawTextureRec(tex.texture, (Rectangle){0, 0, size, -size}, (Vector2){x, y}, ColorAlpha(WHITE, data->tran_time)); } else { - DrawTextureRec(GetBlockImage(entry->blk_id), ASSET_SRC_RECT(), (Vector2){entry->x-(WORLD_BLOCK_SIZE/2), entry->y-(WORLD_BLOCK_SIZE/2)}, ColorAlpha(WHITE, data->tran_time)); + Texture2D tex = GetBlockImage(entry->blk_id); + DrawTextureRec(tex, ASSET_SRC_RECT_TEX(tex.width, tex.height), (Vector2){entry->x-tex.width/2.0f, entry->y-(tex.height-WORLD_BLOCK_SIZE/2)}, ColorAlpha(WHITE, data->tran_time)); } }break; case EKIND_VEHICLE: { @@ -72,16 +73,17 @@ void renderer_draw_entry(uint64_t key, entity_view *data, game_world_render_entr DrawRectanglePro((Rectangle){x,y,w,h}, (Vector2){w/2.0f,h/2.0f}, zpl_to_degrees(data->heading), ColorAlpha(color, data->tran_time)); }break; case EKIND_DEVICE:{ - float x = data->x - 32.f; - float y = data->y - 32.f; - DrawTexturePro(GetSpriteTexture2D(assets_find(data->asset)), ASSET_SRC_RECT(), ASSET_DST_RECT(x,y), (Vector2){0.5f,0.5f}, 0.0f, ALPHA(WHITE)); + Texture2D tex = GetSpriteTexture2D(assets_find(data->asset)); + float x = data->x - tex.width/2; + float y = data->y - (tex.height-WORLD_BLOCK_SIZE/2); + DrawTexturePro(tex, ASSET_SRC_RECT_TEX(tex.width, tex.height), ASSET_DST_RECT_TEX(x,y, tex.width, tex.height), (Vector2){0.5f,0.5f}, 0.0f, ALPHA(WHITE)); if (data->progress_active) { float w = 64.f; float h = 8.f; float p = data->progress_value; float x = data->x - w/2.f; - float y = data->y - 32.f - h; + float y = data->y - (tex.height-WORLD_BLOCK_SIZE/2) - h; DrawRectangleEco(x, y, w, h, ColorAlpha(BLACK, data->tran_time)); DrawRectangleEco(x, y, w*p, h, ColorAlpha(GREEN, data->tran_time)); } @@ -115,7 +117,10 @@ void renderer_draw_entry(uint64_t key, entity_view *data, game_world_render_entr if (data->items[data->selected_item].quantity > 0) { asset_id it_kind = data->items[data->selected_item].kind; uint32_t qty = data->items[data->selected_item].quantity; - DrawTexturePro(GetSpriteTexture2D(assets_find(it_kind)), ASSET_SRC_RECT(), ((Rectangle){ix, iy, 32, 32}), (Vector2){0.5f,0.5f}, 0.0f, ALPHA(WHITE)); + Texture2D tex = GetSpriteTexture2D(assets_find(it_kind)); + float aspect = tex.width/(float)tex.height; + float size = WORLD_BLOCK_SIZE/2.0f * aspect; + DrawTexturePro(tex, ASSET_SRC_RECT_TEX(tex.width, tex.height), ((Rectangle){ix, iy, size, WORLD_BLOCK_SIZE/2.0f}), (Vector2){0.5f,0.5f}, 0.0f, ALPHA(WHITE)); if (!inv_is_open) DrawTextEco(zpl_bprintf("%d", qty), x+24, y+24, 8, RAYWHITE, 0.0f); @@ -135,7 +140,10 @@ void renderer_draw_entry(uint64_t key, entity_view *data, game_world_render_entr case EKIND_ITEM: { float x = data->x - 32.f; float y = data->y - 32.f; - DrawTexturePro(GetSpriteTexture2D(assets_find(data->asset)), ASSET_SRC_RECT(), ASSET_DST_RECT(x,y), (Vector2){0.5f,0.5f}, 0.0f, ALPHA(WHITE)); + Texture2D tex = GetSpriteTexture2D(assets_find(data->asset)); + float aspect = tex.width/(float)tex.height; + float size = WORLD_BLOCK_SIZE/2.0f * aspect; + DrawTexturePro(tex, ASSET_SRC_RECT_TEX(tex.width, tex.height), ASSET_DST_RECT_TEX(x,y,size,WORLD_BLOCK_SIZE/2.0f), (Vector2){0.5f,0.5f}, 0.0f, ALPHA(WHITE)); if (data->quantity > 1) { DrawTextEco(zpl_bprintf("%d", data->quantity), x, y, 10, ALPHA(RAYWHITE), 0.0f);