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

summaryrefslogtreecommitdiff
path: root/source/windowing/StarPortraitWidget.cpp
blob: 9341d55431b34b0839624fea39e3f3ecc101aa8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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));
    }
  }
}

}