From f60cb28d00794a019849c864bea57cb4719831db Mon Sep 17 00:00:00 2001 From: Vladyslav Hrytsenko Date: Sat, 15 Oct 2022 15:52:20 +0300 Subject: [PATCH] code: added new things --- art/furnace.aseprite | Bin 0 -> 7625 bytes art/gen/coal.png | Bin 778 -> 824 bytes art/gen/furnace.png | Bin 0 -> 5877 bytes code/foundation/src/gen/texgen_fallback.c | 1 + code/foundation/src/utils/raylib_helpers.h | 31 +++++++ code/games/sandbox/src/renderer.c | 98 ++++++++++++++++----- 6 files changed, 109 insertions(+), 21 deletions(-) create mode 100644 art/furnace.aseprite create mode 100644 art/gen/furnace.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/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/code/foundation/src/gen/texgen_fallback.c b/code/foundation/src/gen/texgen_fallback.c index 5615ea7..5208460 100644 --- a/code/foundation/src/gen/texgen_fallback.c +++ b/code/foundation/src/gen/texgen_fallback.c @@ -46,6 +46,7 @@ Texture2D texgen_build_sprite_fallback(asset_id id) { // NOTE(zaklaus): devices case ASSET_CHEST: return LoadTexEco("chest"); + case ASSET_FURNACE: return LoadTexEco("furnace"); default: return GenColorEco(PINK); break; } diff --git a/code/foundation/src/utils/raylib_helpers.h b/code/foundation/src/utils/raylib_helpers.h index 7486443..50a3314 100644 --- a/code/foundation/src/utils/raylib_helpers.h +++ b/code/foundation/src/utils/raylib_helpers.h @@ -252,3 +252,34 @@ void DrawRectangleLinesEco(float posX, float posY, float width, float height, Co rlVertex2f(posX + 1, posY + 1); rlEnd(); } + +static inline +void DrawSpriteTextureEco(Texture2D texture, Vector3 position, float width, float height, float length, Color color) { + float x = position.x; + float y = position.y; + float z = position.z; + + Vector3 rotationAxis = {1.0f, 0.f, 0.f}; + + // NOTE: Plane is always created on XZ ground + rlSetTexture(texture.id); + + rlPushMatrix(); + rlTranslatef(position.x, position.y, position.z); + rlRotatef(25.f, rotationAxis.x, rotationAxis.y, rotationAxis.z); + rlScalef(width, height, length); + + rlBegin(RL_QUADS); + rlColor4ub(color.r, color.g, color.b, color.a); + + // Top Face + rlNormal3f(0.0f, 1.0f, 0.0f); // Normal Pointing Up + rlTexCoord2f(0.0f, 0.0f); rlVertex3f(-0.5f, 0.0f, -0.5f); // Top Left Of The Texture and Quad + rlTexCoord2f(0.0f, 1.0f); rlVertex3f(-0.5f, 0.0f, 0.5f); // Bottom Left Of The Texture and Quad + rlTexCoord2f(1.0f, 1.0f); rlVertex3f(0.5f, 0.0f, 0.5f); // Bottom Right Of The Texture and Quad + rlTexCoord2f(1.0f, 0.0f); rlVertex3f(0.5f, 0.0f, -0.5f); // Top Right Of The Texture and Quad + rlEnd(); + rlPopMatrix(); + + rlSetTexture(0); +} diff --git a/code/games/sandbox/src/renderer.c b/code/games/sandbox/src/renderer.c index bdcd173..986c9ca 100644 --- a/code/games/sandbox/src/renderer.c +++ b/code/games/sandbox/src/renderer.c @@ -1,5 +1,6 @@ -static Camera2D render_camera; +static Camera3D render_camera; static float zoom_overlay_tran = 0.0f; +static float cam_zoom = 1.5f; #define CAM_OVERLAY_ZOOM_LEVEL 0.15f #define ALPHA(x) ColorAlpha(x, data->tran_time) @@ -9,7 +10,7 @@ float zpl_to_degrees(float); void DrawNametag(const char* name, uint64_t key, entity_view *data, float x, float y) { float size = 16.f; - float font_size = lerp(4.0f, 32.0f, 0.5f/(float)render_camera.zoom); + float font_size = lerp(4.0f, 32.0f, 0.5f/1.0f);//(float)render_camera.zoom); float font_spacing = 1.1f; float title_bg_offset = 4; float fixed_title_offset = 8.f; @@ -26,6 +27,8 @@ void DEBUG_draw_ground(uint64_t key, entity_view * data) { case EKIND_CHUNK: { world_view *view = game_world_view_get_active(); float size = (float)(view->chunk_size * WORLD_BLOCK_SIZE); + float half_size = size / 2.0f; + float half_block_size = (float)(WORLD_BLOCK_SIZE >> 1); float offset = 0.0; float x = data->x * size + offset; @@ -35,13 +38,28 @@ void DEBUG_draw_ground(uint64_t key, entity_view * data) { float scale = (size)/(float)(tex.texture.width); tex.texture.width *= (int32_t)scale; tex.texture.height *= (int32_t)scale; - DrawTextureRec(tex.texture, (Rectangle){0, 0, size, -size}, (Vector2){x, y}, ColorAlpha(WHITE, data->tran_time)); + // DrawTextureRec(tex.texture, (Rectangle){0, 0, size, -size}, (Vector2){x, y}, ColorAlpha(WHITE, data->tran_time)); + DrawCubeTexture(tex.texture, (Vector3){x+half_size, 0.0f, y+half_size}, size, 0.01f, size, WHITE); for (size_t ty = 0; ty < view->chunk_size; ty++) { for (size_t tx = 0; tx < view->chunk_size; tx++) { block_id blk_id = data->outer_blocks[(ty*view->chunk_size)+tx]; if (blk_id != 0) { - DrawTextureRec(GetBlockImage(blk_id), ASSET_SRC_RECT(), (Vector2){x+tx*WORLD_BLOCK_SIZE, y+ty*WORLD_BLOCK_SIZE}, ColorAlpha(WHITE, data->tran_time)); + // DrawTextureRec(GetBlockImage(blk_id), ASSET_SRC_RECT(), (Vector2){x+tx*WORLD_BLOCK_SIZE, y+ty*WORLD_BLOCK_SIZE}, ColorAlpha(WHITE, data->tran_time)); + DrawCubeTexture(GetBlockImage(blk_id), (Vector3){x + tx*WORLD_BLOCK_SIZE+half_block_size, 32.0f, y + ty*WORLD_BLOCK_SIZE+half_block_size}, 64, 0.01f, 64, WHITE); + } + } + } + + for (int by = 0; by < 16; by++) { + for (int bx = 0; bx < 16; bx++) { + switch (blocks_get_flags(data->blocks[by*16+bx])) { + case BLOCK_FLAG_COLLISION:{ + DrawCubeWires((Vector3){x + bx*WORLD_BLOCK_SIZE+half_block_size, 34.f, y + by*WORLD_BLOCK_SIZE+half_block_size}, 64, 66, 64, BLUE); + }break; + case BLOCK_FLAG_HAZARD:{ + DrawCubeWires((Vector3){x + bx*WORLD_BLOCK_SIZE+half_block_size, 16.667f, y + by*WORLD_BLOCK_SIZE+half_block_size}, 64, 33, 64, RED); + }break; } } } @@ -72,7 +90,12 @@ void DEBUG_draw_overlay(uint64_t key, entity_view * data) { extern bool inv_is_open; void DEBUG_draw_entities(uint64_t key, entity_view * data) { + world_view *view = game_world_view_get_active(); float size = 16.f; + uint16_t ground_offset = 30; + float bl_size = (float)(view->chunk_size * WORLD_BLOCK_SIZE); + float half_size = bl_size / 2.0f; + float half_block_size = (float)(WORLD_BLOCK_SIZE >> 1); switch (data->kind) { case EKIND_DEMO_NPC: { @@ -86,7 +109,8 @@ void DEBUG_draw_entities(uint64_t key, entity_view * data) { float y = data->y; float health = (data->hp / data->max_hp); DrawNametag("Player", key, data, x, y); - DrawCircleEco(x, y, size, ColorAlpha(YELLOW, data->tran_time)); + // DrawCircleEco(x, y, size, ColorAlpha(YELLOW, data->tran_time)); + DrawSphere((Vector3){x,ground_offset,y}, size, ColorAlpha(YELLOW, data->tran_time)); if (data->has_items && !data->inside_vehicle) { float ix = data->x; @@ -109,7 +133,24 @@ void DEBUG_draw_entities(uint64_t key, entity_view * data) { 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)); + // DrawTexturePro(GetSpriteTexture2D(assets_find(data->asset)), ASSET_SRC_RECT(), ASSET_DST_RECT(x,y), (Vector2){0.5f,0.5f}, 0.0f, ALPHA(WHITE)); + // DrawCubeTexture(GetSpriteTexture2D(assets_find(data->asset)), (Vector3){x + half_block_size, 32.0f, y + half_block_size}, 64, 0.01f, 64, WHITE); + DrawSpriteTextureEco(GetSpriteTexture2D(assets_find(data->asset)), (Vector3){x + half_block_size, half_block_size/2, y + half_block_size}, 32, 0.01f, 32, WHITE); + + if (data->quantity > 1) { + DrawTextEco(zpl_bprintf("%d", data->quantity), x, y, 10, ALPHA(RAYWHITE), 0.0f); + } + + if (data->durability < 1.0f) { + DrawRectangleEco(x, y+32, 4, 32, BlendColor(RED, GREEN, data->durability)); + DrawRectangleEco(x, y+32, 4, 32*(1.0f-data->durability), ColorAlpha(BLACK, 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)); + DrawSpriteTextureEco(GetSpriteTexture2D(assets_find(data->asset)), (Vector3){x + half_block_size, half_block_size/2, y + half_block_size}, 64, 0.01f, 64, WHITE); if (data->quantity > 1) { DrawTextEco(zpl_bprintf("%d", data->quantity), x, y, 10, ALPHA(RAYWHITE), 0.0f); @@ -156,17 +197,28 @@ void DEBUG_draw_entities_low(uint64_t key, entity_view * data) { } void renderer_draw(void) { - render_camera.offset = (Vector2){(float)(screenWidth >> 1), (float)(screenHeight >> 1)}; - render_camera.zoom = zpl_lerp(render_camera.zoom, target_zoom, GetFrameTime()*2.9978f); + cam_zoom = zpl_min(zpl_lerp(cam_zoom, target_zoom, GetFrameTime()*2.18f), 9.98f); camera_update(); camera game_camera = camera_get(); - render_camera.target = (Vector2){(float)game_camera.x, (float)game_camera.y}; - zoom_overlay_tran = zpl_lerp(zoom_overlay_tran, (target_zoom <= CAM_OVERLAY_ZOOM_LEVEL) ? 1.0f : 0.0f, GetFrameTime()*2.0f); +#if 1 + render_camera.position = (Vector3){(float)game_camera.x, 260.0f*(10.0f-cam_zoom), (float)game_camera.y+50.0f*(10.0f-cam_zoom/2.0f)}; + render_camera.target = (Vector3){(float)game_camera.x, 0.0f, (float)game_camera.y}; +#else + UpdateCamera(&render_camera); +#endif + + // render_camera.offset = (Vector2){(float)(screenWidth >> 1), (float)(screenHeight >> 1)}; + // render_camera.zoom = zpl_lerp(render_camera.zoom, target_zoom, GetFrameTime()*2.9978f); + // camera_update(); + + // camera game_camera = camera_get(); + // render_camera.target = (Vector2){(float)game_camera.x, (float)game_camera.y}; + // zoom_overlay_tran = zpl_lerp(zoom_overlay_tran, (target_zoom <= CAM_OVERLAY_ZOOM_LEVEL) ? 1.0f : 0.0f, GetFrameTime()*2.0f); ClearBackground(GetColor(0x222034)); - BeginMode2D(render_camera); + BeginMode3D(render_camera); game_world_view_active_entity_map(DEBUG_draw_ground); game_world_view_active_entity_map(DEBUG_draw_entities_low); game_world_view_active_entity_map(DEBUG_draw_entities); @@ -174,18 +226,22 @@ void renderer_draw(void) { if (zoom_overlay_tran > 0.02f) { game_world_view_active_entity_map(DEBUG_draw_overlay); } - EndMode2D(); + EndMode3D(); } float renderer_zoom_get(void) { - return render_camera.zoom; + return 1.0f;//render_camera.zoom; } void renderer_init(void) { - render_camera.target = (Vector2){0.0f,0.0f}; - render_camera.offset = (Vector2){(float)(screenWidth >> 1), (float)(screenHeight >> 1)}; - render_camera.rotation = 0.0f; - render_camera.zoom = 2.9f; + // render_camera.target = (Vector2){0.0f,0.0f}; + // render_camera.offset = (Vector2){(float)(screenWidth >> 1), (float)(screenHeight >> 1)}; + // render_camera.rotation = 0.0f; + // render_camera.zoom = 2.9f; + + render_camera.up = (Vector3){0.0f,0.0f,-1.0f}; + render_camera.fovy = 45.f; + render_camera.projection = CAMERA_PERSPECTIVE; // NOTE(zaklaus): Paint the screen before we load the game // TODO(zaklaus): Render a cool loading screen background maybe? :wink: :wink: @@ -208,7 +264,7 @@ void renderer_shutdown(void) { } void renderer_debug_draw(void) { - BeginMode2D(render_camera); + BeginMode3D(render_camera); debug_draw_queue *que = debug_draw_samples(); for (size_t i = 0; i < que->num_entries; i += 1) { @@ -244,16 +300,16 @@ void renderer_debug_draw(void) { } } - EndMode2D(); + EndMode3D(); } void renderer_draw_single(float x, float y, asset_id id, Color color) { - BeginMode2D(render_camera); + BeginMode3D(render_camera); x -= 32.0f; y -= 32.0f; DrawTexturePro(GetSpriteTexture2D(assets_find(id)), ASSET_SRC_RECT(), ASSET_DST_RECT(x,y), (Vector2){0.5f,0.5f}, 0.0f, color); - EndMode2D(); + EndMode3D(); }