ruby-gr 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/gr/ffi.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'ffi'
4
4
 
5
5
  module GR
6
+ # FFI Wrapper module for GR
6
7
  module FFI
7
8
  extend ::FFI::Library
8
9
 
@@ -191,5 +192,7 @@ module GR
191
192
  attach_function :gr_shadelines, %i[int pointer pointer int int int], :void
192
193
  attach_function :gr_panzoom, %i[double double double double pointer pointer pointer pointer], :void
193
194
  # attach_function :gr_findboundary
195
+ attach_function :gr_setresamplemethod, %i[uint], :void
196
+ attach_function :gr_inqresamplemethod, %i[pointer], :void
194
197
  end
195
198
  end
data/lib/gr3.rb CHANGED
@@ -71,6 +71,11 @@ module GR3
71
71
  end
72
72
 
73
73
  # This function allows the user to find out how his commands are rendered.
74
+ # If gr3 is initialized, a string in the format:
75
+ # `"gr3 - " + window toolkit + " - " + framebuffer extension + " - " + OpenGL version + " - " + OpenGL renderer string`.
76
+ # For example `"gr3 - GLX - GL_ARB_framebuffer_object - 2.1 Mesa 7.10.2 - Software Rasterizer"`
77
+ # might be returned on a Linux system (using GLX) with an available GL_ARB_framebuffer_object implementation.
78
+ # If gr3 is not initialized `"Not initialized"` is returned.
74
79
  def getrenderpathstring(*)
75
80
  super
76
81
  end
@@ -85,14 +90,20 @@ module GR3
85
90
  super
86
91
  end
87
92
 
93
+ # Use the currently bound framebuffer as the framebuffer used for drawing to OpenGL (using gr3.drawimage).
94
+ # This function is only needed when you do not want to render to 0, the default framebuffer.
88
95
  def usecurrentframebuffer(*)
89
96
  super
90
97
  end
91
98
 
99
+ # Set the framebuffer used for drawing to OpenGL (using gr3.drawimage).
100
+ # This function is only needed when you do not want to render to 0, the default framebuffer.
92
101
  def useframebuffer(*)
93
102
  super
94
103
  end
95
104
 
105
+ # Set rendering quality
106
+ # @param quality [] The quality to set
96
107
  def setquality(*)
97
108
  super
98
109
  end
@@ -121,9 +132,15 @@ module GR3
121
132
  end
122
133
 
123
134
  # This function creates a int from vertex position, normal and color data.
124
- def createmesh(_n, vertices, normals, colors)
135
+ # Returns a mesh.
136
+ # @param n [Integer] the number of vertices in the mesh
137
+ # @param vertices [Array, NArray] the vertex positions
138
+ # @param normals [Array, NArray] the vertex normals
139
+ # @param colors [Array, NArray] the vertex colors,
140
+ # they should be white (1,1,1) if you want to change the color for each drawn mesh
141
+ def createmesh(n, vertices, normals, colors)
125
142
  inquiry_int do |mesh|
126
- super(mesh, vertices, normals, colors)
143
+ super(mesh, n, vertices, normals, colors)
127
144
  end
128
145
  end
129
146
 
@@ -134,31 +151,63 @@ module GR3
134
151
  end
135
152
  end
136
153
 
137
- # This function creates a int from vertex position, normal and color data.
154
+ # This function creates an indexed mesh from vertex information (position,
155
+ # normal and color) and triangle information (indices).
156
+ # Returns a mesh.
157
+ # @param num_vertices [Integer] the number of vertices in the mesh
158
+ # @param vertices [Array, NArray] the vertex positions
159
+ # @param normals [Array, NArray] the vertex normals
160
+ # @param colors [Array, NArray] the vertex colors,
161
+ # they should be white (1,1,1) if you want to change the color for each drawn mesh
162
+ # @param num_indices [Integer] the number of indices in the mesh (three times the number of triangles)
163
+ # @param indices [Array, NArray] the index array (vertex indices for each triangle)
138
164
  def createindexedmesh(num_vertices, vertices, normals, colors, num_indices, indices)
139
165
  inquiry_int do |mesh|
140
166
  super(mesh, num_vertices, vertices, normals, colors, num_indices, indices)
141
167
  end
142
168
  end
143
169
 
