doomfire 0.2 → 0.3.0
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/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/exe/doomfire +17 -1
- data/lib/doomfire/base.rb +3 -4
- data/lib/doomfire/ffi_sdl.rb +49 -0
- data/lib/doomfire/sdl.rb +129 -0
- data/lib/doomfire/spinner.rb +1 -0
- data/lib/doomfire/terminal.rb +3 -2
- data/lib/doomfire/version.rb +1 -1
- data/lib/doomfire.rb +2 -0
- metadata +4 -3
- data/examples/sdl_test.rb +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67bdf9fa995a19a70b46f2707adc899ee31780968ffb9f1d0fe4544f6f225313
|
4
|
+
data.tar.gz: 9d1234e1894955dd50614b9bbf85edcb0a2665980baac220fb23696568e27792
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e596f6b9b137e0343a106a2ee6d9371389ad88c0877ebbe7f72a919ecd60488c0012afb71ee63fa6b3dc226607d37ca32ffeafe139114e14e328f6df37a0fb66
|
7
|
+
data.tar.gz: f9e5d75205b31479ffffdb22014e2f965223dd58c9aa0fab17b5e7b5581b8ba2f5d2d932d3af3daa31b7892ad67563733e18ffc876276926403071f0273b253c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# 0.3.0
|
2
|
+
|
3
|
+
- [ ] SDL output in progress.
|
4
|
+
- [ ] Improve SDL performance
|
5
|
+
- [ ] https://stackoverflow.com/questions/20753726/rendering-pixels-from-array-of-rgb-values-in-sdl-1-2/36504803#36504803
|
6
|
+
|
1
7
|
# 0.2.0
|
2
8
|
|
3
9
|
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.
|
data/Gemfile.lock
CHANGED
data/exe/doomfire
CHANGED
@@ -4,5 +4,21 @@
|
|
4
4
|
require 'rubygems'
|
5
5
|
require 'bundler/setup'
|
6
6
|
require 'doomfire'
|
7
|
+
require 'optparse'
|
7
8
|
|
8
|
-
|
9
|
+
options = {}
|
10
|
+
OptionParser.new do |opts|
|
11
|
+
opts.banner = 'Usage: doomfire [options]'
|
12
|
+
|
13
|
+
options[:sdl] = false
|
14
|
+
opts.on('--sdl', 'Execute SDL version') do
|
15
|
+
options[:sdl] = true
|
16
|
+
end
|
17
|
+
|
18
|
+
opts.on('-h', '--help', 'Display this screen') do
|
19
|
+
puts opts
|
20
|
+
exit
|
21
|
+
end
|
22
|
+
end.parse!
|
23
|
+
|
24
|
+
options[:sdl] ? Doomfire::SDL.new.run : Doomfire::Terminal.new.run
|
data/lib/doomfire/base.rb
CHANGED
@@ -41,8 +41,6 @@ module Doomfire
|
|
41
41
|
[255, 255, 255]
|
42
42
|
].freeze
|
43
43
|
|
44
|
-
FIRE_HEIGHT = 35
|
45
|
-
|
46
44
|
attr_reader :exit_requested, :pixels, :fire_width
|
47
45
|
|
48
46
|
def initialize
|
@@ -81,7 +79,7 @@ module Doomfire
|
|
81
79
|
end
|
82
80
|
|
83
81
|
def update_pixels
|
84
|
-
(1
|
82
|
+
(1...@fire_height).to_a.reverse.each do |x|
|
85
83
|
(0...@fire_width).each do |y|
|
86
84
|
spread_fire(x * @fire_width + y)
|
87
85
|
end
|
@@ -90,13 +88,14 @@ module Doomfire
|
|
90
88
|
|
91
89
|
def initialize_pixels
|
92
90
|
@pixels = []
|
93
|
-
last_line = @fire_width * (
|
91
|
+
last_line = @fire_width * (@fire_height - 1)
|
94
92
|
@pixels.fill(0, 0...last_line)
|
95
93
|
@pixels.fill(34, last_line..(last_line + @fire_width))
|
96
94
|
end
|
97
95
|
|
98
96
|
def prepare_output
|
99
97
|
@fire_width = 80
|
98
|
+
@fire_height = 35
|
100
99
|
end
|
101
100
|
|
102
101
|
def fire_loop
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fiddle'
|
4
|
+
require 'fiddle/import'
|
5
|
+
|
6
|
+
module Doomfire
|
7
|
+
# very minimal FFI bindings for libSDL2
|
8
|
+
module FFI_SDL
|
9
|
+
extend Fiddle::Importer
|
10
|
+
|
11
|
+
dlload 'libSDL2.dylib'
|
12
|
+
|
13
|
+
typealias 'Uint32', :int
|
14
|
+
typealias 'Uint16', :int
|
15
|
+
typealias 'Uint8', :int
|
16
|
+
|
17
|
+
SDL_INIT_VIDEO = 0x00000020
|
18
|
+
SDL_WINDOW_OPENGL = 0x00000000
|
19
|
+
SDL_WINDOWPOS_UNDEFINED = 0x1FFF0000 | 0
|
20
|
+
SDL_WINDOWPOS_CENTERED = 0x2FFF0000 | 0
|
21
|
+
SDL_QUIT = 0x100
|
22
|
+
SDL_KEYDOWN = 0x300
|
23
|
+
SDL_PIXELFORMAT_ARGB8888 = 372_645_892
|
24
|
+
SDL_TEXTUREACCESS_STATIC = 0
|
25
|
+
SDL_TEXTUREACCESS_STREAMING = 1
|
26
|
+
|
27
|
+
SDL_Event = union [
|
28
|
+
'Uint32 type'
|
29
|
+
]
|
30
|
+
|
31
|
+
# basic SDL functions - creating windows, events etc
|
32
|
+
extern 'int SDL_Init(Uint32 flags)'
|
33
|
+
extern 'void* SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)'
|
34
|
+
extern 'void* SDL_CreateRenderer(void* window, int index, Uint32 flags)'
|
35
|
+
extern 'int SDL_PollEvent(void* event)'
|
36
|
+
extern 'int SDL_RenderClear(void* renderer)'
|
37
|
+
extern 'void SDL_RenderPresent(void* renderer)'
|
38
|
+
extern 'void SDL_Quit(void)'
|
39
|
+
|
40
|
+
# software-accelerated rendering
|
41
|
+
extern 'int SDL_SetRenderDrawColor(void* renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a)'
|
42
|
+
extern 'int SDL_RenderDrawPoint(void* renderer, int x, int y)'
|
43
|
+
|
44
|
+
# textures are hardware accelerated
|
45
|
+
extern 'void* SDL_CreateTexture(void* renderer, Uint32 format, int access, int w, int h)'
|
46
|
+
extern 'int SDL_RenderCopy(void* renderer, void* texture, const void* srcrect, const void* dstrect)'
|
47
|
+
extern 'int SDL_UpdateTexture(void* texture, const void* rect, const void* pixels, int pitch)'
|
48
|
+
end
|
49
|
+
end
|
data/lib/doomfire/sdl.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
module Doomfire
|
6
|
+
# Output to a separate SDL window
|
7
|
+
class SDL < Base
|
8
|
+
extend Doomfire::FFI_SDL
|
9
|
+
|
10
|
+
ARGB = [
|
11
|
+
0x00000000,
|
12
|
+
0x00070707,
|
13
|
+
0xFF1F0707,
|
14
|
+
0xFF2F0F07,
|
15
|
+
0xFF571707,
|
16
|
+
0xFF671F07,
|
17
|
+
0xFF771F07,
|
18
|
+
0xFF8F2707,
|
19
|
+
0xFF9F2F07,
|
20
|
+
0xFFAF3F07,
|
21
|
+
0xFFBF4707,
|
22
|
+
0xFFC74707,
|
23
|
+
0xFFDF4F07,
|
24
|
+
0xFFDF5707,
|
25
|
+
0xFFDF5707,
|
26
|
+
0xFFD7670F,
|
27
|
+
0xFFCF6F0F,
|
28
|
+
0xFFCF770F,
|
29
|
+
0xFFCF7F0F,
|
30
|
+
0xFFCF8717,
|
31
|
+
0xFFC78717,
|
32
|
+
0xFFC78F17,
|
33
|
+
0xFFC7971F,
|
34
|
+
0xFFBF9F1F,
|
35
|
+
0xFFBF9F1F,
|
36
|
+
0xFFBFA727,
|
37
|
+
0xFFBFA727,
|
38
|
+
0xFFBFAF2F,
|
39
|
+
0xFFB7AF2F,
|
40
|
+
0xFFB7B72F,
|
41
|
+
0xFFB7B737,
|
42
|
+
0xFFCFCF6F,
|
43
|
+
0xFFDFDF9F,
|
44
|
+
0xFFEFEFC7,
|
45
|
+
0xFFFFFFFF
|
46
|
+
].freeze
|
47
|
+
|
48
|
+
def run
|
49
|
+
fire_loop
|
50
|
+
end
|
51
|
+
|
52
|
+
def stop
|
53
|
+
@exit_requested = true
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def fire_loop
|
59
|
+
loop do
|
60
|
+
next if @event.nil? || @window.nil? || @renderer.nil? || @texture.nil?
|
61
|
+
|
62
|
+
FFI_SDL.SDL_PollEvent(@event)
|
63
|
+
@exit_requested = true if @event.type == FFI_SDL::SDL_QUIT
|
64
|
+
|
65
|
+
if @exit_requested
|
66
|
+
stop_fire if @counter.zero?
|
67
|
+
break if @counter == 60
|
68
|
+
|
69
|
+
@counter += 1
|
70
|
+
end
|
71
|
+
|
72
|
+
clear
|
73
|
+
update_pixels
|
74
|
+
print_pixels
|
75
|
+
end
|
76
|
+
|
77
|
+
clear_screen
|
78
|
+
end
|
79
|
+
|
80
|
+
def update_pixels
|
81
|
+
(0..@fire_width).each do |x|
|
82
|
+
(1...@fire_height).each do |y|
|
83
|
+
spread_fire(y * @fire_width + x)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
@texdata = @pixels.map { |val| ARGB[val] }
|
88
|
+
@texptr = Fiddle::Pointer[@texdata.pack('L*')]
|
89
|
+
end
|
90
|
+
|
91
|
+
def prepare_output
|
92
|
+
@fire_width = 640
|
93
|
+
@fire_height = 480
|
94
|
+
|
95
|
+
FFI_SDL.SDL_Init(FFI_SDL::SDL_INIT_VIDEO)
|
96
|
+
@window = FFI_SDL.SDL_CreateWindow(
|
97
|
+
'Doomfire.rb',
|
98
|
+
FFI_SDL::SDL_WINDOWPOS_UNDEFINED,
|
99
|
+
FFI_SDL::SDL_WINDOWPOS_UNDEFINED,
|
100
|
+
@fire_width,
|
101
|
+
@fire_height,
|
102
|
+
FFI_SDL::SDL_WINDOW_OPENGL
|
103
|
+
)
|
104
|
+
@renderer = FFI_SDL.SDL_CreateRenderer(@window, -1, 0)
|
105
|
+
@texture = FFI_SDL.SDL_CreateTexture(
|
106
|
+
@renderer,
|
107
|
+
FFI_SDL::SDL_PIXELFORMAT_ARGB8888,
|
108
|
+
FFI_SDL::SDL_TEXTUREACCESS_STREAMING,
|
109
|
+
@fire_width,
|
110
|
+
@fire_height
|
111
|
+
)
|
112
|
+
@event = FFI_SDL::SDL_Event.malloc
|
113
|
+
end
|
114
|
+
|
115
|
+
def clear
|
116
|
+
FFI_SDL.SDL_RenderClear(@renderer)
|
117
|
+
end
|
118
|
+
|
119
|
+
def print_pixels
|
120
|
+
FFI_SDL.SDL_UpdateTexture(@texture, nil, @texptr, 4 * @fire_width)
|
121
|
+
FFI_SDL.SDL_RenderCopy(@renderer, @texture, 0, 0)
|
122
|
+
FFI_SDL.SDL_RenderPresent(@renderer)
|
123
|
+
end
|
124
|
+
|
125
|
+
def clear_screen
|
126
|
+
FFI_SDL.SDL_Quit()
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
data/lib/doomfire/spinner.rb
CHANGED
data/lib/doomfire/terminal.rb
CHANGED
@@ -19,7 +19,7 @@ module Doomfire
|
|
19
19
|
loop do
|
20
20
|
if @exit_requested
|
21
21
|
stop_fire if @counter.zero?
|
22
|
-
break if @counter ==
|
22
|
+
break if @counter == @fire_height
|
23
23
|
|
24
24
|
@counter += 1
|
25
25
|
end
|
@@ -33,6 +33,7 @@ module Doomfire
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def prepare_output
|
36
|
+
@fire_height = 35
|
36
37
|
@fire_width = Doomfire::WindowSize.new.terminal_width
|
37
38
|
Paint.mode = 0xFFFFFF
|
38
39
|
Kernel.trap('INT') { @exit_requested = true }
|
@@ -45,7 +46,7 @@ module Doomfire
|
|
45
46
|
end
|
46
47
|
|
47
48
|
def print_pixels
|
48
|
-
(0
|
49
|
+
(0...@fire_height).each do |x|
|
49
50
|
(0...@fire_width).each do |y|
|
50
51
|
print Paint[' ', nil, RGB[@pixels[x * @fire_width + y]]]
|
51
52
|
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:
|
4
|
+
version: 0.3.0
|
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-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: paint
|
@@ -99,11 +99,12 @@ files:
|
|
99
99
|
- Rakefile
|
100
100
|
- doomfire.gemspec
|
101
101
|
- examples/long.rake
|
102
|
-
- examples/sdl_test.rb
|
103
102
|
- examples/terminal.png
|
104
103
|
- exe/doomfire
|
105
104
|
- lib/doomfire.rb
|
106
105
|
- lib/doomfire/base.rb
|
106
|
+
- lib/doomfire/ffi_sdl.rb
|
107
|
+
- lib/doomfire/sdl.rb
|
107
108
|
- lib/doomfire/spinner.rb
|
108
109
|
- lib/doomfire/terminal.rb
|
109
110
|
- lib/doomfire/version.rb
|
data/examples/sdl_test.rb
DELETED
@@ -1,57 +0,0 @@
|
|
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
|