[jasper/world] Double the dimensions of collision tiles

This commit is contained in:
2024-01-28 11:36:02 -06:00
parent aa1f063a6d
commit e733bc930f
5 changed files with 25 additions and 23 deletions

View File

@ -25,6 +25,8 @@ oxModelBegin(PaletteCycle)
oxModelEnd() oxModelEnd()
using CollisionMap = uint32_t;
struct WorldObject { struct WorldObject {
static constexpr auto TypeName = "net.drinkingtea.jasper.world.WorldObject"; static constexpr auto TypeName = "net.drinkingtea.jasper.world.WorldObject";
static constexpr auto TypeVersion = 1; static constexpr auto TypeVersion = 1;
@ -33,7 +35,7 @@ struct WorldObject {
ox::String name; ox::String name;
uint16_t palBank{}; uint16_t palBank{};
ncore::SubSheetId subsheetId{}; ncore::SubSheetId subsheetId{};
uint64_t collisionMap{}; CollisionMap collisionMap{};
}; };
oxModelBegin(WorldObject) oxModelBegin(WorldObject)

View File

@ -6,8 +6,9 @@
namespace jasper::world { namespace jasper::world {
uint64_t mapIdx(auto x, auto y) noexcept { CollisionMap mapIdx(auto x, auto y) noexcept {
return static_cast<uint64_t>(y) * 8 + static_cast<uint64_t>(x); return static_cast<CollisionMap>(y) * static_cast<CollisionMap>(sizeof(CollisionMap))
+ static_cast<CollisionMap>(x);
} }
const glutils::ProgramSource CollisionView::s_programSrc = { const glutils::ProgramSource CollisionView::s_programSrc = {
@ -61,7 +62,7 @@ ox::Error CollisionView::setup(
int const w, int const w,
int h, int h,
uint_t tile, uint_t tile,
uint64_t colMap) noexcept { CollisionMap colMap) noexcept {
m_subsheetTilesWidth = w; m_subsheetTilesWidth = w;
m_subsheetTilesHeight = h; m_subsheetTilesHeight = h;
m_sheetTileStart = tile; m_sheetTileStart = tile;
@ -75,7 +76,6 @@ ox::Error CollisionView::setup(
void CollisionView::draw() noexcept { void CollisionView::draw() noexcept {
glutils::FrameBufferBind const frameBufferBind(m_frameBuffer); glutils::FrameBufferBind const frameBufferBind(m_frameBuffer);
ncore::gl::draw(*m_nctx, s_scale); ncore::gl::draw(*m_nctx, s_scale);
//glViewport(0, 0, m_frameBuffer.width, m_frameBuffer.height);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glUseProgram(m_shader); glUseProgram(m_shader);
@ -103,14 +103,12 @@ void CollisionView::setPixelBufferObject(
bool const selected, bool const selected,
float *vbo, float *vbo,
GLuint *ebo) const noexcept { GLuint *ebo) const noexcept {
auto constexpr xmod = static_cast<float>(ncore::TileWidth) / 240.f * 2; auto constexpr xmod = static_cast<float>(ncore::TileWidth) / 240.f * 4;
auto constexpr ymod = static_cast<float>(ncore::TileHeight) / 160.f * 2; auto constexpr ymod = static_cast<float>(ncore::TileHeight) / 160.f * 4;
x *= xmod; x *= xmod;
y *= -ymod; y *= -ymod;
x -= 1.0f; x -= 1.0f;
y += 1.0f - ymod; y += 1.0f - ymod;
//x = -1;
//y = -1;
auto const selection = 1.f * static_cast<float>(selected); auto const selection = 1.f * static_cast<float>(selected);
// don't worry, these memcpys gets optimized to something much more ideal // don't worry, these memcpys gets optimized to something much more ideal
std::array const vertices{ std::array const vertices{
@ -127,19 +125,19 @@ void CollisionView::setPixelBufferObject(
memcpy(ebo, elms.data(), sizeof(elms)); memcpy(ebo, elms.data(), sizeof(elms));
} }
bool CollisionView::click(ox::Vec2 const&pos, uint64_t &colMap) noexcept { bool CollisionView::click(ox::Vec2 const&pos, CollisionMap &colMap) noexcept {
auto const inMap = colMap; auto const inMap = colMap;
auto const x = static_cast<uint64_t>(pos.x * static_cast<float>(m_subsheetTilesWidth)); 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)); auto const y = static_cast<uint64_t>(pos.y * static_cast<float>(m_subsheetTilesHeight)) / 2;
uint64_t const idx = mapIdx(x, y); uint64_t const idx = mapIdx(x, y);
uint64_t const colOn = (colMap >> idx) & 1; CollisionMap const colOn = (colMap >> idx) & 1;
colMap ^= uint64_t{1} << idx; colMap ^= CollisionMap{1} << idx;
colMap |= static_cast<uint64_t>(!colOn) << idx; colMap |= static_cast<CollisionMap>(!colOn) << idx;
buildGlBuffers(colMap); buildGlBuffers(colMap);
return inMap != colMap; return inMap != colMap;
} }
void CollisionView::buildGlBuffers(uint64_t colMap) noexcept { void CollisionView::buildGlBuffers(CollisionMap colMap) noexcept {
auto const vboLength = static_cast<size_t>(s_programSrc.rowLen) * 4; auto const vboLength = static_cast<size_t>(s_programSrc.rowLen) * 4;
auto constexpr eboLength = 6; auto constexpr eboLength = 6;
auto const tileCnt = auto const tileCnt =

View File

@ -9,6 +9,8 @@
#include <studio/context.hpp> #include <studio/context.hpp>
#include <nostalgia/core/core.hpp> #include <nostalgia/core/core.hpp>
#include <jasper/world/worldobject.hpp>
namespace jasper::world { namespace jasper::world {
namespace ncore = nostalgia::core; namespace ncore = nostalgia::core;
@ -34,7 +36,7 @@ class CollisionView {
int w, int w,
int h, int h,
uint_t tile, uint_t tile,
uint64_t colMap) noexcept; CollisionMap colMap) noexcept;
void draw() noexcept; void draw() noexcept;
@ -54,10 +56,10 @@ class CollisionView {
/** /**
* @return true if colMap changes * @return true if colMap changes
*/ */
bool click(ox::Vec2 const&pos, uint64_t &colMap) noexcept; bool click(ox::Vec2 const&pos, CollisionMap &colMap) noexcept;
private: private:
void buildGlBuffers(uint64_t colMap) noexcept; void buildGlBuffers(CollisionMap colMap) noexcept;
}; };

View File

@ -89,7 +89,7 @@ int EditObjectPalette::commandId() const noexcept {
} }
EditObjectCollisionMap::EditObjectCollisionMap(WorldObjectSet &doc, size_t objIdx, uint64_t colMap) noexcept: EditObjectCollisionMap::EditObjectCollisionMap(WorldObjectSet &doc, size_t objIdx, CollisionMap colMap) noexcept:
m_doc(doc), m_doc(doc),
m_objIdx(objIdx), m_objIdx(objIdx),
m_oldVal(m_doc.objects[m_objIdx].collisionMap), m_oldVal(m_doc.objects[m_objIdx].collisionMap),

View File

@ -59,10 +59,10 @@ class EditObjectCollisionMap: public studio::UndoCommand {
private: private:
WorldObjectSet &m_doc; WorldObjectSet &m_doc;
size_t const m_objIdx{}; size_t const m_objIdx{};
uint64_t const m_oldVal{}; CollisionMap const m_oldVal{};
uint64_t const m_newVal{}; CollisionMap const m_newVal{};
public: public:
EditObjectCollisionMap(WorldObjectSet &doc, size_t objIdx, uint64_t colMap) noexcept; EditObjectCollisionMap(WorldObjectSet &doc, size_t objIdx, CollisionMap colMap) noexcept;
void redo() noexcept override; void redo() noexcept override;
void undo() noexcept override; void undo() noexcept override;
[[nodiscard]] [[nodiscard]]