144
- # This function adds a mesh to the draw list, so it will be drawn when the user calls gr3_getpixmap.
170
+ # This function adds a mesh to the draw list, so it will be drawn when the user calls getpixmap.
171
+ # The given data stays owned by the user, a copy will be saved in the draw list and the mesh reference counter will be increased.
172
+ # @param mesh [Integer] The mesh to be drawn
173
+ # @param n [Integer] The number of meshes to be drawn
174
+ # @param positions [Array, NArray] The positions where the meshes should be drawn
175
+ # @param directions [Array, NArray] The forward directions the meshes should be facing at
176
+ # @param ups [Array, NArray] The up directions
177
+ # @param colors [Array, NArray] The colors the meshes should be drawn in, it will be multiplied with each vertex color
178
+ # @param scales [Array, NArray] The scaling factors
145
179
  def drawmesh(*)
146
180
  super
147
181
  end
148
182
 
149
183
  # This function marks a mesh for deletion and removes the user’s reference from the mesh’s referenc counter,
150
184
  # so a user must not use the mesh after calling this function.
185
+ # @param mesh [Integer] The mesh that should be marked for deletion
151
186
  def deletemesh(*)
152
187
  super
153
188
  end
154
189
 
155
190
  # This function sets the view matrix by getting the position of the camera,
156
191
  # the position of the center of focus and the direction which should point up.
192
+ # @param camera_x [Array, NArray] The x-coordinate of the camera
193
+ # @param camera_y [Array, NArray] The y-coordinate of the camera
194
+ # @param camera_z [Array, NArray] The z-coordinate of the camera
195
+ # @param center_x [Array, NArray] The x-coordinate of the center of focus
196
+ # @param center_y [Array, NArray] The y-coordinate of the center of focus
197
+ # @param center_z [Array, NArray] The z-coordinate of the center of focus
198
+ # @param up_x [Array, NArray] The x-component of the up direction
199
+ # @param up_y [Array, NArray] The y-component of the up direction
200
+ # @param up_z [Array, NArray] The z-component of the up direction
157
201
  def cameralookat(*)
158
202
  super
159
203
  end
160
204
 
161
205
  # This function sets the projection parameters.
206
+ # This function takes effect when the next image is created.
207
+ # @param vertical_field_of_view [Numeric] This parameter is the vertical field of view in degrees.
208
+ # It must be greater than 0 and less than 180.
209
+ # @param zNear [Numeric] The distance to the near clipping plane.
210
+ # @param zFar [Numeric] The distance to the far clipping plane.
162
211
  def setcameraprojectionparameters(*)
163
212
  super
164
213
  end
@@ -169,6 +218,10 @@ module GR3
169
218
  end
170
219
 
171
220
  # This function sets the direction of light.
221
+ # If it is called with (0, 0, 0), the light is always pointing into the same direction as the camera.
222
+ # @param x [Numeric] The x-component of the light's direction
223
+ # @param y [Numeric] The y-component of the light's direction
224
+ # @param z [Numeric] The z-component of the light's direction
172
225
  def setlightdirection(*)
173
226
  super
174
227
  end
@@ -186,14 +239,17 @@ module GR3
186
239
  super
187
240
  end
188
241
 
242
+ # This function allows drawing a cylinder without requiring a mesh.
189
243
  def drawconemesh(*)
190
244
  super
191
245
  end
192
246
 
247
+ # This function allows drawing a cylinder without requiring a mesh.
193
248
  def drawcylindermesh(*)
194
249
  super
195
250
  end
196
251
 
252
+ # This function allows drawing a sphere without requiring a mesh.
197
253
  def drawspheremesh(*)
198
254
  super
199
255
  end
@@ -218,10 +274,12 @@ module GR3
218
274
  super
219
275
  end
220
276
 
277
+ # the current projection type: GR3_PROJECTION_PERSPECTIVE or GR3_PROJECTION_PARALLEL
221
278
  def getprojectiontype(*)
222
279
  super
223
280
  end
224
281
 
282
+ # @param type [Integer] the new projection type: GR3_PROJECTION_PERSPECTIVE or GR3_PROJECTION_PARALLEL
225
283
  def setprojectiontype(*)
226
284
  super
227
285
  end
@@ -229,40 +287,74 @@ module GR3
229
287
  # This function creates an isosurface from voxel data using the
230
288
  # marching cubes algorithm.
231
289
  # Returns a mesh.
