diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-08-20 18:56:50 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-08-20 18:56:50 +1000 |
commit | 6e7c0498ef18ea558621eb7ca98f91122a55e6a6 (patch) | |
tree | e967d03fbd3222f21e102ec608dc42eb811a990f /source/game/items | |
parent | 0bb0bd30b00a8c9dd5ee6c0398908ba9d7f057ae (diff) |
Hook tile meshing up to Material Item drop and preview
Diffstat (limited to 'source/game/items')
-rw-r--r-- | source/game/items/StarLiquidItem.cpp | 2 | ||||
-rw-r--r-- | source/game/items/StarLiquidItem.hpp | 2 | ||||
-rw-r--r-- | source/game/items/StarMaterialItem.cpp | 62 | ||||
-rw-r--r-- | source/game/items/StarMaterialItem.hpp | 11 | ||||
-rw-r--r-- | source/game/items/StarTools.cpp | 4 | ||||
-rw-r--r-- | source/game/items/StarTools.hpp | 4 |
6 files changed, 71 insertions, 14 deletions
diff --git a/source/game/items/StarLiquidItem.cpp b/source/game/items/StarLiquidItem.cpp index 08e202f..2e887aa 100644 --- a/source/game/items/StarLiquidItem.cpp +++ b/source/game/items/StarLiquidItem.cpp @@ -85,7 +85,7 @@ float LiquidItem::liquidQuantity() const { return m_quantity; } -List<PreviewTile> LiquidItem::preview(bool shifting) const { +List<PreviewTile> LiquidItem::previewTiles(bool shifting) const { List<PreviewTile> result; if (initialized()) { auto liquid = liquidId(); diff --git a/source/game/items/StarLiquidItem.hpp b/source/game/items/StarLiquidItem.hpp index 03a73cd..b4c4cfc 100644 --- a/source/game/items/StarLiquidItem.hpp +++ b/source/game/items/StarLiquidItem.hpp @@ -28,7 +28,7 @@ public: LiquidId liquidId() const; float liquidQuantity() const; - List<PreviewTile> preview(bool shifting) const override; + List<PreviewTile> previewTiles(bool shifting) const override; bool canPlace(bool shifting) const; bool canPlaceAtTile(Vec2I pos) const; diff --git a/source/game/items/StarMaterialItem.cpp b/source/game/items/StarMaterialItem.cpp index f2f15da..2740eb7 100644 --- a/source/game/items/StarMaterialItem.cpp +++ b/source/game/items/StarMaterialItem.cpp @@ -8,6 +8,7 @@ #include "StarWorldClient.hpp" #include "StarWorldTemplate.hpp" #include "StarInput.hpp" +#include "StarTileDrawer.hpp" namespace Star { @@ -17,6 +18,7 @@ MaterialItem::MaterialItem(Json const& config, String const& directory, Json con : Item(config, directory, settings), FireableItem(config), BeamItem(config) { m_material = config.getInt("materialId"); m_materialHueShift = materialHueFromDegrees(instanceValue("materialHueShift", 0).toFloat()); + auto materialDatabase = Root::singleton().materialDatabase(); if (materialHueShift() != MaterialHue()) { auto drawables = iconDrawables(); @@ -36,7 +38,6 @@ MaterialItem::MaterialItem(Json const& config, String const& directory, Json con m_blockRadius = instanceValue("blockRadius", defaultParameters.getFloat("blockRadius")).toFloat(); m_altBlockRadius = instanceValue("altBlockRadius", defaultParameters.getFloat("altBlockRadius")).toFloat(); - auto materialDatabase = Root::singleton().materialDatabase(); auto multiplace = instanceValue("allowMultiplace", BlockCollisionSet.contains(materialDatabase->materialCollisionKind(m_material))); if (multiplace.isType(Json::Type::Bool)) m_multiplace = multiplace.toBool(); @@ -96,16 +97,16 @@ void MaterialItem::update(float dt, FireMode fireMode, bool shifting, HashSet<Mo owner()->addSound("/sfx/tools/cyclematcollision.ogg", 1.0f, Random::randf(0.9f, 1.1f)); } - if (auto presses = input.bindDown("opensb", "materialRadiusGrow")) { + if (auto presses = input.bindDown("opensb", "buildingRadiusGrow")) { m_blockRadius = min(BlockRadiusLimit, int(m_blockRadius + *presses)); setInstanceValue("blockRadius", m_blockRadius); - owner()->addSound("/sfx/tools/matradiusgrow.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit); + owner()->addSound("/sfx/tools/buildradiusgrow.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit); } - if (auto presses = input.bindDown("opensb", "materialRadiusShrink")) { + if (auto presses = input.bindDown("opensb", "buildingRadiusShrink")) { m_blockRadius = max(1, int(m_blockRadius - *presses)); setInstanceValue("blockRadius", m_blockRadius); - owner()->addSound("/sfx/tools/matradiusshrink.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit); + owner()->addSound("/sfx/tools/buildradiusshrink.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit); } } else { @@ -148,6 +149,14 @@ void MaterialItem::render(RenderCallback* renderCallback, EntityRenderLayer rend } } +List<Drawable> MaterialItem::preview(PlayerPtr const&) const { + return generatedPreview(); +} + +List<Drawable> MaterialItem::dropDrawables() const { + return generatedPreview(); +} + List<Drawable> MaterialItem::nonRotatedDrawables() const { return beamDrawables(canPlace(m_shifting)); } @@ -218,6 +227,47 @@ MaterialId MaterialItem::materialId() const { return m_material; } +List<Drawable> const& MaterialItem::generatedPreview(Vec2I position) const { + if (!m_generatedPreviewCache) { + if (TileDrawer* tileDrawer = TileDrawer::singletonPtr()) { + auto locker = tileDrawer->lockRenderData(); + WorldRenderData& renderData = tileDrawer->renderData(); + renderData.geometry = WorldGeometry(3, 3); + renderData.tiles.resize({ 3, 3 }); + renderData.tiles.fill(TileDrawer::DefaultRenderTile); + renderData.tileMinPosition = { 0, 0 }; + RenderTile& tile = renderData.tiles.at({ 1, 1 }); + tile.foreground = m_material; + tile.foregroundHueShift = m_materialHueShift; + tile.foregroundColorVariant = 0; + + List<Drawable> drawables; + TileDrawer::Drawables tileDrawables; + bool isBlock = BlockCollisionSet.contains(Root::singleton().materialDatabase()->materialCollisionKind(m_material)); + TileDrawer::TerrainLayer layer = isBlock ? TileDrawer::TerrainLayer::Foreground : TileDrawer::TerrainLayer::Midground; + for (int x = 0; x != 3; ++x) { + for (int y = 0; y != 3; ++y) + tileDrawer->produceTerrainDrawables(tileDrawables, layer, { x, y }, renderData, 1.0f / TilePixels, position - Vec2I(1, 1)); + } + + locker.unlock(); + for (auto& index : tileDrawables.keys()) + drawables.appendAll(tileDrawables.take(index)); + + auto boundBox = Drawable::boundBoxAll(drawables, true); + if (!boundBox.isEmpty()) { + for (auto& drawable : drawables) + drawable.translate(-boundBox.center()); + } + + m_generatedPreviewCache.emplace(move(drawables)); + } + else + m_generatedPreviewCache.emplace(iconDrawables()); + } + return *m_generatedPreviewCache; +} + float MaterialItem::calcRadius(bool shifting) const { if (!multiplaceEnabled()) return 1; @@ -270,7 +320,7 @@ TileCollisionOverride& MaterialItem::collisionOverride() { return m_collisionOverride; } -List<PreviewTile> MaterialItem::preview(bool shifting) const { +List<PreviewTile> MaterialItem::previewTiles(bool shifting) const { List<PreviewTile> result; if (initialized()) { Color lightColor = Color::rgba(owner()->favoriteColor()); diff --git a/source/game/items/StarMaterialItem.hpp b/source/game/items/StarMaterialItem.hpp index 05f9e08..363d248 100644 --- a/source/game/items/StarMaterialItem.hpp +++ b/source/game/items/StarMaterialItem.hpp @@ -7,13 +7,15 @@ #include "StarEntityRendering.hpp" #include "StarPreviewTileTool.hpp" #include "StarRenderableItem.hpp" +#include "StarPreviewableItem.hpp" #include "StarCollisionBlock.hpp" namespace Star { STAR_CLASS(MaterialItem); +STAR_CLASS(Player); -class MaterialItem : public Item, public FireableItem, public PreviewTileTool, public RenderableItem, public BeamItem { +class MaterialItem : public Item, public FireableItem, public PreviewTileTool, public RenderableItem, public PreviewableItem, public BeamItem { public: MaterialItem(Json const& config, String const& directory, Json const& settings); virtual ~MaterialItem() {} @@ -25,6 +27,8 @@ public: void update(float dt, FireMode fireMode, bool shifting, HashSet<MoveControlType> const& moves) override; void render(RenderCallback* renderCallback, EntityRenderLayer renderLayer) override; + virtual List<Drawable> preview(PlayerPtr const& viewer = {}) const override; + virtual List<Drawable> dropDrawables() const override; List<Drawable> nonRotatedDrawables() const override; void fire(FireMode mode, bool shifting, bool edgeTriggered) override; @@ -40,7 +44,8 @@ public: float& altBlockRadius(); TileCollisionOverride& collisionOverride(); - List<PreviewTile> preview(bool shifting) const override; + List<PreviewTile> previewTiles(bool shifting) const override; + List<Drawable> const& generatedPreview(Vec2I position = {}) const; private: float calcRadius(bool shifting) const; List<Vec2I>& tileArea(float radius, Vec2F const& position) const; @@ -60,6 +65,8 @@ private: mutable Vec2F m_lastTileAreaOriginCache; mutable float m_lastTileAreaRadiusCache; mutable List<Vec2I> m_tileAreasCache; + + mutable Maybe<List<Drawable>> m_generatedPreviewCache; }; } diff --git a/source/game/items/StarTools.cpp b/source/game/items/StarTools.cpp index 602e554..7faaeae 100644 --- a/source/game/items/StarTools.cpp +++ b/source/game/items/StarTools.cpp @@ -360,7 +360,7 @@ void BeamMiningTool::setEnd(EndType) { m_endType = EndType::Object; } -List<PreviewTile> BeamMiningTool::preview(bool shifting) const { +List<PreviewTile> BeamMiningTool::previewTiles(bool shifting) const { List<PreviewTile> result; auto ownerp = owner(); auto worldp = world(); @@ -636,7 +636,7 @@ void PaintingBeamTool::update(float dt, FireMode fireMode, bool shifting, HashSe FireableItem::update(dt, fireMode, shifting, moves); } -List<PreviewTile> PaintingBeamTool::preview(bool shifting) const { +List<PreviewTile> PaintingBeamTool::previewTiles(bool shifting) const { List<PreviewTile> result; auto ownerp = owner(); auto worldp = world(); diff --git a/source/game/items/StarTools.hpp b/source/game/items/StarTools.hpp index fbe79a0..75cdcaf 100644 --- a/source/game/items/StarTools.hpp +++ b/source/game/items/StarTools.hpp @@ -150,7 +150,7 @@ public: List<Drawable> drawables() const override; virtual void setEnd(EndType type) override; - virtual List<PreviewTile> preview(bool shifting) const override; + virtual List<PreviewTile> previewTiles(bool shifting) const override; virtual List<Drawable> nonRotatedDrawables() const override; virtual void fire(FireMode mode, bool shifting, bool edgeTriggered) override; @@ -219,7 +219,7 @@ public: void setEnd(EndType type) override; void update(float dt, FireMode fireMode, bool shifting, HashSet<MoveControlType> const& moves) override; - List<PreviewTile> preview(bool shifting) const override; + List<PreviewTile> previewTiles(bool shifting) const override; void init(ToolUserEntity* owner, ToolHand hand) override; List<Drawable> nonRotatedDrawables() const override; void fire(FireMode mode, bool shifting, bool edgeTriggered) override; |