soby 0.1.1.1 → 0.1.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 75e7385d5735df3f2e46baf9ff541a3d9a4680dd
4
- data.tar.gz: 0be5f95f21b0380aeb6beb56267bcd1c15982dd0
3
+ metadata.gz: 848e3ae068e46b6a989ffe10d023ccafe730dc07
4
+ data.tar.gz: efe6a770edc21dee8dab8572359c0a0e06c5bff5
5
5
  SHA512:
6
- metadata.gz: b895c8bd25a2f4392b126af7dead26d434963665f50765698d0399edbcd054dd2dc5fe2d51f11a852c2cc44fec95ed175f3d1b71df2997088071b3834091b4c0
7
- data.tar.gz: faa7999280e3da2eafaadc0abafad8920384c5101808b62454f1d8d9f6694d1bcfce8cf04d951505c0aca5846b27e35fa5310f50248fff359eb26c7b3f89e8fe
6
+ metadata.gz: 036473e69e86bbf51ff788c4b58a5434c3126f2c613a9c7b733a9d7d95844e3bc87051a6f4672633be5b7ba9f98ffdf7ef91dedaf5b84b1b29252ef8ffeec661
7
+ data.tar.gz: abf72c89abcd52e3e74c4a530777a933d5529afa8fcc25509c5934cac97ace0891f427dcacab546fe84a6aae777ff1250940ea0b73ff0185cca6ab5315cde38d
data/bin/soby CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require_relative '../lib/soby'
4
- # require 'soby'
3
+ # require_relative '../lib/soby'
4
+ require 'soby'
5
5
 
6
6
  Processing::App::SKETCH_PATH = __FILE__
7
7
  $:.unshift File.dirname(__FILE__)
@@ -16,15 +16,17 @@ end
16
16
 
17
17
  require 'java'
18
18
 
19
-
20
19
  Java::TechLityReaSvgextended::PShapeSVGExtended.TEXT_QUALITY = 2.0
21
20
 
22
21
  $app = SobyPlayer.new screen_id
23
22
 
24
23
  sleep 0.2 while not $app.ready?
25
24
 
26
- if filename != nil
25
+ if filename != nil and filename != ""
27
26
  presentation = Soby::load_presentation ARGV[0]
28
27
  Soby::start_presentation presentation
29
28
  end
30
29
  # Soby::auto_update presentation, __FILE__
