mittsu 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +3 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +7 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/examples/01_-_Default1noCulling.png +0 -0
- data/examples/01_scene_example.rb +14 -0
- data/examples/02_box_mesh_example.rb +30 -0
- data/examples/02_sphere_mesh_example.rb +30 -0
- data/examples/03_complex_object_example.rb +52 -0
- data/examples/04_ambient_light_example.rb +33 -0
- data/examples/04_dir_light_example.rb +36 -0
- data/examples/04_hemi_light_example.rb +30 -0
- data/examples/04_point_light_example.rb +50 -0
- data/examples/04_spot_light_example.rb +44 -0
- data/examples/05_earth_example.rb +42 -0
- data/examples/05_earth_moon_example.rb +46 -0
- data/examples/05_texture_example.rb +32 -0
- data/examples/06_cube_texture_example.rb +36 -0
- data/examples/06_skybox_example.rb +60 -0
- data/examples/07_earth_normal_example.rb +36 -0
- data/examples/08_shadow_example.rb +87 -0
- data/examples/09_line_example.rb +52 -0
- data/examples/10_obj_loader_example.rb +68 -0
- data/examples/11_character_input_example.rb +18 -0
- data/examples/11_continuous_keyboard_input_example.rb +35 -0
- data/examples/11_keyboard_input_example.rb +43 -0
- data/examples/12_mouse_click_example.rb +38 -0
- data/examples/12_mouse_motion_example.rb +35 -0
- data/examples/12_mouse_scroll_example.rb +36 -0
- data/examples/12_orbit_zoom_example.rb +68 -0
- data/examples/13_joystick_example.rb +80 -0
- data/examples/cubemap/tron_bk.png +0 -0
- data/examples/cubemap/tron_dn.png +0 -0
- data/examples/cubemap/tron_ft.png +0 -0
- data/examples/cubemap/tron_lf.png +0 -0
- data/examples/cubemap/tron_rt.png +0 -0
- data/examples/cubemap/tron_up.png +0 -0
- data/examples/earth.png +0 -0
- data/examples/earth_normal.png +0 -0
- data/examples/example_helper.rb +2 -0
- data/examples/male-02-1noCulling.png +0 -0
- data/examples/male02.mtl +54 -0
- data/examples/male02.obj +13888 -0
- data/examples/moon.png +0 -0
- data/examples/orig_02_-_Defaul1noCulling.png +0 -0
- data/examples/texture.png +0 -0
- data/lib/mittsu.rb +15 -0
- data/lib/mittsu/cameras.rb +4 -0
- data/lib/mittsu/cameras/camera.rb +34 -0
- data/lib/mittsu/cameras/cube_camera.rb +74 -0
- data/lib/mittsu/cameras/orthographic_camera.rb +53 -0
- data/lib/mittsu/cameras/perspective_camera.rb +115 -0
- data/lib/mittsu/constants.rb +160 -0
- data/lib/mittsu/core.rb +10 -0
- data/lib/mittsu/core/buffer_attribute.rb +87 -0
- data/lib/mittsu/core/buffer_geometry.rb +694 -0
- data/lib/mittsu/core/clock.rb +44 -0
- data/lib/mittsu/core/dynamic_buffer_attribute.rb +16 -0
- data/lib/mittsu/core/event_dispatcher.rb +39 -0
- data/lib/mittsu/core/face3.rb +30 -0
- data/lib/mittsu/core/geometry.rb +596 -0
- data/lib/mittsu/core/hash_array.rb +36 -0
- data/lib/mittsu/core/hash_object.rb +19 -0
- data/lib/mittsu/core/object_3d.rb +421 -0
- data/lib/mittsu/core/raycaster.rb +78 -0
- data/lib/mittsu/extras.rb +3 -0
- data/lib/mittsu/extras/geometries.rb +2 -0
- data/lib/mittsu/extras/geometries/box_geometry.rb +108 -0
- data/lib/mittsu/extras/geometries/sphere_geometry.rb +88 -0
- data/lib/mittsu/extras/helpers.rb +1 -0
- data/lib/mittsu/extras/helpers/camera_helper.rb +155 -0
- data/lib/mittsu/extras/image.rb +3 -0
- data/lib/mittsu/extras/image_utils.rb +80 -0
- data/lib/mittsu/lights.rb +7 -0
- data/lib/mittsu/lights/ambient_light.rb +16 -0
- data/lib/mittsu/lights/area_light.rb +24 -0
- data/lib/mittsu/lights/directional_light.rb +131 -0
- data/lib/mittsu/lights/hemisphere_light.rb +29 -0
- data/lib/mittsu/lights/light.rb +21 -0
- data/lib/mittsu/lights/point_light.rb +27 -0
- data/lib/mittsu/lights/spot_light.rb +104 -0
- data/lib/mittsu/loaders.rb +7 -0
- data/lib/mittsu/loaders/cache.rb +53 -0
- data/lib/mittsu/loaders/file_loader.rb +22 -0
- data/lib/mittsu/loaders/image_loader.rb +32 -0
- data/lib/mittsu/loaders/loader.rb +212 -0
- data/lib/mittsu/loaders/loading_manager.rb +17 -0
- data/lib/mittsu/loaders/mtl_loader.rb +242 -0
- data/lib/mittsu/loaders/obj_mtl_loader.rb +225 -0
- data/lib/mittsu/materials.rb +7 -0
- data/lib/mittsu/materials/line_basic_material.rb +39 -0
- data/lib/mittsu/materials/material.rb +156 -0
- data/lib/mittsu/materials/mesh_basic_material.rb +122 -0
- data/lib/mittsu/materials/mesh_face_material.rb +30 -0
- data/lib/mittsu/materials/mesh_lambert_material.rb +126 -0
- data/lib/mittsu/materials/mesh_phong_material.rb +152 -0
- data/lib/mittsu/materials/shader_material.rb +108 -0
- data/lib/mittsu/math.rb +105 -0
- data/lib/mittsu/math/box2.rb +135 -0
- data/lib/mittsu/math/box3.rb +194 -0
- data/lib/mittsu/math/color.rb +252 -0
- data/lib/mittsu/math/color_keywords.rb +151 -0
- data/lib/mittsu/math/euler.rb +182 -0
- data/lib/mittsu/math/frustum.rb +106 -0
- data/lib/mittsu/math/line3.rb +76 -0
- data/lib/mittsu/math/matrix3.rb +163 -0
- data/lib/mittsu/math/matrix4.rb +581 -0
- data/lib/mittsu/math/plane.rb +128 -0
- data/lib/mittsu/math/quaternion.rb +309 -0
- data/lib/mittsu/math/ray.rb +292 -0
- data/lib/mittsu/math/sphere.rb +91 -0
- data/lib/mittsu/math/spline.rb +128 -0
- data/lib/mittsu/math/triangle.rb +121 -0
- data/lib/mittsu/math/vector2.rb +238 -0
- data/lib/mittsu/math/vector3.rb +491 -0
- data/lib/mittsu/math/vector4.rb +414 -0
- data/lib/mittsu/objects.rb +3 -0
- data/lib/mittsu/objects/group.rb +8 -0
- data/lib/mittsu/objects/line.rb +143 -0
- data/lib/mittsu/objects/mesh.rb +243 -0
- data/lib/mittsu/renderers.rb +1 -0
- data/lib/mittsu/renderers/glfw_window.rb +216 -0
- data/lib/mittsu/renderers/opengl/opengl_debug.rb +38 -0
- data/lib/mittsu/renderers/opengl/opengl_program.rb +402 -0
- data/lib/mittsu/renderers/opengl/opengl_shader.rb +58 -0
- data/lib/mittsu/renderers/opengl/opengl_state.rb +207 -0
- data/lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb +416 -0
- data/lib/mittsu/renderers/opengl_render_target.rb +87 -0
- data/lib/mittsu/renderers/opengl_renderer.rb +3376 -0
- data/lib/mittsu/renderers/shaders/shader_chunk.rb +12 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/alphamap_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/alphamap_pars_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/alphatest_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/bumpmap_pars_fragment.glsl +40 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/color_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/color_pars_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/color_pars_vertex.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/color_vertex.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/common.glsl +60 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/default_vertex.glsl +15 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/defaultnormal_vertex.glsl +21 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/envmap_fragment.glsl +62 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/envmap_pars_fragment.glsl +21 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/envmap_pars_vertex.glsl +7 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/envmap_vertex.glsl +17 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/fog_fragment.glsl +26 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/fog_pars_fragment.glsl +15 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_pars_fragment.glsl +6 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_pars_vertex.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_vertex.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lights_lambert_pars_vertex.glsl +43 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lights_lambert_vertex.glsl +196 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_fragment.glsl +243 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_pars_fragment.glsl +58 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_pars_vertex.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_vertex.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/linear_to_gamma_fragment.glsl +2 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_pars_fragment.glsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_pars_vertex.glsl +11 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_vertex.glsl +15 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/map_fragment.glsl +9 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/map_pars_fragment.glsl +11 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/map_pars_vertex.glsl +6 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/map_particle_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/map_particle_pars_fragment.glsl +6 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/map_vertex.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/morphnormal_vertex.glsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/morphtarget_pars_vertex.glsl +13 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/morphtarget_vertex.glsl +20 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/normalmap_pars_fragment.glsl +27 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_fragment.glsl +217 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_pars_fragment.glsl +19 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_pars_vertex.glsl +6 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_vertex.glsl +9 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/skinbase_vertex.glsl +8 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/skinning_pars_vertex.glsl +47 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/skinning_vertex.glsl +20 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/skinnormal_vertex.glsl +20 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/specularmap_fragment.glsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/specularmap_pars_fragment.glsl +5 -0
- data/lib/mittsu/renderers/shaders/shader_chunk/worldpos_vertex.glsl +17 -0
- data/lib/mittsu/renderers/shaders/shader_lib.rb +420 -0
- data/lib/mittsu/renderers/shaders/uniforms_lib.rb +107 -0
- data/lib/mittsu/renderers/shaders/uniforms_utils.rb +31 -0
- data/lib/mittsu/scenes.rb +1 -0
- data/lib/mittsu/scenes/scene.rb +27 -0
- data/lib/mittsu/textures.rb +5 -0
- data/lib/mittsu/textures/compressed_texture.rb +30 -0
- data/lib/mittsu/textures/cube_texture.rb +19 -0
- data/lib/mittsu/textures/data_texture.rb +17 -0
- data/lib/mittsu/textures/texture.rb +92 -0
- data/lib/mittsu/textures/video_texture.rb +17 -0
- data/lib/mittsu/version.rb +4 -0
- data/mittsu.gemspec +31 -0
- metadata +357 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'mittsu/math'
|
2
|
+
|
3
|
+
module Mittsu
|
4
|
+
class Box2
|
5
|
+
attr_accessor :min, :max
|
6
|
+
|
7
|
+
def initialize(min = nil, max = nil)
|
8
|
+
@min = min || Mittsu::Vector2.new(Float::INFINITY, Float::INFINITY)
|
9
|
+
@max = max || Mittsu::Vector2.new(-Float::INFINITY, -Float::INFINITY)
|
10
|
+
end
|
11
|
+
|
12
|
+
def set(min, max)
|
13
|
+
@min.copy(min)
|
14
|
+
@max.copy(max)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_from_points(points)
|
19
|
+
self.make_empty
|
20
|
+
points.each do |point|
|
21
|
+
self.expand_by_point(point)
|
22
|
+
end
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_from_center_and_size(center, size)
|
27
|
+
halfSize = size.clone.multiply_scalar(0.5)
|
28
|
+
@min.copy(center).sub(halfSize)
|
29
|
+
@max.copy(center).add(halfSize)
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def copy(box)
|
34
|
+
@min.copy(box.min)
|
35
|
+
@max.copy(box.max)
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def make_empty
|
40
|
+
@min.x = @min.y = Float::INFINITY
|
41
|
+
@max.x = @max.y = - Float::INFINITY
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def empty?
|
46
|
+
# this is a more robust check for empty than (volume <= 0) because volume can get positive with two negative axes
|
47
|
+
(@max.x < @min.x) || (@max.y < @min.y)
|
48
|
+
end
|
49
|
+
|
50
|
+
def center(target = Mittsu::Vector2.new)
|
51
|
+
target.add_vectors(@min, @max).multiply_scalar(0.5)
|
52
|
+
end
|
53
|
+
|
54
|
+
def size(target = Mittsu::Vector2.new)
|
55
|
+
target.sub_vectors(@max, @min)
|
56
|
+
end
|
57
|
+
|
58
|
+
def expand_by_point(point)
|
59
|
+
@min.min(point)
|
60
|
+
@max.max(point)
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
def expand_by_vector(vector)
|
65
|
+
@min.sub(vector)
|
66
|
+
@max.add(vector)
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
def expand_by_scalar(scalar)
|
71
|
+
@min.add_scalar(-scalar)
|
72
|
+
@max.add_scalar(scalar)
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
def contains_point?(point)
|
77
|
+
!(point.x < @min.x || point.x > @max.x || point.y < @min.y || point.y > @max.y)
|
78
|
+
end
|
79
|
+
|
80
|
+
def contains_box?(box)
|
81
|
+
((@min.x <= box.min.x) && (box.max.x <= @max.x) && (@min.y <= box.min.y) && (box.max.y <= @max.y))
|
82
|
+
end
|
83
|
+
|
84
|
+
def parameter(point, target = Mittsu::Vector2.new)
|
85
|
+
# This can potentially have a divide by zero if the box
|
86
|
+
# has a size dimension of 0.
|
87
|
+
target.set(
|
88
|
+
(point.x - @min.x) / (@max.x - @min.x),
|
89
|
+
(point.y - @min.y) / (@max.y - @min.y)
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
def intersection_box?(box)
|
94
|
+
# using 6 splitting planes to rule out intersections.
|
95
|
+
!(box.max.x < @min.x || box.min.x > @max.x || box.max.y < @min.y || box.min.y > @max.y)
|
96
|
+
end
|
97
|
+
|
98
|
+
def clamp_point(point, target = nil)
|
99
|
+
result = target || Mittsu::Vector2.new
|
100
|
+
result.copy(point).clamp(@min, @max)
|
101
|
+
end
|
102
|
+
|
103
|
+
def distance_to_point(point)
|
104
|
+
clampedPoint = point.clone.clamp(@min, @max)
|
105
|
+
clampedPoint.sub(point).length
|
106
|
+
end
|
107
|
+
|
108
|
+
def intersect(box)
|
109
|
+
@min.max(box.min)
|
110
|
+
@max.min(box.max)
|
111
|
+
self
|
112
|
+
end
|
113
|
+
|
114
|
+
def union(box)
|
115
|
+
@min.min(box.min)
|
116
|
+
@max.max(box.max)
|
117
|
+
self
|
118
|
+
end
|
119
|
+
|
120
|
+
def translate(offset)
|
121
|
+
@min.add(offset)
|
122
|
+
@max.add(offset)
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
126
|
+
def ==(box)
|
127
|
+
box.min == @min && box.max == @max
|
128
|
+
end
|
129
|
+
|
130
|
+
def clone
|
131
|
+
Mittsu::Box2.new.copy(self)
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'mittsu/math'
|
2
|
+
|
3
|
+
module Mittsu
|
4
|
+
class Box3
|
5
|
+
attr_accessor :min, :max
|
6
|
+
|
7
|
+
def initialize(min = nil, max = nil)
|
8
|
+
@min = min || Mittsu::Vector3.new(Float::INFINITY, Float::INFINITY, Float::INFINITY)
|
9
|
+
@max = max || Mittsu::Vector3.new(-Float::INFINITY, -Float::INFINITY, -Float::INFINITY)
|
10
|
+
end
|
11
|
+
|
12
|
+
def set(min, max)
|
13
|
+
@min.copy(min)
|
14
|
+
@max.copy(max)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_from_points(points)
|
19
|
+
self.make_empty
|
20
|
+
points.each do |point|
|
21
|
+
self.expand_by_point(point)
|
22
|
+
end
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_from_center_and_size(center, size)
|
27
|
+
halfSize = size.clone.multiply_scalar(0.5)
|
28
|
+
@min.copy(center).sub(halfSize)
|
29
|
+
@max.copy(center).add(halfSize)
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_from_object(object)
|
34
|
+
# Computes the world-axis-aligned bounding box of an object (including its children),
|
35
|
+
# accounting for both the object's, and childrens', world transforms
|
36
|
+
v1 = Mittsu::Vector3.new
|
37
|
+
scope = self
|
38
|
+
object.update_matrix_world(true)
|
39
|
+
self.make_empty
|
40
|
+
object.traverse do |node|
|
41
|
+
geometry = node.geometry
|
42
|
+
if geometry != nil
|
43
|
+
if geometry instanceof Mittsu::Geometry
|
44
|
+
vertices = geometry.vertices
|
45
|
+
vertices.each do |vertex|
|
46
|
+
v1.copy(vertex)
|
47
|
+
v1.apply_matrix4(node.matrixWorld)
|
48
|
+
scope.expand_by_point(v1)
|
49
|
+
end
|
50
|
+
elsif geometry instanceof Mittsu::BufferGeometry && geometry.attributes['position'] != nil
|
51
|
+
positions = geometry.attributes['position'].array
|
52
|
+
positions.each_slice(3) do |postition|
|
53
|
+
v1.set(position[0], position[1], position[2])
|
54
|
+
v1.apply_matrix4(node.matrixWorld)
|
55
|
+
scope.expand_by_point(v1)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
return self
|
61
|
+
end
|
62
|
+
|
63
|
+
def copy(box)
|
64
|
+
@min.copy(box.min)
|
65
|
+
@max.copy(box.max)
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def make_empty
|
70
|
+
@min.x = @min.y = @min.z = Float::INFINITY
|
71
|
+
@max.x = @max.y = @max.z = -Float::INFINITY
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def empty?
|
76
|
+
# self is a more robust check for empty than (volume <= 0) because volume can get positive with two negative axes
|
77
|
+
(@max.x < @min.x) || (@max.y < @min.y) || (@max.z < @min.z)
|
78
|
+
end
|
79
|
+
|
80
|
+
def center(target = Mittsu::Vector3.new)
|
81
|
+
target.add_vectors(@min, @max).multiply_scalar(0.5)
|
82
|
+
end
|
83
|
+
|
84
|
+
def size(target = Mittsu::Vector3.new)
|
85
|
+
target.sub_vectors(@max, @min)
|
86
|
+
end
|
87
|
+
|
88
|
+
def expand_by_point(point)
|
89
|
+
@min.min(point)
|
90
|
+
@max.max(point)
|
91
|
+
self
|
92
|
+
end
|
93
|
+
|
94
|
+
def expand_by_vector(vector)
|
95
|
+
@min.sub(vector)
|
96
|
+
@max.add(vector)
|
97
|
+
self
|
98
|
+
end
|
99
|
+
|
100
|
+
def expand_by_scalar(scalar)
|
101
|
+
@min.add_scalar(-scalar)
|
102
|
+
@max.add_scalar(scalar)
|
103
|
+
self
|
104
|
+
end
|
105
|
+
|
106
|
+
def contains_point?(point)
|
107
|
+
!(point.x < @min.x || point.x > @max.x ||
|
108
|
+
point.y < @min.y || point.y > @max.y ||
|
109
|
+
point.z < @min.z || point.z > @max.z)
|
110
|
+
end
|
111
|
+
|
112
|
+
def contains_box?(box)
|
113
|
+
((@min.x <= box.min.x) && (box.max.x <= @max.x) &&
|
114
|
+
(@min.y <= box.min.y) && (box.max.y <= @max.y) &&
|
115
|
+
(@min.z <= box.min.z) && (box.max.z <= @max.z))
|
116
|
+
end
|
117
|
+
|
118
|
+
def parameter(point, target = nil)
|
119
|
+
# This can potentially have a divide by zero if the box
|
120
|
+
# has a size dimension of 0.
|
121
|
+
result = target || Mittsu::Vector3.new
|
122
|
+
result.set(
|
123
|
+
(point.x - @min.x) / (@max.x - @min.x),
|
124
|
+
(point.y - @min.y) / (@max.y - @min.y),
|
125
|
+
(point.z - @min.z) / (@max.z - @min.z)
|
126
|
+
)
|
127
|
+
end
|
128
|
+
|
129
|
+
def intersection_box?(box)
|
130
|
+
# using 6 splitting planes to rule out intersections.
|
131
|
+
!(box.max.x < @min.x || box.min.x > @max.x ||
|
132
|
+
box.max.y < @min.y || box.min.y > @max.y ||
|
133
|
+
box.max.z < @min.z || box.min.z > @max.z)
|
134
|
+
end
|
135
|
+
|
136
|
+
def clamp_point(point, target = Mittsu::Vector3.new)
|
137
|
+
target.copy(point).clamp(@min, @max)
|
138
|
+
end
|
139
|
+
|
140
|
+
def distance_to_point(point, target = Mittsu::Vector3.new)
|
141
|
+
target.copy(point).clamp(@min, @max).sub(point).length
|
142
|
+
end
|
143
|
+
|
144
|
+
def bounding_sphere(target = Mittsu::Sphere.new)
|
145
|
+
target.center = self.center
|
146
|
+
target.radius = self.size().length * 0.5
|
147
|
+
target
|
148
|
+
end
|
149
|
+
|
150
|
+
def intersect(box)
|
151
|
+
@min.max(box.min)
|
152
|
+
@max.min(box.max)
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
def union(box)
|
157
|
+
@min.min(box.min)
|
158
|
+
@max.max(box.max)
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
162
|
+
def apply_matrix4(matrix)
|
163
|
+
points = [
|
164
|
+
# NOTE: I am using a binary pattern to specify all 2^3 combinations below
|
165
|
+
Mittsu::Vector3.new(@min.x, @min.y, @min.z).apply_matrix4(matrix), # 000
|
166
|
+
Mittsu::Vector3.new(@min.x, @min.y, @max.z).apply_matrix4(matrix), # 001
|
167
|
+
Mittsu::Vector3.new(@min.x, @max.y, @min.z).apply_matrix4(matrix), # 010
|
168
|
+
Mittsu::Vector3.new(@min.x, @max.y, @max.z).apply_matrix4(matrix), # 011
|
169
|
+
Mittsu::Vector3.new(@max.x, @min.y, @min.z).apply_matrix4(matrix), # 100
|
170
|
+
Mittsu::Vector3.new(@max.x, @min.y, @max.z).apply_matrix4(matrix), # 101
|
171
|
+
Mittsu::Vector3.new(@max.x, @max.y, @min.z).apply_matrix4(matrix), # 110
|
172
|
+
Mittsu::Vector3.new(@max.x, @max.y, @max.z).apply_matrix4(matrix) # 111
|
173
|
+
]
|
174
|
+
self.make_empty
|
175
|
+
self.set_from_points(points)
|
176
|
+
self
|
177
|
+
end
|
178
|
+
|
179
|
+
def translate(offset)
|
180
|
+
@min.add(offset)
|
181
|
+
@max.add(offset)
|
182
|
+
self
|
183
|
+
end
|
184
|
+
|
185
|
+
def ==(box)
|
186
|
+
box.min == @min && box.max == @max
|
187
|
+
end
|
188
|
+
|
189
|
+
def clone
|
190
|
+
Mittsu::Box3.new.copy(self)
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,252 @@
|
|
1
|
+
require 'mittsu/math'
|
2
|
+
|
3
|
+
module Mittsu
|
4
|
+
class Color
|
5
|
+
attr_accessor :r, :g, :b
|
6
|
+
|
7
|
+
def initialize(*args)
|
8
|
+
case args.length
|
9
|
+
when 3 then self.set_rgb(*args)
|
10
|
+
when 1 then self.set(args.first)
|
11
|
+
when 0 then self.set_rgb(1.0, 1.0, 1.0)
|
12
|
+
else raise ArgumentError, "Arguments must be (r, g, b), (color), or none"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def set(value)
|
17
|
+
case value
|
18
|
+
when Color
|
19
|
+
self.copy(value)
|
20
|
+
when Fixnum
|
21
|
+
self.set_hex(value)
|
22
|
+
when String
|
23
|
+
self.set_style(value)
|
24
|
+
else
|
25
|
+
raise ArgumentError, "Arguments must be Color, Fixnum or String"
|
26
|
+
end
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_hex(hex)
|
31
|
+
hex = hex.floor
|
32
|
+
@r = (hex >> 16 & 255) / 255.0
|
33
|
+
@g = (hex >> 8 & 255) / 255.0
|
34
|
+
@b = (hex & 255) / 255.0
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_rgb(r, g, b)
|
39
|
+
@r = r.to_f
|
40
|
+
@g = g.to_f
|
41
|
+
@b = b.to_f
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def set_hsl(h, s, l)
|
46
|
+
# h,s,l ranges are in 0.0 - 1.0
|
47
|
+
if s.zero?
|
48
|
+
@r = @g = @b = l
|
49
|
+
else
|
50
|
+
p = l <= 0.5 ? l * (1.0 + s) : l + s - (l * s)
|
51
|
+
q = (2.0 * l) - p
|
52
|
+
@r = hue2rgb(q, p, h + 1.0 / 3.0)
|
53
|
+
@g = hue2rgb(q, p, h)
|
54
|
+
@b = hue2rgb(q, p, h - 1.0 / 3.0)
|
55
|
+
end
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_style(style)
|
60
|
+
# rgb(255,0,0)
|
61
|
+
if /^rgb\((\d+), ?(\d+), ?(\d+)\)$/i =~ style
|
62
|
+
@r = [255.0, $1.to_f].min / 255.0
|
63
|
+
@g = [255.0, $2.to_f].min / 255.0
|
64
|
+
@b = [255.0, $3.to_f].min / 255.0
|
65
|
+
return self
|
66
|
+
end
|
67
|
+
# rgb(100%,0%,0%)
|
68
|
+
if /^rgb\((\d+)\%, ?(\d+)\%, ?(\d+)\%\)$/i =~ style
|
69
|
+
@r = [100.0, $1.to_f].min / 100.0
|
70
|
+
@g = [100.0, $2.to_f].min / 100.0
|
71
|
+
@b = [100.0, $3.to_f].min / 100.0
|
72
|
+
return self
|
73
|
+
end
|
74
|
+
# #ff0000
|
75
|
+
if /^\#([0-9a-f]{6})$/i =~ style
|
76
|
+
self.set_hex($1.hex)
|
77
|
+
return self
|
78
|
+
end
|
79
|
+
# #f00
|
80
|
+
if /^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i =~ style
|
81
|
+
self.set_hex(($1 + $1 + $2 + $2 + $3 + $3).hex)
|
82
|
+
return self
|
83
|
+
end
|
84
|
+
# red
|
85
|
+
if /^(\w+)$/i =~ style
|
86
|
+
self.set_hex(Mittsu::ColorKeywords[style])
|
87
|
+
return self
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def copy(color)
|
92
|
+
@r = color.r
|
93
|
+
@g = color.g
|
94
|
+
@b = color.b
|
95
|
+
self
|
96
|
+
end
|
97
|
+
|
98
|
+
def copy_gamma_to_linear(color, gamma_factor = 2.0)
|
99
|
+
@r = color.r ** gamma_factor
|
100
|
+
@g = color.g ** gamma_factor
|
101
|
+
@b = color.b ** gamma_factor
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
def copy_linear_to_gamma(color, gamma_factor = 2.0)
|
106
|
+
safe_inverse = (gamma_factor > 0) ? (1.0 / gamma_factor) : 1.0
|
107
|
+
@r = color.r ** safe_inverse
|
108
|
+
@g = color.g ** safe_inverse
|
109
|
+
@b = color.b ** safe_inverse
|
110
|
+
self
|
111
|
+
end
|
112
|
+
|
113
|
+
def convert_gamma_to_linear
|
114
|
+
rr, gg, bb = @r, @g, @b
|
115
|
+
@r = rr * rr
|
116
|
+
@g = gg * gg
|
117
|
+
@b = bb * bb
|
118
|
+
self
|
119
|
+
end
|
120
|
+
|
121
|
+
def convert_linear_to_gamma
|
122
|
+
@r = Math.sqrt(@r)
|
123
|
+
@g = Math.sqrt(@g)
|
124
|
+
@b = Math.sqrt(@b)
|
125
|
+
self
|
126
|
+
end
|
127
|
+
|
128
|
+
def hex
|
129
|
+
(@r * 255).to_i << 16 ^ (@g * 255).to_i << 8 ^ (@b * 255).to_i << 0
|
130
|
+
end
|
131
|
+
|
132
|
+
def hex_string
|
133
|
+
('000000' + self.hex.to_s(16))[-6..-1]
|
134
|
+
end
|
135
|
+
|
136
|
+
def hsl(target = nil)
|
137
|
+
# h,s,l ranges are in 0.0 - 1.0
|
138
|
+
hsl = target || { h: 0.0, s: 0.0, l: 0.0 }
|
139
|
+
rr, gg, bb = @r, @g, @b
|
140
|
+
max = [r, g, b].max
|
141
|
+
min = [r, g, b].min
|
142
|
+
hue, saturation = nil, nil
|
143
|
+
lightness = (min + max) / 2.0
|
144
|
+
if min == max
|
145
|
+
hue = 0.0
|
146
|
+
saturation = 0.0
|
147
|
+
else
|
148
|
+
delta = max - min
|
149
|
+
saturation = lightness <= 0.5 ? delta / (max + min) : delta / (2.0 - max - min)
|
150
|
+
case max
|
151
|
+
when rr then hue = (gg - bb) / delta + (gg < bb ? 6.0 : 0.0)
|
152
|
+
when gg then hue = (bb - rr) / delta + 2.0
|
153
|
+
when bb then hue = (rr - gg) / delta + 4.0
|
154
|
+
end
|
155
|
+
hue /= 6.0
|
156
|
+
end
|
157
|
+
hsl[:h] = hue
|
158
|
+
hsl[:s] = saturation
|
159
|
+
hsl[:l] = lightness
|
160
|
+
hsl
|
161
|
+
end
|
162
|
+
|
163
|
+
def style
|
164
|
+
"rgb(#{ (@r * 255).to_i },#{ (@g * 255).to_i },#{ (@b * 255).to_i })"
|
165
|
+
end
|
166
|
+
|
167
|
+
def offset_hsl(h, s, l)
|
168
|
+
hsl = self.hsl
|
169
|
+
hsl[:h] += h
|
170
|
+
hsl[:s] += s
|
171
|
+
hsl[:l] += l
|
172
|
+
self.set_hsl(hsl[:h], hsl[:s], hsl[:l])
|
173
|
+
self
|
174
|
+
end
|
175
|
+
|
176
|
+
def add(color)
|
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
|
239
|
+
|
240
|
+
private
|
241
|
+
|
242
|
+
def hue2rgb(p, q, t)
|
243
|
+
t += 1.0 if t < 0.0
|
244
|
+
t -= 1.0 if t > 1.0
|
245
|
+
return p + (q - p) * 6.0 * t if t < 1.0 / 6.0
|
246
|
+
return q if t < 1.0 / 2.0
|
247
|
+
return p + (q - p) * 6.0 * (2.0 / 3.0 - t) if t < 2.0 / 3.0
|
248
|
+
p
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
252
|
+
end
|