gosu_lighting 0.1.0 → 0.1.1
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/lib/gosu_lighting.rb +8 -0
- data/lib/gosu_lighting/circle.rb +7 -0
- data/lib/gosu_lighting/rectangle.rb +15 -0
- data/lib/gosu_lighting/source.rb +143 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c297ea94f5ee119e5bf4e27197cea5d612153fa0
|
4
|
+
data.tar.gz: b46f5beec8128384248da704df4b6d3f441ea642
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 469816d0f3ba5d1c52b261149102e39cb9ef3828dd22bd6576dadf16fea7e0f5a5975df34a9e3cbe0ac4aaf6d581b454dda86792a2515541c2f92d646f8b3698
|
7
|
+
data.tar.gz: 018ae898b70ea2fc21b98a704cc8c32fc745ee8a65ca7fb2e10770ce8ed60fa10cf4a59002eee4b0d9404ad95328ad0e755dfde7fa4fe6605bee5361c0069986
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'gosu'
|
2
|
+
require 'glfw'
|
3
|
+
require 'opengl'
|
4
|
+
|
5
|
+
OpenGL.load_dll
|
6
|
+
GLFW.load_dll
|
7
|
+
|
8
|
+
include OpenGL
|
9
|
+
include GLFW
|
10
|
+
|
11
|
+
SHADOW_LENGTH = 20000
|
12
|
+
|
13
|
+
module GosuLighting
|
14
|
+
class Source
|
15
|
+
attr_accessor :x, :y, :radius
|
16
|
+
|
17
|
+
def initialize window, x, y, radius, att_sprite = nil
|
18
|
+
@att_sprite = att_sprite || Gosu::Image.new(window, 'light.png', true)
|
19
|
+
@window = window
|
20
|
+
@x = x
|
21
|
+
@y = y
|
22
|
+
@radius = radius
|
23
|
+
end
|
24
|
+
|
25
|
+
def shadow_circle circle, depth = 1
|
26
|
+
dist = Gosu::distance @x, @y, circle.x, circle.y
|
27
|
+
depth = depth + 1.0 - dist / SHADOW_LENGTH
|
28
|
+
|
29
|
+
bx1, by1, bx2, by2 = endpoints_facing circle.x, circle.y, @x, @y, circle.radius
|
30
|
+
|
31
|
+
nx1, ny1 = normal @x, @y, bx1, by1
|
32
|
+
nx2, ny2 = normal @x, @y, bx2, by2
|
33
|
+
|
34
|
+
sx1 = bx1 + nx1 * SHADOW_LENGTH
|
35
|
+
sy1 = by1 + ny1 * SHADOW_LENGTH
|
36
|
+
sx2 = bx2 + nx2 * SHADOW_LENGTH
|
37
|
+
sy2 = by2 + ny2 * SHADOW_LENGTH
|
38
|
+
|
39
|
+
@window.gl depth do
|
40
|
+
gl_draw_shadow bx1, by1, sx1, sy1, sx2, sy2, bx2, by2, 0.5
|
41
|
+
end
|
42
|
+
|
43
|
+
return depth
|
44
|
+
end
|
45
|
+
|
46
|
+
def shadow_rectangle rect, depth = 2
|
47
|
+
dist = Gosu::distance @x, @y, rect.center_x, rect.center_y
|
48
|
+
depth = depth + 1.0 - dist / SHADOW_LENGTH
|
49
|
+
|
50
|
+
cx1 = cx2 = rect.x
|
51
|
+
cy1 = cy2 = rect.y
|
52
|
+
if @x < rect.x
|
53
|
+
cy1 += rect.height
|
54
|
+
elsif @x < rect.x + rect.width
|
55
|
+
cy1 += rect.height if @y > rect.center_y
|
56
|
+
cy2 = cy1
|
57
|
+
else
|
58
|
+
cy2 += rect.height
|
59
|
+
end
|
60
|
+
|
61
|
+
if @y < rect.y
|
62
|
+
cx2 += rect.width
|
63
|
+
elsif @y < rect.y + rect.height
|
64
|
+
cx1 += rect.width if @x > rect.center_x
|
65
|
+
cx2 = cx1
|
66
|
+
else
|
67
|
+
cx1 += rect.width
|
68
|
+
end
|
69
|
+
|
70
|
+
nx1, ny1 = normal @x, @y, cx1, cy1
|
71
|
+
nx2, ny2 = normal @x, @y, cx2, cy2
|
72
|
+
|
73
|
+
sx1 = cx1 + nx1 * SHADOW_LENGTH
|
74
|
+
sy1 = cy1 + ny1 * SHADOW_LENGTH
|
75
|
+
sx2 = cx2 + nx2 * SHADOW_LENGTH
|
76
|
+
sy2 = cy2 + ny2 * SHADOW_LENGTH
|
77
|
+
|
78
|
+
@window.gl depth do
|
79
|
+
gl_draw_shadow cx1, cy1, sx1, sy1, sx2, sy2, cx2, cy2, 1.0
|
80
|
+
end
|
81
|
+
|
82
|
+
return depth
|
83
|
+
end
|
84
|
+
|
85
|
+
def draw_attenuation depth
|
86
|
+
draw_as_rect @att_sprite, *clip_rect, depth, 0xff999999, :multiply
|
87
|
+
end
|
88
|
+
|
89
|
+
def draw
|
90
|
+
@window.clip_to(*clip_rect) do
|
91
|
+
yield self
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
def endpoints_facing x1, y1, x2, y2, r
|
97
|
+
a = Gosu::angle x1, y1, x2, y2
|
98
|
+
x3 = x1 + Gosu::offset_x(a + 90, r)
|
99
|
+
y3 = y1 + Gosu::offset_y(a + 90, r)
|
100
|
+
|
101
|
+
x4 = x1 + Gosu::offset_x(a - 90, r)
|
102
|
+
y4 = y1 + Gosu::offset_y(a - 90, r)
|
103
|
+
|
104
|
+
[x3, y3, x4, y4]
|
105
|
+
end
|
106
|
+
|
107
|
+
def vector x1, y1, x2, y2
|
108
|
+
dy = y2 - y1
|
109
|
+
dx = x2 - x1
|
110
|
+
[dx, dy]
|
111
|
+
end
|
112
|
+
|
113
|
+
def normal x1, y1, x2, y2
|
114
|
+
d = Gosu::distance x1, y1, x2, y2
|
115
|
+
x, y = vector x1, y1, x2, y2
|
116
|
+
|
117
|
+
[x/d, y/d]
|
118
|
+
end
|
119
|
+
|
120
|
+
def clip_rect
|
121
|
+
[(@x - @radius).to_i, (@y - @radius).to_i, (@radius*2.0).to_i, (@radius*2.0).to_i]
|
122
|
+
end
|
123
|
+
|
124
|
+
def draw_as_rect sprite, x, y, w, h, z, color, mode
|
125
|
+
sprite.draw_as_quad x, y, color, x+w, y, color, x+w, y+h, color, x, y+h, color, z, mode
|
126
|
+
end
|
127
|
+
|
128
|
+
def gl_draw_shadow x1, y1, x2, y2, x3, y3, x4, y4, alpha = 0.9
|
129
|
+
glDisable GL_DEPTH_TEST
|
130
|
+
glEnable GL_BLEND
|
131
|
+
glBlendEquationSeparate GL_FUNC_ADD, GL_FUNC_ADD
|
132
|
+
glBlendFuncSeparate GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO
|
133
|
+
|
134
|
+
glBegin GL_QUADS
|
135
|
+
glColor4f 0, 0, 0, alpha
|
136
|
+
glVertex3f x1, y1, 0
|
137
|
+
glVertex3f x2, y2, 0
|
138
|
+
glVertex3f x3, y3, 0
|
139
|
+
glVertex3f x4, y4, 0
|
140
|
+
glEnd
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gosu_lighting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Smith
|
@@ -86,7 +86,11 @@ email: jellymann@gmail.com
|
|
86
86
|
executables: []
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
|
-
files:
|
89
|
+
files:
|
90
|
+
- lib/gosu_lighting.rb
|
91
|
+
- lib/gosu_lighting/circle.rb
|
92
|
+
- lib/gosu_lighting/rectangle.rb
|
93
|
+
- lib/gosu_lighting/source.rb
|
90
94
|
homepage: https://github.com/jellymann/gosu_lighting
|
91
95
|
licenses:
|
92
96
|
- MIT
|