30
+
31
+ # require_relative '../lib/extensions/backgrounds/circles-bg.rb'
32
+ # load '../lib/extensions/backgrounds/circles-bg.rb'
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ ## re-open the class
3
+
4
+ require_relative 'circles'
5
+
6
+ class SobyPlayer
7
+
8
+ ## To be overriden by the Presentation Code.
9
+ def custom_setup
10
+ @circles = CirclesBackground.new(self, width, height)
11
+ @setup_done = true
12
+ end
13
+
14
+ def custom_pre_draw
15
+ # puts "pre draw " + @setup_done.to_s
16
+ return unless @setup_done
17
+
18
+
19
+ background 0
20
+ image(@circles.draw, 0, 0, width, height)
21
+ end
22
+
23
+ def custom_post_draw
24
+ end
25
+
26
+ end
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env jruby
2
+ # coding: utf-8
3
+ # require 'propane'
4
+
5
+ ## Circles by Bárbara Almeida
6
+ ## A fork of Circle through 3 points by Bárbara Almeida.
7
+ ## Draw circles from 3 points moving on smooth random trajectories.
8
+ ## https://www.openprocessing.org/sketch/211167
9
+
10
+ ## Propane version by Jérémy Laviole - @poqudrof
11
+
12
+ ## Propane & JRubyARt compatibility.
13
+ Propane = Processing if not defined? Propane
14
+
15
+ class CirclesBackground
16
+ include Math
17
+ include Propane::PConstants
18
+
19
+ def initialize(app,w,h)
20
+ @app,@width,@height = app,w,h
21
+ @offscreen = @app.createGraphics @width, @height
22
+ setup
23
+ end
24
+
25
+ def setup
26
+ @c = @app.random(360)
27
+ # @points = (0..2).map { Points.new(@app.random(@width), @app.random(@height)) }
28
+
29
+ @points = []
30
+ 3.times { @points << Points.new(@app.random(@width),@app.random(@height)) }
31
+
32
+ @offscreen.beginDraw
33
+ @offscreen.background 0
34
+ # @offscreen.noStroke
35
+ # @offscreen.rect(0, 0, @width, @height)
36
+ @offscreen.endDraw
37
+ end
38
+
39
+ def draw
40
+
41
+ ## Clear once in a while
42
+ setup if (@app.frame_count % 3_000).zero?
43
+
44
+ @points.each do |point|
45
+ ##change direction sometimes
46
+ point.setDir @app.random(-Propane::PConstants::PI, Propane::PConstants::PI) if (@app.random(1) > 0.96)
47
+ point.update
48
+ point.checkEdges
49
+ end
50
+
51
+ @offscreen.beginDraw
52
+ @offscreen.color_mode(HSB, 360, 100, 100, 100)
53
+
54
+ ## set the style of the circle
55
+ ## slowly changes hue
56
+ @dc = Propane::PApplet::map(@app.millis, 0, 150000, 0, 360)
57
+ @offscreen.stroke((@c + @dc) % 360, 50, 100, 5)
58
+ @offscreen.no_fill
59
+
60
+ ## verifies if there is a circle and draw it
61
+ det = (@points[0].p.x * @points[1].p.y) + (@points[1].p.x * @points[2].p.y) + (@points[2].p.x * @points[0].p.y);
62
+ det -= (@points[0].p.y * @points[1].p.x) + (@points[1].p.y * @points[2].p.x) + (@points[2].p.y * @points[0].p.x);
63
+
64
+ # det = (@points[0].p.x * @points[1].p.y) +
65
+ # (@points[1].p.x * @points[2].p.y) +
66
+ # (@points[2].p.x * @points[0].p.y)
67
+
68
+ # det -= (@points[0].p.y * @points[1].p.x) +
69
+ # (@points[1].p.y * @points[2].p.x) +
70
+ # (@points[2].p.y * @points[0].p.x)
71
+
72
+ if Propane::PApplet::abs(det) > 50
73
+ draw_circle @points
74
+ end
75
+ # draw_circle @points if det.abs > 50
76
+
77
+ @offscreen.endDraw
78
+ return @offscreen
79
+ end
80
+
81
+
82
+ def draw_circle(pts)
83
+ ## find the midpoints of 2 sides
84
+ mp = []
85
+ mp[0] = midpoint(pts[0].p, pts[1].p)
86
+ mp[1] = midpoint(pts[1].p, pts[2].p)
87
+
88
+ center_point = center(mp) ## find the center of the circle
89
+ r = $app.dist(center_point.x, center_point.y, pts[2].p.x, pts[2].p.y) ##calculate the radius
90
+
91
+ @offscreen.ellipse(center_point.x, center_point.y, 2*r, 2*r) ## if not collinear display circle
92
+ end
93
+
94
+ def midpoint(a, b)
95
+ d = $app.dist(a.x, a.y, b.x, b.y) ## distance AB
96
+ theta = atan2(b.y - a.y, b.x - a.x) ## inclination of AB
97
+ p = Propane::PVector.new(a.x + d/2* cos(theta),
98
+ a.y + d/2* sin(theta), # midpoint
99
+ theta - HALF_PI) #inclination of the bissecteur
100
+ return p
101
+ end
102
+
103
+ def center(mid_point)
104
+ eq = []
105
+
106
+ ## equation of the first bissector (ax - y = -b)
107
+ mid_point.each do |mp|
108
+ a = tan mp.z
109
+ eq << Propane::PVector.new(a,
110
+ -1,
111
+ -1*(mp.y - mp.x*a))
112
+ end
113
+
114
+ ## calculate x and y coordinates of the center of the circle
115
+ ox = (eq[1].y * eq[0].z - eq[0].y * eq[1].z) /
116
+ (eq[0].x * eq[1].y - eq[1].x * eq[0].y)
117
+ oy = (eq[0].x * eq[1].z - eq[1].x * eq[0].z) /
118
+ (eq[0].x * eq[1].y - eq[1].x * eq[0].y)
119
+ return Propane::PVector.new(ox,oy)
120
+ end
121
+ end
122
+
123
+ class Points
124
+
125
+ include Propane::Proxy
126
+ attr_accessor :p, :velocity, :acceleration
127
+
128
+ def initialize(x, y)
129
+ @p = Propane::PVector.new(x, y, 1)
130
+ @velocity = Propane::PVector.new(0, 0, 0);
131
+ @acceleration = Propane::PVector.new($app.random(0.2), $app.random(0.2), 0)
132
+ end
133
+
134
+ # change direction
135
+ def setDir(angle)
136
+ ## direction of the acceleration is defined by the new angle
137
+ acceleration.set(Propane::PApplet::cos(angle), Propane::PApplet::sin(angle), 0);
138
+ ## magnitude of the acceleration is proportional to the angle between acceleration and velocity
139
+ acceleration.normalize
140
+ dif = Propane::PVector::angleBetween(acceleration, velocity)
141
+ dif = Propane::PApplet::map(dif, 0, Propane::PConstants::PI, 0.1, 0.001)
142
+ acceleration.mult(dif);
143
+ end
144
+
145
+ def update
146
+ velocity.add(acceleration);
147
+ # velocity.limit(1.5);
148
+ velocity.limit 0.5
149
+ p.add(velocity);
150
+ end
151
+
152
+ def checkEdges
153
+ p.x = constrain(p.x, 0, $app.width)
154
+ p.y = constrain(p.y, 0, $app.height)
155
+ end
156
+ end
@@ -17,13 +17,10 @@ require_relative 'soby/slide'
17
17
  require_relative 'soby/cam'
