ruby_rpg 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -21
  3. data/bin/build.bash +13 -13
  4. data/bin/import +44 -44
  5. data/glfw-3.3.9.bin.MACOS/LICENSE.md +23 -23
  6. data/glfw-3.3.9.bin.MACOS/README.md +5 -5
  7. data/glfw-3.3.9.bin.MACOS/docs/html/build_8dox.html +81 -81
  8. data/glfw-3.3.9.bin.MACOS/docs/html/build_guide.html +199 -199
  9. data/glfw-3.3.9.bin.MACOS/docs/html/compat_8dox.html +81 -81
  10. data/glfw-3.3.9.bin.MACOS/docs/html/compat_guide.html +153 -153
  11. data/glfw-3.3.9.bin.MACOS/docs/html/compile_8dox.html +81 -81
  12. data/glfw-3.3.9.bin.MACOS/docs/html/compile_guide.html +223 -223
  13. data/glfw-3.3.9.bin.MACOS/docs/html/context_8dox.html +81 -81
  14. data/glfw-3.3.9.bin.MACOS/docs/html/context_guide.html +259 -259
  15. data/glfw-3.3.9.bin.MACOS/docs/html/deprecated.html +88 -88
  16. data/glfw-3.3.9.bin.MACOS/docs/html/dir_08423ce7729c4554356a7de7171ba263.html +85 -85
  17. data/glfw-3.3.9.bin.MACOS/docs/html/dir_2dcebcdf14b42e92a6ed85c61bda6b9d.html +93 -93
  18. data/glfw-3.3.9.bin.MACOS/docs/html/dir_62ce056722ee97c199075aa1d6eca309.html +95 -95
  19. data/glfw-3.3.9.bin.MACOS/docs/html/dir_dddf4cf62655095a666cf715de3a31a2.html +91 -91
  20. data/glfw-3.3.9.bin.MACOS/docs/html/doc.svg +12 -12
  21. data/glfw-3.3.9.bin.MACOS/docs/html/docd.svg +12 -12
  22. data/glfw-3.3.9.bin.MACOS/docs/html/doxygen.css +1685 -1685
  23. data/glfw-3.3.9.bin.MACOS/docs/html/doxygen.svg +28 -28
  24. data/glfw-3.3.9.bin.MACOS/docs/html/dynsections.js +192 -192
  25. data/glfw-3.3.9.bin.MACOS/docs/html/extra.css +1 -1
  26. data/glfw-3.3.9.bin.MACOS/docs/html/files.html +91 -91
  27. data/glfw-3.3.9.bin.MACOS/docs/html/folderclosed.svg +11 -11
  28. data/glfw-3.3.9.bin.MACOS/docs/html/folderclosedd.svg +11 -11
  29. data/glfw-3.3.9.bin.MACOS/docs/html/folderopen.svg +17 -17
  30. data/glfw-3.3.9.bin.MACOS/docs/html/folderopend.svg +12 -12
  31. data/glfw-3.3.9.bin.MACOS/docs/html/glfw3_8h.html +1661 -1661
  32. data/glfw-3.3.9.bin.MACOS/docs/html/glfw3_8h_source.html +1175 -1175
  33. data/glfw-3.3.9.bin.MACOS/docs/html/glfw3native_8h.html +167 -167
  34. data/glfw-3.3.9.bin.MACOS/docs/html/glfw3native_8h_source.html +303 -303
  35. data/glfw-3.3.9.bin.MACOS/docs/html/group__buttons.html +282 -282
  36. data/glfw-3.3.9.bin.MACOS/docs/html/group__context.html +304 -304
  37. data/glfw-3.3.9.bin.MACOS/docs/html/group__errors.html +304 -304
  38. data/glfw-3.3.9.bin.MACOS/docs/html/group__gamepad__axes.html +202 -202
  39. data/glfw-3.3.9.bin.MACOS/docs/html/group__gamepad__buttons.html +410 -410
  40. data/glfw-3.3.9.bin.MACOS/docs/html/group__hat__state.html +234 -234
  41. data/glfw-3.3.9.bin.MACOS/docs/html/group__init.html +570 -570
  42. data/glfw-3.3.9.bin.MACOS/docs/html/group__input.html +2255 -2255
  43. data/glfw-3.3.9.bin.MACOS/docs/html/group__joysticks.html +362 -362
  44. data/glfw-3.3.9.bin.MACOS/docs/html/group__keys.html +2034 -2034
  45. data/glfw-3.3.9.bin.MACOS/docs/html/group__mods.html +198 -198
  46. data/glfw-3.3.9.bin.MACOS/docs/html/group__monitor.html +848 -848
  47. data/glfw-3.3.9.bin.MACOS/docs/html/group__native.html +812 -812
  48. data/glfw-3.3.9.bin.MACOS/docs/html/group__shapes.html +198 -198
  49. data/glfw-3.3.9.bin.MACOS/docs/html/group__vulkan.html +359 -359
  50. data/glfw-3.3.9.bin.MACOS/docs/html/group__window.html +3434 -3434
  51. data/glfw-3.3.9.bin.MACOS/docs/html/index.html +100 -100
  52. data/glfw-3.3.9.bin.MACOS/docs/html/input_8dox.html +81 -81
  53. data/glfw-3.3.9.bin.MACOS/docs/html/input_guide.html +570 -570
  54. data/glfw-3.3.9.bin.MACOS/docs/html/internal_8dox.html +81 -81
  55. data/glfw-3.3.9.bin.MACOS/docs/html/internals_guide.html +132 -132
  56. data/glfw-3.3.9.bin.MACOS/docs/html/intro_8dox.html +81 -81
  57. data/glfw-3.3.9.bin.MACOS/docs/html/intro_guide.html +351 -351
  58. data/glfw-3.3.9.bin.MACOS/docs/html/jquery.js +33 -33
  59. data/glfw-3.3.9.bin.MACOS/docs/html/main_8dox.html +81 -81
  60. data/glfw-3.3.9.bin.MACOS/docs/html/menu.js +136 -136
  61. data/glfw-3.3.9.bin.MACOS/docs/html/menudata.js +29 -29
  62. data/glfw-3.3.9.bin.MACOS/docs/html/minus.svg +8 -8
  63. data/glfw-3.3.9.bin.MACOS/docs/html/minusd.svg +8 -8
  64. data/glfw-3.3.9.bin.MACOS/docs/html/monitor_8dox.html +81 -81
  65. data/glfw-3.3.9.bin.MACOS/docs/html/monitor_guide.html +229 -229
  66. data/glfw-3.3.9.bin.MACOS/docs/html/moving_8dox.html +81 -81
  67. data/glfw-3.3.9.bin.MACOS/docs/html/moving_guide.html +374 -374
  68. data/glfw-3.3.9.bin.MACOS/docs/html/news.html +634 -634
  69. data/glfw-3.3.9.bin.MACOS/docs/html/news_8dox.html +81 -81
  70. data/glfw-3.3.9.bin.MACOS/docs/html/pages.html +99 -99
  71. data/glfw-3.3.9.bin.MACOS/docs/html/plus.svg +9 -9
  72. data/glfw-3.3.9.bin.MACOS/docs/html/plusd.svg +9 -9
  73. data/glfw-3.3.9.bin.MACOS/docs/html/quick_8dox.html +81 -81
  74. data/glfw-3.3.9.bin.MACOS/docs/html/quick_guide.html +397 -397
  75. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_0.js +5 -5
  76. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_1.js +4 -4
  77. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_10.js +65 -65
  78. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_11.js +26 -26
  79. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_12.js +44 -44
  80. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_13.js +34 -34
  81. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_14.js +12 -12
  82. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_15.js +52 -52
  83. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_16.js +69 -69
  84. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_17.js +51 -51
  85. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_18.js +14 -14
  86. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_19.js +36 -36
  87. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_1a.js +98 -98
  88. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_1b.js +12 -12
  89. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_2.js +6 -6
  90. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_3.js +9 -9
  91. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_4.js +57 -57
  92. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_5.js +22 -22
  93. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_6.js +103 -103
  94. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_7.js +23 -23
  95. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_8.js +35 -35
  96. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_9.js +63 -63
  97. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_a.js +505 -505
  98. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_b.js +24 -24
  99. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_c.js +50 -50
  100. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_d.js +17 -17
  101. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_e.js +12 -12
  102. data/glfw-3.3.9.bin.MACOS/docs/html/search/all_f.js +35 -35
  103. data/glfw-3.3.9.bin.MACOS/docs/html/search/classes_0.js +7 -7
  104. data/glfw-3.3.9.bin.MACOS/docs/html/search/close.svg +18 -18
  105. data/glfw-3.3.9.bin.MACOS/docs/html/search/defines_0.js +34 -34
  106. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_0.js +4 -4
  107. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_1.js +6 -6
  108. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_2.js +5 -5
  109. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_3.js +6 -6
  110. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_4.js +6 -6
  111. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_5.js +4 -4
  112. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_6.js +4 -4
  113. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_7.js +4 -4
  114. data/glfw-3.3.9.bin.MACOS/docs/html/search/files_8.js +4 -4
  115. data/glfw-3.3.9.bin.MACOS/docs/html/search/functions_0.js +146 -146
  116. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_0.js +6 -6
  117. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_1.js +4 -4
  118. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_10.js +4 -4
  119. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_2.js +6 -6
  120. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_3.js +5 -5
  121. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_4.js +4 -4
  122. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_5.js +5 -5
  123. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_6.js +4 -4
  124. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_7.js +5 -5
  125. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_8.js +5 -5
  126. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_9.js +6 -6
  127. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_a.js +6 -6
  128. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_b.js +4 -4
  129. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_c.js +4 -4
  130. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_d.js +7 -7
  131. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_e.js +4 -4
  132. data/glfw-3.3.9.bin.MACOS/docs/html/search/groups_f.js +5 -5
  133. data/glfw-3.3.9.bin.MACOS/docs/html/search/mag.svg +24 -24
  134. data/glfw-3.3.9.bin.MACOS/docs/html/search/mag_d.svg +24 -24
  135. data/glfw-3.3.9.bin.MACOS/docs/html/search/mag_sel.svg +31 -31
  136. data/glfw-3.3.9.bin.MACOS/docs/html/search/mag_seld.svg +31 -31
  137. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_0.js +4 -4
  138. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_1.js +4 -4
  139. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_10.js +4 -4
  140. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_2.js +5 -5
  141. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_3.js +4 -4
  142. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_4.js +6 -6
  143. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_5.js +4 -4
  144. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_6.js +4 -4
  145. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_7.js +7 -7
  146. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_8.js +6 -6
  147. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_9.js +4 -4
  148. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_a.js +5 -5
  149. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_b.js +5 -5
  150. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_c.js +4 -4
  151. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_d.js +6 -6
  152. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_e.js +6 -6
  153. data/glfw-3.3.9.bin.MACOS/docs/html/search/pages_f.js +4 -4
  154. data/glfw-3.3.9.bin.MACOS/docs/html/search/search.css +291 -291
  155. data/glfw-3.3.9.bin.MACOS/docs/html/search/search.js +840 -840
  156. data/glfw-3.3.9.bin.MACOS/docs/html/search/searchdata.js +39 -39
  157. data/glfw-3.3.9.bin.MACOS/docs/html/search/typedefs_0.js +32 -32
  158. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_0.js +4 -4
  159. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_1.js +6 -6
  160. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_2.js +5 -5
  161. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_3.js +4 -4
  162. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_4.js +4 -4
  163. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_5.js +6 -6
  164. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_6.js +4 -4
  165. data/glfw-3.3.9.bin.MACOS/docs/html/search/variables_7.js +4 -4
  166. data/glfw-3.3.9.bin.MACOS/docs/html/spaces.svg +877 -877
  167. data/glfw-3.3.9.bin.MACOS/docs/html/struct_g_l_f_wgamepadstate.html +134 -134
  168. data/glfw-3.3.9.bin.MACOS/docs/html/struct_g_l_f_wgammaramp.html +170 -170
  169. data/glfw-3.3.9.bin.MACOS/docs/html/struct_g_l_f_wimage.html +151 -151
  170. data/glfw-3.3.9.bin.MACOS/docs/html/struct_g_l_f_wvidmode.html +204 -204
  171. data/glfw-3.3.9.bin.MACOS/docs/html/vulkan_8dox.html +81 -81
  172. data/glfw-3.3.9.bin.MACOS/docs/html/vulkan_guide.html +196 -196
  173. data/glfw-3.3.9.bin.MACOS/docs/html/window_8dox.html +81 -81
  174. data/glfw-3.3.9.bin.MACOS/docs/html/window_guide.html +763 -763
  175. data/glfw-3.3.9.bin.MACOS/include/GLFW/glfw3.h +5932 -5932
  176. data/glfw-3.3.9.bin.MACOS/include/GLFW/glfw3native.h +634 -634
  177. data/glfw-3.3.9.bin.MACOS/lib-arm64/libglfw.3.dylib +0 -0
  178. data/glfw-3.3.9.bin.MACOS/lib-universal/libglfw.3.dylib +0 -0
  179. data/glfw-3.3.9.bin.MACOS/lib-x86_64/libglfw.3.dylib +0 -0
  180. data/lib/engine/autoloader.rb +11 -11
  181. data/lib/engine/camera.rb +12 -12
  182. data/lib/engine/component.rb +63 -63
  183. data/lib/engine/components/audio_source.rb +41 -41
  184. data/lib/engine/components/direction_light.rb +22 -22
  185. data/lib/engine/components/font_renderer.rb +134 -134
  186. data/lib/engine/components/mesh_renderer.rb +31 -31
  187. data/lib/engine/components/orthographic_camera.rb +54 -54
  188. data/lib/engine/components/perspective_camera.rb +53 -53
  189. data/lib/engine/components/point_light.rb +23 -23
  190. data/lib/engine/components/sprite_renderer.rb +141 -141
  191. data/lib/engine/components/ui_font_renderer.rb +140 -140
  192. data/lib/engine/components/ui_sprite_clickbox.rb +62 -0
  193. data/lib/engine/components/ui_sprite_renderer.rb +101 -101
  194. data/lib/engine/compute_shader.rb +93 -0
  195. data/lib/engine/cursor.rb +43 -43
  196. data/lib/engine/debugging.rb +41 -41
  197. data/lib/engine/engine.rb +131 -131
  198. data/lib/engine/font.rb +74 -74
  199. data/lib/engine/game_object.rb +234 -234
  200. data/lib/engine/importers/font_importer.rb +69 -69
  201. data/lib/engine/importers/obj_file.rb +244 -244
  202. data/lib/engine/importers/obj_importer.rb +33 -33
  203. data/lib/engine/input.rb +105 -104
  204. data/lib/engine/material.rb +79 -79
  205. data/lib/engine/mesh.rb +43 -43
  206. data/lib/engine/path.rb +92 -92
  207. data/lib/engine/physics/collision.rb +12 -12
  208. data/lib/engine/physics/components/cube_collider.rb +6 -6
  209. data/lib/engine/physics/components/rigidbody.rb +103 -103
  210. data/lib/engine/physics/components/sphere_collider.rb +93 -93
  211. data/lib/engine/physics/physics_resolver.rb +37 -37
  212. data/lib/engine/polygon_mesh.rb +45 -45
  213. data/lib/engine/quaternion.rb +234 -234
  214. data/lib/engine/rendering/instance_renderer.rb +153 -153
  215. data/lib/engine/rendering/render_pipeline.rb +35 -35
  216. data/lib/engine/screenshoter.rb +34 -34
  217. data/lib/engine/shader.rb +119 -91
  218. data/lib/engine/shaders/colour_frag.glsl +8 -8
  219. data/lib/engine/shaders/colour_vertex.glsl +13 -13
  220. data/lib/engine/shaders/mesh_frag.glsl +102 -102
  221. data/lib/engine/shaders/mesh_vertex.glsl +25 -25
  222. data/lib/engine/shaders/skybox_frag.glsl +12 -12
  223. data/lib/engine/shaders/skybox_vert.glsl +14 -14
  224. data/lib/engine/shaders/sprite_frag.glsl +17 -17
  225. data/lib/engine/shaders/sprite_vertex.glsl +15 -15
  226. data/lib/engine/shaders/text_frag.glsl +15 -15
  227. data/lib/engine/shaders/text_vertex.glsl +31 -31
  228. data/lib/engine/shaders/ui_sprite_frag.glsl +15 -15
  229. data/lib/engine/shaders/ui_sprite_vertex.glsl +15 -15
  230. data/lib/engine/shaders/vertex_lit_frag.glsl +89 -89
  231. data/lib/engine/shaders/vertex_lit_vertex.glsl +28 -28
  232. data/lib/engine/tangent_calculator.rb +42 -42
  233. data/lib/engine/texture.rb +53 -53
  234. data/lib/engine/video_mode.rb +37 -37
  235. data/lib/engine/window.rb +126 -126
  236. data/lib/ruby_rpg.rb +58 -56
  237. metadata +5 -6
