cosmos 3.6.2 → 3.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/data/crc.txt +19 -19
  3. data/lib/cosmos/core_ext/array.rb +4 -1
  4. data/lib/cosmos/core_ext/matrix.rb +3 -0
  5. data/lib/cosmos/gui/dialogs/find_replace_dialog.rb +42 -35
  6. data/lib/cosmos/gui/line_graph/line_graph.rb +3 -0
  7. data/lib/cosmos/gui/line_graph/line_graph_drawing.rb +3 -1
  8. data/lib/cosmos/gui/opengl/gl_viewer.rb +115 -127
  9. data/lib/cosmos/gui/utilities/script_module_gui.rb +2 -5
  10. data/lib/cosmos/interfaces/linc_interface.rb +207 -147
  11. data/lib/cosmos/io/win32_serial_driver.rb +1 -1
  12. data/lib/cosmos/script/scripting.rb +2 -2
  13. data/lib/cosmos/script/tools.rb +8 -1
  14. data/lib/cosmos/tools/data_viewer/data_viewer.rb +12 -17
  15. data/lib/cosmos/tools/launcher/launcher_config.rb +1 -1
  16. data/lib/cosmos/tools/script_runner/script_runner.rb +9 -4
  17. data/lib/cosmos/tools/table_manager/table_manager.rb +3 -1
  18. data/lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb +11 -1
  19. data/lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb +1 -0
  20. data/lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb +8 -0
  21. data/lib/cosmos/version.rb +4 -4
  22. data/spec/core_ext/array_spec.rb +62 -1
  23. data/spec/core_ext/matrix_spec.rb +61 -0
  24. data/spec/interfaces/linc_interface_spec.rb +0 -9
  25. data/spec/script/script_spec.rb +7 -3
  26. data/spec/script/scripting_spec.rb +2 -2
  27. data/spec/script/tools_spec.rb +2 -0
  28. data/spec/spec_helper.rb +10 -1
  29. data/spec/tools/launcher/launcher_config_spec.rb +21 -11
  30. data/spec/top_level/top_level_spec.rb +1 -1
  31. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 86f4e70039dc9cf70198d05ebda498d13d0e6b09
4
- data.tar.gz: c5aec1555af16993cbd5d0ca88c34006afb62242
3
+ metadata.gz: c086907a0e1bda08352520d1a264be73867cde38
4
+ data.tar.gz: 6ae05f354e92bb9331bbea4a49689580a3e78e9e
5
5
  SHA512:
6
- metadata.gz: 81bc36f9c68266492a066981d0308a4c2a5c1d787edf6708251bd1944d68a76f39b33966cf73faf7bf291c503db8f7390c814a61f2bc54b1ea36574cdcd8fbf8
7
- data.tar.gz: 5fd875fbd16981537682e0bba166b5921a919f96ac48a3557d486d05373f6f78a1426e58588c556a2e2553ec14e4a514a6b3668a82127b1814c5714a89a79b3f
6
+ metadata.gz: cac5dbce95e3e6893fb81f9bcb56738a7bd15c89e3e2f63aba7e04e5989cba2a5b3d3b9fb72230c1dc4f4a306fe71dd8d7b1e2948c1a2273bf613132cb9b3f42
7
+ data.tar.gz: 32ff6b4ff7946905dfc52dfe71d00978d76d3a333a2ec849cb441076bbca9f1e41c313ededa8931ff39fd3dd00fe17f0e344c1c8edb97e8e2286ed028722e69e
@@ -34,7 +34,7 @@
34
34
  "lib/cosmos/utilities/low_fragmentation_array.rb" 0x7E797C76
35
35
  "lib/cosmos/utilities/simulated_target.rb" 0x7EE7A3FF
36
36
  "lib/cosmos/gui/qt.rb" 0x090A21D1
37
- "lib/cosmos/gui/dialogs/find_replace_dialog.rb" 0x7D0348D1
37
+ "lib/cosmos/gui/dialogs/find_replace_dialog.rb" 0xE5BA1A34
38
38
  "lib/cosmos/gui/dialogs/set_tlm_dialog.rb" 0x02A207C9
39
39
  "lib/cosmos/gui/dialogs/exception_dialog.rb" 0xEAC9F814
40
40
  "lib/cosmos/gui/dialogs/tlm_edit_dialog.rb" 0xCD877DDA
@@ -53,14 +53,14 @@
53
53
  "lib/cosmos/gui/dialogs/tlm_details_dialog.rb" 0x18B1DB71
54
54
  "lib/cosmos/gui/dialogs/calendar_dialog.rb" 0x688D3D3B
55
55
  "lib/cosmos/gui/qt_tool.rb" 0x5EC8FC5F
56
- "lib/cosmos/gui/utilities/script_module_gui.rb" 0xA5A34AF5
56
+ "lib/cosmos/gui/utilities/script_module_gui.rb" 0x2AA7C2F8
57
57
  "lib/cosmos/gui/utilities/screenshot.rb" 0x65F75371
