Skip to content

Commit

Permalink
Fixes
Browse files Browse the repository at this point in the history
- Switch from integer math to floating-point math in editor.
- Proper initialization of camera system in game.
  • Loading branch information
michaelheilmann committed Nov 21, 2017
1 parent e5b58b8 commit 894285c
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 141 deletions.
6 changes: 3 additions & 3 deletions cartman/src/cartman/View.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ void View::beginRender(Cartman::Gui::Window& window, float zoom_hrz, float zoom_
auto& renderer = Ego::Renderer::get();
// Compute left, bottom, width, height in pixels.
int left = window.position.x();
int bottom = Ego::GraphicsSystem::get().window->getDrawableSize().y() - (window.position.y() + window.size.height());
int width = window.size.width();
int height = window.size.height();
int bottom = Ego::GraphicsSystem::get().window->getDrawableSize().y() - (window.position.y() + window.size.y());
int width = window.size.x();
int height = window.size.y();
// Set viewport.
renderer.setViewportRectangle(left, bottom, width, height);
// Enable scissor tests.
Expand Down
140 changes: 70 additions & 70 deletions cartman/src/cartman/cartman.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,8 +309,8 @@ struct LightModel {
}

static void draw_light(int number, std::shared_ptr<Cartman::Gui::Window> pwin, float zoom_hrz) {
int xdraw = (light_lst[number].x / FOURNUM * zoom_hrz) - cam.x + (pwin->size.width() / 2) - SMALLXY;
int ydraw = (light_lst[number].y / FOURNUM * zoom_hrz) - cam.y + (pwin->size.height() / 2) - SMALLXY;
int xdraw = (light_lst[number].x / FOURNUM * zoom_hrz) - cam.x + (pwin->size.x() / 2) - SMALLXY;
int ydraw = (light_lst[number].y / FOURNUM * zoom_hrz) - cam.y + (pwin->size.y() / 2) - SMALLXY;
int radius = std::abs(light_lst[number].radius) / FOURNUM * zoom_hrz;
uint8_t color = light_lst[number].level;

Expand Down Expand Up @@ -502,8 +502,8 @@ void Cartman::Gui::Window::render()
auto& renderer = Ego::Renderer::get();
renderer.setScissorTestEnabled(true);
auto drawableSize = Ego::GraphicsSystem::get().window->getDrawableSize();
renderer.setScissorRectangle(position.x(), drawableSize.y() - ( position.y() + size.height() ),
size.width(), size.height());
renderer.setScissorRectangle(position.x(), drawableSize.y() - ( position.y() + size.y() ),
size.x(), size.y());

make_onscreen( pmesh );

Expand Down Expand Up @@ -538,13 +538,13 @@ void Cartman::Gui::Window::render()
void load_all_windows( cartman_mpd_t& mesh )
{
using namespace Cartman;
static const auto windowSize = Size2i(Gui::Window::defaultWidth, Gui::Window::defaultHeight);
static const auto borderSize = Size2i(7, 9);
static const auto windowSize = Vector2f(Gui::Window::defaultWidth, Gui::Window::defaultHeight);
static const auto borderSize = Vector2f(7, 9);
auto& windowList = Gui::Manager::get().windowList;
windowList[0]->load_window(0, "editor/window.png", Point2i(180, 16), borderSize, windowSize, WINMODE_VERTEX, &mesh );
windowList[1]->load_window(1, "editor/window.png", Point2i(410, 16), borderSize, windowSize, WINMODE_TILE, &mesh );
windowList[2]->load_window(2, "editor/window.png", Point2i(180, 248), borderSize, windowSize, WINMODE_SIDE, &mesh );
windowList[3]->load_window(3, "editor/window.png", Point2i(410, 248), borderSize, windowSize, WINMODE_FX, &mesh );
windowList[0]->load_window(0, "editor/window.png", Point2f(180, 16), borderSize, windowSize, WINMODE_VERTEX, &mesh );
windowList[1]->load_window(1, "editor/window.png", Point2f(410, 16), borderSize, windowSize, WINMODE_TILE, &mesh );
windowList[2]->load_window(2, "editor/window.png", Point2f(180, 248), borderSize, windowSize, WINMODE_SIDE, &mesh );
windowList[3]->load_window(3, "editor/window.png", Point2f(410, 248), borderSize, windowSize, WINMODE_FX, &mesh );
}

//--------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -578,10 +578,10 @@ void bound_mouse()
if (mdata.win_id != -1)
{
auto window = Gui::Manager::get().windowList[mdata.win_id];
Input::get()._mouse.tlx = window->position.x() + window->border.size.width();
Input::get()._mouse.tly = window->position.y() + window->border.size.height();
Input::get()._mouse.brx = Input::get()._mouse.tlx + window->size.width() - 1;
Input::get()._mouse.bry = Input::get()._mouse.tly + window->size.height() - 1;
Input::get()._mouse.tlx = window->position.x() + window->border.size.x();
Input::get()._mouse.tly = window->position.y() + window->border.size.y();
Input::get()._mouse.brx = Input::get()._mouse.tlx + window->size.x() - 1;
Input::get()._mouse.bry = Input::get()._mouse.tly + window->size.y() - 1;
}
}

Expand Down Expand Up @@ -720,40 +720,40 @@ void cartman_check_mouse_side(std::shared_ptr<Cartman::Gui::Window> pwin, float

if ( NULL == pwin->pmesh ) pwin->pmesh = &mesh;

mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->size.width() / 2);
mpix_z = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->size.height() / 2);
mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->size.x() / 2);
mpix_z = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->size.y() / 2);