@@ -1,234 +1,234 @@
1
- require "matrix"
2
-
3
- module Engine
4
- class GameObject
5
- def self.method_added(name)
6
- @methods ||= Set.new
7
- return if name == :initialize || name == :destroyed?
8
- @methods.add(name)
9
- end
10
-
11
- attr_accessor :name, :pos, :scale, :components, :renderers, :ui_renderers, :created_at, :parent
12
-
13
- def initialize(name = "Game Object", pos: Vector[0, 0, 0], rotation: 0, scale: Vector[1, 1, 1], components: [], parent: nil)
14
- GameObject.object_spawned(self)
15
- @pos = Vector[pos[0], pos[1], pos[2] || 0]
16
- if rotation.is_a?(Numeric)
17
- self.rotation = Quaternion.from_euler(Vector[0, 0, rotation])
18
- elsif rotation.is_a?(Quaternion)
19
- self.rotation = rotation
20
- else
21
- self.rotation = Quaternion.from_euler(rotation)
22
- end
23
- @scale = scale
24
- @name = name
25
- @components = components.select { |component| !component.renderer? && !component.ui_renderer? }
26
- @renderers = components.select { |component| component.renderer? }
27
- @ui_renderers = components.select { |component| component.ui_renderer? }
28
- @created_at = Time.now
29
- @parent = parent
30
- parent.add_child(self) if parent
31
-
32
- components.each { |component| component.set_game_object(self) }
33
- components.each(&:start)
34
- end
35
-
36
- def to_s
37
- @name
38
- end
39
-
40
- def children
41
- @children ||= Set.new
42
- end
43
-
44
- def add_child(child)
45
- child.parent = self
46
- children << child
47
- end
48
-
49
- def parent=(parent)
50
- @parent.children.delete(self) if @parent
51
- @parent = parent
52
- parent.children << self if parent
53
- end
54
-
55
- def rotation
56
- @rotation_quaternion
57
- end
58
-
59
- def rotation=(value)
60
- raise "Rotation must be a Quaternion" unless value.is_a?(Quaternion)
61
-
62
- @rotation_quaternion = value
63
- end
64
-
65
- def euler_angles
66
- rotation.to_euler
67
- end
68
-
69
- def x
70
- @pos[0]
71
- end
72
-
73
- def x=(value)
74
- @pos = Vector[value, y, z]
75
- end
76
-
77
- def y
78
- @pos[1]
79
- end
80
-
81
- def y=(value)
82
- @pos = Vector[x, value, z]
83
- end
84
-
85
- def z
86
- @pos[2]
87
- end
88
-
89
- def z=(value)
90
- @pos = Vector[x, y, value]
91
- end
92
-
93
- def local_to_world_coordinate(local)
94
- local_x4 = Matrix[[local[0], local[1], local[2], 1.0]]
95
- world = local_x4 * model_matrix
96
- Vector[world[0, 0], world[0, 1], world[0, 2]]
97
- end
98
-
99
- def world_to_local_coordinate(world)
100
- world_x4 = Matrix[[world[0], world[1], world[2], 1.0]]
101
- local = world_x4 * model_matrix.inverse
102
- Vector[local[0, 0], local[0, 1], local[0, 2]]
103
- end
104
-
105
- def local_to_world_direction(local)
106
- local_to_world_coordinate(local) - pos
107
- end
108
-
109
- def rotate_around(axis, angle)
110
- rotation_quaternion = Quaternion.from_angle_axis(angle, axis)
111
-
112
- self.rotation = rotation_quaternion * rotation
113
- end
114
-
115
- def model_matrix
116
- cache_key = [@pos.dup, rotation.dup, @scale.dup, @parent&.model_matrix&.to_a]
117
- @model_matrix = nil if @model_matrix_cache_key != cache_key
118
- @model_matrix_cache_key = cache_key
119
- @model_matrix ||=
120
- begin
121
- rot = euler_angles * Math::PI / 180
122
-
123
- cos_x = Math.cos(rot[0])
124
- cos_y = Math.cos(rot[1])
125
- cos_z = Math.cos(rot[2])
126
-
127
- sin_x = Math.sin(rot[0])
128
- sin_y = Math.sin(rot[1])
129
- sin_z = Math.sin(rot[2])
130
-
131
- Matrix[
132
- [scale[0] * (cos_y * cos_z), scale[0] * (-cos_y * sin_z), scale[0] * sin_y, 0],
133
- [scale[1] * (cos_x * sin_z + sin_x * sin_y * cos_z), scale[1] * (cos_x * cos_z - sin_x * sin_y * sin_z), scale[1] * -sin_x * cos_y, 0],
134
- [scale[2] * (sin_x * sin_z - cos_x * sin_y * cos_z), scale[2] * (sin_x * cos_z + cos_x * sin_y * sin_z), scale[2] * cos_x * cos_y, 0],
135
- [x, y, z, 1]
136
- ]
137
- end
138
- if parent
139
- @model_matrix * parent.model_matrix
140
- else
141
- @model_matrix
142
- end
143
- end
144
-
145
- def destroyed?
146
- @destroyed
147
- end
148
-
149
- def destroy!
150
- return unless GameObject.objects.include?(self)
151
- children.each(&:destroy!)
152
- components.each(&:destroy!)
153
- ui_renderers.each(&:destroy!)
154
- renderers.each(&:destroy!)
155
-
156
- GameObject.destroyed_objects << self unless @destroyed
157
- @destroyed = true
158
- end
159
-
160
- def _erase!
161
- GameObject.objects.delete(self)
162
- parent.children.delete(self) if parent
163
- name = @name
164
- self.class.instance_variable_get(:@methods).each do |method|
165
- singleton_class.send(:undef_method, method)
166
- singleton_class.send(:define_method, method) { raise "This object has been destroyed: #{name}" }
167
- end
168
- end
169
-
170
- def self.erase_destroyed_objects
171
- destroyed_objects.each do |object|
172
- object._erase!
173
- end
174
- @destroyed_objects = []
175
- end
176
-
177
- def up
178
- return @up if @cached_up_rotation == rotation
179
- @cached_up_rotation = rotation.dup
180
- @up = local_to_world_direction(Vector[0, 1, 0])
181
- end
182
-
183
- def right
184
- return @right if @cached_right_rotation == rotation
185
- @cached_right_rotation = rotation.dup
186
- @right = local_to_world_direction(Vector[1, 0, 0])
187
- end
188
-
189
- def forward
190
- return @forward if @cached_forward_rotation == rotation
191
- @cached_forward_rotation = rotation.dup
192
- @forward = local_to_world_direction(Vector[0, 0, 1])
193
- end
194
-
195
- def self.destroy_all
196
- GameObject.objects.dup.each do |object|
197
- object.destroy! unless object.destroyed?
198
- end
199
- end
200
-
201
- def self.update_all(delta_time)
202
- GameObject.objects.each do |object|
203
- object.components.each { |component| component.update(delta_time) }
204
- end
205
-
206
- Component.erase_destroyed_components
207
- GameObject.erase_destroyed_objects
208
- end
209
-
210
- def self.mesh_renderers
211
- GameObject.objects.flat_map do |object|
212
- object.renderers
213
- end
214
- end
215
-
216
- def self.render_ui(delta_time)
217
- GameObject.objects.each do |object|
218
- object.ui_renderers.each { |renderer| renderer.update(delta_time) }
219
- end
220
- end
221
-
222
- def self.object_spawned(object)
223
- objects << object
224
- end
225
-
226
- def self.objects
227
- @objects ||= []
228
- end
229
-
230
- def self.destroyed_objects
231
- @destroyed_objects ||= []
232
- end
233
- end
234
- end
1
+ require "matrix"
2
+
3
+ module Engine
4
+ class GameObject
5
+ def self.method_added(name)
6
+ @methods ||= Set.new
7
+ return if name == :initialize || name == :destroyed?
8
+ @methods.add(name)
9
+ end
10
+
11
+ attr_accessor :name, :pos, :scale, :components, :renderers, :ui_renderers, :created_at, :parent
12
+
13
+ def initialize(name = "Game Object", pos: Vector[0, 0, 0], rotation: 0, scale: Vector[1, 1, 1], components: [], parent: nil)
14
+ GameObject.object_spawned(self)
15
+ @pos = Vector[pos[0], pos[1], pos[2] || 0]
16
+ if rotation.is_a?(Numeric)
17
+ self.rotation = Quaternion.from_euler(Vector[0, 0, rotation])
18
+ elsif rotation.is_a?(Quaternion)
19
+ self.rotation = rotation
20
+ else
21
+ self.rotation = Quaternion.from_euler(rotation)
22
+ end
23
+ @scale = scale
24
+ @name = name
25
+ @components = components.select { |component| !component.renderer? && !component.ui_renderer? }
26
+ @renderers = components.select { |component| component.renderer? }
27
+ @ui_renderers = components.select { |component| component.ui_renderer? }
28
+ @created_at = Time.now
29
+ @parent = parent
30
+ parent.add_child(self) if parent
31
+
32
+ components.each { |component| component.set_game_object(self) }
33
+ components.each(&:start)
34
+ end
35
+
36
+ def to_s
37
+ @name
38
+ end
39
+
40
+ def children
41
+ @children ||= Set.new
42
+ end
43
+
44
+ def add_child(child)
45
+ child.parent = self
46
+ children << child
47
+ end
48
+
49
+ def parent=(parent)
50
+ @parent.children.delete(self) if @parent
51
+ @parent = parent
52
+ parent.children << self if parent
53
+ end
54
+
55
+ def rotation
56
+ @rotation_quaternion
57
+ end
58
+
59
+ def rotation=(value)
60
+ raise "Rotation must be a Quaternion" unless value.is_a?(Quaternion)
61
+
62
+ @rotation_quaternion = value
63
+ end
64
+
65
+ def euler_angles
66
+ rotation.to_euler
67
+ end
68
+
69
+ def x
70
+ @pos[0]
71
+ end
72
+
73
+ def x=(value)
74
+ @pos = Vector[value, y, z]
75
+ end
76
+
77
+ def y
78
+ @pos[1]
79
+ end
80
+
81
+ def y=(value)
82
+ @pos = Vector[x, value, z]
83
+ end
84
+
85
+ def z
86
+ @pos[2]
87
+ end
88
+
89
+ def z=(value)
90
+ @pos = Vector[x, y, value]
91
+ end
92
+
93
+ def local_to_world_coordinate(local)
94
+ local_x4 = Matrix[[local[0], local[1], local[2], 1.0]]
95
+ world = local_x4 * model_matrix
96
+ Vector[world[0, 0], world[0, 1], world[0, 2]]
97
+ end
98
+
99
+ def world_to_local_coordinate(world)
100
+ world_x4 = Matrix[[world[0], world[1], world[2], 1.0]]
101
+ local = world_x4 * model_matrix.inverse
102
+ Vector[local[0, 0], local[0, 1], local[0, 2]]
103
+ end
104
+
105
+ def local_to_world_direction(local)
106
+ local_to_world_coordinate(local) - pos
107
+ end
108
+
109
+ def rotate_around(axis, angle)
110
+ rotation_quaternion = Quaternion.from_angle_axis(angle, axis)
111
+
112
+ self.rotation = rotation_quaternion * rotation
113
+ end
114
+
115
+ def model_matrix
116
+ cache_key = [@pos.dup, rotation.dup, @scale.dup, @parent&.model_matrix&.to_a]
117
+ @model_matrix = nil if @model_matrix_cache_key != cache_key
118
+ @model_matrix_cache_key = cache_key
119
+ @model_matrix ||=
120
+ begin
121
+ rot = euler_angles * Math::PI / 180
122
+
123
+ cos_x = Math.cos(rot[0])
124
+ cos_y = Math.cos(rot[1])
125
+ cos_z = Math.cos(rot[2])
126
+
127
+ sin_x = Math.sin(rot[0])
128
+ sin_y = Math.sin(rot[1])
129
+ sin_z = Math.sin(rot[2])
130
+
131
+ Matrix[
132
+ [scale[0] * (cos_y * cos_z), scale[0] * (-cos_y * sin_z), scale[0] * sin_y, 0],
133
+ [scale[1] * (cos_x * sin_z + sin_x * sin_y * cos_z), scale[1] * (cos_x * cos_z - sin_x * sin_y * sin_z), scale[1] * -sin_x * cos_y, 0],
134
+ [scale[2] * (sin_x * sin_z - cos_x * sin_y * cos_z), scale[2] * (sin_x * cos_z + cos_x * sin_y * sin_z), scale[2] * cos_x * cos_y, 0],
135
+ [x, y, z, 1]
136
+ ]
137
+ end
138
+ if parent
139
+ @model_matrix * parent.model_matrix
140
+ else
141
+ @model_matrix
142
+ end
143
+ end
144
+
145
+ def destroyed?
146
+ @destroyed
147
+ end
148
+
149
+ def destroy!
150
+ return unless GameObject.objects.include?(self)
151
+ children.each(&:destroy!)
152
+ components.each(&:destroy!)
153
+ ui_renderers.each(&:destroy!)
154
+ renderers.each(&:destroy!)
155
+
156
+ GameObject.destroyed_objects << self unless @destroyed
157
+ @destroyed = true
158
+ end
159
+
160
+ def _erase!
161
+ GameObject.objects.delete(self)
162
+ parent.children.delete(self) if parent
163
+ name = @name
164
+ self.class.instance_variable_get(:@methods).each do |method|
165
+ singleton_class.send(:undef_method, method)
166
+ singleton_class.send(:define_method, method) { raise "This object has been destroyed: #{name}" }
167
+ end
168
+ end
169
+
170
+ def self.erase_destroyed_objects
171
+ destroyed_objects.each do |object|
172
+ object._erase!
173
+ end
174
+ @destroyed_objects = []
175
+ end
176
+
177
+ def up
178
+ return @up if @cached_up_rotation == rotation
179
+ @cached_up_rotation = rotation.dup
180
+ @up = local_to_world_direction(Vector[0, 1, 0])
181
+ end
182
+
183
+ def right
184
+ return @right if @cached_right_rotation == rotation
185
+ @cached_right_rotation = rotation.dup
186
+ @right = local_to_world_direction(Vector[1, 0, 0])
187
+ end
188
+
189
+ def forward
190
+ return @forward if @cached_forward_rotation == rotation
191
+ @cached_forward_rotation = rotation.dup
192
+ @forward = local_to_world_direction(Vector[0, 0, 1])
193
+ end
194
+
195
+ def self.destroy_all
196
+ GameObject.objects.dup.each do |object|
197
+ object.destroy! unless object.destroyed?
198
+ end
199
+ end
200
+
201
+ def self.update_all(delta_time)
202
+ GameObject.objects.each do |object|
203
+ object.components.each { |component| component.update(delta_time) }
204
+ end
205
+
206
+ Component.erase_destroyed_components
207
+ GameObject.erase_destroyed_objects
208
+ end
209
+
210
+ def self.mesh_renderers
211
+ GameObject.objects.flat_map do |object|
212
+ object.renderers
213
+ end
214
+ end
215
+
216
+ def self.render_ui(delta_time)
217
+ GameObject.objects.each do |object|
218
+ object.ui_renderers.each { |renderer| renderer.update(delta_time) }
219
+ end
220
+ end
221
+
222
+ def self.object_spawned(object)
223
+ objects << object
224
+ end
225
+
226
+ def self.objects
227
+ @objects ||= []
228
+ end
229
+
230
+ def self.destroyed_objects
231
+ @destroyed_objects ||= []
232
+ end
233
+ end
234
+ end
@@ -1,69 +1,69 @@
1
- # frozen_string_literal: true
2
- require 'json'
3
-
4
- module Engine
5
- class FontImporter
6
- TEXTURE_SIZE = 1024
7
- GLYPH_COUNT = 16
8
- CELL_SIZE = TEXTURE_SIZE / GLYPH_COUNT
9
-
10
- attr_reader :source, :destination_image, :destination_metrics
11
-
12
- def initialize(source, destination_image, destination_metrics)
13
- @source = source
14
- @destination_image = destination_image
15
- @destination_metrics = destination_metrics
16
- end
17
-
18
- def import
19
- image = Magick::Image.new(TEXTURE_SIZE, TEXTURE_SIZE,) do |options|
20
- options.background_color = "transparent"
21
- end
22
- font_metrics = {}
23
-
24
- draw = Magick::Draw.new
25
- (0...GLYPH_COUNT).each do |x|
26
- (0...GLYPH_COUNT).each do |y|
27
- index = x * GLYPH_COUNT + y
28
- next if index >= 255
29
- character = character(index)
30
- write_character(character, draw, image, coord(x), coord(y))
31
-
32
- metric = draw.get_type_metrics(image, character)
33
- if character.to_s == " "
34
- font_metrics[index] = { width: metric.max_advance / 4.0 }
35
- else
36
- font_metrics[index] = { width: metric.width }
37
- end
38
- end
39
- end
40
-
41
- FileUtils.mkdir_p(File.dirname(destination_image)) unless File.directory?(File.dirname(destination_image))
42
- image.write(destination_image)
43
-
44
- File.write(destination_metrics, font_metrics.to_json)
45
- end
46
-
47
- private
48
-
49
- def write_character(character, draw, image, x, y)
50
- font_path = File.expand_path(source)
51
-
52
- draw.annotate(image, CELL_SIZE, CELL_SIZE, x, y, character) do |_|
53
- draw.gravity = Magick::WestGravity
54
- draw.pointsize = CELL_SIZE - 5
55
- draw.font = font_path
56
- draw.fill = "white"
57
- image.format = "PNG"
58
- end
59
- end
60
-
61
- def character(index)
62
- (index + 1).chr
63
- end
64
-
65
- def coord(x)
66
- x * CELL_SIZE
67
- end
68
- end
69
- end
1
+ # frozen_string_literal: true
2
+ require 'json'
3
+
4
+ module Engine
5
+ class FontImporter
6
+ TEXTURE_SIZE = 1024
7
+ GLYPH_COUNT = 16
8
+ CELL_SIZE = TEXTURE_SIZE / GLYPH_COUNT
9
+
10
+ attr_reader :source, :destination_image, :destination_metrics
11
+
12
+ def initialize(source, destination_image, destination_metrics)
13
+ @source = source
14
+ @destination_image = destination_image
15
+ @destination_metrics = destination_metrics
16
+ end
17
+
18
+ def import
19
+ image = Magick::Image.new(TEXTURE_SIZE, TEXTURE_SIZE,) do |options|
20
+ options.background_color = "transparent"
21
+ end
22
+ font_metrics = {}
23
+
24
+ draw = Magick::Draw.new
25
+ (0...GLYPH_COUNT).each do |x|
26
+ (0...GLYPH_COUNT).each do |y|
27
+ index = x * GLYPH_COUNT + y
28
+ next if index >= 255
29
+ character = character(index)
30
+ write_character(character, draw, image, coord(x), coord(y))
31
+
32
+ metric = draw.get_type_metrics(image, character)
33
+ if character.to_s == " "
34
+ font_metrics[index] = { width: metric.max_advance / 4.0 }
35
+ else
36
+ font_metrics[index] = { width: metric.width }
37
+ end
38
+ end
39
+ end
40
+
41
+ FileUtils.mkdir_p(File.dirname(destination_image)) unless File.directory?(File.dirname(destination_image))
42
+ image.write(destination_image)
43
+
44
+ File.write(destination_metrics, font_metrics.to_json)
45
+ end
46
+
47
+ private
48
+
49
+ def write_character(character, draw, image, x, y)
50
+ font_path = File.expand_path(source)
51
+
52
+ draw.annotate(image, CELL_SIZE, CELL_SIZE, x, y, character) do |_|
53
+ draw.gravity = Magick::WestGravity
54
+ draw.pointsize = CELL_SIZE - 5
55
+ draw.font = font_path
56
+ draw.fill = "white"
57
+ image.format = "PNG"
58
+ end
59
+ end
60
+
61
+ def character(index)
62
+ (index + 1).chr
63
+ end
64
+
65
+ def coord(x)
66
+ x * CELL_SIZE
67
+ end
68
+ end
69
+ end