Added new physics functions

* Added some new physics functions
* Added new documentation
* Added some auto checks for OS to rc_os_defines.h
* Fixed bugs on settting and getting position of sprites
This commit is contained in:
n00b
2024-11-15 20:42:08 -05:00
parent 3f4a1ce1cc
commit 40ca65cb3f
37 changed files with 1652 additions and 987 deletions

View File

@@ -4447,7 +4447,9 @@ int main(int argc, char * argv[])
#endif
//ogles2 test
#ifdef RC_TESTING
rc_intern_dirChange("/home/n00b/projects/rcbasic_alpha3/test_project");
#endif
rc_filename = "main.cbc";
//---------------

File diff suppressed because it is too large Load Diff

View File

@@ -1592,6 +1592,60 @@ case FN_setSpriteFixedRotation: //Sub Procedure
case FN_spriteIsFixedRotation: //Number Function
rc_push_num(rc_spriteIsFixedRotation( SPRITEISFIXEDROTATION_SPR_ID ));
break;
case FN_SetSpriteDensity: //Sub Procedure
rc_setSpriteDensity( SETSPRITEDENSITY_SPR_ID, SETSPRITEDENSITY_DENSITY );
break;
case FN_GetSpriteDensity: //Number Function
rc_push_num(rc_getSpriteDensity( GETSPRITEDENSITY_SPR_ID ));
break;
case FN_SetSpriteFriction: //Sub Procedure
rc_setSpriteFriction( SETSPRITEFRICTION_SPR_ID, SETSPRITEFRICTION_FRICTION );
break;
case FN_GetSpriteFriction: //Number Function
rc_push_num(rc_getSpriteFriction( GETSPRITEFRICTION_SPR_ID ));
break;
case FN_SetSpriteRestitution: //Sub Procedure
rc_setSpriteRestitution( SETSPRITERESTITUTION_SPR_ID, SETSPRITERESTITUTION_RESTITUTION );
break;
case FN_GetSpriteRestitution: //Number Function
rc_push_num(rc_getSpriteRestitution( GETSPRITERESTITUTION_SPR_ID ));
break;
case FN_SetSpriteRestitutionThreshold: //Sub Procedure
rc_setSpriteRestitutionThreshold( SETSPRITERESTITUTIONTHRESHOLD_SPR_ID, SETSPRITERESTITUTIONTHRESHOLD_THRESHOLD );
break;
case FN_GetSpriteAABB: //Sub Procedure
rc_getSpriteAABB( GETSPRITEAABB_SPR_ID, &GETSPRITEAABB_X1, &GETSPRITEAABB_Y1, &GETSPRITEAABB_X2, &GETSPRITEAABB_Y2 );
break;
case FN_SetGravity2D: //Sub Procedure
rc_setGravity2D( SETGRAVITY2D_X, SETGRAVITY2D_Y );
break;
case FN_GetGravity2D: //Sub Procedure
rc_getGravity2D( &GETGRAVITY2D_X, &GETGRAVITY2D_Y );
break;
case FN_SetWorld2DTimeStep: //Sub Procedure
rc_setWorld2DTimeStep( SETWORLD2DTIMESTEP_TS );
break;
case FN_SetWorld2DVelocityIterations: //Sub Procedure
rc_setWorld2DVelocityIterations( SETWORLD2DVELOCITYITERATIONS_V );
break;
case FN_SetWorld2DPositionIterations: //Sub Procedure
rc_setWorld2DPositionIterations( SETWORLD2DPOSITIONITERATIONS_P );
break;
case FN_GetWorld2DTimeStep: //Number Function
rc_push_num(rc_getWorld2DTimeStep( ));
break;
case FN_GetWorld2DVelocityIterations: //Number Function
rc_push_num(rc_getWorld2DVelocityIterations( ));
break;
case FN_GetWorld2DPositionIterations: //Number Function
rc_push_num(rc_getWorld2DPositionIterations( ));
break;
case FN_SetWorld2DAutoClearForces: //Sub Procedure
rc_setWorld2DAutoClearForces( SETWORLD2DAUTOCLEARFORCES_FLAG );
break;
case FN_GetWorld2DAutoClearForces: //Number Function
rc_push_num(rc_getWorld2DAutoClearForces( ));
break;
case FN_createDistanceJoint: //Number Function
rc_push_num(rc_createDistanceJoint( CREATEDISTANCEJOINT_SPRITEA, CREATEDISTANCEJOINT_SPRITEB, CREATEDISTANCEJOINT_AX, CREATEDISTANCEJOINT_AY, CREATEDISTANCEJOINT_BX, CREATEDISTANCEJOINT_BY, CREATEDISTANCEJOINT_COLLIDE_CONNECT ));
break;
@@ -2567,6 +2621,12 @@ case FN_SetWorld3DMaxSubSteps: //Sub Procedure
case FN_SetWorld3DTimeStep: //Sub Procedure
rc_setWorld3DTimeStep( SETWORLD3DTIMESTEP_TS );
break;
case FN_GetWorld3DMaxSubSteps: //Number Function
rc_push_num(rc_getWorld3DMaxSubSteps( ));
break;
case FN_GetWorld3DTimeStep: //Number Function
rc_push_num(rc_getWorld3DTimeStep( ));
break;
case FN_startParticleEmitter: //Sub Procedure
rc_startParticleEmitter( STARTPARTICLEEMITTER_ACTOR );
break;