58
58
  "lib/cosmos/gui/widgets/full_text_search_line_edit.rb" 0x7AAF694C
59
59
  "lib/cosmos/gui/widgets/realtime_button_bar.rb" 0xEB0CE858
60
60
  "lib/cosmos/gui/widgets/packet_log_frame.rb" 0xF9312CBD
61
- "lib/cosmos/gui/line_graph/line_graph.rb" 0x6761DE9A
61
+ "lib/cosmos/gui/line_graph/line_graph.rb" 0x15D29433
62
62
  "lib/cosmos/gui/line_graph/line_graph_popups.rb" 0x6B6BD351
63
- "lib/cosmos/gui/line_graph/line_graph_drawing.rb" 0x718C2DDA
63
+ "lib/cosmos/gui/line_graph/line_graph_drawing.rb" 0xEC9FEECC
64
64
  "lib/cosmos/gui/line_graph/overview_graph.rb" 0x8FCDCE33
65
65
  "lib/cosmos/gui/line_graph/line_graph_dialog.rb" 0xF73F68CB
66
66
  "lib/cosmos/gui/line_graph/lines.rb" 0x871CA030
@@ -76,7 +76,7 @@
76
76
  "lib/cosmos/gui/opengl/gl_material.rb" 0xA2356712
77
77
  "lib/cosmos/gui/opengl/moon_model.rb" 0xC84B01EC
78
78
  "lib/cosmos/gui/opengl/stl_reader.rb" 0x791FB9EB
79
- "lib/cosmos/gui/opengl/gl_viewer.rb" 0xB7F640B8
79
+ "lib/cosmos/gui/opengl/gl_viewer.rb" 0xCBFBC60C
80
80
  "lib/cosmos/gui/opengl/gl_scene.rb" 0x0EABB1A2
81
81
  "lib/cosmos/gui/opengl/gl_light.rb" 0xDF6C13EA
82
82
  "lib/cosmos/gui/opengl/earth_model.rb" 0xF5CC4C1D
@@ -91,15 +91,15 @@
91
91
  "lib/cosmos/gui/choosers/float_chooser.rb" 0x23B2FA77
92
92
  "lib/cosmos/tools/script_runner/script_runner_config.rb" 0x1E46E8AA
93
93
  "lib/cosmos/tools/script_runner/script_runner_frame.rb" 0x6FEE12DB
94
- "lib/cosmos/tools/script_runner/script_runner.rb" 0xA5890428
94
+ "lib/cosmos/tools/script_runner/script_runner.rb" 0x0CC0CBB4
95
95
  "lib/cosmos/tools/script_runner/script_audit.rb" 0xB857FA4A
96
96
  "lib/cosmos/tools/cmd_extractor/cmd_extractor.rb" 0x41CF52C2
97
97
  "lib/cosmos/tools/data_viewer/data_viewer_component.rb" 0x3525E13F
98
98
  "lib/cosmos/tools/data_viewer/dump_component.rb" 0x6942C5D6
99
- "lib/cosmos/tools/data_viewer/data_viewer.rb" 0x88E765D0
99
+ "lib/cosmos/tools/data_viewer/data_viewer.rb" 0x53FF80A9
100
100
  "lib/cosmos/tools/launcher/launcher_multitool.rb" 0x1020A3D0
101
101
  "lib/cosmos/tools/launcher/launcher_tool.rb" 0xE2F186A7
102
- "lib/cosmos/tools/launcher/launcher_config.rb" 0xE41FF75C
102
+ "lib/cosmos/tools/launcher/launcher_config.rb" 0x569C343D
103
103
  "lib/cosmos/tools/launcher/launcher.rb" 0xAF399283
104
104
  "lib/cosmos/tools/replay/replay_server.rb" 0x307A7329
105
105
  "lib/cosmos/tools/replay/replay.rb" 0x79D68481
@@ -127,7 +127,7 @@
127
127
  "lib/cosmos/tools/cmd_tlm_server/cmd_tlm_server_gui.rb" 0x50E37D3B
128
128
  "lib/cosmos/tools/limits_monitor/limits_monitor.rb" 0x0321B411
129
129
  "lib/cosmos/tools/packet_viewer/packet_viewer.rb" 0x859EC490
130
- "lib/cosmos/tools/table_manager/table_manager.rb" 0x4FC4AE95
130
+ "lib/cosmos/tools/table_manager/table_manager.rb" 0x05E19031
131
131
  "lib/cosmos/tools/table_manager/table.rb" 0x923A8589
132
132
  "lib/cosmos/tools/table_manager/table_item.rb" 0x08A9A262
133
133
  "lib/cosmos/tools/table_manager/table_manager_core.rb" 0xE5C42A6A
@@ -143,7 +143,7 @@
143
143
  "lib/cosmos/tools/test_runner/test.rb" 0x264AB62E
