shattered_view 0.3 → 0.3.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/lib/base.rb CHANGED
@@ -1,5 +1,9 @@
1
1
 
2
- include ShatteredOgre
2
+ $:.unshift(File.dirname(__FILE__)) unless
3
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
4
+
5
+ require 'mesh/mesh'
6
+
3
7
  include ShatteredSupport
4
8
 
5
9
  module ShatteredView
@@ -29,41 +33,6 @@ module ShatteredView
29
33
  before_init_set name, {:create_ogre_material => []}
30
34
  end
31
35
 
32
- # This deserves a larger explanation
33
- #
34
- # options can include:
35
- # - :animation => (not implemented yet)
36
- # - - :speed => speed in game_seconds/animation_seconds
37
- # - - :start_at => animation name to start the animation
38
- # - - :loops => default for looping
39
- def mesh(file, options = {})
40
- name = file.underscore
41
- before_init_set( "self", {:new_mesh => file })
42
-
43
- define_method(name.to_sym) do
44
- return instance_variable_get(:"@#{name}")
45
- end
46
-
47
- #What is this?
48
- options = options.dup
49
- options.delete :file
50
- options.delete :name
51
-
52
- before_init_set( name, options )
53
- end
54
-
55
- #
56
- #
57
- # options can include any function in animation.rb
58
- # and :alias => :alias_name
59
- def animation(name, options = {})
60
- alias_option = options.delete(:alias)
61
- before_init_set("animation(:#{name})", options)
62
- before_init_set("self", {:new_animation => [name]})
63
- if not alias_option.nil?
64
- before_init_set("self", {:new_animation_alias => [name, alias_option]})
65
- end
66
- end
67
36
 
68
37
 
69
38
  # Any view can create a light.
@@ -98,54 +67,23 @@ module ShatteredView
98
67
  before_init_set name, options
99
68
  end
100
69
 
70
+ # Particle systems are defined in .particle files
71
+ # - This works for first order particle systems --
72
+ # - We need to look into second and third order particle systems
73
+ #
74
+ def particle_system(name, options = {})
75
+ raise Error, "Must supply a template for your particle system." if options[:template].nil?
76
+ before_init_set "self", {:new_particle_system, [name, options[:template]]}
77
+ options.delete :template
78
+ before_init_set name, options
79
+ end
101
80
  end
102
81
 
103
82
  class Base < ShatteredSupport::Base
104
83
  attr_reader :meshes
84
+ attr_accessor :model
105
85
 
106
- def unload!
107
- meshes.each { |mesh| mesh.remove_from_scene }
108
- end
109
-
110
- #Note that this method is very similiar to ShatteredController::Actor.
111
- #And that a common function can be refactored from both.
112
- def method_missing(method, *args)
113
- super(method,*args) if !method_defined?(method)
114
- retv=nil
115
- meshes.each do |mesh|
116
- retv =mesh.send(method, *args) if mesh.method_defined? method
117
- end
118
-
119
- return retv
120
- end
121
-
122
- def method_defined?(method)
123
- meshes.each { |mesh| return true if mesh.method_defined? method }
124
- return super(method)
125
- end
126
-
127
- def mesh(file, options={})
128
- self.class.mesh(file,options)
129
- pre_initialize
130
- retv = meshes[-1] # Return the last created mesh
131
- return retv
132
- end
133
-
134
- def new_mesh=(file)
135
- options = {}
136
- options[:name]=file.underscore
137
- options[:file]=file
138
- name = options[:name]
139
- mesh = Mesh.new(options)
140
- eval("@#{name}=mesh")
141
- #keep track of the meshes we create
142
- meshes << mesh
143
- end
144
86
 
145
- def meshes
146
- @meshes ||= []
147
- end
148
-
149
87
  def new_material=(name)
150
88
  @materials ||= {}
151
89
  name = name.to_sym
@@ -156,44 +94,31 @@ module ShatteredView
156
94
  end