inside = ( mpix_x >= -( pwin->size.width() / 2 ) ) && ( mpix_x <= ( pwin->size.width() / 2 ) ) &&
( mpix_z >= -( pwin->size.height() / 2 ) ) && ( mpix_z <= ( pwin->size.height() / 2 ) );
inside = ( mpix_x >= -( pwin->size.x() / 2 ) ) && ( mpix_x <= ( pwin->size.x() / 2 ) ) &&
( mpix_z >= -( pwin->size.y() / 2 ) ) && ( mpix_z <= ( pwin->size.y() / 2 ) );

mpos_x = SCREEN_TO_REAL( mpix_x, cam.x, zoom_hrz );
mpos_z = SCREEN_TO_REAL( mpix_z, cam.z, zoom_vrt );

mpos_y0 = SCREEN_TO_REAL( - pwin->size.width() / 2, cam.y, zoom_hrz );
mpos_y1 = SCREEN_TO_REAL( + pwin->size.width() / 2, cam.y, zoom_hrz );
mpos_y0 = SCREEN_TO_REAL( - pwin->size.x() / 2, cam.y, zoom_hrz );
mpos_y1 = SCREEN_TO_REAL( + pwin->size.x() / 2, cam.y, zoom_hrz );

if ( pwin->id == mdata.rect_drag && !inside )
{
// scroll the window
int dmpix_x = 0, dmpix_z = 0;

if ( mpix_x < - pwin->size.width() / 2 )
if ( mpix_x < - pwin->size.x() / 2 )
{
dmpix_x = mpix_x + pwin->size.width() / 2;
dmpix_x = mpix_x + pwin->size.x() / 2;
}
else if ( mpix_x > pwin->size.width() / 2 )
else if ( mpix_x > pwin->size.x() / 2 )
{
dmpix_x = mpix_x - pwin->size.width() / 2;
dmpix_x = mpix_x - pwin->size.x() / 2;
}

/// @todo Shouldn't this be <tt>pwin->size.height()</tt>?
if ( mpix_z < - pwin->size.width() / 2 )
/// @todo Shouldn't this be <tt>pwin->size.y()</tt>?
if ( mpix_z < - pwin->size.x() / 2 )
{
dmpix_z = mpix_z + pwin->size.height() / 2;
dmpix_z = mpix_z + pwin->size.y() / 2;
}
else if ( mpix_z > pwin->size.height() / 2 )
else if ( mpix_z > pwin->size.y() / 2 )
{
dmpix_z = mpix_z - pwin->size.height() / 2;
dmpix_z = mpix_z - pwin->size.y() / 2;
}

if ( 0 != dmpix_x && 0 != dmpix_z )
Expand Down Expand Up @@ -888,11 +888,11 @@ void cartman_check_mouse_tile(std::shared_ptr<Cartman::Gui::Window> pwin, float

if ( NULL == pwin->pmesh ) pwin->pmesh = &mesh;

mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->border.size.width() + pwin->size.width() / 2);
mpix_y = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->border.size.height() + pwin->size.height() / 2);
mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->border.size.x() + pwin->size.x() / 2);
mpix_y = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->border.size.y() + pwin->size.y() / 2);

