From cbb578981af3059f751125c21b1b4dc7a8b1cfd5 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Sun, 10 Nov 2024 22:08:47 -0700
Subject: [PATCH 01/19] Add files via upload
---
getspritegravity.html | 20 +
getspritegravity.txt | 6 +
rc_spritelib.h | 960 ++++++++++++++++++++++++++++++++++++++++++
setspritegravity.html | 20 +
setspritegravity.txt | 6 +
5 files changed, 1012 insertions(+)
create mode 100644 getspritegravity.html
create mode 100644 getspritegravity.txt
create mode 100644 rc_spritelib.h
create mode 100644 setspritegravity.html
create mode 100644 setspritegravity.txt
diff --git a/getspritegravity.html b/getspritegravity.html
new file mode 100644
index 0000000..976bef4
--- /dev/null
+++ b/getspritegravity.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ GetSpriteGravity [RCBasic Doc]
+
+
+
+
sub GetSpriteGravity(ByRef x, ByRef y)
+
+ Use this function for retrieving the global gravity vector.
+
+ Related:
+ SetSpriteGravity
+
+
+
+
+
\ No newline at end of file
diff --git a/getspritegravity.txt b/getspritegravity.txt
new file mode 100644
index 0000000..fcf8f4e
--- /dev/null
+++ b/getspritegravity.txt
@@ -0,0 +1,6 @@
+#title GetSpriteGravity [RCBasic Doc]
+#header sub GetSpriteGravity(ByRef x, ByRef y)
+
+Use this function for retrieving the global gravity vector.
+
+#ref SetSpriteGravity
diff --git a/rc_spritelib.h b/rc_spritelib.h
new file mode 100644
index 0000000..0796d64
--- /dev/null
+++ b/rc_spritelib.h
@@ -0,0 +1,960 @@
+#ifndef RC_SPRITELIB_H_INCLUDED
+#define RC_SPRITELIB_H_INCLUDED
+
+#ifdef RC_ANDROID
+ #include "SDL.h"
+#else
+ #include
+#endif // _IRR_ANDROID_PLATFORM_
+
+#include "rc_sprite2D.h"
+#include "rc_gfx_core.h"
+
+#include "rc_sprite_physics.h"
+#include "rc_joints.h"
+
+#define RC_SPRITE_BASE_ANIMATION 0
+
+int rc_createSpriteAnimation(int spr_id, int anim_length, double fps)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return -1;
+
+ if(!rc_sprite[spr_id].active)
+ return -1;
+
+ if(anim_length <= 0)
+ anim_length = 1;
+
+ rc_sprite2D_animation_obj animation;
+ animation.current_frame = 0;
+ animation.fps = fps;
+ animation.frame_swap_time = 1000/fps;
+ animation.num_frames = anim_length;
+ for(int i = 0; i < anim_length; i++)
+ animation.frames.push_back(0);
+
+ int animation_id = rc_sprite[spr_id].animation.size();
+ if(rc_sprite[spr_id].deleted_sprites.size() > 0)
+ {
+ animation_id = rc_sprite[spr_id].deleted_sprites[0];
+ rc_sprite[spr_id].deleted_sprites.erase(0);
+ rc_sprite[spr_id].animation[animation_id] = animation;
+ }
+ else
+ rc_sprite[spr_id].animation.push_back(animation);
+
+ return animation_id;
+}
+
+void rc_deleteSpriteAnimation(int spr_id, int animation)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ rc_sprite[spr_id].deleted_sprites.push_back(animation);
+}
+
+void rc_setSpriteFrame(int spr_id, int frame)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames)
+ return;
+
+ rc_sprite[spr_id].current_animation = RC_SPRITE_BASE_ANIMATION;
+ rc_sprite[spr_id].animation[RC_SPRITE_BASE_ANIMATION].current_frame = 0;
+ rc_sprite[spr_id].animation[RC_SPRITE_BASE_ANIMATION].frames[0] = frame;
+}
+
+int rc_getSpriteFrame(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return -1;
+
+ if(!rc_sprite[spr_id].active)
+ return -1;
+
+ int current_animation = rc_sprite[spr_id].current_animation;
+ int current_frame = rc_sprite[spr_id].animation[current_animation].current_frame;
+ return rc_sprite[spr_id].animation[current_animation].frames[current_frame];
+}
+
+void rc_setSpriteAnimationFrame(int spr_id, int spr_animation, int anim_frame, int frame)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames)
+ return;
+
+ if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames)
+ return;
+
+ rc_sprite[spr_id].animation[spr_animation].frames[anim_frame] = frame;
+}
+
+int rc_getSpriteAnimationFrame(int spr_id, int spr_animation, int anim_frame)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return -1;
+
+ if(!rc_sprite[spr_id].active)
+ return -1;
+
+ if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames)
+ return -1;
+
+ return rc_sprite[spr_id].animation[spr_animation].frames[anim_frame];
+}
+
+
+void rc_setSpriteAnimationLength(int spr_id, int animation, int num_frames)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ // I intentionally checked for less than or equal to 0 because 0 is the base animation and should not be changed
+ if(animation <= 0 || animation >= rc_sprite[spr_id].animation.size())
+ return;
+
+ if(num_frames <= 0)
+ num_frames = 1;
+
+ if(num_frames > rc_sprite[spr_id].animation[animation].num_frames)
+ {
+ for(int i = rc_sprite[spr_id].animation[animation].num_frames; i < rc_sprite[spr_id].animation[animation].frames.size(); i++)
+ rc_sprite[spr_id].animation[animation].frames[i] = 0;
+ }
+
+ rc_sprite[spr_id].animation[animation].num_frames = num_frames;
+ if(num_frames > rc_sprite[spr_id].animation[animation].frames.size())
+ {
+ while(num_frames > rc_sprite[spr_id].animation[animation].frames.size())
+ rc_sprite[spr_id].animation[animation].frames.push_back(0);
+ }
+
+ if(num_frames < rc_sprite[spr_id].animation[animation].frames.size())
+ {
+ if(rc_sprite[spr_id].animation[animation].current_frame >= num_frames)
+ rc_sprite[spr_id].animation[animation].current_frame = num_frames - 1;
+ }
+}
+
+int rc_getSpriteAnimationLength(int spr_id, int animation)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return 0;
+
+ if(!rc_sprite[spr_id].active)
+ return 0;
+
+ if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
+ return 0;
+
+ return rc_sprite[spr_id].animation[animation].num_frames;
+}
+
+void rc_setSpriteAnimationSpeed(int spr_id, int animation, double fps)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
+ return;
+
+ rc_sprite[spr_id].animation[animation].fps = fps;
+ rc_sprite[spr_id].animation[animation].frame_swap_time = 1000/fps;
+}
+
+double rc_getSpriteAnimationSpeed(int spr_id, int animation)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return 0;
+
+ if(!rc_sprite[spr_id].active)
+ return 0;
+
+ if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
+ return 0;
+
+ return rc_sprite[spr_id].animation[animation].fps;
+}
+
+void rc_setSpriteAnimation(int spr_id, int animation, int num_loops)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
+ return;
+
+ rc_sprite[spr_id].current_animation = animation;
+ rc_sprite[spr_id].animation[animation].current_frame = 0;
+ rc_sprite[spr_id].isPlaying = true;
+ rc_sprite[spr_id].animation[animation].frame_start_time = SDL_GetTicks();
+ rc_sprite[spr_id].num_animation_loops = num_loops;
+}
+
+int rc_getSpriteAnimation(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].current_animation;
+}
+
+int rc_getSpriteCurrentAnimationFrame(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return -1;
+
+ if(!rc_sprite[spr_id].active)
+ return -1;
+
+ int current_animation = rc_sprite[spr_id].current_animation;
+ return rc_sprite[spr_id].animation[current_animation].current_frame;
+}
+
+void rc_setSpriteAnimationLoops(int spr_id, int num_loops)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ rc_sprite[spr_id].num_animation_loops = num_loops;
+}
+
+int rc_numSpriteAnimationLoops(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].num_animation_loops;
+}
+
+bool rc_spriteAnimationIsPlaying(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return false;
+
+ if(!rc_sprite[spr_id].active)
+ return false;
+
+ return rc_sprite[spr_id].isPlaying;
+}
+
+//------------------------------SPRITES-------------------------------------------------------
+//Larger z gets drawn first
+void sortSpriteZ(int canvas_id)
+{
+ if(canvas_id < 0 || canvas_id >= rc_canvas.size())
+ return;
+
+ if(!rc_canvas[canvas_id].texture)
+ return;
+
+ for(int i = 0; i < rc_canvas[canvas_id].sprite.size(); i++)
+ {
+ rc_sprite2D_obj* spriteA = rc_canvas[canvas_id].sprite[i];
+
+ for(int j = i+1; j < rc_canvas[canvas_id].sprite.size(); j++)
+ {
+ rc_sprite2D_obj* spriteB = rc_canvas[canvas_id].sprite[j];
+
+ if(spriteB->z > spriteA->z)
+ {
+ rc_canvas[canvas_id].sprite[j] = NULL;
+ rc_canvas[canvas_id].sprite.erase(j);
+ rc_canvas[canvas_id].sprite.insert(spriteB, i);
+ }
+ }
+ }
+}
+
+
+int rc_createSprite(int img_id, double w, double h)
+{
+ if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
+ return -1;
+
+ if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
+ return -1;
+
+ //std::cout << "debug 1" << std::endl;
+
+ int spr_id = -1;
+ for(int i = 0; i < rc_sprite.size(); i++)
+ {
+ if(!rc_sprite[i].active)
+ {
+ spr_id = i;
+ break;
+ }
+ }
+
+ if(spr_id < 0)
+ {
+ spr_id = rc_sprite.size();
+ rc_sprite2D_obj sprite;
+ rc_sprite.push_back(sprite);
+ }
+
+ rc_sprite[spr_id].active = true;
+ rc_sprite[spr_id].id = spr_id;
+ rc_sprite[spr_id].image_id = img_id;
+ rc_sprite[spr_id].frame_size.set(w, h);
+
+ if(img_id >= 0 && img_id < rc_image.size())
+ {
+ if(rc_image[img_id].image)
+ {
+ int img_w = rc_image[img_id].image->getSize().Width;
+ int img_h = rc_image[img_id].image->getSize().Height;
+
+ rc_sprite[spr_id].frames_per_row = (int)(img_w / w);
+ rc_sprite[spr_id].sheet_numFrames = ((int)(img_h / h)) * rc_sprite[spr_id].frames_per_row;
+ }
+ else
+ rc_sprite[spr_id].image_id = -1;
+ }
+ else
+ rc_sprite[spr_id].image_id = -1;
+
+ b2BodyDef sprBodyDef;
+ sprBodyDef.type = b2_dynamicBody;
+ sprBodyDef.position.Set(0, 0);
+ 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);
+
+ b2FixtureDef sprFixtureDef;
+ rc_sprite[spr_id].physics.shape = new b2PolygonShape();
+ b2PolygonShape* fix_shape = (b2PolygonShape*)rc_sprite[spr_id].physics.shape;
+ fix_shape->SetAsBox(w/2, h/2);
+ sprFixtureDef.shape = rc_sprite[spr_id].physics.shape;
+ sprFixtureDef.isSensor = true;
+ 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].isSolid = false;
+
+ if(rc_sprite[spr_id].image_id < 0)
+ rc_sprite[spr_id].visible =false;
+ else
+ rc_sprite[spr_id].visible = true;
+
+ rc_sprite[spr_id].scale.set(1.0, 1.0);
+ rc_sprite[spr_id].alpha = 255;
+ rc_sprite[spr_id].z = 0;
+ rc_sprite[spr_id].color_mod.set(255,255,255,255);
+ rc_sprite[spr_id].parent_canvas = rc_active_canvas;
+
+ rc_sprite[spr_id].current_animation = RC_SPRITE_BASE_ANIMATION;
+ rc_sprite[spr_id].num_animation_loops = 0;
+ rc_sprite[spr_id].current_animation_loop = 0;
+ rc_sprite[spr_id].isPlaying = false;
+ rc_sprite[spr_id].animation.clear();
+ rc_createSpriteAnimation(spr_id, 1, 0);
+
+ rc_canvas[rc_active_canvas].sprite.push_back(&rc_sprite[spr_id]);
+
+ sortSpriteZ(rc_active_canvas);
+
+ return spr_id;
+}
+
+void rc_deleteSprite(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(rc_sprite[spr_id].physics.body)
+ {
+ if(rc_sprite[spr_id].parent_canvas >= 0 && rc_sprite[spr_id].parent_canvas < rc_canvas.size())
+ {
+ if(rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world)
+ rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world->DestroyBody(rc_sprite[spr_id].physics.body);
+ }
+ rc_sprite[spr_id].physics.body = NULL;
+ }
+
+ rc_sprite[spr_id].active = false;
+ rc_sprite[spr_id].parent_canvas = -1;
+ rc_sprite[spr_id].animation.clear();
+
+ for(int i = 0; i < rc_canvas[rc_active_canvas].sprite.size(); i++)
+ {
+ rc_sprite2D_obj* canvas_sprite = rc_canvas[rc_active_canvas].sprite[i];
+ rc_sprite2D_obj* global_sprite = &rc_sprite[spr_id];
+ if(canvas_sprite == global_sprite)
+ {
+ rc_canvas[rc_active_canvas].sprite.erase(i);
+ break;
+ }
+ }
+}
+
+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())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ 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())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ rc_sprite[spr_id].isSolid = flag;
+ rc_sprite[spr_id].physics.fixture->SetSensor(!flag);
+}
+
+bool rc_spriteIsSolid(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return false;
+
+ if(!rc_sprite[spr_id].active)
+ return false;
+
+ return rc_sprite[spr_id].isSolid;
+}
+
+void rc_setSpritePosition(int spr_id, double x, double y)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ float current_angle = rc_sprite[spr_id].physics.body->GetAngle();
+ rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(x, y), current_angle);
+}
+
+void rc_translateSprite(int spr_id, double x, double y)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ float current_angle = rc_sprite[spr_id].physics.body->GetAngle();
+ double spr_x = rc_sprite[spr_id].physics.body->GetPosition().x + x;
+ double spr_y = rc_sprite[spr_id].physics.body->GetPosition().y + y;
+ rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(spr_x, spr_y), current_angle);
+}
+
+void rc_getSpritePosition(int spr_id, double* x, double* y)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ *x = (double)rc_sprite[spr_id].physics.body->GetPosition().x;
+ *y = (double)rc_sprite[spr_id].physics.body->GetPosition().y;
+}
+
+double rc_spriteX(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return 0;
+
+ if(!rc_sprite[spr_id].active)
+ return 0;
+
+ return (double)rc_sprite[spr_id].physics.body->GetPosition().x;
+}
+
+double rc_spriteY(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return 0;
+
+ if(!rc_sprite[spr_id].active)
+ return 0;
+
+ return (double)rc_sprite[spr_id].physics.body->GetPosition().y;
+}
+
+void rc_setSpriteRotation(int spr_id, double angle)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ //convert angle to radians
+ angle = rc_util_radians(angle);
+
+ rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), angle);
+}
+
+void rc_rotateSprite(int spr_id, double angle)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ //convert angle to radians
+ angle = rc_util_radians(angle);
+
+ float new_angle = rc_sprite[spr_id].physics.body->GetAngle() + angle;
+ rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), new_angle);
+}
+
+double rc_getSpriteRotation(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return 0;
+
+ if(!rc_sprite[spr_id].active)
+ return 0;
+
+ return rc_util_degrees(rc_sprite[spr_id].physics.body->GetAngle());
+}
+
+void rc_setSpriteScale(int spr_id, double x, double y)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ rc_sprite[spr_id].scale.set(x, y);
+
+ if(true) //(rc_sprite[spr_id].isSolid) //I probably originally planned on not having a fixture for non-solid sprites but then I discovered sensors
+ {
+ if(rc_sprite[spr_id].physics.fixture)
+ {
+ b2FixtureDef fixdef;
+ fixdef.density = rc_sprite[spr_id].physics.fixture->GetDensity();
+ fixdef.friction = rc_sprite[spr_id].physics.fixture->GetFriction();
+ fixdef.restitution = rc_sprite[spr_id].physics.fixture->GetRestitution();
+ fixdef.restitutionThreshold = rc_sprite[spr_id].physics.fixture->GetRestitutionThreshold();
+ fixdef.shape = rc_sprite[spr_id].physics.shape;
+ fixdef.isSensor = !(rc_sprite[spr_id].isSolid);
+
+ switch(fixdef.shape->GetType())
+ {
+ case b2Shape::e_circle:
+ {
+ b2CircleShape* shape = (b2CircleShape*)fixdef.shape;
+ shape->m_radius = (x+y)/2;
+ }
+ break;
+
+ case b2Shape::e_polygon:
+ {
+ b2PolygonShape* shape = (b2PolygonShape*)fixdef.shape;
+ for(int i = 0; i < shape->m_count; i++)
+ {
+ shape->m_vertices[i].x *= x;
+ shape->m_vertices[i].y *= y;
+ }
+ }
+ break;
+
+ case b2Shape::e_chain:
+ {
+ b2ChainShape* shape = (b2ChainShape*)fixdef.shape;
+ for(int i = 0; i < shape->m_count; i++)
+ {
+ shape->m_vertices[i].x *= x;
+ shape->m_vertices[i].y *= y;
+ }
+ }
+ break;
+
+ case b2Shape::e_edge:
+ {
+ b2EdgeShape* shape = (b2EdgeShape*)fixdef.shape;
+
+ shape->m_vertex0.x *= x;
+ shape->m_vertex0.y *= y;
+
+ shape->m_vertex1.x *= x;
+ shape->m_vertex1.y *= y;
+
+ shape->m_vertex2.x *= x;
+ shape->m_vertex2.y *= y;
+
+ shape->m_vertex3.x *= x;
+ shape->m_vertex3.y *= y;
+ }
+ break;
+ }
+
+ rc_sprite[spr_id].physics.body->DestroyFixture(rc_sprite[spr_id].physics.fixture);
+ rc_sprite[spr_id].physics.fixture = rc_sprite[spr_id].physics.body->CreateFixture(&fixdef);
+ }
+ }
+}
+
+void rc_scaleSprite(int spr_id, double x, double y)
+{
+ double scale_x = rc_sprite[spr_id].scale.X * x;
+ double scale_y = rc_sprite[spr_id].scale.Y * y;
+ rc_setSpriteScale(spr_id, scale_x, scale_y);
+}
+
+
+void rc_getSpriteScale(int spr_id, double* x, double* y)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ *x = rc_sprite[spr_id].scale.X;
+ *y = rc_sprite[spr_id].scale.Y;
+}
+
+double rc_spriteWidth(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].frame_size.Width;
+}
+
+double rc_spriteHeight(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].frame_size.Height;
+}
+
+void rc_getSpriteSize(int spr_id, double* w, double* h)
+{
+ *w = 0;
+ *h = 0;
+
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ *w = rc_sprite[spr_id].frame_size.Width;
+ *h = rc_sprite[spr_id].frame_size.Height;
+}
+
+void rc_setSpriteZ(int spr_id, double z)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ rc_sprite[spr_id].z = z;
+ sortSpriteZ(rc_sprite[spr_id].parent_canvas);
+}
+
+double rc_spriteZ(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].z;
+}
+
+void rc_setSpriteVisible(int spr_id, bool flag)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return;
+
+ if(!rc_sprite[spr_id].active)
+ return;
+
+ if(rc_sprite[spr_id].image_id)
+ rc_sprite[spr_id].visible = flag;
+ else
+ rc_sprite[spr_id].visible = false;
+}
+
+bool rc_spriteIsVisible(int spr_id)
+{
+ if(spr_id < 0 || spr_id >= rc_sprite.size())
+ return false;
+
+ if(!rc_sprite[spr_id].active)
+ return false;
+
+ return rc_sprite[spr_id].visible;
+}
+
+void rc_setSpriteGravity(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);
+ b2World(gravity);
+}
+
+void rc_getSpriteGravity(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 = b2World.GetGravity().x;
+ *y = b2World.GetGravity().y;
+}
+
+
+//-----------------------------------PHYSICS----------------------------------------------------------------------------------
+
+
+
+//This function is called on each canvas on update
+void drawSprites(int canvas_id)
+{
+ float step = rc_canvas[canvas_id].physics2D.timeStep;
+ int32 velocityIterations = rc_canvas[canvas_id].physics2D.velocityIterations;
+ int32 positionIterations = rc_canvas[canvas_id].physics2D.positionIterations;
+
+ if(rc_canvas[canvas_id].physics2D.enabled && (!hasPreUpdated))
+ rc_canvas[canvas_id].physics2D.world->Step(step, velocityIterations, positionIterations);
+
+ //Setting the render target to the current canvas. NOTE: I might change this target to a separate sprite layer later.
+ VideoDriver->setRenderTarget(rc_canvas[canvas_id].texture, true, true);
+ VideoDriver->clearBuffers(true, true, true, irr::video::SColor(0,0,0,0));
+
+
+ irr::core::dimension2d src_size;
+ irr::core::rect sourceRect;
+
+ irr::core::position2d position;
+
+ irr::core::position2d rotationPoint;
+
+ irr::f32 rotation = 0;
+ irr::core::vector2df scale(1.0, 1.0);
+ bool useAlphaChannel = true;
+ irr::video::SColor color;
+
+ //irr::core::rect dest( irr::core::vector2d(x, y), irr::core::dimension2d(src_w, src_h));;
+
+ irr::core::vector2df screenSize(rc_canvas[canvas_id].dimension.Width, rc_canvas[canvas_id].dimension.Height);
+
+ int x = 0;
+ int y = 0;
+
+ b2Vec2 physics_pos;
+
+ irr::f32 RAD_TO_DEG = 180.0/3.141592653589793238463;
+
+ double spr_timer = SDL_GetTicks();
+
+ int offset_x = rc_canvas[canvas_id].offset.X;
+ int offset_y = rc_canvas[canvas_id].offset.Y;
+
+ for(int spr_index = 0; spr_index < rc_canvas[canvas_id].sprite.size(); spr_index++)
+ {
+ rc_sprite2D_obj* sprite = rc_canvas[canvas_id].sprite[spr_index];
+ if(!sprite->visible)
+ continue;
+
+ physics_pos = sprite->physics.body->GetPosition();
+ x = (int)physics_pos.x - offset_x;
+ y = (int)physics_pos.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;
+
+ if( (xf < 0) || (x > ((int)rc_canvas[canvas_id].viewport.dimension.Width)) )
+ {
+ //std::cout << "skip draw[X]: " << spr_index << std::endl;
+ continue;
+ }
+
+ if( (yf < 0) || (y > ((int)rc_canvas[canvas_id].viewport.dimension.Height)) )
+ {
+ //std::cout << "skip draw[Y]: " << spr_index << std::endl;
+ continue;
+ }
+
+ position.set(x, y);
+
+ int img_id = sprite->image_id;
+ if(img_id < 0 || img_id >= rc_image.size())
+ continue;
+
+ //src_size = rc_image[img_id].image->getSize();
+ int current_animation = sprite->current_animation;
+ if((spr_timer - sprite->animation[current_animation].frame_start_time) >= sprite->animation[current_animation].frame_swap_time)
+ {
+ sprite->animation[current_animation].current_frame++;
+
+ if(sprite->animation[current_animation].current_frame >= sprite->animation[current_animation].num_frames)
+ {
+ sprite->animation[current_animation].current_frame = 0;
+ sprite->current_animation_loop++;
+
+ if(sprite->current_animation_loop >= sprite->num_animation_loops)
+ {
+ if(sprite->num_animation_loops < 0)
+ sprite->isPlaying = true;
+ else
+ sprite->isPlaying = false;
+ sprite->current_animation_loop = 0;
+ }
+ }
+
+ if(!sprite->isPlaying)
+ sprite->animation[current_animation].current_frame = 0;
+
+ sprite->animation[current_animation].frame_start_time = spr_timer;
+ }
+
+ int current_animation_frame = sprite->animation[current_animation].current_frame;
+
+ int frame_x = (int)(sprite->animation[current_animation].frames[current_animation_frame]%sprite->frames_per_row)*sprite->frame_size.Width;
+ int frame_y = (int)(sprite->animation[current_animation].frames[current_animation_frame]/sprite->frames_per_row)*sprite->frame_size.Height;
+ irr::core::vector2d frame_pos(frame_x, frame_y);
+ src_size = sprite->frame_size;
+ sourceRect = irr::core::rect( frame_pos, src_size);
+ //sourceRect = irr::core::rect( irr::core::vector2d(0, 0), src_size);
+
+ //physics_pos = sprite->physics.body->GetPosition();
+ //x = (int)physics_pos.x;
+ //y = (int)physics_pos.y;
+ //position.set(x, y);
+
+
+ rotationPoint.set(x + (src_size.Width/2), y + (src_size.Height/2)); //TODO: need to account for offset once that is implemented
+ rotation = -1 * (sprite->physics.body->GetAngle() * RAD_TO_DEG); //convert Box2D radians to degrees
+
+ scale.set(sprite->scale.X, sprite->scale.Y);
+
+ color.set(sprite->alpha,
+ sprite->color_mod.getRed(),
+ sprite->color_mod.getGreen(),
+ sprite->color_mod.getBlue());
+
+ //I don't want to draw an image that doesn't exists. Thats just crazy.
+ draw2DImage(VideoDriver, rc_image[img_id].image, sourceRect, position, rotationPoint, rotation, scale, useAlphaChannel, color, screenSize);
+ }
+ //Must set back to canvas 0 (the backbuffer) before returning
+
+ VideoDriver->setRenderTarget(rc_canvas[0].texture, false, false);
+}
+
+//-----------------------------END OF SPRITE STUFF------------------------------------------------------------------------------
+
+#endif // RC_SPRITELIB_H_INCLUDED
diff --git a/setspritegravity.html b/setspritegravity.html
new file mode 100644
index 0000000..7cf20d4
--- /dev/null
+++ b/setspritegravity.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ SetSpriteGravity [RCBasic Doc]
+
+
+
+
sub SetSpriteGravity(x, y)
+
+ Use this function for setting the global gravity vector.
+
+ Related:
+ GetSpriteGravity
+
+
+
+
+
\ No newline at end of file
diff --git a/setspritegravity.txt b/setspritegravity.txt
new file mode 100644
index 0000000..a5f6154
--- /dev/null
+++ b/setspritegravity.txt
@@ -0,0 +1,6 @@
+#title SetSpriteGravity [RCBasic Doc]
+#header sub SetSpriteGravity(x, y)
+
+Use this function for setting the global gravity vector.
+
+#ref GetSpriteGravity
From 5c53e7067bc0bb227587a8e6196a1f851edfdeac Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Sun, 10 Nov 2024 22:10:42 -0700
Subject: [PATCH 02/19] Add files via upload
---
rcbasic_runtime/rc_spritelib.h | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/rcbasic_runtime/rc_spritelib.h b/rcbasic_runtime/rc_spritelib.h
index 9a4a491..0796d64 100644
--- a/rcbasic_runtime/rc_spritelib.h
+++ b/rcbasic_runtime/rc_spritelib.h
@@ -787,6 +787,32 @@ bool rc_spriteIsVisible(int spr_id)
return rc_sprite[spr_id].visible;
}
+void rc_setSpriteGravity(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);
+ b2World(gravity);
+}
+
+void rc_getSpriteGravity(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 = b2World.GetGravity().x;
+ *y = b2World.GetGravity().y;
+}
//-----------------------------------PHYSICS----------------------------------------------------------------------------------
From 1e47d69e23444787e08e0001239766d16bec3873 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Sun, 10 Nov 2024 22:13:24 -0700
Subject: [PATCH 03/19] Add files via upload
---
doc/files/getspritegravity.txt | 6 ++++++
doc/files/setspritegravity.txt | 6 ++++++
2 files changed, 12 insertions(+)
create mode 100644 doc/files/getspritegravity.txt
create mode 100644 doc/files/setspritegravity.txt
diff --git a/doc/files/getspritegravity.txt b/doc/files/getspritegravity.txt
new file mode 100644
index 0000000..fcf8f4e
--- /dev/null
+++ b/doc/files/getspritegravity.txt
@@ -0,0 +1,6 @@
+#title GetSpriteGravity [RCBasic Doc]
+#header sub GetSpriteGravity(ByRef x, ByRef y)
+
+Use this function for retrieving the global gravity vector.
+
+#ref SetSpriteGravity
diff --git a/doc/files/setspritegravity.txt b/doc/files/setspritegravity.txt
new file mode 100644
index 0000000..a5f6154
--- /dev/null
+++ b/doc/files/setspritegravity.txt
@@ -0,0 +1,6 @@
+#title SetSpriteGravity [RCBasic Doc]
+#header sub SetSpriteGravity(x, y)
+
+Use this function for setting the global gravity vector.
+
+#ref GetSpriteGravity
From f30aaffc4c327eac49250510b5cd3df036d1552d Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Sun, 10 Nov 2024 22:15:47 -0700
Subject: [PATCH 04/19] Add files via upload
---
doc/files/opencanvasspritelayer.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/files/opencanvasspritelayer.txt b/doc/files/opencanvasspritelayer.txt
index 3635a7e..0ba5a75 100644
--- a/doc/files/opencanvasspritelayer.txt
+++ b/doc/files/opencanvasspritelayer.txt
@@ -1,5 +1,5 @@
#title OpenCanvasSpriteLayer [RCBasic Doc]
-#header function OpenCanvasSpriteLayer(w, h, viewport_x, viewport_y, viewport_w, viewport_h)
+#header function OpenCanvasSpriteLayer(viewport_x, viewport_y, viewport_w, viewport_h)
Returns a sprite layer. These canvases are used for rendering sprites with the integrated physics engine.
From f8296f44cf75065c8b05303a19c0942bccbd300b Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Sun, 10 Nov 2024 22:17:02 -0700
Subject: [PATCH 05/19] Add files via upload
---
doc/doc_files/getspritegravity.html | 20 ++++++++++++++++++++
doc/doc_files/opencanvasspritelayer.html | 2 +-
doc/doc_files/setspritegravity.html | 20 ++++++++++++++++++++
3 files changed, 41 insertions(+), 1 deletion(-)
create mode 100644 doc/doc_files/getspritegravity.html
create mode 100644 doc/doc_files/setspritegravity.html
diff --git a/doc/doc_files/getspritegravity.html b/doc/doc_files/getspritegravity.html
new file mode 100644
index 0000000..976bef4
--- /dev/null
+++ b/doc/doc_files/getspritegravity.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ GetSpriteGravity [RCBasic Doc]
+
+
+
+
sub GetSpriteGravity(ByRef x, ByRef y)
+
+ Use this function for retrieving the global gravity vector.
+
+ Related:
+ SetSpriteGravity
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/doc_files/opencanvasspritelayer.html b/doc/doc_files/opencanvasspritelayer.html
index e214db4..eb20172 100644
--- a/doc/doc_files/opencanvasspritelayer.html
+++ b/doc/doc_files/opencanvasspritelayer.html
@@ -7,7 +7,7 @@
-
function OpenCanvasSpriteLayer(w, h, viewport_x, viewport_y, viewport_w, viewport_h)
+
function OpenCanvasSpriteLayer(viewport_x, viewport_y, viewport_w, viewport_h)
Returns a sprite layer. These canvases are used for rendering sprites with the integrated physics engine.
diff --git a/doc/doc_files/setspritegravity.html b/doc/doc_files/setspritegravity.html
new file mode 100644
index 0000000..7cf20d4
--- /dev/null
+++ b/doc/doc_files/setspritegravity.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ SetSpriteGravity [RCBasic Doc]
+
+
+
+
sub SetSpriteGravity(x, y)
+
+ Use this function for setting the global gravity vector.
+
+ Related:
+ GetSpriteGravity
+
+
+
+
+
\ No newline at end of file
From 19f67fa883dc5f4a682194c5b1005c589b4cc751 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Sun, 10 Nov 2024 22:17:58 -0700
Subject: [PATCH 06/19] Add files via upload
From a13d3de54f128e5a6816fab6ff361767e37cfeee Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:36:50 -0700
Subject: [PATCH 07/19] Delete getspritegravity.html
---
getspritegravity.html | 20 --------------------
1 file changed, 20 deletions(-)
delete mode 100644 getspritegravity.html
diff --git a/getspritegravity.html b/getspritegravity.html
deleted file mode 100644
index 976bef4..0000000
--- a/getspritegravity.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
- GetSpriteGravity [RCBasic Doc]
-
-
-
-
sub GetSpriteGravity(ByRef x, ByRef y)
-
- Use this function for retrieving the global gravity vector.
-
- Related:
- SetSpriteGravity
-
-
-
-
-
\ No newline at end of file
From 74f9fc89698a0561c2b031c93e4f9dfe34960386 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:37:02 -0700
Subject: [PATCH 08/19] Delete setspritegravity.txt
---
setspritegravity.txt | 6 ------
1 file changed, 6 deletions(-)
delete mode 100644 setspritegravity.txt
diff --git a/setspritegravity.txt b/setspritegravity.txt
deleted file mode 100644
index a5f6154..0000000
--- a/setspritegravity.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-#title SetSpriteGravity [RCBasic Doc]
-#header sub SetSpriteGravity(x, y)
-
-Use this function for setting the global gravity vector.
-
-#ref GetSpriteGravity
From 34c023a9765f2491c6e47e06fe774c4a582149bc Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:37:12 -0700
Subject: [PATCH 09/19] Delete setspritegravity.html
---
setspritegravity.html | 20 --------------------
1 file changed, 20 deletions(-)
delete mode 100644 setspritegravity.html
diff --git a/setspritegravity.html b/setspritegravity.html
deleted file mode 100644
index 7cf20d4..0000000
--- a/setspritegravity.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
- SetSpriteGravity [RCBasic Doc]
-
-
-
-
sub SetSpriteGravity(x, y)
-
- Use this function for setting the global gravity vector.
-
- Related:
- GetSpriteGravity
-
-
-
-
-
\ No newline at end of file
From ceee3fc5d06f8597600dc9801bcda542bf6b9d3b Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:37:24 -0700
Subject: [PATCH 10/19] Delete rc_spritelib.h
---
rc_spritelib.h | 960 -------------------------------------------------
1 file changed, 960 deletions(-)
delete mode 100644 rc_spritelib.h
diff --git a/rc_spritelib.h b/rc_spritelib.h
deleted file mode 100644
index 0796d64..0000000
--- a/rc_spritelib.h
+++ /dev/null
@@ -1,960 +0,0 @@
-#ifndef RC_SPRITELIB_H_INCLUDED
-#define RC_SPRITELIB_H_INCLUDED
-
-#ifdef RC_ANDROID
- #include "SDL.h"
-#else
- #include
-#endif // _IRR_ANDROID_PLATFORM_
-
-#include "rc_sprite2D.h"
-#include "rc_gfx_core.h"
-
-#include "rc_sprite_physics.h"
-#include "rc_joints.h"
-
-#define RC_SPRITE_BASE_ANIMATION 0
-
-int rc_createSpriteAnimation(int spr_id, int anim_length, double fps)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return -1;
-
- if(!rc_sprite[spr_id].active)
- return -1;
-
- if(anim_length <= 0)
- anim_length = 1;
-
- rc_sprite2D_animation_obj animation;
- animation.current_frame = 0;
- animation.fps = fps;
- animation.frame_swap_time = 1000/fps;
- animation.num_frames = anim_length;
- for(int i = 0; i < anim_length; i++)
- animation.frames.push_back(0);
-
- int animation_id = rc_sprite[spr_id].animation.size();
- if(rc_sprite[spr_id].deleted_sprites.size() > 0)
- {
- animation_id = rc_sprite[spr_id].deleted_sprites[0];
- rc_sprite[spr_id].deleted_sprites.erase(0);
- rc_sprite[spr_id].animation[animation_id] = animation;
- }
- else
- rc_sprite[spr_id].animation.push_back(animation);
-
- return animation_id;
-}
-
-void rc_deleteSpriteAnimation(int spr_id, int animation)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- rc_sprite[spr_id].deleted_sprites.push_back(animation);
-}
-
-void rc_setSpriteFrame(int spr_id, int frame)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames)
- return;
-
- rc_sprite[spr_id].current_animation = RC_SPRITE_BASE_ANIMATION;
- rc_sprite[spr_id].animation[RC_SPRITE_BASE_ANIMATION].current_frame = 0;
- rc_sprite[spr_id].animation[RC_SPRITE_BASE_ANIMATION].frames[0] = frame;
-}
-
-int rc_getSpriteFrame(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return -1;
-
- if(!rc_sprite[spr_id].active)
- return -1;
-
- int current_animation = rc_sprite[spr_id].current_animation;
- int current_frame = rc_sprite[spr_id].animation[current_animation].current_frame;
- return rc_sprite[spr_id].animation[current_animation].frames[current_frame];
-}
-
-void rc_setSpriteAnimationFrame(int spr_id, int spr_animation, int anim_frame, int frame)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames)
- return;
-
- if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames)
- return;
-
- rc_sprite[spr_id].animation[spr_animation].frames[anim_frame] = frame;
-}
-
-int rc_getSpriteAnimationFrame(int spr_id, int spr_animation, int anim_frame)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return -1;
-
- if(!rc_sprite[spr_id].active)
- return -1;
-
- if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames)
- return -1;
-
- return rc_sprite[spr_id].animation[spr_animation].frames[anim_frame];
-}
-
-
-void rc_setSpriteAnimationLength(int spr_id, int animation, int num_frames)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- // I intentionally checked for less than or equal to 0 because 0 is the base animation and should not be changed
- if(animation <= 0 || animation >= rc_sprite[spr_id].animation.size())
- return;
-
- if(num_frames <= 0)
- num_frames = 1;
-
- if(num_frames > rc_sprite[spr_id].animation[animation].num_frames)
- {
- for(int i = rc_sprite[spr_id].animation[animation].num_frames; i < rc_sprite[spr_id].animation[animation].frames.size(); i++)
- rc_sprite[spr_id].animation[animation].frames[i] = 0;
- }
-
- rc_sprite[spr_id].animation[animation].num_frames = num_frames;
- if(num_frames > rc_sprite[spr_id].animation[animation].frames.size())
- {
- while(num_frames > rc_sprite[spr_id].animation[animation].frames.size())
- rc_sprite[spr_id].animation[animation].frames.push_back(0);
- }
-
- if(num_frames < rc_sprite[spr_id].animation[animation].frames.size())
- {
- if(rc_sprite[spr_id].animation[animation].current_frame >= num_frames)
- rc_sprite[spr_id].animation[animation].current_frame = num_frames - 1;
- }
-}
-
-int rc_getSpriteAnimationLength(int spr_id, int animation)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return 0;
-
- if(!rc_sprite[spr_id].active)
- return 0;
-
- if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
- return 0;
-
- return rc_sprite[spr_id].animation[animation].num_frames;
-}
-
-void rc_setSpriteAnimationSpeed(int spr_id, int animation, double fps)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
- return;
-
- rc_sprite[spr_id].animation[animation].fps = fps;
- rc_sprite[spr_id].animation[animation].frame_swap_time = 1000/fps;
-}
-
-double rc_getSpriteAnimationSpeed(int spr_id, int animation)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return 0;
-
- if(!rc_sprite[spr_id].active)
- return 0;
-
- if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
- return 0;
-
- return rc_sprite[spr_id].animation[animation].fps;
-}
-
-void rc_setSpriteAnimation(int spr_id, int animation, int num_loops)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
- return;
-
- rc_sprite[spr_id].current_animation = animation;
- rc_sprite[spr_id].animation[animation].current_frame = 0;
- rc_sprite[spr_id].isPlaying = true;
- rc_sprite[spr_id].animation[animation].frame_start_time = SDL_GetTicks();
- rc_sprite[spr_id].num_animation_loops = num_loops;
-}
-
-int rc_getSpriteAnimation(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].current_animation;
-}
-
-int rc_getSpriteCurrentAnimationFrame(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return -1;
-
- if(!rc_sprite[spr_id].active)
- return -1;
-
- int current_animation = rc_sprite[spr_id].current_animation;
- return rc_sprite[spr_id].animation[current_animation].current_frame;
-}
-
-void rc_setSpriteAnimationLoops(int spr_id, int num_loops)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- rc_sprite[spr_id].num_animation_loops = num_loops;
-}
-
-int rc_numSpriteAnimationLoops(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].num_animation_loops;
-}
-
-bool rc_spriteAnimationIsPlaying(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return false;
-
- if(!rc_sprite[spr_id].active)
- return false;
-
- return rc_sprite[spr_id].isPlaying;
-}
-
-//------------------------------SPRITES-------------------------------------------------------
-//Larger z gets drawn first
-void sortSpriteZ(int canvas_id)
-{
- if(canvas_id < 0 || canvas_id >= rc_canvas.size())
- return;
-
- if(!rc_canvas[canvas_id].texture)
- return;
-
- for(int i = 0; i < rc_canvas[canvas_id].sprite.size(); i++)
- {
- rc_sprite2D_obj* spriteA = rc_canvas[canvas_id].sprite[i];
-
- for(int j = i+1; j < rc_canvas[canvas_id].sprite.size(); j++)
- {
- rc_sprite2D_obj* spriteB = rc_canvas[canvas_id].sprite[j];
-
- if(spriteB->z > spriteA->z)
- {
- rc_canvas[canvas_id].sprite[j] = NULL;
- rc_canvas[canvas_id].sprite.erase(j);
- rc_canvas[canvas_id].sprite.insert(spriteB, i);
- }
- }
- }
-}
-
-
-int rc_createSprite(int img_id, double w, double h)
-{
- if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
- return -1;
-
- if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE)
- return -1;
-
- //std::cout << "debug 1" << std::endl;
-
- int spr_id = -1;
- for(int i = 0; i < rc_sprite.size(); i++)
- {
- if(!rc_sprite[i].active)
- {
- spr_id = i;
- break;
- }
- }
-
- if(spr_id < 0)
- {
- spr_id = rc_sprite.size();
- rc_sprite2D_obj sprite;
- rc_sprite.push_back(sprite);
- }
-
- rc_sprite[spr_id].active = true;
- rc_sprite[spr_id].id = spr_id;
- rc_sprite[spr_id].image_id = img_id;
- rc_sprite[spr_id].frame_size.set(w, h);
-
- if(img_id >= 0 && img_id < rc_image.size())
- {
- if(rc_image[img_id].image)
- {
- int img_w = rc_image[img_id].image->getSize().Width;
- int img_h = rc_image[img_id].image->getSize().Height;
-
- rc_sprite[spr_id].frames_per_row = (int)(img_w / w);
- rc_sprite[spr_id].sheet_numFrames = ((int)(img_h / h)) * rc_sprite[spr_id].frames_per_row;
- }
- else
- rc_sprite[spr_id].image_id = -1;
- }
- else
- rc_sprite[spr_id].image_id = -1;
-
- b2BodyDef sprBodyDef;
- sprBodyDef.type = b2_dynamicBody;
- sprBodyDef.position.Set(0, 0);
- 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);
-
- b2FixtureDef sprFixtureDef;
- rc_sprite[spr_id].physics.shape = new b2PolygonShape();
- b2PolygonShape* fix_shape = (b2PolygonShape*)rc_sprite[spr_id].physics.shape;
- fix_shape->SetAsBox(w/2, h/2);
- sprFixtureDef.shape = rc_sprite[spr_id].physics.shape;
- sprFixtureDef.isSensor = true;
- 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].isSolid = false;
-
- if(rc_sprite[spr_id].image_id < 0)
- rc_sprite[spr_id].visible =false;
- else
- rc_sprite[spr_id].visible = true;
-
- rc_sprite[spr_id].scale.set(1.0, 1.0);
- rc_sprite[spr_id].alpha = 255;
- rc_sprite[spr_id].z = 0;
- rc_sprite[spr_id].color_mod.set(255,255,255,255);
- rc_sprite[spr_id].parent_canvas = rc_active_canvas;
-
- rc_sprite[spr_id].current_animation = RC_SPRITE_BASE_ANIMATION;
- rc_sprite[spr_id].num_animation_loops = 0;
- rc_sprite[spr_id].current_animation_loop = 0;
- rc_sprite[spr_id].isPlaying = false;
- rc_sprite[spr_id].animation.clear();
- rc_createSpriteAnimation(spr_id, 1, 0);
-
- rc_canvas[rc_active_canvas].sprite.push_back(&rc_sprite[spr_id]);
-
- sortSpriteZ(rc_active_canvas);
-
- return spr_id;
-}
-
-void rc_deleteSprite(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(rc_sprite[spr_id].physics.body)
- {
- if(rc_sprite[spr_id].parent_canvas >= 0 && rc_sprite[spr_id].parent_canvas < rc_canvas.size())
- {
- if(rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world)
- rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world->DestroyBody(rc_sprite[spr_id].physics.body);
- }
- rc_sprite[spr_id].physics.body = NULL;
- }
-
- rc_sprite[spr_id].active = false;
- rc_sprite[spr_id].parent_canvas = -1;
- rc_sprite[spr_id].animation.clear();
-
- for(int i = 0; i < rc_canvas[rc_active_canvas].sprite.size(); i++)
- {
- rc_sprite2D_obj* canvas_sprite = rc_canvas[rc_active_canvas].sprite[i];
- rc_sprite2D_obj* global_sprite = &rc_sprite[spr_id];
- if(canvas_sprite == global_sprite)
- {
- rc_canvas[rc_active_canvas].sprite.erase(i);
- break;
- }
- }
-}
-
-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())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- 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())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- rc_sprite[spr_id].isSolid = flag;
- rc_sprite[spr_id].physics.fixture->SetSensor(!flag);
-}
-
-bool rc_spriteIsSolid(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return false;
-
- if(!rc_sprite[spr_id].active)
- return false;
-
- return rc_sprite[spr_id].isSolid;
-}
-
-void rc_setSpritePosition(int spr_id, double x, double y)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- float current_angle = rc_sprite[spr_id].physics.body->GetAngle();
- rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(x, y), current_angle);
-}
-
-void rc_translateSprite(int spr_id, double x, double y)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- float current_angle = rc_sprite[spr_id].physics.body->GetAngle();
- double spr_x = rc_sprite[spr_id].physics.body->GetPosition().x + x;
- double spr_y = rc_sprite[spr_id].physics.body->GetPosition().y + y;
- rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(spr_x, spr_y), current_angle);
-}
-
-void rc_getSpritePosition(int spr_id, double* x, double* y)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- *x = (double)rc_sprite[spr_id].physics.body->GetPosition().x;
- *y = (double)rc_sprite[spr_id].physics.body->GetPosition().y;
-}
-
-double rc_spriteX(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return 0;
-
- if(!rc_sprite[spr_id].active)
- return 0;
-
- return (double)rc_sprite[spr_id].physics.body->GetPosition().x;
-}
-
-double rc_spriteY(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return 0;
-
- if(!rc_sprite[spr_id].active)
- return 0;
-
- return (double)rc_sprite[spr_id].physics.body->GetPosition().y;
-}
-
-void rc_setSpriteRotation(int spr_id, double angle)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- //convert angle to radians
- angle = rc_util_radians(angle);
-
- rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), angle);
-}
-
-void rc_rotateSprite(int spr_id, double angle)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- //convert angle to radians
- angle = rc_util_radians(angle);
-
- float new_angle = rc_sprite[spr_id].physics.body->GetAngle() + angle;
- rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), new_angle);
-}
-
-double rc_getSpriteRotation(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return 0;
-
- if(!rc_sprite[spr_id].active)
- return 0;
-
- return rc_util_degrees(rc_sprite[spr_id].physics.body->GetAngle());
-}
-
-void rc_setSpriteScale(int spr_id, double x, double y)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- rc_sprite[spr_id].scale.set(x, y);
-
- if(true) //(rc_sprite[spr_id].isSolid) //I probably originally planned on not having a fixture for non-solid sprites but then I discovered sensors
- {
- if(rc_sprite[spr_id].physics.fixture)
- {
- b2FixtureDef fixdef;
- fixdef.density = rc_sprite[spr_id].physics.fixture->GetDensity();
- fixdef.friction = rc_sprite[spr_id].physics.fixture->GetFriction();
- fixdef.restitution = rc_sprite[spr_id].physics.fixture->GetRestitution();
- fixdef.restitutionThreshold = rc_sprite[spr_id].physics.fixture->GetRestitutionThreshold();
- fixdef.shape = rc_sprite[spr_id].physics.shape;
- fixdef.isSensor = !(rc_sprite[spr_id].isSolid);
-
- switch(fixdef.shape->GetType())
- {
- case b2Shape::e_circle:
- {
- b2CircleShape* shape = (b2CircleShape*)fixdef.shape;
- shape->m_radius = (x+y)/2;
- }
- break;
-
- case b2Shape::e_polygon:
- {
- b2PolygonShape* shape = (b2PolygonShape*)fixdef.shape;
- for(int i = 0; i < shape->m_count; i++)
- {
- shape->m_vertices[i].x *= x;
- shape->m_vertices[i].y *= y;
- }
- }
- break;
-
- case b2Shape::e_chain:
- {
- b2ChainShape* shape = (b2ChainShape*)fixdef.shape;
- for(int i = 0; i < shape->m_count; i++)
- {
- shape->m_vertices[i].x *= x;
- shape->m_vertices[i].y *= y;
- }
- }
- break;
-
- case b2Shape::e_edge:
- {
- b2EdgeShape* shape = (b2EdgeShape*)fixdef.shape;
-
- shape->m_vertex0.x *= x;
- shape->m_vertex0.y *= y;
-
- shape->m_vertex1.x *= x;
- shape->m_vertex1.y *= y;
-
- shape->m_vertex2.x *= x;
- shape->m_vertex2.y *= y;
-
- shape->m_vertex3.x *= x;
- shape->m_vertex3.y *= y;
- }
- break;
- }
-
- rc_sprite[spr_id].physics.body->DestroyFixture(rc_sprite[spr_id].physics.fixture);
- rc_sprite[spr_id].physics.fixture = rc_sprite[spr_id].physics.body->CreateFixture(&fixdef);
- }
- }
-}
-
-void rc_scaleSprite(int spr_id, double x, double y)
-{
- double scale_x = rc_sprite[spr_id].scale.X * x;
- double scale_y = rc_sprite[spr_id].scale.Y * y;
- rc_setSpriteScale(spr_id, scale_x, scale_y);
-}
-
-
-void rc_getSpriteScale(int spr_id, double* x, double* y)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- *x = rc_sprite[spr_id].scale.X;
- *y = rc_sprite[spr_id].scale.Y;
-}
-
-double rc_spriteWidth(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].frame_size.Width;
-}
-
-double rc_spriteHeight(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].frame_size.Height;
-}
-
-void rc_getSpriteSize(int spr_id, double* w, double* h)
-{
- *w = 0;
- *h = 0;
-
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- *w = rc_sprite[spr_id].frame_size.Width;
- *h = rc_sprite[spr_id].frame_size.Height;
-}
-
-void rc_setSpriteZ(int spr_id, double z)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- rc_sprite[spr_id].z = z;
- sortSpriteZ(rc_sprite[spr_id].parent_canvas);
-}
-
-double rc_spriteZ(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].z;
-}
-
-void rc_setSpriteVisible(int spr_id, bool flag)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return;
-
- if(!rc_sprite[spr_id].active)
- return;
-
- if(rc_sprite[spr_id].image_id)
- rc_sprite[spr_id].visible = flag;
- else
- rc_sprite[spr_id].visible = false;
-}
-
-bool rc_spriteIsVisible(int spr_id)
-{
- if(spr_id < 0 || spr_id >= rc_sprite.size())
- return false;
-
- if(!rc_sprite[spr_id].active)
- return false;
-
- return rc_sprite[spr_id].visible;
-}
-
-void rc_setSpriteGravity(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);
- b2World(gravity);
-}
-
-void rc_getSpriteGravity(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 = b2World.GetGravity().x;
- *y = b2World.GetGravity().y;
-}
-
-
-//-----------------------------------PHYSICS----------------------------------------------------------------------------------
-
-
-
-//This function is called on each canvas on update
-void drawSprites(int canvas_id)
-{
- float step = rc_canvas[canvas_id].physics2D.timeStep;
- int32 velocityIterations = rc_canvas[canvas_id].physics2D.velocityIterations;
- int32 positionIterations = rc_canvas[canvas_id].physics2D.positionIterations;
-
- if(rc_canvas[canvas_id].physics2D.enabled && (!hasPreUpdated))
- rc_canvas[canvas_id].physics2D.world->Step(step, velocityIterations, positionIterations);
-
- //Setting the render target to the current canvas. NOTE: I might change this target to a separate sprite layer later.
- VideoDriver->setRenderTarget(rc_canvas[canvas_id].texture, true, true);
- VideoDriver->clearBuffers(true, true, true, irr::video::SColor(0,0,0,0));
-
-
- irr::core::dimension2d src_size;
- irr::core::rect sourceRect;
-
- irr::core::position2d position;
-
- irr::core::position2d rotationPoint;
-
- irr::f32 rotation = 0;
- irr::core::vector2df scale(1.0, 1.0);
- bool useAlphaChannel = true;
- irr::video::SColor color;
-
- //irr::core::rect dest( irr::core::vector2d(x, y), irr::core::dimension2d(src_w, src_h));;
-
- irr::core::vector2df screenSize(rc_canvas[canvas_id].dimension.Width, rc_canvas[canvas_id].dimension.Height);
-
- int x = 0;
- int y = 0;
-
- b2Vec2 physics_pos;
-
- irr::f32 RAD_TO_DEG = 180.0/3.141592653589793238463;
-
- double spr_timer = SDL_GetTicks();
-
- int offset_x = rc_canvas[canvas_id].offset.X;
- int offset_y = rc_canvas[canvas_id].offset.Y;
-
- for(int spr_index = 0; spr_index < rc_canvas[canvas_id].sprite.size(); spr_index++)
- {
- rc_sprite2D_obj* sprite = rc_canvas[canvas_id].sprite[spr_index];
- if(!sprite->visible)
- continue;
-
- physics_pos = sprite->physics.body->GetPosition();
- x = (int)physics_pos.x - offset_x;
- y = (int)physics_pos.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;
-
- if( (xf < 0) || (x > ((int)rc_canvas[canvas_id].viewport.dimension.Width)) )
- {
- //std::cout << "skip draw[X]: " << spr_index << std::endl;
- continue;
- }
-
- if( (yf < 0) || (y > ((int)rc_canvas[canvas_id].viewport.dimension.Height)) )
- {
- //std::cout << "skip draw[Y]: " << spr_index << std::endl;
- continue;
- }
-
- position.set(x, y);
-
- int img_id = sprite->image_id;
- if(img_id < 0 || img_id >= rc_image.size())
- continue;
-
- //src_size = rc_image[img_id].image->getSize();
- int current_animation = sprite->current_animation;
- if((spr_timer - sprite->animation[current_animation].frame_start_time) >= sprite->animation[current_animation].frame_swap_time)
- {
- sprite->animation[current_animation].current_frame++;
-
- if(sprite->animation[current_animation].current_frame >= sprite->animation[current_animation].num_frames)
- {
- sprite->animation[current_animation].current_frame = 0;
- sprite->current_animation_loop++;
-
- if(sprite->current_animation_loop >= sprite->num_animation_loops)
- {
- if(sprite->num_animation_loops < 0)
- sprite->isPlaying = true;
- else
- sprite->isPlaying = false;
- sprite->current_animation_loop = 0;
- }
- }
-
- if(!sprite->isPlaying)
- sprite->animation[current_animation].current_frame = 0;
-
- sprite->animation[current_animation].frame_start_time = spr_timer;
- }
-
- int current_animation_frame = sprite->animation[current_animation].current_frame;
-
- int frame_x = (int)(sprite->animation[current_animation].frames[current_animation_frame]%sprite->frames_per_row)*sprite->frame_size.Width;
- int frame_y = (int)(sprite->animation[current_animation].frames[current_animation_frame]/sprite->frames_per_row)*sprite->frame_size.Height;
- irr::core::vector2d frame_pos(frame_x, frame_y);
- src_size = sprite->frame_size;
- sourceRect = irr::core::rect( frame_pos, src_size);
- //sourceRect = irr::core::rect( irr::core::vector2d(0, 0), src_size);
-
- //physics_pos = sprite->physics.body->GetPosition();
- //x = (int)physics_pos.x;
- //y = (int)physics_pos.y;
- //position.set(x, y);
-
-
- rotationPoint.set(x + (src_size.Width/2), y + (src_size.Height/2)); //TODO: need to account for offset once that is implemented
- rotation = -1 * (sprite->physics.body->GetAngle() * RAD_TO_DEG); //convert Box2D radians to degrees
-
- scale.set(sprite->scale.X, sprite->scale.Y);
-
- color.set(sprite->alpha,
- sprite->color_mod.getRed(),
- sprite->color_mod.getGreen(),
- sprite->color_mod.getBlue());
-
- //I don't want to draw an image that doesn't exists. Thats just crazy.
- draw2DImage(VideoDriver, rc_image[img_id].image, sourceRect, position, rotationPoint, rotation, scale, useAlphaChannel, color, screenSize);
- }
- //Must set back to canvas 0 (the backbuffer) before returning
-
- VideoDriver->setRenderTarget(rc_canvas[0].texture, false, false);
-}
-
-//-----------------------------END OF SPRITE STUFF------------------------------------------------------------------------------
-
-#endif // RC_SPRITELIB_H_INCLUDED
From fe5b5bc389666ca17c355bfb4aaece9845a73130 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:37:36 -0700
Subject: [PATCH 11/19] Delete getspritegravity.txt
---
getspritegravity.txt | 6 ------
1 file changed, 6 deletions(-)
delete mode 100644 getspritegravity.txt
diff --git a/getspritegravity.txt b/getspritegravity.txt
deleted file mode 100644
index fcf8f4e..0000000
--- a/getspritegravity.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-#title GetSpriteGravity [RCBasic Doc]
-#header sub GetSpriteGravity(ByRef x, ByRef y)
-
-Use this function for retrieving the global gravity vector.
-
-#ref SetSpriteGravity
From a0b3025848dea6dfa677c2ae5b35ea7c7c912123 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:38:26 -0700
Subject: [PATCH 12/19] Add files via upload
---
doc/files/getgravity2d.txt | 6 ++++++
doc/files/setgravity2d.txt | 6 ++++++
2 files changed, 12 insertions(+)
create mode 100644 doc/files/getgravity2d.txt
create mode 100644 doc/files/setgravity2d.txt
diff --git a/doc/files/getgravity2d.txt b/doc/files/getgravity2d.txt
new file mode 100644
index 0000000..a181a73
--- /dev/null
+++ b/doc/files/getgravity2d.txt
@@ -0,0 +1,6 @@
+#title GetGravity2D [RCBasic Doc]
+#header sub GetGravity2D(ByRef x, ByRef y)
+
+Use this function for retrieving the global gravity vector. A sprite canvas layer must be open.
+
+#ref SetGravity2D
diff --git a/doc/files/setgravity2d.txt b/doc/files/setgravity2d.txt
new file mode 100644
index 0000000..c3a667d
--- /dev/null
+++ b/doc/files/setgravity2d.txt
@@ -0,0 +1,6 @@
+#title SetGravity2D [RCBasic Doc]
+#header sub SetGravity2D(x, y)
+
+Use this function for setting the global gravity vector. A sprite canvas layer must be active.
+
+#ref GetGravity2D
From 8fd6acbde31300a351333bb4cc6af39454f32cca Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:39:14 -0700
Subject: [PATCH 13/19] Delete doc/files/setspritegravity.txt
---
doc/files/setspritegravity.txt | 6 ------
1 file changed, 6 deletions(-)
delete mode 100644 doc/files/setspritegravity.txt
diff --git a/doc/files/setspritegravity.txt b/doc/files/setspritegravity.txt
deleted file mode 100644
index a5f6154..0000000
--- a/doc/files/setspritegravity.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-#title SetSpriteGravity [RCBasic Doc]
-#header sub SetSpriteGravity(x, y)
-
-Use this function for setting the global gravity vector.
-
-#ref GetSpriteGravity
From b4b18b4860f5b779e8b72e5463c6a575fa52dc37 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:39:35 -0700
Subject: [PATCH 14/19] Delete doc/files/getspritegravity.txt
---
doc/files/getspritegravity.txt | 6 ------
1 file changed, 6 deletions(-)
delete mode 100644 doc/files/getspritegravity.txt
diff --git a/doc/files/getspritegravity.txt b/doc/files/getspritegravity.txt
deleted file mode 100644
index fcf8f4e..0000000
--- a/doc/files/getspritegravity.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-#title GetSpriteGravity [RCBasic Doc]
-#header sub GetSpriteGravity(ByRef x, ByRef y)
-
-Use this function for retrieving the global gravity vector.
-
-#ref SetSpriteGravity
From 3e2b01d7943bdc816e8a85abab2c70a6224d51bf Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:39:51 -0700
Subject: [PATCH 15/19] Delete doc/doc_files/getspritegravity.html
---
doc/doc_files/getspritegravity.html | 20 --------------------
1 file changed, 20 deletions(-)
delete mode 100644 doc/doc_files/getspritegravity.html
diff --git a/doc/doc_files/getspritegravity.html b/doc/doc_files/getspritegravity.html
deleted file mode 100644
index 976bef4..0000000
--- a/doc/doc_files/getspritegravity.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
- GetSpriteGravity [RCBasic Doc]
-
-
-
-
sub GetSpriteGravity(ByRef x, ByRef y)
-
- Use this function for retrieving the global gravity vector.
-
- Related:
- SetSpriteGravity
-
-
-
-
-
\ No newline at end of file
From 5221ac5e8f39c9559f576c1038c847268dbd5d6d Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:40:14 -0700
Subject: [PATCH 16/19] Delete doc/doc_files/setspritegravity.html
---
doc/doc_files/setspritegravity.html | 20 --------------------
1 file changed, 20 deletions(-)
delete mode 100644 doc/doc_files/setspritegravity.html
diff --git a/doc/doc_files/setspritegravity.html b/doc/doc_files/setspritegravity.html
deleted file mode 100644
index 7cf20d4..0000000
--- a/doc/doc_files/setspritegravity.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
- SetSpriteGravity [RCBasic Doc]
-
-
-
-
sub SetSpriteGravity(x, y)
-
- Use this function for setting the global gravity vector.
-
- Related:
- GetSpriteGravity
-
-
-
-
-
\ No newline at end of file
From cf6feab5c133c5f5151f1bb24cc9404f9a029f44 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:41:10 -0700
Subject: [PATCH 17/19] Add files via upload
---
doc/doc_files/getgravity2d.html | 20 ++++++++++++++++++++
doc/doc_files/setgravity2d.html | 20 ++++++++++++++++++++
2 files changed, 40 insertions(+)
create mode 100644 doc/doc_files/getgravity2d.html
create mode 100644 doc/doc_files/setgravity2d.html
diff --git a/doc/doc_files/getgravity2d.html b/doc/doc_files/getgravity2d.html
new file mode 100644
index 0000000..030e929
--- /dev/null
+++ b/doc/doc_files/getgravity2d.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ GetGravity2D [RCBasic Doc]
+
+
+
+
sub GetGravity2D(ByRef x, ByRef y)
+
+ Use this function for retrieving the global gravity vector. A sprite canvas layer must be open.
+
+ Related:
+ SetGravity2D
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/doc_files/setgravity2d.html b/doc/doc_files/setgravity2d.html
new file mode 100644
index 0000000..e231e64
--- /dev/null
+++ b/doc/doc_files/setgravity2d.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ SetGravity2D [RCBasic Doc]
+
+
+
+
sub SetGravity2D(x, y)
+
+ Use this function for setting the global gravity vector. A sprite canvas layer must be active.
+
+ Related:
+ GetGravity2D
+
+
+
+
+
\ No newline at end of file
From 78e3281bf3090d15a5dafb9036531615c8faa1ec Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 16:44:14 -0700
Subject: [PATCH 18/19] Fixed-Hopefully functions
---
rcbasic_runtime/rc_spritelib.h | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/rcbasic_runtime/rc_spritelib.h b/rcbasic_runtime/rc_spritelib.h
index 0796d64..31037f1 100644
--- a/rcbasic_runtime/rc_spritelib.h
+++ b/rcbasic_runtime/rc_spritelib.h
@@ -787,19 +787,20 @@ bool rc_spriteIsVisible(int spr_id)
return rc_sprite[spr_id].visible;
}
-void rc_setSpriteGravity(double x, double y)
+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)
+ if(rc_canvas[r].type != RC_CANVAS_TYPE_SPRITE)
return;
b2Vec2 gravity(x, y);
- b2World(gravity);
+ rc_canvas[rc_active_canvas].physics2D.world.SetGravity(gravity);
+
}
-void rc_getSpriteGravity(double* x, double* y)
+void rc_getGravity2d(double* x, double* y)
{
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
@@ -810,8 +811,8 @@ void rc_getSpriteGravity(double* x, double* y)
*x = 0;
*y = 0;
- *x = b2World.GetGravity().x;
- *y = b2World.GetGravity().y;
+ *x = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().x;
+ *y = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().y;
}
From 9e61ea1c5e3e2e8f96f03962d2f8c31184a0d696 Mon Sep 17 00:00:00 2001
From: arc1tec4
Date: Mon, 11 Nov 2024 20:02:07 -0700
Subject: [PATCH 19/19] Add files via upload
---
rcbasic_runtime/rc_spritelib.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/rcbasic_runtime/rc_spritelib.h b/rcbasic_runtime/rc_spritelib.h
index 31037f1..d24dfe7 100644
--- a/rcbasic_runtime/rc_spritelib.h
+++ b/rcbasic_runtime/rc_spritelib.h
@@ -792,11 +792,11 @@ void rc_setGravity2d(double x, double y)
if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size())
return;
- if(rc_canvas[r].type != RC_CANVAS_TYPE_SPRITE)
+ 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);
+ rc_canvas[rc_active_canvas].physics2D.world->SetGravity(gravity);
}
@@ -811,8 +811,8 @@ void rc_getGravity2d(double* x, double* y)
*x = 0;
*y = 0;
- *x = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().x;
- *y = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().y;
+ *x = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().x;
+ *y = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().y;
}