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

summaryrefslogtreecommitdiff
path: root/source/windowing/StarPortraitWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/windowing/StarPortraitWidget.cpp')
-rw-r--r--source/windowing/StarPortraitWidget.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/source/windowing/StarPortraitWidget.cpp b/source/windowing/StarPortraitWidget.cpp
new file mode 100644
index 0000000..0966919
--- /dev/null
+++ b/source/windowing/StarPortraitWidget.cpp
@@ -0,0 +1,117 @@
+#include "StarPortraitWidget.hpp"
+#include "StarJsonExtra.hpp"
+#include "StarRoot.hpp"
+#include "StarImageMetadataDatabase.hpp"
+#include "StarAssets.hpp"
+
+namespace Star {
+
+PortraitWidget::PortraitWidget(PortraitEntityPtr entity, PortraitMode mode) : m_entity(entity), m_portraitMode(mode) {
+ m_scale = 1;
+ m_iconMode = false;
+
+ init();
+}
+
+PortraitWidget::PortraitWidget() {
+ m_entity = {};
+ m_portraitMode = PortraitMode::Full;
+ m_scale = 1;
+ m_iconMode = false;
+
+ init();
+}
+
+RectI PortraitWidget::getScissorRect() const {
+ return noScissor();
+}
+
+void PortraitWidget::renderImpl() {
+ auto imgMetadata = Root::singleton().imageMetadataDatabase();
+
+ Vec2I offset = Vec2I();
+ if (m_iconMode) {
+ auto imgSize = Vec2F(imgMetadata->imageSize(m_iconImage));
+ offset = Vec2I(m_scale * imgSize / 2);
+ offset += m_iconOffset;
+ context()->drawInterfaceQuad(m_iconImage, Vec2F(screenPosition()), m_scale);
+ }
+ if (m_entity) {
+ List<Drawable> portrait = m_entity->portrait(m_portraitMode);
+ for (auto i : portrait) {
+ i.scale(m_scale);
+ context()->drawInterfaceDrawable(i, Vec2F(screenPosition() + offset));
+ }
+ } else {
+ if (m_portraitMode == PortraitMode::Bust || m_portraitMode == PortraitMode::Head) {
+ Vec2I pos = offset;
+ auto imgSize = Vec2F(imgMetadata->imageSize(m_noEntityImagePart));
+ pos -= Vec2I(m_scale * imgSize * 0.5);
+ context()->drawInterfaceQuad(m_noEntityImagePart, Vec2F(screenPosition() + pos), m_scale);
+ } else {
+ Vec2I pos = offset;
+ auto imgSize = Vec2F(imgMetadata->imageSize(m_noEntityImageFull));
+ pos -= Vec2I(m_scale * imgSize * 0.5);
+ context()->drawInterfaceQuad(m_noEntityImageFull, Vec2F(screenPosition() + pos), m_scale);
+ }
+ }
+}
+
+void PortraitWidget::init() {
+ auto assets = Root::singleton().assets();
+
+ m_noEntityImageFull = assets->json("/interface.config:portraitNullPlayerImageFull").toString();
+ m_noEntityImagePart = assets->json("/interface.config:portraitNullPlayerImagePart").toString();
+ m_iconImage = assets->json("/interface.config:portraitIconImage").toString();
+ m_iconOffset = jsonToVec2I(assets->json("/interface.config:portraitIconOffset"));
+
+ updateSize();
+}
+
+void PortraitWidget::setEntity(PortraitEntityPtr entity) {
+ m_entity = entity;
+ updateSize();
+}
+
+void PortraitWidget::setMode(PortraitMode mode) {
+ m_portraitMode = mode;
+ updateSize();
+}
+
+void PortraitWidget::setScale(float scale) {
+ m_scale = scale;
+ updateSize();
+}
+
+void PortraitWidget::setIconMode() {
+ m_iconMode = true;
+ updateSize();
+}
+
+bool PortraitWidget::sendEvent(InputEvent const&) {
+ return false;
+}
+
+void PortraitWidget::updateSize() {
+ auto imgMetadata = Root::singleton().imageMetadataDatabase();
+
+ if (m_iconMode) {
+ setSize(Vec2I(imgMetadata->imageSize(m_iconImage) * m_scale));
+ } else {
+ if (m_entity) {
+ setSize(Vec2I(
+ (Drawable::boundBoxAll(m_entity->portrait(m_portraitMode), false)
+ .size()
+ * TilePixels
+ * m_scale)
+ .ceil()));
+ } else {
+ if (m_portraitMode == PortraitMode::Bust || m_portraitMode == PortraitMode::Head)
+ setSize(Vec2I(imgMetadata->imageSize(m_iconImage) * m_scale));
+ else
+ setSize(Vec2I(imgMetadata->imageSize(m_noEntityImageFull) * m_scale));
+ }
+ }
+}
+
+}