mittsu 0.3.1 → 0.4.0
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/.github/workflows/build-workflow.yml +71 -0
- data/.gitignore +1 -0
- data/Gemfile +0 -3
- data/LICENSE.txt +1 -1
- data/README.md +6 -8
- data/Rakefile +1 -0
- data/install-glfw.ps1 +13 -0
- data/lib/mittsu/cameras/camera.rb +0 -2
- data/lib/mittsu/cameras/cube_camera.rb +0 -2
- data/lib/mittsu/cameras/orthographic_camera.rb +2 -4
- data/lib/mittsu/cameras/perspective_camera.rb +4 -5
- data/lib/mittsu/core/buffer_attribute.rb +12 -0
- data/lib/mittsu/core/buffer_geometry.rb +3 -3
- data/lib/mittsu/core/geometry.rb +2 -4
- data/lib/mittsu/core/object_3d.rb +9 -7
- data/lib/mittsu/core/raycaster.rb +0 -2
- data/lib/mittsu/extras/geometries/circle_geometry.rb +3 -3
- data/lib/mittsu/extras/geometries/cylinder_geometry.rb +5 -5
- data/lib/mittsu/extras/geometries/dodecahedron_geometry.rb +2 -2
- data/lib/mittsu/extras/geometries/icosahedron_geometry.rb +2 -2
- data/lib/mittsu/extras/geometries/lathe_geometry.rb +3 -3
- data/lib/mittsu/extras/geometries/parametric_geometry.rb +19 -19
- data/lib/mittsu/extras/geometries/polyhedron_geometry.rb +6 -7
- data/lib/mittsu/extras/geometries/ring_geometry.rb +4 -4
- data/lib/mittsu/extras/geometries/sphere_geometry.rb +4 -4
- data/lib/mittsu/extras/geometries/torus_geometry.rb +7 -7
- data/lib/mittsu/extras/geometries/torus_knot_buffer_geometry.rb +9 -9
- data/lib/mittsu/extras/helpers/camera_helper.rb +38 -38
- data/lib/mittsu/extras/image_utils.rb +1 -1
- data/lib/mittsu/lights/directional_light.rb +9 -5
- data/lib/mittsu/lights/spot_light.rb +1 -1
- data/lib/mittsu/loaders/loader.rb +2 -2
- data/lib/mittsu/loaders/obj_loader.rb +4 -0
- data/lib/mittsu/materials/material.rb +6 -3
- data/lib/mittsu/math/box2.rb +0 -2
- data/lib/mittsu/math/box3.rb +0 -2
- data/lib/mittsu/math/color.rb +3 -4
- data/lib/mittsu/math/euler.rb +25 -26
- data/lib/mittsu/math/frustum.rb +0 -2
- data/lib/mittsu/math/line3.rb +0 -2
- data/lib/mittsu/math/matrix3.rb +0 -2
- data/lib/mittsu/math/matrix4.rb +10 -12
- data/lib/mittsu/math/plane.rb +0 -2
- data/lib/mittsu/math/quaternion.rb +18 -20
- data/lib/mittsu/math/ray.rb +1 -3
- data/lib/mittsu/math/sphere.rb +1 -3
- data/lib/mittsu/math/spline.rb +0 -2
- data/lib/mittsu/math/triangle.rb +1 -3
- data/lib/mittsu/math/vector.rb +3 -3
- data/lib/mittsu/math/vector2.rb +0 -1
- data/lib/mittsu/math/vector3.rb +108 -1
- data/lib/mittsu/math/vector4.rb +8 -9
- data/lib/mittsu/math.rb +0 -5
- data/lib/mittsu/objects/line.rb +0 -1
- data/lib/mittsu/renderers/glfw_lib.rb +24 -3
- data/lib/mittsu/renderers/glfw_window.rb +6 -2
- data/lib/mittsu/renderers/opengl/core/object_3d.rb +1 -1
- data/lib/mittsu/renderers/opengl/lights/spot_light.rb +1 -1
- data/lib/mittsu/renderers/opengl/opengl_geometry_group.rb +1 -0
- data/lib/mittsu/renderers/opengl/opengl_program.rb +1 -2
- data/lib/mittsu/renderers/opengl/textures/texture.rb +2 -2
- data/lib/mittsu/renderers/opengl_renderer.rb +9 -14
- data/lib/mittsu/scenes/scene.rb +0 -2
- data/lib/mittsu/textures/texture.rb +4 -2
- data/lib/mittsu/utils.rb +15 -0
- data/lib/mittsu/version.rb +1 -2
- data/lib/mittsu.rb +1 -16
- data/mittsu.gemspec +14 -13
- metadata +60 -47
- data/.circleci/config.yml +0 -87
- data/.circleci/images/primary/Dockerfile +0 -10
- data/appveyor.yml +0 -23
- data/install_glfw.ps1 +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3a8c66b2c63737be22e4495e20bc62888391dc63907e604d31eb8cbbf5fa432
|
4
|
+
data.tar.gz: f88e54369ac3e9c2b0534135f485310469d5dd37889504cf049eb23223cf0f2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea2ee4ab085e40061f432ed835f8f40948557467f85f33b7b4238a2d18cc4756ac43bb052d6631e4d8707f62d1ebce382cf5790727c28b257b73f71a08446458
|
7
|
+
data.tar.gz: fb77a518a9002b201a52590be84e13b9b57c1716b2e13d5c38b0d81265c6c26d8e440fb700d92e3759f8bfbd5323435c28dd780497da133fba4a09023800b3fd
|
@@ -0,0 +1,71 @@
|
|
1
|
+
name: Build
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches:
|
5
|
+
- main
|
6
|
+
pull_request:
|
7
|
+
branches:
|
8
|
+
- main
|
9
|
+
|
10
|
+
jobs:
|
11
|
+
linux:
|
12
|
+
name: Linux
|
13
|
+
runs-on: ubuntu-latest
|
14
|
+
strategy:
|
15
|
+
matrix:
|
16
|
+
ruby: ['2.6', '2.7', '3.0', '3.1', 'head']
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v1
|
19
|
+
- uses: ruby/setup-ruby@v1
|
20
|
+
with:
|
21
|
+
ruby-version: ${{ matrix.ruby }}
|
22
|
+
bundler-cache: true
|
23
|
+
- run: sudo apt-get update; sudo apt-get install cmake xorg-dev libgl1-mesa-dev
|
24
|
+
- run: bash install-glfw.sh
|
25
|
+
- run: gem install bundler
|
26
|
+
- run: bundle install --path vendor/bundle
|
27
|
+
- name: Test & publish code coverage
|
28
|
+
uses: paambaati/codeclimate-action@v2.2.1
|
29
|
+
if: github.event_name == 'push'
|
30
|
+
env:
|
31
|
+
CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
|
32
|
+
with:
|
33
|
+
coverageCommand: bundle exec rake test
|
34
|
+
- name: Test
|
35
|
+
if: github.event_name != 'push'
|
36
|
+
run: bundle exec rake test
|
37
|
+
|
38
|
+
macos:
|
39
|
+
name: macOS
|
40
|
+
runs-on: macos-latest
|
41
|
+
strategy:
|
42
|
+
matrix:
|
43
|
+
ruby: ['2.6', '2.7', '3.0', '3.1', 'head']
|
44
|
+
steps:
|
45
|
+
- uses: actions/checkout@v1
|
46
|
+
- uses: ruby/setup-ruby@v1
|
47
|
+
with:
|
48
|
+
ruby-version: ${{ matrix.ruby }}
|
49
|
+
bundler-cache: true
|
50
|
+
- run: brew install glfw
|
51
|
+
- run: bundle install --path vendor/bundle
|
52
|
+
- run: bundle exec rake test
|
53
|
+
|
54
|
+
windows:
|
55
|
+
name: Windows
|
56
|
+
runs-on: windows-latest
|
57
|
+
env:
|
58
|
+
MITTSU_LIBGLFW_PATH: c:\projects\mittsu\glfw-3.3.1.bin.WIN32\lib-mingw
|
59
|
+
strategy:
|
60
|
+
matrix:
|
61
|
+
ruby: ['2.6', '2.7', '3.0', '3.1', 'head']
|
62
|
+
steps:
|
63
|
+
- uses: actions/checkout@v1
|
64
|
+
- uses: ruby/setup-ruby@v1
|
65
|
+
with:
|
66
|
+
ruby-version: ${{ matrix.ruby }}
|
67
|
+
bundler-cache: true
|
68
|
+
- run: .\install-glfw.ps1
|
69
|
+
- run: gem install bundler
|
70
|
+
- run: bundle install --path vendor/bundle
|
71
|
+
- run: bundle exec rake test
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
# Mittsu
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/mittsu)
|
4
|
-
[](https://circleci.com/gh/jellymann/mittsu/tree/master)
|
8
|
-
🐧 [](https://travis-ci.org/jellymann/mittsu)
|
9
|
-
🖼 [](https://ci.appveyor.com/project/jellymann/mittsu/branch/master)
|
4
|
+
[](https://codeclimate.com/github/danini-the-panini/mittsu/test_coverage)
|
5
|
+
[](https://codeclimate.com/github/danini-the-panini/mittsu/maintainability)
|
6
|
+
[](https://github.com/danini-the-panini/mittsu/actions?query=workflow%3A%22Build%22)
|
10
7
|
|
11
8
|
3D Graphics Library for Ruby
|
12
9
|
|
@@ -18,7 +15,7 @@ Mittsu makes 3D graphics easier by providing an abstraction over OpenGL, and is
|
|
18
15
|

|
19
16
|

|
20
17
|
|
21
|
-
(You can find the source for the Tank Demo [here](https://github.com/
|
18
|
+
(You can find the source for the Tank Demo [here](https://github.com/danini-the-panini/mittsu-tank-demo))
|
22
19
|
|
23
20
|
## Installation
|
24
21
|
|
@@ -37,6 +34,7 @@ $ sudo apt-get install libglfw3
|
|
37
34
|
**NOTE:** On Windows, you will have to manually specify the glfw3.dll path in an environment variable
|
38
35
|
(you can download it [here](http://www.glfw.org/download.html))
|
39
36
|
```bash
|
37
|
+
# ex) set MITTSU_LIBGLFW_PATH=C:\Users\username\lib-mingw-w64
|
40
38
|
> set MITTSU_LIBGLFW_PATH=C:\path\to\glfw3.dll
|
41
39
|
> ruby your_awesome_mittsu_app.rb
|
42
40
|
```
|
@@ -215,7 +213,7 @@ If you just want to see what Mittsu can do and how to do it, take a peek inside
|
|
215
213
|
|
216
214
|
## Contributing
|
217
215
|
|
218
|
-
1. Fork it ( https://github.com/
|
216
|
+
1. Fork it ( https://github.com/danini-the-panini/mittsu/fork )
|
219
217
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
220
218
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
221
219
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/Rakefile
CHANGED
data/install-glfw.ps1
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
$glfwversion="3.3.1"
|
2
|
+
|
3
|
+
Invoke-WebRequest "https://github.com/glfw/glfw/releases/download/$glfwversion/glfw-$glfwversion.bin.WIN32.zip" -OutFile "$pwd\glfw-$glfwversion.bin.WIN32.zip"
|
4
|
+
|
5
|
+
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
6
|
+
function Unzip
|
7
|
+
{
|
8
|
+
param([string]$zipfile, [string]$outpath)
|
9
|
+
|
10
|
+
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
|
11
|
+
}
|
12
|
+
|
13
|
+
Unzip "$pwd\glfw-$glfwversion.bin.WIN32.zip" "$pwd"
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'mittsu'
|
2
|
-
|
3
1
|
module Mittsu
|
4
2
|
class OrthographicCamera < Camera
|
5
3
|
attr_accessor :zoom, :left, :right, :top, :bottom, :near, :far
|
@@ -25,8 +23,8 @@ module Mittsu
|
|
25
23
|
def update_projection_matrix
|
26
24
|
dx = (right - left) / (2.0 * zoom)
|
27
25
|
dy = (top - bottom) / (2.0 * zoom)
|
28
|
-
cx = (right
|
29
|
-
cy = (top
|
26
|
+
cx = (right + left) / 2.0
|
27
|
+
cy = (top + bottom) / 2.0
|
30
28
|
|
31
29
|
projection_matrix.make_orthographic(cx - dx, cx + dx, cy + dy, cy - dy, near, far)
|
32
30
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'mittsu'
|
2
|
-
|
3
1
|
module Mittsu
|
4
2
|
class PerspectiveCamera < Camera
|
5
3
|
attr_accessor :zoom, :fov, :aspect, :near, :far
|
@@ -15,6 +13,7 @@ module Mittsu
|
|
15
13
|
@aspect = aspect.to_f
|
16
14
|
@near = near.to_f
|
17
15
|
@far = far.to_f
|
16
|
+
@full_width = nil
|
18
17
|
|
19
18
|
update_projection_matrix
|
20
19
|
end
|
@@ -23,7 +22,7 @@ module Mittsu
|
|
23
22
|
# 35mm (fullframe) camera is used if frame size is not specified;
|
24
23
|
# Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html
|
25
24
|
def set_lens(focal_length, frame_height = 24.0)
|
26
|
-
@fov = 2.0 * Math.rad_to_deg(Math.atan(frame_height / (focal_length * 2.0)))
|
25
|
+
@fov = 2.0 * Math.rad_to_deg(::Math.atan(frame_height / (focal_length * 2.0)))
|
27
26
|
update_projection_matrix
|
28
27
|
end
|
29
28
|
|
@@ -73,11 +72,11 @@ module Mittsu
|
|
73
72
|
end
|
74
73
|
|
75
74
|
def update_projection_matrix
|
76
|
-
new_fov = Math.rad_to_deg(2.0 * Math.atan(Math.tan(Math.deg_to_rad(@fov) * 0.5) / @zoom))
|
75
|
+
new_fov = Math.rad_to_deg(2.0 * ::Math.atan(::Math.tan(Math.deg_to_rad(@fov) * 0.5) / @zoom))
|
77
76
|
|
78
77
|
if @full_width
|
79
78
|
aspect = @full_width / @full_height
|
80
|
-
top = Math.tan(Math.deg_to_rad(new_fov * 0.5)) * @near
|
79
|
+
top = ::Math.tan(Math.deg_to_rad(new_fov * 0.5)) * @near
|
81
80
|
bottom = -top
|
82
81
|
left = aspect * bottom
|
83
82
|
right = aspect * top
|
@@ -50,6 +50,18 @@ module Mittsu
|
|
50
50
|
self
|
51
51
|
end
|
52
52
|
|
53
|
+
def get_x(index)
|
54
|
+
@array[index * @item_size]
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_y(index)
|
58
|
+
@array[index * @item_size + 1]
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_z(index)
|
62
|
+
@array[index * @item_size + 2]
|
63
|
+
end
|
64
|
+
|
53
65
|
def set_xy(index, x, y)
|
54
66
|
index *= @item_size
|
55
67
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'securerandom'
|
2
|
-
require 'mittsu'
|
3
2
|
require 'mittsu/core/event_dispatcher'
|
4
3
|
|
5
4
|
module Mittsu
|
@@ -21,6 +20,7 @@ module Mittsu
|
|
21
20
|
@attributes = {}
|
22
21
|
|
23
22
|
@draw_calls = []
|
23
|
+
@_listeners = {}
|
24
24
|
end
|
25
25
|
|
26
26
|
def keys
|
@@ -179,7 +179,7 @@ module Mittsu
|
|
179
179
|
max_radius_sq = [max_radius_sq, center.distance_to_squared(vector)].max
|
180
180
|
end
|
181
181
|
|
182
|
-
@bounding_sphere.radius = Math.sqrt(max_radius_sq)
|
182
|
+
@bounding_sphere.radius = ::Math.sqrt(max_radius_sq)
|
183
183
|
|
184
184
|
if @bounding_radius.nan?
|
185
185
|
puts 'ERROR: Mittsu::BufferGeometry#computeBoundingSphere: Computed radius is NaN. The "position" attribute is likely to have NaN values.'
|
@@ -558,7 +558,7 @@ module Mittsu
|
|
558
558
|
normals.each_slice(3).with_index do |normal, i|
|
559
559
|
x, y, z = *normal
|
560
560
|
|
561
|
-
n = 1.0 / Math.sqrt(x * x + y * y + z * z)
|
561
|
+
n = 1.0 / ::Math.sqrt(x * x + y * y + z * z)
|
562
562
|
|
563
563
|
i *= 3
|
564
564
|
normals[i] *= n
|
data/lib/mittsu/core/geometry.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'securerandom'
|
2
|
-
require 'mittsu'
|
3
|
-
require 'securerandom'
|
4
2
|
|
5
3
|
module Mittsu
|
6
4
|
class Geometry
|
@@ -52,6 +50,8 @@ module Mittsu
|
|
52
50
|
@colors_need_update = false
|
53
51
|
@line_distances_need_update = false
|
54
52
|
@groups_need_update = false
|
53
|
+
|
54
|
+
@_listeners = {}
|
55
55
|
end
|
56
56
|
|
57
57
|
def apply_matrix(matrix)
|
@@ -429,12 +429,10 @@ module Mittsu
|
|
429
429
|
face.b = changes[face.b]
|
430
430
|
face.c = changes[face.c]
|
431
431
|
indices = [face.a, face.b, face.c]
|
432
|
-
dup_index = -1
|
433
432
|
# if any duplicate vertices are found in a Face3
|
434
433
|
# we have to remove the face as nothing can be saved
|
435
434
|
3.times do |n|
|
436
435
|
if indices[n] == indices[(n + 1) % 3]
|
437
|
-
dup_index = n
|
438
436
|
face_indices_to_remove << i
|
439
437
|
break
|
440
438
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'securerandom'
|
2
|
-
require 'mittsu'
|
3
2
|
|
4
3
|
module Mittsu
|
5
4
|
class Object3D
|
@@ -22,6 +21,8 @@ module Mittsu
|
|
22
21
|
@type = 'Object3D'
|
23
22
|
|
24
23
|
@children = []
|
24
|
+
@parent = nil
|
25
|
+
@name = nil
|
25
26
|
|
26
27
|
@up = DefaultUp.clone
|
27
28
|
|
@@ -55,6 +56,7 @@ module Mittsu
|
|
55
56
|
@render_order = 0
|
56
57
|
|
57
58
|
@user_data = {}
|
59
|
+
@_listeners = {}
|
58
60
|
end
|
59
61
|
|
60
62
|
def name
|
@@ -95,18 +97,18 @@ module Mittsu
|
|
95
97
|
end
|
96
98
|
|
97
99
|
def rotate_x(angle)
|
98
|
-
@
|
99
|
-
self.rotate_on_axis(@
|
100
|
+
@_x_axis ||= Vector3.new(1, 0, 0)
|
101
|
+
self.rotate_on_axis(@_x_axis, angle)
|
100
102
|
end
|
101
103
|
|
102
104
|
def rotate_y(angle)
|
103
|
-
@
|
104
|
-
self.rotate_on_axis(@
|
105
|
+
@_y_axis ||= Vector3.new(0, 1, 0)
|
106
|
+
self.rotate_on_axis(@_y_axis, angle)
|
105
107
|
end
|
106
108
|
|
107
109
|
def rotate_z(angle)
|
108
|
-
@
|
109
|
-
self.rotate_on_axis(@
|
110
|
+
@_z_axis ||= Vector3.new(0, 0, 1)
|
111
|
+
self.rotate_on_axis(@_z_axis, angle)
|
110
112
|
end
|
111
113
|
|
112
114
|
def translate_on_axis(axis, distance)
|
@@ -3,7 +3,7 @@ require 'mittsu/math'
|
|
3
3
|
|
4
4
|
module Mittsu
|
5
5
|
class CircleGeometry < Geometry
|
6
|
-
def initialize(radius = 50.0, segments = 8, theta_start = 0.0, theta_length = (Math::PI * 2.0))
|
6
|
+
def initialize(radius = 50.0, segments = 8, theta_start = 0.0, theta_length = (::Math::PI * 2.0))
|
7
7
|
super()
|
8
8
|
|
9
9
|
@type = 'CircleGeometry'
|
@@ -27,8 +27,8 @@ module Mittsu
|
|
27
27
|
vertex = Vector3.new
|
28
28
|
segment = theta_start + i.to_f / segments.to_f * theta_length
|
29
29
|
|
30
|
-
vertex.x = radius * Math.cos(segment)
|
31
|
-
vertex.y = radius * Math.sin(segment)
|
30
|
+
vertex.x = radius * ::Math.cos(segment)
|
31
|
+
vertex.y = radius * ::Math.sin(segment)
|
32
32
|
|
33
33
|
@vertices << vertex
|
34
34
|
uvs << Vector2.new((vertex.x / radius + 1.0) / 2.0, (vertex.y / radius + 1.0) / 2.0)
|
@@ -3,7 +3,7 @@ require 'mittsu/math'
|
|
3
3
|
|
4
4
|
module Mittsu
|
5
5
|
class CylinderGeometry < Geometry
|
6
|
-
def initialize(radius_top = 20.0, radius_bottom = 20.0, height = 100.0, radial_segments = 8, height_segments = 1, open_ended = false, theta_start = 0.0, theta_length = (Math::PI * 2.0))
|
6
|
+
def initialize(radius_top = 20.0, radius_bottom = 20.0, height = 100.0, radial_segments = 8, height_segments = 1, open_ended = false, theta_start = 0.0, theta_length = (::Math::PI * 2.0))
|
7
7
|
super()
|
8
8
|
|
9
9
|
@type = 'CylinderGeometry'
|
@@ -35,9 +35,9 @@ module Mittsu
|
|
35
35
|
u = x.to_f / radial_segments
|
36
36
|
|
37
37
|
vertex = Vector3.new
|
38
|
-
vertex.x = radius * Math.sin(u * theta_length + theta_start)
|
38
|
+
vertex.x = radius * ::Math.sin(u * theta_length + theta_start)
|
39
39
|
vertex.y = -v * height + height_half
|
40
|
-
vertex.z = radius * Math.cos(u * theta_length + theta_start)
|
40
|
+
vertex.z = radius * ::Math.cos(u * theta_length + theta_start)
|
41
41
|
|
42
42
|
@vertices << vertex
|
43
43
|
|
@@ -63,10 +63,10 @@ module Mittsu
|
|
63
63
|
nb = @vertices[index_rows[1][x + 1]].clone
|
64
64
|
end
|
65
65
|
|
66
|
-
na.y = Math.sqrt(na.x * na.x + na.z * na.z) * tan_theta
|
66
|
+
na.y = ::Math.sqrt(na.x * na.x + na.z * na.z) * tan_theta
|
67
67
|
na.normalize
|
68
68
|
|
69
|
-
nb.y = Math.sqrt(nb.x * nb.x + nb.z * nb.z) * tan_theta
|
69
|
+
nb.y = ::Math.sqrt(nb.x * nb.x + nb.z * nb.z) * tan_theta
|
70
70
|
nb.normalize
|
71
71
|
|
72
72
|
for y in 0...height_segments do
|
@@ -5,7 +5,7 @@ require 'mittsu/extras/geometries/polyhedron_geometry'
|
|
5
5
|
module Mittsu
|
6
6
|
class DodecahedronGeometry < PolyhedronGeometry
|
7
7
|
def initialize(radius = 1.0, detail = 0)
|
8
|
-
t = (1.0 + Math.sqrt(5.0)) / 2.0
|
8
|
+
t = (1.0 + ::Math.sqrt(5.0)) / 2.0
|
9
9
|
r = 1.0 / t
|
10
10
|
|
11
11
|
vertices = [
|
@@ -53,4 +53,4 @@ module Mittsu
|
|
53
53
|
}
|
54
54
|
end
|
55
55
|
end
|
56
|
-
end
|
56
|
+
end
|
@@ -5,7 +5,7 @@ require 'mittsu/extras/geometries/polyhedron_geometry'
|
|
5
5
|
module Mittsu
|
6
6
|
class IcosahedronGeometry < PolyhedronGeometry
|
7
7
|
def initialize(radius = 1.0, detail = 0)
|
8
|
-
t = (1.0 + Math.sqrt(5)) / 2.0
|
8
|
+
t = (1.0 + ::Math.sqrt(5)) / 2.0
|
9
9
|
|
10
10
|
vertices = [
|
11
11
|
- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,
|
@@ -30,4 +30,4 @@ module Mittsu
|
|
30
30
|
}
|
31
31
|
end
|
32
32
|
end
|
33
|
-
end
|
33
|
+
end
|
@@ -3,7 +3,7 @@ require 'mittsu/math'
|
|
3
3
|
|
4
4
|
module Mittsu
|
5
5
|
class LatheGeometry < Geometry
|
6
|
-
def initialize(points, segments = 12, phi_start = 0.0, phi_length = (Math::PI * 2.0))
|
6
|
+
def initialize(points, segments = 12, phi_start = 0.0, phi_length = (::Math::PI * 2.0))
|
7
7
|
super()
|
8
8
|
|
9
9
|
@type = 'LatheGeometry'
|
@@ -21,8 +21,8 @@ module Mittsu
|
|
21
21
|
for i in 0..segments do
|
22
22
|
phi = phi_start + i.to_f * inverse_segments * phi_length
|
23
23
|
|
24
|
-
c = Math.cos(phi)
|
25
|
-
s = Math.sin(phi)
|
24
|
+
c = ::Math.cos(phi)
|
25
|
+
s = ::Math.sin(phi)
|
26
26
|
|
27
27
|
for j in 0...points.length do
|
28
28
|
pt = points[j]
|
@@ -19,23 +19,23 @@ module Mittsu
|
|
19
19
|
|
20
20
|
def self.klein
|
21
21
|
-> (v, u, target = Vector3.new) {
|
22
|
-
u *= Math::PI
|
23
|
-
v *= 2.0 * Math::PI
|
22
|
+
u *= ::Math::PI
|
23
|
+
v *= 2.0 * ::Math::PI
|
24
24
|
|
25
25
|
u = u * 2.0
|
26
26
|
x = nil
|
27
27
|
y = nil
|
28
28
|
z = nil
|
29
29
|
|
30
|
-
if u < Math::PI
|
31
|
-
x = 3.0 * Math.cos(u) * (1.0 + Math.sin(u)) + (2.0 * (1.0 - Math.cos(u) / 2.0)) * Math.cos(u) * Math.cos(v)
|
32
|
-
z = -8.0 * Math.sin(u) - 2.0 * (1.0 - Math.cos(u) / 2.0) * Math.sin(u) * Math.cos(v)
|
30
|
+
if u < ::Math::PI
|
31
|
+
x = 3.0 * ::Math.cos(u) * (1.0 + ::Math.sin(u)) + (2.0 * (1.0 - ::Math.cos(u) / 2.0)) * ::Math.cos(u) * ::Math.cos(v)
|
32
|
+
z = -8.0 * ::Math.sin(u) - 2.0 * (1.0 - ::Math.cos(u) / 2.0) * ::Math.sin(u) * ::Math.cos(v)
|
33
33
|
else
|
34
|
-
x = 3.0 * Math.cos(u) * (1.0 + Math.sin(u)) + (2.0 * (1.0 - Math.cos(u) / 2.0)) * Math.cos(v + Math::PI)
|
35
|
-
z = -8.0 * Math.sin(u)
|
34
|
+
x = 3.0 * ::Math.cos(u) * (1.0 + ::Math.sin(u)) + (2.0 * (1.0 - ::Math.cos(u) / 2.0)) * ::Math.cos(v + ::Math::PI)
|
35
|
+
z = -8.0 * ::Math.sin(u)
|
36
36
|
end
|
37
37
|
|
38
|
-
y = -2.0 * (1.0 - Math.cos(u) / 2.0) * Math.sin(v)
|
38
|
+
y = -2.0 * (1.0 - ::Math.cos(u) / 2.0) * ::Math.sin(v)
|
39
39
|
|
40
40
|
target.set(x, y, z)
|
41
41
|
}
|
@@ -56,13 +56,13 @@ module Mittsu
|
|
56
56
|
# flat mobius strip
|
57
57
|
# http://www.wolframalpha.com/input/?i=M%C3%B6bius+strip+parametric+equations&lk=1&a=ClashPrefs_*Surface.MoebiusStrip.SurfaceProperty.ParametricEquations-
|
58
58
|
u = u - 0.5
|
59
|
-
v = 2.0 * Math::PI * t
|
59
|
+
v = 2.0 * ::Math::PI * t
|
60
60
|
|
61
61
|
a = 2.0
|
62
62
|
|
63
|
-
x = Math.cos(v) * (a + u * Math.cos(v / 2.0))
|
64
|
-
y = Math.sin(v) * (a + u * Math.cos(v / 2.0))
|
65
|
-
z = u * Math.sin(v / 2)
|
63
|
+
x = ::Math.cos(v) * (a + u * ::Math.cos(v / 2.0))
|
64
|
+
y = ::Math.sin(v) * (a + u * ::Math.cos(v / 2.0))
|
65
|
+
z = u * ::Math.sin(v / 2)
|
66
66
|
|
67
67
|
target.set(x, y, z)
|
68
68
|
}
|
@@ -72,8 +72,8 @@ module Mittsu
|
|
72
72
|
-> (u, t, target = Vector3.new) {
|
73
73
|
# volumetric mobius strip
|
74
74
|
|
75
|
-
u *= Math::PI
|
76
|
-
t *= 2.0 * Math::PI
|
75
|
+
u *= ::Math::PI
|
76
|
+
t *= 2.0 * ::Math::PI
|
77
77
|
|
78
78
|
u = u * 2.0
|
79
79
|
phi = u / 2.0
|
@@ -81,13 +81,13 @@ module Mittsu
|
|
81
81
|
a = 0.125
|
82
82
|
b = 0.65
|
83
83
|
|
84
|
-
x = a * Math.cos(t) * Math.cos(phi) - b * Math.sin(t) * Math.sin(phi)
|
85
|
-
z = a * Math.cos(t) * Math.sin(phi) + b * Math.sin(t) * Math.cos(phi)
|
86
|
-
y = (major + x) * Math.sin(u)
|
87
|
-
x = (major + x) * Math.cos(u)
|
84
|
+
x = a * ::Math.cos(t) * ::Math.cos(phi) - b * ::Math.sin(t) * ::Math.sin(phi)
|
85
|
+
z = a * ::Math.cos(t) * ::Math.sin(phi) + b * ::Math.sin(t) * ::Math.cos(phi)
|
86
|
+
y = (major + x) * ::Math.sin(u)
|
87
|
+
x = (major + x) * ::Math.cos(u)
|
88
88
|
|
89
89
|
target.set(x, y, z)
|
90
90
|
}
|
91
91
|
end
|
92
92
|
end
|
93
|
-
end
|
93
|
+
end
|
@@ -27,7 +27,6 @@ module Mittsu
|
|
27
27
|
v1 = @vertices[indices[i]]
|
28
28
|
v2 = @vertices[indices[i + 1]]
|
29
29
|
v3 = @vertices[indices[i + 2]]
|
30
|
-
binding.irb if v1.nil? || v2.nil? || v3.nil?
|
31
30
|
|
32
31
|
faces[j] = Face3.new(v1.index, v2.index, v3.index, [v1.clone, v2.clone, v3.clone])
|
33
32
|
|
@@ -78,8 +77,8 @@ module Mittsu
|
|
78
77
|
vertex.index = @vertices.push(vertex).length - 1
|
79
78
|
|
80
79
|
# Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle.
|
81
|
-
u = azimuth(vector) / 2.0 / Math::PI + 0.5
|
82
|
-
v = inclination(vector) / Math::PI + 0.5
|
80
|
+
u = azimuth(vector) / 2.0 / ::Math::PI + 0.5
|
81
|
+
v = inclination(vector) / ::Math::PI + 0.5
|
83
82
|
vertex.uv = Vector2.new(u, 1.0 - v)
|
84
83
|
|
85
84
|
vertex
|
@@ -150,19 +149,19 @@ module Mittsu
|
|
150
149
|
|
151
150
|
# Angle around the Y axis, counter-clockwise when looking from above.
|
152
151
|
def azimuth(vector)
|
153
|
-
Math.atan2(vector.z, -vector.x)
|
152
|
+
::Math.atan2(vector.z, -vector.x)
|
154
153
|
end
|
155
154
|
|
156
155
|
# Angle above the XZ plane.
|
157
156
|
def inclination(vector)
|
158
|
-
Math.atan2(-vector.y, Math.sqrt(vector.x * vector.x + vector.z * vector.z))
|
157
|
+
::Math.atan2(-vector.y, ::Math.sqrt(vector.x * vector.x + vector.z * vector.z))
|
159
158
|
end
|
160
159
|
|
161
160
|
# Texture fixing helper. Spheres have some odd behaviours.
|
162
161
|
def correct_uv(uv, vector, azimuth)
|
163
162
|
return Vector2.new(uv.x - 1.0, uv.y) if azimuth < 0
|
164
|
-
return Vector2.new(azimuth / 2.0 / Math::PI + 0.5, uv.y) if vector.x.zero? && vector.z.zero?
|
163
|
+
return Vector2.new(azimuth / 2.0 / ::Math::PI + 0.5, uv.y) if vector.x.zero? && vector.z.zero?
|
165
164
|
uv.clone
|
166
165
|
end
|
167
166
|
end
|
168
|
-
end
|
167
|
+
end
|
@@ -3,7 +3,7 @@ require 'mittsu/math'
|
|
3
3
|
|
4
4
|
module Mittsu
|
5
5
|
class RingGeometry < Geometry
|
6
|
-
def initialize(inner_radius = 0.0, outer_radius = 50.0, theta_segments = 8, phi_segments = 8, theta_start = 0.0, theta_length = (Math::PI * 2.0))
|
6
|
+
def initialize(inner_radius = 0.0, outer_radius = 50.0, theta_segments = 8, phi_segments = 8, theta_start = 0.0, theta_length = (::Math::PI * 2.0))
|
7
7
|
super()
|
8
8
|
|
9
9
|
@type = 'RingGeometry'
|
@@ -28,8 +28,8 @@ module Mittsu
|
|
28
28
|
for o in 0..theta_segments do # number of segments per circle
|
29
29
|
vertex = Vector3.new
|
30
30
|
segment = theta_start + o.to_f / theta_segments.to_f * theta_length
|
31
|
-
vertex.x = radius * Math.cos(segment)
|
32
|
-
vertex.y = radius * Math.sin(segment)
|
31
|
+
vertex.x = radius * ::Math.cos(segment)
|
32
|
+
vertex.y = radius * ::Math.sin(segment)
|
33
33
|
|
34
34
|
@vertices << vertex
|
35
35
|
uvs << Vector2.new((vertex.x / outer_radius + 1.0) / 2.0, (vertex.y / outer_radius + 1.0) / 2.0)
|
@@ -77,4 +77,4 @@ module Mittsu
|
|
77
77
|
)
|
78
78
|
end
|
79
79
|
end
|
80
|
-
end
|
80
|
+
end
|
@@ -3,7 +3,7 @@ require 'mittsu/math'
|
|
3
3
|
|
4
4
|
module Mittsu
|
5
5
|
class SphereGeometry < Geometry
|
6
|
-
def initialize(radius = 50.0, width_segments = 8, height_segments = 6, phi_start = 0.0, phi_length = (Math::PI * 2.0), theta_start = 0.0, theta_length = Math::PI)
|
6
|
+
def initialize(radius = 50.0, width_segments = 8, height_segments = 6, phi_start = 0.0, phi_length = (::Math::PI * 2.0), theta_start = 0.0, theta_length = ::Math::PI)
|
7
7
|
super()
|
8
8
|
|
9
9
|
@type = 'SphereGeometry'
|
@@ -33,9 +33,9 @@ module Mittsu
|
|
33
33
|
v = y / height_segments.to_f
|
34
34
|
|
35
35
|
vertex = Vector3.new
|
36
|
-
vertex.x = -radius * Math.cos(phi_start + u * phi_length) * Math.sin(theta_start + v * theta_length)
|
37
|
-
vertex.y = radius * Math.cos(theta_start + v * theta_length)
|
38
|
-
vertex.z = radius * Math.sin(phi_start + u * phi_length) * Math.sin(theta_start + v * theta_length)
|
36
|
+
vertex.x = -radius * ::Math.cos(phi_start + u * phi_length) * ::Math.sin(theta_start + v * theta_length)
|
37
|
+
vertex.y = radius * ::Math.cos(theta_start + v * theta_length)
|
38
|
+
vertex.z = radius * ::Math.sin(phi_start + u * phi_length) * ::Math.sin(theta_start + v * theta_length)
|
39
39
|
|
40
40
|
@vertices << vertex
|
41
41
|
|