ruby_rpg 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1bb1056bb375c7c3ebbbdf7b2b23f1b5ad1fd6ddec9c0f2e63713aef56f345f7
4
- data.tar.gz: bead66754d17fafe491808aa0cef827cbc789ea718e61e114b53599b2c619b43
3
+ metadata.gz: 73ebf7bd3a497f3da5bb8bf0c953da36446ef912edede3605ae811a7d7778c21
4
+ data.tar.gz: 2c6d68447ef0502ca2d19020659bf09b1821fec4ff741ee5901a142358513701
5
5
  SHA512:
6
- metadata.gz: c3560e6b6aad6e80b3ace11b49c86a671eea0634b05b57383358921520502c476f0147f4aa39a21852149a8c4c866888cdd23aeee28fcb90517d5da975f385a5
7
- data.tar.gz: 55c62ec5c13331a3bef15c3badac233bb23d66fca4c3d3cd273161e66c256ba6032ccc47c552c1c474ba9f3ff21e12fb0211de215aaa10e200283829f19a85fb
6
+ metadata.gz: cc07ac48782722967f54d33c0aa633891f1f585557b6cb9427cf0d4ae711b5869c318631f17fd90ef5e82fbdfcf6946542e8cf0874b438aa2165818f601bb20d
7
+ data.tar.gz: da7fb040ce08572ff69666fe850a3d2bc6d0dd326b040e1c8772f2c4891cef54550baf18d2c558e29b1e9b5ed983a0b016eea6d5345137faaf878bcbbe28d350
data/README.md CHANGED
@@ -5,10 +5,12 @@ It is designed to be easy to use and easy to extend.
5
5
  It is still in the early stages of development, but it is already capable of rendering both 2D and 3D graphics.
6
6
 
7
7
  ## Installation
