Changes to sprite animation system

* Changed the names of some of the functions
* Added functions for setting and returning the projection matrix of the active camera
* Added a function for getting the 2D screen coordinates from a 3D vector
* Added documentation for all the new functions
This commit is contained in:
n00b
2024-10-18 23:12:42 -04:00
parent 8f372bdf19
commit 5762c171ae
58 changed files with 457 additions and 5 deletions

View File

@@ -1312,13 +1312,33 @@ int rc_cloneCanvas(int origin_canvas_id, int mode)
return canvas_id;
}
void rc_getWorldToViewportPosition(double x, double y, double z, double* vx, double* vy)
{
if(!VideoDriver)
return;
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
if(!rc_canvas[rc_active_canvas].texture)
return;
if(!rc_canvas[rc_active_canvas].camera.camera)
return;
irr::scene::ISceneCollisionManager* collman = SceneManager->getSceneCollisionManager();
irr::core::vector2di vpos = collman->getScreenCoordinatesFrom3DPosition(irr::core::vector3df(x, y, z), rc_canvas[rc_active_canvas].camera.camera);
*vx = vpos.X;
*vy = vpos.Y;
}
void rc_setClearColor(Uint32 color)
{
rc_clear_color.set(color);
}
Uint32 rc_rgba(Uint32 r, Uint32 g, Uint32 b, Uint32 a)
{
irr::video::SColor color(a, r, g, b);

View File

@@ -6717,6 +6717,37 @@ double rc_getCameraNearValue()
return rc_canvas[rc_active_canvas].camera.camera->getNearValue();
}
void rc_setCameraProjectionMatrix(int proj_matrix, int proj_type)
{
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
return;
if(proj_matrix < 0 || proj_matrix >= rc_matrix.size())
return;
if(!rc_matrix[proj_matrix].active)
return;
irr::core::matrix4 irr_mat = rc_convertToIrrMatrix(proj_matrix);
bool isOrtho = (proj_type == RC_PROJECTION_TYPE_ORTHOGRAPHIC);
rc_canvas[rc_active_canvas].camera.camera->setProjectionMatrix(irr_mat, isOrtho);
}
void rc_getCameraProjectionMatrix(int proj_matrix)
{
if(!(rc_active_canvas > 0 && rc_active_canvas < rc_canvas.size()))
return;
if(proj_matrix < 0 || proj_matrix >= rc_matrix.size())
return;
if(!rc_matrix[proj_matrix].active)
return;
irr::core::matrix4 pmat = rc_canvas[rc_active_canvas].camera.camera->getProjectionMatrix();
rc_convertFromIrrMatrix(pmat, proj_matrix);
}
void rc_addSceneSkyBox(int img_top, int img_bottom, int img_left, int img_right, int img_front, int img_back)
{

View File

@@ -316,6 +316,9 @@ struct rc_physicsWorld2D_obj
#define RC_CANVAS_TYPE_3D 1
#define RC_CANVAS_TYPE_SPRITE 2
#define RC_PROJECTION_TYPE_ORTHOGRAPHIC 0
#define RC_PROJECTION_TYPE_PERSPECTIVE 1
struct rc_canvas_obj
{
irr::video::ITexture* texture;

View File

@@ -204,7 +204,7 @@ int rc_getSpriteAnimation(int spr_id)
return rc_sprite[spr_id].current_animation;
}
int rc_getSpriteActiveAnimationFrame(int spr_id)
int rc_getSpriteCurrentAnimationFrame(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return -1;
@@ -216,7 +216,7 @@ int rc_getSpriteActiveAnimationFrame(int spr_id)
return rc_sprite[spr_id].animation[current_animation].current_frame;
}
void rc_loopSpriteAnimation(int spr_id, int num_loops)
void rc_setSpriteAnimationLoops(int spr_id, int num_loops)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
@@ -391,6 +391,41 @@ void rc_deleteSprite(int spr_id)
}
}
void rc_setSpriteSource(int spr_id, int img_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
if(img_id < 0)
{
rc_sprite[spr_id].image_id = -1;
return;
}
if(img_id >= rc_image.size())
return;
if(!rc_image[img_id].image)
return;
rc_sprite[spr_id].image_id = img_id;
}
int rc_getSpriteSource(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return -1;
if(!rc_sprite[spr_id].active)
return -1;
return rc_sprite[spr_id].image_id;
}
void rc_setSpriteType(int spr_id, int body_type)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
@@ -402,6 +437,17 @@ void rc_setSpriteType(int spr_id, int body_type)
rc_sprite[spr_id].physics.body->SetType((b2BodyType) body_type);
}
int rc_getSpriteType(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return -1;
if(!rc_sprite[spr_id].active)
return -1;
return (int)rc_sprite[spr_id].physics.body->GetType();
}
void rc_setSpriteSolid(int spr_id, bool flag)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())