View File

@@ -767,38 +767,23 @@ bool rc_restoreWindow()
return false;
}
void rc_setWindowIcon(int slot)
void rc_setWindowIcon(int img_id)
{
SDL_Rect img_rect;
img_rect.x = 0;
img_rect.y = 0;
//img_rect.w = rc_image_width[slot];
//img_rect.h = rc_image_height[slot];
/*
if(rc_himage[slot][win_num] != NULL)
{
//SDL_RendererFlip rf = (SDL_RendererFlip)(SDL_FLIP_VERTICAL);
if(img_id < 0 || img_id >= rc_image.size())
return;
SDL_Surface * tmp_surf = SDL_CreateRGBSurface(0, rc_image_width[slot], rc_image_height[slot], 32, 0, 0, 0, 0);
SDL_Texture * tmp_tex = SDL_CreateTexture(rc_win_renderer[rc_active_window], rc_pformat->format, SDL_TEXTUREACCESS_TARGET, rc_image_width[slot], rc_image_height[slot]);
SDL_SetRenderTarget(rc_win_renderer[rc_active_window],NULL);
SDL_RenderCopy(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,&img_rect);
//SDL_RenderCopyEx(rc_win_renderer[rc_active_window],rc_himage[slot][rc_active_window],NULL,NULL,0,NULL,rf);
if(!rc_image[img_id].image)
return;
SDL_RenderReadPixels(rc_win_renderer[rc_active_window], &img_rect, rc_pformat->format,tmp_surf->pixels,tmp_surf->pitch);
SDL_Surface* img_surface = convertTextureToSurface(rc_image[img_id].image);
SDL_SetColorKey(tmp_surf,SDL_TRUE,rc_image_colorKey[slot]);
if(!img_surface)
return;
SDL_SetWindowIcon(rc_win[rc_active_window], tmp_surf);
SDL_SetColorKey(img_surface,SDL_TRUE,0);
SDL_SetWindowIcon(rc_window, img_surface);
if(rc_active_screen >= 0)
SDL_SetRenderTarget(rc_win_renderer[rc_active_window], rc_hscreen[rc_active_window][rc_active_screen]);
SDL_DestroyTexture(tmp_tex);
SDL_FreeSurface(tmp_surf);
}
*/
SDL_FreeSurface(img_surface);
}

View File

@@ -897,5 +897,34 @@ void draw2DImage2(irr::video::IVideoDriver *driver, irr::video::ITexture* textur
}
SDL_Surface* convertTextureToSurface(irr::video::ITexture* itexture)
{
Uint32 t_width, t_height;
t_width = itexture->getSize().Width;
t_height = itexture->getSize().Height;
SDL_Surface* surface = SDL_CreateRGBSurface(0, t_width, t_height, 32, 0, 0, 0, 0);
if(surface)
{
Uint32* surface_pixels = (Uint32*)surface->pixels;
Uint32* texture_pixels = (Uint32*)rc_canvas[rc_active_canvas].texture->lock();
int i = 0;
for(int y = 0; y < t_height; y++)
{
for(int x = 0; x < t_width; x++)
{
surface_pixels[i] = texture_pixels[i];
}
}
rc_canvas[rc_active_canvas].texture->unlock();
}
return surface;
}
#endif // RC_GFX_CORE_H_INCLUDED

View File

