shattered 0.5.0.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. data/History.txt +6 -0
  2. data/INSTALL.txt +5 -0
  3. data/License.txt +18 -0
  4. data/Manifest.txt +175 -0
  5. data/README.txt +39 -0
  6. data/Rakefile +6 -0
  7. data/app_generators/actor/USAGE +6 -0
  8. data/app_generators/actor/actor_generator.rb +51 -0
  9. data/app_generators/actor/templates/actor.rb +4 -0
  10. data/app_generators/actor/templates/spec.rb +11 -0
  11. data/app_generators/actor/templates/unit_test.rb +9 -0
  12. data/app_generators/commands/console.rb +6 -0
  13. data/{lib/rails_generator/generators/applications/shattered_app → app_generators/shattered}/USAGE +1 -1
  14. data/app_generators/shattered/shattered_generator.rb +67 -0
  15. data/{lib → app_generators/shattered}/templates/Rakefile +4 -4
  16. data/app_generators/shattered/templates/configs/game.controls +16 -0
  17. data/app_generators/shattered/templates/configs/ogre_plugins.linux.cfg +12 -0
  18. data/app_generators/shattered/templates/configs/ogre_plugins.osx.cfg +12 -0
  19. data/{lib → app_generators/shattered}/templates/configs/ogre_plugins.windows.cfg +2 -2
  20. data/app_generators/shattered/templates/game.rb +50 -0
  21. data/{lib → app_generators/shattered}/templates/media/basic.rmaterial +0 -0
  22. data/app_generators/shattered/templates/spec/game_spec.rb +5 -0
  23. data/app_generators/shattered/templates/spec/spec_helper.rb +12 -0
  24. data/bin/shattered +39 -0
  25. data/config/hoe.rb +77 -0
  26. data/config/requirements.rb +15 -0
  27. data/lib/shattered.rb +40 -0
  28. data/lib/shattered_game/actor.rb +6 -0
  29. data/lib/shattered_game/game.rb +285 -0
  30. data/lib/{tasks → shattered_game/rake_tasks}/framework.rake +19 -24
  31. data/lib/{tasks → shattered_game/rake_tasks}/log.rake +0 -0
  32. data/lib/{tasks → shattered_game/rake_tasks}/misc.rake +1 -2
  33. data/lib/{tasks → shattered_game/rake_tasks}/pre_namespace_aliases.rake +0 -0
  34. data/lib/{tasks → shattered_game/rake_tasks}/shattered.rb +0 -0
  35. data/lib/shattered_game/rake_tasks/spec.rake +9 -0
  36. data/lib/{tasks → shattered_game/rake_tasks}/statistics.rake +0 -0
  37. data/lib/shattered_game/required.rb +2 -0
  38. data/lib/shattered_game/version.rb +9 -0
  39. data/lib/shattered_model/controls.rb +67 -0
  40. data/lib/shattered_model/input.rb +171 -0
  41. data/lib/shattered_model/key_converter.rb +44 -0
  42. data/lib/shattered_model/required.rb +4 -0
  43. data/lib/shattered_model/shattered_model.rb +28 -0
  44. data/lib/shattered_model/timed_event.rb +120 -0
  45. data/lib/shattered_model/timer.rb +78 -0
  46. data/lib/shattered_support/core_ext.rb +1 -0
  47. data/lib/shattered_support/core_ext/class.rb +3 -0
  48. data/lib/shattered_support/core_ext/class/attribute_accessors.rb +44 -0
  49. data/lib/shattered_support/core_ext/class/inheritable_attributes.rb +115 -0
  50. data/lib/shattered_support/core_ext/class/removal.rb +24 -0
  51. data/lib/shattered_support/core_ext/dir.rb +5 -0
  52. data/lib/shattered_support/core_ext/dir/search.rb +25 -0
  53. data/lib/shattered_support/core_ext/file.rb +5 -0
  54. data/lib/shattered_support/core_ext/file/search.rb +64 -0
  55. data/lib/shattered_support/core_ext/numeric.rb +5 -0
  56. data/lib/shattered_support/core_ext/numeric/time.rb +72 -0
  57. data/lib/shattered_support/core_ext/string.rb +13 -0
  58. data/lib/shattered_support/core_ext/string/access.rb +58 -0
  59. data/lib/shattered_support/core_ext/string/conversions.rb +19 -0
  60. data/lib/shattered_support/core_ext/string/inflections.rb +64 -0
  61. data/lib/shattered_support/core_ext/string/iterators.rb +17 -0
  62. data/lib/shattered_support/core_ext/string/starts_ends_with.rb +20 -0
  63. data/lib/shattered_support/error.rb +12 -0
  64. data/lib/shattered_support/inflections.rb +53 -0
  65. data/lib/shattered_support/inflector.rb +178 -0
  66. data/lib/shattered_support/pre_initialize.rb +153 -0
  67. data/lib/shattered_support/required.rb +9 -0
  68. data/lib/shattered_support/unload.rb +18 -0
  69. data/lib/shattered_view/camera.rb +7 -0
  70. data/lib/shattered_view/ogrerb/base.rb +28 -0
  71. data/lib/shattered_view/ogrerb/camera.rb +14 -0
  72. data/lib/shattered_view/ogrerb/key_manager.rb +54 -0
  73. data/lib/shattered_view/ogrerb/light.rb +25 -0
  74. data/lib/shattered_view/ogrerb/material.rb +5 -0
  75. data/lib/shattered_view/ogrerb/mesh_instance.rb +85 -0
  76. data/lib/shattered_view/ogrerb/mouse_manager.rb +109 -0
  77. data/lib/shattered_view/ogrerb/particle_system.rb +24 -0
  78. data/lib/shattered_view/ogrerb/rgb.rb +6 -0
  79. data/lib/shattered_view/ogrerb/rmaterial.rb +87 -0
  80. data/lib/shattered_view/ogrerb/scene_node.rb +76 -0
  81. data/lib/shattered_view/ogrerb/vector.rb +243 -0
  82. data/lib/shattered_view/ogrerb/window_event.rb +14 -0
  83. data/lib/shattered_view/resources.rb +64 -0
  84. data/lib/shattered_view/shattered_view.rb +248 -0
  85. data/script/destroy +14 -0
  86. data/script/generate +14 -0
  87. data/setup.rb +1585 -0
  88. data/tasks/deployment.rake +30 -0
  89. data/tasks/environment.rake +7 -0
  90. data/tasks/rcov.rake +7 -0
  91. data/tasks/testing.rake +46 -0
  92. data/tasks/website.rake +15 -0
  93. data/test/acceptance/Rakefile +10 -0
  94. data/test/acceptance/config/game.controls +17 -0
  95. data/test/acceptance/config/ogre_plugins.linux.cfg +12 -0
  96. data/test/acceptance/config/ogre_plugins.osx.cfg +12 -0
  97. data/test/acceptance/config/ogre_plugins.windows.cfg +14 -0
  98. data/test/acceptance/config/ogrerb_defaults.save +8 -0
  99. data/test/acceptance/game.rb +120 -0
  100. data/test/acceptance/lib/acceptance_test.rb +20 -0
  101. data/test/acceptance/lib/console.rb +54 -0
  102. data/test/acceptance/lib/input_test.rb +8 -0
  103. data/test/acceptance/lib/label.rb +30 -0
  104. data/test/acceptance/lib/light_test.rb +60 -0
  105. data/test/acceptance/lib/mesh_test.rb +69 -0
  106. data/test/acceptance/lib/particle_test.rb +9 -0
  107. data/test/acceptance/media/GreenSkin.jpg +0 -0
  108. data/test/acceptance/media/Ogre.material +86 -0
  109. data/test/acceptance/media/WeirdEye.png +0 -0
  110. data/test/acceptance/media/basic.rmaterial +18 -0
  111. data/test/acceptance/media/console.fontdef +7 -0
  112. data/test/acceptance/media/console.material +13 -0
  113. data/test/acceptance/media/console.png +0 -0
  114. data/test/acceptance/media/console.ttf +0 -0
  115. data/test/acceptance/media/dirt01.png +0 -0
  116. data/test/acceptance/media/fountain.material +19 -0
  117. data/test/acceptance/media/fountain.particle +40 -0
  118. data/test/acceptance/media/fountain.png +0 -0
  119. data/test/acceptance/media/fountaincolors.png +0 -0
  120. data/test/acceptance/media/ogre.mesh +0 -0
  121. data/test/acceptance/media/spheremap.png +0 -0
  122. data/test/acceptance/media/win.png +0 -0
  123. data/test/acceptance/spec/spec_helper.rb +7 -0
  124. data/test/integration/actor_generator_test.rb +43 -0
  125. data/test/integration/shattered_generator_test.rb +43 -0
  126. data/test/integration/test_helper.rb +20 -0
  127. data/test/ogre_test_defaults.save +8 -0
  128. data/test/ogre_test_plugins.linux.cfg +12 -0
  129. data/test/ogre_test_plugins.osx.cfg +12 -0
  130. data/test/ogre_test_plugins.windows.cfg +14 -0
  131. data/test/test_helper.rb +109 -0
  132. data/test/unit/shattered_game/actor_test.rb +9 -0
  133. data/test/unit/shattered_game/game_test.rb +49 -0
  134. data/test/unit/shattered_game/runner_test.rb +56 -0
  135. data/test/unit/shattered_model/controls/mouse.controls +4 -0
  136. data/test/unit/shattered_model/controls/player.controls +4 -0
  137. data/test/unit/shattered_model/controls/too_many_delims.controls +1 -0
  138. data/test/unit/shattered_model/key_controls_test.rb +89 -0
  139. data/test/unit/shattered_model/key_converter_test.rb +37 -0
  140. data/test/unit/shattered_model/keyboard_input_test.rb +32 -0
  141. data/test/unit/shattered_model/mouse_controls_test.rb +50 -0
  142. data/test/unit/shattered_model/mouse_input_test.rb +61 -0
  143. data/test/unit/shattered_model/shattered_model_test.rb +117 -0
  144. data/test/unit/shattered_model/timed_event_test.rb +79 -0
  145. data/test/unit/shattered_model/timer_test.rb +325 -0
  146. data/{lib/rails_generator/generators/components/actor/templates/actor.rb → test/unit/shattered_support/directory_test/file.test} +0 -0
  147. data/test/unit/shattered_support/numeric_ext_test.rb +38 -0
  148. data/test/unit/shattered_support/pre_initialize_test.rb +63 -0
  149. data/test/unit/shattered_support/shattered_support_test.rb +39 -0
  150. data/test/unit/shattered_support/unload_test.rb +17 -0
  151. data/test/unit/shattered_view/light_test.rb +38 -0
  152. data/test/unit/shattered_view/material_test.rb +41 -0
  153. data/test/unit/shattered_view/media_test/basic.rmaterial +18 -0
  154. data/{lib/templates/configs/empty.log → test/unit/shattered_view/media_test/beltch.ogg} +0 -0
  155. data/test/unit/shattered_view/media_test/test.mesh +0 -0
  156. data/test/unit/shattered_view/mesh_test.rb +59 -0
  157. data/test/unit/shattered_view/node_test.rb +11 -0
  158. data/test/unit/shattered_view/ogrerb/camera_test.rb +12 -0
  159. data/test/unit/shattered_view/ogrerb/key_manager_test.rb +42 -0
  160. data/test/unit/shattered_view/ogrerb/media/basic.rmaterial +18 -0
  161. data/test/unit/shattered_view/ogrerb/media/test.mesh +0 -0
  162. data/test/unit/shattered_view/ogrerb/media/test.rmaterial +1 -0
  163. data/test/unit/shattered_view/ogrerb/mesh_instance_test.rb +74 -0
  164. data/test/unit/shattered_view/ogrerb/mouse_manager_test.rb +104 -0
  165. data/test/unit/shattered_view/ogrerb/ogrerb.log +51 -0
  166. data/test/unit/shattered_view/ogrerb/resolve_ogrerb_test.rb +13 -0
  167. data/test/unit/shattered_view/ogrerb/rgb_test.rb +10 -0
  168. data/test/unit/shattered_view/ogrerb/rmaterial_test.rb +28 -0
  169. data/test/unit/shattered_view/ogrerb/scene_type_test.rb +12 -0
  170. data/test/unit/shattered_view/ogrerb/vector_test.rb +206 -0
  171. data/test/unit/shattered_view/particle_test.rb +23 -0
  172. data/test/unit/shattered_view/resources_test.rb +45 -0
  173. data/test/unit/shattered_view/test_helper.rb +1 -0
  174. data/test/unit/shattered_view/window_event_test.rb +19 -0
  175. data/test/unit/test_helper.rb +1 -0
  176. metadata +205 -121
  177. data/bin/console +0 -4
  178. data/bin/destroy +0 -9
  179. data/bin/generate +0 -7
  180. data/bin/runner +0 -9
  181. data/bin/shatter +0 -22
  182. data/lib/commands/console.rb +0 -23
  183. data/lib/game_loader.rb +0 -118
  184. data/lib/rails_generator.rb +0 -43
  185. data/lib/rails_generator/base.rb +0 -203
  186. data/lib/rails_generator/commands.rb +0 -519
  187. data/lib/rails_generator/generators/applications/shattered_app/shattered_app_generator.rb +0 -103
  188. data/lib/rails_generator/generators/components/actor/actor_generator.rb +0 -22
  189. data/lib/rails_generator/generators/components/model/USAGE +0 -17
  190. data/lib/rails_generator/generators/components/model/model_generator.rb +0 -22
  191. data/lib/rails_generator/generators/components/model/templates/fixtures.yml +0 -5
  192. data/lib/rails_generator/generators/components/model/templates/model.rb +0 -2
  193. data/lib/rails_generator/generators/components/model/templates/unit_test.rb +0 -11
  194. data/lib/rails_generator/generators/components/state/USAGE +0 -30
  195. data/lib/rails_generator/generators/components/state/state_generator.rb +0 -19
  196. data/lib/rails_generator/generators/components/state/templates/state.rb +0 -20
  197. data/lib/rails_generator/generators/components/view/USAGE +0 -30
  198. data/lib/rails_generator/generators/components/view/templates/material +0 -4
  199. data/lib/rails_generator/generators/components/view/templates/view.rb +0 -7
  200. data/lib/rails_generator/generators/components/view/view_generator.rb +0 -28
  201. data/lib/rails_generator/lookup.rb +0 -209
  202. data/lib/rails_generator/manifest.rb +0 -53
  203. data/lib/rails_generator/options.rb +0 -143
  204. data/lib/rails_generator/scripts.rb +0 -83
  205. data/lib/rails_generator/scripts/destroy.rb +0 -7
  206. data/lib/rails_generator/scripts/generate.rb +0 -7
  207. data/lib/rails_generator/scripts/update.rb +0 -12
  208. data/lib/rails_generator/simple_logger.rb +0 -46
  209. data/lib/rails_generator/spec.rb +0 -44
  210. data/lib/shatter.rb +0 -7
  211. data/lib/tasks/documentation.rake +0 -46
  212. data/lib/tasks/testing.rake +0 -102
  213. data/lib/templates/MIT-LICENSE +0 -20
  214. data/lib/templates/README +0 -35
  215. data/lib/templates/configs/boot.rb +0 -35
  216. data/lib/templates/configs/ogre.cfg +0 -4
  217. data/lib/templates/configs/runner.rb +0 -5
  218. data/lib/templates/doc/README_FOR_APP +0 -2
  219. data/lib/templates/environments/environment.rb +0 -10
  220. data/lib/templates/media/default.mesh +0 -0
  221. data/lib/templates/media/default.png +0 -0
  222. data/lib/templates/media/offset_map.rmaterial +0 -117
  223. data/lib/templates/test/test_helper.rb +0 -5
