rage 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
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