[jasper/world] Double the dimensions of collision tiles
This commit is contained in:
@ -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)
|
||||||
|
@ -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 =
|
||||||
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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),
|
||||||
|
@ -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]]
|
||||||
|
Reference in New Issue
Block a user