shattered_view 0.3 → 0.3.1

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