Fixed sprite alignment with box2d fixtures

This commit is contained in:
n00b
2024-11-13 22:31:03 -05:00
parent a08ab8760c
commit 73fb1bded8
6 changed files with 29 additions and 20 deletions

View File

@@ -3499,13 +3499,6 @@ bool rc_update()
//std::cout << "draw canvas[" << canvas_id << "] (" << rc_canvas[canvas_id].offset.X << ", " << rc_canvas[canvas_id].offset.Y << ") (" << rc_canvas[canvas_id].viewport.dimension.Width << ", " << rc_canvas[canvas_id].dimension.Height << ")" << std::endl;
if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_SPRITE)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].viewport.dimension); //sprite layers will just offset the sprites in drawSprites()
drawSprites(canvas_id);
}
#if defined(RC_DRIVER_GLES2)
if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_3D)
{
@@ -3520,9 +3513,23 @@ bool rc_update()
src = irr::core::rect<s32>( cv_offset, cv_dim );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(cv_pos.X, cv_pos.Y + cv_dim.Height), irr::core::dimension2d<s32>(cv_dim.Width, -1*cv_dim.Height) );
}
else if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_SPRITE)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].texture->getSize() );
dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
drawSprites(canvas_id);
}
//dest = irr::core::rect<s32>( irr::core::vector2d<s32>(dest.UpperLeftCorner.X, dest.UpperLeftCorner.Y + dest.getHeight()), irr::core::dimension2d<s32>(dest.getWidth(), -1*dest.getHeight()) );
draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
#else
if(rc_canvas[canvas_id].type == RC_CANVAS_TYPE_SPRITE)
{
src = irr::core::rect<s32>( irr::core::vector2d<s32>(0, 0), rc_canvas[canvas_id].viewport.dimension); //sprite layers will just offset the sprites in drawSprites()
drawSprites(canvas_id);
}
draw2DImage2(VideoDriver, rc_canvas[canvas_id].texture, src, dest, irr::core::position2d<irr::s32>(0, 0), 0, true, color, screenSize);
#endif // defined

View File

@@ -2,7 +2,7 @@
#define RC_OS_DEFINES_H_INCLUDED
#define RC_LINUX
#define RC_WEB
//#define RC_WEB
//#define RC_WINDOWS
//#define RC_ANDROID
//#define RC_MAC
@@ -23,7 +23,7 @@
#endif
//FOR DEBUG PURPOSES
#define RC_DRIVER_GLES2
//#define RC_DRIVER_GLES2
#define RC_PI 3.14159265359

View File

@@ -350,7 +350,7 @@ int rc_createSprite(int img_id, double w, double h)
b2BodyDef sprBodyDef;
sprBodyDef.type = b2_dynamicBody;
sprBodyDef.position.Set(0, 0);
sprBodyDef.position.Set(w/2, h/2);
sprBodyDef.angle = 0;
sprBodyDef.userData.pointer = (uintptr_t)&rc_sprite[spr_id];
rc_sprite[spr_id].physics.body = rc_canvas[rc_active_canvas].physics2D.world->CreateBody(&sprBodyDef);
@@ -364,8 +364,8 @@ int rc_createSprite(int img_id, double w, double h)
sprFixtureDef.density = 1;
rc_sprite[spr_id].physics.fixture = rc_sprite[spr_id].physics.body->CreateFixture(&sprFixtureDef);
rc_sprite[spr_id].physics.offset_x = 0;
rc_sprite[spr_id].physics.offset_y = 0;
rc_sprite[spr_id].physics.offset_x = w/2;
rc_sprite[spr_id].physics.offset_y = h/2;
rc_sprite[spr_id].isSolid = false;
if(rc_sprite[spr_id].image_id < 0)
@@ -513,7 +513,9 @@ void rc_setSpritePosition(int spr_id, double x, double y)
return;
float current_angle = rc_sprite[spr_id].physics.body->GetAngle();
rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(x, y), current_angle);
double off_x = rc_sprite[spr_id].physics.offset_x;
double off_y = rc_sprite[spr_id].physics.offset_y;
rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(x+off_x, y+off_y), current_angle);
}
void rc_translateSprite(int spr_id, double x, double y)
@@ -843,13 +845,13 @@ void drawSprites(int canvas_id)
continue;
physics_pos = sprite->physics.body->GetPosition();
x = (int)physics_pos.x - offset_x;
y = (int)physics_pos.y - offset_y;
x = (int)(physics_pos.x - sprite->physics.offset_x) - offset_x;
y = (int)(physics_pos.y - sprite->physics.offset_y) - offset_y;
int xf = x + sprite->frame_size.Width;
int yf = y + sprite->frame_size.Height;
//std::cout << "sprite info: " << xf << ", " << x << ", " << rc_canvas[canvas_id].viewport.dimension.Width << std::endl;
//std::cout << "sprite info[" << spr_index << "]: (" << x << ", " << y << ") (" << xf << ", " << yf << ")" << std::endl;
if( (xf < 0) || (x > ((int)rc_canvas[canvas_id].viewport.dimension.Width)) )
{

View File

@@ -32,7 +32,7 @@
<irrtheora.h>
"rc_func130_cases.h"
1731467785 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_os_defines.h
1731547485 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_os_defines.h
1730315467 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_defines.h
@@ -1246,7 +1246,7 @@
1727545973 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/RealisticWater.h
<irrlicht.h>
1731468622 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h
1731541468 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h
"SDL.h"
<SDL2/SDL.h>
<irrlicht.h>
@@ -2486,7 +2486,7 @@
<irrlicht.h>
<cmath>
1731380776 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_spritelib.h
1731554928 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_spritelib.h
"SDL.h"
<SDL2/SDL.h>
"rc_sprite2D.h"