diff options
Diffstat (limited to 'source/windowing/StarPortraitWidget.cpp')
-rw-r--r-- | source/windowing/StarPortraitWidget.cpp | 117 |
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)); + } + } +} + +} |