From 94639171643b632573f92e5198a2e76df405d4a2 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 30 Apr 2025 20:21:59 +0300 Subject: [PATCH] feat: 'stairs' rotation profile --- src/content/loading/BlockLoader.cpp | 2 ++ src/logic/PlayerController.cpp | 12 +++++++++++- src/voxels/Block.cpp | 16 ++++++++++++++++ src/voxels/Block.hpp | 4 ++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/content/loading/BlockLoader.cpp b/src/content/loading/BlockLoader.cpp index 5e3b09be..9569301b 100644 --- a/src/content/loading/BlockLoader.cpp +++ b/src/content/loading/BlockLoader.cpp @@ -122,6 +122,8 @@ template<> void ContentUnitLoader::loadUnit( def.rotations = BlockRotProfile::PIPE; } else if (profile == BlockRotProfile::PANE_NAME) { def.rotations = BlockRotProfile::PANE; + } else if (profile == BlockRotProfile::STAIRS_NAME) { + def.rotations = BlockRotProfile::STAIRS; } else if (profile != "none") { logger.error() << "unknown rotation profile " << profile; def.rotatable = false; diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index b157e5e5..080c04cf 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -345,6 +345,16 @@ static int determine_rotation( if (camDir.z > 0.0f) return BLOCK_DIR_SOUTH; if (camDir.z < 0.0f) return BLOCK_DIR_NORTH; } + } else if (name == "stairs") { + int verticalBit = ((norm.y - camDir.y * 0.5f) < 0.0) ? 4 : 0; + if (abs(camDir.x) > abs(camDir.z)) { + if (camDir.x > 0.0f) return BLOCK_DIR_EAST | verticalBit; + if (camDir.x < 0.0f) return BLOCK_DIR_WEST | verticalBit; + } + if (abs(camDir.x) < abs(camDir.z)) { + if (camDir.z > 0.0f) return BLOCK_DIR_SOUTH | verticalBit; + if (camDir.z < 0.0f) return BLOCK_DIR_NORTH | verticalBit; + } } } return 0; @@ -421,7 +431,7 @@ void PlayerController::processRightClick( auto camera = player.fpCamera.get(); blockstate state {}; - state.rotation = determine_rotation(&def, selection.normal, camera->dir); + state.rotation = determine_rotation(&def, selection.normal, camera->front); if (!input.shift && target.rt.funcsset.oninteract) { if (scripting::on_block_interact( diff --git a/src/voxels/Block.cpp b/src/voxels/Block.cpp index b7b0d836..39f8bf11 100644 --- a/src/voxels/Block.cpp +++ b/src/voxels/Block.cpp @@ -91,6 +91,22 @@ const BlockRotProfile BlockRotProfile::PANE { 4 }; +const BlockRotProfile BlockRotProfile::STAIRS { + "stairs", + { + {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}, // North + {{0, 0, -1}, {0, 1, 0}, {1, 0, 0}}, // East + {{-1, 0, 0}, {0, 1, 0}, {0, 0, -1}}, // South + {{0, 0, 1}, {0, 1, 0}, {-1, 0, 0}}, // West + + {{-1, 0, 0}, {0, -1, 0}, {0, 0, 1}}, + {{0, 0, 1}, {0, -1, 0}, {1, 0, 0}}, + {{1, 0, 0}, {0, -1, 0}, {0, 0, -1}}, + {{0, 0, -1}, {0, -1, 0}, {-1, 0, 0}}, + }, + 8 +}; + Block::Block(const std::string& name) : name(name), caption(util::id_to_caption(name)), diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index 378cbb5d..5d2d797d 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -77,8 +77,12 @@ struct BlockRotProfile { /// @brief Doors, signs and other panes static const BlockRotProfile PANE; + /// @brief Stairs, stairs and stairs + static const BlockRotProfile STAIRS; + static inline std::string PIPE_NAME = "pipe"; static inline std::string PANE_NAME = "pane"; + static inline std::string STAIRS_NAME = "stairs"; }; enum class BlockModelType {