290
+ # @param grid [NArray] 3D narray array containing the voxel data
291
+ # @param step [Array] voxel sizes in each direction
292
+ # @param offset [Array] coordinate origin in each direction
293
+ # @param isolevel [Integer] isovalue at which the surface will be created
232
294
  def createisosurfacemesh(grid, step, offset, isolevel)
233
- dim_x, dim_y, dim_z = grid.shape
234
- step_x, step_y, step_z = step
235
- offset_x, offset_y, offset_z = offset
236
- # NArray does not have the strides method
237
- bytesize = grid.class.byte_size
238
- stride_x = 1
239
- stride_y = dim_y
240
- stride_z = dim_y * dim_z
241
- # stride_x, stride_y, stride_z = stride
295
+ args = _preprocess_createslicemesh(grid, step, offset)
296
+ grid = args.shift
242
297
  inquiry_int do |mesh|
243
- super(mesh, uint16(grid), isolevel, dim_x, dim_y, dim_z,
244
- stride_x, stride_y, stride_z, step_x, step_y, step_z, offset_x, offset_y, offset_z)
298
+ super(mesh, uint16(grid), isolevel, *args)
245
299
  end
246
300
  end
247
301
 
248
302
  # Create a mesh of a surface plot similar to gr_surface.
303
+ # Uses the current colormap. To apply changes of the colormap
304
+ # a new mesh has to be created.
305
+ # @param nx [Integer] number of points in x-direction
306
+ # @param ny [Integer] number of points in y-direction
307
+ # @param px [Array, NArray] an array containing the x-coordinates
308
+ # @param py [Array, NArray] an array containing the y-coordinates
309
+ # @param pz [Array, NArray] an array of length nx * ny containing the z-coordinates
310
+ # @param option [Integer] option for the surface mesh; the GR3_SURFACE constants can be combined with bitwise or. See the table below.
311
+ # * 0 : GR3_SURFACE_DEFAULT
312
+ # * default behavior
313
+ # * 1 : GR3_SURFACE_NORMALS
314
+ # * interpolate the vertex normals from the gradient
315
+ # * 2 : GR3_SURFACE_FLAT
316
+ # * set all z-coordinates to zero
317
+ # * 4 : GR3_SURFACE_GRTRANSFORM
318
+ # * use gr_inqwindow, gr_inqspace and gr_inqscale to transform the data to NDC coordinates
319
+ # * 8 : GR3_SURFACE_GRCOLOR
320
+ # * color the surface according to the current gr colormap
321
+ # * 16 : GR3_SURFACE_GRZSHADED
322
+ # * like GR3_SURFACE_GRCOLOR, but use the z-value directly as color index
249
323
  def createsurfacemesh(nx, ny, px, py, pz, option = 0)
250
324
  inquiry_int do |mesh|
251
325
  super(mesh, nx, ny, px, py, pz, option)
252
326
  end
253
327
  end
254
328
 
255
- # Draw a mesh with the projection of gr.
329
+ # Draw a mesh with the projection of gr. It uses the current
330
+ # projection parameters (rotation, tilt) of gr.
331
+ # This function alters the projection type, the projection parameters,
332
+ # the viewmatrix and the light direction. If necessary, the user has to
333
+ # save them before the call to this function and restore them after
334
+ # the call to gr3_drawimage.
335
+ # @param mesh [Integer] the mesh to be drawn
336
+ # @param n [Integer] the number of meshes to be drawn
337
+ # @param positions [Array, NArray] the positions where the meshes should be drawn
338
+ # @param directions [Array, NArray] the forward directions the meshes should be facing at
339
+ # @param ups [Array, NArray] the up directions
340
+ # @param colors [Array, NArray] the colors the meshes should be drawn in, it will be multiplied with each vertex color
341
+ # @param scales [Array, NArray] the scaling factors
256
342
  def drawmesh_grlike(*)
257
343
  super
258
344
  end
259
345
 
260
346
  # Convenience function for drawing a surfacemesh.
347
+ # @param mesh [Integer] the mesh to be drawn
261
348
  def drawsurface(*)
262
349
  super
263
350
  end
264
351
 
265
352
  # Create a surface plot with gr3 and draw it with gks as cellarray.
353
+ # @param px [Array, NArray] an array containing the x-coordinates
354
+ # @param py [Array, NArray] an array containing the y-coordinates
355
+ # @param pz [Array, NArray] an array of length nx * ny containing the z-coordinates
356
+ # @param option [Integer] see the option parameter of gr_surface.
357
+ # OPTION_COLORED_MESH and OPTION_Z_SHADED_MESH are supported.
266
358
  def surface(px, py, pz, _option)
