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

summaryrefslogtreecommitdiff
path: root/source/frontend/StarQuestIndicatorPainter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/frontend/StarQuestIndicatorPainter.cpp')
-rw-r--r--source/frontend/StarQuestIndicatorPainter.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/source/frontend/StarQuestIndicatorPainter.cpp b/source/frontend/StarQuestIndicatorPainter.cpp
new file mode 100644
index 0000000..d144021
--- /dev/null
+++ b/source/frontend/StarQuestIndicatorPainter.cpp
@@ -0,0 +1,67 @@
+#include "StarQuestIndicatorPainter.hpp"
+#include "StarAssets.hpp"
+#include "StarGuiContext.hpp"
+#include "StarQuestManager.hpp"
+#include "StarWorldClient.hpp"
+#include "StarUniverseClient.hpp"
+
+namespace Star {
+
+QuestIndicatorPainter::QuestIndicatorPainter(UniverseClientPtr const& client) {
+ m_client = client;
+}
+
+AnimationPtr indicatorAnimation(String indicatorPath) {
+ auto assets = Root::singleton().assets();
+ return make_shared<Animation>(assets->json(indicatorPath), indicatorPath);
+}
+
+void QuestIndicatorPainter::update(WorldClientPtr const& world, WorldCamera const& camera) {
+ m_camera = camera;
+
+ Set<EntityId> foundIndicators;
+ for (auto const& entity : world->query<Entity>(camera.worldScreenRect())) {
+ auto indicator = m_client->questManager()->getQuestIndicator(entity);
+ if (!indicator) continue;
+
+ foundIndicators.insert(entity->entityId());
+ Vec2F screenPos = camera.worldToScreen(indicator->worldPosition);
+
+ if (auto currentIndicator = m_indicators.ptr(entity->entityId())) {
+ currentIndicator->screenPos = screenPos;
+ if (currentIndicator->indicatorName == indicator->indicatorImage) {
+ currentIndicator->animation->update(WorldTimestep);
+ } else {
+ currentIndicator->indicatorName = indicator->indicatorImage;
+ currentIndicator->animation = indicatorAnimation(indicator->indicatorImage);
+ }
+ } else {
+ m_indicators[entity->entityId()] = Indicator {
+ entity->entityId(),
+ screenPos,
+ indicator->indicatorImage,
+ indicatorAnimation(indicator->indicatorImage)
+ };
+ }
+ }
+
+ m_indicators = Map<EntityId, Indicator>::from(m_indicators.pairs().filtered([&foundIndicators](pair<EntityId, Indicator> indicator) {
+ return foundIndicators.contains(indicator.first);
+ }));
+}
+
+Drawable QuestIndicatorPainter::Indicator::render(float pixelRatio) const {
+ return animation->drawable(pixelRatio);
+}
+
+void QuestIndicatorPainter::render() {
+ auto& context = GuiContext::singleton();
+
+ for (auto const& indicator : m_indicators.values()) {
+ Drawable drawable = indicator.render(m_camera.pixelRatio());
+ drawable.fullbright = true;
+ context.drawDrawable(drawable, Vec2F(indicator.screenPos), 1, Vec4B(255, 255, 255, 255));
+ }
+}
+
+}