@@ -1,12 +1,27 @@
#ifndef RC_OS_DEFINES_H_INCLUDED
#define RC_OS_DEFINES_H_INCLUDED
#define RC_LINUX
//#define RC_WEB
//#define RC_WINDOWS
//#define RC_ANDROID
//#define RC_MAC
//#define RC_IOS
//USED FOR TESTING ONLY
//#define RC_TESTING
//I am checking Android first since I think it also defines __linux__
#if defined(__ANDROID__)
#define RC_ANDROID
#elif defined(__linux__)
#define RC_LINUX
#elif __EMSCRIPTEN__
#define RC_WEB
#elif defined(_WIN32) || defined(_WIN64)
#define RC_WINDOWS
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
#include <TargetConditionals.h>
#if defined(TARGET_IPHONE_SIMULATOR) || defined(TARGET_OS_IPHONE)
#define RC_IOS
#else
#define RC_MAC
#endif // TARGET_IPHONE_SIMULATOR
#endif // defined
#ifdef RC_WEB
#define RC_LINUX
@@ -20,10 +35,13 @@
#ifdef RC_IOS
#define RC_MOBILE
#define RC_DRIVER_GLES2
#endif
//FOR DEBUG PURPOSES
//FOR TESTING PURPOSES
#ifdef RC_TESTING
//#define RC_DRIVER_GLES2
#endif // RC_TESTING
#define RC_PI 3.14159265359

View File

@@ -32,4 +32,14 @@ void rc_setWorld3DTimeStep(double ts)
rc_physics3D.fixedTimeStep = ts;
}
double rc_getWorld3DMaxSubSteps()
{
return rc_physics3D.maxSubSteps;
}
double rc_getWorld3DTimeStep()
{
return rc_physics3D.fixedTimeStep;
}
#endif // RC_PHYSICS3D_BASE_H_INCLUDED

View File

@@ -43,6 +43,8 @@ void rc_setSpriteAngularVelocity(int spr_id, double av)
if(!rc_sprite[spr_id].active)
return;
av = rc_util_radians(av);
rc_sprite[spr_id].physics.body->SetAngularVelocity(av);
}
@@ -54,7 +56,7 @@ double rc_getSpriteAngularVelocity(int spr_id)
if(!rc_sprite[spr_id].active)
return 0;
return (double)rc_sprite[spr_id].physics.body->GetAngularVelocity();
return (double)rc_util_degrees(rc_sprite[spr_id].physics.body->GetAngularVelocity());
}
void rc_applySpriteForce(int spr_id, double fX, double fY, double pX, double pY)
@@ -365,3 +367,211 @@ bool rc_spriteIsFixedRotation(int spr_id)
return rc_sprite[spr_id].physics.body->IsFixedRotation();
}
void rc_setSpriteDensity( int spr_id, double density )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
rc_sprite[spr_id].physics.fixture->SetDensity(density);
}
double rc_getSpriteDensity( int spr_id )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return 0;
if(!rc_sprite[spr_id].active)
return 0;
return rc_sprite[spr_id].physics.fixture->GetDensity();
}
void rc_setSpriteFriction( int spr_id, double friction )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
rc_sprite[spr_id].physics.fixture->SetFriction(friction);
}
double rc_getSpriteFriction( int spr_id )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return 0;
if(!rc_sprite[spr_id].active)
return 0;
return rc_sprite[spr_id].physics.fixture->GetFriction();
}
void rc_setSpriteRestitution( int spr_id, double restitution )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
rc_sprite[spr_id].physics.fixture->SetRestitution(restitution);
}
double rc_getSpriteRestitution( int spr_id )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return 0;
if(!rc_sprite[spr_id].active)
return 0;
return rc_sprite[spr_id].physics.fixture->GetRestitution();
}
void rc_setSpriteRestitutionThreshold( int spr_id, double threshold )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
rc_sprite[spr_id].physics.fixture->SetRestitutionThreshold(threshold);
}
void rc_getSpriteAABB( int spr_id, double* x1, double* y1, double* x2, double* y2 )
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
b2AABB bound_box = rc_sprite[spr_id].physics.fixture->GetAABB(0);
*x1 = bound_box.upperBound.x;
*y1 = bound_box.upperBound.y;
*x2 = bound_box.lowerBound.x;
*y2 = bound_box.lowerBound.y;
}
void rc_setWorld2DTimeStep( double ts )
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
rc_canvas[rc_active_canvas].physics2D.timeStep = ts;
}
void rc_setWorld2DVelocityIterations( double v )
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
rc_canvas[rc_active_canvas].physics2D.velocityIterations = (int)v;
}
void rc_setWorld2DPositionIterations( double p )
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
rc_canvas[rc_active_canvas].physics2D.positionIterations = (int)p;
}
double rc_getWorld2DTimeStep()
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return 0;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return 0;
return rc_canvas[rc_active_canvas].physics2D.timeStep;
}
double rc_getWorld2DVelocityIterations()
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return 0;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return 0;
return rc_canvas[rc_active_canvas].physics2D.velocityIterations;
}
double rc_getWorld2DPositionIterations()
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return 0;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return 0;
return rc_canvas[rc_active_canvas].physics2D.positionIterations;
}
void rc_setWorld2DAutoClearForces( bool flag )
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
rc_canvas[rc_active_canvas].physics2D.world->SetAutoClearForces(flag);
}
bool rc_getWorld2DAutoClearForces()
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return false;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return false;
return rc_canvas[rc_active_canvas].physics2D.world->GetAutoClearForces();
}
void rc_setGravity2D(double x, double y)
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
b2Vec2 gravity(x, y);
rc_canvas[rc_active_canvas].physics2D.world->SetGravity(gravity);
}
void rc_getGravity2D(double* x, double* y)
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
*x = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().x;
*y = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().y;
}