144
144
  "lib/cosmos/tools/tlm_grapher/plots/xy_plot.rb" 0x98F7712F
145
145
  "lib/cosmos/tools/tlm_grapher/plots/singlexy_plot.rb" 0xA01649EC
146
- "lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb" 0xF0F6A243
146
+ "lib/cosmos/tools/tlm_grapher/plots/linegraph_plot.rb" 0x487D5301
147
147
  "lib/cosmos/tools/tlm_grapher/plots/plot.rb" 0xAD4F05B5
148
148
  "lib/cosmos/tools/tlm_grapher/data_object_editors/linegraph_data_object_editor.rb" 0xC23AA3F6
149
149
  "lib/cosmos/tools/tlm_grapher/data_object_editors/data_object_editor.rb" 0x6A92FD7C
@@ -162,12 +162,12 @@
162
162
  "lib/cosmos/tools/tlm_grapher/plot_editors/plot_editor.rb" 0x0C92BBB8
163
163
  "lib/cosmos/tools/tlm_grapher/plot_editors/xy_plot_editor.rb" 0x724D9469
164
164
  "lib/cosmos/tools/tlm_grapher/plot_editors/singlexy_plot_editor.rb" 0xA9B7CD4C
165
- "lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb" 0x2DEFBC72
165
+ "lib/cosmos/tools/tlm_grapher/plot_editors/linegraph_plot_editor.rb" 0x38E79C34
166
166
  "lib/cosmos/tools/tlm_grapher/data_object_adders/housekeeping_data_object_adder.rb" 0xDC2B0DD3
167
167
  "lib/cosmos/tools/tlm_grapher/data_object_adders/singlexy_data_object_adder.rb" 0x74CEA56E
168
168
  "lib/cosmos/tools/tlm_grapher/data_object_adders/xy_data_object_adder.rb" 0x552F8C1F
169
169
  "lib/cosmos/tools/tlm_grapher/plot_gui_objects/singlexy_plot_gui_object.rb" 0x4FC1C15C
170
- "lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb" 0xC1B25F76
170
+ "lib/cosmos/tools/tlm_grapher/plot_gui_objects/linegraph_plot_gui_object.rb" 0xBD8282FB
171
171
  "lib/cosmos/tools/tlm_grapher/plot_gui_objects/xy_plot_gui_object.rb" 0xA500650F
172
172
  "lib/cosmos/tools/tlm_grapher/data_objects/xy_data_object.rb" 0xCD684000
173
173
  "lib/cosmos/tools/tlm_grapher/data_objects/singlexy_data_object.rb" 0x1D037935
@@ -234,7 +234,7 @@
234
234
  "lib/cosmos/tools/tlm_viewer/tlm_viewer.rb" 0x895983E9
235
235
  "lib/cosmos/system.rb" 0x735DFB42
236
236
  "lib/cosmos/conversions.rb" 0x43679D05
237
- "lib/cosmos/version.rb" 0xB014EBF0
237
+ "lib/cosmos/version.rb" 0x52D8F90A
238
238
  "lib/cosmos/core_ext.rb" 0x1951B346
239
239
  "lib/cosmos/interfaces.rb" 0x7E3EA326
240
240
  "lib/cosmos/processors.rb" 0x5241327D
@@ -289,8 +289,8 @@
289
289
  "lib/cosmos/io/json_drb.rb" 0x495EB58B
290
290
  "lib/cosmos/io/stderr.rb" 0x401624AF
291
291
  "lib/cosmos/io/io_multiplexer.rb" 0xD183938D
292
- "lib/cosmos/io/win32_serial_driver.rb" 0xECBFE8FD
293
- "lib/cosmos/interfaces/linc_interface.rb" 0x77B8F1B2
292
+ "lib/cosmos/io/win32_serial_driver.rb" 0xB5AF7D58
293
+ "lib/cosmos/interfaces/linc_interface.rb" 0x2E216D93
294
294
  "lib/cosmos/interfaces/cmd_tlm_server_interface.rb" 0x36E0796A
295
295
  "lib/cosmos/interfaces/interface.rb" 0x060825FA
296
296
  "lib/cosmos/interfaces/stream_interface.rb" 0xDC602D7B
@@ -303,8 +303,8 @@
303
303
  "lib/cosmos/script/commands.rb" 0x58ABA373
304
304
  "lib/cosmos/script/telemetry.rb" 0x2AFB0DCB
305
305
  "lib/cosmos/script/cmd_tlm_server.rb" 0x15F91C95
306
- "lib/cosmos/script/scripting.rb" 0xB79087E5
307
- "lib/cosmos/script/tools.rb" 0x8565EDC5
306
+ "lib/cosmos/script/scripting.rb" 0x36D00CDC
307
+ "lib/cosmos/script/tools.rb" 0x18E9BE05
308
308
  "lib/cosmos/script/script.rb" 0xF1B3E1F2
