cosmos 3.6.2 → 3.6.3

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.
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)