voxelamming 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CODE_OF_CONDUCT.md +1 -1
- data/README.md +19 -13
- data/index.html +14 -14
- data/lib/voxelamming/version.rb +1 -1
- data/lib/voxelamming.rb +132 -32
- data/voxelamming-0.2.0.gem +0 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4040f3049c1f2d0d1a15fa25a7e53ed734d96301653ecae91f1f9c6739dbddb
|
4
|
+
data.tar.gz: 571a79bcde4c693b16e209d04096096b56248c39c3516e96d880671daf80a839
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9fb8453f785ddb3d94c422b2bdd0e17ac2789a102695eb7141bdee11de3236ae7e10b8b53fb441d98bebcde351cf9a6159b84a4d69496a32c5b3c4d9e3297c8
|
7
|
+
data.tar.gz: 944de153ff5b15c6276a9f5b6ca62e59f138f3fe0166ded32558b72d73d497984fbb38ed1bfd63664d8dd864a5f5683eeeef3b39373a0bf0ef8635943f6e748b
|
data/CODE_OF_CONDUCT.md
CHANGED
@@ -60,7 +60,7 @@ representative at an online or offline event.
|
|
60
60
|
|
61
61
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
62
62
|
reported to the community leaders responsible for enforcement at
|
63
|
-
|
63
|
+
creativival@gmail.com.
|
64
64
|
All complaints will be reviewed and investigated promptly and fairly.
|
65
65
|
|
66
66
|
All community leaders are obligated to respect the privacy and security of the
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# Voxelamming
|
2
2
|
|
3
3
|
This Ruby package converts Python code into JSON format and sends it to the Voxelamming app using WebSockets, allowing users to create 3D voxel models by writing Ruby scripts.
|
4
4
|
|
@@ -26,27 +26,27 @@ gem install voxelamming
|
|
26
26
|
require 'voxelamming'
|
27
27
|
|
28
28
|
room_name = '1000'
|
29
|
-
|
29
|
+
vox = Voxelamming::VoxelammingManager.new(room_name)
|
30
30
|
|
31
|
-
|
32
|
-
|
31
|
+
vox.set_box_size(0.5)
|
32
|
+
vox.set_build_interval(0.01)
|
33
33
|
|
34
34
|
for i in 0...100
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
vox.create_box(-1, i, 0, r: 0, g: 1, b: 1)
|
36
|
+
vox.create_box(0, i, 0, r: 1, g: 0, b: 0)
|
37
|
+
vox.create_box(1, i, 0, r: 1, g: 1, b: 0)
|
38
|
+
vox.create_box(2, i, 0, r: 0, g: 1, b: 1)
|
39
39
|
end
|
40
40
|
|
41
41
|
for i in 0...50
|
42
|
-
|
43
|
-
|
42
|
+
vox.remove_box(0, i * 2, 0)
|
43
|
+
vox.remove_box(1, i * 2 + 1, 0)
|
44
44
|
end
|
45
45
|
|
46
|
-
|
46
|
+
vox.send_data
|
47
47
|
```
|
48
48
|
|
49
|
-
This code snippet demonstrates a simple example where a red voxel is created at a specific location. You can use various functions provided by the `
|
49
|
+
This code snippet demonstrates a simple example where a red voxel is created at a specific location. You can use various functions provided by the `VoxelammingManager` class to build more complex models.
|
50
50
|
|
51
51
|
#### Method description
|
52
52
|
|
@@ -75,6 +75,12 @@ This code snippet demonstrates a simple example where a red voxel is created at
|
|
75
75
|
| `frame_out()` | Ends recording a frame. | |
|
76
76
|
| `set_frame_fps(fps)` | Sets the frame rate (default: 2). | `fps`: Frame rate (int) |
|
77
77
|
| `set_frame_repeats(repeats)` | Sets the number of frame repetitions (default: 10). | `repeats`: Number of repetitions (int) |
|
78
|
+
| Game Method Name | Description | Arguments |
|
79
|
+
| `set_game_screen(width, height, angle=90, r=1, g=1, b=0, alpha=0.5)` | Sets the game screen size. | `width`, `height`: screen size (float), `angle`: angle (float), `r`, `g`, `b`, `alpha`: color (float, 0-1) |
|
80
|
+
| `set_game_score(score)` | Sets the game score. | `score`: game score (int) |
|
81
|
+
| `send_game_over()` | Triggers game over. | |
|
82
|
+
| `create_sprite(sprite_name, color_list, x, y, direction=90, scale=1, visible=True)` | Creates a sprite. | `sprite_name`: sprite name (string), `color_list`: dot color data (string), `x`, `y`: position (float), `direction`: angle (float), `scale`: scale (float), `visible`: visibility (boolean) |
|
83
|
+
| `move_sprite(sprite_name, x, y, direction=90, scale=1, visible=True)` | Moves a sprite. | `sprite_name`: sprite name (string), `x`, `y`: position (float), `direction`: angle (float), `scale`: scale (float), `visible`: visibility (boolean) |
|
78
84
|
|
79
85
|
## Development
|
80
86
|
|
@@ -92,4 +98,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
92
98
|
|
93
99
|
## Code of Conduct
|
94
100
|
|
95
|
-
Everyone interacting in the
|
101
|
+
Everyone interacting in the Voxelamming project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/voxelamming_gem/blob/master/CODE_OF_CONDUCT.md).
|
data/index.html
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<meta charset="UTF-8">
|
5
|
-
<title>
|
5
|
+
<title>Voxelamming</title>
|
6
6
|
<style>
|
7
7
|
body {
|
8
8
|
font-family: sans-serif;
|
@@ -58,7 +58,7 @@
|
|
58
58
|
</style>
|
59
59
|
</head>
|
60
60
|
<body>
|
61
|
-
<h1><a href="#voxelamminggem" id="voxelamminggem"></a>
|
61
|
+
<h1><a href="#voxelamminggem" id="voxelamminggem"></a>Voxelamming</h1>
|
62
62
|
<p>This Ruby package converts Python code into JSON format and sends it to the Voxelamming app using WebSockets, allowing users to create 3D voxel models by writing Ruby scripts.</p>
|
63
63
|
<h2><a href="#whats-voxelamming" id="whats-voxelamming"></a>What's Voxelamming?</h2>
|
64
64
|
<p align="center"><img src="https://creativival.github.io/voxelamming/image/voxelamming_icon.png" alt="Voxelamming Logo" width="200"/></p>
|
@@ -75,26 +75,26 @@
|
|
75
75
|
<pre><code class="ruby">require 'voxelamming'
|
76
76
|
|
77
77
|
room_name = '1000'
|
78
|
-
|
78
|
+
vox = Voxelamming::VoxelammingManager.new(room_name)
|
79
79
|
|
80
|
-
|
81
|
-
|
80
|
+
vox.set_box_size(0.5)
|
81
|
+
vox.set_build_interval(0.01)
|
82
82
|
|
83
83
|
for i in 0...100
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
vox.create_box(-1, i, 0, r: 0, g: 1, b: 1)
|
85
|
+
vox.create_box(0, i, 0, r: 1, g: 0, b: 0)
|
86
|
+
vox.create_box(1, i, 0, r: 1, g: 1, b: 0)
|
87
|
+
vox.create_box(2, i, 0, r: 0, g: 1, b: 1)
|
88
88
|
end
|
89
89
|
|
90
90
|
for i in 0...50
|
91
|
-
|
92
|
-
|
91
|
+
vox.remove_box(0, i * 2, 0)
|
92
|
+
vox.remove_box(1, i * 2 + 1, 0)
|
93
93
|
end
|
94
94
|
|
95
|
-
|
95
|
+
vox.send_data
|
96
96
|
</code></pre>
|
97
|
-
<p>This code snippet demonstrates a simple example where a red voxel is created at a specific location. You can use various functions provided by the <code>
|
97
|
+
<p>This code snippet demonstrates a simple example where a red voxel is created at a specific location. You can use various functions provided by the <code>VoxelammingManager</code> class to build more complex models.</p>
|
98
98
|
<h4><a href="#method-description" id="method-description"></a>Method description</h4>
|
99
99
|
<table>
|
100
100
|
<thead>
|
@@ -134,6 +134,6 @@ build_box.send_data
|
|
134
134
|
<h2><a href="#license" id="license"></a>License</h2>
|
135
135
|
<p>The gem is available as open source under the terms of the <a href="https://opensource.org/licenses/MIT">MIT License</a>.</p>
|
136
136
|
<h2><a href="#code-of-conduct" id="code-of-conduct"></a>Code of Conduct</h2>
|
137
|
-
<p>Everyone interacting in the
|
137
|
+
<p>Everyone interacting in the Voxelamming project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the <a href="https://github.com/[USERNAME]/voxelamming_gem/blob/master/CODE_OF_CONDUCT.md">code of conduct</a>.</p>
|
138
138
|
</body>
|
139
139
|
</html>
|
data/lib/voxelamming/version.rb
CHANGED
data/lib/voxelamming.rb
CHANGED
@@ -17,7 +17,7 @@ module Voxelamming
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Main process
|
20
|
-
class
|
20
|
+
class VoxelammingManager
|
21
21
|
@@texture_names = ["grass", "stone", "dirt", "planks", "bricks"]
|
22
22
|
@@model_names = ["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto", "Sun",
|
23
23
|
"Moon", "ToyBiplane", "ToyCar", "Drummer", "Robot", "ToyRocket", "RocketToy1", "RocketToy2", "Skull"]
|
@@ -33,11 +33,15 @@ module Voxelamming
|
|
33
33
|
@animation = [0, 0, 0, 0, 0, 0, 1, 0]
|
34
34
|
@boxes = []
|
35
35
|
@frames = []
|
36
|
-
@
|
36
|
+
@sentences = []
|
37
37
|
@lights = []
|
38
38
|
@commands = []
|
39
39
|
@models = []
|
40
40
|
@model_moves = []
|
41
|
+
@sprites = []
|
42
|
+
@sprite_moves = []
|
43
|
+
@game_score = -1
|
44
|
+
@game_screen = [] # width, height, angle=90, red=1, green=1, blue=1, alpha=0.5
|
41
45
|
@size = 1
|
42
46
|
@shape = 'box'
|
43
47
|
@is_metallic = 0
|
@@ -46,6 +50,9 @@ module Voxelamming
|
|
46
50
|
@build_interval = 0.01
|
47
51
|
@is_framing = false
|
48
52
|
@frame_id = 0
|
53
|
+
@websocket = nil
|
54
|
+
@last_sent_time = nil
|
55
|
+
@timer = nil
|
49
56
|
end
|
50
57
|
|
51
58
|
def clear_data
|
@@ -58,7 +65,11 @@ module Voxelamming
|
|
58
65
|
@animation = [0, 0, 0, 0, 0, 0, 1, 0]
|
59
66
|
@boxes = []
|
60
67
|
@frames = []
|
61
|
-
@
|
68
|
+
@sentences = []
|
69
|
+
@sprites = []
|
70
|
+
@sprite_moves = []
|
71
|
+
@game_score = -1
|
72
|
+
@game_screen = [] # width, height, angle=90, red=1, green=1, blue=1, alpha=0.5
|
62
73
|
@lights = []
|
63
74
|
@commands = []
|
64
75
|
@models = []
|
@@ -119,8 +130,8 @@ module Voxelamming
|
|
119
130
|
x, y, z = round_numbers([x, y, z])
|
120
131
|
|
121
132
|
# Compute the rotation after transform
|
122
|
-
|
123
|
-
rotate_matrix = matrix_multiply(
|
133
|
+
transform_rotation_matrix = get_rotation_matrix(-pitch, -yaw, -roll)
|
134
|
+
rotate_matrix = matrix_multiply(transform_rotation_matrix, base_rotation_matrix)
|
124
135
|
@matrix_transform = [x, y, z, *rotate_matrix[0], *rotate_matrix[1], *rotate_matrix[2]]
|
125
136
|
else
|
126
137
|
x, y, z = round_numbers([x, y, z])
|
@@ -196,11 +207,11 @@ module Voxelamming
|
|
196
207
|
@build_interval = interval
|
197
208
|
end
|
198
209
|
|
199
|
-
def write_sentence(sentence, x, y, z, r: 1, g: 1, b: 1, alpha: 1)
|
210
|
+
def write_sentence(sentence, x, y, z, r: 1, g: 1, b: 1, alpha: 1, font_size: 8, is_fixed_width: false)
|
200
211
|
x, y, z = round_numbers([x, y, z]).map(&:to_s)
|
201
212
|
r, g, b, alpha = round_two_decimals([r, g, b, alpha])
|
202
|
-
r, g, b, alpha = [r, g, b, alpha].map(&:floor).map(&:to_s)
|
203
|
-
@
|
213
|
+
r, g, b, alpha, font_size = [r, g, b, alpha, font_size].map(&:floor).map(&:to_s)
|
214
|
+
@sentences << [sentence, x, y, z, r, g, b, alpha, font_size, is_fixed_width ? "1" : "0"]
|
204
215
|
end
|
205
216
|
|
206
217
|
def set_light(x, y, z, r: 1, g: 1, b: 1, alpha: 1, intensity: 1000, interval: 1, light_type: 'point')
|
@@ -308,6 +319,65 @@ module Voxelamming
|
|
308
319
|
@model_moves << [entity_name, x, y, z, pitch, yaw, roll, scale]
|
309
320
|
end
|
310
321
|
|
322
|
+
# Game API
|
323
|
+
|
324
|
+
def set_game_screen(width, height, angle = 90, r = 1, g = 1, b = 0, alpha = 0.5)
|
325
|
+
@game_screen = [width, height, angle, r, g, b, alpha]
|
326
|
+
end
|
327
|
+
|
328
|
+
def set_game_score(score)
|
329
|
+
@game_score = score.to_f
|
330
|
+
end
|
331
|
+
|
332
|
+
def send_game_over
|
333
|
+
@commands << 'gameOver'
|
334
|
+
end
|
335
|
+
|
336
|
+
def set_rotation_style(sprite_name, rotation_style = 'all around')
|
337
|
+
@rotation_styles[sprite_name] = rotation_style
|
338
|
+
end
|
339
|
+
|
340
|
+
def create_sprite(sprite_name, color_list, x, y, direction = 0, scale = 1, visible = true)
|
341
|
+
# 新しいスプライトデータを配列に追加
|
342
|
+
x, y, direction = round_numbers([x, y, direction])
|
343
|
+
x, y, direction, scale = [x, y, direction, scale].map(&:to_s)
|
344
|
+
@sprites << [sprite_name, color_list, x, y, direction, scale, visible ? '1' : '0']
|
345
|
+
end
|
346
|
+
|
347
|
+
def move_sprite(sprite_name, x, y, direction = 0, scale = 1, visible = true)
|
348
|
+
# x, y, directionを丸める
|
349
|
+
x, y, direction = round_numbers([x, y, direction])
|
350
|
+
x, y, direction, scale = [x, y, direction, scale].map(&:to_s)
|
351
|
+
|
352
|
+
# rotation_styleを取得
|
353
|
+
if @rotation_styles.has_key?(sprite_name)
|
354
|
+
rotation_style = @rotation_styles[sprite_name]
|
355
|
+
|
356
|
+
# rotation_styleが変更された場合、新しいスプライトデータを配列に追加
|
357
|
+
case rotation_style
|
358
|
+
when 'left-right'
|
359
|
+
direction_mod = direction.to_i % 360 # 常に0から359の範囲で処理(常に正の数になる)
|
360
|
+
if direction_mod > 90 && direction_mod < 270
|
361
|
+
direction = '-180' # -180は左右反転するようにボクセラミング側で実装されている
|
362
|
+
else
|
363
|
+
direction = '0'
|
364
|
+
end
|
365
|
+
when "don't rotate"
|
366
|
+
direction = '0'
|
367
|
+
else
|
368
|
+
direction = direction.to_s
|
369
|
+
end
|
370
|
+
else
|
371
|
+
# rotation_styleが設定されていない場合、そのままの値を使う
|
372
|
+
direction = direction.to_s
|
373
|
+
end
|
374
|
+
|
375
|
+
# sprites配列から同じスプライト名の要素を削除
|
376
|
+
@sprite_moves.reject! { |sprite_info| sprite_info[0] == sprite_name }
|
377
|
+
|
378
|
+
# 新しいスプライトデータを配列に追加
|
379
|
+
@sprite_moves << [sprite_name, x, y, direction, scale, visible ? '1' : '0']
|
380
|
+
end
|
311
381
|
|
312
382
|
def send_data(name: '')
|
313
383
|
puts 'send_data'
|
@@ -319,11 +389,15 @@ module Voxelamming
|
|
319
389
|
"animation": @animation,
|
320
390
|
"boxes": @boxes,
|
321
391
|
"frames": @frames,
|
322
|
-
"
|
392
|
+
"sentences": @sentences,
|
323
393
|
"lights": @lights,
|
324
394
|
"commands": @commands,
|
325
395
|
"models": @models,
|
326
396
|
"modelMoves": @model_moves,
|
397
|
+
"sprites": @sprites,
|
398
|
+
"spriteMoves": @sprite_moves,
|
399
|
+
"gameScore": @game_score,
|
400
|
+
"gameScreen": @game_screen,
|
327
401
|
"size": @size,
|
328
402
|
"shape": @shape,
|
329
403
|
"interval": @build_interval,
|
@@ -335,35 +409,61 @@ module Voxelamming
|
|
335
409
|
}.to_json
|
336
410
|
|
337
411
|
EM.run do
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
412
|
+
if @websocket.nil?
|
413
|
+
@websocket = Faye::WebSocket::Client.new('wss://websocket.voxelamming.com')
|
414
|
+
|
415
|
+
@websocket.on :open do |_event|
|
416
|
+
p [:open]
|
417
|
+
puts 'WebSocket connection open'
|
418
|
+
@websocket.send(@room_name)
|
419
|
+
puts "Joined room: #{@room_name}"
|
420
|
+
send_data_to_server(data_to_send)
|
421
|
+
end
|
422
|
+
|
423
|
+
@websocket.on :error do |event|
|
424
|
+
puts "WebSocket error: #{event.message}"
|
351
425
|
EM.stop
|
352
426
|
end
|
353
|
-
end
|
354
427
|
|
355
|
-
|
356
|
-
|
357
|
-
|
428
|
+
@websocket.on :close do |_event|
|
429
|
+
puts 'WebSocket connection closed'
|
430
|
+
EM.stop
|
431
|
+
end
|
432
|
+
else
|
433
|
+
send_data_to_server(data_to_send)
|
358
434
|
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
def send_data_to_server(data)
|
439
|
+
if @websocket && @websocket.ready_state == Faye::WebSocket::API::OPEN
|
440
|
+
@websocket.send(data)
|
441
|
+
puts 'Sent data to server'
|
442
|
+
@last_sent_time = Time.now
|
443
|
+
|
444
|
+
reset_close_timer
|
445
|
+
end
|
446
|
+
end
|
359
447
|
|
360
|
-
|
361
|
-
|
362
|
-
|
448
|
+
def reset_close_timer
|
449
|
+
EM.cancel_timer(@timer) if @timer
|
450
|
+
|
451
|
+
@timer = EM.add_timer(2) do
|
452
|
+
if Time.now - @last_sent_time >= 2
|
453
|
+
close_connection
|
363
454
|
end
|
364
455
|
end
|
365
456
|
end
|
366
457
|
|
458
|
+
def close_connection
|
459
|
+
if @websocket
|
460
|
+
puts 'Closing WebSocket connection.'
|
461
|
+
@websocket.close
|
462
|
+
@websocket = nil
|
463
|
+
EM.stop
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
367
467
|
def round_numbers(num_list)
|
368
468
|
if @is_allowed_float == 1
|
369
469
|
round_two_decimals(num_list)
|
@@ -381,8 +481,8 @@ module Voxelamming
|
|
381
481
|
class Turtle
|
382
482
|
include Math
|
383
483
|
|
384
|
-
def initialize(
|
385
|
-
@
|
484
|
+
def initialize(voxelamming_instance)
|
485
|
+
@vox = voxelamming_instance
|
386
486
|
@x = 0
|
387
487
|
@y = 0
|
388
488
|
@z = 0
|
@@ -400,7 +500,7 @@ module Voxelamming
|
|
400
500
|
x, y, z = x.round(3), y.round(3), z.round(3)
|
401
501
|
|
402
502
|
if @drawable
|
403
|
-
@
|
503
|
+
@vox.draw_line(@x, @y, @z, x, y, z, r: @color[0], g: @color[1], b: @color[2])
|
404
504
|
end
|
405
505
|
|
406
506
|
@x = x
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voxelamming
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- creativival
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08-
|
11
|
+
date: 2024-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faye-websocket
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/voxelamming.rb
|
43
43
|
- lib/voxelamming/version.rb
|
44
44
|
- sig/voxelamming.rbs
|
45
|
+
- voxelamming-0.2.0.gem
|
45
46
|
homepage: https://creativival.github.io/voxelamming
|
46
47
|
licenses:
|
47
48
|
- MIT
|