inside = ( mpix_x >= -( pwin->size.width() / 2 ) ) && ( mpix_x <= ( pwin->size.width() / 2 ) ) &&
( mpix_y >= -( pwin->size.height() / 2 ) ) && ( mpix_y <= ( pwin->size.height() / 2 ) );
inside = ( mpix_x >= -( pwin->size.x() / 2 ) ) && ( mpix_x <= ( pwin->size.x() / 2 ) ) &&
( mpix_y >= -( pwin->size.y() / 2 ) ) && ( mpix_y <= ( pwin->size.y() / 2 ) );

mpos_x = SCREEN_TO_REAL( mpix_x, cam.x, zoom_hrz );
mpos_y = SCREEN_TO_REAL( mpix_y, cam.y, zoom_hrz );
Expand All @@ -902,23 +902,23 @@ void cartman_check_mouse_tile(std::shared_ptr<Cartman::Gui::Window> pwin, float
// scroll the window
int dmpix_x = 0, dmpix_y = 0;

if ( mpix_x < - pwin->size.width() / 2 )
if ( mpix_x < - pwin->size.x() / 2 )
{
dmpix_x = mpix_x + pwin->size.width() / 2;
dmpix_x = mpix_x + pwin->size.x() / 2;
}
else if ( mpix_x > pwin->size.width() / 2 )
else if ( mpix_x > pwin->size.x() / 2 )
{
dmpix_x = mpix_x - pwin->size.width() / 2;
dmpix_x = mpix_x - pwin->size.x() / 2;
}

/// @todo Shouldn't this be <tt>pwin->size.height()</tt>?
if ( mpix_y < - pwin->size.width() / 2 )
/// @todo Shouldn't this be <tt>pwin->size.y()</tt>?
if ( mpix_y < - pwin->size.x() / 2 )
{
dmpix_y = mpix_y + pwin->size.height() / 2;
dmpix_y = mpix_y + pwin->size.y() / 2;
}
else if ( mpix_y > pwin->size.height() / 2 )
else if ( mpix_y > pwin->size.y() / 2 )
{
dmpix_y = mpix_y - pwin->size.height() / 2;
dmpix_y = mpix_y - pwin->size.y() / 2;
}

if ( 0 != dmpix_x && 0 != dmpix_y )
Expand Down Expand Up @@ -1001,11 +1001,11 @@ void cartman_check_mouse_fx(std::shared_ptr<Cartman::Gui::Window> pwin, float zo

if ( NULL == pwin->pmesh ) pwin->pmesh = &mesh;

mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->border.size.width() + pwin->size.width() / 2);
mpix_y = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->border.size.height() + pwin->size.height() / 2);
mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->border.size.x() + pwin->size.x() / 2);
mpix_y = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->border.size.y() + pwin->size.y() / 2);

inside = ( mpix_x >= -( pwin->size.width() / 2 ) ) && ( mpix_x <= ( pwin->size.width() / 2 ) ) &&
( mpix_y >= -( pwin->size.height() / 2 ) ) && ( mpix_y <= ( pwin->size.height() / 2 ) );
inside = ( mpix_x >= -( pwin->size.x() / 2 ) ) && ( mpix_x <= ( pwin->size.x() / 2 ) ) &&
( mpix_y >= -( pwin->size.y() / 2 ) ) && ( mpix_y <= ( pwin->size.y() / 2 ) );

