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