Files
jasper/src/jasper/modules/world/src/studio/worldobjectseteditor/collisionmapview.cpp
Gary Talent e2e5240bae
All checks were successful
Build / build (push) Successful in 3m52s
[jasper] Run liccor
2025-01-08 22:47:42 -06:00

79 lines
2.3 KiB
C++

/*
* Copyright 2023 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include "collisionmapview.hpp"
namespace jasper::world {
CollisionMap mapIdx(auto x, auto y) noexcept {
return static_cast<CollisionMap>(y) * static_cast<CollisionMap>(sizeof(CollisionMap))
+ static_cast<CollisionMap>(x);
}
CollisionView::CollisionView(studio::StudioContext &sctx):
m_nctx(ncore::init(sctx.tctx, {
.glInstallDrawer = false,
.glSpriteCount = 0,
}).unwrapThrow()),
m_frameBuffer(glutils::generateFrameBuffer(240 * s_scale, 160 * s_scale)) {
}
ox::Error CollisionView::setup(
ox::FileAddress const&tsAddr,
ox::FileAddress const&palAddr,
int const w,
int const h,
uint_t tile,
CollisionMap colMap) noexcept {
m_subsheetTilesWidth = w;
m_subsheetTilesHeight = h;
m_sheetTileStart = tile;
ncore::setBgStatus(*m_nctx, 0, true);
OX_RETURN_ERROR(ncore::loadBgTileSheet(*m_nctx, 0, tsAddr));
OX_RETURN_ERROR(ncore::loadBgPalette(*m_nctx, 0, palAddr));
OX_RETURN_ERROR(m_highlighter.setup({w / 2, h / 2}));
buildGlBuffers(colMap);
return {};
}
void CollisionView::draw() noexcept {
glutils::FrameBufferBind const frameBufferBind(m_frameBuffer);
ncore::gl::draw(*m_nctx, s_scale);
m_highlighter.draw();
}
int CollisionView::scale() const noexcept {
return s_scale;
}
glutils::FrameBuffer const&CollisionView::framebuffer() const noexcept {
return m_frameBuffer;
}
bool CollisionView::click(ox::Vec2 const&pos, CollisionMap &colMap) noexcept {
auto const inMap = colMap;
auto const x = static_cast<uint64_t>(pos.x * static_cast<float>(m_subsheetTilesWidth)) / 2;
auto const y = static_cast<uint64_t>(pos.y * static_cast<float>(m_subsheetTilesHeight)) / 2;
uint64_t const idx = mapIdx(x, y);
CollisionMap const colOn = (colMap >> idx) & 1;
colMap ^= CollisionMap{1} << idx;
colMap |= static_cast<CollisionMap>(!colOn) << idx;
buildGlBuffers(colMap);
return inMap != colMap;
}
void CollisionView::buildGlBuffers(CollisionMap colMap) noexcept {
auto tile = m_sheetTileStart;
for (auto y = 0; y < m_subsheetTilesHeight; ++y) {
for (auto x = 0; x < m_subsheetTilesWidth; ++x) {
ncore::setBgTile(*m_nctx, 0, x, y, tile);
auto const collidable = (colMap >> mapIdx(x, y)) & 1;
std::ignore = m_highlighter.setTileHighlight({x, y}, collidable);
++tile;
}
}
}
}