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.
- data/History.txt +6 -0
- data/INSTALL.txt +5 -0
- data/License.txt +18 -0
- data/Manifest.txt +175 -0
- data/README.txt +39 -0
- data/Rakefile +6 -0
- data/app_generators/actor/USAGE +6 -0
- data/app_generators/actor/actor_generator.rb +51 -0
- data/app_generators/actor/templates/actor.rb +4 -0
- data/app_generators/actor/templates/spec.rb +11 -0
- data/app_generators/actor/templates/unit_test.rb +9 -0
- data/app_generators/commands/console.rb +6 -0
- data/{lib/rails_generator/generators/applications/shattered_app → app_generators/shattered}/USAGE +1 -1
- data/app_generators/shattered/shattered_generator.rb +67 -0
- data/{lib → app_generators/shattered}/templates/Rakefile +4 -4
- data/app_generators/shattered/templates/configs/game.controls +16 -0
- data/app_generators/shattered/templates/configs/ogre_plugins.linux.cfg +12 -0
- data/app_generators/shattered/templates/configs/ogre_plugins.osx.cfg +12 -0
- data/{lib → app_generators/shattered}/templates/configs/ogre_plugins.windows.cfg +2 -2
- data/app_generators/shattered/templates/game.rb +50 -0
- data/{lib → app_generators/shattered}/templates/media/basic.rmaterial +0 -0
- data/app_generators/shattered/templates/spec/game_spec.rb +5 -0
- data/app_generators/shattered/templates/spec/spec_helper.rb +12 -0
- data/bin/shattered +39 -0
- data/config/hoe.rb +77 -0
- data/config/requirements.rb +15 -0
- data/lib/shattered.rb +40 -0
- data/lib/shattered_game/actor.rb +6 -0
- data/lib/shattered_game/game.rb +285 -0
- data/lib/{tasks → shattered_game/rake_tasks}/framework.rake +19 -24
- data/lib/{tasks → shattered_game/rake_tasks}/log.rake +0 -0
- data/lib/{tasks → shattered_game/rake_tasks}/misc.rake +1 -2
- data/lib/{tasks → shattered_game/rake_tasks}/pre_namespace_aliases.rake +0 -0
- data/lib/{tasks → shattered_game/rake_tasks}/shattered.rb +0 -0
- data/lib/shattered_game/rake_tasks/spec.rake +9 -0
- data/lib/{tasks → shattered_game/rake_tasks}/statistics.rake +0 -0
- data/lib/shattered_game/required.rb +2 -0
- data/lib/shattered_game/version.rb +9 -0
- data/lib/shattered_model/controls.rb +67 -0
- data/lib/shattered_model/input.rb +171 -0
- data/lib/shattered_model/key_converter.rb +44 -0
- data/lib/shattered_model/required.rb +4 -0
- data/lib/shattered_model/shattered_model.rb +28 -0
- data/lib/shattered_model/timed_event.rb +120 -0
- data/lib/shattered_model/timer.rb +78 -0
- data/lib/shattered_support/core_ext.rb +1 -0
- data/lib/shattered_support/core_ext/class.rb +3 -0
- data/lib/shattered_support/core_ext/class/attribute_accessors.rb +44 -0
- data/lib/shattered_support/core_ext/class/inheritable_attributes.rb +115 -0
- data/lib/shattered_support/core_ext/class/removal.rb +24 -0
- data/lib/shattered_support/core_ext/dir.rb +5 -0
- data/lib/shattered_support/core_ext/dir/search.rb +25 -0
- data/lib/shattered_support/core_ext/file.rb +5 -0
- data/lib/shattered_support/core_ext/file/search.rb +64 -0
- data/lib/shattered_support/core_ext/numeric.rb +5 -0
- data/lib/shattered_support/core_ext/numeric/time.rb +72 -0
- data/lib/shattered_support/core_ext/string.rb +13 -0
- data/lib/shattered_support/core_ext/string/access.rb +58 -0
- data/lib/shattered_support/core_ext/string/conversions.rb +19 -0
- data/lib/shattered_support/core_ext/string/inflections.rb +64 -0
- data/lib/shattered_support/core_ext/string/iterators.rb +17 -0
- data/lib/shattered_support/core_ext/string/starts_ends_with.rb +20 -0
- data/lib/shattered_support/error.rb +12 -0
- data/lib/shattered_support/inflections.rb +53 -0
- data/lib/shattered_support/inflector.rb +178 -0
- data/lib/shattered_support/pre_initialize.rb +153 -0
- data/lib/shattered_support/required.rb +9 -0
- data/lib/shattered_support/unload.rb +18 -0
- data/lib/shattered_view/camera.rb +7 -0
- data/lib/shattered_view/ogrerb/base.rb +28 -0
- data/lib/shattered_view/ogrerb/camera.rb +14 -0
- data/lib/shattered_view/ogrerb/key_manager.rb +54 -0
- data/lib/shattered_view/ogrerb/light.rb +25 -0
- data/lib/shattered_view/ogrerb/material.rb +5 -0
- data/lib/shattered_view/ogrerb/mesh_instance.rb +85 -0
- data/lib/shattered_view/ogrerb/mouse_manager.rb +109 -0
- data/lib/shattered_view/ogrerb/particle_system.rb +24 -0
- data/lib/shattered_view/ogrerb/rgb.rb +6 -0
- data/lib/shattered_view/ogrerb/rmaterial.rb +87 -0
- data/lib/shattered_view/ogrerb/scene_node.rb +76 -0
- data/lib/shattered_view/ogrerb/vector.rb +243 -0
- data/lib/shattered_view/ogrerb/window_event.rb +14 -0
- data/lib/shattered_view/resources.rb +64 -0
- data/lib/shattered_view/shattered_view.rb +248 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +30 -0
- data/tasks/environment.rake +7 -0
- data/tasks/rcov.rake +7 -0
- data/tasks/testing.rake +46 -0
- data/tasks/website.rake +15 -0
- data/test/acceptance/Rakefile +10 -0
- data/test/acceptance/config/game.controls +17 -0
- data/test/acceptance/config/ogre_plugins.linux.cfg +12 -0
- data/test/acceptance/config/ogre_plugins.osx.cfg +12 -0
- data/test/acceptance/config/ogre_plugins.windows.cfg +14 -0
- data/test/acceptance/config/ogrerb_defaults.save +8 -0
- data/test/acceptance/game.rb +120 -0
- data/test/acceptance/lib/acceptance_test.rb +20 -0
- data/test/acceptance/lib/console.rb +54 -0
- data/test/acceptance/lib/input_test.rb +8 -0
- data/test/acceptance/lib/label.rb +30 -0
- data/test/acceptance/lib/light_test.rb +60 -0
- data/test/acceptance/lib/mesh_test.rb +69 -0
- data/test/acceptance/lib/particle_test.rb +9 -0
- data/test/acceptance/media/GreenSkin.jpg +0 -0
- data/test/acceptance/media/Ogre.material +86 -0
- data/test/acceptance/media/WeirdEye.png +0 -0
- data/test/acceptance/media/basic.rmaterial +18 -0
- data/test/acceptance/media/console.fontdef +7 -0
- data/test/acceptance/media/console.material +13 -0
- data/test/acceptance/media/console.png +0 -0
- data/test/acceptance/media/console.ttf +0 -0
- data/test/acceptance/media/dirt01.png +0 -0
- data/test/acceptance/media/fountain.material +19 -0
- data/test/acceptance/media/fountain.particle +40 -0
- data/test/acceptance/media/fountain.png +0 -0
- data/test/acceptance/media/fountaincolors.png +0 -0
- data/test/acceptance/media/ogre.mesh +0 -0
- data/test/acceptance/media/spheremap.png +0 -0
- data/test/acceptance/media/win.png +0 -0
- data/test/acceptance/spec/spec_helper.rb +7 -0
- data/test/integration/actor_generator_test.rb +43 -0
- data/test/integration/shattered_generator_test.rb +43 -0
- data/test/integration/test_helper.rb +20 -0
- data/test/ogre_test_defaults.save +8 -0
- data/test/ogre_test_plugins.linux.cfg +12 -0
- data/test/ogre_test_plugins.osx.cfg +12 -0
- data/test/ogre_test_plugins.windows.cfg +14 -0
- data/test/test_helper.rb +109 -0
- data/test/unit/shattered_game/actor_test.rb +9 -0
- data/test/unit/shattered_game/game_test.rb +49 -0
- data/test/unit/shattered_game/runner_test.rb +56 -0
- data/test/unit/shattered_model/controls/mouse.controls +4 -0
- data/test/unit/shattered_model/controls/player.controls +4 -0
- data/test/unit/shattered_model/controls/too_many_delims.controls +1 -0
- data/test/unit/shattered_model/key_controls_test.rb +89 -0
- data/test/unit/shattered_model/key_converter_test.rb +37 -0
- data/test/unit/shattered_model/keyboard_input_test.rb +32 -0
- data/test/unit/shattered_model/mouse_controls_test.rb +50 -0
- data/test/unit/shattered_model/mouse_input_test.rb +61 -0
- data/test/unit/shattered_model/shattered_model_test.rb +117 -0
- data/test/unit/shattered_model/timed_event_test.rb +79 -0
- data/test/unit/shattered_model/timer_test.rb +325 -0
- data/{lib/rails_generator/generators/components/actor/templates/actor.rb → test/unit/shattered_support/directory_test/file.test} +0 -0
- data/test/unit/shattered_support/numeric_ext_test.rb +38 -0
- data/test/unit/shattered_support/pre_initialize_test.rb +63 -0
- data/test/unit/shattered_support/shattered_support_test.rb +39 -0
- data/test/unit/shattered_support/unload_test.rb +17 -0
- data/test/unit/shattered_view/light_test.rb +38 -0
- data/test/unit/shattered_view/material_test.rb +41 -0
- data/test/unit/shattered_view/media_test/basic.rmaterial +18 -0
- data/{lib/templates/configs/empty.log → test/unit/shattered_view/media_test/beltch.ogg} +0 -0
- data/test/unit/shattered_view/media_test/test.mesh +0 -0
- data/test/unit/shattered_view/mesh_test.rb +59 -0
- data/test/unit/shattered_view/node_test.rb +11 -0
- data/test/unit/shattered_view/ogrerb/camera_test.rb +12 -0
- data/test/unit/shattered_view/ogrerb/key_manager_test.rb +42 -0
- data/test/unit/shattered_view/ogrerb/media/basic.rmaterial +18 -0
- data/test/unit/shattered_view/ogrerb/media/test.mesh +0 -0
- data/test/unit/shattered_view/ogrerb/media/test.rmaterial +1 -0
- data/test/unit/shattered_view/ogrerb/mesh_instance_test.rb +74 -0
- data/test/unit/shattered_view/ogrerb/mouse_manager_test.rb +104 -0
- data/test/unit/shattered_view/ogrerb/ogrerb.log +51 -0
- data/test/unit/shattered_view/ogrerb/resolve_ogrerb_test.rb +13 -0
- data/test/unit/shattered_view/ogrerb/rgb_test.rb +10 -0
- data/test/unit/shattered_view/ogrerb/rmaterial_test.rb +28 -0
- data/test/unit/shattered_view/ogrerb/scene_type_test.rb +12 -0
- data/test/unit/shattered_view/ogrerb/vector_test.rb +206 -0
- data/test/unit/shattered_view/particle_test.rb +23 -0
- data/test/unit/shattered_view/resources_test.rb +45 -0
- data/test/unit/shattered_view/test_helper.rb +1 -0
- data/test/unit/shattered_view/window_event_test.rb +19 -0
- data/test/unit/test_helper.rb +1 -0
- metadata +205 -121
- data/bin/console +0 -4
- data/bin/destroy +0 -9
- data/bin/generate +0 -7
- data/bin/runner +0 -9
- data/bin/shatter +0 -22
- data/lib/commands/console.rb +0 -23
- data/lib/game_loader.rb +0 -118
- data/lib/rails_generator.rb +0 -43
- data/lib/rails_generator/base.rb +0 -203
- data/lib/rails_generator/commands.rb +0 -519
- data/lib/rails_generator/generators/applications/shattered_app/shattered_app_generator.rb +0 -103
- data/lib/rails_generator/generators/components/actor/actor_generator.rb +0 -22
- data/lib/rails_generator/generators/components/model/USAGE +0 -17
- data/lib/rails_generator/generators/components/model/model_generator.rb +0 -22
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +0 -5
- data/lib/rails_generator/generators/components/model/templates/model.rb +0 -2
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +0 -11
- data/lib/rails_generator/generators/components/state/USAGE +0 -30
- data/lib/rails_generator/generators/components/state/state_generator.rb +0 -19
- data/lib/rails_generator/generators/components/state/templates/state.rb +0 -20
- data/lib/rails_generator/generators/components/view/USAGE +0 -30
- data/lib/rails_generator/generators/components/view/templates/material +0 -4
- data/lib/rails_generator/generators/components/view/templates/view.rb +0 -7
- data/lib/rails_generator/generators/components/view/view_generator.rb +0 -28
- data/lib/rails_generator/lookup.rb +0 -209
- data/lib/rails_generator/manifest.rb +0 -53
- data/lib/rails_generator/options.rb +0 -143
- data/lib/rails_generator/scripts.rb +0 -83
- data/lib/rails_generator/scripts/destroy.rb +0 -7
- data/lib/rails_generator/scripts/generate.rb +0 -7
- data/lib/rails_generator/scripts/update.rb +0 -12
- data/lib/rails_generator/simple_logger.rb +0 -46
- data/lib/rails_generator/spec.rb +0 -44
- data/lib/shatter.rb +0 -7
- data/lib/tasks/documentation.rake +0 -46
- data/lib/tasks/testing.rake +0 -102
- data/lib/templates/MIT-LICENSE +0 -20
- data/lib/templates/README +0 -35
- data/lib/templates/configs/boot.rb +0 -35
- data/lib/templates/configs/ogre.cfg +0 -4
- data/lib/templates/configs/runner.rb +0 -5
- data/lib/templates/doc/README_FOR_APP +0 -2
- data/lib/templates/environments/environment.rb +0 -10
- data/lib/templates/media/default.mesh +0 -0
- data/lib/templates/media/default.png +0 -0
- data/lib/templates/media/offset_map.rmaterial +0 -117
- data/lib/templates/test/test_helper.rb +0 -5
@@ -0,0 +1,9 @@
|
|
1
|
+
#require File.dirname(__FILE__) + '/inflector'
|
2
|
+
#require File.dirname(__FILE__) + '/inflections'
|
3
|
+
#require File.dirname(__FILE__) + '/core_ext'
|
4
|
+
require File.dirname(__FILE__) + '/pre_initialize'
|
5
|
+
require File.dirname(__FILE__) + '/unload'
|
6
|
+
#require 'rubygems'
|
7
|
+
#require 'activesupport' #TODO: Use activesupport, fix shatteredsupport or get rid of shatteredsupport
|
8
|
+
require File.dirname(__FILE__) + '/core_ext'
|
9
|
+
require File.dirname(__FILE__) + '/error'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Shattered
|
2
|
+
module Unload #:nodoc:
|
3
|
+
# Add a block to call on unload.
|
4
|
+
def on_unload(&block)
|
5
|
+
@on_unload ||= []
|
6
|
+
@on_unload << block
|
7
|
+
end
|
8
|
+
|
9
|
+
# Unload the object by calling all the unload blocks.
|
10
|
+
def unload
|
11
|
+
if(@on_unload)
|
12
|
+
@on_unload.reverse.each do |onload_method|
|
13
|
+
onload_method.call
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
class ShatteredOgre
|
3
|
+
def self.create_root(plugins="ogrerb_plugins.cfg", configs="ogrerb_defaults.save", log="ogrerb.log")
|
4
|
+
# Disable the default stdout. All ogre errors redirect to the ogre log.
|
5
|
+
@@log_manager = Ogre::LogManager.new
|
6
|
+
@@log_manager.create_log(log,true,false,false)
|
7
|
+
|
8
|
+
# Create our core and load platform managers
|
9
|
+
@@root = Ogre::Root.new(plugins, configs, log)
|
10
|
+
return @@root
|
11
|
+
end
|
12
|
+
|
13
|
+
# Translates from symbols to scene manager types. Valid options are:
|
14
|
+
# :general => ST_GENERIC
|
15
|
+
# :terrain => ST_EXTERIOR_CLOSE
|
16
|
+
# :nature => ST_EXTERIOR_FAR
|
17
|
+
# :indoor => ST_INTERIOR
|
18
|
+
# :nature_paging => ST_EXTERIOR_REAL_FAR
|
19
|
+
def self.translate_to_scene_type( symbol )
|
20
|
+
return Ogre::ST_GENERIC if(symbol == :general)
|
21
|
+
return Ogre::ST_EXTERIOR_CLOSE if(symbol == :terrain)
|
22
|
+
return Ogre::ST_EXTERIOR_FAR if(symbol == :nature)
|
23
|
+
return Ogre::ST_EXTERIOR_REAL_FAR if(symbol == :paging)
|
24
|
+
return Ogre::ST_INTERIOR if(symbol == :indoor)
|
25
|
+
raise StandardError, "#{symbol} is not a valid scene manager type"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Ogre
|
2
|
+
class Camera
|
3
|
+
|
4
|
+
alias_method :raw_look_at, :look_at
|
5
|
+
|
6
|
+
# Look at an object
|
7
|
+
# You can send it a node, mesh, or anything with a position vector
|
8
|
+
# Or just a vector
|
9
|
+
def look_at(v)
|
10
|
+
v = v.position if v.class.respond_to? :position
|
11
|
+
raw_look_at v.to_v
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module OIS
|
2
|
+
# One centralized place for responding to keyboard input in shattered
|
3
|
+
# TODO: buffered input
|
4
|
+
# TODO: make this a singleton(the constructor takes arguments, which makes this difficult)
|
5
|
+
class KeyManager < KeyListenerProxy
|
6
|
+
def initialize(*args)
|
7
|
+
if(args.empty?)
|
8
|
+
puts "Warning: Do not initialize KeyManager via the default constructor unless you are running tests."
|
9
|
+
else
|
10
|
+
super(*args)
|
11
|
+
end
|
12
|
+
@pressed={}
|
13
|
+
@held={}
|
14
|
+
@released={}
|
15
|
+
end
|
16
|
+
|
17
|
+
# Is key new from the last flush event?
|
18
|
+
def key_pressed?(key)
|
19
|
+
return @pressed[key] || false
|
20
|
+
end
|
21
|
+
|
22
|
+
# Is key not pressed new from the last flush event?
|
23
|
+
def key_released?(key)
|
24
|
+
return @released[key] || false
|
25
|
+
end
|
26
|
+
|
27
|
+
# Is the key pressed or pressed from a previous frame
|
28
|
+
def key_held?(key)
|
29
|
+
return @held[key] || false
|
30
|
+
end
|
31
|
+
|
32
|
+
# Clear out the newly pressed/released events
|
33
|
+
def flush
|
34
|
+
@released={}
|
35
|
+
@pressed={}
|
36
|
+
end
|
37
|
+
|
38
|
+
# Called from the key listener
|
39
|
+
def key_pressed(e)
|
40
|
+
@pressed[e.key]=true
|
41
|
+
@held[e.key]=true
|
42
|
+
@released[e.key]=false
|
43
|
+
end
|
44
|
+
|
45
|
+
# Called from the key listener
|
46
|
+
def key_released(e)
|
47
|
+
@released[e.key]=true
|
48
|
+
@held[e.key]=false
|
49
|
+
@pressed[e.key]=false
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Ogre
|
2
|
+
class Light
|
3
|
+
attr_accessor :scene_manager
|
4
|
+
alias_method :diffuse=, :set_diffuse_colour
|
5
|
+
alias_method :diffuse, :get_diffuse_colour
|
6
|
+
|
7
|
+
alias_method :position=, :set_position
|
8
|
+
alias_method :position, :get_position
|
9
|
+
|
10
|
+
alias_method :specular=, :set_specular_colour
|
11
|
+
alias_method :specular, :get_specular_colour
|
12
|
+
|
13
|
+
alias_method :direction=, :set_direction
|
14
|
+
alias_method :direction, :get_direction
|
15
|
+
#Return the scene's total ambient color
|
16
|
+
def ambient
|
17
|
+
scene_manager.get_ambient_light
|
18
|
+
end
|
19
|
+
|
20
|
+
# Set the scene's total ambient color
|
21
|
+
def ambient=(*args)
|
22
|
+
scene_manager.set_ambient_light *args
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
3
|
+
module Ogre
|
4
|
+
# A MeshInstance is a class representing an Ogre::Entity attached to an
|
5
|
+
# Ogre::Node. This allows for moving / rotation of a Mesh without having
|
6
|
+
# to worry about about this dichotomy.
|
7
|
+
#
|
8
|
+
# Delegation occurs in the node for rotation and translation.
|
9
|
+
# Delegation occurs to the entity for all other cases.
|
10
|
+
# The node and entity are accessible, for the fringe cases where specific methods
|
11
|
+
# are not delegated respectfully.
|
12
|
+
class MeshInstance < SimpleDelegator
|
13
|
+
attr_reader :node, :entity
|
14
|
+
def initialize(parent, scene_manager, mesh_name, options={})
|
15
|
+
@@entity_count ||= 0
|
16
|
+
@scene_manager = scene_manager
|
17
|
+
@parent = parent
|
18
|
+
@node = parent.create_child_scene_node("#{parent.to_s}.node(#{parent.num_children})")
|
19
|
+
# formats to '#<SceneManager:???>.entity(0)'
|
20
|
+
@entity = options[:entity] || scene_manager.create_entity("#{scene_manager.to_s}.entity(#{@@entity_count})", mesh_name)
|
21
|
+
@node.attach_object(@entity)
|
22
|
+
@@entity_count += 1
|
23
|
+
# delegate all unknown methods to the entity object
|
24
|
+
__setobj__(@entity)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Unload the mesh entity and node.
|
28
|
+
def unload
|
29
|
+
@node.detach_object(@entity)
|
30
|
+
@scene_manager.destroy_entity(@entity)
|
31
|
+
@parent.remove_and_destroy_child(@node.get_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
[
|
35
|
+
:position,
|
36
|
+
:position=,
|
37
|
+
:direction=,
|
38
|
+
:orientation=,
|
39
|
+
:orientation,
|
40
|
+
:translate!,
|
41
|
+
:rotate,
|
42
|
+
:scale=,
|
43
|
+
:look_at
|
44
|
+
].each do |method|
|
45
|
+
define_method(method) do |*args|
|
46
|
+
node.send(method, *args)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def scale(*args)
|
51
|
+
node.scale *args
|
52
|
+
end
|
53
|
+
|
54
|
+
# Entity delegates that map differently
|
55
|
+
def visible=(v)
|
56
|
+
entity.set_visible v
|
57
|
+
end
|
58
|
+
|
59
|
+
# Is the entity visible?
|
60
|
+
def visible?
|
61
|
+
entity.is_visible
|
62
|
+
end
|
63
|
+
|
64
|
+
# Hide the mesh and it's children
|
65
|
+
def hide
|
66
|
+
self.visible = false
|
67
|
+
end
|
68
|
+
|
69
|
+
# Show the mesh and it's children
|
70
|
+
def show
|
71
|
+
self.visible = true
|
72
|
+
end
|
73
|
+
|
74
|
+
# Set a material on a mesh. You can set rmaterials or names of Ogre materials.
|
75
|
+
def material=(material)
|
76
|
+
if(material.is_a? String)
|
77
|
+
self.set_material_name(material)
|
78
|
+
else
|
79
|
+
self.set_material_name(material.get_name.to_s)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module OIS
|
2
|
+
# One centralized place for responding to mouse input in shattered
|
3
|
+
# TODO: buffered?
|
4
|
+
# TODO: make this a singleton(the constructor takes arguments, which makes this difficult)
|
5
|
+
class MouseManager
|
6
|
+
attr_reader :x, :y, :scrolled, :abs_x, :abs_y
|
7
|
+
|
8
|
+
#Constructor requires an OIS::Mouse object
|
9
|
+
def initialize(*args)
|
10
|
+
if(args.empty?)
|
11
|
+
puts "Warning: Do not initialize MouseManager via the default constructor unless you are running tests."
|
12
|
+
else
|
13
|
+
# @mouse_events = OIS::MouseEvents.new(*args)
|
14
|
+
# @mouse_events.on_press lambda {|e, val| respond_to_press(e, val) }
|
15
|
+
# @mouse_events.on_release lambda {|e, val| respond_to_release(e, val) }
|
16
|
+
# @mouse_events.on_move lambda {|e| respond_to_move(e) }
|
17
|
+
@ois_mouse = args[0]
|
18
|
+
end
|
19
|
+
@pressed=0
|
20
|
+
@held=0
|
21
|
+
@released=0
|
22
|
+
@scrolled=0
|
23
|
+
@x=0
|
24
|
+
@y=0
|
25
|
+
@abs_x=0
|
26
|
+
@abs_y=0
|
27
|
+
@buttons = 0
|
28
|
+
end
|
29
|
+
|
30
|
+
# Clear out the newly pressed/released events and relative position
|
31
|
+
def flush
|
32
|
+
@pressed=0
|
33
|
+
@released=0
|
34
|
+
@scrolled=0
|
35
|
+
@x=0
|
36
|
+
@y=0
|
37
|
+
end
|
38
|
+
|
39
|
+
#Unbuffered input processor
|
40
|
+
def process_events(state)
|
41
|
+
#TODO: What to do on buffered input
|
42
|
+
if @ois_mouse.nil? || !@ois_mouse.buffered
|
43
|
+
flush
|
44
|
+
respond_to_buttons(state)
|
45
|
+
respond_to_move(state)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#Determine press, release, and held states
|
50
|
+
def respond_to_buttons(state)
|
51
|
+
buttons = state.buttons
|
52
|
+
i = 0
|
53
|
+
# This code checks each bit, and does a press or release depending on the bit.
|
54
|
+
while i <= 7
|
55
|
+
bit = 1 << i
|
56
|
+
current = bit & buttons
|
57
|
+
prev = bit & @buttons
|
58
|
+
if current < prev
|
59
|
+
respond_to_release i
|
60
|
+
elsif prev < current
|
61
|
+
respond_to_press i
|
62
|
+
end
|
63
|
+
i+=1
|
64
|
+
end
|
65
|
+
@buttons = buttons
|
66
|
+
end
|
67
|
+
|
68
|
+
#Called when the OIS mouse moved event is fired
|
69
|
+
def respond_to_move(state)
|
70
|
+
@scrolled+=state.Z.rel
|
71
|
+
@x+=state.X.rel
|
72
|
+
@y+=state.Y.rel
|
73
|
+
@abs_x=state.X.abs
|
74
|
+
@abs_y=state.Y.abs
|
75
|
+
end
|
76
|
+
|
77
|
+
#Called when the OIS mouse pressed event is fired
|
78
|
+
def respond_to_press(val)
|
79
|
+
bit = (1 << val)
|
80
|
+
@pressed |= bit
|
81
|
+
@held |= bit
|
82
|
+
end
|
83
|
+
|
84
|
+
#Called when the OIS mouse released event is fired
|
85
|
+
def respond_to_release(val)
|
86
|
+
bit = (1 << val)
|
87
|
+
@released |= bit
|
88
|
+
@held &= ~bit
|
89
|
+
@pressed &= ~bit
|
90
|
+
end
|
91
|
+
|
92
|
+
#Returns true if the button is pressed
|
93
|
+
def pressed?(button)
|
94
|
+
return (@pressed & (1 << button) != 0)
|
95
|
+
end
|
96
|
+
|
97
|
+
#Returns true if the button is held(between pressed and released states)
|
98
|
+
def held?(button)
|
99
|
+
return (@held & (1 << button) != 0)
|
100
|
+
end
|
101
|
+
|
102
|
+
#Returns true if the button is released
|
103
|
+
def released?(button)
|
104
|
+
return (@released & (1 << button) != 0)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Ogre
|
2
|
+
class ParticleSystem
|
3
|
+
def node=(node)
|
4
|
+
puts node
|
5
|
+
@node = node
|
6
|
+
node.attach_object self
|
7
|
+
end
|
8
|
+
|
9
|
+
def unload
|
10
|
+
unless @node.nil?
|
11
|
+
@node.detach_object self
|
12
|
+
@node.get_parent.remove_child @node
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def position=(v)
|
17
|
+
@node.position=v
|
18
|
+
end
|
19
|
+
|
20
|
+
def position
|
21
|
+
@node.position
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
module Ogre
|
4
|
+
# An rmaterial is a material template, sample rmaterials
|
5
|
+
# A basic RMaterial looks as follows:
|
6
|
+
#
|
7
|
+
# // This is an example rmaterial, a basic single textured, uniformly lit mesh.
|
8
|
+
# // The only argument is texture, which defaults to <material_name>.png
|
9
|
+
# <% @texture ||= "#{name}.png" %>
|
10
|
+
# material <%= name %>
|
11
|
+
# {
|
12
|
+
# technique
|
13
|
+
# {
|
14
|
+
# pass
|
15
|
+
# {
|
16
|
+
# lighting off
|
17
|
+
# texture_unit
|
18
|
+
# {
|
19
|
+
# texture <%= texture %>
|
20
|
+
# }
|
21
|
+
# }
|
22
|
+
# }
|
23
|
+
#
|
24
|
+
# Example:
|
25
|
+
# rmaterial = RMaterial.load("my.material") do |rm|
|
26
|
+
# rm.name = "Ogre"
|
27
|
+
# end
|
28
|
+
# result = rmaterial.load
|
29
|
+
#
|
30
|
+
#Materials are parsed through erb as .rmaterials and parsed when a material is created using the create :material function of View
|
31
|
+
class RMaterial
|
32
|
+
attr_reader :result, :name
|
33
|
+
|
34
|
+
# Used to create an rmaterial with a block.
|
35
|
+
# Returns an Ogre material
|
36
|
+
def self.load(file)
|
37
|
+
rmaterial = self.new(file)
|
38
|
+
yield rmaterial
|
39
|
+
rmaterial.parse
|
40
|
+
return rmaterial.create_ogre_material
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize(rmaterial)
|
44
|
+
@rmaterial = rmaterial
|
45
|
+
end
|
46
|
+
|
47
|
+
# Parses through ERB to create a ogre-compatible material
|
48
|
+
def parse
|
49
|
+
begin
|
50
|
+
evaluate(File.open(@rmaterial).readlines.join(''))
|
51
|
+
rescue Errno::ENOENT => bang
|
52
|
+
raise Errno::ENOENT, "RMaterial for '#{name}' not found: #{bang.message}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Loads the rmaterial from Ogre. Must call parse first.
|
57
|
+
def create_ogre_material
|
58
|
+
unless(MaterialManager.instance.resource_exists(name.to_s))
|
59
|
+
MaterialManager.instance.parse_script(result, "General")
|
60
|
+
end
|
61
|
+
return MaterialManager.instance.get_by_name(name.to_s)
|
62
|
+
end
|
63
|
+
|
64
|
+
def method_missing(name, *args)
|
65
|
+
# Check if the method is a setter
|
66
|
+
if name.to_s[-1].chr == "="
|
67
|
+
name = name.to_s[0...-1].to_sym
|
68
|
+
# Set the instance variable to the sent variable
|
69
|
+
ivar = "@#{ name }".to_sym
|
70
|
+
instance_variable_set(ivar, args[0])
|
71
|
+
else
|
72
|
+
begin
|
73
|
+
return eval("@#{name}")
|
74
|
+
rescue StandardError => bang
|
75
|
+
raise NoMethodError, "Rmaterial could not find the #{name} attribute: #{bang.message}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
def evaluate(template)
|
80
|
+
evaluator = ERB.new(template)
|
81
|
+
return @result ||= evaluator.result(binding)
|
82
|
+
end
|
83
|
+
def tangent_space
|
84
|
+
false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|