ogre.rb 0.1-i386-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/README +79 -0
  2. data/Rakefile +291 -0
  3. data/doc_src/ogre.rb +246 -0
  4. data/doc_src/ois.rb +67 -0
  5. data/lib/application.rb +146 -0
  6. data/lib/application_frame_listener.rb +302 -0
  7. data/lib/application_loading_bar.rb +115 -0
  8. data/lib/constants.rb +51 -0
  9. data/lib/method_fixes.rb +42 -0
  10. data/lib/ogre.dll +0 -0
  11. data/lib/ruby_ois.dll +0 -0
  12. data/ogre.rb +25 -0
  13. data/platform.rb +23 -0
  14. data/samples/Ogre.log +279 -0
  15. data/samples/bsp.rb +76 -0
  16. data/samples/cg.dll +0 -0
  17. data/samples/grass.rb +325 -0
  18. data/samples/js3250.dll +0 -0
  19. data/samples/lighting.rb +138 -0
  20. data/samples/media/materials/programs/Grass.cg +30 -0
  21. data/samples/media/materials/programs/OffsetMapping.cg +97 -0
  22. data/samples/media/materials/programs/OffsetMapping.hlsl +135 -0
  23. data/samples/media/materials/programs/OffsetMappingFp.glsl +69 -0
  24. data/samples/media/materials/programs/OffsetMappingVp.glsl +54 -0
  25. data/samples/media/materials/programs/OffsetMapping_specular.asm +44 -0
  26. data/samples/media/materials/scripts/CloudySky.material +17 -0
  27. data/samples/media/materials/scripts/CubeMapping.material +34 -0
  28. data/samples/media/materials/scripts/Flare.material +17 -0
  29. data/samples/media/materials/scripts/Grass.material +63 -0
  30. data/samples/media/materials/scripts/Knot.material +14 -0
  31. data/samples/media/materials/scripts/MorningSkyBox.material +17 -0
  32. data/samples/media/materials/scripts/Offset.material +124 -0
  33. data/samples/media/materials/scripts/Ogre.material +119 -0
  34. data/samples/media/materials/scripts/RZR-002.material +15 -0
  35. data/samples/media/materials/scripts/Razor.material +14 -0
  36. data/samples/media/materials/scripts/Ribbon.material +19 -0
  37. data/samples/media/materials/scripts/RustySteel.material +14 -0
  38. data/samples/media/materials/scripts/SpaceSkyBox.material +17 -0
  39. data/samples/media/materials/scripts/SpaceSkyPlane.material +17 -0
  40. data/samples/media/materials/scripts/TextureEffects.material +15 -0
  41. data/samples/media/materials/scripts/dragon.material +42 -0
  42. data/samples/media/materials/scripts/smoke.material +18 -0
  43. data/samples/media/materials/textures/GreenSkin.jpg +0 -0
  44. data/samples/media/materials/textures/MtlPlat2.jpg +0 -0
  45. data/samples/media/materials/textures/RZR-002.png +0 -0
  46. data/samples/media/materials/textures/RustedMetal.jpg +0 -0
  47. data/samples/media/materials/textures/RustySteel.jpg +0 -0
  48. data/samples/media/materials/textures/Thumbs.db +0 -0
  49. data/samples/media/materials/textures/Water02.jpg +0 -0
  50. data/samples/media/materials/textures/WeirdEye.png +0 -0
  51. data/samples/media/materials/textures/clouds.jpg +0 -0
  52. data/samples/media/materials/textures/cursor.png +0 -0
  53. data/samples/media/materials/textures/dirt01.jpg +0 -0
  54. data/samples/media/materials/textures/flare.png +0 -0
  55. data/samples/media/materials/textures/gras_02.png +0 -0
  56. data/samples/media/materials/textures/grass_1024.jpg +0 -0
  57. data/samples/media/materials/textures/ogreborder.png +0 -0
  58. data/samples/media/materials/textures/ogreborderUp.png +0 -0
  59. data/samples/media/materials/textures/ribbonband.png +0 -0
  60. data/samples/media/materials/textures/rockwall.tga +0 -0
  61. data/samples/media/materials/textures/rockwall_NH.tga +0 -0
  62. data/samples/media/materials/textures/smoke.png +0 -0
  63. data/samples/media/materials/textures/smokecolors.png +0 -0
  64. data/samples/media/materials/textures/spacesky.jpg +0 -0
  65. data/samples/media/materials/textures/spheremap.png +0 -0
  66. data/samples/media/materials/textures/texmap2.jpg +0 -0
  67. data/samples/media/models/RZR-002.mesh +0 -0
  68. data/samples/media/models/geosphere4500.mesh +0 -0
  69. data/samples/media/models/geosphere8000.mesh +0 -0
  70. data/samples/media/models/knot.mesh +0 -0
  71. data/samples/media/models/ogrehead.mesh +0 -0
  72. data/samples/media/models/razor.mesh +0 -0
  73. data/samples/media/models/sphere.mesh +0 -0
  74. data/samples/media/overlays/CubeMapping.overlay +139 -0
  75. data/samples/media/packs/OgreCore.zip +0 -0
  76. data/samples/media/packs/chiropteraDM.pk3 +0 -0
  77. data/samples/media/packs/chiropteraDM.txt +99 -0
  78. data/samples/media/packs/cubemap.zip +0 -0
  79. data/samples/media/packs/cubemapsJS.zip +0 -0
  80. data/samples/media/packs/dragon.zip +0 -0
  81. data/samples/media/packs/skybox.zip +0 -0
  82. data/samples/media/particles/smoke.particle +43 -0
  83. data/samples/media.cfg +22 -0
  84. data/samples/ogre.cfg +19 -0
  85. data/samples/plugins.cfg +12 -0
  86. data/samples/quake3settings.cfg +2 -0
  87. data/samples/render_to_texture.rb +161 -0
  88. data/samples/resources.cfg +16 -0
  89. data/samples/sky_box.rb +107 -0
  90. data/samples/sky_dome.rb +86 -0
  91. data/samples/sky_plane.rb +27 -0
  92. data/samples/smoke.rb +23 -0
  93. data/samples/work/cube_mapping.rb +686 -0
  94. metadata +149 -0
