mittsu 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/mittsu.svg)](https://badge.fury.io/rb/mittsu)
|
4
|
-
[![Coverage
|
5
|
-
[![
|
6
|
-
|
7
|
-
🍎 [![Circle CI Build Status (macOS)](https://circleci.com/gh/jellymann/mittsu/tree/master.svg?style=shield)](https://circleci.com/gh/jellymann/mittsu/tree/master)
|
8
|
-
🐧 [![Travis Build Status (Ubuntu)](https://travis-ci.org/jellymann/mittsu.svg?branch=master)](https://travis-ci.org/jellymann/mittsu)
|
9
|
-
🖼 [![AppVeyor Build status (Windows)](https://ci.appveyor.com/api/projects/status/x7k8r95m5f5fg9cu/branch/master?svg=true)](https://ci.appveyor.com/project/jellymann/mittsu/branch/master)
|
4
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/22be300984d81fa10af8/test_coverage)](https://codeclimate.com/github/danini-the-panini/mittsu/test_coverage)
|
5
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/22be300984d81fa10af8/maintainability)](https://codeclimate.com/github/danini-the-panini/mittsu/maintainability)
|
6
|
+
[![Build Status](https://github.com/danini-the-panini/mittsu/workflows/Build/badge.svg)](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
|
![Point Light](https://cloud.githubusercontent.com/assets/1171825/18411861/4531bb4c-7781-11e6-92b4-b6ebda60e2c9.gif)
|
19
16
|
![Tank Demo](https://cloud.githubusercontent.com/assets/1171825/18411862/4531fe9a-7781-11e6-9665-b172df1a3645.gif)
|
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
|
|