shattered_support 0.3.1 → 0.3.2
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 +81 -28
- data/lib/runner.rb +3 -6
- data/lib/shattered_support.rb +5 -3
- data/lib/timer/timed_event.rb +1 -1
- data/lib/timer/timer.rb +1 -1
- data/lib/vector.rb +49 -15
- metadata +2 -2
data/lib/base.rb
CHANGED
@@ -2,10 +2,11 @@
|
|
2
2
|
$:.unshift(File.dirname(__FILE__)) unless
|
3
3
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
4
4
|
|
5
|
+
require 'active_support'
|
5
6
|
require 'timer/timer'
|
6
7
|
require 'vector'
|
7
8
|
|
8
|
-
module ShatteredSupport
|
9
|
+
module ShatteredSupport #:nodoc:
|
9
10
|
|
10
11
|
BEFORE_INIT_CALL_VALUES = :before_init_call_values
|
11
12
|
BEFORE_INIT_SET_VALUES = :before_init_set_values
|
@@ -16,30 +17,60 @@ module ShatteredSupport
|
|
16
17
|
base.extend(ClassMethods)
|
17
18
|
end
|
18
19
|
module ClassMethods
|
20
|
+
# In the pre_initialization phase (see #before_init_call), send an object a bunch of sets.
|
21
|
+
#
|
22
|
+
# This is used in actor, camera, mesh, and virtually everywhere to support the format of:
|
23
|
+
# mesh "ruby", :position => v(1,0,0)
|
24
|
+
#
|
25
|
+
# becomes
|
26
|
+
# before_init_set( :ruby, {:position => v(1,0,0) } )
|
27
|
+
# becomes
|
28
|
+
# ruby.position=v(1,0,0)
|
29
|
+
# when the obect is initialized.
|
19
30
|
def before_init_set(variable, options={})
|
20
31
|
self.write_inheritable_array(BEFORE_INIT_SET_VALUES, [[ variable, options ]] )
|
21
32
|
end
|
22
33
|
|
34
|
+
# All shattered objects have a pre_initialization phase. Use this to specify that
|
35
|
+
# a function should be called when the object is created.
|
36
|
+
#
|
37
|
+
# _Example_:
|
38
|
+
# class BulletModel < ShatteredModel::Base
|
39
|
+
# before_init_call(:calculate_trajectory, v(0,0,0), v(0,0,1))
|
40
|
+
# def calculate_trajectory
|
41
|
+
# #called before initialize is
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
23
45
|
def before_init_call(function, *arguments)
|
24
46
|
self.write_inheritable_array(BEFORE_INIT_CALL_VALUES, [[function, [*arguments]]])
|
25
47
|
end
|
26
48
|
end
|
27
49
|
class Base
|
28
|
-
|
50
|
+
|
51
|
+
# This is overwritten to allow for a pre_initialize before initialize
|
52
|
+
def self.new(*options) #:nodoc
|
29
53
|
new_base = allocate
|
30
54
|
new_base.pre_initialize
|
31
55
|
new_base.send(:initialize, *options)
|
32
56
|
return new_base
|
33
57
|
end
|
34
|
-
|
58
|
+
|
59
|
+
# Retrieve the current state
|
60
|
+
def state
|
35
61
|
Configuration.environment[:state]
|
36
62
|
end
|
37
|
-
|
63
|
+
|
64
|
+
# This function is called after an object is allocated, but before it's initialized.
|
65
|
+
#
|
66
|
+
# See ShatteredSupport::ClassMethods#before_init_call for usage.
|
67
|
+
def pre_initialize #:nodoc:
|
38
68
|
pre_initialize_set
|
39
69
|
pre_initialize_call
|
40
70
|
end
|
41
71
|
|
42
|
-
|
72
|
+
# Used in pre_initialize
|
73
|
+
def each_init_value(name) #:nodoc:
|
43
74
|
startup_attributes = self.class.read_inheritable_attribute( name ) || []
|
44
75
|
startup_attributes.each do |actor, options|
|
45
76
|
next if options.nil?
|
@@ -47,24 +78,23 @@ module ShatteredSupport
|
|
47
78
|
end
|
48
79
|
end
|
49
80
|
|
50
|
-
|
81
|
+
# Used in pre_initialize for before_init_set
|
82
|
+
def pre_initialize_set #:nodoc:
|
51
83
|
each_init_value(BEFORE_INIT_SET_VALUES) do |variable, options|
|
52
84
|
call_object_function_for_each_key( variable, options )
|
53
85
|
end
|
54
|
-
# self.class.write_inheritable_attribute(BEFORE_INIT_SET_VALUES, nil)
|
55
86
|
end
|
56
87
|
|
57
|
-
|
88
|
+
# Used in pre_initialize for before_init_call
|
89
|
+
def pre_initialize_call #:nodoc:
|
58
90
|
each_init_value(BEFORE_INIT_CALL_VALUES) do |function, args|
|
59
91
|
call_object_function( :self, function, args )
|
60
92
|
end
|
61
|
-
# self.class.write_inheritable_attribute(BEFORE_INIT_CALL_VALUES, nil)
|
62
93
|
end
|
63
94
|
|
64
95
|
|
65
|
-
#
|
66
|
-
|
67
|
-
def update_event(time_elapsed)
|
96
|
+
# TODO - is this called anymore?
|
97
|
+
def update_event(time_elapsed) #:nodoc:
|
68
98
|
actors.each do |actor|
|
69
99
|
actor.update_actors(time_elapsed)
|
70
100
|
actor.update(time_elapsed)
|
@@ -72,25 +102,25 @@ module ShatteredSupport
|
|
72
102
|
end
|
73
103
|
|
74
104
|
# remove_from_scene? should just be defined in model.
|
75
|
-
# Refactor?
|
76
|
-
def remove_from_scene?
|
105
|
+
# Refactor? TODO
|
106
|
+
def remove_from_scene? #:nodoc:
|
77
107
|
return false
|
78
108
|
end
|
79
109
|
|
80
|
-
|
110
|
+
# TODO outdated?
|
111
|
+
def update_actors(time_elapsed) #:nodoc:
|
81
112
|
update_event time_elapsed
|
82
113
|
remove_dead_actors
|
83
114
|
end
|
84
115
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
def remove_dead_actors
|
116
|
+
# TODO outdated?
|
117
|
+
def remove_dead_actors #:nodoc:
|
89
118
|
actors.each do |actor|
|
90
119
|
remove_from_scene actor if actor.remove_from_scene?
|
91
120
|
end
|
92
121
|
end
|
93
|
-
|
122
|
+
|
123
|
+
# TODO outdated?
|
94
124
|
def remove_from_scene(actor)
|
95
125
|
actors.delete actor
|
96
126
|
actor.unload!
|
@@ -103,6 +133,7 @@ module ShatteredSupport
|
|
103
133
|
call_object_function actor, "#{action}=", params
|
104
134
|
end
|
105
135
|
end
|
136
|
+
|
106
137
|
def call_object_function(actor, action, params)
|
107
138
|
begin
|
108
139
|
if params.is_a? Symbol #|| (params.length == 1 && params[0].is_a?(Symbol)) this will allow substitution in before_init_call. This may not be intended behavior.
|
@@ -121,40 +152,62 @@ module ShatteredSupport
|
|
121
152
|
raise bang
|
122
153
|
end
|
123
154
|
end
|
124
|
-
def unload!
|
125
|
-
end
|
126
155
|
|
127
156
|
public
|
128
157
|
|
129
|
-
# attr helpers.
|
158
|
+
# attr helpers. These are instance level attr_* functions.
|
130
159
|
def attr_reader(*args)
|
131
160
|
name, value = args
|
132
161
|
attr_define(:reader, name, value)
|
133
162
|
end
|
134
|
-
|
163
|
+
|
164
|
+
# attr helpers. These are instance level attr_* functions.
|
165
|
+
# attr_writer accepts a value as the second argument
|
135
166
|
def attr_writer(*args)
|
136
167
|
name, value = args
|
137
168
|
attr_define(:writer, name, value)
|
138
169
|
end
|
139
170
|
|
171
|
+
# attr helpers. These are instance level attr_* functions.
|
172
|
+
# attr_accessor accepts a value as the second argument
|
140
173
|
def attr_accessor(*args)
|
141
174
|
name, value = args
|
142
175
|
attr_define(:accessor, name, value)
|
143
176
|
end
|
144
177
|
|
178
|
+
# Define a block to execute when an object is unloaded.
|
179
|
+
def when_unloaded(&block)
|
180
|
+
@unloaded_events ||= []
|
181
|
+
@unloaded_events << block
|
182
|
+
end
|
183
|
+
|
145
184
|
protected
|
146
185
|
|
147
186
|
def attr_define(accessor_level, name, value)
|
148
|
-
self.class.send(
|
149
|
-
instance_variable_set(
|
187
|
+
self.class.send("attr_#{accessor_level}".to_sym, "#{name}".to_sym)
|
188
|
+
instance_variable_set("@#{name}".to_sym, value) if !value.nil?
|
189
|
+
end
|
190
|
+
|
191
|
+
private
|
192
|
+
|
193
|
+
def disabled?
|
194
|
+
@unloaded_events == nil
|
195
|
+
end
|
196
|
+
|
197
|
+
def unload!
|
198
|
+
return if disabled?
|
199
|
+
@unloaded_events.each do |event|
|
200
|
+
event.call
|
201
|
+
end
|
202
|
+
@unloaded_events = nil
|
150
203
|
end
|
151
204
|
|
152
205
|
end
|
153
206
|
|
154
|
-
class Error < StandardError
|
207
|
+
class Error < StandardError # :nodoc:
|
155
208
|
end
|
156
209
|
|
157
|
-
class RetossError < StandardError
|
210
|
+
class RetossError < StandardError # :nodoc:
|
158
211
|
attr_accessor :message
|
159
212
|
def initialize(error, message)
|
160
213
|
self.message = message
|
data/lib/runner.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
module ShatteredSupport
|
2
|
-
class Configuration
|
2
|
+
class Configuration #:nodoc:
|
3
3
|
def self.environment
|
4
|
-
|
5
|
-
|
6
|
-
rescue NameError
|
7
|
-
return {}
|
8
|
-
end
|
4
|
+
@@environment={} unless defined? @@environment
|
5
|
+
return @@environment
|
9
6
|
end
|
10
7
|
def self.environment=(environment)
|
11
8
|
@@environment=environment
|
data/lib/shattered_support.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'active_support'
|
3
2
|
|
4
3
|
class Object
|
5
4
|
def method_defined?(method)
|
6
5
|
return self.class.method_defined?(method)
|
7
6
|
end
|
8
7
|
|
8
|
+
# This is a shorthand to define vector object coordinates.
|
9
|
+
#
|
10
|
+
# Creates a vector object at coordinates x,y,z
|
9
11
|
def v(x, y, z)
|
10
12
|
Vector.new(x, y, z)
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
|
-
class File
|
16
|
+
class File #:nodoc:
|
15
17
|
# File.each_in_path will recursively look for all files, starting at the given path.
|
16
18
|
# It will yield with each result.
|
17
19
|
def self.each_in_path(path)
|
@@ -46,7 +48,7 @@ class File
|
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
49
|
-
class Dir
|
51
|
+
class Dir #:nodoc:
|
50
52
|
# Dir.each_in_path will recursively yield all non-hidden directories from the given path.
|
51
53
|
def self.each_in_path(path, &block)
|
52
54
|
return unless File.directory? path
|
data/lib/timer/timed_event.rb
CHANGED
data/lib/timer/timer.rb
CHANGED
data/lib/vector.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
class Array
|
2
|
+
class Array #:nodoc:
|
3
3
|
# Vector extensions for array. Allows for coersion of a 3 element Array into a vector.
|
4
4
|
|
5
5
|
# Randomize the order of an array
|
@@ -26,26 +26,33 @@ class Array
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
module ShatteredSupport
|
29
|
+
module ShatteredSupport #:nodoc:
|
30
|
+
# Vector is a three dimensional array, that allows for various operations on itself.
|
31
|
+
# To create a vector, use the shorthand:
|
32
|
+
# v(0,0,0) # Creates a zero vector
|
30
33
|
class Vector
|
31
34
|
|
32
35
|
attr_reader :x, :y, :z
|
33
36
|
|
34
|
-
# Create a new Vector object. It requires exactly 3 arguments: x, y and z.
|
37
|
+
# Create a new Vector object. It requires exactly 3 arguments: x, y and z. Any value that
|
38
|
+
# can be converted to a float is acceptable.
|
39
|
+
#
|
40
|
+
# *NOTE:* The recomended way to create Vector objects is to use the <tt>v(1,2,3)</tt> shorthand.
|
35
41
|
def initialize(x_val, y_val, z_val)
|
36
|
-
@x, @y, @z = x_val
|
42
|
+
@x, @y, @z = [x_val, y_val, z_val].collect(&:to_f)
|
37
43
|
end
|
38
44
|
|
39
|
-
# Iterate through x, y and z with a
|
45
|
+
# Iterate through x, y and z with a block. The passed value is the value of each component of
|
46
|
+
# the vector.
|
40
47
|
def each(&block)
|
41
|
-
self.to_a.each do |
|
42
|
-
yield
|
48
|
+
self.to_a.each do |component|
|
49
|
+
yield component
|
43
50
|
end
|
44
51
|
end
|
45
52
|
|
46
53
|
# Returns this Vector as an Ogre vector object: Vector3. Should only be used internally by
|
47
54
|
# Shattered to communicate with the Ogre engine.
|
48
|
-
def to_v3
|
55
|
+
def to_v3 # :nodoc:
|
49
56
|
ShatteredOgre::Vector3.new @x, @y, @z
|
50
57
|
end
|
51
58
|
|
@@ -54,14 +61,14 @@ module ShatteredSupport
|
|
54
61
|
self
|
55
62
|
end
|
56
63
|
|
57
|
-
# Returns an array with x, y and z dumped into its elements
|
58
|
-
#
|
59
|
-
# Vector.new(1, 2, 3).to_a #=> [1, 2, 3]
|
64
|
+
# Returns an array with x, y and z dumped into its elements.
|
65
|
+
# v(1, 2, 3).to_a #=> [1.0, 2.0, 3.0]
|
60
66
|
def to_a
|
61
67
|
[@x, @y, @z]
|
62
68
|
end
|
63
69
|
|
64
70
|
# Add 2 Vectors together.
|
71
|
+
# v(1,1,1) + v(1,2,3) #=> v(2,3,4)
|
65
72
|
def +(*args)
|
66
73
|
vector = convert_args_to_vector(args)
|
67
74
|
Vector.new(
|
@@ -71,7 +78,8 @@ module ShatteredSupport
|
|
71
78
|
)
|
72
79
|
end
|
73
80
|
|
74
|
-
# Subtract one Vector
|
81
|
+
# Subtract one Vector from another.
|
82
|
+
# v(1,2,3) - v(1,1,1) #=> v(0,1,2)
|
75
83
|
def -(args)
|
76
84
|
vector = convert_args_to_vector(args)
|
77
85
|
Vector.new(
|
@@ -82,6 +90,7 @@ module ShatteredSupport
|
|
82
90
|
end
|
83
91
|
|
84
92
|
# Multiply all components of a vector by a scalar amount.
|
93
|
+
# v(1,2,3) * 3 #=> v(3,6,9)
|
85
94
|
def *(value)
|
86
95
|
result = []
|
87
96
|
each do |i|
|
@@ -91,6 +100,7 @@ module ShatteredSupport
|
|
91
100
|
end
|
92
101
|
|
93
102
|
# Divide all components of a vector by a scalar amount
|
103
|
+
# v(5,10,15) / 5 #=> v(1,2,3)
|
94
104
|
def /(value)
|
95
105
|
result = Array.new
|
96
106
|
self.each do |i|
|
@@ -100,18 +110,25 @@ module ShatteredSupport
|
|
100
110
|
end
|
101
111
|
|
102
112
|
# Returns this Vector but normalized to a length of 1.
|
113
|
+
# v(9, 0, 0).normalize #=> v(1,0,0)
|
103
114
|
def normalize
|
104
115
|
self * (1 / length)
|
105
116
|
end
|
106
117
|
alias_method :normalise, :normalize
|
107
118
|
|
108
|
-
# Same as #normalize but
|
119
|
+
# Same as #normalize but modifies the receiver in place.
|
109
120
|
def normalize!
|
110
121
|
@x, @y, @z = normalize.to_a
|
111
122
|
end
|
112
123
|
alias_method :normalise!, :normalize!
|
113
124
|
|
114
|
-
# Return the value specified by bracket notation.
|
125
|
+
# Return the value specified by bracket notation. Integers, Symbols or Strings
|
126
|
+
# are accepted as keys.
|
127
|
+
#
|
128
|
+
# vector = v(1,2,3)
|
129
|
+
# vector[:x] #=> 1
|
130
|
+
# vector['y'] #=> 2
|
131
|
+
# vector[2] #=> 3
|
115
132
|
def [](index)
|
116
133
|
case
|
117
134
|
when index == 0 || index == :x || index == 'x'
|
@@ -123,7 +140,8 @@ module ShatteredSupport
|
|
123
140
|
end
|
124
141
|
end
|
125
142
|
|
126
|
-
# Set the value specified by bracket notation.
|
143
|
+
# Set the value specified by bracket notation. Accepts the same keys as the #[]
|
144
|
+
# method.
|
127
145
|
def []=(index, value)
|
128
146
|
case
|
129
147
|
when index == 0 || index == :x || index == 'x'
|
@@ -135,28 +153,44 @@ module ShatteredSupport
|
|
135
153
|
end
|
136
154
|
end
|
137
155
|
|
156
|
+
# Set the value of the X component.
|
138
157
|
def x=(value)
|
139
158
|
@x = value.to_f
|
140
159
|
end
|
141
160
|
|
161
|
+
# Set the value of the Y component.
|
142
162
|
def y=(value)
|
143
163
|
@y = value.to_f
|
144
164
|
end
|
145
165
|
|
166
|
+
# Set the value of the Z component.
|
146
167
|
def z=(value)
|
147
168
|
@z = value.to_f
|
148
169
|
end
|
149
170
|
|
150
171
|
|
151
172
|
# Returns the length of this vector.
|
173
|
+
# v(0,0,7).length #=> 7
|
152
174
|
def length
|
153
175
|
Math.sqrt(x**2 + y**2 + z**2)
|
154
176
|
end
|
155
177
|
|
178
|
+
# Converts the vector into an easily identifiable form. Mostly used for debugging
|
179
|
+
# and console output.
|
180
|
+
# v(1,2,3).to_s #=> "#<Vector [1.0, 2.0, 3.0]>"
|
156
181
|
def to_s
|
157
182
|
"#<Vector [#@x, #@y, #@z]>"
|
158
183
|
end
|
159
184
|
|
185
|
+
# Equality test. This method will return true if all components of both vectors are
|
186
|
+
# indentical.
|
187
|
+
def ==(vector)
|
188
|
+
vector.kind_of?(Vector) &&
|
189
|
+
x == vector.x &&
|
190
|
+
y == vector.y &&
|
191
|
+
z == vector.z
|
192
|
+
end
|
193
|
+
|
160
194
|
private
|
161
195
|
|
162
196
|
def convert_args_to_vector(*args)
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
|
|
3
3
|
specification_version: 1
|
4
4
|
name: shattered_support
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.3.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.3.2
|
7
|
+
date: 2006-06-04
|
8
8
|
summary: "Shattered Support: Allows a common derivation point for shattered MVC."
|
9
9
|
require_paths:
|
10
10
|
- lib
|