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 +8 -3
- data/bin/{mesh-viewer.rb → rage-mesh-viewer} +1 -1
- data/lib/rage.rb +2 -0
- data/lib/rage/audio.rb +53 -0
- data/lib/rage/camera.rb +1 -1
- data/lib/rage/dsl.rb +22 -8
- data/lib/rage/game.rb +2 -0
- data/lib/rage/input.rb +63 -10
- data/lib/rage/loader.rb +2 -2
- data/lib/rage/location.rb +12 -1
- data/lib/rage/mesh.rb +11 -6
- data/lib/rage/resource.rb +3 -0
- data/lib/rage/text.rb +76 -0
- data/lib/rage/window.rb +4 -2
- data/spec/content/cube.x3d +26 -0
- metadata +91 -10
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ require 'rake/gempackagetask'
|
|
9
9
|
|
10
10
|
|
11
11
|
GEM_NAME="rage"
|
12
|
-
PKG_VERSION='0.
|
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['
|
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-
|
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}
|
data/lib/rage.rb
CHANGED
@@ -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'
|
data/lib/rage/audio.rb
ADDED
@@ -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
|
data/lib/rage/camera.rb
CHANGED
data/lib/rage/dsl.rb
CHANGED
@@ -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
|
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
|
data/lib/rage/game.rb
CHANGED
data/lib/rage/input.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/rage/loader.rb
CHANGED
data/lib/rage/location.rb
CHANGED
@@ -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
|
data/lib/rage/mesh.rb
CHANGED
@@ -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.
|
48
|
-
@scale = @tf.scale.
|
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
|
-
|
54
|
-
collect { |coords| a = coords.
|
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
|
-
|
57
|
-
collect { |coords| coords.
|
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
|
data/lib/rage/resource.rb
CHANGED
@@ -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)
|
data/lib/rage/text.rb
ADDED
@@ -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
|
data/lib/rage/window.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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-
|
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.
|
151
|
+
rubygems_version: 1.3.7
|
71
152
|
signing_key:
|
72
153
|
specification_version: 3
|
73
154
|
summary: The Ruby Advanced Gaming Engine
|