rage 0.1
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/COPYING +8 -0
- data/LICENSE +674 -0
- data/README.rdoc +48 -0
- data/Rakefile +46 -0
- data/bin/mesh-viewer.rb +91 -0
- data/lib/rage.rb +30 -0
- data/lib/rage/camera.rb +59 -0
- data/lib/rage/color.rb +18 -0
- data/lib/rage/common.rb +52 -0
- data/lib/rage/dsl.rb +36 -0
- data/lib/rage/game.rb +64 -0
- data/lib/rage/input.rb +91 -0
- data/lib/rage/loader.rb +33 -0
- data/lib/rage/location.rb +141 -0
- data/lib/rage/mesh.rb +147 -0
- data/lib/rage/resource.rb +49 -0
- data/lib/rage/viewport.rb +50 -0
- data/lib/rage/window.rb +58 -0
- data/spec/location_spec.rb +112 -0
- data/spec/mesh_spec.rb +84 -0
- data/spec/spec_helper.rb +13 -0
- metadata +75 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
# Viewport constructs and methods
|
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
|
+
# Viewport is the end user's view into the world. It is represented on
|
9
|
+
# the screen via glViewport and has a camera attached to it managing
|
10
|
+
# the viewport's projection matrix.
|
11
|
+
class Viewport
|
12
|
+
|
13
|
+
# x,y pos, width, height
|
14
|
+
attr_accessor :x, :y, :width, :height
|
15
|
+
|
16
|
+
# Camera attached to viewport
|
17
|
+
attr_accessor :camera
|
18
|
+
|
19
|
+
# Create new Viewport with any of the following optional args,
|
20
|
+
# * :x x coordinate of viewport on screen, defaults to 0
|
21
|
+
# * :y y coordinate of viewport on screen, defaults to 0
|
22
|
+
# * :width width of viewport on screen or :max, defaults to :max
|
23
|
+
# * :height height of viewport on screen or :max, defaults to :max
|
24
|
+
# * :camera camera to attach to viewport, if none provided one is auto created
|
25
|
+
def initialize(args = {})
|
26
|
+
@x = args[:x] if args.has_key? :x
|
27
|
+
@y = args[:y] if args.has_key? :y
|
28
|
+
@width = args[:width] if args.has_key? :width
|
29
|
+
@height = args[:height] if args.has_key? :height
|
30
|
+
@camera = args[:camera] if args.has_key? :camera
|
31
|
+
|
32
|
+
@x = 0 if @x.nil?
|
33
|
+
@y = 0 if @y.nil?
|
34
|
+
@width = :max if @width.nil?
|
35
|
+
@height = :max if @height.nil?
|
36
|
+
@camera = Camera.new if @camera.nil?
|
37
|
+
end
|
38
|
+
|
39
|
+
# Invoked during draw cycle to draw viewport and associated camera
|
40
|
+
def draw
|
41
|
+
w = @width == :max ? Window.width : @width
|
42
|
+
h = @height == :max ? Window.height : @height
|
43
|
+
|
44
|
+
Gl.glViewport(@x,@y, w, h)
|
45
|
+
@camera.draw
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/lib/rage/window.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# Window constructs and methods
|
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
|
+
# Manages game window
|
9
|
+
class Window
|
10
|
+
|
11
|
+
# Screen width / height, and handle
|
12
|
+
class_attr :width, :height, :screen
|
13
|
+
|
14
|
+
# Viewports arrays
|
15
|
+
class_attr :viewports
|
16
|
+
|
17
|
+
# Set attributes on window, which may include
|
18
|
+
# * :width
|
19
|
+
# * :height
|
20
|
+
def self.set_attrs(args = {})
|
21
|
+
@@width = args[:width] if args.has_key? :width
|
22
|
+
@@height = args[:height] if args.has_key? :height
|
23
|
+
|
24
|
+
@@viewports = []
|
25
|
+
end
|
26
|
+
|
27
|
+
# Create a viewport using specified args and add it to
|
28
|
+
def self.create_viewport(vp_args = {}, &block)
|
29
|
+
vp = viewport vp_args, &block
|
30
|
+
viewports << vp
|
31
|
+
return vp
|
32
|
+
end
|
33
|
+
|
34
|
+
# Display window
|
35
|
+
def self.show
|
36
|
+
SDL.init(SDL::INIT_VIDEO)
|
37
|
+
SDL.setGLAttr(SDL::GL_DOUBLEBUFFER,1)
|
38
|
+
@@screen = SDL::Screen.open(width,height,32,SDL::OPENGL)
|
39
|
+
|
40
|
+
@@black = ResourcesManager.instance.load_resource :type => :color, :color => [0,0,0]
|
41
|
+
end
|
42
|
+
|
43
|
+
# Invoked during draw cycle to draw window
|
44
|
+
def self.draw
|
45
|
+
Gl.glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT)
|
46
|
+
@@screen.fill_rect(0,0,width,height,@@black.color)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Invoked during draw cycle to refresh window
|
50
|
+
def self.refresh
|
51
|
+
@@screen.update_rect(0,0,0,0)
|
52
|
+
SDL.GLSwapBuffers()
|
53
|
+
#Gl.glFlush();
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# location module tests
|
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 File.dirname(__FILE__) + '/spec_helper'
|
7
|
+
|
8
|
+
describe Location do
|
9
|
+
|
10
|
+
it "should default to origin coordinates" do
|
11
|
+
loc = Location.new
|
12
|
+
loc.x.should == 0
|
13
|
+
loc.y.should == 0
|
14
|
+
loc.z.should == 0
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should accept and set location parameters" do
|
18
|
+
mesh = MockMesh.new
|
19
|
+
loc = Location.new :x => 1, :y => 2, :z => -5.32, :mesh => mesh
|
20
|
+
loc.x.should == 1
|
21
|
+
loc.y.should == 2
|
22
|
+
loc.z.should == -5.32
|
23
|
+
loc.mesh.should == mesh
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should return location boundaries" do
|
27
|
+
loc = Location.new :x => 3.14, :y => 1.59, :z => 17
|
28
|
+
loc.boundaries.should == [3.14, 1.59, 17, 3.14, 1.59, 17]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should return mesh boundaries" do
|
32
|
+
mesh = MockMesh.new
|
33
|
+
mesh.boundaries = [10, 20, -30, 44.2, -11.11, -0.93]
|
34
|
+
loc = Location.new :mesh => mesh, :x => 12.9, :y => -49, :z => 20.2462
|
35
|
+
boundaries = loc.boundaries
|
36
|
+
boundaries[0].should == 12.9 + 10
|
37
|
+
boundaries[1].should == -49 + 20
|
38
|
+
boundaries[2].should == 20.2462 + -30
|
39
|
+
boundaries[3].should == 12.9 + 44.2
|
40
|
+
boundaries[4].should == -49 + -11.11
|
41
|
+
boundaries[5].should == 20.2462 + -0.93
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
it "should draw associated mesh" do
|
46
|
+
mesh = MockMesh.new
|
47
|
+
loc = Location.new :mesh => mesh
|
48
|
+
loc.draw
|
49
|
+
mesh.draw_called.should be_true
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe LocationsManager do
|
55
|
+
|
56
|
+
it "should clear locations" do
|
57
|
+
LocationsManager.instance.clear
|
58
|
+
LocationsManager.instance.locations.size.should == 0
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should manage locations" do
|
62
|
+
loc = Location.new
|
63
|
+
LocationsManager.instance.clear
|
64
|
+
LocationsManager.instance.add loc
|
65
|
+
LocationsManager.instance.locations.size.should == 1
|
66
|
+
LocationsManager.instance.locations.include?(loc).should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should return boundaries of managed coordinate system" do
|
70
|
+
loc1 = Location.new :x => 10, :y => 10, :z => 10
|
71
|
+
loc2 = Location.new :x => -10, :y => -10, :z => -10
|
72
|
+
loc3 = Location.new :x => 5, :y => 5, :z => 5
|
73
|
+
loc4 = Location.new :x => 10, :y => 25, :z => -5
|
74
|
+
|
75
|
+
LocationsManager.instance.clear
|
76
|
+
LocationsManager.instance.add loc1
|
77
|
+
LocationsManager.instance.add loc2
|
78
|
+
LocationsManager.instance.add loc3
|
79
|
+
LocationsManager.instance.add loc4
|
80
|
+
|
81
|
+
xmax, ymax, zmax, xmin, ymin, zmin = LocationsManager.instance.boundaries
|
82
|
+
xmax.should == 10
|
83
|
+
ymax.should == 25
|
84
|
+
zmax.should == 10
|
85
|
+
xmin.should == -10
|
86
|
+
ymin.should == -10
|
87
|
+
zmin.should == -10
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should return average center" do
|
91
|
+
# TODO LocationsManager average center test
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should return mean center" do
|
95
|
+
# TODO LocationsManager mean center test
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
class MockMesh
|
101
|
+
attr_accessor :draw_called
|
102
|
+
attr_accessor :location
|
103
|
+
attr_accessor :boundaries
|
104
|
+
|
105
|
+
def initialize
|
106
|
+
@draw_called = false
|
107
|
+
end
|
108
|
+
|
109
|
+
def draw
|
110
|
+
@draw_called = true
|
111
|
+
end
|
112
|
+
end
|
data/spec/mesh_spec.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# mesh module tests
|
2
|
+
#
|
3
|
+
# Copyright (C) 2010 Mohammed Morsi <movitto@yahoo.com>
|
4
|
+
# Licensed under the GPLv3+ http://www.gnu.org/licenses/gpl.txt
|
5
|
+
|
6
|
+
dir = File.expand_path(File.dirname(__FILE__))
|
7
|
+
require dir + '/spec_helper'
|
8
|
+
|
9
|
+
describe Mesh do
|
10
|
+
before(:each) do
|
11
|
+
@test_x3d = Loader.load "file://#{dir}/content/cube.x3d"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should parse x3d xsd and data" do
|
15
|
+
mesh = Mesh.new @test_x3d
|
16
|
+
Mesh.x3d_schema.should_not be_nil
|
17
|
+
Mesh.x3d_schema_classes.include?(X3D).should be_true
|
18
|
+
|
19
|
+
mesh.instance_variable_get(:@scene).should_not be_nil
|
20
|
+
mesh.instance_variable_get(:@tf).should_not be_nil
|
21
|
+
mesh.instance_variable_get(:@translation).should_not be_nil
|
22
|
+
mesh.instance_variable_get(:@translation).should == [0, 0, 0]
|
23
|
+
mesh.instance_variable_get(:@scale).should_not be_nil
|
24
|
+
mesh.instance_variable_get(:@scale).should == [9.065643, 9.065643, 9.065643]
|
25
|
+
mesh.instance_variable_get(:@coord_index).should_not be_nil
|
26
|
+
mesh.instance_variable_get(:@coord_index).size.should == 24
|
27
|
+
mesh.instance_variable_get(:@coord_index)[0...4].should == [0, 1, 2, 3]
|
28
|
+
mesh.instance_variable_get(:@coord_point).should_not be_nil
|
29
|
+
mesh.instance_variable_get(:@coord_point).size.should == 24
|
30
|
+
mesh.instance_variable_get(:@coord_point)[0...3].should == [1, 1, -1]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be associated with location when shown" do
|
34
|
+
mesh = Mesh.new @test_x3d
|
35
|
+
LocationsManager.instance.clear
|
36
|
+
location = mesh.show_at :x => 100, :y => 100, :z => -500
|
37
|
+
location.should_not be_nil
|
38
|
+
location.x.should == 100
|
39
|
+
location.y.should == 100
|
40
|
+
location.z.should == -500
|
41
|
+
LocationsManager.instance.locations.size.should == 1
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should allow updates to associated location" do
|
45
|
+
mesh = Mesh.new @test_x3d
|
46
|
+
LocationsManager.instance.clear
|
47
|
+
mesh.show_at :x => 100, :y => 100, :z => -500
|
48
|
+
location = mesh.show_at :x => 200
|
49
|
+
location.x.should == 200
|
50
|
+
location.y.should == 100
|
51
|
+
location.z.should == -500
|
52
|
+
LocationsManager.instance.locations.size.should == 1
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should return absolute center" do
|
56
|
+
mesh = Mesh.new @test_x3d
|
57
|
+
mesh.op_translation = [10, 20, 30]
|
58
|
+
mesh.instance_variable_set(:@translation, [10, 20, 30])
|
59
|
+
|
60
|
+
center = mesh.center
|
61
|
+
center[0].should == 10 * 2
|
62
|
+
center[1].should == 20 * 2
|
63
|
+
center[2].should == 30 * 2
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should return total scale" do
|
67
|
+
mesh = Mesh.new @test_x3d
|
68
|
+
mesh.op_scale = [10, 20, 30]
|
69
|
+
mesh.instance_variable_set(:@scale, [10, 20, 30])
|
70
|
+
|
71
|
+
scale = mesh.scale
|
72
|
+
scale[0].should == 10 * 10
|
73
|
+
scale[1].should == 20 * 20
|
74
|
+
scale[2].should == 30 * 30
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should return boundaries" do
|
78
|
+
mesh = Mesh.new @test_x3d
|
79
|
+
boundaries = mesh.boundaries
|
80
|
+
boundaries[0...3].should == [1,1,1]
|
81
|
+
boundaries[3...6].should == [-1,-1,-1]
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# rage project spec helper
|
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 'rubygems'
|
7
|
+
require 'spec'
|
8
|
+
|
9
|
+
CURRENT_DIR=File.dirname(__FILE__)
|
10
|
+
$: << File.expand_path(CURRENT_DIR + "/../lib")
|
11
|
+
|
12
|
+
require 'rage'
|
13
|
+
include RAGE
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mohammed Morsi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-03-20 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: The Ruby Advanced Gaming Engine
|
17
|
+
email: movitto@yahoo.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- bin/mesh-viewer.rb
|
26
|
+
- lib/rage/color.rb
|
27
|
+
- lib/rage/resource.rb
|
28
|
+
- lib/rage/input.rb
|
29
|
+
- lib/rage/dsl.rb
|
30
|
+
- lib/rage/viewport.rb
|
31
|
+
- lib/rage/window.rb
|
32
|
+
- lib/rage/location.rb
|
33
|
+
- lib/rage/common.rb
|
34
|
+
- lib/rage/camera.rb
|
35
|
+
- lib/rage/loader.rb
|
36
|
+
- lib/rage/game.rb
|
37
|
+
- lib/rage/mesh.rb
|
38
|
+
- lib/rage.rb
|
39
|
+
- COPYING
|
40
|
+
- LICENSE
|
41
|
+
- Rakefile
|
42
|
+
- README.rdoc
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
- spec/location_spec.rb
|
45
|
+
- spec/mesh_spec.rb
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://morsi.org/projects/RAGE
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options: []
|
52
|
+
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 1.8.1
|
60
|
+
version:
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.3.3
|
66
|
+
version:
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
rubyforge_project:
|
70
|
+
rubygems_version: 1.3.5
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: The Ruby Advanced Gaming Engine
|
74
|
+
test_files: []
|
75
|
+
|