267
359
  nx = px.length
268
360
  ny = py.length
@@ -271,11 +363,28 @@ module GR3
271
363
  end
272
364
 
273
365
  # drawtubemesh
366
+ # Draw a tube following a path given by a list of points. The colors and
367
+ # radii arrays specify the color and radius at each point.
368
+ # @param n [Integer] the number of points given
369
+ # @param points [Array, NArray] the points the tube should go through
370
+ # @param colors [Array, NArray] the color at each point
371
+ # @param radii [Array, NArray] the desired tube radius at each point
372
+ # @param num_steps [Integer] the number of steps between each point, allowing for a more smooth tube
373
+ # @param num_segments [Integer] the number of segments each ring of the tube consists of,
374
+ # e.g. 3 would yield a triangular tube
274
375
  def drawtubemesh(n, points, colors, radii, num_steps = 10, num_segments = 20)
275
376
  super(n, points, colors, radii, num_steps, num_segments)
276
377
  end
277
378
 
278
- # createtubemesh
379
+ # Create a mesh object in the shape of a tube following a path given by a
380
+ # list of points. The colors and radii arrays specify the color and radius at
381
+ # each point.
382
+ # @param n [Integer] the number of points given
383
+ # @param points [Array, NArray] the points the tube should go through
384
+ # @param colors [Array, NArray] the color at each point
385
+ # @param radii [Array, NArray] the desired tube radius at each point
386
+ # @param num_steps [Integer] the number of steps between each point, allowing for a more smooth tube
387
+ # @param num_segments [Integer] the number of segments each ring of the tube consists of, e.g. 3 would yield a triangular tube
279
388
  def createtubemesh(n, points, colors, radii, num_steps = 10, num_segments = 20)
280
389
  inquiry_uint do |mesh| # mesh should be Int?
281
390
  super(mesh, n, points, colors, radii, num_steps, num_segments)
@@ -349,69 +458,38 @@ module GR3
349
458
  # drawn and at which positions they should go through the data. If neither
350
459
  # x nor y nor z are set, 0.5 will be used for all three.
351
460
  # Returns meshes for the yz-slice, the xz-slice and the xy-slice.
461
+ # @param grid [NArray] 3D narray array containing the voxel data
462
+ # @param x [Numeric] the position of the slice through the xz-plane (0 to 1)
463
+ # @param y [Numeric] the position of the slice through the xz-plane (0 to 1)
464
+ # @param z [Numeric] the position of the slice through the xz-plane (0 to 1)
465
+ # @param step [Array] voxel sizes in each direction
466
+ # @param offset [Array] coordinate origin in each direction
352
467
  def createslicemeshes(grid, x = nil, y = nil, z = nil, step = nil, offset = nil)
353
468
  if [x, y, z].all?(&:nil?)
354
469
  x = 0.5
355
470
  y = 0.5
356
471
  z = 0.5
357
472
  end
358
- _mesh_x = (createxslicemesh(grid, x, step, offset) if x)
359
- _mesh_y = (createyslicemesh(grid, y, step, offset) if y)
360
- _mesh_z = (createzslicemesh(grid, z, step, offset) if z)
361
- [_mesh_x, _mesh_y, _mesh_z]
362
- end
363
-
364
- def preprocess_createslicemesh(grid, step, offset)
365
- # TODO: raise error when grid is not narray
366
- # grid
367
- case grid.class::MAX
368
- when Integer
369
- input_max = grid.class::MAX
370
- when Float
371
- # floating point values are expected to be in range [0, 1]
372
- # Complex narrays are not taken into account
373
- input_max = 1
374
- grid[grid > 1] = 1
375
- else
376
- raise ArgumentError, 'grid must be three dimensional array of Real numbers'
377
- end
378
- scaling_factor = Numo::UInt16::MAX / input_max.to_f
379
- grid = (grid.cast_to(Numo::UInt64) * scaling_factor).cast_to(Numo::UInt16) # room for improvement
380
-
381
- # step & offset
382
- nx, ny, nz = grid.shape
383
- if step.nil? && offset.nil?
384
- step = [2.0 / (nx - 1), 2.0 / (ny - 1), 2.0 / (nz - 1)]
385
- offset = [-1.0, -1.0, -1.0]
386
- elsif offset.nil?
387
- offset = [-step[0] * (nx - 1) / 2.0,
388
- -step[1] * (ny - 1) / 2.0,
389
- -step[2] * (nz - 1) / 2.0]
390
- elsif step.nil?
391
- step = [-offset[0] * 2.0 / (nx - 1),
392
- -offset[1] * 2.0 / (ny - 1),
393
- -offset[2] * 2.0 / (nz - 1)]
394
- end
395
-
396
- step_x, step_y, step_z = step
397
- offset_x, offset_y, offset_z = offset
398
-
399
- [grid, nx, ny, nz, step_x, step_y, step_z, offset_x, offset_y, offset_z]
473
+ mesh_x = (createxslicemesh(grid, x, step, offset) if x)
474
+ mesh_y = (createyslicemesh(grid, y, step, offset) if y)
475
+ mesh_z = (createzslicemesh(grid, z, step, offset) if z)
476
+ [mesh_x, mesh_y, mesh_z]
400
477
  end