18
18
  require_relative 'soby/launcher'
19
19
 
20
-
21
20
  class SobyPlayer < Processing::App
22
21
 
23
-
24
22
  load_library 'video','video_event', 'SVGExtended'
25
23
 
26
-
27
24
  include_package 'processing.core'
28
25
 
29
26
  attr_accessor :prez, :prev_cam, :next_cam, :slides
@@ -61,19 +58,57 @@ class SobyPlayer < Processing::App
61
58
  def setup
62
59
  @ready = false
63
60
 
64
- @width = self.width
65
- @height = self.height
66
61
  init_player
67
62
 
68
63
  @custom_setup_done = true
69
64
  @ready = true
70
65
  @has_thread = false
66
+ init_key_commands
71
67
  end
72
68
 
73
- def ready?
74
- @ready
69
+ def init_key_commands
70
+ @key_actions = {}
71
+
72
+ @key_actions['a'] = ["start autoload",
73
+ Proc.new {
74
+ # break or return ?
75
+ next if @has_thread
76
+ puts "Thread starting"
77
+ Soby::auto_update self
78
+ @has_thread = true
79
+ }]
80
+
81
+ @key_actions['h'] = ["show/hide help",
82
+ Proc.new do
83
+ @is_displaying_help = false if @is_displaying_help == nil
84
+ @is_displaying_help = ! @is_displaying_help
85
+ end]
86
+
87
+ @key_actions['c'] = ["save frame",
88
+ Proc.new do
89
+ @frame_number = 1 if @frame_number == nil
90
+ saveFrame "frame-" + @frame_number.to_s + ".png"
91
+ @frame_number = @frame_number + 1
92
+ end ]
93
+
94
+ @key_actions['s'] = ["stop autoload",
95
+ Proc.new { Thread::kill @thread if @has_thread }]
96
+
97
+ @key_actions['r'] = ["custom setup restart",
98
+ Proc.new { @custom_setup_done = false }]
99
+
100
+ @key_actions['g'] = ["clean memory", Proc.new { Java::JavaLang::System.gc }]
101
+
102
+ @key_actions['l'] = ["load another presentation",
103
+ Proc.new { load_presentation }
104
+ ]
105
+
75
106
  end