mpos_x = SCREEN_TO_REAL( mpix_x, cam.x, zoom_hrz );
mpos_y = SCREEN_TO_REAL( mpix_y, cam.y, zoom_hrz );
Expand All @@ -1015,23 +1015,23 @@ void cartman_check_mouse_fx(std::shared_ptr<Cartman::Gui::Window> pwin, float zo
// scroll the window
int dmpix_x = 0, dmpix_y = 0;

if ( mpix_x < - pwin->size.width() / 2 )
if ( mpix_x < - pwin->size.x() / 2 )
{
dmpix_x = mpix_x + pwin->size.width() / 2;
dmpix_x = mpix_x + pwin->size.x() / 2;
}
else if ( mpix_x > pwin->size.width() / 2 )
else if ( mpix_x > pwin->size.x() / 2 )
{
dmpix_x = mpix_x - pwin->size.width() / 2;
dmpix_x = mpix_x - pwin->size.x() / 2;
}

/// @todo Shouldn't this be <tt>pwin->size.height()</tt>?
if ( mpix_y < - pwin->size.width() / 2 )
/// @todo Shouldn't this be <tt>pwin->size.y()</tt>?
if ( mpix_y < - pwin->size.x() / 2 )
{
dmpix_y = mpix_y + pwin->size.height() / 2;
dmpix_y = mpix_y + pwin->size.y() / 2;
}
else if ( mpix_y > pwin->size.height() / 2 )
else if ( mpix_y > pwin->size.y() / 2 )
{
dmpix_y = mpix_y - pwin->size.height() / 2;
dmpix_y = mpix_y - pwin->size.y() / 2;
}

if ( 0 != dmpix_x && 0 != dmpix_y )
Expand Down Expand Up @@ -1104,40 +1104,40 @@ void cartman_check_mouse_vertex(std::shared_ptr<Cartman::Gui::Window> pwin, floa

if ( NULL == pwin->pmesh ) pwin->pmesh = &mesh;

mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->size.width() / 2);
mpix_y = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->size.height() / 2);
mpix_x = Input::get()._mouse.position.x() - (pwin->position.x() + pwin->size.x() / 2);
mpix_y = Input::get()._mouse.position.y() - (pwin->position.y() + pwin->size.y() / 2);

inside = ( mpix_x >= -( pwin->size.width() / 2 ) ) && ( mpix_x <= ( pwin->size.width() / 2 ) ) &&
( mpix_y >= -( pwin->size.height() / 2 ) ) && ( mpix_y <= ( pwin->size.height() / 2 ) );
inside = ( mpix_x >= -( pwin->size.x() / 2 ) ) && ( mpix_x <= ( pwin->size.x() / 2 ) ) &&
( mpix_y >= -( pwin->size.y() / 2 ) ) && ( mpix_y <= ( pwin->size.y() / 2 ) );

mpos_x = SCREEN_TO_REAL( mpix_x, cam.x, zoom_hrz );
mpos_y = SCREEN_TO_REAL( mpix_y, cam.y, zoom_hrz );

mpos_z0 = SCREEN_TO_REAL( - pwin->size.height() / 2, cam.z, zoom_vrt );
mpos_z1 = SCREEN_TO_REAL( + pwin->size.height() / 2, cam.z, zoom_vrt );
mpos_z0 = SCREEN_TO_REAL( - pwin->size.y() / 2, cam.z, zoom_vrt );
mpos_z1 = SCREEN_TO_REAL( + pwin->size.y() / 2, cam.z, zoom_vrt );

