ruby_rpg 0.0.3 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b56f66eb45701f903472f4d948d42e1a67a9bf051c59e0515ee8df1195503d7e
4
- data.tar.gz: 35e50569d84181202098fd7425025ef73bdc54d0d7eae16bef0ad0acbe1fb6fb
3
+ metadata.gz: 73ebf7bd3a497f3da5bb8bf0c953da36446ef912edede3605ae811a7d7778c21
4
+ data.tar.gz: 2c6d68447ef0502ca2d19020659bf09b1821fec4ff741ee5901a142358513701
5
5
  SHA512:
6
- metadata.gz: '08ec8719dae3c6788e4aa692059706ed9635b540974164339c4a5887dc0a0a420b48d8b7abc4022f87b899b8e2c02674d060107ec8c3dad06dcd6431add8f433'
7
- data.tar.gz: a65cadf65c339c7b656c825dfa1ea6365e6fb2c94f090396b3e11c4e515d78b45819447bd186ebfb79424ed5fc25689d66cb4ed4a59b76c7e0ad7b5d943a187d
6
+ metadata.gz: cc07ac48782722967f54d33c0aa633891f1f585557b6cb9427cf0d4ae711b5869c318631f17fd90ef5e82fbdfcf6946542e8cf0874b438aa2165818f601bb20d
7
+ data.tar.gz: da7fb040ce08572ff69666fe850a3d2bc6d0dd326b040e1c8772f2c4891cef54550baf18d2c558e29b1e9b5ed983a0b016eea6d5345137faaf878bcbbe28d350
@@ -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
data/lib/engine/engine.rb CHANGED
@@ -19,11 +19,11 @@ module Engine
19
19
  def self.open_window
20
20
  @old_time = Time.now
21
21
  @time = Time.now
22
- @key_callback = create_key_callbacks # This must be an instance variable to prevent garbage collection
23
22
 
24
23
  Window.create_window
25
24
  GLFW.MakeContextCurrent(Window.window)
26
- GLFW.SetKeyCallback(Window.window, @key_callback)
25
+
26
+ Input.init
27
27
  GL.load_lib
28
28
 
29
29
  set_opengl_blend_mode
@@ -34,8 +34,6 @@ module Engine
34
34
  GL.CullFace(GL::BACK)
35
35
 
36
36
  GLFW.SwapInterval(0)
37
-
38
- Cursor.hide
39
37
  end
40
38
 
41
39
  def self.main_game_loop(&first_frame_block)
@@ -130,10 +128,4 @@ module Engine
130
128
  GL.Enable(GL::BLEND)
131
129
  GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)
132
130
  end
133
-
134
- def self.create_key_callbacks
135
- GLFW::create_callback(:GLFWkeyfun) do |window, key, scancode, action, mods|
136
- Input.key_callback(key, action)
137
- end
138
- end
139
131
  end
@@ -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])
@@ -186,7 +202,7 @@ module Engine
186
202
  GameObject.objects.each do |object|
187
203
  object.components.each { |component| component.update(delta_time) }
188
204
  end
189
-
205
+
190
206
  Component.erase_destroyed_components
191
207
  GameObject.erase_destroyed_objects
192
208
  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
@@ -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
@@ -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,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_rpg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
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-11-04 00:00:00.000000000 Z
11
+ date: 2024-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: native_audio