309
309
  "lib/cosmos/script/extract.rb" 0xCF4666D3
310
310
  "lib/cosmos/core_ext/range.rb" 0x0D55D9D1
@@ -312,7 +312,7 @@
312
312
  "lib/cosmos/core_ext/file.rb" 0x1309270C
313
313
  "lib/cosmos/core_ext/socket.rb" 0xB859FE77
314
314
  "lib/cosmos/core_ext/cosmos_io.rb" 0xF098AAE0
315
- "lib/cosmos/core_ext/array.rb" 0x0D89471A
315
+ "lib/cosmos/core_ext/array.rb" 0x660BC482
316
316
  "lib/cosmos/core_ext/class.rb" 0x858C349B
317
317
  "lib/cosmos/core_ext/objectspace.rb" 0x2CDC9CA2
318
318
  "lib/cosmos/core_ext/math.rb" 0xEFD1636D
@@ -322,5 +322,5 @@
322
322
  "lib/cosmos/core_ext/exception.rb" 0x695F7020
323
323
  "lib/cosmos/core_ext/string.rb" 0xE82EACEE
324
324
  "lib/cosmos/core_ext/hash.rb" 0x99038BE1
325
- "lib/cosmos/core_ext/matrix.rb" 0xC7ABFF88
325
+ "lib/cosmos/core_ext/matrix.rb" 0x9DDBCA0B
326
326
  "lib/cosmos.rb" 0x116E7B3E
@@ -205,7 +205,10 @@ class Array
205
205
  # start_value and end_value
206
206
  def range_within(start_value, end_value)
207
207
  raise "end_value: #{end_value} must be greater than start_value: #{start_value}" if end_value < start_value
208
- Range.new(index_gt_eq(start_value), index_lt_eq(end_value))
208
+ range = Range.new(index_gt_eq(start_value), index_lt_eq(end_value))
209
+ # Sometimes we get a backwards range so check for that and reverse it
210
+ range = Range.new(range.last, range.first) if range.last < range.first
211
+ range
209
212
  end
210
213
 
211
214
  if !(self.method_defined?(:sum))
@@ -141,6 +141,9 @@ class Matrix
141
141
  @rows[i][row] = x*r[i][0] + y*r[i][1] + z*r[i][2]
142
142
  end
143
143
  end
144
+ # Ensure the final row is floating point for consistency
145
+ @rows[3].map! {|x| x.to_f }
146
+ return self
144
147
  end
145
148
 
146
149
  end
@@ -19,54 +19,60 @@ module Cosmos
19
19
  include Singleton
20
20
 
21
21
  # Displays a Find dialog
22
- # @param text [Qt::PlainTextEdit] Dialog parent
23
- def self.show_find(text)
24
- self.instance.show_find(text)
22
+ # @param parent [Qt::Widget] Dialog parent which must implement a
23
+ # search_text method which returns a String to search on
24
+ def self.show_find(parent)
25
+ self.instance.show_find(parent)
25
26
  end
26
- def show_find(text)
27
+ def show_find(parent)
28
+ @parent = parent
27
29
  disable_replace
28
- show_dialog(text)
30
+ show_dialog
29
31
  end
30
32
 
31
33
  # Displays a Find/Replace dialog
32
- # @param text [Qt::PlainTextEdit] Dialog parent
33
- def self.show_replace(text)
34
- self.instance.show_replace(text)
34
+ # @param parent [Qt::Widget] Dialog parent which must implement a
35
+ # search_text method which returns a String to search on
36
+ def self.show_replace(parent)
37
+ self.instance.show_replace(parent)
35
38
  end
36
- def show_replace(text)
39
+ def show_replace(parent)
40
+ @parent = parent
37
41
  enable_replace
38
- show_dialog(text)
42
+ show_dialog
39
43
  end
40
44
 
41
- # @param text [Qt::PlainTextEdit] Text widget to search
42
- def self.find_next(text)
43
- self.instance.find_next(text)
45
+ # @param parent [#search_text] Object which must implement a
46
+ # search_text method which returns a String to search on
47
+ def self.find_next(parent)
48
+ self.instance.find_next(parent)
44
49
  end
45
- def find_next(text)
50
+ def find_next(parent)
46
51
  flags = find_flags()
47
52
  flags &= ~Qt::TextDocument::FindBackward.to_i
48
- found = text.find(find_text(), flags)
53
+ found = parent.search_text.find(find_text(), flags)
49
54
  if not found and wrap_around?
50
- cursor = text.textCursor
55
+ cursor = parent.search_text.textCursor
51
56
  cursor.movePosition(Qt::TextCursor::Start)
52
- text.setTextCursor(cursor)
53
- text.find(find_text(), flags)
57
+ parent.search_text.setTextCursor(cursor)
58
+ parent.search_text.find(find_text(), flags)
54
59
  end