401
478
 
402
479
  # Creates a meshes for a slices through the yz-plane of the given data,
403
480
  # using the current GR colormap. Use the x parameter to set the position of
404
481
  # the yz-slice.
405
482
  # Returns a mesh for the yz-slice.
483
+ # @param grid [NArray] 3D narray array containing the voxel data
484
+ # @param x [Numeric] the position of the slice through the xz-plane (0 to 1)
485
+ # @param step [Array] voxel sizes in each direction
486
+ # @param offset [Array] coordinate origin in each direction
406
487
  def createxslicemesh(grid, x = 0.5, step = nil, offset = nil)
407
- grid, nx, ny, nz, step_x, step_y, step_z, offset_x, offset_y, offset_z = preprocess_createslicemesh(grid, step, offset)
408
- x = (x.clamp(0, 1) * nx).floor
409
- stride_x = 1
410
- stride_y = ny
411
- stride_z = ny * nz
488
+ args = _preprocess_createslicemesh(grid, step, offset)
489
+ grid = args.shift
490
+ x = (x.clamp(0, 1) * args[0]).floor
412
491
  inquiry_int do |mesh|
413
- super(mesh, grid, x, nx, ny, nz, stride_x, stride_y, stride_z,
414
- step_x, step_y, step_z, offset_x, offset_y, offset_z)
492
+ super(mesh, uint16(grid), x, *args)
415
493
  end
416
494
  end
417
495
 
@@ -419,15 +497,16 @@ module GR3
419
497
  # using the current GR colormap. Use the y parameter to set the position of
420
498
  # the xz-slice.
421
499
  # Returns a mesh for the xz-slice.
500
+ # @param grid [NArray] 3D narray array containing the voxel data
501
+ # @param y [Numeric] the position of the slice through the xz-plane (0 to 1)
502
+ # @param step [Array] voxel sizes in each direction
503
+ # @param offset [Array] coordinate origin in each direction
422
504
  def createyslicemesh(grid, y = 0.5, step = nil, offset = nil)
423
- grid, nx, ny, nz, step_x, step_y, step_z, offset_x, offset_y, offset_z = preprocess_createslicemesh(grid, step, offset)
424
- y = (y.clamp(0, 1) * ny).floor
425
- stride_x = nx
426
- stride_y = 1
427
- stride_z = nx * nz
505
+ args = _preprocess_createslicemesh(grid, step, offset)
506
+ grid = args.shift
507
+ y = (y.clamp(0, 1) * args[1]).floor
428
508
  inquiry_int do |mesh|
429
- super(mesh, grid, y, nx, ny, nz, stride_x, stride_y, stride_z,
430
- step_x, step_y, step_z, offset_x, offset_y, offset_z)
509
+ super(mesh, uint16(grid), y, *args)
431
510
  end
432
511
  end
433
512
 
@@ -435,19 +514,29 @@ module GR3
435
514
  # using the current GR colormap. Use the z parameter to set the position of
436
515
  # the xy-slice.
437
516
  # Returns a mesh for the xy-slice.
517
+ # @param grid [NArray] 3D narray array containing the voxel data
518
+ # @param z [Numeric] the position of the slice through the xz-plane (0 to 1)
519
+ # @param step [Array] voxel sizes in each direction
520
+ # @param offset [Array] coordinate origin in each direction
438
521
  def createzslicemesh(grid, z = 0.5, step = nil, offset = nil)