8
- TODO: Write installation instructions here
8
+ You can find full instructions on th [wiki](https://github.com/rubyrpg/ruby_rpg/wiki/Installation).
9
9
 
10
10
  ## Usage
11
- TODO: Write usage instructions here
11
+ You can find docs and guides on the [wiki](https://github.com/rubyrpg/ruby_rpg/wiki).
12
+ For a basic example to get you up off the ground take a look at [hello_ruby_rpg](https://github.com/rubyrpg/hello_ruby_rpg).
13
+ For some more complex examples you can take a look in the samples folder of this repo.
12
14
 
13
15
  ## Contributing
14
16
  1. Fork it
@@ -5,8 +5,9 @@ output_file=$2
5
5
 
6
6
  export BUILDING=true
7
7
 
8
+ parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
9
+ glfw_path=$parent_path/../glfw-3.4.bin.WIN64
10
+
8
11
  ocran $input_file \
9
- **/*.png **/*.obj **/*.glsl **/*.vertex_data **/*.index_data **/*.json **/*.csv glfw-3.4.bin.WIN64/**/* src/**/*.rb \
12
+ **/*.png **/*.obj **/*.glsl **/*.vertex_data **/*.index_data **/*.json **/*.csv $glfw_path/**/* src/**/*.rb \
10
13
  --output $output_file
11
-
12
-
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Engine
4
+ module AutoLoader
5
+ def self.load(load_path = nil)
6
+ base_dir = File.expand_path(load_path || File.dirname($PROGRAM_NAME))
7
+ Dir[File.join(base_dir, "components", "**/*.rb")].each { |file| require file }
8
+ Dir[File.join(base_dir, "game_objects", "**/*.rb")].each { |file| require file }
9
+ end
10
+ end
11
+ end
@@ -30,8 +30,12 @@ module Engine
30
30
  end
31
31
 
32
32
  def destroy!
33
+ Component.destroyed_components << self unless @destroyed
34
+ destroy unless @destroyed
33
35
  @destroyed = true
34
- destroy
36
+ end
37
+
38
+ def _erase!
35
39
  game_object.components.delete(self)
36
40
  class_name = self.class.name.split('::').last
37
41
  self.class.instance_variable_get(:@methods).each do |method|
@@ -42,7 +46,18 @@ module Engine
42
46
  end
43
47
  end
44
48
 
49
+ def self.erase_destroyed_components
50
+ destroyed_components.each do |object|
51
+ object._erase!
52
+ end
53
+ @destroyed_components = []
54
+ end
55
+
45
56
  def destroy
46
57
  end
58
+
59
+ def self.destroyed_components
60
+ @destroyed_components ||= []
61
+ end
47
62
  end
48
63
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Engine::Components
4
+ class AudioSource < Engine::Component
5
+ def initialize(clip, radius: 1000)
6
+ @clip = clip
7
+ @radius = radius
8
+ @source = NativeAudio::AudioSource.new(clip)
9
+ end
10
+
11
+ def play
12
+ @source.play
13
+ end
14
+
15
+ def stop
16
+ @source.stop
17
+ end
18
+
19
+ def pause
20
+ @source.pause
21
+ end
22
+
23
+ def resume
24
+ @source.resume
25
+ end
26
+
27
+ def volume=(volume)
28
+ @source.set_volume(volume)
29
+ end
30
+
31
+ def update(delta_time)
32
+ camera = Engine::Camera.instance
33
+ local_pos = camera.game_object.world_to_local_coordinate(game_object.pos)
34
+ angle = Math.atan2(local_pos[0], -local_pos[2]) * 180 / Math::PI
35
+ angle = (angle + 360) % 360
36
+ distance = (local_pos.magnitude * 255 / @radius).clamp(0, 255)
37
+
38
+ @source.set_pos(angle, distance)
39
+ end
40
+ end
41
+ end
@@ -33,8 +33,8 @@ module Engine::Components
33
33
  @right = nil if game_object.rotation != @rotation
34
34
  @up = nil if game_object.rotation != @rotation
35
35
  @front = nil if game_object.rotation != @rotation
36
- @matrix = nil if game_object.rotation.to_a != @rotation
37
- @rotation = game_object.rotation.to_a
36
+ @matrix = nil if game_object.rotation.dup != @rotation
37
+ @rotation = game_object.rotation.dup
38
38
  end
39
39
 
40
40
  private
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Engine
4
+ module Debugging
5
+
6
+ # Hit a breakpoint within the context of where the breakpoint is defined, assuming a block is passed
7
+ # with a `binding.pry` (or an alternative debugger), otherwise hit a breakpoint within this method.
8
+ def self.breakpoint(&block)
9
+ orig_fullscreen = Window.full_screen?
10
+ if orig_fullscreen
11
+ Window.set_to_windowed
12
+ GLFW.PollEvents # Required to trigger the switch from fullscreen to windowed within this breakpoint
13
+ end
14
+
15
+ orig_cursor_mode = Cursor.get_input_mode
16
+ Cursor.enable
17
+
18
+ block_given? ? yield : binding.pry
19
+ Cursor.restore_input_mode(orig_cursor_mode)
20
+ Window.set_to_full_screen if orig_fullscreen
21
+ Window.focus_window
22
+
23
+ # Reset the time, otherwise delta_time will be off for the next frame, and teleporting occurs
24
+ @time = Time.now
25
+ end
26
+
27
+ def self.debug_opengl_call
28
+ errors = []
29
+ until GL.GetError == 0; end
30
+ yield
31
+ until (error = GL.GetError) == 0
32
+ errors += error.to_s(16)
33
+ end
34
+ end
35
+
36
+ def self.print_opengl_version
37
+ puts "OpenGL Version: #{GL.GetString(GL::VERSION)}"
38
+ puts "GLSL Version: #{GL.GetString(GL::SHADING_LANGUAGE_VERSION)}"
39
+ end
40
+ end
41
+ end
data/lib/engine/engine.rb CHANGED
@@ -1,55 +1,10 @@
1
- require 'opengl'
2
- require 'glfw'
3
- require 'concurrent'
4
- require 'os'
5
-
6
- require_relative 'rendering/render_pipeline'
7
- require_relative 'rendering/instance_renderer'
8
- require_relative 'screenshoter'
9
- require_relative 'input'
10
- require_relative "quaternion"
11
- require_relative 'game_object'
12
- require_relative 'texture'
13
- require_relative 'material'
14
- require_relative 'mesh'
15
- require_relative "font"
16
- require_relative 'path'
17
- require_relative 'polygon_mesh'
18
- require_relative 'importers/obj_file'
19
- require_relative 'tangent_calculator'
20
- require_relative 'shader'
21
- require_relative 'component'
22
- require_relative "camera"
23
- require_relative "window"
24
- require_relative "video_mode"
25
- require_relative "cursor"
26
-
27
- require_relative "components/orthographic_camera"
28
- require_relative "components/perspective_camera"
29
- require_relative "components/sprite_renderer"
30
- require_relative "components/ui_sprite_renderer"
31
- require_relative "components/mesh_renderer"
32
- require_relative "components/font_renderer"
33
- require_relative "components/ui_font_renderer"
34
- require_relative "components/point_light"
35
- require_relative "components/direction_light"
36
-
37
- require_relative "physics/physics_resolver"
38
- require_relative 'physics/collision'
39
- require_relative "physics/components/sphere_collider"
40
- require_relative "physics/components/cube_collider"
41
- require_relative "physics/components/rigidbody"
42
-
43
- if OS.windows?
44
- GLFW.load_lib(File.expand_path(File.join(__dir__, "..", "..", "glfw-3.4.bin.WIN64", "lib-static-ucrt", "glfw3.dll")))
45
- elsif OS.mac?
46
- GLFW.load_lib(File.expand_path(File.join(__dir__, "..", "..", "glfw-3.3.9.bin.MACOS", "lib-arm64", "libglfw.3.dylib")))
47
- end
48
- GLFW.Init
1
+ # frozen_string_literal: true
2
+
3
+ GAME_DIR = File.expand_path(File.dirname($PROGRAM_NAME))
49
4
 
50
5
  module Engine
51
- def self.start(base_dir:, &first_frame_block)
52
- load(base_dir)
6
+ def self.start(&first_frame_block)
7
+ Engine::AutoLoader.load
53
8
  return if ENV["BUILDING"] == "true"
54
9
 
55
10
  open_window
@@ -61,20 +16,14 @@ module Engine
61
16
  @engine_started
62
17
  end
63
18
 
64
- def self.load(base_dir)
65
- base_dir = File.expand_path(base_dir)
66
- Dir[File.join(base_dir, "components", "**/*.rb")].each { |file| require file }
67
- Dir[File.join(base_dir, "game_objects", "**/*.rb")].each { |file| require file }
68
- end
69
-
70
19
  def self.open_window
71
20
  @old_time = Time.now
72
21
  @time = Time.now
73
- @key_callback = create_key_callbacks # This must be an instance variable to prevent garbage collection
74
22
 
75
23
  Window.create_window
76
24
  GLFW.MakeContextCurrent(Window.window)
77
- GLFW.SetKeyCallback(Window.window, @key_callback)
25
+
26
+ Input.init
78
27
  GL.load_lib
79
28
 
80
29
  set_opengl_blend_mode
@@ -85,8 +34,6 @@ module Engine
85
34
  GL.CullFace(GL::BACK)
86
35
 
87
36
  GLFW.SwapInterval(0)
88
-
89
- Cursor.hide
90
37
  end
91
38
 
92
39
  def self.main_game_loop(&first_frame_block)
@@ -144,13 +91,10 @@ module Engine
144
91
  @fps
145
92
  end
146
93
 
147
- def self.terminate
148
- GLFW.DestroyWindow(Window.window)
149
- GLFW.Terminate
150
- end
151
-
152
94
  def self.close
153
95
  GameObject.destroy_all
96
+ Component.erase_destroyed_components
97
+ GameObject.erase_destroyed_objects
154
98
  GLFW.SetWindowShouldClose(Window.window, 1)
155
99
  end
156
100
 
@@ -158,31 +102,17 @@ module Engine
158
102
  @game_stopped = true
159
103
  @swap_buffers_promise.wait! if @swap_buffers_promise && !@swap_buffers_promise.complete?
160
104
  GameObject.destroy_all
105
+ Component.erase_destroyed_components
106
+ GameObject.erase_destroyed_objects
161
107
  end
162
108
 
163
- # Hit a breakpoint within the context of where the breakpoint is defined, assuming a block is passed
164
- # with a `binding.pry` (or an alternative debugger), otherwise hit a breakpoint within this method.
165
- def self.breakpoint(&block)
166
- orig_fullscreen = Window.full_screen?
167
- if orig_fullscreen
168
- Window.set_to_windowed
169
- GLFW.PollEvents # Required to trigger the switch from fullscreen to windowed within this breakpoint
170
- end
171
-
172
- orig_cursor_mode = Cursor.get_input_mode
173
- Cursor.enable
174
-
175
- block_given? ? yield : binding.pry
176
- Cursor.restore_input_mode(orig_cursor_mode)
177
- Window.set_to_full_screen if orig_fullscreen
178
- Window.focus_window
109
+ private
179
110
 
180
- # Reset the time, otherwise delta_time will be off for the next frame, and teleporting occurs
181
- @time = Time.now
111
+ def self.terminate
112
+ GLFW.DestroyWindow(Window.window)
113
+ GLFW.Terminate
182
114
  end
183
115
 
184
- private
185
-
186
116
  def self.print_fps(delta_time)
187
117
  @time_since_last_fps_print = (@time_since_last_fps_print || 0) + delta_time
188
118
  @frame = (@frame || 0) + 1
@@ -198,24 +128,4 @@ module Engine
198
128
  GL.Enable(GL::BLEND)
199
129
  GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)
200
130
  end
201
-
202
- def self.create_key_callbacks
203
- GLFW::create_callback(:GLFWkeyfun) do |window, key, scancode, action, mods|
204
- Input.key_callback(key, action)
205
- end
206
- end
207
-
208
- def self.debug_opengl_call
209
- errors = []
210
- until GL.GetError == 0; end
211
- yield
212
- until (error = GL.GetError) == 0
213
- errors += error.to_s(16)
214
- end
215
- end
216
-
217
- def self.print_opengl_version
218
- puts "OpenGL Version: #{GL.GetString(GL::VERSION)}"
219
- puts "GLSL Version: #{GL.GetString(GL::SHADING_LANGUAGE_VERSION)}"
220
- end
221
131
  end
data/lib/engine/font.rb CHANGED
@@ -15,7 +15,7 @@ module Engine
15
15
  def texture
16
16
  @texture ||=
17
17
  begin
18
- path = File.expand_path(File.join(ROOT, "_imported", @font_file_path.gsub(".ttf", ".png")))
18
+ path = File.join("_imported", @font_file_path.gsub(".ttf", ".png"))
19
19
  Engine::Texture.for(path)
20
20
  end
21
21
  end
@@ -35,7 +35,7 @@ module Engine
35
35
  scale_factor = 1 / (1024.0 * 2)
36
36
  horizontal_offset = 0.0
37
37
  vertical_offset = 0.0
38
- font_path = File.expand_path(File.join(ROOT, "_imported", @font_file_path.gsub(".ttf", ".json")))
38
+ font_path = File.expand_path(File.join(GAME_DIR, "_imported", @font_file_path.gsub(".ttf", ".json")))
39
39
  font_metrics = JSON.parse File.read(font_path)
40
40
  string.chars.each do |char|
41
41
  if char == "\n"
@@ -8,15 +8,17 @@ module Engine
8
8
  @methods.add(name)
9
9
  end
10
10
 
11
- attr_accessor :name, :pos, :rotation, :scale, :components, :renderers, :ui_renderers, :created_at, :parent
11
+ attr_accessor :name, :pos, :scale, :components, :renderers, :ui_renderers, :created_at, :parent
12
12
 
13
13
  def initialize(name = "Game Object", pos: Vector[0, 0, 0], rotation: 0, scale: Vector[1, 1, 1], components: [], parent: nil)
14
14
  GameObject.object_spawned(self)
15
15
  @pos = Vector[pos[0], pos[1], pos[2] || 0]
16
16
  if rotation.is_a?(Numeric)
17
- @rotation = Vector[0, 0, rotation]
17
+ self.rotation = Quaternion.from_euler(Vector[0, 0, rotation])
18
+ elsif rotation.is_a?(Quaternion)
19
+ self.rotation = rotation
18
20
  else
19
- @rotation = rotation
21
+ self.rotation = Quaternion.from_euler(rotation)
20
22
  end
21
23
  @scale = scale
22
24
  @name = name
@@ -50,6 +52,20 @@ module Engine
50
52
  parent.children << self if parent
51
53
  end
52
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
+
53
69
  def x
54
70
  @pos[0]
55
71
  end
@@ -93,16 +109,16 @@ module Engine
93
109
  def rotate_around(axis, angle)
94
110
  rotation_quaternion = Quaternion.from_angle_axis(angle, axis)
95
111
 
96
- @rotation = (rotation_quaternion * Quaternion.from_euler(rotation)).to_euler
112
+ self.rotation = rotation_quaternion * rotation
97
113
  end
98
114
 
99
115
  def model_matrix
100
- cache_key = [@pos.dup, @rotation.dup, @scale.dup, @parent&.model_matrix&.to_a]
116
+ cache_key = [@pos.dup, rotation.dup, @scale.dup, @parent&.model_matrix&.to_a]
101
117
  @model_matrix = nil if @model_matrix_cache_key != cache_key
102
118
  @model_matrix_cache_key = cache_key
103
119
  @model_matrix ||=
104
120
  begin
105
- rot = rotation * Math::PI / 180
121
+ rot = euler_angles * Math::PI / 180
106
122
 
107
123
  cos_x = Math.cos(rot[0])
108
124
  cos_y = Math.cos(rot[1])
@@ -132,17 +148,30 @@ module Engine
132
148
 
133
149
  def destroy!
134
150
  return unless GameObject.objects.include?(self)
135
- @destroyed = true
151
+ children.each(&:destroy!)
136
152
  components.each(&:destroy!)
137
153
  ui_renderers.each(&:destroy!)
138
154
  renderers.each(&:destroy!)
155
+
156
+ GameObject.destroyed_objects << self unless @destroyed
157
+ @destroyed = true
158
+ end
159
+
160
+ def _erase!
139
161
  GameObject.objects.delete(self)
140
162
  parent.children.delete(self) if parent
141
- children.each(&:destroy!)
163
+ name = @name
142
164
  self.class.instance_variable_get(:@methods).each do |method|
143
165
  singleton_class.send(:undef_method, method)
144
- singleton_class.send(:define_method, method) { raise "This object has been destroyed. Object ID: #{self.object_id}" }
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!
145
173
  end
174
+ @destroyed_objects = []
146
175
  end
147
176
 
148
177
  def up
@@ -173,6 +202,9 @@ module Engine
173
202
  GameObject.objects.each do |object|
174
203
  object.components.each { |component| component.update(delta_time) }
175
204
  end
205
+
206
+ Component.erase_destroyed_components
207
+ GameObject.erase_destroyed_objects
176
208
  end
177
209
 
178
210
  def self.mesh_renderers
@@ -194,5 +226,9 @@ module Engine
194
226
  def self.objects
195
227
  @objects ||= []
196
228
  end
229
+
230
+ def self.destroyed_objects
231
+ @destroyed_objects ||= []
232
+ end
197
233
  end
198
234
  end
data/lib/engine/input.rb CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  module Engine
4
4
  class Input
5
+ def self.init
6
+ @key_callback = GLFW::create_callback(:GLFWkeyfun) do |window, key, scancode, action, mods|
7
+ Input.key_callback(key, action)
8
+ end
9
+ GLFW.SetKeyCallback(Window.window, @key_callback)
10
+
11
+ @cursor_pos_callback = GLFW::create_callback(:GLFWcursorposfun) do |window, x, y|
12
+ Input.mouse_callback(x, y)
13
+ end
14
+ GLFW.SetCursorPosCallback(Window.window, @cursor_pos_callback)
15
+
16
+ @mouse_button_callback = GLFW::create_callback(:GLFWmousebuttonfun) do |window, button, action, mods|
17
+ Input.mouse_button_callback(button, action)
18
+ end
19
+ GLFW.SetMouseButtonCallback(Window.window, @mouse_button_callback)
20
+ end
21
+
5
22
  def self.key?(key)
6
23
  keys[key] == :down || keys[key] == :held
7
24
  end
@@ -14,6 +31,17 @@ module Engine
14
31
  keys[key] == :up
15
32
  end
16
33
 
34
+ def self.mouse_pos
35
+ @mouse_pos
36
+ end
37
+
38
+ def self.mouse_delta
39
+ return Vector[0, 0] if @old_mouse_pos.nil?
40
+ return Vector[0, 0] unless @mouse_pos_updated
41
+
42
+ @mouse_pos - @old_mouse_pos
43
+ end
44
+
17
45
  def self._on_key_down(key)
18
46
  keys[key] = :down
19
47
  if key == GLFW::KEY_ESCAPE
@@ -21,7 +49,7 @@ module Engine
21
49
  end
22
50
 
23
51
  if key == GLFW::KEY_BACKSPACE
24
- Engine.breakpoint { binding.pry }
52
+ Engine::Debugging.breakpoint { binding.pry }
25
53
  # Engine.breakpoint { debugger }
26
54
  end
27
55
 
@@ -42,7 +70,22 @@ module Engine
42
70
  end
43
71
  end
44
72
 
73
+ def self.mouse_callback(x, y)
74
+ @mouse_pos_updated = true
75
+ @old_mouse_pos = @mouse_pos
76
+ @mouse_pos = Vector[x, y]
77
+ end
78
+
79
+ def self.mouse_button_callback(button, action)
80
+ if action == GLFW::PRESS
81
+ keys[button] = :down
82
+ elsif action == GLFW::RELEASE
83
+ keys[button] = :up
84
+ end
85
+ end
86
+
45
87
  def self.update_key_states
88
+ @mouse_pos_updated = false
46
89
  keys.each do |key, state|
47
90
  if state == :down
48
91
  keys[key] = :held
data/lib/engine/mesh.rb CHANGED
@@ -21,7 +21,7 @@ module Engine
21
21
  end
22
22
 
23
23
  def self.open_vertex(mesh_file)
24
- vertex_cache[File.join(ROOT, "_imported", mesh_file + ".vertex_data")]
24
+ vertex_cache[File.join(GAME_DIR, "_imported", mesh_file + ".vertex_data")]
25
25
  end
26
26
 
27
27
  def self.vertex_cache
@@ -31,7 +31,7 @@ module Engine
31
31
  end
32
32
 
33
33
  def self.open_index(mesh_file)
34
- index_cache[File.join(ROOT, "_imported", mesh_file + ".index_data")]
34
+ index_cache[File.join(GAME_DIR, "_imported", mesh_file + ".index_data")]
35
35
  end
36
36
 
37
37
  def self.index_cache
@@ -16,6 +16,12 @@ module Engine
16
16
  "Quaternion(w: #{@w}, x: #{@x}, y: #{@y}, z: #{@z})"
17
17
  end
18
18
 
19
+ def ==(other)
20
+ return false unless other.is_a?(Quaternion)
21
+
22
+ @w == other.w && @x == other.x && @y == other.y && @z == other.z
23
+ end
24
+
19
25
  def *(other)
20
26
  Quaternion.new(
21
27
  @w * other.w - @x * other.x - @y * other.y - @z * other.z,
@@ -12,8 +12,9 @@ module Engine
12
12
  load_texture
13
13
  end
14
14
 
15
- def self.for(file_path, flip: false)
16
- texture_cache[[file_path, flip]]
15
+ def self.for(path, flip: false)
16
+ full_path = File.expand_path(File.join(GAME_DIR, path))
17
+ texture_cache[[full_path, flip]]
17
18
  end
18
19
 
19
20
  def self.texture_cache
data/lib/ruby_rpg.rb CHANGED
@@ -1,3 +1,56 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'opengl'
4
+ require 'glfw'
5
+ require 'concurrent'
6
+ require 'os'
7
+ require 'native_audio'
8
+
9
+ require_relative 'engine/autoloader'
10
+ require_relative "engine/debugging"
11
+ require_relative 'engine/rendering/render_pipeline'
12
+ require_relative 'engine/rendering/instance_renderer'
13
+ require_relative 'engine/screenshoter'
14
+ require_relative 'engine/input'
15
+ require_relative "engine/quaternion"
16
+ require_relative 'engine/game_object'
17
+ require_relative 'engine/texture'
18
+ require_relative 'engine/material'
19
+ require_relative 'engine/mesh'
20
+ require_relative "engine/font"
21
+ require_relative 'engine/path'
22
+ require_relative 'engine/polygon_mesh'
23
+ require_relative 'engine/importers/obj_file'
24
+ require_relative 'engine/tangent_calculator'
25
+ require_relative 'engine/shader'
26
+ require_relative 'engine/component'
27
+ require_relative "engine/camera"
28
+ require_relative "engine/window"
29
+ require_relative "engine/video_mode"
30
+ require_relative "engine/cursor"
31
+
32
+ require_relative "engine/components/orthographic_camera"
33
+ require_relative "engine/components/perspective_camera"
34
+ require_relative "engine/components/sprite_renderer"
35
+ require_relative "engine/components/ui_sprite_renderer"
36
+ require_relative "engine/components/mesh_renderer"
37
+ require_relative "engine/components/font_renderer"
38
+ require_relative "engine/components/ui_font_renderer"
39
+ require_relative "engine/components/point_light"
40
+ require_relative "engine/components/direction_light"
41
+ require_relative "engine/components/audio_source"
42
+
43
+ require_relative "engine/physics/physics_resolver"
44
+ require_relative 'engine/physics/collision'
45
+ require_relative "engine/physics/components/sphere_collider"
46
+ require_relative "engine/physics/components/cube_collider"
47
+ require_relative "engine/physics/components/rigidbody"
48
+
49
+ if OS.windows?
50
+ GLFW.load_lib(File.expand_path(File.join(__dir__, "..", "glfw-3.4.bin.WIN64", "lib-static-ucrt", "glfw3.dll")))
51
+ elsif OS.mac?
52
+ GLFW.load_lib(File.expand_path(File.join(__dir__, "..", "glfw-3.3.9.bin.MACOS", "lib-arm64", "libglfw.3.dylib")))
53
+ end
54
+ GLFW.Init
55
+
3
56
  require_relative 'engine/engine'
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_rpg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Hatfull
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-27 00:00:00.000000000 Z
11
+ date: 2024-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: native_audio
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: opengl-bindings2
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,7 @@ extensions: []
108
122
  extra_rdoc_files: []
109
123
  files:
110
124
  - README.md
125
+ - bin/build.bash
111
126
  - bin/import
112
127
  - glfw-3.3.9.bin.MACOS/LICENSE.md
113
128
  - glfw-3.3.9.bin.MACOS/README.md
@@ -537,9 +552,10 @@ files:
537
552
  - glfw-3.4.bin.WIN64/lib-vc2022/glfw3.lib
538
553
  - glfw-3.4.bin.WIN64/lib-vc2022/glfw3_mt.lib
539
554
  - glfw-3.4.bin.WIN64/lib-vc2022/glfw3dll.lib
540
- - lib/build.bash
555
+ - lib/engine/autoloader.rb
541
556
  - lib/engine/camera.rb
542
557
  - lib/engine/component.rb
558
+ - lib/engine/components/audio_source.rb
543
559
  - lib/engine/components/direction_light.rb
544
560
  - lib/engine/components/font_renderer.rb
545
561
  - lib/engine/components/mesh_renderer.rb
@@ -550,6 +566,7 @@ files:
550
566
  - lib/engine/components/ui_font_renderer.rb
551
567
  - lib/engine/components/ui_sprite_renderer.rb
552
568
  - lib/engine/cursor.rb
569
+ - lib/engine/debugging.rb
553
570
  - lib/engine/engine.rb
554
571
  - lib/engine/font.rb
555
572
  - lib/engine/game_object.rb