76
107
 
108
+
109
+
110
+ def ready? ; @ready ; end
111
+
77
112
  def init_player
78
113
  @prez = nil
79
114
  @current_slide_no = 0
@@ -99,7 +134,7 @@ class SobyPlayer < Processing::App
99
134
  end
100
135
 
101
136
  def custom_pre_draw
102
- background(255)
137
+ background(150)
103
138
  end
104
139
 
105
140
  def custom_post_draw
@@ -107,7 +142,6 @@ class SobyPlayer < Processing::App
107
142
  end
108
143
 
109
144
  def draw
110
- rect 0, 0, 100, millis / 1000
111
145
  if not @custom_setup_done
112
146
  custom_setup
113
147
  @custom_setup_done = true
@@ -115,6 +149,8 @@ class SobyPlayer < Processing::App
115
149
 
116
150
  custom_pre_draw
117
151
 
152
+
153
+
118
154
  shapeMode(CORNER)
119
155
  imageMode(CORNER)
120
156
 
@@ -131,25 +167,58 @@ class SobyPlayer < Processing::App
131
167
  display_slide_number
132
168
  end
133
169
 
170
+
171
+ display_help if @is_displaying_help or @prez == nil
172
+
134
173
  custom_post_draw
135
174
  end
136
175
 
176
+ def display_help
177
+ text_size = 12
178
+ textSize(text_size)
179
+
180
+ # fill 200
181
+ # stroke 180
182
+ # rect(width/2, height/2, 50, 20);
183
+
184
+ fill 200
185
+ stroke 255
186
+
187
+ text "Soby Player", width/2, height/2 if @prez == nil
188
+
189
+ translate(50, height - 200)
190
+ texts = []
191
+
192
+ @key_actions.each_pair do |key_name, action|
193
+ description = action[0]
194
+ t = "#{key_name} - #{description}"
195
+ text(t, 0, 0)
196
+ translate(0, text_size + text_size/2);
197
+ end
198
+
199
+ # texts.each do |t|
200
+ # text(t, 0, 0)
201
+ # translate(0, text_size + text_size /2);
202
+ # end
203
+
204
+ end
205
+
137
206
  def run_slide_code
138
207
  translate 0, 0, 1
208
+ # puts "run slide code"
139
209
  if not @is_moving and @current_slide_no != 0
140
210
  desc = @prez.slides[@current_slide_no].description
141
211
  if(desc != nil)
142
- # puts "EVAL #{desc}"
143
- eval desc
212
+ # puts "EVAL #{desc}"
213
+ instance_eval desc
144
214
  end
145
215
  end
146
216
  end
147
217
 
148
-
149
218
  def display_slide_number
150
219
  # Slide number
151
220
  push_matrix
152
- translate(@width - 40, @height - 45)
221
+ translate(self.width - 40, self.height - 45)
153
222
  fill(30)
154
223
  strokeWeight(3)
155
224
  stroke(190)
@@ -162,7 +231,7 @@ class SobyPlayer < Processing::App
162
231
  translate 2, 0
163
232
  else
164
233
  translate -3.5, 0
165
- end
234
+ end
166
235
  text(@current_slide_no.to_s, 10, 30)
167
236
  pop_matrix
168
237
  end
@@ -174,11 +243,10 @@ class SobyPlayer < Processing::App
174
243
  alias :default_display_slide_number :display_slide_number
175
244
 
176
245
 
177
- def key_pressed
246
+ def key_pressed(*args)
178
247
 
