Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/items
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-08-20 18:56:50 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-08-20 18:56:50 +1000
commit6e7c0498ef18ea558621eb7ca98f91122a55e6a6 (patch)
treee967d03fbd3222f21e102ec608dc42eb811a990f /source/game/items
parent0bb0bd30b00a8c9dd5ee6c0398908ba9d7f057ae (diff)
Hook tile meshing up to Material Item drop and preview
Diffstat (limited to 'source/game/items')
-rw-r--r--source/game/items/StarLiquidItem.cpp2
-rw-r--r--source/game/items/StarLiquidItem.hpp2
-rw-r--r--source/game/items/StarMaterialItem.cpp62
-rw-r--r--source/game/items/StarMaterialItem.hpp11
-rw-r--r--source/game/items/StarTools.cpp4
-rw-r--r--source/game/items/StarTools.hpp4
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;