@@ -0,0 +1,16 @@
1
+ # Keymaps are in the form: #{action} => (press/release/hold) :#{button}
2
+ quit => press :escape
3
+
4
+ move(-:z) => hold :w
5
+ move(:z) => hold :s
6
+ move(:left) => hold :a
7
+ move(:right) => hold :d
8
+
9
+ look => mouse.move
10
+
11
+ #alternate controls for dvorak keyboards
12
+ move(-:z) => hold ","
13
+ move(:z) => hold :o
14
+ move(:left) => hold :a
15
+ move(:right) => hold :e
16
+
@@ -0,0 +1,12 @@
1
+ # Defines plugins to load
2
+
3
+ # Define plugin folder, not needed for mac
4
+ PluginFolder=/usr/local/lib/OGRE
5
+
6
+ # Define D3D rendering implementation plugin
7
+ Plugin=RenderSystem_GL
8
+ Plugin=Plugin_ParticleFX
9
+ Plugin=Plugin_BSPSceneManager
10
+ Plugin=Plugin_OctreeSceneManager
11
+ Plugin=Plugin_CgProgramManager
12
+
@@ -0,0 +1,12 @@
1
+ # Defines plugins to load
2
+
3
+ # Define plugin folder, not needed for mac
4
+ #PluginFolder=.
5
+
6
+ # Define D3D rendering implementation plugin
7
+ Plugin=RenderSystem_GL
8
+ Plugin=Plugin_ParticleFX
9
+ Plugin=Plugin_BSPSceneManager
10
+ Plugin=Plugin_OctreeSceneManager
11
+ #Plugin=Plugin_CgProgramManager
12
+
@@ -4,11 +4,11 @@
4
4
  PluginFolder=.