439
- grid, nx, ny, nz, step_x, step_y, step_z, offset_x, offset_y, offset_z = preprocess_createslicemesh(grid, step, offset)
440
- z = (z.clamp(0, 1) * nz).floor
441
- stride_x = ny * nz
442
- stride_y = ny
443
- stride_z = 1
522
+ args = _preprocess_createslicemesh(grid, step, offset)
523
+ grid = args.shift
524
+ z = (z.clamp(0, 1) * args[2]).floor
444
525
  inquiry_int do |mesh|
445
- super(mesh, grid, z, nx, ny, nz, stride_x, stride_y, stride_z,
446
- step_x, step_y, step_z, offset_x, offset_y, offset_z)
526
+ super(mesh, uint16(grid), z, *args)
447
527
  end
448
528
  end
449
529
 
450
530
  # Draw a yz-slice through the given data, using the current GR colormap.
531
+ # @param grid [NArray] 3D narray array containing the voxel data
532
+ # @param x [Numeric] the position of the slice through the yz-plane (0 to 1)
533
+ # @param step [Array] voxel sizes in each direction
534
+ # @param offset [Array] coordinate origin in each direction
535
+ # @param position [Array] the positions where the meshes should be drawn
536
+ # @param direction [Array] the forward directions the meshes should be facing at
537
+ # @param up [Array] the up directions
538
+ # @param color [Array] the colors the meshes should be drawn in, it will be multiplied with each vertex color
539
+ # @param scale [Array] the scaling factors
451
540
  def drawxslicemesh(grid, x = 0.5, step = nil, offset = nil,
452
541
  position = [0, 0, 0], direction = [0, 0, 1], up = [0, 1, 0],
453
542
  color = [1, 1, 1], scale = [1, 1, 1])
@@ -457,6 +546,15 @@ module GR3
457
546
  end
458
547
 
459
548
  # Draw a xz-slice through the given data, using the current GR colormap.
549
+ # @param grid [NArray] 3D narray array containing the voxel data
550
+ # @param y [Numeric] the position of the slice through the xz-plane (0 to 1)
551
+ # @param step [Array] voxel sizes in each direction
552
+ # @param offset [Array] coordinate origin in each direction
553
+ # @param position [Array] the positions where the meshes should be drawn
554
+ # @param direction [Array] the forward directions the meshes should be facing at
555
+ # @param up [Array] the up directions
556
+ # @param color [Array] the colors the meshes should be drawn in, it will be multiplied with each vertex color
557
+ # @param scale [Array] the scaling factors
460
558
  def drawyslicemesh(grid, y = 0.5, step = nil, offset = nil,
461
559
  position = [0, 0, 0], direction = [0, 0, 1], up = [0, 1, 0],
462
560
  color = [1, 1, 1], scale = [1, 1, 1])
@@ -466,6 +564,15 @@ module GR3
466
564
  end
467
565
 
468
566
  # Draw a xy-slice through the given data, using the current GR colormap.
567
+ # @param grid [NArray] 3D narray array containing the voxel data
568
+ # @param z [Numeric] the position of the slice through the xy-plane (0 to 1)
569
+ # @param step [Array] voxel sizes in each direction
570
+ # @param offset [Array] coordinate origin in each direction
571
+ # @param position [Array] the positions where the meshes should be drawn
572
+ # @param direction [Array] the forward directions the meshes should be facing at
573
+ # @param up [Array] the up directions
574
+ # @param color [Array] the colors the meshes should be drawn in, it will be multiplied with each vertex color
575
+ # @param scale [Array] the scaling factors
469
576
  def drawzslicemesh(grid, z = 0.5, step = nil, offset = nil,
470
577
  position = [0, 0, 0], direction = [0, 0, 1], up = [0, 1, 0],
471
578
  color = [1, 1, 1], scale = [1, 1, 1])
@@ -478,6 +585,17 @@ module GR3
478
585
  # Use the parameters x, y or z to specify what slices should be drawn and at
479
586
  # which positions they should go through the data. If neither x nor y nor
480
587
  # z are set, 0.5 will be used for all three.