if ( pwin->id == mdata.rect_drag && !inside )
{
// scroll the window
int dmpix_x = 0, dmpix_y = 0;

if ( mpix_x < - pwin->size.width() / 2 )
if ( mpix_x < - pwin->size.x() / 2 )
{
dmpix_x = mpix_x + pwin->size.width() / 2;
dmpix_x = mpix_x + pwin->size.x() / 2;
}
else if ( mpix_x > pwin->size.width() / 2 )
else if ( mpix_x > pwin->size.x() / 2 )
{
dmpix_x = mpix_x - pwin->size.width() / 2;
dmpix_x = mpix_x - pwin->size.x() / 2;
}

/// @todo Shouldn't this be <tt>pwin->size.height()</tt>?
if ( mpix_y < - pwin->size.width() / 2 )
/// @todo Shouldn't this be <tt>pwin->size.y()</tt>?
if ( mpix_y < - pwin->size.x() / 2 )
{
dmpix_y = mpix_y + pwin->size.height() / 2;
dmpix_y = mpix_y + pwin->size.y() / 2;
}
else if ( mpix_y > pwin->size.height() / 2 )
else if ( mpix_y > pwin->size.y() / 2 )
{
dmpix_y = mpix_y - pwin->size.height() / 2;
dmpix_y = mpix_y - pwin->size.y() / 2;
}

if ( 0 != dmpix_x && 0 != dmpix_y )
Expand Down
8 changes: 4 additions & 4 deletions cartman/src/cartman/cartman_gfx.c
Original file line number Diff line number Diff line change
Expand Up @@ -964,8 +964,8 @@ void cartman_begin_ortho_camera_hrz(Cartman::Gui::Window& pwin, camera_t * pcam,
using namespace Cartman::Gui;
static const float factor_x = (float)DEFAULT_RESOLUTION * Info<float>::Grid::Size() / (float)Window::defaultWidth,
factor_y = (float)DEFAULT_RESOLUTION * Info<float>::Grid::Size() / (float)Window::defaultHeight;
float w = (float)pwin.size.width() * factor_x / zoom_x;
float h = (float)pwin.size.height() * factor_y / zoom_y;
float w = (float)pwin.size.x() * factor_x / zoom_x;
float h = (float)pwin.size.y() * factor_y / zoom_y;
float d = DEFAULT_Z_SIZE;

pcam->w = w;
Expand Down Expand Up @@ -1007,9 +1007,9 @@ void cartman_begin_ortho_camera_vrt(Cartman::Gui::Window& pwin, camera_t * pcam,

static const float factor_x = (float)DEFAULT_RESOLUTION * Info<float>::Grid::Size() / (float)Window::defaultWidth,
factor_y = (float)DEFAULT_RESOLUTION * Info<float>::Grid::Size() / (float)Window::defaultHeight;
float w = pwin.size.width() * factor_x / zoom_x;
float w = pwin.size.x() * factor_x / zoom_x;
float h = w;
float d = pwin.size.height() * factor_y / zoom_z;
float d = pwin.size.y() * factor_y / zoom_z;

pcam->w = w;
pcam->h = h;
Expand Down
18 changes: 9 additions & 9 deletions cartman/src/cartman/cartman_gui.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Manager::~Manager() {
std::shared_ptr<Window> Manager::findWindow(int x, int y) {
std::shared_ptr<Window> result = nullptr;
for (auto& window : windowList) {
if (window->isOver(Point2i(x, y))) {
if (window->isOver(Point2f(x, y))) {
continue;
}
result = window;
Expand All @@ -100,7 +100,7 @@ void Manager::render() {

namespace Cartman { namespace Gui {

Border::Border(Size2i size)
Border::Border(Vector2f size)
: texture(Ego::Renderer::get().createTexture()), size(size) {}

void Border::loadTexture(const std::string& textureFileName) {
Expand All @@ -118,7 +118,7 @@ namespace Cartman { namespace Gui {

Window::Window() : on(false), border() {}

void Window::load_window(int id, const std::string& loadname, Point2i position, Size2i borderSize, Size2i size, uint16_t mode, cartman_mpd_t * pmesh) {
void Window::load_window(int id, const std::string& loadname, Point2f position, Vector2f borderSize, Vector2f size, uint16_t mode, cartman_mpd_t * pmesh) {
if (NULL == pmesh) pmesh = &mesh;

this->border.loadTexture(loadname);
Expand All @@ -133,28 +133,28 @@ void Window::load_window(int id, const std::string& loadname, Point2i position,
this->pmesh = pmesh;
}

bool Window::isOver(Point2i p) const {
bool Window::isOver(Point2f p) const {
if (!on) {
return false;
}
/// @todo Shouldn't this be <tt>position.x() + border.size.width()</tt> (and
/// <tt>position.x() + size.width() - 2 * borderSize.width()</tt>?
if (p.x() < this->position.x() + this->border.size.width() ||
p.x() > this->position.x() + 2 * this->border.size.width() + this->size.width()) {
if (p.x() < this->position.x() + this->border.size.x() ||
p.x() > this->position.x() + 2 * this->border.size.x() + this->size.x()) {
return false;
}
/// @todo Shouldn't this be <tt>position.y() + border.size.height()</tt> (and
/// <tt>position.y() + size.height() - 2 * borderSize.height()</tt>?
if (p.y() < this->position.y() + this->border.size.height() ||
p.y() > this->position.y() + 2 * this->border.size.height() + this->size.height()) {
if (p.y() < this->position.y() + this->border.size.y() ||
p.y() > this->position.y() + 2 * this->border.size.y() + this->size.y()) {
return false;
}
return true;
}

void Window::renderBackground() const {
if (!on) return;
ogl_draw_sprite_2d(border.texture, position.x(), position.y(), size.width(), size.height());
ogl_draw_sprite_2d(border.texture, position.x(), position.y(), size.x(), size.y());
}

} } // namespace Cartman::Gui
Expand Down
Loading

0 comments on commit 894285c

Please sign in to comment.