@@ -0,0 +1,686 @@
1
+ #!/usr/bin/ruby -w
2
+
3
+ require 'application'
4
+ include Ogre
5
+ include OIS
6
+
7
+ # This is a pretty much verbatim copy of the CubeMapping demo.
8
+ # Will this work in Ruby? I really don't know. There's a LOT of
9
+ # pointer arithmetic happening in the original.
10
+
11
+ # Perlin Noise data and algorithms
12
+ class Perlin
13
+ P = [
14
+ 151,160,137,91,90,15,
15
+ 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
16
+ 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
17
+ 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
18
+ 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
19
+ 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
20
+ 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
21
+ 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
22
+ 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
23
+ 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
24
+ 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
25
+ 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
26
+ 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,
27
+
28
+ 151,160,137,91,90,15,
29
+ 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
30
+ 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
31
+ 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
32
+ 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
33
+ 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
34
+ 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
35
+ 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
36
+ 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
37
+ 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
38
+ 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
39
+ 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
40
+ 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
41
+ ]
42
+
43
+ class << self
44
+
45
+ def lerp(t, a, b)
46
+ a + t * (b - a)
47
+ end
48
+
49
+ def fade(t)
50
+ t*t*t*t*(t*(t*6-15)+10)
51
+ end
52
+
53
+ # Convert Low 4 bits of hash code into
54
+ # 12 gradient directions
55
+ def grad(hash, x, y, z)
56
+ hash ||= 0
57
+ h = hash & 15
58
+ u = h < 8 || h == 12 || h == 13 ? x : y
59
+ v = h < 4 || h == 12 || h == 13 ? y : z
60
+
61
+ ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v)
62
+ end
63
+
64
+ # This is copied almost verbatim from CubeMapping demo
65
+ def noise3(x, y, z)
66
+ _x = x.floor & 225
67
+ _y = y.floor & 255
68
+ _z = z.floor & 255
69
+
70
+ x -= x.floor
71
+ y -= y.floor
72
+ z -= z.floor
73
+
74
+ u = fade(x)
75
+ v = fade(y)
76
+ w = fade(z)
77
+
78
+ a = P[_x] + _y
79
+ aa = P[a] + _z
80
+ ab = P[a + 1] + _z
81
+ b = P[_x + 1]
82
+ ba = P[b] + _z
83
+ bb = P[b + 1] + _z
84
+
85
+ # Oh snap!
86
+ return lerp(w,
87
+ lerp(v,
88
+ lerp(u,
89
+ grad(P[aa], x, y, z), # And add
90
+ grad(P[ba], x - 1, y, z)), # Blended
91
+ lerp(u,
92
+ grad(P[ab], a, y - 1, z), # Results
93
+ grad(P[bb], x - 1, y - 1, z))), # From 8
94
+ lerp(v,
95
+ lerp(u,
96
+ grad(P[aa + 1], x, y, z - 1), # Corners
97
+ grad(P[ba + a], x - 1, y, z - 1)), # Of Cube
98
+ lerp(u,
99
+ grad(P[ab + 1], x, y - 1, z - 1),
100
+ grad(P[bb + 1], x - 1, y - 1, z - 1))))
101
+
102
+ end
103
+ end
104
+ end
105
+
106
+ ENTITY_NAME = "CubeMappedEntity"
107
+ MESH_NAME = "CubeMappedMesh"
108
+
109
+ MATERIAL_NAME = "SceneCubeMap2"
110
+ SKYBOX_MATERIAL = "SceneSkyBox2"
111
+
112
+ class CubeMappingListener < ApplicationFrameListener
113
+ def initialize(root, win, cam, scene_manager, object_node)
114
+ super(root, win, cam)
115
+
116
+ @scene_manager = scene_manager
117
+ @object_node = object_node
118
+
119
+ @tm = 0
120
+ @timeout_delay = 0
121
+ @displacement = 0.1
122
+ @density = 50.0
123
+ @time_density = 5.0
124
+ @object_entity = 0
125
+ @cloned_materials = []
126
+ @cloned_mesh = nil
127
+
128
+ @noise_on = false
129
+ @current_cube_map_index = 0
130
+ @current_lbx_index = 0
131
+ @current_mesh_index = 0
132
+
133
+ @material = MaterialManager.instance.get_by_name(MATERIAL_NAME)
134
+
135
+ raise "Cannot find material #{MATERIAL_NAME}" unless @material
136
+
137
+ #puts "\tReading config"
138
+ read_config
139
+
140
+ #puts "\tSetting object"
141
+ set_object
142
+
143
+ #puts "\tSetting material blending"
144
+ set_material_blending
145
+
146
+ #puts "\tSetting cube map"
147
+ set_cube_map
148
+
149
+ #puts "\tSetting noise to On"
150
+ set_noise_on
151
+
152
+ #puts "\tUpdate Info displacement"
153
+ update_info_displacement
154
+
155
+ #puts "\tUpdate info density"
156
+ update_info_density
157
+
158
+ #puts "\tUpdate info time density"
159
+ update_info_time_density
160
+ end
161
+
162
+ def frame_started(event)
163
+ return false unless super(event)
164
+
165
+ @tm += event.time_since_last_frame / @time_density
166
+
167
+ update_noise if @noise_on
168
+
169
+ @object_node.yaw(Degree.new(20 * event.time_since_last_frame))
170
+
171
+ true
172
+ end
173
+
174
+ def adjust_range(value_key, key_plus, key_minus, min_val, max_val, change, func)
175
+ value = instance_variable_get("@#{value_key}")
176
+ if keyboard.key_down?(key_plus)
177
+ value += change
178
+ if value >= max_val
179
+ value = max_val
180
+ end
181
+ instance_variable_set("@#{value_key}", value)
182
+ send(func)
183
+ end
184
+
185
+ if keyboard.key_down?(key_minus)
186
+ value -= change
187
+ if value <= min_val
188
+ value = min_val
189
+ end
190
+ instance_variable_set("@#{value_key}", value)
191
+ send(func)
192
+ end
193
+
194
+ end
195
+
196
+ def switch_value(key, time_delay, code)
197
+ if keyboard.key_down?(key) && @timeout_delay == 0
198
+ @timeout_delay = time_delay
199
+ code.call
200
+ end
201
+ end
202
+
203
+ def process_unbuffered_key_input(event)
204
+
205
+ ret = super(event)
206
+
207
+ change_speed = event.time_since_last_frame
208
+
209
+ if keyboard.key_down?(KC_LSHIFT) || keyboard.key_down?(KC_RSHIFT)
210
+ change_speed += 10.0
211
+ end
212
+
213
+ if keyboard.key_down?(KC_LCONTROL)
214
+ change_speed /= 10.0
215
+ end
216
+
217
+ adjust_range(:displacement, OIS::KC_2, OIS::KC_1, 2, 2, 0.1 * change_speed, :update_info_displacement)
218
+ adjust_range(:density, OIS::KC_4, OIS::KC_3, 0.1, 500, 10.0 * change_speed, :update_info_density)
219
+ adjust_range(:time_density, OIS::KC_6, OIS::KC_5, 1, 10, 1.0 * change_speed, :update_info_time_density)
220
+
221
+ @timeout_delay -= event.time_since_last_frame
222
+ @timeout_delay = 0 if @timeout_delay <= 0
223
+
224
+ switch_value(OIS::KC_O, 0.5, proc { @current_mesh_index += 1; set_object})
225
+ switch_value(OIS::KC_N, 0.5, proc { @noise_on = !@noise_on; set_noise_on})
226
+ switch_value(OIS::KC_M, 0.5, proc { @current_lbx_index += 1; set_material_blending})
227
+ switch_value(OIS::KC_C, 0.5, proc { @current_cube_map_index += 1; set_cube_map})
228
+ switch_value(OIS::KC_SPACE, 0.5, proc { go_random })
229
+
230
+ ret
231
+ end
232
+
233
+ private
234
+
235
+ def read_config
236
+ cfg = ConfigFile.new
237
+ cfg.load("media.cfg")
238
+ @available_meshes = cfg.get_multi_setting("Mesh")
239
+ @available_cube_maps = cfg.get_multi_setting("CubeMap")
240
+ end
241
+
242
+ def random_from(a, b)
243
+ (rand() & 65535) / 65536.0 * (b-a) + a
244
+ end
245
+
246
+ def go_random
247
+ @displacement = random_from(0.0, 1.0)
248
+ update_info_displacement
249
+
250
+ @density = random_from(1.0, 300.0)
251
+ update_info_density
252
+
253
+ @time_density = random_from(1.0, 10.0)
254
+ update_info_time_density
255
+ end
256
+
257
+ def update_info_displacement
258
+ OverlayManager.instance.get_overlay_element("CubeMapping/Displacement").set_caption("[1/2] Displacement: #{@displacement}")
259
+ end
260
+
261
+ def update_info_density
262
+ OverlayManager.instance.get_overlay_element("CubeMapping/Density").set_caption("[3/4] Noise density: #{@density}")
263
+ end
264
+
265
+ def update_info_time_density
266
+ OverlayManager.instance.get_overlay_element("CubeMapping/TimeDensity").set_caption("[5/6] Time density: #{@time_density}")
267
+ end
268
+
269
+ def set_object
270
+ @current_mesh_index %= @available_meshes.size
271
+ mesh_name = @available_meshes[@current_mesh_index]
272
+
273
+ puts "Switching to object #{mesh_name}"
274
+
275
+ prepare_entity(mesh_name)
276
+
277
+ puts "Taking care of overlay"
278
+ OverlayManager.instance.get_overlay_element("CubeMapping/Object").set_caption("[O] Object: #{mesh_name}")
279
+ end
280
+
281
+ def set_noise_on
282
+ OverlayManager.instance.get_overlay_element("CubeMapping/Noise").set_caption("[N] Noise: #{@noise_on ? 'on' : 'off'}")
283
+ end
284
+
285
+ def set_cube_map
286
+ @current_cube_map_index %= @available_cube_maps.size
287
+ cube_map_name = @available_cube_maps[@current_cube_map_index]
288
+
289
+ pass = @material.get_technique(0).get_pass(0)
290
+
291
+ pass.get_texture_unit_state(0).get_num_frames.times do |i|
292
+ old_tex_name = pass.get_texture_unit_state(0).get_frame_texture_name(i)
293
+ old_tex = TextureManager.instance.get_by_name(old_tex_name)
294
+ TextureManager.instance.remove(old_tex_name)
295
+ end
296
+ pass.get_texture_unit_state(0).set_cubic_texture_name(cube_map_name, true)
297
+
298
+ mat2 = MaterialManager.instance.get_by_name(SKYBOX_MATERIAL)
299
+ pass2 = mat2.get_technique(0).get_pass(0)
300
+
301
+ pass2.get_texture_unit_state(0).get_num_frames.times do |i|
302
+ old_tex_name = pass2.get_texture_unit_state(0).get_frame_texture_name(i)
303
+ old_tex = TextureManager.instance.get_by_name(old_tex_name)
304
+ TextureManager.instance.remove(old_tex_name)
305
+ end
306
+ pass2.get_texture_unit_state(0).set_cubic_texture_name(cube_map_name, true)
307
+
308
+ # FIXME UG! Causing Problem
309
+ #@scene_manager.set_sky_box(true, SKYBOX_MATERIAL)
310
+
311
+ prepare_entity(@available_meshes[@current_mesh_index])
312
+ OverlayManager.instance.get_overlay_element("CubeMapping/CubeMap").set_caption("[C] CubeMap: #{cube_map_name}")
313
+ end
314
+
315
+ def set_material_blending
316
+ lbx_name = ""
317
+ @current_lbx_index %= 5
318
+ case @current_lbx_index
319
+ when 0
320
+ @current_lbx = LBX_ADD;
321
+ lbx_name = "ADD"
322
+ when 1
323
+ @current_lbx = LBX_MODULATE;
324
+ lbx_name = "MODULATE"
325
+ when 2
326
+ @current_lbx = LBX_MODULATE_X2;
327
+ lbx_name = "MODULATE X2"
328
+ when 3
329
+ @current_lbx = LBX_MODULATE_X4;
330
+ lbx_name = "MODULATE X4"
331
+ when 4
332
+ @current_lbx = LBX_SOURCE1;
333
+ lbx_name = "SOURCE1"
334
+ when 5
335
+ @current_lbx = LBX_SOURCE2;
336
+ lbx_name = "SOURCE2"
337
+ end
338
+
339
+ # Reset entities, materials, etc
340
+ prepare_entity(@available_meshes[@current_mesh_index])
341
+ OverlayManager.instance.get_overlay_element("CubeMapping/Material").set_caption("[M] Material blend: " + lbx_name)
342
+ end
343
+
344
+ def prepare_entity(mesh_name)
345
+ clear_entity if @object_entity
346
+
347
+ @original_mesh = MeshManager.instance.get_by_name(mesh_name)
348
+
349
+ if !@original_mesh
350
+ @original_mesh = MeshManager.instance.load(mesh_name,
351
+ ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME)
352
+ if !@original_mesh
353
+ raise "Can't find the mesh #{mesh_name}"
354
+ end
355
+ end
356
+
357
+ prepare_cloned_mesh
358
+
359
+ @object_entity = @scene_manager.create_entity(ENTITY_NAME, MESH_NAME)
360
+ @object_entity.set_material_name(@material.get_name)
361
+ pass = @material.get_technique(0).get_pass(0)
362
+
363
+ # Go through subentities and set materials
364
+ num = @cloned_mesh.get_num_sub_meshes
365
+ num.times do |m|
366
+ sub_mesh = @cloned_mesh.get_sub_mesh(m)
367
+ sub_entity = @object_entity.get_sub_entity(m)
368
+
369
+ if sub_mesh.is_mat_initialised?
370
+ mat_name = sub_mesh.get_material_name
371
+ sub_mat = MaterialManager.instance.get_by_name(mat_name)
372
+
373
+ unless sub_mat
374
+ sub_mat.load
375
+ cloned = sub_mat.clone("CubeMapTempMaterial##{m}")
376
+ cloned_pass = cloned.get_technique(0).get_pass(0)
377
+
378
+ # the knot, it needs to scroll!
379
+ if mesh_name == "knot.mesh"
380
+ cloned_pass.get_num_texture_unit_states.times do |tl|
381
+ tlayer = cloned_pass.get_texture_unit_state(tl)
382
+ tlayer.set_scroll_animation(1.0, 0)
383
+ end
384
+ end
385
+
386
+ # Layers
387
+ pass.get_num_texture_unit_states.times do |tl|
388
+ org_tl = pass.get_texture_unit_state(tl)
389
+ new_tl = cloned_pass.create_texture_unit_state(org_tl.get_texture_name)
390
+ # Um, *new_tl = *org_tl ?
391
+ new_tl = org_tl
392
+ new_tl.set_colour_operation_ex(@current_lbx)
393
+ end
394
+
395
+ sub_entity.set_material_name(cloned.get_name)
396
+ @cloned_materials << cloned
397
+ end
398
+ end
399
+ end
400
+
401
+ @object_node.attach_object(@object_entity)
402
+
403
+ if @noise_on
404
+ update_noise
405
+ end
406
+ end
407
+
408
+ def prepare_cloned_mesh
409
+ @cloned_mesh = MeshManager.instance.create_manual(MESH_NAME,
410
+ ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME)
411
+ @cloned_mesh._set_bounds(@original_mesh.get_bounds)
412
+ @cloned_mesh._set_bounding_sphere_radius(@original_mesh.get_bounding_sphere_radius)
413
+
414
+ @cloned_mesh.shared_vertex_data = prepare_vertex_data(@original_mesh.shared_vertex_data)
415
+
416
+ @original_mesh.get_num_sub_meshes.times do |sm|
417
+ org_sm = @original_mesh.get_sub_mesh(sm)
418
+ new_sm = @cloned_mesh.create_sub_mesh
419
+
420
+ if org_sm.is_mat_initialised?
421
+ new_sm.set_material_name(org_sm.get_material_name)
422
+ end
423
+
424
+ new_sm.use_shared_vertices = org_sm.use_shared_vertices?
425
+ # Vertex data
426
+ new_sm.vertex_data = prepare_vertex_data(org_sm.vertex_data)
427
+ # Reuse index
428
+ new_sm.index_data.index_buffer = org_sm.index_data.index_buffer
429
+ new_sm.index_data.index_start = org_sm.index_data.index_start
430
+ new_sm.index_data.index_count = org_sm.index_data.index_count
431
+ end
432
+ end
433
+
434
+ def prepare_vertex_data(org_vd)
435
+ return nil unless org_vd
436
+
437
+ # Hacky bit: reorganise vertex buffers to a buffer-per-element
438
+ # Since this demo was written a while back to assume that
439
+ # Really this demo should be replaced with a vertex program noise
440
+ # distortion, but left the software for now since it's nice for older
441
+ # card owners
442
+ new_decl = org_vd.vertex_declaration.clone
443
+ elems = new_decl.get_elements
444
+ buff = 0
445
+ elems.each do |elem|
446
+ new_decl.modify_element(buff, buff, 0, elem.get_type, elem.get_semantic, elem.get_index)
447
+ buff += 1
448
+ end
449
+
450
+ org_vd.reorganise_buffers(new_decl)
451
+
452
+ new_vd = VertexData.new
453
+ # Copy that which does not change
454
+ new_vd.vertex_count = org_vd.vertex_count
455
+ new_vd.vertex_start = org_vd.vertex_start
456
+ # Now copy vertex buffers, looking in the declarations
457
+ new_vdecl = new_vd.vertex_declaration
458
+ new_vbind = new_vd.vertex_buffer_binding
459
+
460
+ org_vel = org_vd.vertex_declaration.get_elements
461
+ org_vel.each do |veli|
462
+ ves = veli.get_semantic
463
+ source = veli.get_source
464
+
465
+ org_buf = org_vd.vertex_buffer_binding.get_buffer(source)
466
+
467
+ # Check usage of new buffer
468
+ dynamic = false
469
+ case ves
470
+ when [VES_NORMAL, VES_POSITION]
471
+ dynamic = true
472
+ else
473
+ dynamic = false
474
+ end
475
+
476
+ if dynamic
477
+ new_buf = HardwareBufferManager.instance.create_vertex_buffer(
478
+ org_buff.get_vertex_size, org_buff.get_num_vertices,
479
+ HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE,
480
+ true)
481
+ new_buff.copy_data(org_buff, 0, 0, org_buff.get_size_in_bytes, true)
482
+ new_vbind.set_binding(source, new_buf)
483
+ else
484
+ new_vbind.set_binding(source, org_buf)
485
+ end
486
+
487
+ # Add element for declaration
488
+ new_vdecl.add_element(source, veli.get_offset, veli.get_type,
489
+ ves, veli.get_index)
490
+ end
491
+
492
+ new_vd
493
+ end
494
+
495
+ def clear_entity
496
+ @cloned_materials.each do |cm|
497
+ MaterialManager.instance.remove(cm.get_handle)
498
+ end
499
+
500
+ @cloned_materials.clear
501
+
502
+ @object_node.detach_all_objects
503
+ @scene_manager.destroy_entity(ENTITY_NAME)
504
+
505
+ MeshManager.instance.remove(@cloned_mesh.get_handle) if @cloned_mesh
506
+
507
+ @object_entity = nil
508
+ end
509
+
510
+ def update_noise
511
+ shared_normals = nil
512
+ normals = nil
513
+
514
+ @cloned_mesh.get_num_sub_meshes.times do |m|
515
+ sub_mesh = @cloned_mesh.get_sub_mesh(m)
516
+ org_sub_mesh = @original_mesh.get_sub_mesh(m)
517
+
518
+ if sub_mesh.use_shared_vertices?
519
+ if !shared_normals
520
+ shared_normals = normals_get_cleared(@cloned_mesh.shared_vertex_data)
521
+ end
522
+
523
+ update_vertex_data_noise_and_normals(
524
+ @cloned_mesh.shared_vertex_data,
525
+ @original_mesh.shared_vertex_data,
526
+ sub_mesh.index_data,
527
+ shared_normals)
528
+ else
529
+ normals = normals_get_cleared(sub_mesh.vertex_data)
530
+
531
+ update_vertex_data_noise_and_normals(
532
+ sub_mesh.vertex_data,
533
+ org_sub_mesh.vertex_data,
534
+ sub_mesh.index_data,
535
+ normals)
536
+ normals_save_normalized(sub_mesh.vertex_data, normals)
537
+ end
538
+ end
539
+
540
+ if shared_normals
541
+ normals_save_normalized(@cloned_mesh.shared_vertex_data, shared_normals)
542
+ end
543
+ end
544
+
545
+ def normals_get_cleared(vertex_data)
546
+ norm_ve = vertex_data.vertex_declaration.find_element_by_semantic(VES_NORMAL)
547
+ norm_hvb = vertex_data.vertex_buffer_binding.get_buffer(norm_ve.get_source)
548
+ normals = norm_hvb.lock(vertex_data.vertex_declaration, HardwareBuffer::HBL_DISCARD)
549
+ # FIXME Um, memset?
550
+ normals
551
+ end
552
+
553
+ def normals_save_normalized(vertex_data, normals)
554
+ norm_ve = vertex_data.vertex_declaration.find_element_by_semantic(VES_NORMAL)
555
+ norm_hvb = vertex_data.vertex_buffer_binding.get_buffer(norm_ve.get_source)
556
+ i = 0
557
+ num_verts = norm_hvb.get_num_vertices
558
+ while i < num_verts
559
+ n = Vector3.new(normals[0], normals[1], normals[2])
560
+ n.normalise!
561
+
562
+ normals[0] = n.x
563
+ normals[1] = n.y
564
+ normals[2] = n.z
565
+ i += 3
566
+ end
567
+ norm_hvb.unlock
568
+ end
569
+
570
+ def update_vertex_data_noise_and_normals(dst_data, org_data, index_data, normals)
571
+ # Find destination vertex buffer
572
+ dst_ve_pos = dst_data.vertex_declaration.find_element_by_semantic(VES_POSITION)
573
+ dst_hvb_pos = dst_data.vertex_buffer_binding.get_buffer(dst_ve_pos.get_source)
574
+
575
+ # Find source vertex buffer
576
+ org_ve_pos = org_data.vertex_declaration.find_element_by_semantic(VES_POSITION)
577
+ org_hvb_pos = org_data.vertex_buffer_binding.get_buffer(org_ve_pos.get_source)
578
+
579
+ # Lock buffers
580
+ dst_data_pos = dst_hvb_pos.lock(dst_data.vertex_declaration, HardwareBuffer::HBL_DISCARD)
581
+ org_data_pos = org_hvb_pos.lock(org_data.vertex_declaration, HardwareBuffer::HBL_READ_ONLY)
582
+
583
+ # Noise!
584
+ num_verts = org_hvb_pos.get_num_vertices
585
+ i = 0
586
+ while i < num_verts
587
+ org_data = org_data_pos.get_float(i, VES_POSITION, 3)
588
+ n = 1 + @displacement * Perlin.noise3(
589
+ org_data[0] / @density + @tm,
590
+ org_data[1] / @density + @tm,
591
+ org_data[2] / @density + @tm)
592
+ dst_data_pos.set_float(i, VES_POSITION, org_data[0] * n,
593
+ org_data[1] * n,
594
+ org_data[2] * n)
595
+ i += 3
596
+ end
597
+
598
+ # Unlock original position buffer
599
+ org_hvb_pos.unlock
600
+
601
+ # Calculate normals
602
+ index_hb = index_data.index_buffer
603
+ vertex_indicies = index_hb.lock(HardwareBuffer::HBL_READ_ONLY)
604
+ num_faces = index_data.index_count / 3
605
+ i = 0
606
+ while i < num_faces
607
+ p0 = vertex_indicies[0]
608
+ p1 = vertex_indicies[1]
609
+ p2 = vertex_indicies[2]
610
+
611
+ dst_data = dst_data_pos.get_float(3 * p0, VES_POSITION, 3)
612
+ v0 = Vector3.new(dst_data[0], dst_data[1], dst_data[2])
613
+
614
+ dst_data = dst_data_pos.get_float(3 * p1, VES_POSITION, 3)
615
+ v1 = Vector3.new(dst_data[0], dst_data[1], dst_data[2])
616
+
617
+ dst_data = dst_data_pos.get_float(3 * p2, VES_POSITION, 3)
618
+ v2 = Vector3.new(dst_data[0], dst_data[1], dst_data[2])
619
+
620
+ diff1 = v1 - v2
621
+ diff2 = v1 - v0
622
+ vn = diff1.cross_product(diff2)
623
+
624
+ normals.set_float(3 * p0, VES_POSITION,
625
+ normals.get_float(3 * p0, VES_POSITION, 1)[0] + vn.x,
626
+ normals.get_float(3 * p0 + 1, VES_POSITION, 1)[0] + vn.y,
627
+ normals.get_float(3 * p0 + 2, VES_POSITION, 1)[0] + vn.z
628
+ )
629
+ #normals[3 * p0] += vn.x
630
+ #normals[3 * p0 + 1] += vn.y
631
+ #normals[3 * p0 + 2] += vn.z
632
+
633
+ normals.set_float(3 * p0, VES_POSITION,
634
+ normals.get_float(3 * p1, VES_POSITION, 1)[0] + vn.x,
635
+ normals.get_float(3 * p1 + 1, VES_POSITION, 1)[0] + vn.y,
636
+ normals.get_float(3 * p1 + 2, VES_POSITION, 1)[0] + vn.z
637
+ )
638
+ #normals[3 * p1] += vn.x
639
+ #normals[3 * p1 + 1] += vn.y
640
+ #normals[3 * p1 + 2] += vn.z
641
+
642
+ normals.set_float(3 * p2, VES_POSITION,
643
+ normals.get_float(3 * p2, VES_POSITION, 1)[0] + vn.x,
644
+ normals.get_float(3 * p2 + 1, VES_POSITION, 1)[0] + vn.y,
645
+ normals.get_float(3 * p2 + 2, VES_POSITION, 1)[0] + vn.z
646
+ )
647
+ #normals[3 * p2] += fn.x
648
+ #normals[3 * p2 + 1] += fn.y
649
+ #normals[3 * p2 + 2] += fn.z
650
+
651
+ i += 3
652
+ end
653
+
654
+ index_hb.unlock
655
+
656
+ dst_hvb_pos.unlock
657
+ end
658
+
659
+ end
660
+
661
+ class CubeMappingApplication < Application
662
+ def create_scene
663
+ # Make sure cube mapping is supported
664
+ if !root.get_render_system.get_capabilities.has_capability?(RSC_CUBEMAPPING)
665
+ raise "Your card does not support cube mapping, so we cannot run this demo. Sorry"
666
+ end
667
+
668
+ scene_manager.set_ambient_light(ColourValue.new(0.5, 0.5, 0.5))
669
+ scene_manager.set_sky_box(true, SKYBOX_MATERIAL)
670
+
671
+ l = scene_manager.create_light("MainLight")
672
+ l.set_position(20, 80, 50)
673
+
674
+ @object_node = scene_manager.root_scene_node.create_child_scene_node
675
+
676
+ overlay = OverlayManager.instance.get_by_name("CubeMappingOverlay")
677
+ overlay.show
678
+ end
679
+
680
+ def create_frame_listener
681
+ self.frame_listener = CubeMappingListener.new(root, window, camera, scene_manager, @object_node)
682
+ end
683
+ end
684
+
685
+ app = CubeMappingApplication.new
686
+ app.go