scorched_earth 5.0.4.pre-java → 5.0.5.pre-java
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/bin/console +1 -1
- data/exe/scorched +3 -1
- data/lib/scorched_earth/event_runner.rb +1 -1
- data/lib/scorched_earth/events/{game_ending.rb → game_over.rb} +1 -1
- data/lib/scorched_earth/events/{entity_created.rb → game_update.rb} +1 -1
- data/lib/scorched_earth/events/{entity_destroyed.rb → hit.rb} +1 -1
- data/lib/scorched_earth/game.rb +39 -53
- data/lib/scorched_earth/game_window.rb +2 -7
- data/lib/scorched_earth/helpers.rb +2 -1
- data/lib/scorched_earth/objects/explosion.rb +17 -0
- data/lib/scorched_earth/objects/mouse.rb +13 -0
- data/lib/scorched_earth/objects/player.rb +12 -0
- data/lib/scorched_earth/objects/shot.rb +41 -0
- data/lib/scorched_earth/renders/explosion.rb +33 -0
- data/lib/scorched_earth/renders/map.rb +76 -0
- data/lib/scorched_earth/renders/mouse.rb +27 -0
- data/lib/scorched_earth/renders/player.rb +30 -0
- data/lib/scorched_earth/renders/shot.rb +23 -0
- data/lib/scorched_earth/renders/trajectory.rb +34 -0
- data/lib/scorched_earth/renders.rb +16 -0
- data/lib/scorched_earth/services/cie94.rb +23 -23
- data/lib/scorched_earth/services/color_palette.rb +66 -0
- data/lib/scorched_earth/services/deform.rb +30 -0
- data/lib/scorched_earth/services/wave.rb +21 -0
- data/lib/scorched_earth/subscribers/game_over/timeout.rb +15 -0
- data/lib/scorched_earth/subscribers/game_update/collisions.rb +18 -0
- data/lib/scorched_earth/subscribers/hit/deform.rb +18 -0
- data/lib/scorched_earth/subscribers/hit/effect.rb +15 -0
- data/lib/scorched_earth/subscribers/hit/radius.rb +17 -0
- data/lib/scorched_earth/subscribers/mouse_moved.rb +13 -0
- data/lib/scorched_earth/subscribers/mouse_pressed.rb +13 -0
- data/lib/scorched_earth/subscribers/mouse_released/fire.rb +35 -0
- data/lib/scorched_earth/subscribers/mouse_released/next_player.rb +13 -0
- data/lib/scorched_earth/version.rb +1 -1
- data/lib/scorched_earth.rb +1 -0
- metadata +28 -11
- data/lib/scorched_earth/color_palette.rb +0 -66
- data/lib/scorched_earth/explosion.rb +0 -23
- data/lib/scorched_earth/mouse.rb +0 -75
- data/lib/scorched_earth/player.rb +0 -18
- data/lib/scorched_earth/shot.rb +0 -52
- data/lib/scorched_earth/terrain.rb +0 -72
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5194b6a1289adc43e4d2e6a619f1f92919f1924
|
4
|
+
data.tar.gz: 5a5a91fb6b9dbd47e948fdbb1934b70976242dae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d2f4458c1e45261dd3000dd32d41d93f1583ea2e7deb5f45ad6b40af29b0553a9e308b9f872fcd7fc0ebde40b7427b68710e9af0a4f60ff76b97f5a89f19100
|
7
|
+
data.tar.gz: e67a02cfd9786bef1a123bbdb8fdf5165961718652fcdd9842700d93bd89f49257760a212ab7e9e3ef0c5b3bf3c51eff91eeb5944b190dbcf6fc8091080c798d
|
data/bin/console
CHANGED
data/exe/scorched
CHANGED
data/lib/scorched_earth/game.rb
CHANGED
@@ -2,91 +2,77 @@ include Java
|
|
2
2
|
|
3
3
|
import java.awt.Color
|
4
4
|
|
5
|
-
require 'scorched_earth/
|
6
|
-
require 'scorched_earth/
|
7
|
-
require 'scorched_earth/
|
8
|
-
require 'scorched_earth/
|
9
|
-
require 'scorched_earth/explosion'
|
10
|
-
require 'scorched_earth/mouse'
|
11
|
-
require 'scorched_earth/color_palette'
|
5
|
+
require 'scorched_earth/objects/player'
|
6
|
+
require 'scorched_earth/objects/shot'
|
7
|
+
require 'scorched_earth/objects/explosion'
|
8
|
+
require 'scorched_earth/objects/mouse'
|
12
9
|
require 'scorched_earth/event_runner'
|
13
|
-
require 'scorched_earth/events/
|
14
|
-
require 'scorched_earth/
|
15
|
-
require 'scorched_earth/
|
10
|
+
require 'scorched_earth/events/game_update'
|
11
|
+
require 'scorched_earth/subscribers/game_over/timeout'
|
12
|
+
require 'scorched_earth/subscribers/game_update/collisions'
|
13
|
+
require 'scorched_earth/subscribers/hit/deform'
|
14
|
+
require 'scorched_earth/subscribers/hit/effect'
|
15
|
+
require 'scorched_earth/subscribers/hit/radius'
|
16
|
+
require 'scorched_earth/subscribers/mouse_moved'
|
17
|
+
require 'scorched_earth/subscribers/mouse_pressed'
|
18
|
+
require 'scorched_earth/subscribers/mouse_released/fire'
|
19
|
+
require 'scorched_earth/subscribers/mouse_released/next_player'
|
20
|
+
require 'scorched_earth/helpers'
|
21
|
+
require 'scorched_earth/services/color_palette'
|
22
|
+
require 'scorched_earth/services/deform'
|
23
|
+
require 'scorched_earth/services/wave'
|
24
|
+
require 'scorched_earth/renders'
|
16
25
|
|
17
26
|
module ScorchedEarth
|
18
27
|
class Game
|
19
28
|
include Helpers
|
20
29
|
|
21
|
-
|
22
|
-
|
23
|
-
|
30
|
+
Subscribers.constants.each { |name| prepend Subscribers.const_get name }
|
31
|
+
|
32
|
+
attr_reader :width, :height, :mouse,
|
33
|
+
:event_runner, :color_palette, :objects, :players, :array
|
24
34
|
|
25
35
|
def initialize(width, height)
|
26
36
|
@width = width
|
27
37
|
@height = height
|
38
|
+
@mouse = Mouse.new
|
28
39
|
end
|
29
40
|
|
30
41
|
def setup
|
31
|
-
@color_palette = ColorPalette.new Color
|
32
|
-
@entities = []
|
42
|
+
@color_palette = Services::ColorPalette.new Color::RED, Color::YELLOW, Color::WHITE
|
33
43
|
@event_runner = EventRunner.new
|
34
|
-
@
|
35
|
-
@
|
36
|
-
@
|
37
|
-
|
38
|
-
register_events
|
44
|
+
@objects = []
|
45
|
+
@array = Services::Wave.new(width, height, phases = rand(10)).each.to_a # Array.new(width) { height / 4 }
|
46
|
+
@players = Array.new(2) { x = rand(width); Player.new(x, array[x]) }
|
39
47
|
end
|
40
48
|
|
41
49
|
def update(delta)
|
42
|
-
|
50
|
+
@objects = objects
|
51
|
+
.map { |object| object.update delta }
|
52
|
+
.compact
|
43
53
|
|
44
|
-
|
45
|
-
|
46
|
-
.reject { |entity| terrain.fetch(entity.x, 0) < entity.y }
|
47
|
-
.each { |entity| event_runner.publish Events::EntityDestroyed.new(entity) }
|
54
|
+
event_runner.publish Events::GameUpdate.new delta
|
55
|
+
event_runner.process!
|
48
56
|
end
|
49
57
|
|
50
58
|
def render(graphics)
|
51
59
|
graphics.set_color color_palette.get('sky')
|
52
60
|
graphics.fill_rect 0, 0, width, height
|
53
61
|
|
54
|
-
|
55
|
-
entity.draw graphics
|
56
|
-
end
|
62
|
+
Renders::Mouse.new(mouse, current_player).call(graphics, color_palette)
|
57
63
|
|
58
|
-
|
59
|
-
|
60
|
-
end
|
64
|
+
objects.each { |object| Renders.find(object).call(graphics, color_palette) }
|
65
|
+
players.each { |player| Renders.find(player).call(graphics, color_palette) }
|
61
66
|
|
62
|
-
|
63
|
-
|
64
|
-
terrain.draw graphics
|
67
|
+
Renders::Map.new(array).call(graphics, color_palette)
|
65
68
|
end
|
66
69
|
|
67
70
|
def publish(event)
|
68
71
|
event_runner.publish event
|
69
72
|
end
|
70
73
|
|
71
|
-
|
72
|
-
|
73
|
-
def register_events
|
74
|
-
event_runner.subscribe Events::MousePressed, &mouse.method(:mouse_pressed)
|
75
|
-
event_runner.subscribe Events::MouseReleased, &mouse.method(:mouse_released)
|
76
|
-
event_runner.subscribe Events::MouseMoved, &mouse.method(:mouse_moved)
|
77
|
-
event_runner.subscribe(Events::GameEnding) { |event| event.time < Time.now ? setup : event_runner.publish(event) }
|
78
|
-
event_runner.subscribe(Events::EntityCreated) { |event| entities << event.entity }
|
79
|
-
event_runner.subscribe(Events::EntityDestroyed) { |event| entities.delete event.entity }
|
80
|
-
event_runner.subscribe(Events::EntityDestroyed) do |event|
|
81
|
-
radius = 50
|
82
|
-
[event.entity]
|
83
|
-
.select { |entity| entity.is_a? Shot }
|
84
|
-
.select { |entity| entity.x < terrain.width && entity.x > 0 }
|
85
|
-
.each { |entity| terrain.bite entity.x, radius }
|
86
|
-
.each { |entity| event_runner.publish Events::EntityCreated.new(Explosion.new(entity.x, entity.y)) }
|
87
|
-
.select { |entity| players.any? { |player| inside_radius? entity.x - player.x, 0, radius } }
|
88
|
-
.each { event_runner.publish Events::GameEnding.new(Time.now + 0.25) }
|
89
|
-
end
|
74
|
+
def current_player
|
75
|
+
players.first
|
90
76
|
end
|
91
77
|
end
|
92
78
|
end
|
@@ -8,7 +8,6 @@ import java.awt.Dimension
|
|
8
8
|
import javax.swing.JPanel
|
9
9
|
import java.awt.Color
|
10
10
|
|
11
|
-
require 'scorched_earth/game'
|
12
11
|
require 'scorched_earth/events/mouse_pressed'
|
13
12
|
require 'scorched_earth/events/mouse_released'
|
14
13
|
require 'scorched_earth/events/mouse_moved'
|
@@ -20,7 +19,8 @@ module ScorchedEarth
|
|
20
19
|
|
21
20
|
attr_reader :buffer_strategy, :canvas, :game
|
22
21
|
|
23
|
-
def initialize(width, height)
|
22
|
+
def initialize(width, height, game)
|
23
|
+
@game = game
|
24
24
|
@container = JFrame.new
|
25
25
|
@canvas = Canvas.new
|
26
26
|
@panel = @container.get_content_pane
|
@@ -44,8 +44,6 @@ module ScorchedEarth
|
|
44
44
|
@canvas.set_ignore_repaint true
|
45
45
|
@canvas.create_buffer_strategy 2
|
46
46
|
@buffer_strategy = @canvas.get_buffer_strategy
|
47
|
-
|
48
|
-
@game = ScorchedEarth::Game.new canvas.width, canvas.height
|
49
47
|
end
|
50
48
|
|
51
49
|
def run
|
@@ -58,9 +56,6 @@ module ScorchedEarth
|
|
58
56
|
last_time = Time.now
|
59
57
|
graphics = buffer_strategy.get_draw_graphics
|
60
58
|
|
61
|
-
graphics.set_color Color.black
|
62
|
-
graphics.fill_rect 0, 0, canvas.width, canvas.height
|
63
|
-
|
64
59
|
game.update delta
|
65
60
|
game.render graphics
|
66
61
|
|
@@ -41,6 +41,7 @@ module ScorchedEarth
|
|
41
41
|
x**2 + y**2 < radius**2
|
42
42
|
end
|
43
43
|
|
44
|
-
module_function :angle, :circle, :inside_radius?, :radians_to_degrees,
|
44
|
+
module_function :angle, :circle, :inside_radius?, :radians_to_degrees,
|
45
|
+
:degrees_to_radians, :normalize_degrees, :offset_x, :offset_y
|
45
46
|
end
|
46
47
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module ScorchedEarth
|
2
|
+
class Explosion
|
3
|
+
attr_reader :x, :y, :radius
|
4
|
+
|
5
|
+
def initialize(x, y, radius = 25)
|
6
|
+
@x = x
|
7
|
+
@y = y
|
8
|
+
@radius = radius
|
9
|
+
|
10
|
+
freeze
|
11
|
+
end
|
12
|
+
|
13
|
+
def update(_delta)
|
14
|
+
self.class.new(x, y, radius + 25) if radius < 125
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ScorchedEarth
|
2
|
+
class Shot
|
3
|
+
class Trajectory < Array
|
4
|
+
def initialize(*args)
|
5
|
+
super
|
6
|
+
|
7
|
+
freeze
|
8
|
+
end
|
9
|
+
|
10
|
+
def update(*_args)
|
11
|
+
self
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :x, :y, :velocity_x, :velocity_y, :trajectory
|
16
|
+
|
17
|
+
def initialize(x, y, velocity_x, velocity_y, trajectory = Trajectory.new)
|
18
|
+
@x = x
|
19
|
+
@y = y
|
20
|
+
@velocity_x = velocity_x
|
21
|
+
@velocity_y = velocity_y
|
22
|
+
@trajectory = Trajectory.new trajectory + [[x, y]]
|
23
|
+
|
24
|
+
freeze
|
25
|
+
end
|
26
|
+
|
27
|
+
def update(delta)
|
28
|
+
self.class.new(
|
29
|
+
x + velocity_x * delta,
|
30
|
+
y + velocity_y * delta,
|
31
|
+
velocity_x,
|
32
|
+
velocity_y - gravity * delta,
|
33
|
+
trajectory
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def gravity
|
38
|
+
2000
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ScorchedEarth
|
2
|
+
module Renders
|
3
|
+
class Explosion
|
4
|
+
attr_reader :explosion
|
5
|
+
|
6
|
+
def initialize(explosion)
|
7
|
+
@explosion = explosion
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(graphics, *_args)
|
11
|
+
height = graphics.destination.height
|
12
|
+
y = height - explosion.y - radius / 2
|
13
|
+
|
14
|
+
graphics.set_color color
|
15
|
+
graphics.fill_oval x, y, radius, radius
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def color
|
21
|
+
Color::WHITE
|
22
|
+
end
|
23
|
+
|
24
|
+
def radius
|
25
|
+
explosion.radius
|
26
|
+
end
|
27
|
+
|
28
|
+
def x
|
29
|
+
explosion.x - radius / 2
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
include Java
|
2
|
+
|
3
|
+
import java.awt.Transparency
|
4
|
+
import java.awt.Image
|
5
|
+
|
6
|
+
module ScorchedEarth
|
7
|
+
module Renders
|
8
|
+
class Map
|
9
|
+
module Cache
|
10
|
+
def to_image(graphics, color_palette)
|
11
|
+
cache(key) do
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def key
|
19
|
+
array.join
|
20
|
+
end
|
21
|
+
|
22
|
+
def cache(key)
|
23
|
+
@@cache ||= {}
|
24
|
+
|
25
|
+
if value = @@cache[key]
|
26
|
+
value
|
27
|
+
else
|
28
|
+
@@cache = {}
|
29
|
+
|
30
|
+
@@cache[key] ||= begin
|
31
|
+
yield
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
prepend Cache
|
38
|
+
|
39
|
+
attr_reader :array
|
40
|
+
|
41
|
+
def initialize(array)
|
42
|
+
@array = array
|
43
|
+
end
|
44
|
+
|
45
|
+
def call(graphics, color_palette)
|
46
|
+
graphics.draw_image to_image(graphics, color_palette), 0, 0, nil
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def to_image(graphics, color_palette)
|
52
|
+
height = graphics.destination.height
|
53
|
+
color = color_palette.get(array.class.name)
|
54
|
+
|
55
|
+
image = graphics
|
56
|
+
.get_device_configuration
|
57
|
+
.create_compatible_image width, height, Transparency::TRANSLUCENT
|
58
|
+
|
59
|
+
image.set_acceleration_priority 1
|
60
|
+
|
61
|
+
array.each_with_index do |y, x|
|
62
|
+
image.graphics.tap do |image_graphics|
|
63
|
+
image_graphics.set_color color
|
64
|
+
image_graphics.draw_line x, height - y, x, height
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
image
|
69
|
+
end
|
70
|
+
|
71
|
+
def width
|
72
|
+
array.size
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
include Java
|
2
|
+
|
3
|
+
import java.awt.BasicStroke
|
4
|
+
|
5
|
+
module ScorchedEarth
|
6
|
+
module Renders
|
7
|
+
class Mouse
|
8
|
+
attr_reader :mouse, :player
|
9
|
+
|
10
|
+
def initialize(mouse, player)
|
11
|
+
@mouse = mouse
|
12
|
+
@player = player
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(graphics, color_palette)
|
16
|
+
return unless mouse.x && mouse.y
|
17
|
+
|
18
|
+
color = color_palette.get(player.x)
|
19
|
+
height = graphics.destination.height
|
20
|
+
|
21
|
+
graphics.set_color color
|
22
|
+
graphics.setStroke BasicStroke.new 3
|
23
|
+
graphics.draw_line mouse.x, mouse.y, player.x, height - player.y
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ScorchedEarth
|
2
|
+
module Renders
|
3
|
+
class Player
|
4
|
+
attr_reader :player
|
5
|
+
|
6
|
+
def initialize(player)
|
7
|
+
@player = player
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(graphics, color_palette)
|
11
|
+
color = color_palette.get(player.x)
|
12
|
+
height = graphics.destination.height
|
13
|
+
y = height - player.y - radius / 2
|
14
|
+
|
15
|
+
graphics.set_color color
|
16
|
+
graphics.fill_oval x, y, radius, radius
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def x
|
22
|
+
player.x - radius / 2
|
23
|
+
end
|
24
|
+
|
25
|
+
def radius
|
26
|
+
25
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
include Java
|
2
|
+
|
3
|
+
import java.awt.Color
|
4
|
+
import java.awt.BasicStroke
|
5
|
+
import java.awt.geom.GeneralPath
|
6
|
+
|
7
|
+
require 'scorched_earth/renders/trajectory'
|
8
|
+
|
9
|
+
module ScorchedEarth
|
10
|
+
module Renders
|
11
|
+
class Shot
|
12
|
+
attr_reader :shot
|
13
|
+
|
14
|
+
def initialize(shot)
|
15
|
+
@shot = shot
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(graphics, *_args)
|
19
|
+
ScorchedEarth::Renders::Trajectory.new(shot.trajectory).call(graphics, *_args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
include Java
|
2
|
+
|
3
|
+
import java.awt.Color
|
4
|
+
import java.awt.BasicStroke
|
5
|
+
import java.awt.geom.GeneralPath
|
6
|
+
|
7
|
+
module ScorchedEarth
|
8
|
+
module Renders
|
9
|
+
class Trajectory
|
10
|
+
attr_reader :trajectory
|
11
|
+
|
12
|
+
def initialize(trajectory)
|
13
|
+
@trajectory = trajectory
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(graphics, *_args)
|
17
|
+
height = graphics.destination.height
|
18
|
+
path = GeneralPath.new GeneralPath::WIND_NON_ZERO
|
19
|
+
first, *remaining = trajectory
|
20
|
+
|
21
|
+
path.move_to first[0], height - first[1]
|
22
|
+
|
23
|
+
remaining.each do |x, y|
|
24
|
+
path.line_to x, height - y
|
25
|
+
end
|
26
|
+
|
27
|
+
graphics.set_stroke BasicStroke.new 3.0, BasicStroke::CAP_ROUND, BasicStroke::JOIN_ROUND, 10.0, [10.0].to_java(:float), 0.0
|
28
|
+
graphics.set_color Color::WHITE
|
29
|
+
|
30
|
+
graphics.draw path
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'scorched_earth/renders/explosion'
|
2
|
+
require 'scorched_earth/renders/mouse'
|
3
|
+
require 'scorched_earth/renders/player'
|
4
|
+
require 'scorched_earth/renders/shot'
|
5
|
+
require 'scorched_earth/renders/map'
|
6
|
+
|
7
|
+
module ScorchedEarth
|
8
|
+
module Renders
|
9
|
+
def self.find(object)
|
10
|
+
class_name = object.class.name.split('::').last
|
11
|
+
render_class = const_get class_name
|
12
|
+
|
13
|
+
render_class.new object
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -31,67 +31,67 @@ module ScorchedEarth
|
|
31
31
|
delta_a = a_1 - a_2
|
32
32
|
delta_b = b_1 - b_2
|
33
33
|
|
34
|
-
c_1 = Math.sqrt((a_1
|
35
|
-
c_2 = Math.sqrt((a_2
|
34
|
+
c_1 = Math.sqrt((a_1**2) + (b_1**2))
|
35
|
+
c_2 = Math.sqrt((a_2**2) + (b_2**2))
|
36
36
|
|
37
37
|
delta_L = color_1[:L] - color_2[:L]
|
38
38
|
delta_C = c_1 - c_2
|
39
39
|
|
40
|
-
delta_H2 = (delta_a
|
40
|
+
delta_H2 = (delta_a**2) + (delta_b**2) - (delta_C**2)
|
41
41
|
|
42
42
|
s_L = 1
|
43
43
|
s_C = 1 + k_1 * c_1
|
44
44
|
s_H = 1 + k_2 * c_1
|
45
45
|
|
46
|
-
composite_L = (delta_L / (k_L * s_L))
|
47
|
-
composite_C = (delta_C / (k_C * s_C))
|
48
|
-
composite_H = delta_H2 / ((k_H * s_H)
|
46
|
+
composite_L = (delta_L / (k_L * s_L))**2
|
47
|
+
composite_C = (delta_C / (k_C * s_C))**2
|
48
|
+
composite_H = delta_H2 / ((k_H * s_H)**2)
|
49
49
|
|
50
50
|
Math.sqrt(composite_L + composite_C + composite_H)
|
51
51
|
end
|
52
52
|
|
53
53
|
private
|
54
54
|
|
55
|
-
def to_xyz(color,
|
56
|
-
r, g, b = [
|
57
|
-
if
|
58
|
-
(((v + 0.055) / 1.055)
|
55
|
+
def to_xyz(color, _color_space = :sRGB)
|
56
|
+
r, g, b = [color.red, color.green, color.blue].map do |v|
|
57
|
+
if v > 0.04045
|
58
|
+
(((v + 0.055) / 1.055)**2.4) * 100
|
59
59
|
else
|
60
60
|
(v / 12.92) * 100
|
61
61
|
end
|
62
|
-
|
62
|
+
end
|
63
63
|
|
64
64
|
# Convert using the RGB/XYZ matrix at:
|
65
65
|
# http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html#WSMatrices
|
66
66
|
{
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
67
|
+
x: (r * 0.4124564 + g * 0.3575761 + b * 0.1804375),
|
68
|
+
y: (r * 0.2126729 + g * 0.7151522 + b * 0.0721750),
|
69
|
+
z: (r * 0.0193339 + g * 0.1191920 + b * 0.9503041)
|
70
70
|
}
|
71
71
|
end
|
72
72
|
|
73
|
-
def to_lab(color,
|
73
|
+
def to_lab(color, _color_space = :sRGB, reference_white = [95.047, 100.00, 108.883])
|
74
74
|
xyz = to_xyz color
|
75
75
|
|
76
76
|
xr = xyz[:x] / reference_white[0]
|
77
77
|
yr = xyz[:y] / reference_white[1]
|
78
78
|
zr = xyz[:z] / reference_white[2]
|
79
79
|
|
80
|
-
epsilon = (216 /
|
81
|
-
kappa = (
|
80
|
+
epsilon = (216 / 24_389.0)
|
81
|
+
kappa = (24_389 / 27.0)
|
82
82
|
|
83
|
-
fx, fy, fz = [
|
84
|
-
if
|
85
|
-
t
|
83
|
+
fx, fy, fz = [xr, yr, zr].map do |t|
|
84
|
+
if t > epsilon
|
85
|
+
t**(1.0 / 3)
|
86
86
|
else # t <= epsilon
|
87
87
|
((kappa * t) + 16) / 116.0
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
{
|
92
|
-
:
|
93
|
-
:
|
94
|
-
:
|
92
|
+
L: ((116 * fy) - 16),
|
93
|
+
a: (500 * (fx - fy)),
|
94
|
+
b: (200 * (fy - fz))
|
95
95
|
}
|
96
96
|
end
|
97
97
|
end
|