179
- if key == 'g'
180
- puts "Garbage"
181
- Java::JavaLang::System.gc
248
+ @key_actions.each_pair do |key_name, command|
249
+ command[1][] if key == key_name
182
250
  end
183
251
 
184
252
  return if @prez == nil
@@ -191,43 +259,7 @@ class SobyPlayer < Processing::App
191
259
  next_slide
192
260
  end
193
261
 
194
- if key == 'l'
195
- # selectInput("Select a file to process:",
196
- # "fileSelected",
197
- # Java::JavaIo::File.new(SKETCH_ROOT))
198
-
199
- folder = Java::JavaIo::File.new(SKETCH_ROOT)
200
- fc = Java::javax::swing::JFileChooser.new("Soby Loader")
201
- fc.set_dialog_title "Select your presentation"
202
- fc.setFileFilter AppFilter.new
203
- fc.setCurrentDirectory folder
204
- success = fc.show_open_dialog(nil)
205
- if success == Java::javax::swing::JFileChooser::APPROVE_OPTION
206
- path = fc.get_selected_file.get_absolute_path
207
- puts "User selected " + path
208
- presentation = Soby::load_presentation path
209
- Soby::start_presentation presentation
210
- else
211
- puts "No file"
212
- end
213
- end
214
262
 
215
- if key == 'a'
216
- return if @has_thread
217
- puts "Thread starting"
218
- Soby::auto_update self
219
- @has_thread = true
220
- end
221
-
222
- if key == 'c'
223
- @frame_number = 1 if @frame_number == nil
224
- saveFrame "frame-" + @frame_number.to_s + ".png"
225
- @frame_number = @frame_number + 1
226
- end
227
-
228
- if key == 's'
229
- Thread::kill @thread if @has_thread
230
- end
231
263
  # puts "slide #{@current_slide_no} "
232
264
  end
233
265
 
@@ -237,7 +269,7 @@ class SobyPlayer < Processing::App
237
269
 
238
270
 
239
271
 
240
- def mouse_dragged
272
+ def mouse_dragged (*args)
241
273
  if not @is_moving
242
274
  tr = PMatrix3D.new
243
275
  tr.translate(mouse_x - pmouse_x, mouse_y - pmouse_y)
@@ -258,15 +290,33 @@ class SobyPlayer < Processing::App
258
290
  end
259
291
  end
260
292
 
293
+ def load_presentation
294
+ folder = Java::JavaIo::File.new(SKETCH_ROOT)
295
+ fc = Java::javax::swing::JFileChooser.new("Soby Loader")
296
+ fc.set_dialog_title "Select your presentation"
297
+ fc.setFileFilter AppFilter.new
298
+ fc.setCurrentDirectory folder
299
+ success = fc.show_open_dialog(nil)
300
+ if success == Java::javax::swing::JFileChooser::APPROVE_OPTION
301
+ path = fc.get_selected_file.get_absolute_path
302
+ puts "User selected " + path
303
+ presentation = Soby::load_presentation path
304
+ Soby::start_presentation presentation
305
+ else
306
+ puts "No file"
307
+ end
308
+ end
309
+
261
310
 
262
311
  def set_prez (prez)
263
- current_slide = @current_slide_no
312
+ # current_slide = @current_slide_no
264
313
 
265
314
  # PShape.loadedImages.clear
266
315
  @prez = prez
267
316
  @slides = prez.slides
268
317
 
269
- goto_slide current_slide
318
+ # TODO: check slide number, if different go to 0
319
+ goto_slide 0
270
320
 
271
321
  @is_running = true
272
322
  @prez_middle = PVector.new(@prez.width / 2.0, @prez.height / 2.0)
@@ -279,8 +329,8 @@ class SobyPlayer < Processing::App
279
329
  end
280
330
 
281
331
  def compute_view(view, slide_number)
282
- # view = createGraphics(@width, @height, P3D)
283
- # @next_view = createGraphics(@width, @height)
332
+ # view = createGraphics(@width, self.height, P3D)
333
+ # @next_view = createGraphics(@width, self.height)
284
334
  view.beginDraw