5
5
 
6
6
  # Define D3D rendering implementation plugin
7
- #Plugin=RenderSystem_GL
7
+ Plugin=RenderSystem_GL
8
8
  #Plugin=RenderSystem_Direct3D7
9
9
  Plugin=RenderSystem_Direct3D9
10
10
  Plugin=Plugin_ParticleFX
11
11
  Plugin=Plugin_BSPSceneManager
12
12
  Plugin=Plugin_OctreeSceneManager
13
- #Plugin=Plugin_CgProgramManager
13
+ Plugin=Plugin_CgProgramManager
14
14
 
@@ -0,0 +1,50 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ # Set the SHATTERED_ROOT to the project directory
4
+ SHATTERED_ROOT = File.expand_path(File.dirname(__FILE__))
5
+
6
+ # Require shattered if it is in the vendor directory, otherwise use a gem
7
+ begin
8
+ require 'vendor/shattered/lib/shattered'
9
+ rescue LoadError
10
+ require 'rubygems'
11
+ require 'shattered'
12
+ end
13
+
14
+ # Game is the class that takes care of loading Actors, resources, and handles control flow.
15
+ class Game < Shattered::Game
16
+ title "Insert your game name here"
17
+ # Initialize is called to startup ogrerb and shattered
18
+ def initialize
19
+ super
20
+
21
+ # initialize the controls in config/game.controls. This can also be done by specifying the filename, i.e. controls("game").on
22
+ controls.on
23
+
24
+ # create the initial scene manager, we can choose from: general, terrain, nature, indoor, or nature_paging
25
+ create :scene_manager, :general
26
+ # The camera is accessible through @camera or camera. Must be called after create :scene_manager
27
+ create :camera, :position => v(0,0,0)
28
+ # This has to be called after create_camera
29
+ create :viewport, :color => rgb(0.2,0,0)
30
+
31
+ # The default resource directory. This will recursively load any directories under it as well
32
+ load_resources("media")
33
+
34
+ # Create scene and actors
35
+ end
36
+
37
+ # Basic wasd controls
38
+ def move(direction)
39
+ @speed ||= 30
40
+ @camera.move_relative(time_elapsed * @speed * direction)
41
+ end
42
+
43
+ # Allows the mouse to look around the scene
44
+ def look
45
+ @camera.yaw(Ogre::Radian.new(-@mouse.x*0.01))
46
+ @camera.pitch(Ogre::Radian.new(-@mouse.y*0.01))
47
+ end
48
+ end
49
+
50
+ Game.instance.play if __FILE__ == $0
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__)+"/spec_helper.rb"
2
+
3
+ describe "Game" do
4
+ #Add your specs here
5
+ end
@@ -0,0 +1,12 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ # Lets Game know we're running specs so that it doesn't require user input
10
+ SHATTERED_SPEC = true
11
+
12
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "game"))
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'rubigen'
3
+
4
+ if(%w(-v --version).include?(ARGV.first))
5
+ require File.join(File.dirname(__FILE__),'..','lib','shattered_game','version')
6
+ puts "#{File.basename($0)} #{ShatteredRuby::VERSION::STRING}"
7
+ exit(0)
8
+ end
9
+
10
+ require 'rubigen/scripts/generate'
11
+ errored=false
12
+
13
+ RubiGen::Base.use_application_sources!(:shattered, :actor)
14
+ if(ARGV.length > 0)
15
+ case(ARGV.shift.downcase)
16
+ when "actor"
17
+ RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'actor')
18
+ when "setup"
19
+ RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'shattered')
20
+ when "test"
21
+ load "test/acceptance/game.rb"
22
+ Game.instance.play
23
+ when "console"
24
+ require File.dirname(__FILE__)+"/../app_generators/commands/console.rb"
25
+ else
26
+ errored=true
27
+ end
28
+ else
29
+ errored=true
30
+ end
31
+
32
+ if(errored)
33
+ puts "Usage: shattered <setup/actor/console> <arguments>"
34
+ puts
35
+ puts "setup <name>: Create a basic application structure in the directory <name>"
36
+ puts "actor <name>: Create a templated actor and spec"
37
+ puts "console : Run the irb console in the current directory."
38
+ puts "test : Runs the acceptance tests."
39
+ end
@@ -0,0 +1,77 @@
1
+ require 'shattered_game/version'
2
+
3
+ AUTHOR = ['Martyn Garcia', 'Mikkel Garcia'] # can also be an array of Authors
4
+ EMAIL = "shatteredruby@groups.google.com"
5
+ DESCRIPTION = "Light Weight 3D Game Framework"
6
+ GEM_NAME = 'shattered' # what ppl will type to install your gem
7
+ RUBYFORGE_PROJECT = 'shattered' # The unix name for your project
8
+ HOMEPATH = "http://www.shatteredruby.com"
9
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
+
11
+ if /win32/ === PLATFORM
12
+ @config_file = "./user-config.yml"
13
+ ENV["HOME"] = "/"
14
+ else
15
+ @config_file = "~/.rubyforge/user-config.yml"
16
+ end
17
+
18
+ @config = nil
19
+ RUBYFORGE_USERNAME = "unknown"
20
+ def rubyforge_username
21
+ unless @config
22
+ begin
23
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
24
+ rescue
25
+ puts <<-EOS
26
+ ERROR: No rubyforge config file found: #{@config_file}
27
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
28
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
29
+ EOS
30
+ exit
31
+ end
32
+ end
33
+ RUBYFORGE_USERNAME.replace @config["username"]
34
+ end
35
+
36
+
37
+ REV = nil
38
+ # UNCOMMENT IF REQUIRED:
39
+ # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
40
+ VERS = ShatteredRuby::VERSION::STRING + (REV ? ".#{REV}" : "")
41
+ RDOC_OPTS = ['--quiet', '--title', 'shattered_ruby documentation',
42
+ "--opname", "index.html",
43
+ "--line-numbers",
44
+ "--main", "README",
45
+ "--inline-source"]
46
+
47
+ class Hoe
48
+ def extra_deps
49
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
50
+ @extra_deps
51
+ end
52
+ end
53
+
54
+ # Generate all the Rake tasks
55
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
56
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
57
+ p.author = AUTHOR
58
+ p.description = DESCRIPTION
59
+ p.email = EMAIL
60
+ p.summary = DESCRIPTION
61
+ p.url = HOMEPATH
62
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
63
+ p.test_globs = ["test/**/test_*.rb"]
64
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
65
+
66
+ # == Optional
67
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
68
+ p.extra_deps = [["ogre.rb", ">= 0.3.0"]] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
69
+
70
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
71
+
72
+ end
73
+
74
+ CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
75
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
76
+ hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
77
+ hoe.rsync_args = '-av --delete --ignore-errors'
@@ -0,0 +1,15 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ require 'rubygems'
5
+ %w[rake hoe newgem rubigen rcov].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
@@ -0,0 +1,40 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ #Use ruby's standard Logger package
4
+ require 'logger'
5
+
6
+ #Load OgreRB
7
+ begin
8
+ require File.expand_path(File.join(File.dirname(__FILE__),"..", "vendor", "ogrerb", "ogre"))
9
+ rescue LoadError
10
+ require 'rubygems'
11
+ require 'ogre'
12
+ end
13
+
14
+ # Load Shattered.
15
+ %w(support view model game).each do |package|
16
+ path = File.expand_path("#{File.dirname(__FILE__)}/shattered_#{package}")
17
+ #If there is a required.rb, a specific load script is invoked
18
+ if File.exists?(path + "/required.rb")
19
+ require path + "/required.rb"
20
+ else
21
+ # Load all the ruby files.
22
+ Dir[path+"/**/*.rb"].each do |file|
23
+ require file
24
+ end
25
+ end
26
+ end
27
+
28
+ # Load the plugins
29
+ Dir["#{SHATTERED_ROOT}/vendor/plugins/*/init.rb"].each do |plugin|
30
+ require plugin
31
+ end
32
+
33
+ # Note that the lib directory structure is formatted based on responsibilities:
34
+ # shattered_support - helpers from active_support used everywhere
35
+ # shattered_ogrerb - provides shortcuts and helpers for dealing with Ogre.rb
36
+ # shattered_ruby - provides application startup
37
+ # shattered_[model/view/state] - provides code for dealing with models, views, and states.
38
+ module ShatteredRuby
39
+
40
+ end
@@ -0,0 +1,6 @@
1
+ module Shattered
2
+ class Actor #:nodoc:
3
+ include Model
4
+ include View
5
+ end
6
+ end
@@ -0,0 +1,285 @@
1
+ module Shattered
2
+ class Game #:nodoc:
3
+ include Model
4
+ include View
5
+
6
+ attr_reader :viewport, :camera, :render_window, :root, :log
7
+ attr_accessor :mouse, :keyboard, :keyboard_listener
8
+ attr_accessor :title
9
+
10
+ # Sets up the game's title.
11
+ def self.title(title)
12
+ before_init_call("title=", title)
13
+ end
14
+
15
+ # Sets up the initial render window and initializes Ogre
16
+ def initialize
17
+ @@game_instance = self
18
+ setup_logger(Logger::DEBUG, STDOUT)
19
+ throw Shattered::Error.new("User cancelled") unless setup_ogre
20
+ setup_input unless running_specs?
21
+ #Do this once on startup, since OSX wasn't getting the event.
22
+ update_window_size
23
+ end
24
+
25
+ # Sets all the resources in paths to be loaded as FileSystem General resources
26
+ def load_resources(*paths)
27
+ @media_paths = paths
28
+ # setup our resource paths specified in environment.rb
29
+ Resources.instance.add_resource_paths(*paths)
30
+ Resources.instance.setup
31
+ end
32
+
33
+ #Every time this exits, a game dies.
34
+ def play
35
+ begin
36
+ each_frame do |time_elapsed|
37
+ Ogre::WindowEventUtilities::message_pump
38
+ unless running_specs?
39
+ @keyboard.flush
40
+ @ois_keyboard.capture
41
+ @mouse.process_events @ois_mouse.mouse_state
42
+ @ois_mouse.capture
43
+ end
44
+ Timer::Timer.update(time_elapsed)
45
+ end
46
+ rescue
47
+ error = "Exception:\n\n#{$!}\n"
48
+
49
+ # Let's hide the shit that's related to shattered unless SHATTERED_STACK_TRACE is true
50
+ backtrace = $!.backtrace
51
+ unless(ENV["SHATTERED_STACK_TRACE"])
52
+ backtrace = backtrace.select { |bt| (bt =~ /shattered/).nil? }
53
+ end
54
+ backtrace.each do |details|
55
+ error += " from #{details}\n"
56
+ end
57
+ log.error(error)
58
+ end
59
+ shutdown
60
+ end
61
+
62
+ # Main game loop
63
+ def each_frame
64
+ timer = Ogre::Timer.new
65
+ while !quit? && Ogre::Root::instance.render_one_frame
66
+ return false if @render_window.closed?
67
+ seconds = timer.get_microseconds / 1000000.0
68
+ timer.reset
69
+ yield seconds
70
+ end
71
+ end
72
+
73
+ # Has the user quit? Call Game.quit! to exit the game
74
+ def quit?
75
+ @quit ||= false
76
+ end
77
+
78
+ # Quit the game from the game
79
+ def quit
80
+ @quit = true
81
+ end
82
+
83
+ # Game.scene_manager returns the same scene_manager as Game.instance.scene_manager
84
+ def self.scene_manager
85
+ @@scene_manager
86
+ end
87
+
88
+ # Set the scene_manager...
89
+ def self.scene_manager=(val)
90
+ @@scene_manager = val
91
+ end
92
+
93
+ # Return the current scene_manager
94
+ def scene_manager
95
+ @@scene_manager
96
+ end
97
+
98
+ # Load a logger with a given level and log to a specific file.
99
+ def setup_logger(level, where="#{SHATTERED_ROOT}/log/game.log")
100
+ if(where.is_a?(String))
101
+ @log = Logger.new(open(where, File::WRONLY | File::CREAT))
102
+ else
103
+ @log = Logger.new(where)
104
+ end
105
+ @log.level = level
106
+
107
+ @log.info("Game starting")
108
+ end
109
+
110
+ # Load the root, setup the render window
111
+ def setup_ogre
112
+ plugins = SHATTERED_ROOT + "/config/ogre_plugins.#{Platform.short_name}.cfg"
113
+ log.info("Ogre plugins: '#{plugins}'")
114
+ config_save = SHATTERED_ROOT + "/config/ogrerb_defaults.save"
115
+ log.info("Config saved: '#{config_save}'")
116
+ ogre_log = SHATTERED_ROOT + "/log/ogrerb.log"
117
+ log.info("Ogre's log : '#{ogre_log}")
118
+
119
+ log.debug("Creating Root")
120
+ @root = ShatteredOgre.create_root(plugins, config_save, ogre_log)
121
+ log.debug("Showing config dialog")
122
+
123
+ # Allows us to avoid user input for the spec suite
124
+ if running_specs?
125
+ show_spec_window
126
+ else
127
+ return false if !show_config_dialog
128
+ end
129
+
130
+ log.debug("Creating Render Window")
131
+ @render_window = @root.initialise(true, @title || "No Title")
132
+
133
+ log.debug("Adding WindowEvent Listener")
134
+ @window_event = setup_window_events
135
+
136
+ log.info("Ogre setup successfully.")
137
+ return true
138
+ end
139
+
140
+ # Create a blank window without user input
141
+ def show_spec_window
142
+ unless Platform.mac?
143
+ renderers = @root.get_available_renderers
144
+ @root.set_render_system(renderers[0])
145
+ else
146
+ show_config_dialog
147
+ end
148
+ end
149
+
150
+ # Returns false if we are running the spec suite, true otherwise
151
+ def running_specs?
152
+ begin
153
+ # The specs shouldn't require user input but should still initialize the window
154
+ return true if SHATTERED_SPEC == true
155
+ rescue NameError
156
+ # Specs are not running
157
+ return false
158
+ end
159
+
160
+ end
161
+
162
+ # Sets up the window events resize and close
163
+ def setup_window_events
164
+ log.info "Registering window.resize and window.close listeners"
165
+ event = Ogre::WindowEvents.new @render_window
166
+
167
+ #Resize the window and let OIS know
168
+ event.on_resize do
169
+ update_window_size
170
+ end
171
+
172
+ #This is cleanup once the window is closed
173
+ event.on_close do
174
+ quit
175
+ end
176
+
177
+ return event
178
+ end
179
+
180
+ # Set up the mouse and keyboard
181
+ def setup_input
182
+ log.info "Initializing mouse and keyboard"
183
+ window_handle = render_window.get_custom_attribute_unsigned_long("WINDOW")
184
+ window_options = {"WINDOW" => window_handle.to_s}
185
+
186
+ @input_manager = OIS::InputManager.create_input_system(window_options.merge(input_options))
187
+ @ois_mouse = @input_manager.create_input_object( OIS::OISMouse, buffered_mouse=false)
188
+ @mouse = OIS::MouseManager.new(@ois_mouse)
189
+
190
+ @ois_keyboard = @input_manager.create_input_object(OIS::OISKeyboard, true)
191
+ @keyboard = OIS::KeyManager.new(@ois_keyboard)
192
+ @keyboard_listener = Shattered::Input::Keyboard.new(@keyboard, @mouse)
193
+ end
194
+
195
+ # Overwrite this method to setup how you would like the window to act.
196
+ # DISCL_NONEXCLUSIVE means the mouse and keyboard are not bound to your program.
197
+ def input_options
198
+ { "w32_mouse" => ["DISCL_FOREGROUND", "DISCL_NONEXCLUSIVE"],
199
+ "w32_keyboard" => ["DISCL_FOREGROUND", "DISCL_NONEXCLUSIVE"] }
200
+ end
201
+
202
+ # Overwrite this to create your own config dialog.
203
+ # Return true to keep going, or false to cancel the startup.
204
+ def show_config_dialog
205
+ return @root.show_config_dialog
206
+ end
207
+
208
+ # Creates a viewport based off of the Camera.
209
+ def create_viewport(options)
210
+ log.info "Creating viewport"
211
+ @viewport = render_window.add_viewport(camera)
212
+ @viewport.set_background_colour(options[:color] || rgb(0,0,0))
213
+ end
214
+
215
+ # Creates a scene manager for Ogre to use.
216
+ def create_scene_manager(type)
217
+ log.info "Creating scene manager #{type}"
218
+ root = Ogre::Root.instance
219
+ @@scene_manager = root.create_scene_manager(ShatteredOgre.translate_to_scene_type(type), "#{root.to_s}.scene_manager(#{type})")
220
+ end
221
+
222
+ # Returns the camera used in the state. See ShatteredState::ClassMethods#camera
223
+ def create_camera(options)
224
+ log.info "Creating camera"
225
+ @camera = scene_manager.create_camera(options[:name] || "main")
226
+ @camera.set_near_clip_distance(options[:near_clip] || 1)
227
+ @camera.set_far_clip_distance(options[:far_clip] || 10000)
228
+ @camera.position = options[:position] if options[:position]
229
+ @camera.look_at(options[:look_at]) if options[:look_at]
230
+ end
231
+
232
+ def self.instance
233
+ @@game_instance ||= self.new
234
+ end
235
+
236
+ private
237
+ def shutdown
238
+ log.info "Shutting down"
239
+ # We need to collect all references to Materials, Meshes,
240
+ # Lights, actors, and any other sort of things before we unload Ogre
241
+ unload
242
+ GC.start
243
+
244
+ # Remove Ogre then OIS.
245
+ destroy_ogre
246
+ destroy_ois unless running_specs?
247
+ @@game_instance = nil
248
+ end
249
+
250
+ # Destroy OGRE, ogrerb style.
251
+ def destroy_ogre
252
+ log.info "Destroying ogre"
253
+ scene_manager.clear_scene
254
+ @@scene_manager = nil
255
+ @camera = nil
256
+ @viewport = nil
257
+ end
258
+
259
+ def destroy_ois
260
+ log.info "Destroying input system"
261
+ @input_manager.destroy_input_object(@ois_mouse)
262
+ @input_manager.destroy_input_object(@ois_keyboard)
263
+ #@input_manager.destroy_input_object(@joy_stick) unless @joy_stick.nil?
264
+ OIS::InputManager.destroy_input_system(@input_manager)
265
+ @input_manager = nil
266
+ @ois_keyboard = nil
267
+ @keyboard_listener = nil
268
+ @keyboard = nil
269
+ @mouse = nil
270
+ @ois_mouse = nil
271
+ end
272
+
273
+ # Called by OIS whenever the window is resized.
274
+ def update_window_size
275
+ width, height, depth, left, top = @render_window.get_metrics
276
+
277
+ if(@ois_mouse)
278
+ mouse_state = @ois_mouse.mouse_state
279
+ mouse_state.width = width
280
+ mouse_state.height = height
281
+ end
282
+ end
283
+ end
284
+
285
+ end