-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCHANGELOG-CURR.txt
More file actions
1206 lines (1100 loc) · 61 KB
/
Copy pathCHANGELOG-CURR.txt
File metadata and controls
1206 lines (1100 loc) · 61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
* 7.11
** [Samples] Added =samples/07_advanced_audio/04_synchronized_audio=
Special thanks to [[traviswattigney.com][Travis Wattigney]] [[@traviswattigney][Instagram]]
for providing bad ass audio tracks under MIT.
** [Bugfix] Ensure that initial bits of audio do not cut out when played.
The sample =samples/07_advanced_audio/04_synchronized_audio= definitely maybe proves that this is now fixed.
** [Bugfix] Playback of audio picks up where it left off for audio what was paused, then subsequently unpaused.
Ryan is banned from updating mojoAL ever again.
* 7.10
** [Support] Added license information to =open-source-licenses.txt= for default font used in DR.
** [Support] Improved ~args.audio~ requeue behavior of Hash instances that have been previously used.
** [Support] ~args.audio~ proactively throws an exception if object queued isn't a ~Hash~ (or ~nil~).
As opposed to segfaulting within C code when object isn't a ~Hash~
** [Support] Improved warnings about queueing audio instances that are still in use.
* 7.9
** [Bugfix] ~looping~ property is respected on objects sent to ~args.audio~.
* 7.8
** [Pro] [News] Experimental release of new shader capabilities queued for the first week of July.
** [Support] Increased max limit of texture entries to 2048.
More textures will be cached behind the scenes before cache ejection occurs.
** [Support] Improved audio playback synchronization/performance.
Machinery moved to C. Removed unnecessary resynchronization calls
during ~tick~.
** [Support] Added warning + backtrace for audio references that are already playing.
Warning message about queueing a ~Hash~ reference that's already
playing will print the callstack before skipping the queue request.
** [Bugfix] Audio playtime now returns the correct value for the seek head.
** [Support] Added ~Grid#refresh_rate~.
** [Bugfix] Fixed high CPU usage while waiting for export of render primitives.
Displays with high refresh rates (mobile devices specifically) had
high CPU usage while waiting for what to render next. Regression
was introduced in 6.51.
* 7.7
** [Bugfix] Fixed HTTP apis for web builds.
Emscripten 5 changed ~Module.HEAPU8.set~ to ~HEAPU8.set~.
** [Bugfix] Fixed framerate drops on Steam Deck (Linux x86_64).
** [Bugfix] Fixed audio playback for web builds.
Cause was uninitialized pointer in PHYSFS (audio playback
accidentally worked if stack was aligned).
I asked Ryan when we were going to rewrite everything in Rust. He muted me.
** [Supported] Updated Linux SDL builds to include Wayland.
* 7.6
** [Pro] [Support] [iOS] Added entitlements explaining that bluetooth is required for gamepads.
** [Pro] [Support] [iOS] Improvements to IOSWizard.
- Checks to see if imagemagick is installed.
- Icons for all devices sizes are generated automatically off of =./metadata/icon_ios.png=.
- Game will auto launch after installation.
** [Support] ~dragonruby-publish~ now warns if audio files are not encoded correctly.
** [Support] ~dragonruby-publish~ warning messages moved as a summary after build is completed.
Summary includes warnings about audio encoding, and warnings about file names with spaces and/or capital letters.
** [Support] Removed warning message when ctrl+r shortcut is used to reset the game.
** [Support] Improved invalidation of cached textures and render targets when reset occurs.
** [Support] libSDL recompiled without camera apis.
** [Support] RNG stable for replays regardless of whether it's started from CLI or through HUD.
** [Bugfix] Fixed ~mouse.(relative_x|relative_y)~ to report correct values on monitors with high refresh rates.
** [Bugfix] Fixed game focus issue when game is started up in dev mode on MacOS.
** [Bugfix] Game's window size starts up at a logical 720p on Windows for any combination of hd/highdpi.
** [Bugfix] Terminal on Windows correctly redirects logs to standard out instead of giving a blank screen.
Special thanks to RedComputer@discord, Lucas@discord, red_garuda@discord, redbeehive@discord,
Trevor@discord, and Null@discord for reporting/testing bugs that Ryan introduced.
* 7.5
** [Bugfix] Fixed allocator failures in ~Zlib.(compress|uncompress)~
Regression was introduced in 7.0.
** [Bugfix] =./docs/version.txt= was not being updated on deployments. This has been fixed.
Regression was introduced in 7.4 (this was definitely Ryan's fault).
* 7.4
** [Support] [Pro] [iOS] iOS Wizard improved.
Better error messages (fixed silent failures). Game is uninstalled before deploying a new version.
** [Support] [Pro] [iOS] Updated entitlements so that Game Mode is enabled by default.
This tells the device to give a larger share of resources to the game.
** [Bugfix] [Support] New functions on ~Numeric~ ~(mid|mid?|between?|min|max)~.
See docs for more details.
** [Bugfix] Fixed Geometry#intersect_circle? to use the correct primitive when testing for intersection.
** [Bugfix] Keyboard#truthy_keys scrubbed for attr_readers that aren't directly associated with a key on the keyboard.
** [Support] New ~Controller~ apis added.
- Added button aliases for ~y~, ~a~, ~b~, ~x~ -> ~n~/~north~, ~s~/~south~, ~e~/~east~, ~w~/~west~.
- Added button ~accept~ and ~cancel~ which contextually maps to A (east) for Switch Controller, X (south) for PS5, and A (south) for Xbox.
- ~directional_vector_left~ will give you DPAD + Left Analog
- ~directional_vector_right~ will give you Buttons + Right Analog (helpful for twin stick shooters).
** [Support] ~Main~ module quacks like ~attr_dr~.
- ~args~ no longer needs to be passed in to top level functions.
- ~args~, ~inputs~, ~outputs~, ~state~, ~events~, and ~audio~ are directly accessible from any function defined in ~Main~.
- ~start~ function added to ~Main~ which will run before ~tick~ when ~Kernel.tick_count == 0~.
Example of new ~Main~ capabilities:
#+begin_src
module Main
def boot
# invoked once when the game boots
puts "boot: #{Kernel.tick_count}"
end
def start
# invoked on Kernel.tick_count == 0 before tick is invoked
puts "start: #{Kernel.tick_count}"
state.some_variable = 0
end
def tick
# invoked at 60hz
if Kernel.tick_count.zmod?(30)
# state top level function
state.some_variable += 1
puts "state.some_variable: #{state.some_variable}"
end
if Kernel.tick_count.zmod?(60)
puts "tick: #{Kernel.tick_count}"
end
# inputs top level function
if inputs.keyboard.key_down.enter
puts "inputs.keyboard.key_down.enter #{Kernel.tick_count}"
end
# outputs top level function
outputs.background_color = [30, 30, 30]
end
def reset
# invoked before reset occurs
puts "reset #{Kernel.tick_count}"
end
def did_reset
# invoked after reset occurs
puts "did_reset #{Kernel.tick_count}"
end
def shutdown
# invoked once before game exits
puts "shutdown #{Kernel.tick_count}"
end
end
DR.reset
#+end_src
* 7.3
** [Bugfix] Ensure that ~hd=true~ is respected in Standard and Indie license tiers.
** [Support] [Pro] Added ~DR.start_text_input~ and ~DR.stop_text_input~ which will show a virtual keyboard on mobile devices.
~DR.start_text_input~ must be called for ~args.inputs.text~ property
to be populated (on touch devices, this will bring up the on-screen
keyboard). To dismiss the on-screen keyboard/exit keyboard input, you
must call ~DR.stop_text_input~. If ~args.inputs.text~ is consulted in
your code, then a warning message will be printed and ~DR.start_text_input~
will be called on your behalf.
=./oss/dragon/console.rb= now leverages these functions.
** [Known Issues] Synthesis not working on web builds.
** [Known Issues] Scaling issues for Windows + Chrome + Page Magnification != 100%.
* 7.2
** [Bugfix] Reverted ~Geometry#find_collisions~.
The change made in 6.47 were incorrectly implemented and changed the original behavior of this function.
** [Docs] Docs updated for ~Geometry#find_collisions~ to clarify its behavior.
** [Support] ~Geometry#each_intersect_rect's~ second parameter is optional.
** [Support] Updated ~Geometry#find_collisions~ to accept an optional second parameter.
** [Samples] Updated unit tests for ~Geometry~ functions.
Sample app location: =samples/10_advanced_debugging/03_unit_tests=
* 7.1
** [Bugfix] Ensure that SDL_HINT_MAC_PRESS_AND_HOLD is set to 0.
** [Bugfix] Fixed mouse location for non-standard aspect ratios when hd=false.
** [Bugfix] Ensure sprite path's c pointer is exported correctly when sending to the render pipeline.
* 7.0
** [IMPORTANT] This release does NOT contain breaking changes. This is an epoch version bump.
- DragonRuby is now powered with SDL3 release-3.4.4.
- DragonRuby Web Builds now target Emscripten 5.0.4.
- Keep an eye out for a devlog entry on Itch about what's coming next (hint: shaders).
- NOTE: C-extensions will need to be recompiled (let us know if you have any issues).
** [Pro] [C Extensions] SDL2 thread and atomic APIs are available as backward-compatible polyfills.
The following SDL2 APIs are forwarded to their SDL3 equivalents via =dragonruby.h=:
- ~SDL_atomic_t~ (forwards to ~SDL_AtomicInt~)
- ~SDL_AtomicSet~ (forwards to ~SDL_SetAtomicInt~)
- ~SDL_AtomicGet~ (forwards to ~SDL_GetAtomicInt~)
- ~SDL_CreateThread~ (forwards to ~SDL_CreateThreadRuntime~, works on all platforms including Windows)
- ~SDL_WaitThread~ (unchanged)
** [Pro] [Samples] Updated =samples/12_c_extensions/09_handcrafted_thread= to use new SDL3 apis.
** [Samples] Updated =samples/99_genre_simulation/sand_simulation= to use modern DR apis.
It's a much fancier demo than what was previously there.
** [Samples] Updated =samples/99_genre_simulation/sand_simulation= to use modern DR apis.
** [Support] HD mode is now available at all license tiers (just a reminder).
** [Support] The ~scale_quality~ config value in ~metadata/game_metadata.txt~ now supports Pixel Art scaling.
- Demo of Pixel Art Scaling: [https://youtu.be/tnHYzaX9y3o]
- See cvars docs section and sample located at =samples/01_rendering_basics/06_scale_quality_game_metadata=.
** [Support] Sprite primitives can accept ~scale_quality_enum~ value ~3~ (which represents Pixel Art scaling).
** [Support] Label primitives can now accept ~scale_quality_enum~.
** [Support] Added ~boot~, ~reset~, ~did_reset~, and ~tick~ hook functions to =./docs/oss/dragon/runtime/tick.rb=
Reference code can be added to the top of =main.rb= in case you want to change internal behavior of
these functions... update at your own risk ;-)
** [Performance] Small performance improvements to glyph caching for fonts/labels.
** [Performance] Prioritize ~draw_override~ over ~attr_sprite~ when exporting primitives to the render pipeline.
** [Bugfix] Audio queue safely handles re-assignment of a new audio to a key that already has audio playing.
* 6.58
** [Bugfix] Ensure that string values sent to rendering always have C strings that are null terminated.
Regression was introduced in version 6.45.
** [Samples] Updated Twin Stick sample app to support multi-platform input (keyboard, gamepad, and touch).
Sample app location: =samples/99_genre_arcade/twinstick=
** [Samples] Added sample app that helps in starting a low rez game.
Sample app location: =samples/99_genre_lowrez/00_lowrez_starting_point=
** [Samples] Added sample app that shows how to do grid aligned movement with collision (such as in games like Factorio)
Sample app location: =samples/04_physics_and_collisions/01_simple_aabb_grid_aligned_movement_advanced=
** [Support] ~Geometry.vec2_normalize~ returns ~nil~ instead of ~Hash[x: NaN, y: NaN]~.
This mirrors the behavior of ~args.inputs.directional_vector~.
** [Support] Added ~.directional_vector~ variants to Keyboard, and Controller for finer grained control.
- ~Controller#directional_vector_dpad~
- ~Controller#directional_vector_left_analog~
- ~Controller#directional_vector_left_analog_cardinal~
- ~Controller#directional_vector_right_analog~
- ~Controller#directional_vector_right_analog_cardinal~
- ~Keyboard#directional_vector_wasd~
- ~Keyboard#directional_vector_arrow~
* 6.57
** [Bugfix] Fixed render artifacts produced by double buffering.
** [Support] Partial re-introduction of frame smoothing logic from 6.49.
We are still finding the best balance in rendering for lowend/highend hardware.
Let us know if you see frame stuttering on Windows.
* 6.56
** [Support] HD mode is now available at all license tiers.
New project template's =./mygame/metadata/game_metadata.txt= has the following properties enabled by default:
#+begin_src
hd=true
scale_quality=2
#+end_src
NOTE: High DPI, Texture Atlases, and All Screen mode still requires a Pro license.
** [Bugfix] Reusing a byref ~Hash~ in ~args.audio~ no longer causes a segfault.
** [Support] The default hello world app that ships with DR has been updated to use ~Main~ module.
** [Support] Rendering pipeline now double buffers.
This will hopefully smooth out any stuttering during render for fast animations on Windows.
Frame smoothing was removed in 6.50, if you're still seeing shuddering on your hardware, let us know.
** [Samples] Updated =samples/05_mouse/03_mouse_move_paint_app= to use modern DR Apis.
Special thanks to lyniat@discord for PR/updates.
* 6.55
** [Samples] Added sample app that shows how to do grid aligned movement (like in pacman).
Sample app location: =samples/04_physics_and_collisions/01_simple_aabb_grid_aligned_movement=
** [Samples] Removed =99_genre_rpg_narrative/return_of_serenity= sample app.
The code in the sample app was horrible and not worth salvaging. Yes, it was that bad.
** [Support] Added custom blendmode support to Triangle primitives.
See the following sample app for example usage: =./samples/07_advanced_rendering/20_rings=
** [Support] Using the ~Main~ module automatically disables ~OpenEntity~ and ~Array~ primitives.
IMPORTANT: ~OpenEntity~ and ~Array~ primitives are both deprecated. It's strongly encouraged
that you start using ~Main~ and define ~def tick args~ within there.
Before this version, disabling ~OpenEntity~ and ~Array~ primitives was done by doing the following:
#+begin_src ruby
def boot args
# signifies that ~OpenEntity~ should be disabled,
# and ~Array~ primitives should be disabled:
args.state = {} # not very intuitive
end
def tick args
end
#+end_src
You can now do get the same behavior by doing:
#+begin_src ruby
module Main
def tick args
end
end
#+end_src
** [Support] The default hello world app that ships with DR has been updated to use ~Main~ module.
Getting started guide has also been updated to use ~Main~ module.
IMPORTANT: ~OpenEntity~ and ~Array~ primitives are both deprecated. It's strongly encouraged
that you start using ~Main~ and define ~def tick args~ within there.
* 6.54
** [Samples] Added Advanced A* path finding sample app.
Sample app location: =./samples/13_path_finding_algorithms/08_a_star_advanced~
** [Support] ~dragonruby-publish~ always packages ~./app~ and ~./metadata~.
** [Support] Disable hotload if ~DR.production?~ is true.
** [Support] Added ~attr_dr~ to mirror the GTK to DR change in the previous release.
** [Docs] Occurrences of ~GTK~ replaced with ~DR~. Occurrences of ~attr_gtk~ replaced with ~attr_dr~.
You can still use ~GTK~/~$gtk~ and ~attr_gtk~ if you want (they won't be removed).
* 6.53
** [Samples] Added sample app that shows how to build a c-extension that uses SQLite.
Sample app location: =./samples/12_c_extensions/10_sqlite3=
** [Samples] Updated cubic bezier sample app with drag/adjustments of curves.
Sample app location: =./samples/08_tweening_lerping_easing_functions/02_cubic_bezier=
** [Support] Aliased ~GTK~ to ~DR~ because GTK get's confused with the the cross platform widget toolkit.
Eventually all sample apps and docs will use ~DR~ over ~$gtk~ and ~GTK~. These older aliases will not be removed so
you can continue using them if that's what you're used to.
** [Support] Ensure that ~mrb_close~ and ~def shutdown args~ is invoked during ~DR.reboot~ and when exiting the game completely.
** [Support] Added ~Geometry#cubic_bezier_vec2~.
** [Support] Addeed ~Main~ module for better control/scoping of DR's entry point.
Defining the following will be detected by DR as a ~tick~ entry point:
#+begin_src ruby
module Main
def tick args
end
# other top level functions will also be detected: boot, reset, did_reset, shutdown
end
#+end_src
The module declaration will take precedence over ~self~ defined ~tick~:
#+begin_src ruby
def self.tick args
end
#+end_src
Which takes precidence over ~Object~ defined ~tick~:
#+begin_src ruby
def tick args
end
#+end_src
More complex reference implementations/samples will begin to
use ~Main~ (where it's most useful to leverage).
* 6.52
** [Samples] Added sample app that shows how to create an onscreen joystick.
Sample app location: =./samples/02_input_basics/06_touch_onscreen_joystick=
** [Performance] Added finer grained usage of GC arena save/restore.
Overall GC pressure reduction for FFI functions, before tick entry, and after tick completion.
Thank you to xenobrain@discord and redbeehive@dicord for kicking the tires on this change.
** [Support] Added ~Geometry.angle_cardinal_vec2~
Function returns a vector for angle snapped to the nearest 45 degree direction.
** [Support] Updated isometric sprites within the deploy template to be a ratio of 2:1.
* 6.51
** [Bugfix] Reverted GC arena changes in 6.50 until we can ensure that there aren't any memory leaks with the new approach.
* 6.50
** [Performance] Added more fine grained usage of GC arena save and restoration for actions that occur before and after ~tick~.
This should yield lower memory usage and GC pressure overall.
** [Performance] Removed FPS smoothing logic within the render thread, allowing the render pass to be closer to the monitor's refresh rate.
Please let us know if things look better if you have a high refresh rate monitor.
** [Performance] Doubled MRB_HEAP_PAGE_SIZE from 4KB to 8KB.
** [Support] Remove once required files from hotload list if they are later deleted.
** [Support] Shortend "add :serialize to object" warning during exception export.
Scrolling up to see the exception was annoying.
** [Support] DR no longer pre-defines an empty `def tick args` function.
To avoid polluting ~Object~, DR no longer defines ~def tick args~ on initialization.
This gives you the option to define the ~tick~ function on ~Object~:
#+begin_src ruby
def boot args
end
def tick args
end
def reset args
end
#+end_src
OR scope ~tick~ to only ~top level~:
#+begin_src ruby
def self.boot args
end
def self.tick args
end
def self.reset args
end
#+end_src
Using the latter approach avoids polluting ~Object~ with ~boot~,
~tick~, ~reset~, etc (at the expense of needing a deeper/more
nuanced understanding of Ruby...).
** [Support] GTK is now aware of ~did_reset~ defined on ~top level~.
Function will be invoked after DR's internal reset has completed.
** [Support] Added ~FFI::Draw#draw_sprite_ivar~ which can be leveraged
within primitives that implement ~draw_override~.
See sample for usages: =./samples/09_performance/07_static_sprites_as_classes_with_custom_drawing=.
Note: DO NOT prematurely optimize your primitive rendering usages
with ~draw_override~ or default to using ~outputs.static_*~. Unless
you are needing extremely fast rendering (eg you are rendering a
10,000+ sprites), the cognotive overhead and boiler plate isn't
worth the effort.
* 6.49
** [Pro] [Android] [Bugfix] Fixed 16-bit alignment issue that occurs for only some bundle sizes.
* 6.48
** [Support] ~AttrSprite~ implements serialize.
** [Support] Cleaned up logic for determining what is considered a primitive(s).
An object sent to ~args.outputs.*~ is considered a primitive if ANY of the following are true:
- Object is a ~Hash~
- Object is an ~AttrSprite~
- Object responds to ~primitive_marker~ and returns either ~:solid~, ~:label~, ~:sprite~, ~:line~, or ~:border~.
- Object responds to to ~:x~, and ~:path~.
- Object responds to ~:x~, and ~:text~.
- Object responds to ~:to_a~ (collection of primitives).
- Object responds to ~draw_override~.
*** Note on ~draw_override~
~draw_override~ was introduced six years ago in version 1.0 to address performance concerns/gives you the ability
to be "as close to the metal as possible" (at the expense of a less ergonomic API). Around that time, ~Hash~ based
rendering limits were ~1k sprites at 60 fps. The current ~Hash~ based render limit is ~35k. Deprecation of this
function is being taken into consideration and it's recommended that you avoid using this behavior.
*** Note on ~to_a~ as an implicit conversion:
It was proposed that ~render~ plus a ~Renderable~ construct should be added as another means
of implicit conversion. Here are the reasons why this was not added:
- The properties on ~args.outputs~ are all collections/queues. ~to_a~ (ie another collection) is "near"
the types on ~args.outputs~ (specifically because of ~args.outputs~ capability of accepting jagged
arrays of primitives)
- Using core Ruby classes and core functions protects the dev from taking on dependencies of the engine. ~args.outputs~
tries to rely only on the shape of an object and what it responds to as opposed to an engine specific type (I want to avoid hard
dependencies such as "all objects must inherit from MonoBehavior").
- Having an implicit conversion based on an object responding to ~render~ overloads an extremely common method game devs use
for their own constructs (and as stated earlier, creating an engine centric module that scopes the use of the ~render~ function
forces the dev to take on a hard dependency on the engine).
- Wrt hard dependencies on an engine: ~AttrSprite~ can be considered as one, but it's a data object/"plain old ruby object"
that can be reconstructed trivially.
- An additional reason ~draw_override~ is considered for deprecation: it's the only primitives behavior that
isn't data-oriented (relies on side-effects from invoking ffi methods).
*** Implementation options
While ~to_a~ may not be the best name, its benefits are: it's a core Ruby function; it's consistent with what ~args.outputs~
accepts (jagged collections of primitives); it does not introduce an engine centric type; it doesn't "take away" a common function
game devs naturally use (eg ~render~).
Here are the options available to you:
Assume a ~Player~ class:
#+begin_src ruby
class Player
attr :x, :y, :name
def initialize(x, y, name)
@x = x
@y = y
@name = name
end
end
#+end_src
Option - Pure, stateless function:
#+begin_src
module PlayerRenderable
def self.for(player)
[
{ x: player.x, y: player.y, w: 32, h: 32, path: :solid, r: 255, g: 0, b: 0 },
{ x: player.x, y: player.y, text: player.name }
]
end
end
def tick args
args.state.player ||= Player.new(0, 0, "Player1")
args.outputs.primitives << PlayerRenderable.for(args.state.player)
end
#+end_src
Option - Player is responsible for providing primitives:
#+begin_src ruby
class Player
def primitives
[
{ x: @x, y: @y, w: 32, h: 32, path: :solid, r: 255, g: 0, b: 0 },
{ x: @x, y: @y, text: @name }
]
end
end
def tick args
args.state.player ||= Player.new(100, 100, "Player1")
args.outputs.sprites << args.state.player.primitives
end
#+end_src
Option - Opt into implicit conversion by aliasing ~to_a~:
#+begin_src ruby
class Renderable
def to_a = render
end
class PlayerRenderable < Renderable
def initialize(player)
@player = player
end
def render
[
{ x: @player.x, y: @player.y, w: 32, h: 32, path: :solid, r: 255, g: 0, b: 0 },
{ x: @player.x, y: @player.y, text: @player.name }
]
end
end
def tick args
args.state.player ||= Player.new(100, 100, "Player1")
args.outputs.sprites << PlayerRenderable.render(args.state.player)
end
#+end_src
Option - Leverage built-in/core ~Enumerable~ module:
#+begin_src ruby
class PlayerRenderable
include Enumerable
def initialize(player)
@player = player
end
def each
yield({ x: @player.x, y: @player.y, w: 32, h: 32, path: :solid, r: 255, g: 0, b: 0 })
yield({ x: @player.x, y: @player.y, text: @player.name })
end
end
def tick args
args.state.player ||= Player.new(0, 0, "Player1")
args.outputs.primitives << PlayerRenderable.new(args.state.player)
end
#+end_src
As for which option you should choose:
- Do the minimum needed to vet your game/prototype.
- Let patterns for your game emerge as you build.
- Refactor/consolidate once you see a repeating/common structure.
* 6.47
** [Bugfix] Fixed segfault with ~Geometry.find_collisions~.
** [Support] Added perlin noise functions (stb_perlin).
- ~Geometry.perlin_noise~
- ~Geometry.perlin_noise_seed~
- ~Geometry.perlin_ridge_noise~
- ~Geometry.perlin_fbm_noise~
- ~Geometry.perlin_turbulence_noise~
See docs for details of how to use these functions.
** [Support] Added ./sprites/circle/solid.png as a default texture.
It's a solid white circle that you can use to render a circle to
the screen (and change its color by providing rgb to the sprite
primitive).
** [Samples] Added perlin noise sample app.
Sample app demonstrates the generation of various perlin noise functions.
Sample app location: =./samples/08_procgen/01_perlin_noise=
** [Samples] Added sample app showing how to create a clipped circular minimap.
Sample app location: =./samples/07_advanced_rendering/22_circular_minimap_clip_area=
** [Samples] Added sample app that shows an RTS starting point.
Sample app locaiton: =./samples/99_genre_rts/01_rts_starting_point=
* 6.46
** [Pro] [Support] Added ~Layout.allscreen_rect~.
Function provides correct Grid alignment within render targets when ~hd_letterbox=false~.
** [Samples] Added sample app that shows how to combine easing and lerping functions for visual effects.
Sample app location: =samples/08_tweening_lerping_easing_functions/02_easing_and_lerping_combined=
** [Samples] Added sample app/reference implementation that shows multi orientation, multi platform scene management.
Sample app location: =./samples/07_advanced_rendering_hd/06_multi_platform_multi_orientation=
** [Support] ~Mouse#rect~ accepts ~offset:~ optional parameter for (convenience function).
This is helpful when determing mouse position within a render target (offset is added to x, y of rect).
** [Support] ~Geometry.rect_props~ moved to a C implementation.
Re-implemented in C because it's a commonly used method across ~Geometry~.
** [Support] ~Geometry.zoom_rect~ added.
Function rescales rect that's passed in while retaining location.
** [Support] ~Geometry.lerp_rect~ added (convenience function).
Handles the lerping of all rect properties.
** [Support] Added support for using ~it~ within a block.
mRuby patch added to ./docs/oss/mruby
Usage:
#+begin_src ruby
10.times do |index|
puts index
end
# OR
10.times do
puts _1
end
# OR
10.times do
puts it
end
#+end_src
** [Support] Incorporated cRuby's pretty print implementation.
~Object#pretty_inspect~ added and ~pp~ is available at the top level.
Example:
#+begin_src ruby
def tick args
args.state.rects ||= 10.map do
{
x: rand(100),
y: rand(100),
w: rand(100),
h: rand(100)
}
end
if args.inputs.keyboard.key_down.enter
pp args.state.rects
puts args.state.rects.pretty_inspect
end
args.outputs.watch args.state.rects.pretty_inspect
end
#+end_src
- Modified source is located under ./docs/oss/dragon/vendor.
- open-source-licenses.txt updated to include pp and pretty_print.
- Fn (args.fn) experimental pretty print constructs removed.
* 6.45
** [Moved My Cheese] Fixed Itch.io butler auto download.
** [Samples] Added line of sight sample app.
Sample app location: ./samples/07_advanced_rendering/21_line_of_sight
** [Support] Added `Geometry.rect_to_lines`.
** [Support] Added `Geometry.line_to_points`.
** [Support] Added `Geometry.points_to_line`.
** [Support] Added `Numeric.compose_blendmode`.
** [Bugfix] `Geometry.angle_turn_direction` returns correct value for 360 degrees.
* 6.44
** [Pro] [iOS] [Samples] Updated iOS C extensions sample app for Xcode 26.
** [Samples] Thick lines sample app reworked/simplified.
Sample app location: =samples/07_advanced_rendering/02_thick_lines=
** [Samples] Minor bug fix in sample apps that use ~Camera~.
Sample app locations:
- =samples/07_advanced_rendering/16_camera_space_world_space_simple=
- =samples/07_advanced_rendering_hd/05_camera_ultrawide_allscreen=
- =samples/99_genre_platformer/map_editor=
** [Support] Geometry.line_angle returns negative angles as opposed to sorting the points to always be positive.
** [Support] Removed DR's override to ~String#split~.
Behavior reverted back to mRuby's default. ~String::split~ and ~String#__original_split__~ still exist
for backwards compatability.
* 6.43
** [Samples] Added sample app that shows how to create a circle using sprites.
Sample app location: =samples/07_advanced_rendering/20_circles=
** [Samples] Added sample app that shows how to create a ring using sprites plus custom blend modes.
Sample app location: =samples/07_advanced_rendering/20_rings=
** [Samples] Added sample app that shows how to create a progress bar.
Sample app location: =samples/09_ui_controls/07_progress_bar=
** [Support] ~sprite~ primitives now support ~blendmode~.
If both ~blendmode_enum~ and ~blendmode~ are given, ~blendmode~
will take precedence. Valid options are ~0~: no blending, ~1~:
default/alpha blending, ~2~: additive blending, ~4~: modulo blending,
~8~: multiply blending.
#+begin_src ruby
def tick args
args.outputs.background_color = [255, 0, 0]
args.outputs.sprites << {
x: 640 - 50, y: 60 - 50, w: 100, h: 100,
path: :solid,
blendmode: 0,
r: 0, g: 0, b: 255, a: 128
}
args.outputs.sprites << {
x: 640 - 50, y: 160 - 50, w: 100, h: 100,
path: :solid,
blendmode: 1,
r: 0, g: 0, b: 255, a: 128
}
args.outputs.sprites << {
x: 640 - 50, y: 260 - 50, w: 100, h: 100,
path: :solid,
blendmode: 2,
r: 0, g: 0, b: 255, a: 128
}
args.outputs.sprites << {
x: 640 - 50, y: 360 - 50, w: 100, h: 100,
path: :solid,
blendmode: 4,
r: 0, g: 0, b: 255, a: 128
}
args.outputs.sprites << {
x: 640 - 50, y: 460 - 50, w: 100, h: 100,
path: :solid,
blendmode: 8,
r: 0, g: 0, b: 255, a: 128
}
end
#+end_src
The new ~blendmode~ property allows you to compose a custom blend
mode outside of the defaults listed above. Here is an example
function that codifies the construction of a custom blendmode:
#+begin_src ruby
BLENDOPERATION_ADD = 0x1
BLENDOPERATION_SUBTRACT = 0x2
BLENDOPERATION_REV_SUBTRACT = 0x3
BLENDOPERATION_MINIMUM = 0x4
BLENDOPERATION_MAXIMUM = 0x5
BLENDFACTOR_ZERO = 0x1
BLENDFACTOR_ONE = 0x2
BLENDFACTOR_SRC_COLOR = 0x3
BLENDFACTOR_ONE_MINUS_SRC_COLOR = 0x4
BLENDFACTOR_SRC_ALPHA = 0x5
BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 0x6
BLENDFACTOR_DST_COLOR = 0x7
BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8
BLENDFACTOR_DST_ALPHA = 0x9
BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA
def compose_blendmode(src_color_factor, dst_color_factor, color_operation,
src_alpha_factor, dst_alpha_factor, alpha_operation)
(color_operation << 0) |
(src_color_factor << 4) |
(dst_color_factor << 8) |
(alpha_operation << 16) |
(src_alpha_factor << 20) |
(dst_alpha_factor << 24)
end
#+end_src
* 6.42
** [Pro] [Android] Updated Android C Extensions sample app's compilation instructions to Android SDK 35.
** [Pro] [iOS] Updated ~$wizards.ios.start env: :dev~ takes into consideration new cli parameters of ideviceinstaller v1.2.0.
** [Support] ~args.inputs.keyboard.key_(down|up|held).truthy_keys~ excludes ~:raw_key~, and ~:char~.
** [Samples] Added sample app that shows how to remap controller and keyboard input.
Sample app location: =samples/09_ui_controls/06_input_remapping=
** [Support] Added ~args.outputs[].set~:
The following:
#+being_src ruby
def tick args
args.outputs[:scene].w = 1280
args.outputs[:scene].h = 720
args.outputs[:scene].background_color = [0, 0, 0, 0]
end
#+end_src
Can now be written as:
#+being_src ruby
def tick args
args.outputs[:scene].set w: 1280,
h: 720,
background_color: [0, 0, 0, 0]
end
#+end_src
* 6.41
** [Bugfix] Splash screen reintroduced so that sounds play on iOS web builds.
User interaction is required for audio initialization on iOS.
** [Bugfix] Fullscreen mode works correctly on Windows running Chrome.
Why does Windows + Chrome require a separate code path for full
screen resizing of the game when all other platforms fullscreen on
Chrome correctly? The world may never know. Let's just be thankful
that Windows, Chrome, and iOS haven't joined forces.
* 6.40
** [Samples] Added Bust A Move sample app.
Sample app location: =samples/99_genre_arcade/bust-a-move=
** [Support] Added 8BitDo Ultimate 2C mappings.
** [Support] Numeric#frame includes ~frame_elapsed_time~.
* 6.39
** [Support] Added ~Numeric.frame~
Mirrors ~Numeric.frame_index~ but provides additional information about the animation progress (see docs for details).
** [Support] ~puts~ will flush to the log file if too many entries queue up.
This will give you logging information even if your game is stuck in an infinite loop.
** [Samples] Added Guess the Word in 6 tries sample app.
Sample app location: =samples/99_genre_board_game/03_word_game=
** [Samples] Updated A Star path finding sample app to use a Priority Queue (cleaned up code).
Sample app location: =samples/13_path_finding_algorithms/08_a_star=
* 6.38
** [Pro] [Support] Performance improvements retrieving texture atlases for HD Mode.
** [Support] Improved performance of web-builds running on Windows.
* 6.37
** [Bugfix] Fixed bug ~inputs.(key_down|key_up|key_held).up_down~ reporting the wrong value.
Regression was introduced in 6.29.
* 6.36
** [Samples] Updated sounds sample app to leverage moder DR apis.
Sample app location: =01_rendering_basics/05_sounds=
** [Samples] Added advanced menu navigation sample app.
Sample app resembles the inventory screen of Legend of Zelda: LttP
Sample app location: =09_ui_controls/02_menu_navigation_advanced=
** [Support] ~Layout.rect~ accepts ~include_gutter~ kwarg.
This will set both ~include_row_gutter~ and ~include_col_gutter~ to true.
** [Support] ~Geometry.rect_navigate~ can take either a ~Symbol~ or ~lambda~ for ~using~ kwarg.
** [Support] Added ~GTK.get_sprite_rect~ and ~GTK.get_string_rect~.
These are like ~GTK.calcspritebox~ and ~GTK.calcstringbox~, but you get
a fully formed ~Rect~ (which makes it simpler to merge into other ~Hashes~).
* 6.35
** [Support] Aliased ~GTK.download_stb_rb(_raw)~ to ~GTK.download_lib(_raw)~
** [Samples] Added toggle button sample app.
Sample app location: =samples/09_ui_controls/01_toggle_button=
** [Samples] Added animated toggle switch sample app.
Sample app location: =samples/09_ui_controls/05_animated_toggle_switch=
** [Samples] BASIC Gorillas sample app updated to use modern DR apis.
Sample app location: =samples/99_genre_platformer/gorillas_basic=
** [Samples] Verlet physics simulation sample app updated to use modern DR apis.
Sample app location: =samples/04_physics_and_collisions/13_verlet_integration=
* 6.34
** [Samples] Added Sudoku sample app which shows how to use layout apis within a render target.
Sample app location: =./samples/99_genre_board_game/02_sudoku=
** [Support] Small performance improvements to method invocation on ~Grid~ singleton.
** [Support] Added ~Geometry::angle_vector~ to mirror ~Numeric#vector~.
** [Support] Added ~Math::abs~ to mirror ~Numeric#abs~.
** [Support] Test classes are automatically removed from the environment after execution.
This keeps them from being polluted with methods that are no longer in the test file after hot reload.
* 6.33
** [Pro] [Android] Native binaries (DragonRuby and SDL 2.0.20) recompiled against NDK version r28c.
Native libraries have been aligned to 16kb (Google Play Store compliance).
* 6.32
** [Pro] [Support] Updated Layout.rect apis to support layout considerations for edge to edge rendering.
** [Samples] Added Squares arcade advanced sample app that shows multi-orientation + edge to edge rendering
Sample app location: =./samples/99_genre_arcade/squares_advanced_multi_orientation=
* 6.31
** [Samples] Added Mode 7 sample app.
Special thanks to mysterdip@discord for creating contributing this sample.
Sample app location: =samples/99_genre_3d/05_mode7=
** [Samples] Squares arcade sample app upgraded to use modern DR apis.
Note: This sample app is a solid reference implementation for a non-trivial game structure.
Sample app location: =samples/99_genre_arcade/squares=
** [Support] Improved recording/replay system to capture inputs live (to repro situations where a segfault occurs).
** [Support] During dragonruby-publish, you will be warned in screaming caps if you have sprites with potentially problematic characters.
** [Support] Disabling Controller Config Wizard in DR until we figure out how to deal with false positives.
* 6.30
** [Pro] [Android] [Support] Target SDK for Android bumped to API 35 (Google Play compliance). NDK dependency upgraded to r27d.
** [Samples] Advanced Ray Caster sample app updated to remove some magic numbers
Special thanks to james-stocks@github for initial sample app and AlexMooney@github for further clean up.
Sample app location =samples/99_genre_3d/04_ray_caster_advanced=
** [Samples] Sample app added to show how to use line achors to center a piece of text vertically
Sample app location =samples/01_rendering_basics/01_labels_anchors=
** [Bugfix] Grid.allscreen_top and Grid.allscreen_right gives correct values.
** [Support] Tests can exist under a class name that ends in Tests
Tests can be defined at the top level or under a class that ends in the word "Tests".
#+begin_src ruby
def test_example args, assert
assert.equal! 1, 1
end
#+end_src
Can also be written as this (to avoid polluting Object):
#+begin_src ruby
class ExampleTests
def test_example args, assert
assert.equal! 1, 1
end
end
#+end_src
* 6.29
** [Support] Setting ~args.state = {}~ within ~boot~ disables OpenEntity and Array-based primitives
Given ~Hash~ quack like ~attr_accessor~, the need for ~OpenEntity~
is significantly lessened and its improved egronomics makes
Array-based primitives less needed / not worth the performance overhead.
Opting into ~boot~ will prepare your game for removal of these
constructs in the very very far future.
Expect to see deprecation warnings over time.
Example:
#+begin_src ruby
def boot args
# doing this within boot will opt-into disabling OpenEntity
# and Array-based primitives
args.state = {}
end
def tick args
# this will throw an exception because player.armor hasn't been
# initialized to a Hash
args.state.player.armor.hp = 10
# this will throw an exception (convert to Hash)
args.outputs.sprites << [100, 100, 80, 80, "sprites/square/blue.png"]
end
#+end_src
** [Samples] Added cooking game sample app.
Sample app location =samples/99_genre_crafting/cooking_game_starting_point=
** [Samples] Camera construct within camera based sample apps has been improved.
Sample app locations:
- =samples/99_genre_platformer/map_editor=
- =samples/07_advanced_rendering/16_camera_space_world_space_simple=
- =samples/07_advanced_rendering_hd/05_camera_ultrawide_allscreen=
** [Samples] Improved check box component sample app.
Sample app location: =samples/09_ui_controls/01_checkboxes=
** [Samples] Added sample app that show particle simulation using Hooke's and Coulomb's Law
Sample app location: =samples/04_physics_and_collisions/14_hookes_law_coulombs_law=
** [Support] ~args.audio~ can also be accessed via ~args.outputs.audio~.
** [Support] ~args.audio[].path~ will be consulted if ~args.audio[].input~ is ~nil~.
** [Support] Removed extrenous log messages for 404's within the in-game webserver.
** [mRuby] Following patch was applied from upstream: https://github.com/mruby/mruby/commit/2d8f4fa92
This patch allows ~Proc~ creation within modules that are mixed-in
via ~prepend~.
** [OSS] ~GTK::Runtime~ (the class that's accessed via ~$gtk~ has been open sourced).
Long term plan is to open source all of toolkit that's written in Ruby.
* 6.28
** [Samples] Fifteen Puzzle sample app cleaned up.
Sample app location: =samples/99_genre_board_game/01_fifteen_puzzle=
** [Samples] "Shadows" platformer sample app cleaned up.
Sample app location: =samples/99_genre_platformer/shadows/app/main.rb=
** [Support] Added ~Inputs#key_(up|held|down).(left|right|up|down)~ which inspects both ~keyboard~ and ~controller_one~.
Just a nice helper method if the need arises.
Example:
#+begin_src ruby
def tick args
# consults keyboard arrow keys + wasd, and controller_one's DPad and left analog
args.inputs.key_down.left
end
#+end_src
** [Bugfix] Initial playtime for `args.audio[key]` is respected instead of being set to `0`.
** [mRuby] Incorporated upstream patch for endless methods without parenthesis and heap overflow for heredocs.
commit 07c847027875a955ba64d3c84f8f456e96155b31 (HEAD)
Author: Yukihiro "Matz" Matsumoto <matz@ruby.or.jp>
Date: Tue May 18 16:26:36 2021 +0900
parse.y: allow "command" syntax in endless method definition.
This change allows `def hello = puts "Hello"` without parentheses.
This syntax has been introduced since Ruby3.1.
commit c43dd75ea9e2b2f3387e40617d4f4cd86d3841dc
Author: Yukihiro "Matz" Matsumoto <matz@ruby.or.jp>
Date: Wed Feb 3 13:04:32 2021 +0900
Avoid Heap Overflow in `heredoc_remove_indent`; fix #5316
* 6.27
** [Bugfix] Disallow GTK.set_window_scale values that would cause the game to be larger than the display.
Window size will be clamped to the display size.
* 6.26
** [Pro] [C Extensions] Exposed miniz string compressions functions: ~mz_compress~, ~mz_uncompress~.
** [Samples] Added sample app that shows how you can orchestrate a cutscene (in a JRPG for example).
Sample app location: =samples/99_genre_jrpg/cutscenes=
** [Samples] Added sample app that shows how to use matricies to create a rotating camera.
Sample app location: =samples/07_advanced_rendering/16_matrix_camera_space_with_rotation=
** [Samples] Added sample app that shows how to use matricies to create a pinch, zoom, and pan camera.
Sample app location: =samples/07_advanced_rendering/16_matrix_camera_pinch_zoom_pan=
** [Samples] Minor improvements to "cube world" sample app.
Sample app location: =samples/07_advanced_rendering/16_matrix_cubeworld=
** [Support] Added class level variant for ~(Hash|Array)::all?~ and ~(Hash|Array)::any?~
** [Support] ~Grid.origin_center~ can be supplied within the ~boot~ function.
If definined within ~boot~, invoking ~GTK.(reset|reboot)~ will remember the orientation used.
** [Bugfix] ~Geometry::point_on_line?~ returns true if the point is actually on the line as opposed to just within the bounding box.
* 6.25
** [Bugfix] Fixed replay of input history captured via ~$recording.start~ (off by one frame errors are the worst).
** [Bugfix] Fixed tracking speed of single touch input for mobile devices.
** [Bugfix] ~GTK.console.*_color=~ accepts Array, or Hash.
** [Samples] Added sample app that shows how to animate a bouncing box using ~Easing.spline~.
Sample app location: =samples/08_tweening_lerping_easing_functions/03_easing_using_splines_bouncing_box=
** [Samples] Cleaned up simple collision sample app.
Sample app location: =samples/04_physics_and_collisions/01_simple=
* 6.24
** [Bugfix] [Pro] Android HTTP/POST failures fixed.
** [Bugfix] ~Numeric.rand~ when given a Range yielding a size of zero returns ~nil~.
** [Samples] Created sample app that shows how to use Layout extendeded parameters within a render target.
Sample app location: =samples/07_advanced_rendering/19_layouts_extended_parameters_in_render_target=
** [Samples] Added sample app that shows twinstick controls using either keyboard or controller.
Sample app location: =samples/99_genre_arcade/twinstick_gamepad=
** [Samples] Added sample app that shows how to create "particles" out of labels.
Sample app location: =samples/07_advanced_rendering/02_render_targets_label_particles=
** [Samples] Added sample app that shows a layout for a card game with animations.
Sample app location: =samples/99_genre_card_game/01_board_and_card_layout=
** [Samples] Added sample app that shows an HTTP/POST to an external endpoint.
Sample app location: =samples/11_http/04_http_post_external_server=
** [Support] Added ~GTK.calcstringbox_h~ which returns the string size as a hash.
** [Support] Added ~GTK.raise_window~ which will bring the game window to the top and make it active.
Method is for development/debugging purposes only and will noop in production.
* 6.23
** [Bugfix] Fixed regression with ~args.inputs.mouse.click=~.
* 6.22
** [Pro] [Bugfix] ~Grid.allscreen_*~ properties return correct values for ~game_metadata.hd_maxscale=100-400~ plus ~game_metadata.hd_letterbox=false~.
** [Bugfix] ~args.inputs.mouse.(held|down|up)~ forwards to ~args.inputs.mouse.key_(held|down|up).left~.
** [Support] Added ~Geometry.vec2_(add|sub|subtract|scale)~.
** [Support] Added ~GTK.set_window_size~, ~GTK.set_window_position~.
Docs have been updated with warnings about which window functions are okay to
use in production vs those that should only be used for development/debugging purposes.
** [Samples] Added sample app that shows ball bouncing physics against static circular pegs.
Sample app location: =samples/04_physics_and_collisions/08_ball_and_peg_bouncing=
** [Samples] Added sample app that shows how to create a camera that supports ultrawide displays (all screen mode)
Sample app location: =samples/07_advanced_rendering_hd/05_camera_ultrawide_allscreen=
* 6.21
** [Bugfix] String#split handles correctly handles empty entries between delimiters.
* 6.20
** [Pro] [Bugfix] [iOS] Fixed path resolutions of staging directory within iOS Wizard.
Regression was introduced in 6.13.
** [Pro] [Support] Added ~Grid.native_scale~, ~Grid.render_scale~, and ~Grid.texture_scale~ to help with HD render debugging.
** [Pro] [Support] Added support for HD rendering for 3K, 4.5K, and 6K displays.
** [Pro] [Bugfix] Ensure pixel perfect rendering at all window sizes if ~hd_max_scale~ is set to a value other than ~0~.
* 6.19
** [Bugfix] Fixed in-game web server failing to start in dev mode.
** [Bugfix] Fixed segfault that could occur if GTK.reboot is invoked with Tweetcarts.
* 6.18
** [mRuby] mRuby recompiled with -DMRB_UTF8_STRING=1 reverted.
* 6.17
** [Support] The Standard license can load C Extensions in development mode!
All license tiers can load C Extensions in dev mode. The Standard license does not include
the dependencies required to create C Extensions however.
During the publishing process, any C Extension directories will be
ignored during packaging and an exception will be thrown if
~dlopen~ is called in Production (for Standard license only).
This gives Standard license users the ability to load/try out C Extensions in development mode.
An Indie or Pro license is required to compile C Extensions/publish games that have C Extensions.
** [mRuby] mRuby recompiled with -DMRB_UTF8_STRING=1.
** [Bugfix] GTK.reboot will not segfault if there is an http request in-flight during the reboot process.
* 6.16
** [Pro] [Support] Added ~GTK.get_dlopen_path~ which returns the search path for C Extensions.
** [mRuby] [Bugfix] String#split results in cstrings with incorrect null termination.
The mRuby String#split has been reimplemented to fix this issue.
** [Support] Added ~GTK.getenv~, ~GTK.setenv~ which can be used to retrieve and update environment variables.
** [Support] ~Geometry::rect_center_point~ takes ~anchor_(x|y)~ into consideration.
* 6.15
** [Bugfix] Web builds render correctly regardless of the browser's zoom level.
* 6.14
** [Bugfix] Layout.rect returns correct values with ~Grid.origin_center!~.