588
+ # @param grid [NArray] 3D narray array containing the voxel data
589
+ # @param x [Numeric] the position of the slice through the yz-plane (0 to 1)
590
+ # @param y [Numeric] the position of the slice through the xz-plane (0 to 1)
591
+ # @param z [Numeric] the position of the slice through the xy-plane (0 to 1)
592
+ # @param step [Array] voxel sizes in each direction
593
+ # @param offset [Array] coordinate origin in each direction
594
+ # @param position [Array] the positions where the meshes should be drawn
595
+ # @param direction [Array] the forward directions the meshes should be facing at
596
+ # @param up [Array] the up directions
597
+ # @param color [Array] the colors the meshes should be drawn in, it will be multiplied with each vertex color
598
+ # @param scale [Array] the scaling factors
481
599
  def drawslicemeshes(grid, x = nil, y = nil, z = nil, step = nil,
482
600
  offset = nil, position = [0, 0, 0], direction = [0, 0, 1], up = [0, 1, 0],
483
601
  color = [1, 1, 1], scale = [1, 1, 1])
@@ -500,14 +618,59 @@ module GR3
500
618
  super(nx, ny, nz, data, algorithm, dmin, dmax)
501
619
  end
502
620
  end
503
- end
504
621
 
505
- # Constants - imported from GR.jl
622
+ private
623
+
624
+ def _preprocess_createslicemesh(grid, step, offset)
625
+ # TODO: raise error when grid is not narray
626
+ # grid
627
+ case grid.class::MAX
628
+ when Integer
629
+ input_max = grid.class::MAX
630
+ when Float
631
+ # floating point values are expected to be in range [0, 1]
632
+ # Complex narrays are not taken into account
633
+ input_max = 1
634
+ grid[grid > 1] = 1
635
+ else
636
+ raise ArgumentError, 'grid must be three dimensional array of Real numbers'
637
+ end
638
+ scaling_factor = Numo::UInt16::MAX / input_max.to_f
639
+ grid = (grid.cast_to(Numo::UInt64) * scaling_factor).cast_to(Numo::UInt16) # room for improvement
640
+
641
+ # step & offset
642
+ nx, ny, nz = grid.shape
643
+ if step.nil? && offset.nil?
644
+ step = [2.0 / (nx - 1), 2.0 / (ny - 1), 2.0 / (nz - 1)]
645
+ offset = [-1.0, -1.0, -1.0]
646
+ elsif offset.nil?
647
+ offset = [-step[0] * (nx - 1) / 2.0,
648
+ -step[1] * (ny - 1) / 2.0,
649
+ -step[2] * (nz - 1) / 2.0]
650
+ elsif step.nil?
651
+ step = [-offset[0] * 2.0 / (nx - 1),
652
+ -offset[1] * 2.0 / (ny - 1),
653
+ -offset[2] * 2.0 / (nz - 1)]
654
+ end
655
+
656
+ step_x, step_y, step_z = step
657
+ offset_x, offset_y, offset_z = offset
658
+
659
+ # strides
660
+ stride_x = ny * nz
661
+ stride_y = nz
662
+ stride_z = 1
663
+
664
+ [grid, nx, ny, nz, stride_x, stride_y, stride_z, step_x, step_y, step_z, offset_x, offset_y, offset_z]
665
+ end
666
+ end
506
667
 
668
+ # InitAttribute
507
669
  IA_END_OF_LIST = 0
508
670
  IA_FRAMEBUFFER_WIDTH = 1
509
671
  IA_FRAMEBUFFER_HEIGHT = 2
510
672
 
673
+ # Error
511
674
  ERROR_NONE = 0
512
675
  ERROR_INVALID_VALUE = 1
513
676
  ERROR_INVALID_ATTRIBUTE = 2
@@ -520,6 +683,7 @@ module GR3
520
683
  ERROR_CANNOT_OPEN_FILE = 9
521
684
  ERROR_EXPORT = 10
522
685
 
686
+ # Quality
523
687
  QUALITY_OPENGL_NO_SSAA = 0
524
688
  QUALITY_OPENGL_2X_SSAA = 2
525
689
  QUALITY_OPENGL_4X_SSAA = 4
@@ -531,9 +695,11 @@ module GR3
531
695
  QUALITY_POVRAY_8X_SSAA = 8 + 1
532
696
  QUALITY_POVRAY_16X_SSAA = 16 + 1
533
697
 
698
+ # Drawable
534
699
  DRAWABLE_OPENGL = 1
535
700
  DRAWABLE_GKS = 2
536
701
 
702
+ # SurfaceOption
537
703
  SURFACE_DEFAULT = 0
538
704
  SURFACE_NORMALS = 1
539
705
  SURFACE_FLAT = 2