Jo Engine 2026.11.1
Jo Sega Saturn Engine
Loading...
Searching...
No Matches
storyboard.h
Go to the documentation of this file.
1/*
2** Jo Sega Saturn Engine
3** Copyright (c) 2012-2026, Johannes Fetz (johannesfetz@gmail.com)
4** All rights reserved.
5**
6** Redistribution and use in source and binary forms, with or without
7** modification, are permitted provided that the following conditions are met:
8** * Redistributions of source code must retain the above copyright
9** notice, this list of conditions and the following disclaimer.
10** * Redistributions in binary form must reproduce the above copyright
11** notice, this list of conditions and the following disclaimer in the
12** documentation and/or other materials provided with the distribution.
13** * Neither the name of the Johannes Fetz nor the
14** names of its contributors may be used to endorse or promote products
15** derived from this software without specific prior written permission.
16**
17** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20** DISCLAIMED. IN NO EVENT SHALL Johannes Fetz BE LIABLE FOR ANY
21** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*/
34
35#ifndef __JO_STORYBOARD_H__
36# define __JO_STORYBOARD_H__
37
38#ifdef JO_COMPILE_WITH_STORYBOARD_SUPPORT
39
43# define JO_STORYBOARD_INFINITE_DURATION (0)
44
56
58typedef struct
59{
61 unsigned int count;
62 unsigned short frame;
63 unsigned char frame_skip;
64 unsigned int limit;
68 short direction;
72
83
84/*
85** STORYBOARD AND ANIMATION FACTORY
86*/
87
95jo_storyboard *jo_storyboard_create(const bool autoplay, const bool repeat);
96
101void jo_storyboard_destroy(jo_storyboard *const storyboard);
102
111jo_animation *jo_storyboard_create_animation(jo_storyboard * const storyboard, const unsigned char frame_skip, const unsigned int duration);
112
118static __jo_force_inline void jo_storyboard_destroy_animation(jo_storyboard * const storyboard, const jo_animation * const animation)
119{
120 jo_list_remove_first_value(&storyboard->animations, (jo_list_data)(void *)animation);
121}
122
123/*
124** STORYBOARD CONTROL
125*/
126
131static __jo_force_inline void jo_storyboard_repeat(jo_storyboard * const storyboard, bool repeat)
132{
133 storyboard->repeat = repeat;
134}
135
140{
141 storyboard->pause = true;
142}
143
148{
149 storyboard->pause = false;
150}
151
156{
157 storyboard->pause = false;
158}
159
164{
165 storyboard->pause ^= true;
166}
167
168/*
169** ADD/REMOVE OBJECT IN STORYBOARD
170*/
171
177static __jo_force_inline void jo_storyboard_add_object(jo_storyboard *const storyboard, const void * const object)
178{
180
181 if (tmp == JO_NULL)
182 {
183#ifdef JO_DEBUG
184 jo_core_error("Out of memory");
185#endif
186 return ;
187 }
188 tmp->user = (jo_3d_object_attributes *)object;
189 tmp->dx = JO_MULT_BY_8(tmp->user->x);
190 tmp->dy = JO_MULT_BY_8(tmp->user->y);
191 JO_ZERO(tmp->current_cos);
192 JO_ZERO(tmp->current_sin);
193 if (jo_list_add_ptr(&storyboard->objects, tmp) == JO_NULL)
194 jo_free(tmp);
195}
196
201static __jo_force_inline void jo_storyboard_remove_object(jo_storyboard *const storyboard, const void * const object)
202{
203 jo_node *tmp;
204 for (tmp = storyboard->objects.first; tmp != JO_NULL; tmp = tmp->next)
205 if (((jo_storyboard_object_cache *)tmp->data.ptr)->user == object)
206 {
207 // The cache was allocated by jo_storyboard_add_object()
208 jo_list_free_and_remove(&storyboard->objects, tmp);
209 return ;
210 }
211}
212
213/*
214** HELPER
215*/
216
223{
224 jo_node *tmp;
225 for (tmp = storyboard->objects.first; tmp != JO_NULL; tmp = tmp->next)
226 if (((jo_storyboard_object_cache *)tmp->data.ptr)->user == object)
227 return ((jo_storyboard_object_cache *)tmp->data.ptr);
228 return (JO_NULL);
229}
230
236static __jo_force_inline void jo_storyboard_reset_object_position(jo_storyboard * const storyboard, const void * const object)
237{
239
240 if (cache == JO_NULL)
241 return;
242 cache->dx = JO_MULT_BY_8(cache->user->x);
243 cache->dy = JO_MULT_BY_8(cache->user->y);
244}
245
253static __jo_force_inline jo_storyboard *jo_storyboard_create_for_object(const bool autoplay, const bool repeat, const void * const object)
254{
255 jo_storyboard *storyboard = jo_storyboard_create(autoplay, repeat);
256
257 jo_storyboard_add_object(storyboard, object);
258 return storyboard;
259}
260
261/*
262** QUICK ANIMATION FACTORY
263*/
264
273static __jo_force_inline jo_animation *jo_storyboard_create_rotation_animation(jo_storyboard * const storyboard, const char speed, const unsigned int duration)
274{
275 jo_animation *animation = jo_storyboard_create_animation(storyboard, 0, duration);
276
277 animation->rotation_speed = speed;
278 return animation;
279}
280
288static __jo_force_inline jo_animation *jo_storyboard_create_translation_animation(jo_storyboard *const storyboard, const short angle, const char speed, const unsigned int duration)
289{
290 jo_animation *animation = jo_storyboard_create_animation(storyboard, 0, duration);
291
292 animation->direction = angle;
293 animation->translation_speed_x = speed;
294 animation->translation_speed_y = speed;
295 return (animation);
296}
297
305static __jo_force_inline jo_animation *jo_storyboard_create_translation_animation_using_direction(jo_storyboard * const storyboard, const jo_8_directions direction, const char speed, const unsigned int duration)
306{
307 return (jo_storyboard_create_translation_animation(storyboard, jo_direction_to_angle(direction), speed, duration));
308}
309
317static __jo_force_inline jo_animation *jo_storyboard_create_circle_animation(jo_storyboard * const storyboard, const short radius, const char speed, const unsigned int duration)
318{
319 jo_animation *animation = jo_storyboard_create_animation(storyboard, 0, duration);
320
321 animation->sin_radius = radius;
322 animation->cos_radius = radius;
323 animation->translation_speed_x = speed;
324 animation->translation_speed_y = speed;
325 return (animation);
326}
327
328/*
329** QUICK STORYBOARD FACTORY FOR OBJECT
330*/
331
340static __jo_force_inline jo_storyboard *jo_storyboard_rotate_object(const void * const object, const char speed, const unsigned int duration)
341{
342 jo_storyboard *storyboard = jo_storyboard_create_for_object(true, false, object);
343
344 jo_storyboard_create_rotation_animation(storyboard, speed, duration);
345 return (storyboard);
346}
347
355static __jo_force_inline jo_storyboard *jo_storyboard_move_object(const void * const object, const short angle, const char speed, const unsigned int duration)
356{
357 jo_storyboard *storyboard = jo_storyboard_create_for_object(true, false, object);
358
359 jo_storyboard_create_translation_animation(storyboard, angle, speed, duration);
360 return (storyboard);
361}
362
370static __jo_force_inline jo_storyboard *jo_storyboard_move_object_in_direction(const void * const object, const jo_8_directions direction, const char speed, const unsigned int duration)
371{
372 jo_storyboard *storyboard = jo_storyboard_create_for_object(true, false, object);
373
374 jo_storyboard_create_translation_animation_using_direction(storyboard, direction, speed, duration);
375 return (storyboard);
376}
377
385static __jo_force_inline jo_storyboard *jo_storyboard_move_object_in_circle(const void * const object, const short radius, const char speed, const unsigned int duration)
386{
387 jo_storyboard *storyboard = jo_storyboard_create_for_object(true, false, object);
388
389 jo_storyboard_create_circle_animation(storyboard, radius, speed, duration);
390 return storyboard;
391}
392
393#endif /* !JO_COMPILE_WITH_STORYBOARD_SUPPORT */
394
395#endif /* !__JO_STORYBOARD_H__ */
396
397/*
398** END OF FILE
399*/
#define jo_core_error(...)
Definition core.h:48
static __jo_force_inline jo_node * jo_list_add_ptr(jo_list *const list, void *ptr)
Add a pointer on the list.
Definition list.h:106
jo_list_data data
Definition list.h:67
jo_node * first
Definition list.h:76
struct __jo_node jo_node
Node type.
Definition list.h:39
static __jo_force_inline void jo_list_free_and_remove(jo_list *const list, const jo_node *const node_to_delete)
Free node pointer and remove the item from the list.
Definition list.h:143
void * ptr
Definition list.h:59
jo_node * next
Definition list.h:69
static __jo_force_inline bool jo_list_remove_first_value(jo_list *const list, jo_list_data data)
Remove the first item on the list that match DATA.
Definition list.h:254
List struct.
Definition list.h:74
Node data (4 bytes).
Definition list.h:49
void jo_free(const void *const p)
function frees the memory space pointed to by p
void * jo_malloc_with_behaviour(unsigned int n, const jo_malloc_behaviour behaviour)
dynamic memory allocator with specific behaviour
@ JO_MALLOC_TRY_REUSE_SAME_BLOCK_SIZE
A little bit slower than JO_MALLOC_TRY_REUSE_BLOCK but reduce memory usage.
Definition malloc.h:77
static __jo_force_inline short jo_direction_to_angle(const jo_8_directions direction)
Convert jo_8_directions to angle in degree.
Definition math.h:2188
#define JO_MULT_BY_8(X)
Multiply a variable by 8.
Definition math.h:81
#define JO_ZERO(X)
Set a variable to zero.
Definition math.h:240
static __jo_force_inline jo_storyboard * jo_storyboard_move_object_in_circle(const void *const object, const short radius, const char speed, const unsigned int duration)
Create a circle rotation storyboard for a specific object.
Definition storyboard.h:385
char rotation_speed
Definition storyboard.h:65
static __jo_force_inline void jo_storyboard_remove_object(jo_storyboard *const storyboard, const void *const object)
Remove object from storyboard.
Definition storyboard.h:201
static __jo_force_inline void jo_storyboard_repeat(jo_storyboard *const storyboard, bool repeat)
Storyboard repeat control.
Definition storyboard.h:131
jo_list animations
Definition storyboard.h:79
unsigned char frame_skip
Definition storyboard.h:63
static __jo_force_inline void jo_storyboard_destroy_animation(jo_storyboard *const storyboard, const jo_animation *const animation)
Destroy animation.
Definition storyboard.h:118
short cos_radius
Definition storyboard.h:66
static __jo_force_inline jo_animation * jo_storyboard_create_translation_animation_using_direction(jo_storyboard *const storyboard, const jo_8_directions direction, const char speed, const unsigned int duration)
Create a translation animation using jo_8_directions enum.
Definition storyboard.h:305
unsigned int count
Definition storyboard.h:61
char translation_speed_x
Definition storyboard.h:69
short current_sin
Definition storyboard.h:54
jo_3d_object_attributes * user
Definition storyboard.h:50
static __jo_force_inline void jo_storyboard_play(jo_storyboard *const storyboard)
Play storyboard animation.
Definition storyboard.h:155
static __jo_force_inline void jo_storyboard_reset_object_position(jo_storyboard *const storyboard, const void *const object)
Reset object position.
Definition storyboard.h:236
static __jo_force_inline jo_storyboard * jo_storyboard_move_object_in_direction(const void *const object, const jo_8_directions direction, const char speed, const unsigned int duration)
Create a translation animation storyboard for a specific object using jo_8_directions enum.
Definition storyboard.h:370
bool disabled
Definition storyboard.h:60
static __jo_force_inline void jo_storyboard_resume(jo_storyboard *const storyboard)
Resume all suspended storyboard animation.
Definition storyboard.h:147
static __jo_force_inline void jo_storyboard_suspend(jo_storyboard *const storyboard)
Suspend all storyboard animation.
Definition storyboard.h:139
static __jo_force_inline jo_animation * jo_storyboard_create_circle_animation(jo_storyboard *const storyboard, const short radius, const char speed, const unsigned int duration)
Create a circle rotation animation.
Definition storyboard.h:317
static __jo_force_inline jo_storyboard * jo_storyboard_rotate_object(const void *const object, const char speed, const unsigned int duration)
Create a rotation animation storyboard for a specific object.
Definition storyboard.h:340
void jo_storyboard_destroy(jo_storyboard *const storyboard)
Destroy the storyboard.
jo_list objects
Definition storyboard.h:78
jo_storyboard * jo_storyboard_create(const bool autoplay, const bool repeat)
Create an empty storyboard.
int dy
Definition storyboard.h:52
char translation_speed_y
Definition storyboard.h:70
unsigned int limit
Definition storyboard.h:64
short sin_radius
Definition storyboard.h:67
short direction
Definition storyboard.h:68
static __jo_force_inline jo_animation * jo_storyboard_create_rotation_animation(jo_storyboard *const storyboard, const char speed, const unsigned int duration)
Create a rotation animation.
Definition storyboard.h:273
short current_cos
Definition storyboard.h:53
jo_animation * jo_storyboard_create_animation(jo_storyboard *const storyboard, const unsigned char frame_skip, const unsigned int duration)
Create an empty animation.
static __jo_force_inline jo_storyboard * jo_storyboard_create_for_object(const bool autoplay, const bool repeat, const void *const object)
Create a new storyboard for the object.
Definition storyboard.h:253
unsigned short frame
Definition storyboard.h:62
static __jo_force_inline void jo_storyboard_add_object(jo_storyboard *const storyboard, const void *const object)
Add object in storyboard.
Definition storyboard.h:177
int dx
Definition storyboard.h:51
static __jo_force_inline jo_animation * jo_storyboard_create_translation_animation(jo_storyboard *const storyboard, const short angle, const char speed, const unsigned int duration)
Create a translation animation.
Definition storyboard.h:288
static __jo_force_inline jo_storyboard * jo_storyboard_move_object(const void *const object, const short angle, const char speed, const unsigned int duration)
Create a translation animation storyboard for a specific object.
Definition storyboard.h:355
bool pause
Definition storyboard.h:81
static __jo_force_inline void jo_storyboard_toggle(jo_storyboard *const storyboard)
Switch between resume and suspend.
Definition storyboard.h:163
bool repeat
Definition storyboard.h:80
static __jo_force_inline jo_storyboard_object_cache * jo_storyboard_get_object_cache(jo_storyboard *const storyboard, const void *const object)
Get object storyboard cache.
Definition storyboard.h:222
Object animation definition.
Definition storyboard.h:59
Storyboard definition.
Definition storyboard.h:77
Internal object cache.
Definition storyboard.h:49
#define JO_NULL
NULL implementation.
Definition tools.h:239
#define __jo_force_inline
force inline attribute (and prevent Doxygen prototype parsing bug)
Definition types.h:39
jo_8_directions
8 directions definition
Definition types.h:308
Object for 3D manipulation (storyboard) using fixed number.
Definition types.h:129