View File

@@ -796,34 +796,6 @@ bool rc_spriteIsVisible(int spr_id)
return rc_sprite[spr_id].visible;
}
void rc_setGravity2d(double x, double y)
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
b2Vec2 gravity(x, y);
rc_canvas[rc_active_canvas].physics2D.world->SetGravity(gravity);
}
void rc_getGravity2d(double* x, double* y)
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
return;
*x = 0;
*y = 0;
*x = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().x;
*y = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().y;
}
//-----------------------------------PHYSICS----------------------------------------------------------------------------------

View File

@@ -1,5 +1,5 @@
# depslib dependency file v1.0
1731339939 source:/home/n00b/Projects/RCBASIC4/rcbasic_runtime/main.cpp
1731681709 source:/home/n00b/Projects/RCBASIC4/rcbasic_runtime/main.cpp
"rc_os_defines.h"
<emscripten.h>
<sys/param.h>
@@ -32,9 +32,10 @@
<irrtheora.h>
"rc_func130_cases.h"
1731678428 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_os_defines.h
1731717801 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_os_defines.h
<TargetConditionals.h>
1730315467 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_defines.h
1731684932 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_defines.h
1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_stdlib.h
"rc_os_defines.h"
@@ -1246,7 +1247,7 @@
1727545973 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/RealisticWater.h
<irrlicht.h>
1731541468 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h
1731712885 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx.h
"SDL.h"
<SDL2/SDL.h>
<irrlicht.h>
@@ -1270,7 +1271,7 @@
"rc_joints.h"
<irrtheora.h>
1731249956 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx_core.h
1731709491 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_gfx_core.h
"SDL.h"
"btBulletDynamicsCommon.h"
"BulletSoftBody/btSoftRigidDynamicsWorld.h"
@@ -2271,7 +2272,7 @@
"rc_gfx_core.h"
<irrtheora.h>
1730315467 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_func130_cases.h
1731711022 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_func130_cases.h
1724469097 source:/home/n00b/Projects/irrBullet/src/irrBullet.cpp
"irrBullet.h"
@@ -2486,7 +2487,7 @@
<irrlicht.h>
<cmath>
1731679477 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_spritelib.h
1731693546 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_spritelib.h
"SDL.h"
<SDL2/SDL.h>
"rc_sprite2D.h"
@@ -2504,7 +2505,7 @@
<irrlicht.h>
<vector>
1730168962 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_sprite_physics.h
1731693615 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_sprite_physics.h
"rc_sprite2D.h"
1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_joints.h
@@ -2513,12 +2514,12 @@
"rc_sprite2D.h"
"rc_gfx_core.h"
1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_physics3D_base.h
1731695180 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_physics3D_base.h
"rc_gfx_core.h"
1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_base_actor.h
1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_actor_material.h
1731710840 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_actor_material.h
1730291453 /home/n00b/Projects/RCBASIC4/rcbasic_runtime/rc_actor_animation.h