55
60
  end
56
61
 
57
- # @param text [Qt::PlainTextEdit] Text widget to search
58
- def self.find_previous(text)
59
- self.instance.find_previous(text)
62
+ # @param parent [#search_text] Object which must implement a
63
+ # search_text method which returns a String to search on
64
+ def self.find_previous(parent)
65
+ self.instance.find_previous(parent)
60
66
  end
61
- def find_previous(text)
67
+ def find_previous(parent)
62
68
  flags = find_flags()
63
69
  flags |= Qt::TextDocument::FindBackward.to_i
64
- found = text.find(find_text(), flags)
70
+ found = parent.search_text.find(find_text(), flags)
65
71
  if not found and wrap_around?
66
- cursor = text.textCursor
72
+ cursor = parent.search_text.textCursor
67
73
  cursor.movePosition(Qt::TextCursor::End)
68
- text.setTextCursor(cursor)
69
- text.find(find_text(), flags)
74
+ parent.search_text.setTextCursor(cursor)
75
+ parent.search_text.find(find_text(), flags)
70
76
  end
71
77
  end
72
78
 
@@ -156,10 +162,10 @@ module Cosmos
156
162
  button_layout
157
163
  end
158
164
 
159
- def show_dialog(text)
165
+ def show_dialog
160
166
  @find_box.selectAll
161
167
  @find_box.setFocus(Qt::PopupFocusReason)
162
- setParent(text, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | 3)
168
+ setParent(@parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | 3)
163
169
  show()
164
170
  end
165
171
 
@@ -198,7 +204,7 @@ module Cosmos
198
204
  end
199
205
 
200
206
  def handle_find_next
201
- text = parentWidget
207
+ text = @parent.search_text
202
208
  found = text.find(find_text, find_flags)
203
209
  if not found and wrap_around?
204
210
  cursor = text.textCursor
@@ -213,7 +219,7 @@ module Cosmos
213
219
  end
214
220
 
215
221
  def handle_replace
216
- text = parentWidget
222
+ text = @parent.search_text
217
223
  if text.textCursor.hasSelection &&
218
224
  text.textCursor.selectedText == find_text
219
225
  found = true
@@ -231,17 +237,18 @@ module Cosmos
231
237
  end
232
238
  end
233
239
  if found
234
- text.textCursor.removeSelectedText
235
- text.textCursor.insertText(replace_text)
236
240
  cursor = text.textCursor
237
- cursor.setPosition(cursor.position-1)
238
- cursor.select(Qt::TextCursor::WordUnderCursor)
241
+ cursor.removeSelectedText
242
+ position = cursor.position
243
+ cursor.insertText(replace_text)
244
+ # Move the cursor back over the inserted text to select it
245
+ cursor.movePosition(Qt::TextCursor::PreviousCharacter, Qt::TextCursor::KeepAnchor, replace_text.length)
239
246
  text.setTextCursor(cursor)
240
247
  end
241
248
  end
242
249
 
243
250
  def handle_replace_all
244
- text = parentWidget
251
+ text = @parent.search_text
245
252
  cursor = text.textCursor
246
253
  # Start the edit block so this can be all undone with a single undo step
247
254
  cursor.beginEditBlock
@@ -79,6 +79,8 @@ module Cosmos
79
79
  attr_accessor_with_redraw :show_popup_x_y
80
80
  # Use x_value as floating point UTC timestamp with unix epoch
81
81
  attr_accessor_with_redraw :unix_epoch_x_values
82
+ # Display x_value as UTC timestamp
83
+ attr_accessor_with_redraw :utc_time
82
84
 
83
85
  #########################################################################
84
86
  # Callback attributes
@@ -145,6 +147,7 @@ module Cosmos
145
147
  @ordered_x_values = true
146
148
  @show_popup_x_y = false
147
149
  @unix_epoch_x_values = true
150
+ @utc_time = false
148
151
 
149
152
  # Initialize the callbacks
150
153
  @draw_cursor_line_callback = nil
@@ -247,7 +247,9 @@ module Cosmos
247
247
  def convert_x_value_to_text(value, max_characters)
248
248
  if !@show_popup_x_y and @unix_epoch_x_values
249
249
  if (value > 1 and value < 2147483647)
250
- text = Time.at(value.to_f).formatted(false) # no year
250
+ time = Time.at(value.to_f)
251
+ time = time.utc if @utc_time
252
+ text = time.formatted(false) # no year
251
253
  else
252
254
  text = value.to_s
253
255
  end
@@ -302,29 +302,11 @@ module Cosmos
302
302
  # Preferred blend over background
303
303
  GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)
304
304
 
