mittsu 0.3.3 → 0.4.1
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 +17 -45
- data/LICENSE.txt +1 -1
- data/README.md +6 -5
- data/lib/mittsu/core/buffer_attribute.rb +12 -0
- data/lib/mittsu/core/geometry.rb +3 -3
- data/lib/mittsu/core/object_3d.rb +29 -47
- data/lib/mittsu/extras/geometries/polyhedron_geometry.rb +0 -1
- data/lib/mittsu/loaders/obj_loader.rb +11 -5
- data/lib/mittsu/math/box3.rb +4 -4
- data/lib/mittsu/math/vector3.rb +108 -0
- data/lib/mittsu/objects/line.rb +1 -3
- data/lib/mittsu/objects/mesh.rb +9 -12
- data/lib/mittsu/objects/point_cloud.rb +3 -3
- data/lib/mittsu/renderers/generic_lib.rb +4 -1
- data/lib/mittsu/renderers/glfw_lib.rb +27 -4
- data/lib/mittsu/renderers/glfw_window.rb +5 -1
- data/lib/mittsu/renderers/opengl/textures/texture.rb +2 -2
- data/lib/mittsu/renderers/opengl_renderer.rb +4 -4
- data/lib/mittsu/version.rb +1 -2
- data/mittsu.gemspec +4 -4
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 806e8ad78d34edc7dfa72cbe35414c0fe765628b5dd074d691d5bf0f45dd52cb
|
4
|
+
data.tar.gz: b477a885ca405bd5ad8b71464b06ce794567c00abceb56738f3ace06885fe4d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d65b207aaaf6136a1e6d7fd39237bd5710192748338eb388fd974d4128069cbc41b6df4132bc2597793f507ed7349abdb0f3d28e9df1584ff9d4e1f9a39c8bc2
|
7
|
+
data.tar.gz: b4eb049497dc7f46d4285d8d8d677f3221f08d904dcc21b1efa3e7044edea42a1d49e8979d74bd26c3bc9470598fd9755c460865cc324ce71b6c87fec036d07e
|
@@ -13,25 +13,16 @@ jobs:
|
|
13
13
|
runs-on: ubuntu-latest
|
14
14
|
strategy:
|
15
15
|
matrix:
|
16
|
-
ruby: ['2.
|
16
|
+
ruby: ['2.6', '2.7', '3.0', '3.1', '3.2', '3.3', 'head']
|
17
17
|
steps:
|
18
|
-
- uses: actions/checkout@
|
19
|
-
-
|
20
|
-
uses: actions/cache@v1
|
18
|
+
- uses: actions/checkout@v4
|
19
|
+
- uses: awalsh128/cache-apt-pkgs-action@v1
|
21
20
|
with:
|
22
|
-
|
23
|
-
|
24
|
-
restore-keys: |
|
25
|
-
gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-${{ hashFiles('**/*.gemspec') }}-
|
26
|
-
gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-
|
27
|
-
gems-v1-${{ runner.os }}-
|
28
|
-
- uses: actions/setup-ruby@v1
|
21
|
+
packages: libglfw3
|
22
|
+
- uses: ruby/setup-ruby@v1
|
29
23
|
with:
|
30
24
|
ruby-version: ${{ matrix.ruby }}
|
31
|
-
|
32
|
-
- run: bash install-glfw.sh
|
33
|
-
- run: gem install bundler
|
34
|
-
- run: bundle install --path vendor/bundle
|
25
|
+
bundler-cache: true
|
35
26
|
- name: Test & publish code coverage
|
36
27
|
uses: paambaati/codeclimate-action@v2.2.1
|
37
28
|
if: github.event_name == 'push'
|
@@ -48,48 +39,29 @@ jobs:
|
|
48
39
|
runs-on: macos-latest
|
49
40
|
strategy:
|
50
41
|
matrix:
|
51
|
-
ruby: ['2.
|
42
|
+
ruby: ['2.6', '2.7', '3.0', '3.1', '3.2', '3.3', 'head']
|
52
43
|
steps:
|
53
|
-
- uses: actions/checkout@
|
54
|
-
-
|
55
|
-
|
56
|
-
with:
|
57
|
-
path: vendor/bundle
|
58
|
-
key: gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-${{ hashFiles('**/*.gemspec') }}-
|
59
|
-
restore-keys: |
|
60
|
-
gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-${{ hashFiles('**/*.gemspec') }}-
|
61
|
-
gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-
|
62
|
-
gems-v1-${{ runner.os }}-
|
63
|
-
- uses: actions/setup-ruby@v1
|
44
|
+
- uses: actions/checkout@v4
|
45
|
+
- run: brew install glfw
|
46
|
+
- uses: ruby/setup-ruby@v1
|
64
47
|
with:
|
65
48
|
ruby-version: ${{ matrix.ruby }}
|
66
|
-
|
67
|
-
- run: bundle install --path vendor/bundle
|
49
|
+
bundler-cache: true
|
68
50
|
- run: bundle exec rake test
|
69
51
|
|
70
52
|
windows:
|
71
53
|
name: Windows
|
72
54
|
runs-on: windows-latest
|
73
55
|
env:
|
74
|
-
|
56
|
+
MITTSU_LIBGLFW_PATH: c:\projects\mittsu\glfw-3.3.1.bin.WIN32\lib-mingw
|
75
57
|
strategy:
|
76
58
|
matrix:
|
77
|
-
ruby: ['2.
|
59
|
+
ruby: ['2.6', '2.7', '3.0', '3.1', '3.2', '3.3', 'head']
|
78
60
|
steps:
|
79
|
-
- uses: actions/checkout@
|
80
|
-
-
|
81
|
-
|
82
|
-
with:
|
83
|
-
path: vendor/bundle
|
84
|
-
key: gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-${{ hashFiles('**/*.gemspec') }}-
|
85
|
-
restore-keys: |
|
86
|
-
gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-${{ hashFiles('**/*.gemspec') }}-
|
87
|
-
gems-v1-${{ runner.os }}-${{ hashFiles('**/Gemfile') }}-
|
88
|
-
gems-v1-${{ runner.os }}-
|
89
|
-
- uses: actions/setup-ruby@v1
|
61
|
+
- uses: actions/checkout@v4
|
62
|
+
- run: .\install-glfw.ps1
|
63
|
+
- uses: ruby/setup-ruby@v1
|
90
64
|
with:
|
91
65
|
ruby-version: ${{ matrix.ruby }}
|
92
|
-
|
93
|
-
- run: gem install bundler
|
94
|
-
- run: bundle install --path vendor/bundle
|
66
|
+
bundler-cache: true
|
95
67
|
- run: bundle exec rake test
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# Mittsu
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/mittsu)
|
4
|
-
[](https://codeclimate.com/github/
|
5
|
-
[](https://codeclimate.com/github/
|
6
|
-
[](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)
|
7
7
|
|
8
8
|
3D Graphics Library for Ruby
|
9
9
|
|
@@ -15,7 +15,7 @@ Mittsu makes 3D graphics easier by providing an abstraction over OpenGL, and is
|
|
15
15
|

|
16
16
|

|
17
17
|
|
18
|
-
(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))
|
19
19
|
|
20
20
|
## Installation
|
21
21
|
|
@@ -34,6 +34,7 @@ $ sudo apt-get install libglfw3
|
|
34
34
|
**NOTE:** On Windows, you will have to manually specify the glfw3.dll path in an environment variable
|
35
35
|
(you can download it [here](http://www.glfw.org/download.html))
|
36
36
|
```bash
|
37
|
+
# ex) set MITTSU_LIBGLFW_PATH=C:\Users\username\lib-mingw-w64
|
37
38
|
> set MITTSU_LIBGLFW_PATH=C:\path\to\glfw3.dll
|
38
39
|
> ruby your_awesome_mittsu_app.rb
|
39
40
|
```
|
@@ -212,7 +213,7 @@ If you just want to see what Mittsu can do and how to do it, take a peek inside
|
|
212
213
|
|
213
214
|
## Contributing
|
214
215
|
|
215
|
-
1. Fork it ( https://github.com/
|
216
|
+
1. Fork it ( https://github.com/danini-the-panini/mittsu/fork )
|
216
217
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
217
218
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
218
219
|
4. Push to the branch (`git push origin my-new-feature`)
|
@@ -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
|
|
data/lib/mittsu/core/geometry.rb
CHANGED
@@ -397,7 +397,7 @@ module Mittsu
|
|
397
397
|
end
|
398
398
|
|
399
399
|
def merge_mesh(mesh)
|
400
|
-
if mesh
|
400
|
+
if mesh.is_a?(Mittsu::Mesh) == false
|
401
401
|
puts('ERROR: Mittsu::Geometry#merge_mesh: mesh not an instance of Mittsu::Mesh.', mesh.inspect)
|
402
402
|
return
|
403
403
|
end
|
@@ -469,7 +469,7 @@ module Mittsu
|
|
469
469
|
end
|
470
470
|
vertices = []
|
471
471
|
@vertices.each do |vert|
|
472
|
-
vertices <<
|
472
|
+
vertices << vert.x << vert.y << vert.z
|
473
473
|
end
|
474
474
|
faces = []
|
475
475
|
normals = []
|
@@ -507,7 +507,7 @@ module Mittsu
|
|
507
507
|
faces << get_uv_index(face_vertex_uvs[2], uvs_hash, uvs)
|
508
508
|
end
|
509
509
|
if has_face_normal
|
510
|
-
faces << get_normal_index(face.normal)
|
510
|
+
faces << get_normal_index(face.normal, normals_hash, normals)
|
511
511
|
end
|
512
512
|
if has_face_vertex_normal
|
513
513
|
vertex_normals = face.vertex_normals
|
@@ -305,17 +305,13 @@ module Mittsu
|
|
305
305
|
end
|
306
306
|
|
307
307
|
def to_json
|
308
|
-
|
308
|
+
{
|
309
309
|
metadata: {
|
310
310
|
version: 4.3,
|
311
311
|
type: 'Object',
|
312
312
|
generator: 'ObjectExporter'
|
313
|
-
}
|
314
|
-
}
|
315
|
-
@_geometries = {}
|
316
|
-
@_materials = {}
|
317
|
-
@_output[:object] = self.jsonify
|
318
|
-
@_output
|
313
|
+
},
|
314
|
+
}.merge(jsonify)
|
319
315
|
end
|
320
316
|
|
321
317
|
def clone(object = nil, recursive = true)
|
@@ -346,46 +342,32 @@ module Mittsu
|
|
346
342
|
protected
|
347
343
|
|
348
344
|
def jsonify
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
@_output[:geometries] << json
|
376
|
-
end
|
377
|
-
geometry.uuid
|
378
|
-
end
|
379
|
-
|
380
|
-
def jsonify_material(material)
|
381
|
-
@_output[:materials] ||= []
|
382
|
-
if @_materials[material.uuid].nil?
|
383
|
-
json = material.to_json
|
384
|
-
json.delete :metadata
|
385
|
-
@_materials[material.uuid] = json
|
386
|
-
@_output[:materials] << json
|
387
|
-
end
|
388
|
-
material.uuid
|
345
|
+
children = @children.map(&:to_json)
|
346
|
+
{
|
347
|
+
object: {
|
348
|
+
uuid: @uuid,
|
349
|
+
type: @type,
|
350
|
+
matrix: @matrix.to_a,
|
351
|
+
geometry: @geometry&.uuid,
|
352
|
+
material: @material&.uuid,
|
353
|
+
name: @name&.empty? ? nil : @name,
|
354
|
+
user_data: @user_data&.empty? ? nil : @user_data,
|
355
|
+
visible: @visible ? nil : @visible,
|
356
|
+
children: children.map { |x| x[:object] }.flatten
|
357
|
+
}.reject { |k,v| v.nil? || v == [] },
|
358
|
+
geometries: ([jsonify_geometry] + children.map { |x| x[:geometries] }).flatten.compact,
|
359
|
+
materials: ([jsonify_material] + children.map { |x| x[:materials] }).flatten.compact
|
360
|
+
}.reject { |k,v| v.nil? || v == [] }
|
361
|
+
end
|
362
|
+
|
363
|
+
def jsonify_geometry
|
364
|
+
return nil if @geometry.nil?
|
365
|
+
@geometry.to_json.delete_if {|k, v| k == :metadata }
|
366
|
+
end
|
367
|
+
|
368
|
+
def jsonify_material
|
369
|
+
return nil if @material.nil?
|
370
|
+
@material.to_json.delete_if {|k, v| k == :metadata }
|
389
371
|
end
|
390
372
|
end
|
391
373
|
end
|
@@ -53,7 +53,7 @@ module Mittsu
|
|
53
53
|
|
54
54
|
when FACE_PATTERN then parse_face(line)
|
55
55
|
|
56
|
-
when OBJECT_PATTERN then
|
56
|
+
when OBJECT_PATTERN then handle_object($1)
|
57
57
|
when GROUP_PATTERN # ignore
|
58
58
|
when SMOOTH_GROUP_PATTERN # ignore
|
59
59
|
|
@@ -105,9 +105,15 @@ module Mittsu
|
|
105
105
|
raw_lines.split("\n").map(&:strip).reject(&:empty?).reject{|l| l.start_with? '#'}
|
106
106
|
end
|
107
107
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
108
|
+
def handle_object(object_name = '')
|
109
|
+
# Reset if we're already working on a named object
|
110
|
+
# otherwise, just name the one we have in progress
|
111
|
+
unless @object&.name.nil?
|
112
|
+
end_object
|
113
|
+
reset_vertices
|
114
|
+
@object = nil
|
115
|
+
end
|
116
|
+
@object ||= Object3D.new
|
111
117
|
@object.name = object_name
|
112
118
|
end
|
113
119
|
|
@@ -120,7 +126,7 @@ module Mittsu
|
|
120
126
|
|
121
127
|
def new_mesh
|
122
128
|
end_mesh
|
123
|
-
|
129
|
+
handle_object if @object.nil?
|
124
130
|
@geometry = Geometry.new
|
125
131
|
@mesh = Mesh.new(@geometry, @material || MeshLambertMaterial.new)
|
126
132
|
@mesh.name = @object.name
|
data/lib/mittsu/math/box3.rb
CHANGED
@@ -38,18 +38,18 @@ module Mittsu
|
|
38
38
|
object.traverse do |node|
|
39
39
|
geometry = node.geometry
|
40
40
|
if geometry != nil
|
41
|
-
if geometry
|
41
|
+
if geometry.is_a?(Mittsu::Geometry)
|
42
42
|
vertices = geometry.vertices
|
43
43
|
vertices.each do |vertex|
|
44
44
|
v1.copy(vertex)
|
45
|
-
v1.apply_matrix4(node.
|
45
|
+
v1.apply_matrix4(node.matrix_world)
|
46
46
|
scope.expand_by_point(v1)
|
47
47
|
end
|
48
|
-
elsif geometry
|
48
|
+
elsif geometry.is_a?(Mittsu::BufferGeometry) && geometry.attributes['position'] != nil
|
49
49
|
positions = geometry.attributes['position'].array
|
50
50
|
positions.each_slice(3) do |postition|
|
51
51
|
v1.set(position[0], position[1], position[2])
|
52
|
-
v1.apply_matrix4(node.
|
52
|
+
v1.apply_matrix4(node.matrix_world)
|
53
53
|
scope.expand_by_point(v1)
|
54
54
|
end
|
55
55
|
end
|
data/lib/mittsu/math/vector3.rb
CHANGED
@@ -187,6 +187,114 @@ module Mittsu
|
|
187
187
|
self
|
188
188
|
end
|
189
189
|
|
190
|
+
def set_scalar(scalar)
|
191
|
+
set(scalar, scalar, scalar)
|
192
|
+
|
193
|
+
self
|
194
|
+
end
|
195
|
+
|
196
|
+
def set_component(index, value)
|
197
|
+
_x, _y, _z = *@elements
|
198
|
+
|
199
|
+
case index
|
200
|
+
when 0
|
201
|
+
set(value, _y, _z)
|
202
|
+
when 1
|
203
|
+
set(_x, value, _z)
|
204
|
+
when 2
|
205
|
+
set(_x, _y, value)
|
206
|
+
else
|
207
|
+
raise ArgumentError, "index is out of range: #{index}"
|
208
|
+
end
|
209
|
+
|
210
|
+
self
|
211
|
+
end
|
212
|
+
|
213
|
+
def get_component(index)
|
214
|
+
_x, _y, _z = *@elements
|
215
|
+
|
216
|
+
case index
|
217
|
+
when 0
|
218
|
+
return _x
|
219
|
+
when 1
|
220
|
+
return _y
|
221
|
+
when 2
|
222
|
+
return _z
|
223
|
+
else
|
224
|
+
raise ArgumentError, "index is out of range: #{index}"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def add_scaled_vector(vector, scalar)
|
229
|
+
set(vector.x * scalar, vector.y * scalar, vector.z * scalar)
|
230
|
+
|
231
|
+
self
|
232
|
+
end
|
233
|
+
|
234
|
+
def set_from_spherical(sphere)
|
235
|
+
set_from_spherical_coords(sphere.radius, sphere.phi, sphere.theta)
|
236
|
+
end
|
237
|
+
|
238
|
+
def set_from_spherical_coords(radius, phi, theta)
|
239
|
+
sin_phi_radius = ::Math.sin(phi) * radius
|
240
|
+
set(sin_phi_radius * ::Math.sin(theta), ::Math.cos(phi) * radius, sin_phi_radius * ::Math.cos(theta))
|
241
|
+
|
242
|
+
self
|
243
|
+
end
|
244
|
+
|
245
|
+
def set_from_cylindrical(cylinder)
|
246
|
+
set_from_cylindrical_coords(cylinder.radius, cylinder.theta, cylinder.y)
|
247
|
+
end
|
248
|
+
|
249
|
+
def set_from_cylindrical_coords(radius, theta, y)
|
250
|
+
set(radius * ::Math.sin(theta), y, radius * ::Math.sin(theta))
|
251
|
+
|
252
|
+
self
|
253
|
+
end
|
254
|
+
|
255
|
+
def set_from_matrix3_column(matrix, index)
|
256
|
+
from_array(matrix.elements, index * 3)
|
257
|
+
end
|
258
|
+
|
259
|
+
def equals(vector)
|
260
|
+
_x, _y, _z = *@elements
|
261
|
+
|
262
|
+
((vector.x == _x) && (vector.y == _y) && (vector.z == _z ))
|
263
|
+
end
|
264
|
+
|
265
|
+
def from_buffer_attribute(attribute, index)
|
266
|
+
set(attribute.get_x(index), attribute.get_y(index), attribute.get_z(index))
|
267
|
+
|
268
|
+
self
|
269
|
+
end
|
270
|
+
|
271
|
+
def clamp_length(min, max)
|
272
|
+
divide_scalar(length || 1).multiply_scalar([min, [max, length].min].max)
|
273
|
+
end
|
274
|
+
|
275
|
+
def manhattan_distance_to(vector)
|
276
|
+
_x, _y, _z = *@elements
|
277
|
+
|
278
|
+
(_x - vector.x).abs + (_y - vector.y).abs + (_z - vector.z).abs
|
279
|
+
end
|
280
|
+
|
281
|
+
# TODO: maybe add range 3 values as arguments (range_x, range_y, range_z) to this method
|
282
|
+
def random()
|
283
|
+
set(Random.new.rand, Random.new.rand, Random.new.rand)
|
284
|
+
|
285
|
+
self
|
286
|
+
end
|
287
|
+
|
288
|
+
def random_direction()
|
289
|
+
u = (Random.new.rand - 0.5) *2
|
290
|
+
t = Random.new.rand * ::Math::PI * 2
|
291
|
+
f = ::Math.sqrt(1 - u ** 2)
|
292
|
+
|
293
|
+
set(f * ::Math.cos(t), f * ::Math.sin(t), u)
|
294
|
+
|
295
|
+
self
|
296
|
+
end
|
297
|
+
|
190
298
|
def from_attribute(attribute, index, offset = 0)
|
191
299
|
index = index * attribute.itemSize + offset
|
192
300
|
|
data/lib/mittsu/objects/line.rb
CHANGED
@@ -143,9 +143,7 @@ module Mittsu
|
|
143
143
|
|
144
144
|
def jsonify
|
145
145
|
data = super
|
146
|
-
data[:
|
147
|
-
data[:material] = jsonify_material(self.material)
|
148
|
-
data[:mode] = self.mode
|
146
|
+
data[:object][:mode] = self.mode
|
149
147
|
data
|
150
148
|
end
|
151
149
|
end
|
data/lib/mittsu/objects/mesh.rb
CHANGED
@@ -98,7 +98,7 @@ module Mittsu
|
|
98
98
|
@_ray.copy(raycaster.ray).apply_matrix4(@_inverse_matrix)
|
99
99
|
|
100
100
|
if !geometry.bounding_box.nil?
|
101
|
-
return unless
|
101
|
+
return unless @_ray.intersection_box?(geometry.bounding_box)
|
102
102
|
end
|
103
103
|
|
104
104
|
|
@@ -132,16 +132,16 @@ module Mittsu
|
|
132
132
|
v_c.from_array(positions, c * 3)
|
133
133
|
|
134
134
|
if material.side == BackSide
|
135
|
-
intersection_point =
|
135
|
+
intersection_point = @_ray.intersect_triangle(v_c, v_b, v_a, true)
|
136
136
|
else
|
137
|
-
intersection_point =
|
137
|
+
intersection_point = @_ray.intersect_triangle(v_a, v_b, v_c, material.side != DoubleSide)
|
138
138
|
end
|
139
139
|
|
140
140
|
next if intersection_point.nil?
|
141
141
|
|
142
142
|
intersection_point.apply_matrix4(@matrix_world)
|
143
143
|
|
144
|
-
distance =
|
144
|
+
distance = raycaster.ray.origin.distance_to(intersection_point)
|
145
145
|
|
146
146
|
next if distance < precision || distance < raycaster.near || distance > raycaster.far
|
147
147
|
|
@@ -170,17 +170,17 @@ module Mittsu
|
|
170
170
|
v_b.from_array(positions, j + 3)
|
171
171
|
v_c.from_array(positions, j + 6)
|
172
172
|
|
173
|
-
if material.side
|
174
|
-
intersection_point =
|
173
|
+
if material.side == BackSide
|
174
|
+
intersection_point = @_ray.intersect_triangle(v_c, v_b, v_a, true)
|
175
175
|
else
|
176
|
-
intersection_point =
|
176
|
+
intersection_point = @_ray.intersect_triangle(v_a, v_b, v_c, material.side != DoubleSide)
|
177
177
|
end
|
178
178
|
|
179
179
|
next if intersection_point.nil?
|
180
180
|
|
181
181
|
intersection_point.apply_matrix4(@matrix_world)
|
182
182
|
|
183
|
-
distance =
|
183
|
+
distance = raycaster.ray.origin.distance_to(intersection_point)
|
184
184
|
|
185
185
|
next if distance < precision || distance < raycaster.near || distance > raycaster.far
|
186
186
|
|
@@ -269,10 +269,7 @@ module Mittsu
|
|
269
269
|
protected
|
270
270
|
|
271
271
|
def jsonify
|
272
|
-
|
273
|
-
data[:geometry] = jsonify_geometry(@geometry)
|
274
|
-
data[:material] = jsonify_material(@material)
|
275
|
-
data
|
272
|
+
super
|
276
273
|
end
|
277
274
|
end
|
278
275
|
end
|
@@ -16,11 +16,11 @@ module Mittsu
|
|
16
16
|
|
17
17
|
def raycast(raycaster, intersects)
|
18
18
|
threshold = raycaster.params[:point_cloud][:threshold]
|
19
|
-
@_inverse_matrix.inverse(self.
|
19
|
+
@_inverse_matrix.inverse(self.matrix_world)
|
20
20
|
@_ray.copy(raycaster.ray).apply_matrix4(@_inverse_matrix)
|
21
21
|
|
22
22
|
if !geometry.bounding_box.nil?
|
23
|
-
return if
|
23
|
+
return if @_ray.intersection_box?(geometry.bounding_box) == false
|
24
24
|
end
|
25
25
|
|
26
26
|
local_threshold = threshold / ((self.scale.x + self.scale.y + self.scale.z) / 3.0)
|
@@ -82,7 +82,7 @@ module Mittsu
|
|
82
82
|
def test_point(point, index, local_threshold, raycaster, intersects)
|
83
83
|
ray_point_distance = @_ray.distance_to_point(point)
|
84
84
|
if ray_point_distance < local_threshold
|
85
|
-
intersect_point = @_ray.
|
85
|
+
intersect_point = @_ray.closest_point_to_point(point)
|
86
86
|
intersect_point.apply_matrix4(self.matrix_world)
|
87
87
|
|
88
88
|
distance = raycaster.ray.origin.distance_to(intersect_point)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
1
3
|
module Mittsu
|
2
4
|
module GenericLib
|
3
5
|
def discover
|
@@ -32,7 +34,8 @@ module Mittsu
|
|
32
34
|
|
33
35
|
class << self
|
34
36
|
def kernel_module_in_use
|
35
|
-
lspci_line =
|
37
|
+
lspci_line, stderr, _status = Open3.capture3("lspci -nnk | grep -i vga -A3 | grep 'in use'")
|
38
|
+
puts stderr if DEBUG
|
36
39
|
/in use:\s*(\S+)/ =~ lspci_line && $1
|
37
40
|
rescue
|
38
41
|
''
|
@@ -17,7 +17,9 @@ module Mittsu
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def ldconfig
|
20
|
-
|
20
|
+
out, stderr, _status = Open3.capture3("ldconfig -p | grep 'libglfw3\\?\\.so'")
|
21
|
+
puts stderr if DEBUG
|
22
|
+
out.lines
|
21
23
|
rescue
|
22
24
|
[]
|
23
25
|
end
|
@@ -25,17 +27,38 @@ module Mittsu
|
|
25
27
|
end
|
26
28
|
|
27
29
|
class Windows < GenericLib::Base
|
30
|
+
def file
|
31
|
+
'glfw3.dll'
|
32
|
+
end
|
28
33
|
end
|
29
34
|
|
30
35
|
class MacOS < GenericLib::Base
|
36
|
+
SEARCH_GLOBS = ['/usr/local/lib/**',
|
37
|
+
'/usr/lib/**',
|
38
|
+
'/opt/homebrew/**']
|
39
|
+
|
31
40
|
def path
|
32
|
-
|
41
|
+
File.dirname(match.to_s)
|
33
42
|
end
|
34
43
|
|
35
44
|
def file
|
36
|
-
|
37
|
-
return matches.find { |m| m == 'libglfw3.dylib' || m == 'libglfw.3.dylib' } || matches.first
|
45
|
+
File.basename(match.to_s)
|
38
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def match
|
51
|
+
@match ||= find_match
|
52
|
+
end
|
53
|
+
|
54
|
+
def find_match
|
55
|
+
SEARCH_GLOBS.each do |glob|
|
56
|
+
matches = Dir.glob("#{glob}/libglfw*.dylib")
|
57
|
+
next if matches.empty?
|
58
|
+
|
59
|
+
return matches.find { |m| m.end_with?('libglfw3.dylib') || m.end_with?('libglfw.3.dylib') } || matches.first
|
60
|
+
end
|
61
|
+
end
|
39
62
|
end
|
40
63
|
end
|
41
64
|
end
|
@@ -13,7 +13,7 @@ module Mittsu
|
|
13
13
|
class Window
|
14
14
|
attr_accessor :key_press_handler, :key_release_handler, :key_repeat_handler, :char_input_handler, :cursor_pos_handler, :mouse_button_press_handler, :mouse_button_release_handler, :scroll_handler, :framebuffer_size_handler
|
15
15
|
|
16
|
-
def initialize(width, height, title)
|
16
|
+
def initialize(width, height, title, antialias: 0)
|
17
17
|
glfwInit
|
18
18
|
|
19
19
|
glfwWindowHint GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE
|
@@ -22,6 +22,10 @@ module Mittsu
|
|
22
22
|
glfwWindowHint GLFW_CONTEXT_VERSION_MINOR, 3
|
23
23
|
glfwWindowHint GLFW_CONTEXT_REVISION, 0
|
24
24
|
|
25
|
+
if antialias > 0
|
26
|
+
glfwWindowHint GLFW_SAMPLES, antialias
|
27
|
+
end
|
28
|
+
|
25
29
|
@width, @height, @title = width, height, title
|
26
30
|
@handle = glfwCreateWindow(@width, @height, @title, nil, nil)
|
27
31
|
if @handle.null?
|
@@ -61,14 +61,14 @@ module Mittsu
|
|
61
61
|
glTexParameteri(texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
|
62
62
|
|
63
63
|
if wrap_s != ClampToEdgeWrapping || wrap_t != ClampToEdgeWrapping
|
64
|
-
puts "WARNING: Mittsu::Texture: Texture is not power of two. Texture.wrap_s and Texture.wrap_t should be set to Mittsu::ClampToEdgeWrapping. (#{
|
64
|
+
puts "WARNING: Mittsu::Texture: Texture is not power of two. Texture.wrap_s and Texture.wrap_t should be set to Mittsu::ClampToEdgeWrapping. (#{source_file})"
|
65
65
|
end
|
66
66
|
|
67
67
|
glTexParameteri(texture_type, GL_TEXTURE_MAG_FILTER, filter_fallback(mag_filter))
|
68
68
|
glTexParameteri(texture_type, GL_TEXTURE_MIN_FILTER, filter_fallback(min_filter))
|
69
69
|
|
70
70
|
if min_filter != NearestFilter && min_filter != LinearFilter
|
71
|
-
puts "WARNING: Mittsu::Texture: Texture is not a power of two. Texture.min_filter should be set to Mittsu::NearestFilter or Mittsu::LinearFilter. (#{
|
71
|
+
puts "WARNING: Mittsu::Texture: Texture is not a power of two. Texture.min_filter should be set to Mittsu::NearestFilter or Mittsu::LinearFilter. (#{source_file})"
|
72
72
|
end
|
73
73
|
|
74
74
|
# TODO: anisotropic extension ???
|
@@ -35,7 +35,7 @@ module Mittsu
|
|
35
35
|
attr_reader :logarithmic_depth_buffer, :programs, :light_renderer, :proj_screen_matrix
|
36
36
|
|
37
37
|
def initialize(parameters = {})
|
38
|
-
puts "
|
38
|
+
puts "Mittsu OpenGL Renderer #{VERSION}"
|
39
39
|
|
40
40
|
fetch_parameters(parameters)
|
41
41
|
|
@@ -935,14 +935,14 @@ module Mittsu
|
|
935
935
|
@_alpha = parameters.fetch(:alpha, false)
|
936
936
|
@_depth = parameters.fetch(:depth, true)
|
937
937
|
@_stencil = parameters.fetch(:stencil, true)
|
938
|
-
@_antialias = parameters.fetch(:antialias, false)
|
939
938
|
@_premultiplied_alpha = parameters.fetch(:premultiplied_alpha, true)
|
940
939
|
@_preserve_drawing_buffer = parameters.fetch(:preserve_drawing_buffer, false)
|
941
940
|
@logarithmic_depth_buffer = parameters.fetch(:logarithmic_depth_buffer, false)
|
942
941
|
|
943
942
|
@width = parameters.fetch(:width, 800)
|
944
943
|
@height = parameters.fetch(:height, 600)
|
945
|
-
@title = parameters.fetch(:title, "Mittsu #{
|
944
|
+
@title = parameters.fetch(:title, "Mittsu #{VERSION}")
|
945
|
+
@antialias = parameters.fetch(:antialias, 0)
|
946
946
|
end
|
947
947
|
|
948
948
|
def get_gpu_capabilities
|
@@ -974,7 +974,7 @@ module Mittsu
|
|
974
974
|
# preserve_drawing_buffer: _preserve_drawing_buffer
|
975
975
|
# }
|
976
976
|
|
977
|
-
@window = GLFW::Window.new(@width, @height, @title)
|
977
|
+
@window = GLFW::Window.new(@width, @height, @title, antialias: @antialias)
|
978
978
|
|
979
979
|
default_target.set_viewport_size(*(@window.framebuffer_size))
|
980
980
|
|
data/lib/mittsu/version.rb
CHANGED
data/mittsu.gemspec
CHANGED
@@ -6,15 +6,15 @@ require 'mittsu/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "mittsu"
|
8
8
|
spec.version = Mittsu::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["
|
9
|
+
spec.authors = ["Danielle Smith"]
|
10
|
+
spec.email = ["danini@hey.com"]
|
11
11
|
|
12
12
|
spec.summary = %q{3D Graphics Library for Ruby}
|
13
13
|
spec.description = %q{Mittsu makes 3D graphics easier by providing an abstraction over OpenGL, and is based heavily off of THREE.js. No more weird pointers and wondering about the difference between a VAO and a VBO (besides the letter). Simply think of something awesome and make it!}
|
14
|
-
spec.homepage = "https://github.com/
|
14
|
+
spec.homepage = "https://github.com/danini-the-panini/mittsu"
|
15
15
|
spec.license = "MIT"
|
16
16
|
spec.metadata = {
|
17
|
-
"bug_tracker" => "https://github.com/
|
17
|
+
"bug_tracker" => "https://github.com/danini-the-panini/mittsu/issues"
|
18
18
|
}
|
19
19
|
|
20
20
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{(^(test|examples)/|\.sh$)}) }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mittsu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Danielle Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: opengl-bindings
|
@@ -155,7 +155,7 @@ description: Mittsu makes 3D graphics easier by providing an abstraction over Op
|
|
155
155
|
the difference between a VAO and a VBO (besides the letter). Simply think of something
|
156
156
|
awesome and make it!
|
157
157
|
email:
|
158
|
-
-
|
158
|
+
- danini@hey.com
|
159
159
|
executables: []
|
160
160
|
extensions: []
|
161
161
|
extra_rdoc_files: []
|
@@ -406,11 +406,11 @@ files:
|
|
406
406
|
- lib/mittsu/utils.rb
|
407
407
|
- lib/mittsu/version.rb
|
408
408
|
- mittsu.gemspec
|
409
|
-
homepage: https://github.com/
|
409
|
+
homepage: https://github.com/danini-the-panini/mittsu
|
410
410
|
licenses:
|
411
411
|
- MIT
|
412
412
|
metadata:
|
413
|
-
bug_tracker: https://github.com/
|
413
|
+
bug_tracker: https://github.com/danini-the-panini/mittsu/issues
|
414
414
|
post_install_message:
|
415
415
|
rdoc_options: []
|
416
416
|
require_paths:
|
@@ -427,7 +427,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
427
427
|
version: '0'
|
428
428
|
requirements:
|
429
429
|
- OpenGL 3.3+ capable hardware and drivers
|
430
|
-
rubygems_version: 3.
|
430
|
+
rubygems_version: 3.5.23
|
431
431
|
signing_key:
|
432
432
|
specification_version: 4
|
433
433
|
summary: 3D Graphics Library for Ruby
|