mittsu 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/README.md +1 -1
- data/lib/mittsu/cameras/orthographic_camera.rb +13 -0
- data/lib/mittsu/cameras/perspective_camera.rb +11 -0
- data/lib/mittsu/core/geometry.rb +12 -9
- data/lib/mittsu/core/object_3d.rb +33 -66
- data/lib/mittsu/lights/ambient_light.rb +8 -0
- data/lib/mittsu/lights/directional_light.rb +9 -0
- data/lib/mittsu/lights/hemisphere_light.rb +9 -0
- data/lib/mittsu/lights/point_light.rb +11 -0
- data/lib/mittsu/lights/spot_light.rb +13 -0
- data/lib/mittsu/loaders.rb +1 -0
- data/lib/mittsu/loaders/mtl_loader.rb +5 -12
- data/lib/mittsu/loaders/obj_loader.rb +212 -0
- data/lib/mittsu/loaders/obj_mtl_loader.rb +11 -207
- data/lib/mittsu/materials/material.rb +5 -2
- data/lib/mittsu/materials/mesh_basic_material.rb +0 -9
- data/lib/mittsu/math/color.rb +44 -104
- data/lib/mittsu/math/matrix3.rb +8 -1
- data/lib/mittsu/math/matrix4.rb +6 -0
- data/lib/mittsu/math/vector.rb +251 -0
- data/lib/mittsu/math/vector2.rb +14 -213
- data/lib/mittsu/math/vector3.rb +61 -351
- data/lib/mittsu/math/vector4.rb +45 -295
- data/lib/mittsu/objects/line.rb +12 -2
- data/lib/mittsu/objects/mesh.rb +18 -9
- data/lib/mittsu/renderers/glfw_window.rb +15 -13
- data/lib/mittsu/renderers/opengl/core/opengl_geometry.rb +253 -0
- data/lib/mittsu/renderers/opengl/core/opengl_object_3d.rb +131 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_ambient_light.rb +26 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_directional_light.rb +35 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_hemisphere_light.rb +42 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_light.rb +52 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_point_light.rb +36 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_spot_light.rb +47 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_line_basic_material.rb +16 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_material.rb +275 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_mesh_basic_material.rb +69 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_mesh_lambert_material.rb +29 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_mesh_phong_material.rb +40 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_shader_material.rb +11 -0
- data/lib/mittsu/renderers/opengl/objects/opengl_group.rb +8 -0
- data/lib/mittsu/renderers/opengl/objects/opengl_line.rb +54 -0
- data/lib/mittsu/renderers/opengl/objects/opengl_mesh.rb +77 -0
- data/lib/mittsu/renderers/opengl/opengl_buffer.rb +5 -0
- data/lib/mittsu/renderers/opengl/opengl_debug.rb +49 -7
- data/lib/mittsu/renderers/opengl/opengl_default_target.rb +54 -0
- data/lib/mittsu/renderers/opengl/opengl_geometry_group.rb +763 -0
- data/lib/mittsu/renderers/opengl/opengl_geometry_like.rb +130 -0
- data/lib/mittsu/renderers/opengl/opengl_helper.rb +161 -0
- data/lib/mittsu/renderers/opengl/opengl_implementations.rb +61 -0
- data/lib/mittsu/renderers/opengl/opengl_light_renderer.rb +43 -0
- data/lib/mittsu/renderers/opengl/opengl_mittsu_params.rb +53 -0
- data/lib/mittsu/renderers/opengl/opengl_program.rb +147 -296
- data/lib/mittsu/renderers/opengl/opengl_state.rb +3 -5
- data/lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb +12 -10
- data/lib/mittsu/renderers/opengl/scenes/opengl_scene.rb +8 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_compressed_texture.rb +21 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_cube_texture.rb +75 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_data_texture.rb +23 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_texture.rb +111 -0
- data/lib/mittsu/renderers/opengl_render_target.rb +117 -2
- data/lib/mittsu/renderers/opengl_renderer.rb +653 -2978
- data/lib/mittsu/renderers/shaders/rbsl_loader.rb +166 -0
- data/lib/mittsu/renderers/shaders/shader_chunk.rb +6 -9
- data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_fragment.glsl +36 -37
- data/lib/mittsu/renderers/shaders/shader_lib.rb +26 -403
- data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_fragment.rbsl +37 -0
- data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_uniforms.rbslu +3 -0
- data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_vertex.rbsl +33 -0
- data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_fragment.rbsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_uniforms.rbslu +2 -0
- data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_vertex.rbsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_fragment.rbsl +26 -0
- data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_uniforms.rbslu +0 -0
- data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_vertex.rbsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_fragment.rbsl +56 -0
- data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_uniforms.rbslu +7 -0
- data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_vertex.rbsl +37 -0
- data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_fragment.rbsl +45 -0
- data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_uniforms.rbslu +11 -0
- data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_vertex.rbsl +43 -0
- data/lib/mittsu/renderers/shaders/shader_templates/fragment.glsl.erb +105 -0
- data/lib/mittsu/renderers/shaders/shader_templates/vertex.glsl.erb +143 -0
- data/lib/mittsu/renderers/shaders/uniforms_lib.rb +54 -55
- data/lib/mittsu/textures/texture.rb +5 -2
- data/lib/mittsu/version.rb +1 -1
- data/run_all_examples.sh +7 -0
- metadata +77 -28
- data/.ruby-version +0 -1
- data/lib/mittsu/core/hash_object.rb +0 -19
@@ -6,220 +6,24 @@ module Mittsu
|
|
6
6
|
@manager = manager
|
7
7
|
end
|
8
8
|
|
9
|
-
def load(url, mtlurl)
|
10
|
-
|
11
|
-
# mtl_loader.cross_origin = @cross_origin # TODO: not needed?
|
12
|
-
materials_creator = mtl_loader.load(mtlurl)
|
9
|
+
def load(url, mtlurl = nil)
|
10
|
+
object = OBJLoader.new(@manager).load(url)
|
13
11
|
|
14
|
-
|
12
|
+
if !mtlurl.nil?
|
13
|
+
mtl_loader = MTLLoader.new(File.dirname(url))
|
14
|
+
materials_creator = mtl_loader.load(mtlurl)
|
15
15
|
|
16
|
-
|
17
|
-
# loader.cross_origin = @cross_origin # TODO: not needed?
|
16
|
+
materials_creator.preload
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
material = materials_creator.create(child_object.material.name)
|
25
|
-
child_object.material = material if material
|
18
|
+
object.traverse do |child_object|
|
19
|
+
if child_object.is_a?(Mesh) && child_object.material.name && !child_object.material.name.empty?
|
20
|
+
material = materials_creator.create(child_object.material.name)
|
21
|
+
child_object.material = material if material
|
22
|
+
end
|
26
23
|
end
|
27
24
|
end
|
28
25
|
|
29
26
|
object
|
30
27
|
end
|
31
|
-
|
32
|
-
def parse(data)
|
33
|
-
@face_offset = 0
|
34
|
-
@group = Group.new
|
35
|
-
@object = @group
|
36
|
-
|
37
|
-
@geometry = Geometry.new
|
38
|
-
@material = MeshLambertMaterial.new
|
39
|
-
@mesh = Mesh.new(@geometry, @material)
|
40
|
-
|
41
|
-
@vertices = []
|
42
|
-
@normals = []
|
43
|
-
@uvs = []
|
44
|
-
|
45
|
-
# v float float float
|
46
|
-
vertex_pattern = /v( +[\d|.|+|\-|e]+)( +[\d|.|+|\-|e]+)( +[\d|.|+|\-|e]+)/
|
47
|
-
|
48
|
-
# vn float float float
|
49
|
-
normal_pattern = /vn( +[\d|.|+|\-|e]+)( +[\d|.|+|\-|e]+)( +[\d|.|+|\-|e]+)/
|
50
|
-
|
51
|
-
# vt float flot
|
52
|
-
uv_pattern = /vt( +[\d|.|+|\-|e]+)( +[\d|.|+|\-|e]+)/
|
53
|
-
|
54
|
-
# f vertex vertex vertex
|
55
|
-
face_pattern1 = /f( +\d+)( +\d+)( +\d+)?/
|
56
|
-
|
57
|
-
# f vertex/uv vertex/uv vertex/uv
|
58
|
-
face_pattern2 = /f( +(\d+)\/(\d+))( +(\d+)\/(\d+))( +(\d+)\/(\d+))( +(\d+)\/(\d+))?/
|
59
|
-
|
60
|
-
# f vertex/uv/normal vertex/uv/normal vertex/uv/normal ...
|
61
|
-
face_pattern3 = /f( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))( +(\d+)\/(\d+)\/(\d+))?/
|
62
|
-
|
63
|
-
# f vertex//normal vertex//normal vertex//normal ...
|
64
|
-
face_pattern4 = /f( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))( +(\d+)\/\/(\d+))?/
|
65
|
-
|
66
|
-
lines = data.split("\n")
|
67
|
-
|
68
|
-
lines.each do |line|
|
69
|
-
line = line.strip
|
70
|
-
|
71
|
-
next if line.empty? || line.start_with?('#')
|
72
|
-
|
73
|
-
if vertex_pattern =~ line
|
74
|
-
# ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
|
75
|
-
@vertices << vector($1.to_f, $2.to_f, $3.to_f)
|
76
|
-
elsif normal_pattern =~ line
|
77
|
-
# ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"]
|
78
|
-
@normals << vector($1.to_f, $2.to_f, $3.to_f)
|
79
|
-
elsif uv_pattern =~ line
|
80
|
-
# ["vt 0.1 0.2", "0.1", "0.2"]
|
81
|
-
@uvs << uv($1.to_f, $2.to_f)
|
82
|
-
elsif face_pattern1 =~ line
|
83
|
-
# ["f 1 2 3", "1", "2", "3", undefined]
|
84
|
-
handle_face_line([ $1, $2, $3, $4 ])
|
85
|
-
elsif face_pattern2 =~ line
|
86
|
-
# ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined]
|
87
|
-
handle_face_line(
|
88
|
-
[ $2, $5, $8, $11 ], #faces
|
89
|
-
[ $3, $6, $9, $12 ] #uv
|
90
|
-
)
|
91
|
-
elsif face_pattern3 =~ line
|
92
|
-
# ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined]
|
93
|
-
handle_face_line(
|
94
|
-
[ $2, $6, $10, $14 ], #faces
|
95
|
-
[ $3, $7, $11, $15 ], #uv
|
96
|
-
[ $4, $8, $12, $16 ] #normal
|
97
|
-
)
|
98
|
-
elsif face_pattern4 =~ line
|
99
|
-
# ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined]
|
100
|
-
handle_face_line(
|
101
|
-
[ $2, $5, $8, $11 ], #faces
|
102
|
-
[ ], #uv
|
103
|
-
[ $3, $6, $9, $12 ] #normal
|
104
|
-
)
|
105
|
-
elsif /^o / =~ line
|
106
|
-
# object
|
107
|
-
mesh_n
|
108
|
-
@face_offset = @face_offset + @vertices.length
|
109
|
-
@vertices = []
|
110
|
-
object = Object3D.new
|
111
|
-
object.name = line[2..-1].strip
|
112
|
-
@group.add(object)
|
113
|
-
elsif /^g / =~ line
|
114
|
-
# group
|
115
|
-
mesh_n(line[2..-1].strip, nil)
|
116
|
-
elsif /^usemtl / =~ line
|
117
|
-
# material
|
118
|
-
mesh_n(nil, line[7..-1].strip)
|
119
|
-
elsif /^mtllib / =~ line
|
120
|
-
# mtl file
|
121
|
-
|
122
|
-
# TODO: ???
|
123
|
-
# if mtllib_callback
|
124
|
-
# mtlfile = line[7..-1].strip
|
125
|
-
# mtllib_callback.(mtlfile)
|
126
|
-
# end
|
127
|
-
elsif /^s / =~ line
|
128
|
-
# Smooth shading
|
129
|
-
else
|
130
|
-
puts "Mittsu::OBJMTLLoader: Unhandled line #{line}"
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
mesh_n(nil, nil)
|
135
|
-
|
136
|
-
@group
|
137
|
-
end
|
138
|
-
|
139
|
-
private
|
140
|
-
|
141
|
-
def vector(x, y, z)
|
142
|
-
Vector3.new(x, y, z)
|
143
|
-
end
|
144
|
-
|
145
|
-
def uv(u, v)
|
146
|
-
Vector2.new(u, v)
|
147
|
-
end
|
148
|
-
|
149
|
-
def face3(a, b, c, normals = nil)
|
150
|
-
Face3.new(a, b, c, normals)
|
151
|
-
end
|
152
|
-
|
153
|
-
def mesh_n(mesh_name = nil, material_name = nil)
|
154
|
-
if !@vertices.empty?
|
155
|
-
@geometry.vertices = @vertices
|
156
|
-
|
157
|
-
@geometry.merge_vertices
|
158
|
-
@geometry.compute_face_normals
|
159
|
-
@geometry.compute_bounding_sphere
|
160
|
-
|
161
|
-
@object.add(@mesh)
|
162
|
-
|
163
|
-
@geometry = Geometry.new
|
164
|
-
@mesh = Mesh.new(@geometry, @material)
|
165
|
-
end
|
166
|
-
|
167
|
-
@mesh.name = mesh_name unless mesh_name.nil?
|
168
|
-
|
169
|
-
if !material_name.nil?
|
170
|
-
@material = MeshLambertMaterial.new
|
171
|
-
@material.name = material_name
|
172
|
-
|
173
|
-
@mesh.material = @material
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def add_face(a, b, c, normal_inds = nil)
|
178
|
-
if normal_inds.nil?
|
179
|
-
@geometry.faces << face3(
|
180
|
-
a.to_i - (@face_offset + 1),
|
181
|
-
b.to_i - (@face_offset + 1),
|
182
|
-
c.to_i - (@face_offset + 1)
|
183
|
-
)
|
184
|
-
else
|
185
|
-
@geometry.faces << face3(
|
186
|
-
a.to_i - (@face_offset + 1),
|
187
|
-
b.to_i - (@face_offset + 1),
|
188
|
-
c.to_i - (@face_offset + 1),
|
189
|
-
normal_inds.take(3).map { |i| @normals[i.to_i - 1].clone }
|
190
|
-
)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
def add_uvs(a, b, c)
|
195
|
-
@geometry.face_vertex_uvs[0] << [
|
196
|
-
@uvs[a.to_i - 1].clone,
|
197
|
-
@uvs[b.to_i - 1].clone,
|
198
|
-
@uvs[c.to_i - 1].clone
|
199
|
-
]
|
200
|
-
end
|
201
|
-
|
202
|
-
def handle_face_line(faces, uvs = nil, normal_inds = nil)
|
203
|
-
if faces[3].nil?
|
204
|
-
add_face(faces[0], faces[1], faces[2], normal_inds)
|
205
|
-
|
206
|
-
if !uvs.nil? && !uvs.empty?
|
207
|
-
add_uvs(uvs[0], uvs[1], uvs[2])
|
208
|
-
end
|
209
|
-
else
|
210
|
-
if !normal_inds.nil? && !normal_inds.empty?
|
211
|
-
add_face(faces[0], faces[1], fances[3], [normal_inds[0], normal_inds[1], normal_inds[3]])
|
212
|
-
add_face(faces[1], faces[2], fances[3], [normal_inds[1], normal_inds[2], normal_inds[3]])
|
213
|
-
else
|
214
|
-
add_face(faces[0], faces[1], faces[3])
|
215
|
-
add_face(faces[1], faces[2], faces[3])
|
216
|
-
end
|
217
|
-
|
218
|
-
if !uvs.nil? && !uvs.empty?
|
219
|
-
add_uvs(uvs[0], uvs[1], uvs[2])
|
220
|
-
add_uvs(uvs[1], uvs[2], uvs[2])
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
28
|
end
|
225
29
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
require 'mittsu'
|
3
|
-
require 'mittsu/core/hash_object'
|
4
3
|
|
5
4
|
module Mittsu
|
6
|
-
class Material
|
5
|
+
class Material
|
7
6
|
include EventDispatcher
|
8
7
|
|
9
8
|
attr_reader :id, :uuid, :type
|
@@ -136,6 +135,10 @@ module Mittsu
|
|
136
135
|
dispatch_event type: :dispose
|
137
136
|
end
|
138
137
|
|
138
|
+
def implementation(renderer)
|
139
|
+
@_implementation ||= renderer.create_implementation(self)
|
140
|
+
end
|
141
|
+
|
139
142
|
private
|
140
143
|
|
141
144
|
def has_property?(key)
|
@@ -109,14 +109,5 @@ module Mittsu
|
|
109
109
|
|
110
110
|
material
|
111
111
|
end
|
112
|
-
|
113
|
-
def to_json
|
114
|
-
output = super
|
115
|
-
output[:color] = @color.hex
|
116
|
-
output[:vertex_colors] = @vertex_colors unless @vertex_colors == NoColors
|
117
|
-
output[:blending] = @blending unless @blending == NormalBlending
|
118
|
-
output[:side] = @side unless @side == FrontSide
|
119
|
-
output
|
120
|
-
end
|
121
112
|
end
|
122
113
|
end
|
data/lib/mittsu/math/color.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'mittsu/math'
|
2
|
+
require 'mittsu/math/vector3'
|
2
3
|
|
3
4
|
module Mittsu
|
4
|
-
class Color
|
5
|
-
|
5
|
+
class Color < Vector3
|
6
|
+
ELEMENTS = { r: 0, g: 1, b: 2 }
|
7
|
+
DIMENSIONS = ELEMENTS.count
|
6
8
|
|
7
9
|
def initialize(*args)
|
10
|
+
super(0, 0, 0)
|
8
11
|
case args.length
|
9
12
|
when 3 then self.set_rgb(*args)
|
10
13
|
when 1 then self.set(args.first)
|
@@ -13,6 +16,14 @@ module Mittsu
|
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
19
|
+
alias :r :x
|
20
|
+
alias :g :y
|
21
|
+
alias :b :z
|
22
|
+
|
23
|
+
alias :r= :x=
|
24
|
+
alias :g= :y=
|
25
|
+
alias :b= :z=
|
26
|
+
|
16
27
|
def set(value)
|
17
28
|
case value
|
18
29
|
when Color
|
@@ -29,29 +40,27 @@ module Mittsu
|
|
29
40
|
|
30
41
|
def set_hex(hex)
|
31
42
|
hex = hex.floor
|
32
|
-
|
33
|
-
|
34
|
-
|
43
|
+
self.r = (hex >> 16 & 255) / 255.0
|
44
|
+
self.g = (hex >> 8 & 255) / 255.0
|
45
|
+
self.b = (hex & 255) / 255.0
|
35
46
|
self
|
36
47
|
end
|
37
48
|
|
38
49
|
def set_rgb(r, g, b)
|
39
|
-
@
|
40
|
-
@g = g.to_f
|
41
|
-
@b = b.to_f
|
50
|
+
@elements = [r.to_f, g.to_f, b.to_f]
|
42
51
|
self
|
43
52
|
end
|
44
53
|
|
45
54
|
def set_hsl(h, s, l)
|
46
55
|
# h,s,l ranges are in 0.0 - 1.0
|
47
56
|
if s.zero?
|
48
|
-
|
57
|
+
self.r = self.g = self.b = l
|
49
58
|
else
|
50
59
|
p = l <= 0.5 ? l * (1.0 + s) : l + s - (l * s)
|
51
60
|
q = (2.0 * l) - p
|
52
|
-
|
53
|
-
|
54
|
-
|
61
|
+
self.r = hue2rgb(q, p, h + 1.0 / 3.0)
|
62
|
+
self.g = hue2rgb(q, p, h)
|
63
|
+
self.b = hue2rgb(q, p, h - 1.0 / 3.0)
|
55
64
|
end
|
56
65
|
self
|
57
66
|
end
|
@@ -59,16 +68,16 @@ module Mittsu
|
|
59
68
|
def set_style(style)
|
60
69
|
# rgb(255,0,0)
|
61
70
|
if /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i =~ style
|
62
|
-
|
63
|
-
|
64
|
-
|
71
|
+
self.r = [255.0, $1.to_f].min / 255.0
|
72
|
+
self.g = [255.0, $2.to_f].min / 255.0
|
73
|
+
self.b = [255.0, $3.to_f].min / 255.0
|
65
74
|
return self
|
66
75
|
end
|
67
76
|
# rgb(100%,0%,0%)
|
68
77
|
if /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i =~ style
|
69
|
-
|
70
|
-
|
71
|
-
|
78
|
+
self.r = [100.0, $1.to_f].min / 100.0
|
79
|
+
self.g = [100.0, $2.to_f].min / 100.0
|
80
|
+
self.b = [100.0, $3.to_f].min / 100.0
|
72
81
|
return self
|
73
82
|
end
|
74
83
|
# #ff0000
|
@@ -88,45 +97,38 @@ module Mittsu
|
|
88
97
|
end
|
89
98
|
end
|
90
99
|
|
91
|
-
def copy(color)
|
92
|
-
@r = color.r
|
93
|
-
@g = color.g
|
94
|
-
@b = color.b
|
95
|
-
self
|
96
|
-
end
|
97
|
-
|
98
100
|
def copy_gamma_to_linear(color, gamma_factor = 2.0)
|
99
|
-
|
100
|
-
|
101
|
-
|
101
|
+
self.r = color.r ** gamma_factor
|
102
|
+
self.g = color.g ** gamma_factor
|
103
|
+
self.b = color.b ** gamma_factor
|
102
104
|
self
|
103
105
|
end
|
104
106
|
|
105
107
|
def copy_linear_to_gamma(color, gamma_factor = 2.0)
|
106
108
|
safe_inverse = (gamma_factor > 0) ? (1.0 / gamma_factor) : 1.0
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
self.r = color.r ** safe_inverse
|
110
|
+
self.g = color.g ** safe_inverse
|
111
|
+
self.b = color.b ** safe_inverse
|
110
112
|
self
|
111
113
|
end
|
112
114
|
|
113
115
|
def convert_gamma_to_linear
|
114
|
-
rr, gg, bb =
|
115
|
-
|
116
|
-
|
117
|
-
|
116
|
+
rr, gg, bb = self.r, self.g, self.b
|
117
|
+
self.r = rr * rr
|
118
|
+
self.g = gg * gg
|
119
|
+
self.b = bb * bb
|
118
120
|
self
|
119
121
|
end
|
120
122
|
|
121
123
|
def convert_linear_to_gamma
|
122
|
-
|
123
|
-
|
124
|
-
|
124
|
+
self.r = Math.sqrt(self.r)
|
125
|
+
self.g = Math.sqrt(self.g)
|
126
|
+
self.b = Math.sqrt(self.b)
|
125
127
|
self
|
126
128
|
end
|
127
129
|
|
128
130
|
def hex
|
129
|
-
(
|
131
|
+
(self.r * 255).to_i << 16 ^ (self.g * 255).to_i << 8 ^ (self.b * 255).to_i << 0
|
130
132
|
end
|
131
133
|
|
132
134
|
def hex_string
|
@@ -136,7 +138,7 @@ module Mittsu
|
|
136
138
|
def hsl(target = nil)
|
137
139
|
# h,s,l ranges are in 0.0 - 1.0
|
138
140
|
hsl = target || { h: 0.0, s: 0.0, l: 0.0 }
|
139
|
-
rr, gg, bb =
|
141
|
+
rr, gg, bb = self.r, self.g, self.b
|
140
142
|
max = [r, g, b].max
|
141
143
|
min = [r, g, b].min
|
142
144
|
hue, saturation = nil, nil
|
@@ -161,7 +163,7 @@ module Mittsu
|
|
161
163
|
end
|
162
164
|
|
163
165
|
def style
|
164
|
-
"rgb(#{ (
|
166
|
+
"rgb(#{ (self.r * 255).to_i },#{ (self.g * 255).to_i },#{ (self.b * 255).to_i })"
|
165
167
|
end
|
166
168
|
|
167
169
|
def offset_hsl(h, s, l)
|
@@ -173,69 +175,7 @@ module Mittsu
|
|
173
175
|
self
|
174
176
|
end
|
175
177
|
|
176
|
-
|
177
|
-
@r += color.r
|
178
|
-
@g += color.g
|
179
|
-
@b += color.b
|
180
|
-
self
|
181
|
-
end
|
182
|
-
|
183
|
-
def add_colors(color1, color2)
|
184
|
-
@r = color1.r + color2.r
|
185
|
-
@g = color1.g + color2.g
|
186
|
-
@b = color1.b + color2.b
|
187
|
-
self
|
188
|
-
end
|
189
|
-
|
190
|
-
def add_scalar(s)
|
191
|
-
@r += s
|
192
|
-
@g += s
|
193
|
-
@b += s
|
194
|
-
self
|
195
|
-
end
|
196
|
-
|
197
|
-
def multiply(color)
|
198
|
-
@r *= color.r
|
199
|
-
@g *= color.g
|
200
|
-
@b *= color.b
|
201
|
-
self
|
202
|
-
end
|
203
|
-
|
204
|
-
def multiply_scalar(s)
|
205
|
-
@r *= s
|
206
|
-
@g *= s
|
207
|
-
@b *= s
|
208
|
-
self
|
209
|
-
end
|
210
|
-
|
211
|
-
def lerp(color, alpha)
|
212
|
-
@r += (color.r - @r) * alpha
|
213
|
-
@g += (color.g - @g) * alpha
|
214
|
-
@b += (color.b - @b) * alpha
|
215
|
-
self
|
216
|
-
end
|
217
|
-
|
218
|
-
def equals(c)
|
219
|
-
(c.r == @r) && (c.g == @g) && (c.b == @b)
|
220
|
-
end
|
221
|
-
|
222
|
-
def from_array(array)
|
223
|
-
@r = array[0]
|
224
|
-
@g = array[1]
|
225
|
-
@b = array[2]
|
226
|
-
self
|
227
|
-
end
|
228
|
-
|
229
|
-
def to_array(array = [], offset = 0)
|
230
|
-
array[offset] = @r
|
231
|
-
array[offset + 1] = @g
|
232
|
-
array[offset + 2] = @b
|
233
|
-
array
|
234
|
-
end
|
235
|
-
|
236
|
-
def clone
|
237
|
-
Mittsu::Color.new(@r, @g, @b)
|
238
|
-
end
|
178
|
+
alias :add_colors :add_vectors
|
239
179
|
|
240
180
|
private
|
241
181
|
|