305
- # Light on
306
- GL.Enable(GL::LIGHT0)
307
- GL.Light(GL::LIGHT0, GL::AMBIENT, @light.ambient)
308
- GL.Light(GL::LIGHT0, GL::DIFFUSE, @light.diffuse)
309
- GL.Light(GL::LIGHT0, GL::SPECULAR, @light.specular)
310
- GL.Light(GL::LIGHT0, GL::POSITION, @light.position)
311
- GL.Light(GL::LIGHT0, GL::SPOT_DIRECTION, @light.direction)
312
- GL.Lightf(GL::LIGHT0, GL::SPOT_EXPONENT, @light.exponent)
313
- GL.Lightf(GL::LIGHT0, GL::SPOT_CUTOFF, @light.cutoff)
314
- GL.Lightf(GL::LIGHT0, GL::CONSTANT_ATTENUATION, @light.c_attn)
315
- GL.Lightf(GL::LIGHT0, GL::LINEAR_ATTENUATION, @light.l_attn)
316
- GL.Lightf(GL::LIGHT0, GL::QUADRATIC_ATTENUATION, @light.q_attn)
317
-
305
+ enable_light(@light)
318
306
  # Viewer is close
319
307
  GL.LightModeli(GL::LIGHT_MODEL_LOCAL_VIEWER, 1)
320
308
 
321
- # Material colors
322
- GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @material.ambient)
323
- GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @material.diffuse)
324
- GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @material.specular)
325
- GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @material.emission)
326
- GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @material.shininess)
327
-
309
+ enable_material(@material)
328
310
  # Vertex colors change both diffuse and ambient
329
311
  GL.ColorMaterial(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE)
330
312
  GL.Disable(GL::COLOR_MATERIAL)
@@ -349,8 +331,59 @@ module Cosmos
349
331
  def paintGL
350
332
  # Set viewport
351
333
  GL.Viewport(0, 0, @wvt.w, @wvt.h)
334
+ reset_gl_state()
335
+ clear_solid_background()
336
+
337
+ # Depth test on by default
338
+ GL.DepthMask(GL::TRUE)
339
+ GL.Enable(GL::DEPTH_TEST)
352
340
 
