rage 0.1 → 0.2

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.
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ require 'rake/gempackagetask'
9
9
 
10
10
 
11
11
  GEM_NAME="rage"
12
- PKG_VERSION='0.1'
12
+ PKG_VERSION='0.2'
13
13
 
14
14
  desc "Run all specs"
15
15
  Spec::Rake::SpecTask.new('spec') do |t|
@@ -22,19 +22,24 @@ Rake::RDocTask.new do |rd|
22
22
  rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
23
23
  end
24
24
 
25
- PKG_FILES = FileList['bin/**/*', 'lib/**/*.rb', 'COPYING', 'LICENSE', 'Rakefile', 'README.rdoc', 'spec/**/*.rb' ]
25
+ PKG_FILES = FileList['lib/**/*.rb', 'COPYING', 'LICENSE', 'Rakefile', 'README.rdoc', 'spec/**/*' ]
26
26
 
27
27
  SPEC = Gem::Specification.new do |s|
28
28
  s.name = GEM_NAME
29
29
  s.version = PKG_VERSION
30
30
  s.files = PKG_FILES
31
+ s.executables << 'rage-mesh-viewer'
31
32
 
32
33
  s.required_ruby_version = '>= 1.8.1'
33
34
  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.3")
35
+ s.add_development_dependency('rspec', '~> 1.3.0')
36
+ s.add_dependency('rubysdl', '~> 2.1.1')
37
+ s.add_dependency('ruby-opengl', '~> 0.60.1')
38
+ s.add_dependency('rxsd', '~> 0.4.1')
34
39
 
35
40
  s.author = "Mohammed Morsi"
36
41
  s.email = "movitto@yahoo.com"
37
- s.date = %q{2010-03-20}
42
+ s.date = %q{2010-09-05}
38
43
  s.description = %q{The Ruby Advanced Gaming Engine}
39
44
  s.summary = %q{The Ruby Advanced Gaming Engine}
