gametools 0.0.1pre1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f99bcfe5bfa4969e7a8027959e5189d85526da38
4
+ data.tar.gz: 0fa8d3eda2ac9fc29a7e3b1c77f5c8f08bd34d36
5
+ SHA512:
6
+ metadata.gz: 1776b1e957fff84093c7d0d43c337ffe166845ab5f5485a5525daa8713bc1f47d65acc00d048cd2f63c6bfbddb3ff49947833386af3a70f2615dd65e31796470
7
+ data.tar.gz: 80b9770d3f3c89cf70de0729d2701ca32240ce96734897fc128f6c86fc96ae9017b5ccc958cb33acd070687daf519fcc50452b330ca90cd671a04544c7aabb22
data/COPYING ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2013, Noel Raymond Cower <ncower@gmail.com>.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
+
24
+ The views and conclusions contained in the software and documentation are those
25
+ of the authors and should not be interpreted as representing official policies,
26
+ either expressed or implied, of the FreeBSD Project.
@@ -0,0 +1,42 @@
1
+ # GameTools
2
+
3
+ # When on rubygems.org
4
+ $ gem install gametools
5
+
6
+
7
+ # Intro
8
+
9
+ GameTools is a gem comprised of various tools for building games, including...
10
+
11
+
12
+ # License
13
+
14
+ GameTools is licensed under a simplified BSD license:
15
+
16
+ Copyright (c) 2013, Noel Raymond Cower <ncower@gmail.com>.
17
+ All rights reserved.
18
+
19
+ Redistribution and use in source and binary forms, with or without
20
+ modification, are permitted provided that the following conditions are met:
21
+
22
+ 1. Redistributions of source code must retain the above copyright notice, this
23
+ list of conditions and the following disclaimer.
24
+ 2. Redistributions in binary form must reproduce the above copyright notice,
25
+ this list of conditions and the following disclaimer in the documentation
26
+ and/or other materials provided with the distribution.
27
+
28
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
29
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
30
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
32
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
33
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
34
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
35
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
+
39
+ The views and conclusions contained in the software and documentation are those
40
+ of the authors and should not be interpreted as representing official policies,
41
+ either expressed or implied, of the FreeBSD Project.
42
+
@@ -0,0 +1,2 @@
1
+ require 'gametools/version'
2
+ require 'gametools/base'
@@ -0,0 +1,331 @@
1
+ require 'glfw3'
2
+
3
+ module GT ; end
4
+
5
+ #
6
+ # Class representation of a base game's initialization and main loop. Includes
7
+ # overridable methods to handle game / frame logic and rendition, including:
8
+ #
9
+ # [init] Called on initialization. By default, sets up GLFW event
10
+ # callbacks. Any subclass implementation should call its
11
+ # superclass implementation to ensure callbacks are set up.
12
+ #
13
+ # [terminate] Called once the loop ends. By default, this is not
14
+ # implemented.
15
+ #
16
+ # [event] Called when an event is received with named parameters. By
17
+ # default, this method is not implemented.
18
+ #
19
+ # A typical implementation might look like this, if one wanted
20
+ # to cover most named arguments:
21
+ #
22
+ # def event(sender, kind,
23
+ # x: nil, y: nil, # window_position, window_size, cursor_position,
24
+ # # framebuffer_size, scroll
25
+ # focused: nil, # window_focus
26
+ # iconified: nil, # window_iconify
27
+ # entered: nil, # cursor_enter
28
+ # action: nil, # mouse, key
29
+ # button: nil, # mouse, key
30
+ # scancode: nil, # key
31
+ # mods: nil, # mouse, key
32
+ # char: nil, # char
33
+ # **args)
34
+ # # ...
35
+ # end
36
+ #
37
+ # Though, in reality, it is sufficient to only provide the
38
+ # sender and kind arguments and collect any remaining named
39
+ # arguments in a Hash.
40
+ #
41
+ # [pre_frame] Logic handled before frame updates happen. By default, this
42
+ # method is unimplemented. It is called after event polling.
43
+ #
44
+ # [fixed_frame] Frame logic -- run in a fixed-step loop. Unimplemented by
45
+ # default.
46
+ #
47
+ # [pre_rendition] Anything that must occur before rendition. Similarly, there
48
+ # is also post_rendition for anything that must happen after
49
+ # rendition. By default, this is unimplemented.
50
+ #
51
+ # [rendition] Rendition. Unimplemented by default.
52
+ #
53
+ # [post_rendition] Anything that must occur after rendition. Unimplemented by
54
+ # default.
55
+ #
56
+ # Except for the event method, none of these functions takes any arguments.
57
+ #
58
+ #
59
+ # === Event Kinds
60
+ #
61
+ # The event method is always provided with the sender and kind of event being
62
+ # sent, in addition to any number of named arguments in any order. As a result,
63
+ # it's a good idea to define those named arguments you would like and accept
64
+ # any additional arguments via a Hash.
65
+ #
66
+ # The events provided by a Glfw window and their arguments are as follows:
67
+ #
68
+ # [:refresh] Sent when a window is going to be redrawn. Has no
69
+ # arguments. Sender is the window whose contents are going
70
+ # to be redrawn.
71
+ #
72
+ # [:window_close] Sent when the user attempts to close a window. Has no
73
+ # arguments. Sender is the window the user attempted to
74
+ # close.
75
+ #
76
+ # [:window_position] Sent when a window is moved. Has x and y named arguments.
77
+ # Sender is the moved window.
78
+ #
79
+ # [:window_size] Sent when a window is resized. Has x and y named
80
+ # arguments. Sender is the resized window.
81
+ #
82
+ # [:framebuffer_size] Sent when a window's framebuffer is resized. Has x and y
83
+ # named arguments. Sender is the window whose
84
+ # framebuffer was resized.
85
+ #
86
+ # [:window_iconify] Sent when a window is iconified (e.g., minimized). Has a
87
+ # named argument, iconify, that is a boolean value for
88
+ # whether the window was iconified (if false, the window
89
+ # was de-iconified or restored or whatever term you like).
90
+ # Sender is the iconified window.
91
+ #
92
+ # [:window_focus] Sent when a window's focus is changed. Has a named
93
+ # argument, focused, for whether the window lost (false) or
94
+ # gained (true) focus. Sender is the focused window.
95
+ #
96
+ # [:cursor_position] Called when the cursor's position changes. Has x and y
97
+ # named argument. Sender is the currently focused window.
98
+ #
99
+ # [:cursor_enter] Sent when a cursor enters a window. Has a named argument,
100
+ # entered, for whether the cursor entered (true)
101
+ # or left (false) the window. Sender is the window the
102
+ # cursor entered or left.
103
+ #
104
+ # [:mouse] Sent when a mouse button is pressed or released in a
105
+ # window. Has named arguments button, action, and mods.
106
+ # action is either of Glfw::PRESSED or Glfw::RELEASED.
107
+ # mods is an or'd combination of Glfw modifier key flags.
108
+ # Sender is the window the mouse button was pressed in.
109
+ #
110
+ # [:scroll] Sent for mouse wheel scrolling in a window. Has x and y
111
+ # named arguments for the scrolling deltas. Sender is the
112
+ # window the mouse scrolling occurred in.
113
+ #
114
+ # [:key] Sent when a keyboard key is pressed, released, or when a
115
+ # key is repeated. Has button, scancode, action, and mods
116
+ # named arguments. action is one of Glfw::PRESSED,
117
+ # Glfw::REPEAT, or Glfw::RELEASED for when a key is pressed,
118
+ # repeated, or released. scancode is the actual scancode of
119
+ # the key, whereas button is the button that corresponds to
120
+ # a Glfw keyboard button constant. mods is an or'd
121
+ # combination of Glfw modifier key flags. Sender is the
122
+ # window the keyboard events happened in, typically the
123
+ # focused window.
124
+ #
125
+ # [:char] Sent when a keyboard key is pressed. Has a named argument,
126
+ # char, which is the integer character for the key pressed.
127
+ # The value of this depends on the OS. The sender is the
128
+ # window the event happened in, typically the focused
129
+ # window.
130
+ #
131
+ # === Frames Per Second & Rendition
132
+ #
133
+ # The default frames_per_second is 60, though can be changed by setting any
134
+ # other value appropriate for the game (depending on the game, it may not be
135
+ # necessary to run at 60 FPS).
136
+ #
137
+ # frames_per_second refers to the logic updates, not rendition, which is done
138
+ # as often as possible depending on the GLFW swap interval. Nothing in the loop
139
+ # works to limit rendition.
140
+ #
141
+ class GT::Base
142
+
143
+ # The main window assigned to the loop. Must be set before calling #run.
144
+ # Additional windows can be hooked up to receive events by passing them to
145
+ # the #hook_window method.
146
+ attr_accessor :window
147
+
148
+ # Whether the loop is running. To exit the loop, set this to false -- this is
149
+ # the only way to exit the loop.
150
+ attr_accessor :running
151
+ # The frames per second of the loop. This can only be modified when the loop
152
+ # isn't running.
153
+ attr_accessor :frames_per_second
154
+ # Read-only attribute for getting the frame hertz for the loop's frames per
155
+ # second. This is simply 1000.0 / frames_per_second.
156
+ attr_reader :frame_hertz
157
+ # Gets the current simulation time. This increments in frame_hertz steps and
158
+ # is used for the fixed-step frameloop.
159
+ attr_reader :simulation_time
160
+ # The current frame time. This is the beginning time for the current frameloop
161
+ # and does not change during the frameloop. It is not typically very useful.
162
+ # If you need a frame time to use, it's better to call Glfw::time and subtract
163
+ # the base_time from it.
164
+ attr_reader :frame_time
165
+ # The base time of the game loop. This is set when #run is called and is used
166
+ # as the base time for the game loop. To determine an accurate time in
167
+ # relation to either the simulation_time or frame_time, take the difference
168
+ # of Glfw::time and base_time. For example:
169
+ #
170
+ # current_time = Glfw.time - gameloop.base_time
171
+ #
172
+ attr_reader :base_time
173
+
174
+
175
+ #
176
+ # Allocates a new GameLoop object. Must be given a Glfw window before #run
177
+ # can be called.
178
+ #
179
+ def initialize
180
+ self.frames_per_second = 60.0
181
+ @__running = self.running = false
182
+ @simulation_time = 0.0
183
+ @frame_time = 0.0
184
+ end
185
+
186
+ #
187
+ # call-seq:
188
+ # frames_per_second = new_fps => new_fps
189
+ #
190
+ # Sets the loop's frames per second and updates the frame_hertz for the loop.
191
+ #
192
+ def frames_per_second=(new_fps)
193
+ raise "Cannot change FPS while running" if @__running
194
+ @fps = new_fps
195
+ @frame_hertz = 1000.0 / @fps.to_f
196
+ new_fps
197
+ end
198
+
199
+ #
200
+ # Called before the loop is run to initialize anything. By default, this calls
201
+ # hook_window with the loop's window. Subclasses should call the superclass
202
+ # method if implementing it as well.
203
+ #
204
+ def init
205
+ raise "No window provided" unless @window
206
+ hook_window @window
207
+ end
208
+
209
+ #
210
+ # Hooks a window up to the GameLoop so that the window's events will be sent
211
+ # to the GameLoop via event(..) if implemented.
212
+ #
213
+ def hook_window(window)
214
+ loop_self = self
215
+ window.refresh_callback = ->(window) {
216
+ if loop_self.respond_to? :event
217
+ forward = event window, :refresh
218
+ end
219
+ }
220
+ window.close_callback = ->(window) {
221
+ if loop_self.respond_to? :event
222
+ forward = event window, :window_close
223
+ end
224
+ }
225
+
226
+ window.position_callback = ->(window, x, y) {
227
+ if loop_self.respond_to? :event
228
+ forward = event window, :window_position, x: x, y: y
229
+ end
230
+ }
231
+
232
+ window.size_callback = ->(window, x, y) {
233
+ if loop_self.respond_to? :event
234
+ forward = event window, :window_size, x: x, y: y
235
+ end
236
+ }
237
+
238
+ window.framebuffer_size_callback = ->(window, x, y) {
239
+ if loop_self.respond_to? :event
240
+ forward = event window, :framebuffer_size, x: x, y: y
241
+ end
242
+ }
243
+
244
+ window.iconify_callback = ->(window, iconified) {
245
+ if loop_self.respond_to? :event
246
+ forward = event window, :window_iconify, iconified: iconified
247
+ end
248
+ }
249
+
250
+ window.focus_callback = ->(window, focused) {
251
+ if loop_self.respond_to? :event
252
+ forward = event window, :window_focus, focused: focused
253
+ end
254
+ }
255
+
256
+ window.cursor_position_callback = ->(window, x, y) {
257
+ if loop_self.respond_to? :event
258
+ forward = event window, :cursor_position, x: x, y: y
259
+ end
260
+ }
261
+
262
+ window.cursor_enter_callback = ->(window, entered) {
263
+ if loop_self.respond_to? :event
264
+ forward = event window, :cursor_enter, entered: entered
265
+ end
266
+ }
267
+
268
+ window.mouse_button_callback = ->(window, button, action, mods) {
269
+ if loop_self.respond_to? :event
270
+ forward = event window, :mouse, button: button, action: action, mods: mods
271
+ end
272
+ }
273
+
274
+ window.scroll_callback = ->(window, x, y) {
275
+ if loop_self.respond_to? :event
276
+ forward = event window, :scroll, x: x, y: y
277
+ end
278
+ }
279
+
280
+ window.key_callback = ->(window, button, scancode, action, mods) {
281
+ if loop_self.respond_to? :event
282
+ event window, :key, button: button, scancode: scancode, action: action,
283
+ mods: mods
284
+ end
285
+ }
286
+
287
+ window.char_callback = ->(window, char) {
288
+ if loop_self.respond_to? :event
289
+ forward = event window, :char, char: char
290
+ end
291
+ }
292
+ end
293
+
294
+ #
295
+ # Runs the frameloop. Requires a window be assigned to the loop before this
296
+ # will work, otherwise an exception will be raised.
297
+ #
298
+ def run
299
+ init
300
+
301
+ @simulation_time = 0.0
302
+ self.running = true
303
+ @base_time = ::Glfw::time
304
+ hertz = @frame_hertz
305
+
306
+ @window.make_context_current
307
+
308
+ while (@__running = self.running)
309
+
310
+ @actual_time = ::Glfw::time - base_time
311
+
312
+ # Pre-logic loop and poll for events
313
+ ::Glfw::poll_events
314
+ pre_frame if respond_to? :pre_frame
315
+
316
+ # Logic loop
317
+ until @simulation_time > @actual_time
318
+ fixed_frame if respond_to? :fixed_frame
319
+ @simulation_time += @frame_hertz
320
+ end
321
+
322
+ # Rendition
323
+ pre_rendition if respond_to? :pre_rendition
324
+ rendition if respond_to? :rendition
325
+ post_rendition if respond_to? :post_rendition
326
+ end
327
+
328
+ terminate if respond_to? :terminate
329
+ end
330
+
331
+ end # class Base
@@ -0,0 +1,74 @@
1
+ module GT ; end
2
+
3
+ class GT::Transform
4
+
5
+ # Applies movement relative to the transform's rotation
6
+ def move_relative(movement)
7
+ @translation.add!(@rotation.rotate_vec3(movement))
8
+ end
9
+
10
+ # Applies translation
11
+ def translate(translation)
12
+ @translation.add!(translation)
13
+ end
14
+
15
+ # Applies scaling
16
+ def scale_by(scaling)
17
+ @scale.multiply!(scaling)
18
+ end
19
+
20
+ # Applies a rotation
21
+ def rotate(rotation)
22
+ case rotation
23
+ when Mat3 then rotate_mat3(rotation)
24
+ when Quat then rotate_quat(rotation)
25
+ when Vec3 then rotate_euler(rotation)
26
+ else raise TypeError, "Invalid type of rotation"
27
+ end
28
+ end
29
+
30
+ # Sets current translation to the Vec3 translation
31
+ def translation=(translation)
32
+ @translation.copy(translation)
33
+ end
34
+
35
+ def translation(out = nil)
36
+ @translation.copy(out)
37
+ end
38
+
39
+ # Sets current scale to the Vec3 scaling
40
+ def scale=(scaling)
41
+ @scale.copy(scaling)
42
+ end
43
+
44
+ # Returns a Vec3
45
+ def scale(out = nil)
46
+ @scale.copy(out)
47
+ end
48
+
49
+ def rotation=(rotation)
50
+ case rotation
51
+ when Mat3 then self.rotation_mat3 = rotation
52
+ when Quat then self.rotation_quat = rotation
53
+ when Vec3 then self.rotation_euler = rotation
54
+ else raise TypeError, "Invalid type of rotation"
55
+ end
56
+ end
57
+
58
+ def rotation_mat3=(rotation)
59
+ @rotation.set(rotation)
60
+ end
61
+
62
+ def rotation_quat=(rotation)
63
+ @rotation.set(rotation)
64
+ end
65
+
66
+ def rotation_euler=(rotation)
67
+ end
68
+
69
+ # Returns a Mat3
70
+ def rotation(out = nil)
71
+ @rotation.copy(out)
72
+ end
73
+
74
+ end
@@ -0,0 +1,7 @@
1
+ module GT
2
+ GAMETOOLS_VERSION = '0.0.1pre1'
3
+ GAMETOOLS_DATE = '2013-07-28'
4
+ GAMETOOLS_LICENSE_BRIEF = 'Simplified BSD'
5
+ GAMETOOLS_PATH = File.expand_path("../../../", __FILE__)
6
+ GAMETOOLS_LICENSE_FULL = File.open("#{GAMETOOLS_PATH}/COPYING") { |io| io.read }
7
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gametools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1pre1
5
+ platform: ruby
6
+ authors:
7
+ - Noel Raymond Cower
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: glfw3
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.4
27
+ description: A gem of tools for Ruby game development using GLFW 3 and OpenGL.
28
+ email: ncower@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files:
32
+ - README.md
33
+ - COPYING
34
+ files:
35
+ - lib/gametools/base.rb
36
+ - lib/gametools/transform.rb
37
+ - lib/gametools/version.rb
38
+ - lib/gametools.rb
39
+ - COPYING
40
+ - README.md
41
+ homepage: https://github.com/nilium/ruby-gametools
42
+ licenses:
43
+ - Simplified BSD
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - '>'
57
+ - !ruby/object:Gem::Version
58
+ version: 1.3.1
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.0.5
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Tools for Ruby game development
65
+ test_files: []
66
+ has_rdoc: true