353
- # Reset important stuff
341
+ # Switch to projection matrix
342
+ GL.MatrixMode(GL::PROJECTION)
343
+ GL.LoadIdentity
344
+ case @projection
345
+ when :PARALLEL
346
+ GL.Ortho(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
347
+ when :PERSPECTIVE
348
+ GL.Frustum(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
349
+ end
350
+
351
+ # Switch to model matrix
352
+ GL.MatrixMode(GL::MODELVIEW)
353
+ GL.LoadIdentity
354
+
355
+ enable_light(@light)
356
+ enable_material(@material)
357
+
358
+ # Color commands change both
359
+ GL.ColorMaterial(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE)
360
+ # Global ambient light
361
+ GL.LightModel(GL::LIGHT_MODEL_AMBIENT, @ambient)
362
+
363
+ # Enable fog
364
+ if @options.include?(:VIEWER_FOG)
365
+ GL.Enable(GL::FOG)
366
+ GL.Fog(GL::FOG_COLOR, @top_background) # Disappear into the background
367
+ GL.Fogf(GL::FOG_START, (@distance - @diameter).to_f) # Range tight around model position
368
+ GL.Fogf(GL::FOG_END, (@distance + @diameter).to_f) # Far place same as clip plane:- clipped stuff is in the mist!
369
+ GL.Fogi(GL::FOG_MODE, GL::LINEAR) # Simple linear depth cueing
370
+ end
371
+
372
+ # Dithering
373
+ GL.Enable(GL::DITHER) if @options.include?(:VIEWER_DITHER)
374
+ # Enable lighting
375
+ GL.Enable(GL::LIGHTING) if @options.include?(:VIEWER_LIGHTING)
376
+
377
+ # Set model matrix
378
+ GL.LoadMatrixf(@transform)
379
+
380
+ draw_axis() if (@draw_axis and @draw_axis > 0)
381
+
382
+ # Draw what's visible
383
+ @scene.draw(self) if @scene
384
+ end
385
+
386
+ def reset_gl_state
354
387
  GL.ShadeModel(GL::SMOOTH)
355
388
  GL.PolygonMode(GL::FRONT_AND_BACK, GL::FILL)
356
389
  GL.Disable(GL::LIGHTING)
@@ -370,8 +403,9 @@ module Cosmos
370
403
  GL.LoadIdentity
371
404
  GL.MatrixMode(GL::MODELVIEW)
372
405
  GL.LoadIdentity
406
+ end
373
407
 
374
- # Clear to solid background
408
+ def clear_solid_background
375
409
  GL.ClearDepth(1.0)
376
410
  GL.ClearColor(@top_background[0], @top_background[1], @top_background[2], @top_background[3])
377
411
  if @top_background == @bottom_background
@@ -397,105 +431,61 @@ module Cosmos
397
431
  # Raises false error on Mac
398
432
  end
399
433
  end
434
+ end
400
435
 
401
- # Depth test on by default
402
- GL.DepthMask(GL::TRUE)
403
- GL.Enable(GL::DEPTH_TEST)
404
-
405
- # Switch to projection matrix
406
- GL.MatrixMode(GL::PROJECTION)
407
- GL.LoadIdentity
408
- case @projection
409
- when :PARALLEL
410
- GL.Ortho(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
411
- when :PERSPECTIVE
412
- GL.Frustum(@wvt.left, @wvt.right, @wvt.bottom, @wvt.top, @wvt.hither, @wvt.yon)
413
- end
414
-
415
- # Switch to model matrix
416
- GL.MatrixMode(GL::MODELVIEW)
417
- GL.LoadIdentity
436
+ def draw_axis
437
+ GL.PushMatrix
438
+ GL.LineWidth(2.5)
439
+ GL.Color3f(1.0, 0.0, 0.0)
440
+ GL.Begin(GL::LINES)
441
+ GL.Vertex3f(-@draw_axis.to_f, 0.0, 0.0)
442
+ GL.Vertex3f(@draw_axis.to_f, 0.0, 0.0)
443
+ begin
444
+ GL.End
445
+ rescue
446
+ # Raises false error on Mac
447
+ end
448
+ GL.Color3f(0.0, 1.0, 0.0)
449
+ GL.Begin(GL::LINES)
450
+ GL.Vertex3f(0, -@draw_axis, 0.0)
451
+ GL.Vertex3f(0, @draw_axis, 0)
452
+ begin
453
+ GL.End
454
+ rescue
455
+ # Raises false error on Mac
456
+ end
457
+ GL.Color3f(0.0, 0.0, 1.0)
458
+ GL.Begin(GL::LINES)
459
+ GL.Vertex3f(0, 0, -@draw_axis)
460
+ GL.Vertex3f(0, 0, @draw_axis)
461
+ begin
462
+ GL.End
463
+ rescue
464
+ # Raises false error on Mac
465
+ end
466
+ GL.PopMatrix
467
+ end
418
468
 
419
- # Set light parameters
469
+ def enable_light(light)
420
470
  GL.Enable(GL::LIGHT0)
421
- GL.Light(GL::LIGHT0, GL::AMBIENT, @light.ambient)
422
- GL.Light(GL::LIGHT0, GL::DIFFUSE, @light.diffuse)
423
- GL.Light(GL::LIGHT0, GL::SPECULAR, @light.specular)
424
- GL.Light(GL::LIGHT0, GL::POSITION, @light.position)
425
- GL.Light(GL::LIGHT0, GL::SPOT_DIRECTION, @light.direction)
426
- GL.Lightf(GL::LIGHT0, GL::SPOT_EXPONENT, @light.exponent)
427
- GL.Lightf(GL::LIGHT0, GL::SPOT_CUTOFF, @light.cutoff)
428
- GL.Lightf(GL::LIGHT0, GL::CONSTANT_ATTENUATION, @light.c_attn)
429
- GL.Lightf(GL::LIGHT0, GL::LINEAR_ATTENUATION, @light.l_attn)
430
- GL.Lightf(GL::LIGHT0, GL::QUADRATIC_ATTENUATION, @light.q_attn)
431
-
432
- # Default material colors
433
- GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, @material.ambient)
434
- GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, @material.diffuse)
435
- GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, @material.specular)
436
- GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, @material.emission)
437
- GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, @material.shininess)
438
-
439
- # Color commands change both
440
- GL.ColorMaterial(GL::FRONT_AND_BACK, GL::AMBIENT_AND_DIFFUSE)
441
-
442
- # Global ambient light
443
- GL.LightModel(GL::LIGHT_MODEL_AMBIENT, @ambient)
444
-
445
- # Enable fog
446
- if @options.include?(:VIEWER_FOG)
447
- GL.Enable(GL::FOG)
448
- GL.Fog(GL::FOG_COLOR, @top_background) # Disappear into the background
449
- GL.Fogf(GL::FOG_START, (@distance - @diameter).to_f) # Range tight around model position
450
- GL.Fogf(GL::FOG_END, (@distance + @diameter).to_f) # Far place same as clip plane:- clipped stuff is in the mist!
451
- GL.Fogi(GL::FOG_MODE, GL::LINEAR) # Simple linear depth cueing
452
- end
453
-
454
- # Dithering
455
- GL.Enable(GL::DITHER) if @options.include?(:VIEWER_DITHER)
456
-
457
- # Enable lighting
458
- GL.Enable(GL::LIGHTING) if @options.include?(:VIEWER_LIGHTING)
459
-
460
- # Set model matrix
461
- GL.LoadMatrixf(@transform)
462
-
463
- if (@draw_axis and @draw_axis > 0)
464
- # Draw axis
465
- GL.PushMatrix
466
- GL.LineWidth(2.5)
467
- GL.Color3f(1.0, 0.0, 0.0)
468
- GL.Begin(GL::LINES)
469
- GL.Vertex3f(-@draw_axis.to_f, 0.0, 0.0)
470
- GL.Vertex3f(@draw_axis.to_f, 0.0, 0.0)
471
- begin
472
- GL.End
473
- rescue
474
- # Raises false error on Mac
475
- end
476
- GL.Color3f(0.0, 1.0, 0.0)
477
- GL.Begin(GL::LINES)
478
- GL.Vertex3f(0, -@draw_axis, 0.0)
479
- GL.Vertex3f(0, @draw_axis, 0)
480
- begin
481
- GL.End
482
- rescue
483
- # Raises false error on Mac
484
- end
485
- GL.Color3f(0.0, 0.0, 1.0)
486
- GL.Begin(GL::LINES)
487
- GL.Vertex3f(0, 0, -@draw_axis)
488
- GL.Vertex3f(0, 0, @draw_axis)
489
- begin
490
- GL.End
491
- rescue
492
- # Raises false error on Mac
493
- end
494
- GL.PopMatrix
495
- end
496
-
497
- # Draw what's visible
498
- @scene.draw(self) if @scene
471
+ GL.Light(GL::LIGHT0, GL::AMBIENT, light.ambient)
472
+ GL.Light(GL::LIGHT0, GL::DIFFUSE, light.diffuse)
473
+ GL.Light(GL::LIGHT0, GL::SPECULAR, light.specular)
474
+ GL.Light(GL::LIGHT0, GL::POSITION, light.position)
475
+ GL.Light(GL::LIGHT0, GL::SPOT_DIRECTION, light.direction)
476
+ GL.Lightf(GL::LIGHT0, GL::SPOT_EXPONENT, light.exponent)
477
+ GL.Lightf(GL::LIGHT0, GL::SPOT_CUTOFF, light.cutoff)
478
+ GL.Lightf(GL::LIGHT0, GL::CONSTANT_ATTENUATION, light.c_attn)
479
+ GL.Lightf(GL::LIGHT0, GL::LINEAR_ATTENUATION, light.l_attn)
480
+ GL.Lightf(GL::LIGHT0, GL::QUADRATIC_ATTENUATION, light.q_attn)
481
+ end
482
+
483
+ def enable_material(material)
484
+ GL.Material(GL::FRONT_AND_BACK, GL::AMBIENT, material.ambient)
485
+ GL.Material(GL::FRONT_AND_BACK, GL::DIFFUSE, material.diffuse)
486
+ GL.Material(GL::FRONT_AND_BACK, GL::SPECULAR, material.specular)
487
+ GL.Material(GL::FRONT_AND_BACK, GL::EMISSION, material.emission)
488
+ GL.Materialf(GL::FRONT_AND_BACK, GL::SHININESS, material.shininess)
499
489
  end