40
45
  s.homepage = %q{http://morsi.org/projects/RAGE}
@@ -13,7 +13,7 @@
13
13
  require 'rubygems'
14
14
  require 'optparse'
15
15
 
16
- require 'lib/rage'
16
+ require 'rage'
17
17
 
18
18
  include RAGE
19
19
 
@@ -25,6 +25,8 @@ require lib + '/rage/location'
25
25
  require lib + '/rage/loader'
26
26
  require lib + '/rage/color'
27
27
  require lib + '/rage/mesh'
28
+ require lib + '/rage/text'
28
29
  require lib + '/rage/camera'
29
30
  require lib + '/rage/viewport'
31
+ require lib + '/rage/audio'
30
32
  require lib + '/rage/dsl'
@@ -0,0 +1,53 @@
1
+ # RAGE Audio Subsystem
2
+ #
3
+ # Copyright (C) 2010 Mohammed Morsi <movitto@yahoo.com>
4
+ # Licensed under the GPLv3+ http://www.gnu.org/licenses/gpl.txt
5
+
6
+ require 'singleton'
7
+
8
+ module RAGE
9
+
10
+ # TODO support different audio types
11
+
12
+ # Manages all audio operations.
13
+ # Currently uses SDL mixer to accomplish this
14
+ class Audio
15
+ class_attr :audio_initialized
16
+
17
+ # pass in as the :times arg to specify continuous music
18
+ NONSTOP = -1
19
+
20
+ def self.play(file, args = {})
21
+ unless defined? @@audio_initialized
22
+ @@audio_initialized = true
23
+ # TODO allow different frequency / open options and channel allocations
24
+ SDL::Mixer.open(22050 * 4)
25
+ SDL::Mixer.allocate_channels(16)
26
+ end
27
+
28
+ audio = RAGE::Audio.new args.merge(:wave => SDL::Mixer::Wave.load(file))
29
+ audio.play
30
+ end
31
+
32
+ def initialize(args = {})
33
+ @times = 1
34
+
35
+ @wave = args[:wave] if args.has_key? :wave
36
+ @times = args[:times] if args.has_key? :times
37
+ end
38
+
39
+ def play
40
+ @channel = SDL::Mixer.play_channel(-1, @wave, @times)
41
+ end
42
+
43
+ def playing?
44
+ SDL::Mixer.play?(@channel)
45
+ end
46
+
47
+ def stop
48
+ SDL::Mixer.halt(@channel)
49
+ end
50
+
51
+ end # module Audio
52
+
53
+ end # module RAGE
@@ -26,7 +26,7 @@ class Camera
26
26
  depth = (Window.width + Window.height)/4
27
27
  @projection = [45, Window.width / Window.height, 1, depth]
28
28
 
29
- # initialize lookat params
29
+ # initial position
30
30
  @pos = [0, 0, 1]
31
31
 
32
32
  # initial rotation params
@@ -6,31 +6,45 @@
6
6
  # Sets attributes on the Window w/ any specified arguments and then
7
7
  # invokes block w/ the Window class. Finally Window is returned.
8
8
  def window(args = {}, &block)
9
- Window.set_attrs args
10
- block.call Window unless block.nil?
11
- return Window
9
+ RAGE::Window.set_attrs args
10
+ block.call RAGE::Window unless block.nil?
11
+ return RAGE::Window
12
12
  end
13
13
 
14
14
  # Instantiate new viewport w/ specified args and invoke block, using
15
15
  # viewport as an arg. Finally return viewport
16
16
  def viewport(args = {}, &block)
17
- vp = Viewport.new args
17
+ vp = RAGE::Viewport.new args
18
18
  block.call vp unless block.nil?
19
19
  return vp
20
20
  end
21
21
 
22
- # Load resource w/ specified args and invoke blockm using resource as an arg.
22
+ # Load resource w/ specified args and invoke block using resource as an arg.
23
23
  # Finally return resource.
24
24
  def resource(args = {}, &block)
25
- resource = ResourcesManager.instance.load_resource args
25
+ resource = RAGE::ResourcesManager.instance.load_resource args
26
26
  block.call resource unless block.nil?
27
27
  return resource
28
28
  end
29
29
 
30
+ # Create a RAGEi::Text instance to display on screen and invoke block
31
+ # using it as an arg. Finally return Text object
32
+ def text(txt, args = {}, &block)
33
+ rtext = RAGE::Text.new args.merge(:text => txt)
34
+ block.call rtext unless block.nil?
35
+ return rtext
36
+ end
37
+
38
+ # Return input handlers manager, which can be used to register/remove
39
+ # user input handlers
40
+ def input_handlers
41
+ RAGE::InputHandler
42
+ end
43
+
30
44
  # Set attributes on Game w/ specified args and invoke block
31
45
  # using Game as an arg. Finally return Game
32
46
  def game(args = {}, &block)
33
47
  #Game.set_attrs(args)
34
- block.call Game unless block.nil?
35
- return Game
48
+ block.call RAGE::Game unless block.nil?
49
+ return RAGE::Game
36
50
  end
@@ -35,6 +35,8 @@ class Game
35
35
  def self.run
36
36
  Gl.glEnable( Gl::GL_TEXTURE_2D )
37
37
  Gl.glEnable(Gl::GL_DEPTH_TEST)
38
+ Gl.glEnable(Gl::GL_BLEND);
39
+ Gl.glBlendFunc(Gl::GL_SRC_ALPHA, Gl::GL_ONE_MINUS_SRC_ALPHA);
38
40
  Gl.glDepthMask(Gl::GL_TRUE)
39
41
 
40
42
  @@wireframe_mode = false
@@ -5,29 +5,80 @@
5
5
 
6
6
  module RAGE
7
7
 
8
- # FIXME turn into callback interface
9
-
10
8
  # Handles and redirects user events to registered callbacks.
11
9
  class InputHandler
12
10
 
11
+ class_attr :handlers
12
+
13
+ def self.<<(handler)
14
+ set_defaults
15
+ @@handlers << handler
16
+ end
17
+
18
+ def self.clear
19
+ set_defaults
20
+ @@handlers.clear
21
+ end
22
+
13
23
  # Invoked during main game execution cycle to handle any SDL input events
14
24
  def self.handle(event)
25
+ set_defaults
26
+ @@handlers.each { |h| h.handle(event) }
27
+ end
15
28
 
16
- @@left_button_pressed = false unless defined? @@left_button_pressed
17
- @@right_button_pressed = false unless defined? @@right_button_pressed
29
+ private
18
30
 
31
+ def self.set_defaults
32
+ # TODO at some point these default handlers should probably be removed
33
+ @@handlers ||= [InputHandlers::TerminationInputHandler, InputHandlers::CommonOpenGlInputHandler, InputHandlers::SimpleCameraInputHandler]
34
+ end
35
+
36
+ end
37
+
38
+ module InputHandlers
39
+
40
+ # Input handler providing ability to Terminate game on quit related events, including
41
+ # * SDL quit event (window close, etc)
42
+ # * 'Q' or 'ESC' keys pressed
43
+ class TerminationInputHandler
44
+ def self.handle(event)
19
45
  case event
20
46
  when SDL::Event2::Quit
21
47
  exit
22
-
23
48
  when SDL::Event2::KeyDown
24
49
  case event.sym
25
50
  when SDL::Key::Q, SDL::Key::ESCAPE
26
51
  exit
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ # Input handler providing common opengl related operations, including
58
+ # * 'W' key toggles wireframe mode on / off
59
+ class CommonOpenGlInputHandler
60
+ def self.handle(event)
61
+ case event
62
+ when SDL::Event2::KeyDown
63
+ case event.sym
27
64
  when SDL::Key::W
28
65
  Game.wireframe_mode= !Game.wireframe_mode
29
66
  end
67
+ end
68
+ end
69
+ end
70
+
71
+ # Input handler providing the following simple controls
72
+ # * Mouse wheel in/out - zoom camera in/out
73
+ # * Hold left mouse button & drag, rotate camera
74
+ # * Hold right mouse button & drag, pan camera
75
+ class SimpleCameraInputHandler
30
76
 
77
+ def self.handle(event)
78
+ @@left_button_pressed = false unless defined? @@left_button_pressed
79
+ @@right_button_pressed = false unless defined? @@right_button_pressed
80
+
81
+ case event
31
82
  when SDL::Event::MouseMotion
32
83
  # get state of mouse buttons
33
84
  left_pressed = ((event.state & SDL::Mouse::BUTTON_LMASK) != 0)
@@ -35,8 +86,8 @@ class InputHandler
35
86
 
36
87
  # if left button is down, rotate camera
37
88
  if left_pressed
38
- xpos, ypos, zpos = to_3d_coordinates(event.x, event.y)
39
- oxpos, oypos, ozpos = to_3d_coordinates(event.x-event.xrel, event.y-event.yrel)
89
+ xpos, ypos, zpos = RAGE::to_3d_coordinates(event.x, event.y)
90
+ oxpos, oypos, ozpos = RAGE::to_3d_coordinates(event.x-event.xrel, event.y-event.yrel)
40
91
 
41
92
  if xpos > oxpos
42
93
  Game.current_viewport.camera.xrotate += 1
@@ -84,8 +135,10 @@ class InputHandler
84
135
  Game.current_viewport.camera.pos[2] -= 1
85
136
  end
86
137
 
87
- end
138
+ end
88
139
  end
89
- end
140
+ end # class SimpleCameraInputHandler
90
141
 
91
- end
142
+ end # module InputHandlers
143
+
144
+ end # module RAGE
@@ -25,8 +25,8 @@ class Loader
25
25
 
26
26
  return data
27
27
 
28
- rescue URI::InvalidURIError
29
- raise Exceptions::InvalidResourceUri
28
+ #rescue URI::InvalidURIError
29
+ # raise Exceptions::InvalidResourceUri
30
30
  end
31
31
 
32
32
  end # class loader
@@ -14,6 +14,9 @@ class Location
14
14
  # Mesh which to draw at location
15
15
  attr_reader :mesh
16
16
 
17
+ # Text which to draw at location
18
+ attr_reader :text
19
+
17
20
  # TODO lights, other entities to draw at locations
18
21
 
19
22
  # Initialize Location with argument hash, which may include
@@ -21,11 +24,15 @@ class Location
21
24
  # * :y location coordinate
22
25
  # * :z location coordinate
23
26
  # * :mesh resource to draw at location
27
+ # * :text resource to draw at location
24
28
  def initialize(args = {})
29
+ @mesh = @text = nil
30
+
25
31
  @x = args.has_key?(:x) ? args[:x] : 0
26
32
  @y = args.has_key?(:y) ? args[:y] : 0
27
33
  @z = args.has_key?(:z) ? args[:z] : 0
28
34
  @mesh = args[:mesh]
35
+ @text = args[:text]
29
36
  end
30
37
 
31
38
  # Update location w/ args, which may include
@@ -59,7 +66,10 @@ class Location
59
66
  Gl.glTranslatef(x, y, z)
60
67
 
61
68
  # draw mesh
62
- mesh.draw
69
+ mesh.draw unless mesh.nil?
70
+
71
+ # draw text
72
+ text.draw unless text.nil?
63
73
 
64
74
  Gl.glPopMatrix();
65
75
  end
@@ -137,5 +147,6 @@ def to_3d_coordinates(x2, y2)
137
147
  x3, y3, z3 = Glu.gluUnProject x2, y2, depth[0], model_view, projection, viewport
138
148
  return [x3, y3, z3]
139
149
  end
150
+ module_function :to_3d_coordinates
140
151
 
141
152
  end
@@ -44,17 +44,17 @@ class Mesh
44
44
 
45
45
  # FIXME get all transformations (and groups of) under scene
46
46
  @tf = @scene.collision.transform
47
- @translation = @tf.translation.to_a :type => XSDFloat
48
- @scale = @tf.scale.to_a :type => XSDFloat
47
+ @translation = @tf.translation.to_xa :type => XSDFloat
48
+ @scale = @tf.scale.to_xa :type => XSDFloat
49
49
  #diffuse = tf.shape.appearance.material.diffuse_color.split.collect { |c| c.to_f }
50
50
  #specular = tf.shape.appearance.material.specular_color.split.collect { |c| c.to_f }
51
51
  #emissive = tf.shape.appearance.material.emissive_color.split.collect { |c| c.to_f }
52
52
  @coord_index = @tf.shape.indexed_face_set.coord_index.
53
- to_a(:type => String, :delim => ",").
54
- collect { |coords| a = coords.to_a(:type => XSDInteger); a[0...a.size-1]}.flatten # cut off the last -1
53
+ to_xa(:type => String, :delim => ",").
54
+ collect { |coords| a = coords.to_xa(:type => XSDInteger); a[0...a.size-1]}.flatten # cut off the last -1
55
55
  @coord_point = @tf.shape.indexed_face_set.coordinate.point.
56
- to_a(:type => String, :delim => ",").
57
- collect { |coords| coords.to_a :type => XSDFloat }.flatten
56
+ to_xa(:type => String, :delim => ",").
57
+ collect { |coords| coords.to_xa :type => XSDFloat }.flatten
58
58
  end
59
59
 
60
60
  # Create location w/ specified args, associated mesh w/ it and add it to the LocationsManager
@@ -71,6 +71,11 @@ class Mesh
71
71
  return @location
72
72
  end
73
73
 
74
+ # Return current location coordinates associated w/ the mesh
75
+ def coordinates
76
+ [@location.x, @location.y, @location.z]
77
+ end
78
+
74
79
 
75
80
  # Return center point of mesh from mesh translation provided in mesh
76
81
  # and op_translation
@@ -35,6 +35,9 @@ class ResourcesManager
35
35
  uri = args[:uri]
36
36
  data = Loader.load uri
37
37
  resource = Mesh.new(data)
38
+ elsif type == :text
39
+ text = args[:text]
40
+ resource = Text.new(:text => text)
38
41
  elsif type == :color
39
42
  color = args[:color]
40
43
  resource = Color.new(:rgb => color)
@@ -0,0 +1,76 @@
1
+ # Text Resource
2
+ #
3
+ # Copyright (C) 2010 Mohammed Morsi <movitto@yahoo.com>
4
+ # Licensed under the GPLv3+ http://www.gnu.org/licenses/gpl.txt
5
+
6
+ module RAGE
7
+
8
+ # Represents text to draw onscreen.
9
+ # Currently uses SDL_TTF to do so.
10
+ class Text
11
+ attr_accessor :text
12
+
13
+ class_attr :ttf_initialized
14
+
15
+ def initialize(args = {})
16
+ unless defined? @@ttf_initialized
17
+ @@ttf_initialize = true
18
+ SDL::TTF.init
19
+ end
20
+
21
+ @text = args[:text]
22
+ @font = args[:font]
23
+ @font_file = args[:font_file]
24
+ @font_size = args[:font_size]
25
+
26
+ # TODO should make use of a font bank or such so fonts can be shared, also specify default font dirs (and allow more to be added)
27
+ @font = SDL::TTF.open(@font_file, @font_size) if @font.nil? && !@font_file.nil? && !@font_size.nil?
28
+
29
+ # TODO allow specification of many other font attributes
30
+ end
31
+
32
+ # Create location w/ specified args, associated text w/ it and add it to the LocationsManager
33
+ def show_at(args = {})
34
+ # XXX not a huge fan of storing location interally,
35
+ # but this is best way to do this for now
36
+ if ! defined? @location
37
+ args[:text] = self
38
+ @location = Location.new(args)
39
+ LocationsManager.instance.add @location
40
+ else
41
+ @location.update args
42
+ end
43
+ return @location
44
+ end
45
+
46
+ # Return current location coordinates associated w/ the text
47
+ def coordinates
48
+ [@location.x, @location.y, @location.z]
49
+ end
50
+
51
+ # Invoked during draw cycle to draw font
52
+ def draw
53
+ # FIXME allow font color to be set, also perhaps use other render method (solid doesn't seem to work tho)
54
+ surface = @font.render_blended_utf8(@text, 255, 255, 255)
55
+
56
+ texture = Gl::glGenTextures(1)[0]
57
+ Gl::glBindTexture(Gl::GL_TEXTURE_2D, texture);
58
+
59
+ Gl::glTexParameterf(Gl::GL_TEXTURE_2D, Gl::GL_TEXTURE_MIN_FILTER, Gl::GL_LINEAR);
60
+ Gl::glTexParameterf(Gl::GL_TEXTURE_2D, Gl::GL_TEXTURE_MAG_FILTER, Gl::GL_LINEAR);
61
+ Gl::glTexImage2D(Gl::GL_TEXTURE_2D, 0, Gl::GL_RGBA, surface.w, surface.h, 0, Gl::GL_RGBA, Gl::GL_UNSIGNED_BYTE, surface.pixels);
62
+
63
+ Gl::glBegin(Gl::GL_QUADS);
64
+ # FIXME had to switch the order of these as the text seemed backwards, look into this (used to be 00,01,11,10)
65
+ Gl::glTexCoord2d(0, 1); Gl::glVertex3d(*coordinates)
66
+ Gl::glTexCoord2d(1, 1); Gl::glVertex3d(@location.x+surface.w, @location.y, @location.z)
67
+ Gl::glTexCoord2d(1, 0); Gl::glVertex3d(@location.x+surface.w, @location.y+surface.h, @location.z);
68
+ Gl::glTexCoord2d(0, 0); Gl::glVertex3d(@location.x, @location.y+surface.h, @location.z);
69
+ Gl::glEnd();
70
+
71
+ Gl::glDeleteTextures([texture]);
72
+ #SDL.SDL_FreeSurface(surface);
73
+ end
74
+ end
75
+
76
+ end
@@ -14,7 +14,7 @@ class Window
14
14
  # Viewports arrays
15
15
  class_attr :viewports
16
16
 
17
- # Set attributes on window, which may include
17
+ # Set attributes on window, which may include
18
18
  # * :width
19
19
  # * :height
20
20
  def self.set_attrs(args = {})
@@ -35,7 +35,9 @@ class Window
35
35
  def self.show
36
36
  SDL.init(SDL::INIT_VIDEO)
37
37
  SDL.setGLAttr(SDL::GL_DOUBLEBUFFER,1)
38
- @@screen = SDL::Screen.open(width,height,32,SDL::OPENGL)
38
+ # make sdl pickup keys being held as multiple key events (TODO make this optional)
39
+ SDL::Key.enableKeyRepeat(SDL::Key::DEFAULT_REPEAT_DELAY / 2, SDL::Key::DEFAULT_REPEAT_INTERVAL / 2)
40
+ @@screen = SDL::Screen.open(width,height,32,SDL::OPENGL | SDL::SWSURFACE)
39
41
 
40
42
  @@black = ResourcesManager.instance.load_resource :type => :color, :color => [0,0,0]
41
43
  end
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
3
+ <X3D version="3.0" profile="Immersive" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.0.xsd">
4
+ <head>
5
+ <meta name="filename" content="cube.x3d" />
6
+ <meta name="generator" content="Blender 249" />
7
+ <meta name="translator" content="X3D exporter v1.55 (2006/01/17)" />
8
+ </head>
9
+ <Scene>
10
+ <NavigationInfo headlight="FALSE" visibilityLimit="0.0" type='"EXAMINE","ANY"' avatarSize="0.25, 1.75, 0.75" />
11
+ <Background groundColor="0.057 0.221 0.4" skyColor="0.057 0.221 0.4" />
12
+
13
+ <Collision enabled="false">
14
+ <Transform DEF="Cube" translation="0.000000 0.000000 0.000000" scale="9.065643 9.065643 9.065643" rotation="-1.000000 0.000000 0.000000 1.570796">
15
+ <Shape>
16
+ <IndexedFaceSet solid="true" coordIndex="0 1 2 3 -1, 4 7 6 5 -1, 0 4 5 1 -1, 1 5 6 2 -1, 2 6 7 3 -1, 4 0 3 7 -1, ">
17
+ <Coordinate DEF="coord_Cube"
18
+ point="1.000000 1.000000 -1.000000, 1.000000 -1.000000 -1.000000, -1.000000 -1.000000 -1.000000, -1.000000 1.000000 -1.000000, 1.000000 0.999999 1.000000, 0.999999 -1.00000 1.000000, -1.000000 -1.000000 1.000000, -1.000000 1.000000 1.000000, " />
19
+ </IndexedFaceSet>
20
+ </Shape>
21
+ </Transform>
22
+ </Collision>
23
+
24
+
25
+ </Scene>
26
+ </X3D>
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rage
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.1"
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ version: "0.2"
5
10
  platform: ruby
6
11
  authors:
7
12
  - Mohammed Morsi
@@ -9,26 +14,90 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-03-20 00:00:00 -04:00
17
+ date: 2010-09-05 00:00:00 -04:00
13
18
  default_executable:
14
- dependencies: []
15
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 27
29
+ segments:
30
+ - 1
31
+ - 3
32
+ - 0
33
+ version: 1.3.0
34
+ type: :development
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rubysdl
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 9
45
+ segments:
46
+ - 2
47
+ - 1
48
+ - 1
49
+ version: 2.1.1
50
+ type: :runtime
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: ruby-opengl
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 237
61
+ segments:
62
+ - 0
63
+ - 60
64
+ - 1
65
+ version: 0.60.1
66
+ type: :runtime
67
+ version_requirements: *id003
68
+ - !ruby/object:Gem::Dependency
69
+ name: rxsd
70
+ prerelease: false
71
+ requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ hash: 13
77
+ segments:
78
+ - 0
79
+ - 4
80
+ - 1
81
+ version: 0.4.1
82
+ type: :runtime
83
+ version_requirements: *id004
16
84
  description: The Ruby Advanced Gaming Engine
17
85
  email: movitto@yahoo.com
18
- executables: []
19
-
86
+ executables:
87
+ - rage-mesh-viewer
20
88
  extensions: []
21
89
 
22
90
  extra_rdoc_files: []
23
91
 
24
92
  files:
25
- - bin/mesh-viewer.rb
26
93
  - lib/rage/color.rb
94
+ - lib/rage/text.rb
27
95
  - lib/rage/resource.rb
28
96
  - lib/rage/input.rb
29
97
  - lib/rage/dsl.rb
30
98
  - lib/rage/viewport.rb
31
99
  - lib/rage/window.rb
100
+ - lib/rage/audio.rb
32
101
  - lib/rage/location.rb
33
102
  - lib/rage/common.rb
34
103
  - lib/rage/camera.rb
@@ -43,6 +112,8 @@ files:
43
112
  - spec/spec_helper.rb
44
113
  - spec/location_spec.rb
45
114
  - spec/mesh_spec.rb
115
+ - spec/content/cube.x3d
116
+ - bin/rage-mesh-viewer
46
117
  has_rdoc: true
47
118
  homepage: http://morsi.org/projects/RAGE
48
119
  licenses: []
@@ -53,21 +124,31 @@ rdoc_options: []
53
124
  require_paths:
54
125
  - lib
55
126
  required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
56
128
  requirements:
57
129
  - - ">="
58
130
  - !ruby/object:Gem::Version
131
+ hash: 53
132
+ segments:
133
+ - 1
134
+ - 8
135
+ - 1
59
136
  version: 1.8.1
60
- version:
61
137
  required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
62
139
  requirements:
63
140
  - - ">="
64
141
  - !ruby/object:Gem::Version
142
+ hash: 29
143
+ segments:
144
+ - 1
145
+ - 3
146
+ - 3
65
147
  version: 1.3.3
66
- version:
67
148
  requirements: []
68
149
 
69
150
  rubyforge_project:
70
- rubygems_version: 1.3.5
151
+ rubygems_version: 1.3.7
71
152
  signing_key:
72
153
  specification_version: 3
73
154
  summary: The Ruby Advanced Gaming Engine