mittsu 0.1.1 → 0.1.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/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
|
|