285
335
 
286
336
  cam = slide_view slide_number
@@ -314,7 +364,7 @@ class SobyPlayer < Processing::App
314
364
  if @slides[@current_slide_no].has_next_animation?
315
365
  puts "Animation Next "
316
366
  anim = @slides[@current_slide_no].next_animation
317
- anim.pshape_elem.setVisible(true)
367
+ anim.pshape_elem.setVisible(true) unless anim.pshape_elem == nil
318
368
  return
319
369
  end
320
370
 
@@ -416,16 +466,16 @@ class SobyPlayer < Processing::App
416
466
  x = @prez.slides[slide_no].x
417
467
  y = @prez.slides[slide_no].y
418
468
 
419
- sc1 = @width.to_f / w.to_f
420
- sc2 = @height.to_f / h.to_f
469
+ sc1 = self.width.to_f / w.to_f
470
+ sc2 = self.height.to_f / h.to_f
421
471
 
422
472
  # scale
423
473
  sc = [sc1, sc2].min
424
474
 
425
475
 
426
476
  # translate
427
- dx = ((@width / sc) - w) * 0.5
428
- dy = ((@height / sc) - h) * 0.5
477
+ dx = ((self.width / sc) - w) * 0.5
478
+ dy = ((self.height / sc) - h) * 0.5
429
479
 
430
480
  cam = Cam.new
431
481
 
@@ -453,8 +503,8 @@ class SobyPlayer < Processing::App
453
503
  my_scale = find_scale
454
504
 
455
505
  # centering
456
- dx = ((@width / my_scale) - @prez.width) * 0.5
457
- dy = ((@height / my_scale) - @prez.height) * 0.5
506
+ dx = ((self.width / my_scale) - @prez.width) * 0.5
507
+ dy = ((self.height / my_scale) - @prez.height) * 0.5
458
508
 
459
509
  cam = Cam.new
460
510
  cam.scale = my_scale
@@ -465,8 +515,8 @@ class SobyPlayer < Processing::App
465
515
  end
466
516
 
467
517
  def find_scale
468
- sc1 = @width / @prez.width
469
- sc2 = @height / @prez.height
518
+ sc1 = self.width / @prez.width
519
+ sc2 = self.height / @prez.height
470
520
  return [sc1, sc2].min
471
521
  end
472
522
  private :find_scale
@@ -479,10 +529,12 @@ end
479
529
  ## TODO: move this somewhere
480
530
  class AppFilter < Java::javax::swing::filechooser::FileFilter
481
531
  def accept fobj
482
- return true if fobj.canExecute
483
- return fobj.isDirectory
532
+ return true if fobj.getName().end_with?(".svg")
533
+ # return true if fobj.canExecute
534
+ # return fobj.isDirectory
535
+ false
484
536
  end
485
537
  def getDescription
486
- "Applications"
538
+ "Soby Presentations"
487
539
  end
488
540
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1.1
4
+ version: 0.1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Laviole
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-24 00:00:00.000000000 Z
11
+ date: 2017-01-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -78,6 +78,8 @@ extensions: []
78
78
  extra_rdoc_files: []
79
79
  files:
80
80
  - bin/soby
81
+ - lib/extensions/backgrounds/circles-bg.rb
82
+ - lib/extensions/backgrounds/circles.rb
81
83
  - lib/soby.rb
82
84
  - lib/soby/cam.rb
83
85
  - lib/soby/launcher.rb
@@ -86,8 +88,7 @@ files:
86
88
  - lib/soby/slide.rb
87
89
  - lib/soby/transforms.rb
88
90
  homepage: https://github.com/poqudrof/Soby
89
- licenses:
90
- - LGPL
91
+ licenses: []
91
92
  metadata: {}
92
93
  post_install_message: 'Use ''soby presentation.svg 1'' to run a presentation file
93
94
  presentation.svg on screen #1 '