157
95
  end
158
96
 
159
- def new_light=(name)
160
- @lights ||= {}
161
- @lights[name] = ShatteredView::Light.new
97
+ def define_accessor(array, new_obj, name)
98
+
99
+ instance_eval("#{array} ||= {}")
100
+ instance_eval("#{array}[\"#{name}\"] = new_obj")
101
+
162
102
  self.class.class_eval <<-EOF
163
103
  define_method(:#{name}) do
164
- @lights[name]
104
+ #{array}[\"#{name}\"]
165
105
  end
166
106
  EOF
167
107
  end
168
108
 
169
- def new_animation=(name)
170
- meshes.each do |mesh|
171
- mesh.instance_eval <<-EOF
172
- class << self
173
- define_method(:#{name}) do
174
- animation(:#{name})
175
- end
176
- end
177
- EOF
178
- end
179
- end
180
- def new_animation_alias=(name, alias_option)
181
- self.class.class_eval <<-EOF
182
- define_method(:#{alias_option}) do
183
- meshes.each do |mesh|
184
- mesh.#{name}.play
185
- end
186
- end
187
- EOF
109
+ def new_light=(name)
110
+ define_accessor("@lights", ShatteredView::Light.new, name)
188
111
  end
189
112
 
190
- protected
191
- def mesh_public_methods
192
- methods=[]
193
- meshes.each do |mesh|
194
- methods |= mesh.public_methods
195
- end
196
- return methods
197
- end
113
+ def new_particle_system=(name, template)
114
+ define_accessor("@particle_systems", ShatteredView::ParticleSystem.new(template), name)
115
+ end
116
+
198
117
  end
199
118
  end
119
+
120
+
121
+ ShatteredView::Base.class_eval do
122
+ include ShatteredView::Mesh
123
+ end
124
+
data/lib/camera.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module ShatteredView
2
- class Camera < Mesh
2
+ class Camera < Node
3
3
  def initialize( scene )
4
4
  @scene_object = scene.getCamera
5
5
  end
data/lib/extensions.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  module ShatteredOgre
2
2
  class Vector3
3
3
  def to_a
4
- Vector.new(x,y,z)
4
+ [x, y, z]
5
+ end
6
+ def to_v
7
+ Vector.new x, y, z
5
8
  end
6
9
  end
7
10
  end
@@ -7,6 +7,9 @@ class Animation
7
7
  def play
8
8
  @animation.play
9
9
  end
10
+ def stop
11
+ @animation.stop
12
+ end
10
13
  def loop=(looping)
11
14
  @animation.setLoop(looping);
12
15
  end
data/lib/mesh/mesh.rb ADDED
@@ -0,0 +1,174 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'animation'
5
+
6
+ module ShatteredView
7
+ module Mesh
8
+ def self.included(base)
9
+ base.extend(ClassMethods)
10
+ base.send(:include, InstanceMethods)
11
+ end
12
+
13
+ module ClassMethods
14
+
15
+ # Meshes are the foundation for your world.
16
+ #
17
+ # They tie in to Ogre's .mesh file format, and display a 3d object onto the screen.
18
+ #
19
+ # Shattered has support for loading meshes, creating materials for those meshes (using RMaterials)
20
+ # and skeletal animation support.
21
+ #
22
+ # class DirtyRubyView
23
+ # mesh "dirty_ruby", :position => [0,0,1]
24
+ # end
25
+ #
26
+ # When a Mesh is created, all animations found in that mesh are loaded, and added
27
+ # as functions to that mesh.
28
+ #
29
+ # example: Tim.mesh has animations kick and punch
30
+ #
31
+ # after loading Tim.mesh, View has the Mesh object tim
32
+ # tim.kick.play
33
+ # tim.animation(:kick).play
34
+ #
35
+ # See Rmaterials and Animation for more details.
36
+ def mesh(file, options = {})
37
+ before_init_call( :mesh, file, options )
38
+ end
39
+
40
+ # Animations declare helper functions for mesh animations.
41
+ #
42
+ # class AnimatedRubyView < ...
43
+ # mesh :animated_ruby, ...
44
+ # animation "shatter"
45
+ #
46
+ # def initialize
47
+ # shatter # same as animated_ruby.shatter
48
+ # end
49
+ # end
50
+ #
51
+ # options can include any function in animation.rb
52
+ # and :alias => :alias_name
53
+ def animation(name, options = {})
54
+ play_alias = options.delete(:alias)
55
+ before_init_call(:animation, name, options)
56
+ unless play_alias.nil?
57
+ before_init_call(:animation_alias, name, play_alias)
58
+ end
59
+ end
60
+ end
61
+
62
+ module InstanceMethods
63
+
64
+ def unload!
65
+ meshes.each { |mesh| mesh.remove_from_scene }
66
+ end
67
+
68
+ #Note that this method is very similiar to ShatteredController::Actor.
69
+ #And that a common function can be refactored from both.
70
+ def method_missing(method, *args)
71
+ super(method,*args) if !method_defined?(method)
72
+ retv=nil
73
+ meshes.each do |mesh|
74
+ retv =mesh.send(method, *args) if mesh.method_defined? method
75
+ end
76
+
77
+ return retv
78
+ end
79
+
80
+ def method_defined?(method)
81
+ meshes.each { |mesh| return true if mesh.method_defined? method }
82
+ return super(method)
83
+ end
84
+
85
+ private
86
+
87
+ def mesh(file, options={})
88
+ mesh = Mesh.new(file)
89
+ name = mesh.name
90
+ attr_reader name.to_sym, mesh
91
+
92
+ call_object_function_for_each_key(name, options)
93
+ #keep track of the meshes we create
94
+ @meshes ||= []
95
+ @meshes << mesh
96
+ end
97
+
98
+ def meshes
99
+ @meshes ||= []
100
+ end
101
+
102
+ def animation(name, options={})
103
+ meshes.each do |mesh|
104
+ mesh.instance_eval <<-EOF
105
+ class << self
106
+ define_method(:#{name}) do
107
+ animation(:#{name})
108
+ end
109
+ end
110
+ EOF
111
+ call_object_function_for_each_key(:"#{mesh.name}.#{name}", options)
112
+ end
113
+ end
114
+
115
+ def animation_alias(name, renamed)
116
+ define_method(renamed.to_sym) do
117
+ meshes.each do |mesh|
118
+ mesh.animation(name.to_sym).play
119
+ end
120
+ end
121
+ end
122
+
123
+
124
+ protected
125
+ def mesh_public_methods
126
+ methods=[]
127
+ meshes.each do |mesh|
128
+ methods |= mesh.public_methods
129
+ end
130
+ return methods
131
+ end
132
+ end
133
+
134
+ # This Mesh class corresponds (almost 1 to 1) with ShatteredOgre's mesh class
135
+ class Mesh < ShatteredView::Node
136
+ attr_reader :name
137
+
138
+ def initialize( file, options = {} )
139
+ @name = file.underscore
140
+ unless defined?(TESTING)
141
+ @scene_object = ShatteredOgre::Scene.getSingleton.createMesh( [0,0,0].to_v3, "#{file}.mesh" )
142
+ puts "Loading Mesh: #{@scene_object} from #{:file}.mesh"
143
+ populate_animations
144
+ else
145
+ @scene_object = MockObject.new
146
+ end
147
+ end
148
+ # This is overriden from ShatteredSupport's extension to Object
149
+ # missing alias's
150
+ def method_defined?( method )
151
+ return (super(method) or @animations.include?(method))
152
+ end
153
+
154
+ # Access a given animation. Returns nil on failure.
155
+ def animation( animation )
156
+ return @animations[animation]
157
+ end
158
+
159
+
160
+ private
161
+
162
+ # populate_animations queries ShatteredOgre and adds the found animations to the mesh.
163
+ def populate_animations
164
+ @animations = {}
165
+ (0...@scene_object.getNumberOfAnimations).each do |idx|
166
+ name = @scene_object.getAnimationName(idx)
167
+ @animations[name.downcase.to_sym] = ShatteredView::Animation.new(@scene_object, name)
168
+ end
169
+ end
170
+
171
+
172
+ end
173
+ end
174
+ end
data/lib/node.rb ADDED
@@ -0,0 +1,69 @@
1
+ module ShatteredView
2
+ class Node
3
+
4
+ # Remove the Ogre Mesh from the scene
5
+ def remove_from_scene
6
+ @scene_object.removeFromScene
7
+ end
8
+
9
+ def position=( *array )
10
+ array = array[0] if(array.length == 1)
11
+ @scene_object.setPosition array.to_v3
12
+ end
13
+
14
+ # uses #look_at
15
+ def looking_at=( *look_toward )
16
+ look_toward = look_toward[0] if(look_toward.length == 1)
17
+ look_at(look_toward)
18
+ end
19
+
20
+ def position
21
+ @scene_object.getPosition.to_v
22
+ end
23
+
24
+ # look_at a Vector, Mesh, or Actor.
25
+ def look_at( position )
26
+ position = position.position unless position.is_a?(ShatteredOgre::Vector3) || position.is_a?(Vector) || position.is_a?(Array)
27
+ position = position.to_v3 unless position.is_a?(ShatteredOgre::Vector3)
28
+ @scene_object.lookAt(position)
29
+ # raise ArgumentError, "#{position.inspect} is not a Mesh, Actor, or Vector."
30
+ end
31
+
32
+ # rotate along axis, degrees amount
33
+ def rotate( axis, degrees )
34
+ axis = axis.to_v.normalize
35
+ @scene_object.rotate(axis.to_v3, degrees)
36
+ end
37
+
38
+ def rotation=(axis, degrees)
39
+ rotate axis, degrees
40
+ end
41
+
42
+ def scale=(*scale)
43
+ scale = scale[0] if scale.length == 1
44
+ scale = [scale, scale, scale].to_v if scale.kind_of?(Numeric)
45
+ scale = scale.to_v
46
+
47
+ @scene_object.scale scale.to_v3
48
+ end
49
+
50
+ def scale(amount)
51
+ amount = amount.to_v3 unless amount.is_a? Fixnum
52
+ @scene_object.scale amount
53
+ end
54
+
55
+ def material=( material )
56
+ if material.is_a? RMaterial
57
+ @scene_object.generateTangents if material.tangent_space
58
+ material = material.name
59
+ end
60
+ @scene_object.setMaterial(material.to_s)
61
+ end
62
+
63
+ def visible=(visible)
64
+ @scene_object.setVisible(visible)
65
+ end
66
+
67
+
68
+ end
69
+ end
data/lib/resources.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'singleton'
2
2
 
3
-
4
3
  module ShatteredView
5
4
  # Resource Handler is the ruby binding around Ogre's resource handler
6
5
  # It provides all types of shortcuts for finding files and adding new paths.
@@ -15,10 +14,10 @@ module ShatteredView
15
14
 
16
15
  def add_resource_paths(*paths)
17
16
  paths.each do |path|
18
- path = SHATTERED_ROOT + path
17
+ path = SHATTERED_ROOT + "/"+path
19
18
  @resource_paths << path
20
19
  each_directory_in_path(path) do |sub_path|
21
- ShatteredOgre::ResourceHandler.getSingleton.addResourcePath(sub_path)
20
+ ShatteredOgre::ResourceHandler.getSingleton.addResourcePath(sub_path)
22
21
  end
23
22
  end
24
23
  end
@@ -30,34 +29,19 @@ module ShatteredView
30
29
  # This is useful for any extension wanting to load resource files:
31
30
  #
32
31
  # Usage:
33
- # ResourceHandler.instance.find_files_by_extensions("ogg","mp3","wav")
32
+ # Resources.instance.find_files_by_extensions("ogg","mp3","wav")
34
33
  def find_files_by_extensions(*extensions)
35
- reg_exp = /\.(#{extensions.join("|")})$/
36
- files = []
37
- @resource_paths.each do |path|
38
- each_file_in_path(path) do |filename|
39
- files << filename if filename =~ reg_exp
40
- end
41
- end
42
- return files
34
+ File.find_by_extensions(@resource_paths,*extensions)
43
35
  end
44
36
 
45
- def each_file_in_path(path)
46
- each_directory_in_path do |directory|
47
- Dir.foreach( directory ) do |filename|
48
- resource = directory + "/#{filename}"
49
- yield(resource) if File.file? resource
50
- end
51
- end
37
+ # This is deprecated in favor of File.each_in_path
38
+ def each_file_in_path(path, &block)
39
+ File.each_in_path(path, &block)
52
40
  end
53
41
 
54
- def each_directory_in_path(path,&block)
55
- Dir.foreach(path) do |directory|
56
- next if directory =~ /\..*/
57
- full_path = "#{path}/#{directory}"
58
- yield full_path
59
- each_directory_in_path(full_path, &block)
60
- end
42
+ # This is deprecated in favor of Dir.each_in_path
43
+ def each_directory_in_path(path,&block)
44
+ Dir.each_in_path(path, &block)
61
45
  end
62
46
  end
63
47
  end
data/lib/runner.rb CHANGED
@@ -1,12 +1,36 @@
1
+ require 'erb'
1
2
 
2
3
  module ShatteredView
3
4
  class Runner
4
5
  def initialize(options = {})
6
+ generate_plugin_config
5
7
  Resources.instance.add_resource_paths("/app/views", "/media")
6
8
  @renderer = ShatteredOgre::Renderer.new
7
9
  raise Error, "Renderer failed to initialize Ogre" if @renderer.failed
8
10
  @scene = ShatteredOgre::Scene.new(translate_to_scene_type(options[:scene_manager]))
9
11
  end
12
+ def generate_plugin_config
13
+ plugin_directory = SHATTERED_ROOT+"/config/"
14
+ generated_plugin = plugin_directory+ "plugins."
15
+ generator = plugin_directory + "ogre_plugins.rcfg"
16
+ if PLATFORM =~ /mswin/
17
+ generated_plugin += "win32"
18
+ elsif PLATFORM =~ /darwin/
19
+ generated_plugin += "darwin"
20
+ else
21
+ generated_plugin += "linux"
22
+ end
23
+ process_plugin(generator, generated_plugin+".cfg")
24
+ end
25
+ def process_plugin(base, generate_to)
26
+ puts "Generating #{generate_to} from #{base}, #{File.exists?(base)}"
27
+ return unless File.exists?(base)
28
+ generated_banner = "\n\r//=== This file is generated. Modify the .rcfg instead. ===\n\r\n\r"
29
+ to_write = generated_banner + ERB.new(File.open(base,"r").read).result + generated_banner
30
+ output = File.open(generate_to, "w")
31
+ output.syswrite(to_write)
32
+ output.close
33
+ end
10
34
  def translate_to_scene_type( symbol )
11
35
  return ShatteredOgre::Scene::Generic if(symbol == :general)
12
36
  return ShatteredOgre::Scene::Terrain if(symbol == :terrain)
@@ -1,22 +1,23 @@
1
- require "active_support"
2
1
  ["shattered_support","shattered_ogre"].each do |dependency|
3
2
  begin
4
- # require File.dirname(__FILE__)+"/../../#{dependency}/lib/#{dependency}"
5
- #shattered_ogre is not getting included????
6
3
  require dependency
7
- rescue MissingSourceFile
4
+ rescue LoadError => e
8
5
  require 'rubygems'
9
6
  require dependency
10
7
  end
11
8
  end
12
9
 
10
+ raise( ShatteredSupport::Error, "Could not find ShatteredOgre (a ShatteredView dependency)" ) if not defined? ShatteredOgre
11
+
12
+ require 'rubygems'
13
+ require "active_support"
13
14
 
14
- require File.dirname(__FILE__) + '/animation'
15
15
  require File.dirname(__FILE__) + '/utilities'
16
- require File.dirname(__FILE__) + '/mesh'
16
+ require File.dirname(__FILE__) + '/node'
17
17
  require File.dirname(__FILE__) + '/camera'
18
18
  require File.dirname(__FILE__) + '/extensions'
19
19
  require File.dirname(__FILE__) + '/runner'
20
- require File.dirname(__FILE__) + '/base'
21
20
  require File.dirname(__FILE__) + '/rmaterial'
22
- require File.dirname(__FILE__) + '/resource_handler'
21
+ #require File.dirname(__FILE__) + '/particle_system'
22
+ require File.dirname(__FILE__) + '/base'
23
+ require File.dirname(__FILE__) + '/resources'
data/lib/utilities.rb CHANGED
@@ -1,58 +1,7 @@
1
-
2
- class Array
3
- def shuffle; sort_by {rand}; end
4
- def to_v;
5
- raise StandardError, "vector #{self.inspect} does not have 3 elements" if self.length < 3
6
- return Vector3.new(self[0],self[1],self[2]);
7
- end
8
- end
9
-
10
1
  module ShatteredView
11
- class Vector < Array
12
- def initialize(*args)
13
- raise ArgumentError, "Vector takes three inputs on initialize" if args.length != 3
14
- args.each { |value| self << value }
15
- end
16
- def +(args)
17
- return (self.to_v + args.to_v).to_a
18
- end
19
- def -(args)
20
- return (self.to_v - args.to_v).to_a
21
- end
22
- def *(value)
23
- return (self.to_v*value).to_a
24
- end
25
- def x
26
- self[0]
27
- end
28
- def y
29
- self[1]
30
- end
31
- def z
32
- self[2]
33
- end
34
- # def x=(ix)
35
- # self[0] = ix
36
- # end
37
- # def y=(iy)
38
- # self[1] = iy
39
- # end
40
- # def z=(iz)
41
- # self[2] = iz
42
- # end
43
- end
44
2
  class MockObject
45
3
  def method_missing(sym, *args)
46
4
  MockObject.new
47
5
  end
48
6
  end
49
-
50
-
51
- # class Vector3
52
- # def to_s
53
- # return "(#{x},#{y},#{z})"
54
- # end
55
- # end
56
-
57
-
58
7
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: shattered_view
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.3"
7
- date: 2006-04-28 00:00:00 -05:00
6
+ version: 0.3.1
7
+ date: 2006-05-16
8
8
  summary: "Shattered View: Manipulates OGRE in a ruby-esque fashion."
9
9
  require_paths:
10
- - lib
10
+ - lib
11
11
  email:
12
12
  homepage: http://www.hastilymade.com
13
13
  rubyforge_project:
@@ -18,39 +18,32 @@ bindir: bin
18
18
  has_rdoc: "true"
19
19
  required_ruby_version: !ruby/object:Gem::Version::Requirement
20
20
  requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
21
+ -
22
+ - ">"
23
+ - !ruby/object:Gem::Version
24
+ version: 0.0.0
24
25
  version:
25
26
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
27
  authors: []
29
-
30
28
  files:
31
- - lib/animation.rb
32
- - lib/base.rb
33
- - lib/camera.rb
34
- - lib/extensions.rb
35
- - lib/game.rb
36
- - lib/light.rb
37
- - lib/mesh.rb
38
- - lib/resources.rb
39
- - lib/rmaterial.rb
40
- - lib/runner.rb
41
- - lib/shattered_view.rb
42
- - lib/utilities.rb
29
+ - lib/base.rb
30
+ - lib/camera.rb
31
+ - lib/extensions.rb
32
+ - lib/game.rb
33
+ - lib/light.rb
34
+ - lib/node.rb
35
+ - lib/resources.rb
36
+ - lib/rmaterial.rb
37
+ - lib/runner.rb
38
+ - lib/shattered_view.rb
39
+ - lib/utilities.rb
40
+ - lib/mesh/animation.rb
41
+ - lib/mesh/mesh.rb
43
42
  test_files: []
44
-
45
43
  rdoc_options: []
46
-
47
44
  extra_rdoc_files: []
48
-
49
45
  executables: []
50
-
51
46
  extensions: []
52
-
53
47
  requirements:
54
- - Shattered View is reliant on OGRE.
55
- dependencies: []
56
-
48
+ - Shattered View is reliant on OGRE.
49
+ dependencies: []
data/lib/mesh.rb DELETED
@@ -1,79 +0,0 @@
1
-
2
- module ShatteredView
3
- class Mesh
4
- def remove_from_scene
5
- @scene_object.removeFromScene
6
- end
7
- def initialize( options = {} )
8
- if options[:test] != true
9
- puts "Loading Mesh: #{@scene_object} from #{options[:file]}.mesh"
10
- @scene_object = Scene.getSingleton.createMesh( Vector3.new(0,0,0), "#{options[:file]}.mesh" )
11
- populate_animations
12
- else
13
- @scene_object = MockObject.new
14
- end
15
- end
16
- def populate_animations
17
- @animations = {}
18
- (0...@scene_object.getNumberOfAnimations).each do |idx|
19
- name = @scene_object.getAnimationName(idx)
20
- @animations[name.downcase.to_sym] = ShatteredView::Animation.new(@scene_object, name)
21
- end
22
- end
23
- def position=( *array )
24
- array = array[0] if(array.length == 1)
25
- @scene_object.setPosition array.to_v
26
- end
27
- def looking_at=( *look_toward )
28
- look_toward = look_toward[0] if(look_toward.length == 1)
29
- look_at(look_toward)
30
- end
31
- def position
32
- @scene_object.getPosition.to_a
33
- end
34
- def look_at( position )
35
- if position.is_a?(Array)
36
- @scene_object.lookAt(position.to_v)
37
- elsif position.is_a?(ShatteredOgre::Vector3)
38
- @scene_object.lookAt(position)
39
- elsif(position.is_a?(Mesh) || position.is_a?(Actor))
40
- @scene_object.lookAt(position.position.to_v)
41
- elsif position.is_a?(ShatteredOgre::Vector3)
42
- else
43
- raise ArgumentError, "#{position.inspect} is not a Mesh, Actor, or Vector."
44
- end
45
- end
46
- def rotate( axis, degrees )
47
- @scene_object.rotate(axis.to_v, degrees)
48
- end
49
- def rotation=(axis, degrees)
50
- rotate axis, degrees
51
- end
52
- def animation( animation )
53
- return @animations[animation]
54
- end
55
- def scale=( *scale )
56
- if(scale.length == 1)
57
- scale=scale[0]
58
- @scene_object.scale( [scale,scale,scale].to_v )
59
- else
60
- @scene_object.scale( scale.to_v )
61
- end
62
- end
63
- def material=( material )
64
- if material.is_a? RMaterial
65
- @scene_object.generateTangents if material.tangent_space
66
- material = material.name
67
- end
68
- @scene_object.setMaterial(material.to_s)
69
- end
70
- def visible=(visible)
71
- @scene_object.setVisible(visible)
72
- end
73
- # This is overriden from ShatteredSupport's extension to Object
74
- # missing alias's
75
- def method_defined?( method )
76
- return (super(method) or @animations.include?(method))
77
- end
78
- end
79
- end