[jasper/world] Double the dimensions of collision tiles
This commit is contained in:
@ -25,6 +25,8 @@ oxModelBegin(PaletteCycle)
|
||||
oxModelEnd()
|
||||
|
||||
|
||||
using CollisionMap = uint32_t;
|
||||
|
||||
struct WorldObject {
|
||||
static constexpr auto TypeName = "net.drinkingtea.jasper.world.WorldObject";
|
||||
static constexpr auto TypeVersion = 1;
|
||||
@ -33,7 +35,7 @@ struct WorldObject {
|
||||
ox::String name;
|
||||
uint16_t palBank{};
|
||||
ncore::SubSheetId subsheetId{};
|
||||
uint64_t collisionMap{};
|
||||
CollisionMap collisionMap{};
|
||||
};
|
||||
|
||||
oxModelBegin(WorldObject)
|
||||
|
@ -6,8 +6,9 @@
|
||||
|
||||
namespace jasper::world {
|
||||
|
||||
uint64_t mapIdx(auto x, auto y) noexcept {
|
||||
return static_cast<uint64_t>(y) * 8 + static_cast<uint64_t>(x);
|
||||
CollisionMap mapIdx(auto x, auto y) noexcept {
|
||||
return static_cast<CollisionMap>(y) * static_cast<CollisionMap>(sizeof(CollisionMap))
|
||||
+ static_cast<CollisionMap>(x);
|
||||
}
|
||||
|
||||
const glutils::ProgramSource CollisionView::s_programSrc = {
|
||||
@ -61,7 +62,7 @@ ox::Error CollisionView::setup(
|
||||
int const w,
|
||||
int h,
|
||||
uint_t tile,
|
||||
uint64_t colMap) noexcept {
|
||||
CollisionMap colMap) noexcept {
|
||||
m_subsheetTilesWidth = w;
|
||||
m_subsheetTilesHeight = h;
|
||||
m_sheetTileStart = tile;
|
||||
@ -75,7 +76,6 @@ ox::Error CollisionView::setup(
|
||||
void CollisionView::draw() noexcept {
|
||||
glutils::FrameBufferBind const frameBufferBind(m_frameBuffer);
|
||||
ncore::gl::draw(*m_nctx, s_scale);
|
||||
//glViewport(0, 0, m_frameBuffer.width, m_frameBuffer.height);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glUseProgram(m_shader);
|
||||
@ -103,14 +103,12 @@ void CollisionView::setPixelBufferObject(
|
||||
bool const selected,
|
||||
float *vbo,
|
||||
GLuint *ebo) const noexcept {
|
||||
auto constexpr xmod = static_cast<float>(ncore::TileWidth) / 240.f * 2;
|
||||
auto constexpr ymod = static_cast<float>(ncore::TileHeight) / 160.f * 2;
|
||||
auto constexpr xmod = static_cast<float>(ncore::TileWidth) / 240.f * 4;
|
||||
auto constexpr ymod = static_cast<float>(ncore::TileHeight) / 160.f * 4;
|
||||
x *= xmod;
|
||||
y *= -ymod;
|
||||
x -= 1.0f;
|
||||
y += 1.0f - ymod;
|
||||
//x = -1;
|
||||
//y = -1;
|
||||
auto const selection = 1.f * static_cast<float>(selected);
|
||||
// don't worry, these memcpys gets optimized to something much more ideal
|
||||
std::array const vertices{
|
||||
@ -127,19 +125,19 @@ void CollisionView::setPixelBufferObject(
|
||||
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 x = static_cast<uint64_t>(pos.x * static_cast<float>(m_subsheetTilesWidth));
|
||||
auto const y = static_cast<uint64_t>(pos.y * static_cast<float>(m_subsheetTilesHeight));
|
||||
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);
|
||||
uint64_t const colOn = (colMap >> idx) & 1;
|
||||
colMap ^= uint64_t{1} << idx;
|
||||
colMap |= static_cast<uint64_t>(!colOn) << idx;
|
||||
CollisionMap const colOn = (colMap >> idx) & 1;
|
||||
colMap ^= CollisionMap{1} << idx;
|
||||
colMap |= static_cast<CollisionMap>(!colOn) << idx;
|
||||
buildGlBuffers(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 constexpr eboLength = 6;
|
||||
auto const tileCnt =
|
||||
|
@ -9,6 +9,8 @@
|
||||
#include <studio/context.hpp>
|
||||
#include <nostalgia/core/core.hpp>
|
||||
|
||||
#include <jasper/world/worldobject.hpp>
|
||||
|
||||
namespace jasper::world {
|
||||
|
||||
namespace ncore = nostalgia::core;
|
||||
@ -34,7 +36,7 @@ class CollisionView {
|
||||
int w,
|
||||
int h,
|
||||
uint_t tile,
|
||||
uint64_t colMap) noexcept;
|
||||
CollisionMap colMap) noexcept;
|
||||
|
||||
void draw() noexcept;
|
||||
|
||||
@ -54,10 +56,10 @@ class CollisionView {
|
||||
/**
|
||||
* @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:
|
||||
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_objIdx(objIdx),
|
||||
m_oldVal(m_doc.objects[m_objIdx].collisionMap),
|
||||
|
@ -59,10 +59,10 @@ class EditObjectCollisionMap: public studio::UndoCommand {
|
||||
private:
|
||||
WorldObjectSet &m_doc;
|
||||
size_t const m_objIdx{};
|
||||
uint64_t const m_oldVal{};
|
||||
uint64_t const m_newVal{};
|
||||
CollisionMap const m_oldVal{};
|
||||
CollisionMap const m_newVal{};
|
||||
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 undo() noexcept override;
|
||||
[[nodiscard]]
|
||||
|
Reference in New Issue
Block a user