Swan::Animation(ctx.world.getSprite("core::entity/player-still"), 0.8), | Swan::Animation(ctx.world.getSprite("core::entity/player-still"), 0.8), | ||||
Swan::Animation( | Swan::Animation( | ||||
ctx.world.getSprite("core::entity/player-running"), | ctx.world.getSprite("core::entity/player-running"), | ||||
1, Cygnet::Mat3gf{}.scale({-1, 1})), | |||||
1, Cygnet::Mat3gf{}.scale({-1, 1}).translate({1, 0})), | |||||
Swan::Animation(ctx.world.getSprite("core::entity/player-running"), 1), | Swan::Animation(ctx.world.getSprite("core::entity/player-running"), 1), | ||||
} {} | } {} | ||||
return *this; | return *this; | ||||
} | } | ||||
constexpr Vec translation() { | |||||
return {at(2, 0), at(2, 1)}; | |||||
} | |||||
constexpr Matrix3<T> &scale(Vec vec) { | constexpr Matrix3<T> &scale(Vec vec) { | ||||
at(0, 0) *= vec.x; | at(0, 0) *= vec.x; | ||||
at(1, 1) *= vec.y; | at(1, 1) *= vec.y; | ||||
return *this; | return *this; | ||||
} | } | ||||
constexpr Vec scale() { | |||||
return {at(0, 0), at(1, 1)}; | |||||
} | |||||
constexpr Matrix3<T> &rotate(T rads) { | constexpr Matrix3<T> &rotate(T rads) { | ||||
T s = std::sin(rads); | T s = std::sin(rads); | ||||
T c = std::cos(rads); | T c = std::cos(rads); |
struct RenderCamera { | struct RenderCamera { | ||||
SwanCommon::Vec2 pos; | SwanCommon::Vec2 pos; | ||||
SwanCommon::Vec2i size; | SwanCommon::Vec2i size; | ||||
float zoom = 0; | |||||
float zoom = 1; | |||||
}; | }; | ||||
class Renderer { | class Renderer { | ||||
} | } | ||||
inline void Renderer::drawSpriteFlipped(RenderSprite sprite, SwanCommon::Vec2 pos, int frame) { | inline void Renderer::drawSpriteFlipped(RenderSprite sprite, SwanCommon::Vec2 pos, int frame) { | ||||
drawSprites_.push_back({Mat3gf{}.translate(pos).scale({ -1, 1 }), frame, sprite}); | |||||
// TODO: Translate X by sprite.scale.x? | |||||
drawSprites_.push_back({Mat3gf{}.translate(pos).scale({-1, 1}), frame, sprite}); | |||||
} | } | ||||
} | } |
} | } | ||||
void Animation::draw(const Vec2 &pos, Cygnet::Renderer &rnd) { | void Animation::draw(const Vec2 &pos, Cygnet::Renderer &rnd) { | ||||
rnd.drawSprite(sprite_, mat_, frame_); | |||||
rnd.drawSprite(sprite_, Cygnet::Mat3gf(mat_).translate(pos), frame_); | |||||
} | } | ||||
void Animation::reset() { | void Animation::reset() { |
void World::draw(Cygnet::Renderer &rnd) { | void World::draw(Cygnet::Renderer &rnd) { | ||||
ZoneScopedN("World draw"); | ZoneScopedN("World draw"); | ||||
game_->cam_.pos = player_->pos; // - (win.getSize() / 2) + (player_->size / 2); TODO | |||||
planes_[currentPlane_]->draw(rnd); | planes_[currentPlane_]->draw(rnd); | ||||
} | } | ||||
ZoneScopedN("World update"); | ZoneScopedN("World update"); | ||||
for (auto &plane: planes_) | for (auto &plane: planes_) | ||||
plane->update(dt); | plane->update(dt); | ||||
game_->cam_.pos = player_->pos + Vec2{0.5, 0.5}; // - (win.getSize() / 2) + (player_->size / 2); TODO | |||||
} | } | ||||
void World::tick(float dt) { | void World::tick(float dt) { |
y += 1 * dt; | y += 1 * dt; | ||||
} | } | ||||
rnd.drawChunk(chunk, { 0, 0 }); | |||||
rnd.drawChunk(chunk, {0, 0}); | |||||
rnd.drawSprite(playerSprite, { x, y }, (int)animAcc % 2); | |||||
cam.pos = { x + 0.5f, y + 0.5f }; | |||||
rnd.drawSprite(playerSprite, {x, y}, (int)animAcc % 2); | |||||
cam.pos = {x + 0.5f, y + 0.5f}; | |||||
win.clear(); | win.clear(); | ||||
rnd.draw(cam); | rnd.draw(cam); |