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,76 @@
1
+ module Ogre
2
+ module NodeMovements
3
+ def self.redefine_methods(c)
4
+ c.class_eval do
5
+ # Node delegates
6
+ {
7
+ :position => :get_position,
8
+ :position= => :set_position,
9
+ :direction= => :set_direction,
10
+ :orientation= => :set_orientation,
11
+ :orientation => :get_orientation,
12
+ :translate! => :translate,
13
+ }.each do |method, delegate|
14
+ define_method(method) do |*args|
15
+ send(delegate, *args)
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+
23
+ NodeMovements.redefine_methods(SceneNode)
24
+ NodeMovements.redefine_methods(Camera)
25
+
26
+ class SceneNode
27
+ alias_method :raw_rotate, :rotate
28
+
29
+ # rotate works in degrees by default, and in the TS_lOCAL space
30
+ def rotate(axis, amount, *args)
31
+ if(args.empty?)
32
+ raw_rotate(axis.to_v, Radian.new(Degree.new(amount)))
33
+ else
34
+ raw_rotate(axis.to_v, Radian.new(Degree.new(amount)), args[0])
35
+ end
36
+ end
37
+
38
+ alias_method :raw_look_at, :look_at
39
+
40
+ # Look at an object
41
+ # This function is different than the one in the Ogre SDK because
42
+ # it defaults to TS_LOCAL as the transform space
43
+ # You can send it a node, mesh, or anything with a position vector
44
+ # Or just a vector
45
+ def look_at(*args)
46
+ transform = Ogre::Node::TS_LOCAL
47
+ transform = args[1] if(args.length == 2)
48
+ v = args[0]
49
+ v = args[0].position if args[0].class.respond_to? :position
50
+ raw_look_at v, transform
51
+ end
52
+
53
+ # scale= works with numbers, vectors, or 3 numbers and is absolute
54
+ def scale=(*args)
55
+ v = args
56
+
57
+ # This handles calling scale=0.5 or some other number
58
+ v = v(v[0], v[0], v[0]) if v[0].is_a? Numeric
59
+
60
+ set_scale(*v)
61
+ end
62
+
63
+ alias_method :raw_scale, :scale
64
+
65
+ #scale works with numbers, vectors, or 3 numbers and is relative
66
+ def scale(*args)
67
+ return get_scale if args.length == 0
68
+ v = args
69
+
70
+ # This handles calling scale=0.5 or some other number
71
+ v = v(v[0], v[0], v[0]) if v[0].is_a? Numeric
72
+
73
+ raw_scale(*v)
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,243 @@
1
+ class Object
2
+ # This is a shorthand to define vector object coordinates.
3
+ #
4
+ # Creates a vector object at coordinates x,y,z
5
+ def v(x, y, z)
6
+ Ogre::Vector3.new(x, y, z)
7
+ end
8
+ end
9
+
10
+ # The following allows multiplication to be written like
11
+ # 10 * v(1,0,0)
12
+ # or
13
+ # 10 * :x
14
+ # implemented for both Float and Fixnum
15
+ class Float
16
+ alias_method :numeric_times, :*
17
+ def *(val)
18
+ unless val.is_a? Numeric
19
+ return val*self
20
+ end
21
+ return numeric_times(val)
22
+ end
23
+ end
24
+
25
+ class Fixnum
26
+ alias_method :numeric_times, :*
27
+ def *(val)
28
+ unless val.is_a? Numeric
29
+ return val*self
30
+ end
31
+ return numeric_times(val)
32
+ end
33
+ end
34
+
35
+ class SymbolToVectorError < StandardError #:nodoc:
36
+ end
37
+
38
+ class Symbol #:nodoc:
39
+ # Vectors in symbol form can be any of the following:
40
+ # :x => v(1,0,0)
41
+ # :y => v(0,1,0)
42
+ # :z => v(0,0,1),
43
+ # :up => v(0,1,0)
44
+ # :down => v(0,-1,0)
45
+ # :left => v(-1,0,0)
46
+ # :right => v(1,0,0)
47
+ # :forward => v(0,0,1)
48
+ # :backward => v(0,0,-1)
49
+ # :zero => v(0,0,0)
50
+ def to_v
51
+ @definitions ||= {:x => v(1,0,0),:y => v(0,1,0),:z => v(0,0,1),
52
+ :up => v(0,1,0),:down => v(0,-1,0),
53
+ :left => v(-1,0,0),:right => v(1,0,0),
54
+ :forward => v(0,0,1),:backward => v(0,0,-1),
55
+ :zero => v(0,0,0)}
56
+ return @definitions[self] unless @definitions[self].nil?
57
+ raise SymbolToVectorError, "Undefined vector for symbol #{self}"
58
+ end
59
+
60
+ # Multiplication defined for vectors carries over to their symbolic equivalence.
61
+ def *(number)
62
+ to_v * number
63
+ end
64
+
65
+ # Addition for vectors
66
+ def +(number)
67
+ to_v + number
68
+ end
69
+
70
+ # Subtraction for vectors
71
+ def -(number)
72
+ to_v - number
73
+ end
74
+
75
+ # Negation for vector symbols
76
+ def -@
77
+ -to_v
78
+ end
79
+ end
80
+
81
+ class Array #:nodoc:
82
+ # Vector extensions for array. Allows for coersion of a 3 element Array into a vector.
83
+
84
+ # Randomize the order of an array
85
+ #
86
+ # [1, 2, 3].shuffle #=> [2, 3, 1]
87
+ #
88
+ def shuffle
89
+ sort_by {rand}
90
+ end
91
+
92
+ # Create a vector from an array.
93
+ #
94
+ # [1, 2, 3].to_v #=> same as Vector.new(1, 2, 3)
95
+ #
96
+ def to_v
97
+ raise StandardError, "vector #{self.inspect} does not have 3 elements" if self.length < 3
98
+ Ogre::Vector3.new self[0], self[1] ,self[2]
99
+ end
100
+ end
101
+
102
+ module Ogre
103
+ # Vector is a three dimensional array, that allows for various operations on itself.
104
+ # To create a vector, use the shorthand:
105
+ # v(0,0,0) # Creates a zero vector
106
+ #
107
+ #
108
+ # *NOTE:* The recomended way to create Vector objects is to use the <tt>v(1,2,3)</tt> shorthand.
109
+
110
+ class Vector3
111
+
112
+
113
+ # Iterate through x, y and z with a block. The passed value is the value of each component of
114
+ # the vector.
115
+ def each(&block)
116
+ [x,y,z].each do |component|
117
+ yield component
118
+ end
119
+ end
120
+
121
+ # Returns self
122
+ def to_v
123
+ self
124
+ end
125
+
126
+ # Returned an array with x, y and z dumped into its elements.
127
+ # v(1, 2, 3).to_a #=> [1.0, 2.0, 3.0]
128
+ # Deprecated because *v(0,0,0) is [0,0,0] (three arguments) and breaks DSLs
129
+ #def to_a
130
+ # raise "Vector#to_a is deprecated. Use vectors as vectors, not as arrays."
131
+ #end
132
+
133
+ # Add 2 Vectors together.
134
+ # v(1,1,1) + v(1,2,3) #=> v(2,3,4)
135
+ alias_method :ogre_plus, :+
136
+ def +(*args)
137
+ v = convert_args_to_vector args
138
+ ogre_plus v
139
+ end
140
+
141
+ # Subtract one Vector from another.
142
+ # v(1,2,3) - v(1,1,1) #=> v(0,1,2)
143
+ alias_method :ogre_minus, :-
144
+ def -(*args)
145
+ v = convert_args_to_vector args
146
+ ogre_minus v
147
+ end
148
+
149
+ # Multiply all components of a vector by a scalar amount.
150
+ # v(1,2,3) * 3 #=> v(3,6,9)
151
+ alias_method :ogre_multiply, :*
152
+ def *(*args)
153
+ #Handle numbers and vectors
154
+ unless args[0].is_a? Symbol
155
+ return ogre_multiply(args[0])
156
+ end
157
+ #Symbol to vector conversion
158
+ v = convert_args_to_vector args
159
+ ogre_multiply v
160
+ end
161
+
162
+
163
+ # Returns this Vector but normalized to a length of 1.
164
+ # v(9, 0, 0).normalize #=> v(1,0,0)
165
+ alias_method :normalize, :normalised_copy
166
+ alias_method :normalise, :normalised_copy
167
+
168
+ # Same as #normalize but modifies the receiver in place.
169
+ alias_method :normalize!, :normalise!
170
+
171
+ # Return the value specified by bracket notation. Integers, Symbols or Strings
172
+ # are accepted as keys.
173
+ #
174
+ # vector = v(1,2,3)
175
+ # vector[:x] #=> 1
176
+ # vector['y'] #=> 2
177
+ # vector[2] #=> 3
178
+ def [](index)
179
+ case
180
+ when index == 0 || index == :x || index == 'x'
181
+ x
182
+ when index == 1 || index == :y || index == 'y'
183
+ y
184
+ when index == 2 || index == :z || index == 'z'
185
+ z
186
+ end
187
+ end
188
+
189
+ # Set the value specified by bracket notation. Accepts the same keys as the #[]
190
+ # method.
191
+ def []=(index, value)
192
+ case
193
+ when index == 0 || index == :x || index == 'x'
194
+ self.x = value.to_f
195
+ when index == 1 || index == :y || index == 'y'
196
+ self.y = value.to_f
197
+ when index == 2 || index == :z || index == 'z'
198
+ self.z = value.to_f
199
+ end
200
+ end
201
+
202
+
203
+ # Converts the vector into an easily identifiable form. Mostly used for debugging
204
+ # and console output.
205
+ # v(1,2,3).to_s #=> "#<Vector [1.0, 2.0, 3.0]>"
206
+ def to_s
207
+ "#<Vector [#{x}, #{y}, #{z}]>"
208
+ end
209
+
210
+ # Equality test. This method will return true if all components of both vectors are
211
+ # indentical.
212
+ def ==(vector)
213
+ vector = vector.to_v if vector.is_a?(Symbol)
214
+ vector.kind_of?(Ogre::Vector3) &&
215
+ x == vector.x &&
216
+ y == vector.y &&
217
+ z == vector.z
218
+ end
219
+
220
+ # Create a unique identifier based on x, y and z.
221
+ def hash
222
+ [x,y,z].hash
223
+ end
224
+
225
+ # Equality test for hash indexes.
226
+ def eql?(other)
227
+ x == other.x && y == other.y && z == other.z
228
+ end
229
+
230
+ private
231
+
232
+ # Convert passed in arguments to vector form.
233
+ # Supports Symbol, Array, and vectors
234
+ def convert_args_to_vector(*args)
235
+ args.flatten!
236
+ if(args.first.is_a?(Ogre::Vector3) || args.first.is_a?(Symbol))
237
+ args.first.to_v
238
+ else
239
+ args.to_v
240
+ end
241
+ end
242
+ end
243
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module Ogre
3
+ class WindowEvents
4
+ alias_method :ogre_on_resize, :on_resize
5
+ alias_method :ogre_on_close, :on_close
6
+ def on_resize(&block)
7
+ ogre_on_resize block
8
+ end
9
+
10
+ def on_close(&block)
11
+ ogre_on_close block
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,64 @@
1
+ require 'singleton'
2
+
3
+ module Shattered
4
+ # Resource Handler is the ruby binding around Ogre's resource handler
5
+ # It provides all types of shortcuts for finding files and adding new paths.
6
+ class Resources
7
+ include Singleton
8
+
9
+ # Instance Methods
10
+ attr_reader :resource_paths
11
+ def initialize
12
+ @resource_paths=[]
13
+ end
14
+
15
+ def add_resource_paths(*paths)
16
+ paths.each do |path|
17
+ next if path.nil?
18
+ path = SHATTERED_ROOT + "/"+path unless path =~ /^\//
19
+
20
+ @resource_paths << path
21
+ each_directory_in_path(path) do |sub_path|
22
+ Ogre::ResourceGroupManager.instance.add_resource_location(sub_path, "FileSystem", "General")
23
+ end
24
+ end
25
+ end
26
+
27
+ # Called once all resource groups have been added
28
+ def setup
29
+ begin
30
+ Ogre::ResourceGroupManager::instance.initialise_all_resource_groups
31
+ rescue StandardError => bang
32
+ puts "WARNING #{bang.message}"
33
+ end
34
+ end
35
+
36
+ def destroy_paths
37
+ @resource_paths = []
38
+ end
39
+
40
+ # This is useful for any extension wanting to load resource files:
41
+ #
42
+ # Usage:
43
+ # Resources.instance.find_files_by_extensions("ogg","mp3","wav")
44
+ def find_files_by_extensions(*extensions)
45
+ File.find_by_extensions(@resource_paths,*extensions)
46
+ end
47
+
48
+ # This is deprecated in favor of File.each_in_path
49
+ def each_file_in_path(path, &block)
50
+ File.each_in_path(path, &block)
51
+ end
52
+
53
+ # This is deprecated in favor of Dir.each_in_path
54
+ def each_directory_in_path(path,&block)
55
+ Dir.each_in_path(path, &block)
56
+ end
57
+
58
+ # find a particular file in the resource paths
59
+ def find_file(filename)
60
+ File.find(@resource_paths, filename)
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,248 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module Shattered #:nodoc:
5
+
6
+ module View
7
+ def self.append_features(base)
8
+ super
9
+ base.extend(ClassMethods)
10
+ base.send(:include, InstanceMethods)
11
+ base.send(:include, PreInitialize)
12
+ base.send(:before_init_call, "setup_variables")
13
+ base.send(:include, Unload)
14
+ end
15
+
16
+ module ClassMethods
17
+ # Meshes are the foundation for your world.
18
+ #
19
+ # They tie in to Ogre's .mesh file format, and display a 3d object onto the screen.
20
+ #
21
+ # class DirtyRubyView
22
+ # mesh "dirty_ruby", :position => v(0,0,1)
23
+ # end
24
+ #
25
+ def mesh(name, options = {})
26
+ before_init_call :dsl_create, :mesh, name, options
27
+ end
28
+
29
+
30
+
31
+ # Any view can create a light.
32
+ # There are 4 types of possible lights.
33
+ # Ambient Light - this type of light lights everything in the scene equally.
34
+ # Example: light :sun, :ambient => [1,1,1]
35
+ #
36
+ # Point Light - this type of light emanates from a point in space and lights all
37
+ # directions equally.
38
+ # Example: light :fireplace, :position => [0,-5,20], :diffuse => [1,0.5,0.5], :specular => [1,0,0], :attenuation => [8000,0,4,0.3]
39
+ # Parameters:
40
+ # position:: the x,y,z position or vector position
41
+ # diffuse:: the r,g,b value of the diffuse color
42
+ # specular:: the r,g,b value of the specular color
43
+ # attenuation:: arguments are range, constant, linear, quadratic
44
+ # range is how far the light will extend
45
+ # constant The constant factor in the attenuation formula: 1.0 means never attenuate, 0.0 is complete attenuation
46
+ # linear The linear factor in the attenuation formula: 1 means attenuate evenly over the distance
47
+ # quadratic The quadratic factor in the attenuation formula: adds a curvature to the attenuation formula.
48
+ #
49
+ # Directional Light - this light is like the positional light, except instead of position it has only direction
50
+ # Example: light :sun, :direction => [0,-1,-1], :diffuse => [1,1,1], :specular => [1,1,1]
51
+ # direction:: the direction light emanates from
52
+ # other:: same as point light above.
53
+ #
54
+ # Note: The following type of light is not currently implemented in shattered.
55
+ # Spotlight - this light has both a direction and a position, as well as other factors.
56
+ # Example: light :flashlight...
57
+
58
+ def light(name, type = nil, options = {})
59
+ before_init_call :dsl_create, :metalight, name, type, options
60
+ end
61
+
62
+ # The following is not yet implemented:
63
+ # Particle systems are defined in .particle files
64
+ # - This works for first order particle systems --
65
+ # - We need to look into second and third order particle systems
66
+ #
67
+ #def particle_system(name, options = {})
68
+ # before_init_call :dsl_create, :particle_system, name
69
+ #end
70
+ end
71
+
72
+ module InstanceMethods
73
+ attr_accessor :controller, :model
74
+ attr_reader :lights, :meshes, :materials
75
+
76
+ def setup_variables
77
+ @lights = []
78
+ on_unload do
79
+ @lights.each { |light| scene_manager.destroy_light(light) }
80
+ @lights = []
81
+ end
82
+
83
+ @materials = []
84
+ on_unload do
85
+ @materials.each { |material| Ogre::MaterialManager.instance.remove(material.name) }
86
+ @materials = []
87
+ end
88
+
89
+ @meshes = []
90
+ on_unload do
91
+ @meshes.each { |mesh| mesh.unload }
92
+ @meshes = []
93
+ end
94
+
95
+ @particle_systems = []
96
+ on_unload do
97
+ @particle_systems.each { |ps| ps.unload }
98
+ end
99
+ end
100
+
101
+ def visible=(visible)
102
+ node.visible=(visible)
103
+ end
104
+
105
+ def rotate(vector, amount)
106
+ node.rotate(vector, amount)
107
+ end
108
+
109
+ def define_accessor(array, new_obj, name)
110
+ instance_eval("#{array} ||= {}")
111
+ instance_eval("#{array}[\"#{name}\"] = new_obj")
112
+
113
+ self.class.class_eval <<-EOF
114
+ define_method(:#{name}) do
115
+ #{array}[\"#{name}\"]
116
+ end
117
+ EOF
118
+ end
119
+
120
+ def dsl_create(type, *args)
121
+ name = args[0]
122
+ options = args[-1]
123
+ object = create(type, *args)
124
+
125
+ # Create an accessor for the object
126
+ self.class.send(:define_method, name) do
127
+ object
128
+ end
129
+ call_object_function_for_each_key(object, options)
130
+ end
131
+
132
+ # The method of creating new view objects,
133
+ # IE: create(:light)
134
+ # or create :mesh, :ogre
135
+ # or create :material, :basic, :texture => "blank.jpg"
136
+ def create(type, *args)
137
+ return self.send(:"create_#{type}", *args)
138
+ end
139
+
140
+
141
+ def position
142
+ node.position
143
+ end
144
+
145
+ def position=(val)
146
+ node.position = val
147
+ end
148
+
149
+ def translate(v)
150
+ node.translate(v)
151
+ end
152
+
153
+ def node
154
+ @scene_node ||= scene_manager.root_scene_node.create_child_scene_node
155
+ end
156
+
157
+ def scene_manager
158
+ Game.instance.scene_manager
159
+ end
160
+
161
+ private
162
+ #Called from the meta function
163
+ def create_metalight(name, *args)
164
+ create_light(*args)
165
+ end
166
+
167
+ #Create a light and add it to the lights array
168
+ def create_light(type = nil, options = {})
169
+ @@unnamed_light_index ||= -1
170
+ light = scene_manager.create_light("#{self.to_s}.light(#{@@unnamed_light_index+=1})")
171
+
172
+ if type == :spotlight
173
+ light.set_type Ogre::Light::LT_POINT
174
+ elsif type == :directional
175
+ light.set_type Ogre::Light::LT_DIRECTIONAL
176
+ elsif type == :point
177
+ light.set_type Ogre::Light::LT_POINT
178
+ elsif type != nil
179
+ raise Exception.new("Invalid light type '#{type}'")
180
+ end
181
+
182
+ light.scene_manager = scene_manager
183
+
184
+ @lights << light
185
+ return light
186
+ end
187
+
188
+ #Creates a mesh and adds it to the mesh array
189
+ def create_mesh(name, options={})
190
+ mesh = Ogre::MeshInstance.new(node, scene_manager, name.to_s+".mesh")
191
+ @meshes << mesh
192
+ return mesh
193
+ end
194
+
195
+ #Create a node using the view's node as a parent
196
+ def create_node(options={})
197
+ node.create_child_scene_node
198
+ end
199
+
200
+ #Create a material and add it to the materials array
201
+ def create_material(template, options={})
202
+ #pull the rmaterial from any resource path
203
+ file = Resources.instance.find_file("#{template}.rmaterial")
204
+
205
+ name = options[:name]
206
+ @@unnamed_material_index ||= -1
207
+ name = "UnnamedMaterial(#{@@unnamed_material_index+=1})" if name.nil?
208
+ name = name.to_sym
209
+
210
+ rmaterial = Ogre::RMaterial.new(file)
211
+ rmaterial.name = name
212
+ #Set values
213
+ options.each do |option|
214
+ rmaterial.send("#{option[0]}=".to_sym, option[1])
215
+ end
216
+ rmaterial.parse
217
+ @materials << rmaterial.create_ogre_material
218
+ @materials.last.name = name.to_s
219
+ return @materials.last
220
+ end
221
+
222
+ # Creates an ogre particle system from a template. Will create a new template if one is not requested
223
+ def create_particle_system(template=nil, options={})
224
+ @@unnamed_particle_system_index = -1
225
+ template = "UnnamedParticleSystem#{@@unnamed_particle_system_index+=1}" if template.nil?
226
+ particle_system = Ogre::ParticleSystemManager.instance.get_template(template.to_s)
227
+ if particle_system.nil? #Todo: Resource groups?
228
+ particle_system = Ogre::ParticleSystemManager.instance.create_template(template.to_s, "General")
229
+ log.info "Creating new particle system template '#{template}'"
230
+ end
231
+
232
+ # Sometimes the particle system will already have a parent node... what do we do then?
233
+ particle_system.node = create :node if particle_system.get_parent_node.nil?
234
+
235
+ @particle_systems << particle_system
236
+ return particle_system
237
+ end
238
+
239
+ #Returns the logger
240
+ def log
241
+ return Game.instance.log
242
+ end
243
+
244
+ end
245
+ end
246
+ end
247
+
248
+