500
490
 
501
491
  def resizeGL(width, height)
@@ -522,20 +512,18 @@ module Cosmos
522
512
  [@worldpx*sx.to_f + @ax, @ay - @worldpx*sy.to_f, -@distance.to_f]
523
513
  end
524
514
 
525
- def eyeToWorld(e)
526
- [e[0]*@itransform[0][0] + e[1]*@itransform[1][0] + e[2]*@itransform[2][0] + @itransform[3][0],
527
- e[0]*@itransform[0][1] + e[1]*@itransform[1][1] + e[2]*@itransform[2][1] + @itransform[3][1],
528
- e[0]*@itransform[0][2] + e[1]*@itransform[1][2] + e[2]*@itransform[2][2] + @itransform[3][2]]
529
- end
530
-
531
515
  def worldToEyeZ(w)
532
516
  w[0]*@transform[0][2] + w[1]*@transform[1][2] + w[2]*@transform[2][2] + @transform[3][2]
533
517
  end
534
518
 
519
+ def eyeToWorld(e)
520
+ calc_prime(e)
521
+ end
522
+
535
523
  def calc_prime(v)
536
- return [v[0]*@itransform[0][0] + v[1]*@itransform[1][0] + v[2]*@itransform[2][0] + @itransform[3][0],
537
- v[0]*@itransform[0][1] + v[1]*@itransform[1][1] + v[2]*@itransform[2][1] + @itransform[3][1],
538
- v[0]*@itransform[0][2] + v[1]*@itransform[1][2] + v[2]*@itransform[2][2] + @itransform[3][2]]
524
+ [v[0]*@itransform[0][0] + v[1]*@itransform[1][0] + v[2]*@itransform[2][0] + @itransform[3][0],
525
+ v[0]*@itransform[0][1] + v[1]*@itransform[1][1] + v[2]*@itransform[2][1] + @itransform[3][1],
526
+ v[0]*@itransform[0][2] + v[1]*@itransform[1][2] + v[2]*@itransform[2][2] + @itransform[3][2]]
539
527
  end
540
528
 
541
529
  def worldVector(fx, fy, tx, ty)