doomfire 0.1.0 → 0.2
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.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +1 -1
- data/README.md +4 -1
- data/examples/long.rake +1 -1
- data/examples/sdl_test.rb +57 -0
- data/exe/doomfire +1 -1
- data/lib/doomfire/base.rb +118 -0
- data/lib/doomfire/spinner.rb +24 -0
- data/lib/doomfire/terminal.rb +8 -85
- data/lib/doomfire/version.rb +1 -1
- data/lib/doomfire.rb +2 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecbc683e034fa23927451cf7792b1b234ad41d45681a1eb59d05759f44b65304
|
4
|
+
data.tar.gz: 7823ae5ad2eb86a5d090bd914193ae7c56c9b92b19b411457e6c3600884fd2fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 41592477937ec6d1fc954646117f9044c76714701eaa5a6784d509b6d70a12386afd84a25cc64db3840c4fd11dac6db82ec40c8637b8f01c67760e45b8a57eed
|
7
|
+
data.tar.gz: 59087d4f46cb35fb1146a33f42cd43638d08c690a7cc2dd45456aa364c97d1fe5c8d77bdc3b0041a44b2ed3252b78452d98d7aa30f9c10553b9d5eeb794866ef
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# 0.2.0
|
2
|
+
|
3
|
+
Terminal class now only works in the terminal and the new Spinner class should be used in the rake tasks. That should actually be a major version update to be honest but in 0.x versions I assume it's expected things can break.
|
4
|
+
|
5
|
+
- [x] Split Terminal class into `Base`, `Terminal` and `Spinner` classes
|
6
|
+
- [x] Started work on SDL version
|
7
|
+
- [x] Updated readme and example
|
8
|
+
- [x] Update tests
|
9
|
+
|
10
|
+
# 0.1.0
|
11
|
+
|
12
|
+
Works both in terminal as a command and in long running rake tasks as a spinner/progress bar indicator (not really).
|
13
|
+
|
14
|
+
- [x] Initial gem version published
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
[](https://travis-ci.com/marcinruszkiewicz/doomfire)
|
2
|
+
[](https://badge.fury.io/rb/doomfire)
|
3
|
+
|
1
4
|
# Doomfire
|
2
5
|
|
3
6
|
Put your terminal on fire.
|
@@ -39,7 +42,7 @@ require 'doomfire'
|
|
39
42
|
|
40
43
|
desc 'some long running task'
|
41
44
|
task :long do
|
42
|
-
fire = Doomfire::
|
45
|
+
fire = Doomfire::Spinner.new
|
43
46
|
fire.run
|
44
47
|
|
45
48
|
5.times do
|
data/examples/long.rake
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'fiddle'
|
2
|
+
require 'fiddle/import'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
module SDL
|
6
|
+
extend Fiddle::Importer
|
7
|
+
|
8
|
+
dlload 'libSDL2.dylib'
|
9
|
+
|
10
|
+
typealias 'Uint32', :int
|
11
|
+
typealias 'Uint16', :int
|
12
|
+
typealias 'Uint8', :int
|
13
|
+
|
14
|
+
SDL_INIT_VIDEO = 0x00000020
|
15
|
+
SDL_WINDOW_OPENGL = 0x00000000
|
16
|
+
SDL_WINDOWPOS_UNDEFINED = 0x1FFF0000 | 0
|
17
|
+
SDL_WINDOWPOS_CENTERED = 0x2FFF0000 | 0
|
18
|
+
SDL_QUIT = 0x100
|
19
|
+
SDL_KEYDOWN = 0x300
|
20
|
+
SDL_PIXELFORMAT_ARGB8888 = 0
|
21
|
+
SDL_TEXTUREACCESS_STATIC = 0
|
22
|
+
|
23
|
+
SDL_Event = union [
|
24
|
+
'Uint32 type'
|
25
|
+
]
|
26
|
+
|
27
|
+
extern 'int SDL_Init(Uint32 flags)'
|
28
|
+
extern 'void* SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)'
|
29
|
+
extern 'void* SDL_CreateRenderer(void* window, int index, Uint32 flags)'
|
30
|
+
extern 'void* SDL_CreateTexture(void* renderer, Uint32 format, int access, int w, int h)'
|
31
|
+
extern 'int SDL_WaitEvent(void* event)'
|
32
|
+
extern 'void SDL_Quit(void)'
|
33
|
+
extern 'void SDL_DestroyWindow(void* window)'
|
34
|
+
extern 'void SDL_DestroyRenderer(void* renderer)'
|
35
|
+
extern 'void SDL_DestroyTexture(void* texture)'
|
36
|
+
end
|
37
|
+
|
38
|
+
# https://dzone.com/articles/sdl2-pixel-drawing
|
39
|
+
# http://wiki.libsdl.org/SDL_Init
|
40
|
+
# https://github.com/davidsiaw/SDL2/blob/master/include/SDL_stdinc.h
|
41
|
+
# http://ruby-doc.org/stdlib-2.6.3/libdoc/fiddle/rdoc/Fiddle.html#method-c-dlopen
|
42
|
+
# https://www.honeybadger.io/blog/use-any-c-library-from-ruby-via-fiddle-the-ruby-standard-librarys-best-kept-secret/
|
43
|
+
# https://bitbucket.org/dandago/gigilabs/src/master/Sdl2PixelDrawing/Sdl2PixelDrawing/main.cpp
|
44
|
+
|
45
|
+
SDL.SDL_Init(SDL::SDL_INIT_VIDEO)
|
46
|
+
window = SDL.SDL_CreateWindow("Doomfire.rb", SDL::SDL_WINDOWPOS_UNDEFINED, SDL::SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL::SDL_WINDOW_OPENGL)
|
47
|
+
renderer = SDL.SDL_CreateRenderer(window, -1, 0)
|
48
|
+
texture = SDL.SDL_CreateTexture(renderer, SDL::SDL_PIXELFORMAT_ARGB8888, SDL::SDL_TEXTUREACCESS_STATIC, 640, 480)
|
49
|
+
|
50
|
+
event = SDL::SDL_Event.malloc
|
51
|
+
quit = false
|
52
|
+
|
53
|
+
until quit
|
54
|
+
SDL.SDL_WaitEvent(event)
|
55
|
+
|
56
|
+
quit = true if event.type == SDL::SDL_QUIT
|
57
|
+
end
|
data/exe/doomfire
CHANGED
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Doomfire
|
4
|
+
# Base class for the fire algorithm
|
5
|
+
class Base
|
6
|
+
RGB = [
|
7
|
+
[0, 0, 0],
|
8
|
+
[7, 7, 7],
|
9
|
+
[31, 7, 7],
|
10
|
+
[47, 15, 7],
|
11
|
+
[87, 23, 7],
|
12
|
+
[103, 31, 7],
|
13
|
+
[119, 31, 7],
|
14
|
+
[143, 39, 7],
|
15
|
+
[159, 47, 7],
|
16
|
+
[175, 63, 7],
|
17
|
+
[191, 71, 7],
|
18
|
+
[199, 71, 7],
|
19
|
+
[223, 79, 7],
|
20
|
+
[223, 87, 7],
|
21
|
+
[223, 87, 7],
|
22
|
+
[215, 103, 15],
|
23
|
+
[207, 111, 15],
|
24
|
+
[207, 119, 15],
|
25
|
+
[207, 127, 15],
|
26
|
+
[207, 135, 23],
|
27
|
+
[199, 135, 23],
|
28
|
+
[199, 143, 23],
|
29
|
+
[199, 151, 31],
|
30
|
+
[191, 159, 31],
|
31
|
+
[191, 159, 31],
|
32
|
+
[191, 167, 39],
|
33
|
+
[191, 167, 39],
|
34
|
+
[191, 175, 47],
|
35
|
+
[183, 175, 47],
|
36
|
+
[183, 183, 47],
|
37
|
+
[183, 183, 55],
|
38
|
+
[207, 207, 111],
|
39
|
+
[223, 223, 159],
|
40
|
+
[239, 239, 199],
|
41
|
+
[255, 255, 255]
|
42
|
+
].freeze
|
43
|
+
|
44
|
+
FIRE_HEIGHT = 35
|
45
|
+
|
46
|
+
attr_reader :exit_requested, :pixels, :fire_width
|
47
|
+
|
48
|
+
def initialize
|
49
|
+
@counter = 0
|
50
|
+
@thread = nil
|
51
|
+
@exit_requested = false
|
52
|
+
|
53
|
+
prepare_output
|
54
|
+
|
55
|
+
initialize_pixels
|
56
|
+
end
|
57
|
+
|
58
|
+
def run
|
59
|
+
raise NotImplementedError
|
60
|
+
end
|
61
|
+
|
62
|
+
def stop
|
63
|
+
raise NotImplementedError
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def spread_fire(src)
|
69
|
+
if @pixels[src].zero?
|
70
|
+
@pixels[src - @fire_width] = 1
|
71
|
+
else
|
72
|
+
random = rand(10).round & 3
|
73
|
+
dst = src - rand(3) + 1
|
74
|
+
@pixels[dst - @fire_width] = @pixels[src] - (random & 1)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def stop_fire
|
79
|
+
@pixels.pop(@fire_width)
|
80
|
+
@pixels.concat [].fill(0, 0, @fire_width)
|
81
|
+
end
|
82
|
+
|
83
|
+
def update_pixels
|
84
|
+
(1...FIRE_HEIGHT).to_a.reverse.each do |x|
|
85
|
+
(0...@fire_width).each do |y|
|
86
|
+
spread_fire(x * @fire_width + y)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def initialize_pixels
|
92
|
+
@pixels = []
|
93
|
+
last_line = @fire_width * (FIRE_HEIGHT - 1)
|
94
|
+
@pixels.fill(0, 0...last_line)
|
95
|
+
@pixels.fill(34, last_line..(last_line + @fire_width))
|
96
|
+
end
|
97
|
+
|
98
|
+
def prepare_output
|
99
|
+
@fire_width = 80
|
100
|
+
end
|
101
|
+
|
102
|
+
def fire_loop
|
103
|
+
raise NotImplementedError
|
104
|
+
end
|
105
|
+
|
106
|
+
def clear
|
107
|
+
raise NotImplementedError
|
108
|
+
end
|
109
|
+
|
110
|
+
def clear_screen
|
111
|
+
raise NotImplementedError
|
112
|
+
end
|
113
|
+
|
114
|
+
def print_pixels
|
115
|
+
raise NotImplementedError
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Doomfire
|
4
|
+
# Same output as the Terminal class, but this runs in a separate thread,
|
5
|
+
# so the main process can continue with its work
|
6
|
+
class Spinner < Terminal
|
7
|
+
def run
|
8
|
+
@thread = Thread.start { fire_loop }
|
9
|
+
end
|
10
|
+
|
11
|
+
def stop
|
12
|
+
@exit_requested = true
|
13
|
+
@thread.join
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def prepare_output
|
19
|
+
@fire_width = Doomfire::WindowSize.new.terminal_width
|
20
|
+
Paint.mode = 0xFFFFFF
|
21
|
+
clear_screen
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/doomfire/terminal.rb
CHANGED
@@ -3,68 +3,14 @@
|
|
3
3
|
require 'paint'
|
4
4
|
|
5
5
|
module Doomfire
|
6
|
-
class
|
7
|
-
|
8
|
-
[0, 0, 0],
|
9
|
-
[7, 7, 7],
|
10
|
-
[31, 7, 7],
|
11
|
-
[47, 15, 7],
|
12
|
-
[87, 23, 7],
|
13
|
-
[103, 31, 7],
|
14
|
-
[119, 31, 7],
|
15
|
-
[143, 39, 7],
|
16
|
-
[159, 47, 7],
|
17
|
-
[175, 63, 7],
|
18
|
-
[191, 71, 7],
|
19
|
-
[199, 71, 7],
|
20
|
-
[223, 79, 7],
|
21
|
-
[223, 87, 7],
|
22
|
-
[223, 87, 7],
|
23
|
-
[215, 103, 15],
|
24
|
-
[207, 111, 15],
|
25
|
-
[207, 119, 15],
|
26
|
-
[207, 127, 15],
|
27
|
-
[207, 135, 23],
|
28
|
-
[199, 135, 23],
|
29
|
-
[199, 143, 23],
|
30
|
-
[199, 151, 31],
|
31
|
-
[191, 159, 31],
|
32
|
-
[191, 159, 31],
|
33
|
-
[191, 167, 39],
|
34
|
-
[191, 167, 39],
|
35
|
-
[191, 175, 47],
|
36
|
-
[183, 175, 47],
|
37
|
-
[183, 183, 47],
|
38
|
-
[183, 183, 55],
|
39
|
-
[207, 207, 111],
|
40
|
-
[223, 223, 159],
|
41
|
-
[239, 239, 199],
|
42
|
-
[255, 255, 255]
|
43
|
-
].freeze
|
44
|
-
|
45
|
-
FIRE_HEIGHT = 35
|
46
|
-
|
47
|
-
def initialize(blocking: false)
|
48
|
-
@fire_width = Doomfire::WindowSize.new.terminal_width
|
49
|
-
@exit_requested = false
|
50
|
-
@counter = 0
|
51
|
-
@blocking = blocking
|
52
|
-
@thread = nil
|
53
|
-
|
54
|
-
Paint.mode = 0xFFFFFF
|
55
|
-
clear_screen
|
56
|
-
initialize_pixels
|
57
|
-
|
58
|
-
Kernel.trap('INT') { @exit_requested = true } if @blocking
|
59
|
-
end
|
60
|
-
|
6
|
+
# This class outputs the pixels into the terminal, using ANSI color codes
|
7
|
+
class Terminal < Base
|
61
8
|
def run
|
62
|
-
|
9
|
+
fire_loop
|
63
10
|
end
|
64
11
|
|
65
12
|
def stop
|
66
13
|
@exit_requested = true
|
67
|
-
@thread.join unless @blocking
|
68
14
|
end
|
69
15
|
|
70
16
|
private
|
@@ -86,19 +32,11 @@ module Doomfire
|
|
86
32
|
clear_screen
|
87
33
|
end
|
88
34
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def initialize_pixels
|
98
|
-
@pixels = []
|
99
|
-
last_line = @fire_width * (FIRE_HEIGHT - 1)
|
100
|
-
@pixels.fill(0, 0...last_line)
|
101
|
-
@pixels.fill(34, last_line..(last_line + @fire_width))
|
35
|
+
def prepare_output
|
36
|
+
@fire_width = Doomfire::WindowSize.new.terminal_width
|
37
|
+
Paint.mode = 0xFFFFFF
|
38
|
+
Kernel.trap('INT') { @exit_requested = true }
|
39
|
+
clear_screen
|
102
40
|
end
|
103
41
|
|
104
42
|
def clear
|
@@ -119,20 +57,5 @@ module Doomfire
|
|
119
57
|
puts "\e[2J"
|
120
58
|
puts "\e[H"
|
121
59
|
end
|
122
|
-
|
123
|
-
def spread_fire(src)
|
124
|
-
if @pixels[src].zero?
|
125
|
-
@pixels[src - @fire_width] = 1
|
126
|
-
else
|
127
|
-
random = rand(10).round & 3
|
128
|
-
dst = src - rand(3) + 1
|
129
|
-
@pixels[dst - @fire_width] = @pixels[src] - (random & 1)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
def stop_fire
|
134
|
-
@pixels.pop(@fire_width)
|
135
|
-
@pixels.concat [].fill(0, 0, @fire_width)
|
136
|
-
end
|
137
60
|
end
|
138
61
|
end
|
data/lib/doomfire/version.rb
CHANGED
data/lib/doomfire.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doomfire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcin Ruszkiewicz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: paint
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- ".gitignore"
|
92
92
|
- ".rspec"
|
93
93
|
- ".travis.yml"
|
94
|
+
- CHANGELOG.md
|
94
95
|
- Gemfile
|
95
96
|
- Gemfile.lock
|
96
97
|
- LICENSE.txt
|
@@ -98,9 +99,12 @@ files:
|
|
98
99
|
- Rakefile
|
99
100
|
- doomfire.gemspec
|
100
101
|
- examples/long.rake
|
102
|
+
- examples/sdl_test.rb
|
101
103
|
- examples/terminal.png
|
102
104
|
- exe/doomfire
|
103
105
|
- lib/doomfire.rb
|
106
|
+
- lib/doomfire/base.rb
|
107
|
+
- lib/doomfire/spinner.rb
|
104
108
|
- lib/doomfire/terminal.rb
|
105
109
|
- lib/doomfire/version.rb
|
106
110
|
- lib/doomfire/window_size.rb
|