mittsu 0.4.0 → 0.5.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.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build-workflow.yml +5 -44
  3. data/Gemfile +0 -4
  4. data/README.md +16 -130
  5. data/bin/console +0 -4
  6. data/lib/mittsu/cameras/cube_camera.rb +1 -1
  7. data/lib/mittsu/core/geometry.rb +3 -3
  8. data/lib/mittsu/core/object_3d.rb +29 -47
  9. data/lib/mittsu/core/uniform.rb +23 -0
  10. data/lib/mittsu/core.rb +1 -0
  11. data/lib/mittsu/loaders/obj_loader.rb +11 -5
  12. data/lib/mittsu/loaders/stl_loader.rb +186 -0
  13. data/lib/mittsu/loaders.rb +1 -0
  14. data/lib/mittsu/math/box3.rb +4 -4
  15. data/lib/mittsu/objects/line.rb +1 -3
  16. data/lib/mittsu/objects/mesh.rb +9 -12
  17. data/lib/mittsu/objects/point_cloud.rb +3 -3
  18. data/lib/mittsu/textures/render_target.rb +93 -0
  19. data/lib/mittsu/textures/render_target_cube.rb +8 -0
  20. data/lib/mittsu/textures/texture.rb +1 -1
  21. data/lib/mittsu/textures.rb +2 -0
  22. data/lib/mittsu/version.rb +1 -1
  23. data/lib/mittsu.rb +0 -1
  24. data/mittsu.gemspec +8 -12
  25. metadata +33 -204
  26. data/install-glfw.ps1 +0 -13
  27. data/lib/mittsu/renderers/generic_lib.rb +0 -122
  28. data/lib/mittsu/renderers/glfw_lib.rb +0 -62
  29. data/lib/mittsu/renderers/glfw_window.rb +0 -233
  30. data/lib/mittsu/renderers/opengl/core/buffer_geometry.rb +0 -11
  31. data/lib/mittsu/renderers/opengl/core/geometry.rb +0 -346
  32. data/lib/mittsu/renderers/opengl/core/object_3d.rb +0 -134
  33. data/lib/mittsu/renderers/opengl/lights/ambient_light.rb +0 -26
  34. data/lib/mittsu/renderers/opengl/lights/directional_light.rb +0 -35
  35. data/lib/mittsu/renderers/opengl/lights/hemisphere_light.rb +0 -39
  36. data/lib/mittsu/renderers/opengl/lights/light.rb +0 -55
  37. data/lib/mittsu/renderers/opengl/lights/point_light.rb +0 -36
  38. data/lib/mittsu/renderers/opengl/lights/spot_light.rb +0 -47
  39. data/lib/mittsu/renderers/opengl/materials/line_basic_material.rb +0 -16
  40. data/lib/mittsu/renderers/opengl/materials/material.rb +0 -274
  41. data/lib/mittsu/renderers/opengl/materials/mesh_basic_material.rb +0 -21
  42. data/lib/mittsu/renderers/opengl/materials/mesh_lambert_material.rb +0 -33
  43. data/lib/mittsu/renderers/opengl/materials/mesh_phong_material.rb +0 -44
  44. data/lib/mittsu/renderers/opengl/materials/opengl_material_basics.rb +0 -57
  45. data/lib/mittsu/renderers/opengl/materials/point_cloud_material.rb +0 -27
  46. data/lib/mittsu/renderers/opengl/materials/shader_material.rb +0 -11
  47. data/lib/mittsu/renderers/opengl/objects/group.rb +0 -9
  48. data/lib/mittsu/renderers/opengl/objects/line.rb +0 -45
  49. data/lib/mittsu/renderers/opengl/objects/mesh.rb +0 -70
  50. data/lib/mittsu/renderers/opengl/objects/point_cloud.rb +0 -39
  51. data/lib/mittsu/renderers/opengl/objects/sprite.rb +0 -12
  52. data/lib/mittsu/renderers/opengl/opengl_buffer.rb +0 -13
  53. data/lib/mittsu/renderers/opengl/opengl_debug.rb +0 -81
  54. data/lib/mittsu/renderers/opengl/opengl_default_target.rb +0 -50
  55. data/lib/mittsu/renderers/opengl/opengl_geometry_group.rb +0 -758
  56. data/lib/mittsu/renderers/opengl/opengl_geometry_like.rb +0 -132
  57. data/lib/mittsu/renderers/opengl/opengl_helper.rb +0 -161
  58. data/lib/mittsu/renderers/opengl/opengl_implementations.rb +0 -37
  59. data/lib/mittsu/renderers/opengl/opengl_lib.rb +0 -19
  60. data/lib/mittsu/renderers/opengl/opengl_light_renderer.rb +0 -43
  61. data/lib/mittsu/renderers/opengl/opengl_mittsu_params.rb +0 -53
  62. data/lib/mittsu/renderers/opengl/opengl_program.rb +0 -250
  63. data/lib/mittsu/renderers/opengl/opengl_shader.rb +0 -58
  64. data/lib/mittsu/renderers/opengl/opengl_state.rb +0 -205
  65. data/lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb +0 -417
  66. data/lib/mittsu/renderers/opengl/plugins/sprite_fragment.glsl +0 -38
  67. data/lib/mittsu/renderers/opengl/plugins/sprite_plugin.rb +0 -250
  68. data/lib/mittsu/renderers/opengl/plugins/sprite_vertex.glsl +0 -31
  69. data/lib/mittsu/renderers/opengl/scenes/scene.rb +0 -9
  70. data/lib/mittsu/renderers/opengl/textures/compressed_texture.rb +0 -20
  71. data/lib/mittsu/renderers/opengl/textures/cube_texture.rb +0 -77
  72. data/lib/mittsu/renderers/opengl/textures/data_texture.rb +0 -21
  73. data/lib/mittsu/renderers/opengl/textures/texture.rb +0 -107
  74. data/lib/mittsu/renderers/opengl_render_target.rb +0 -201
  75. data/lib/mittsu/renderers/opengl_renderer.rb +0 -1028
  76. data/lib/mittsu/renderers/shaders/rbsl_loader.rb +0 -166
  77. data/lib/mittsu/renderers/shaders/shader_chunk/alphamap_fragment.glsl +0 -5
  78. data/lib/mittsu/renderers/shaders/shader_chunk/alphamap_pars_fragment.glsl +0 -5
  79. data/lib/mittsu/renderers/shaders/shader_chunk/alphatest_fragment.glsl +0 -5
  80. data/lib/mittsu/renderers/shaders/shader_chunk/bumpmap_pars_fragment.glsl +0 -40
  81. data/lib/mittsu/renderers/shaders/shader_chunk/color_fragment.glsl +0 -5
  82. data/lib/mittsu/renderers/shaders/shader_chunk/color_pars_fragment.glsl +0 -5
  83. data/lib/mittsu/renderers/shaders/shader_chunk/color_pars_vertex.glsl +0 -5
  84. data/lib/mittsu/renderers/shaders/shader_chunk/color_vertex.glsl +0 -5
  85. data/lib/mittsu/renderers/shaders/shader_chunk/common.glsl +0 -60
  86. data/lib/mittsu/renderers/shaders/shader_chunk/default_vertex.glsl +0 -15
  87. data/lib/mittsu/renderers/shaders/shader_chunk/defaultnormal_vertex.glsl +0 -21
  88. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_fragment.glsl +0 -62
  89. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_pars_fragment.glsl +0 -21
  90. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_pars_vertex.glsl +0 -7
  91. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_vertex.glsl +0 -17
  92. data/lib/mittsu/renderers/shaders/shader_chunk/fog_fragment.glsl +0 -26
  93. data/lib/mittsu/renderers/shaders/shader_chunk/fog_pars_fragment.glsl +0 -15
  94. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_fragment.glsl +0 -5
  95. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_pars_fragment.glsl +0 -6
  96. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_pars_vertex.glsl +0 -5
  97. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_vertex.glsl +0 -5
  98. data/lib/mittsu/renderers/shaders/shader_chunk/lights_lambert_pars_vertex.glsl +0 -43
  99. data/lib/mittsu/renderers/shaders/shader_chunk/lights_lambert_vertex.glsl +0 -196
  100. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_fragment.glsl +0 -243
  101. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_pars_fragment.glsl +0 -58
  102. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_pars_vertex.glsl +0 -5
  103. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_vertex.glsl +0 -5
  104. data/lib/mittsu/renderers/shaders/shader_chunk/linear_to_gamma_fragment.glsl +0 -2
  105. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_fragment.glsl +0 -5
  106. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_pars_fragment.glsl +0 -12
  107. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_pars_vertex.glsl +0 -11
  108. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_vertex.glsl +0 -15
  109. data/lib/mittsu/renderers/shaders/shader_chunk/map_fragment.glsl +0 -9
  110. data/lib/mittsu/renderers/shaders/shader_chunk/map_pars_fragment.glsl +0 -11
  111. data/lib/mittsu/renderers/shaders/shader_chunk/map_pars_vertex.glsl +0 -6
  112. data/lib/mittsu/renderers/shaders/shader_chunk/map_particle_fragment.glsl +0 -5
  113. data/lib/mittsu/renderers/shaders/shader_chunk/map_particle_pars_fragment.glsl +0 -6
  114. data/lib/mittsu/renderers/shaders/shader_chunk/map_vertex.glsl +0 -5
  115. data/lib/mittsu/renderers/shaders/shader_chunk/morphnormal_vertex.glsl +0 -12
  116. data/lib/mittsu/renderers/shaders/shader_chunk/morphtarget_pars_vertex.glsl +0 -13
  117. data/lib/mittsu/renderers/shaders/shader_chunk/morphtarget_vertex.glsl +0 -20
  118. data/lib/mittsu/renderers/shaders/shader_chunk/normalmap_pars_fragment.glsl +0 -27
  119. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_fragment.glsl +0 -216
  120. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_pars_fragment.glsl +0 -19
  121. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_pars_vertex.glsl +0 -6
  122. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_vertex.glsl +0 -9
  123. data/lib/mittsu/renderers/shaders/shader_chunk/skinbase_vertex.glsl +0 -8
  124. data/lib/mittsu/renderers/shaders/shader_chunk/skinning_pars_vertex.glsl +0 -47
  125. data/lib/mittsu/renderers/shaders/shader_chunk/skinning_vertex.glsl +0 -20
  126. data/lib/mittsu/renderers/shaders/shader_chunk/skinnormal_vertex.glsl +0 -20
  127. data/lib/mittsu/renderers/shaders/shader_chunk/specularmap_fragment.glsl +0 -12
  128. data/lib/mittsu/renderers/shaders/shader_chunk/specularmap_pars_fragment.glsl +0 -5
  129. data/lib/mittsu/renderers/shaders/shader_chunk/worldpos_vertex.glsl +0 -17
  130. data/lib/mittsu/renderers/shaders/shader_chunk.rb +0 -9
  131. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_fragment.rbsl +0 -37
  132. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_uniforms.rbslu +0 -3
  133. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_vertex.rbsl +0 -33
  134. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_fragment.rbsl +0 -12
  135. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_uniforms.rbslu +0 -2
  136. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_vertex.rbsl +0 -12
  137. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_fragment.rbsl +0 -26
  138. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_uniforms.rbslu +0 -0
  139. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_vertex.rbsl +0 -12
  140. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_fragment.rbsl +0 -56
  141. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_uniforms.rbslu +0 -7
  142. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_vertex.rbsl +0 -37
  143. data/lib/mittsu/renderers/shaders/shader_lib/particle_basic/particle_basic_fragment.rbsl +0 -27
  144. data/lib/mittsu/renderers/shaders/shader_lib/particle_basic/particle_basic_uniforms.rbslu +0 -2
  145. data/lib/mittsu/renderers/shaders/shader_lib/particle_basic/particle_basic_vertex.rbsl +0 -25
  146. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_fragment.rbsl +0 -45
  147. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_uniforms.rbslu +0 -11
  148. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_vertex.rbsl +0 -43
  149. data/lib/mittsu/renderers/shaders/shader_lib.rb +0 -43
  150. data/lib/mittsu/renderers/shaders/shader_templates/fragment.glsl.erb +0 -105
  151. data/lib/mittsu/renderers/shaders/shader_templates/vertex.glsl.erb +0 -143
  152. data/lib/mittsu/renderers/shaders/uniforms_lib.rb +0 -106
  153. data/lib/mittsu/renderers/shaders/uniforms_utils.rb +0 -31
  154. data/lib/mittsu/renderers.rb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3a8c66b2c63737be22e4495e20bc62888391dc63907e604d31eb8cbbf5fa432
4
- data.tar.gz: f88e54369ac3e9c2b0534135f485310469d5dd37889504cf049eb23223cf0f2a
3
+ metadata.gz: 620d1bf034251f9514abec4fb1e28357bccbe984f517d6763c5f1e544e3c9728
4
+ data.tar.gz: 157868417127b487b51b8ccbc1bfa901063f557915a3f0f66f43f0a6cfe600da
5
5
  SHA512:
6
- metadata.gz: ea2ee4ab085e40061f432ed835f8f40948557467f85f33b7b4238a2d18cc4756ac43bb052d6631e4d8707f62d1ebce382cf5790727c28b257b73f71a08446458
7
- data.tar.gz: fb77a518a9002b201a52590be84e13b9b57c1716b2e13d5c38b0d81265c6c26d8e440fb700d92e3759f8bfbd5323435c28dd780497da133fba4a09023800b3fd
6
+ metadata.gz: 611d3f4d2aa790e21f04cd22b45b3a8ed3901dbc60e97e1a2f72574bdb846d12773b552397131cda37471f39ed97d4702f0976ca83438d2202f1439e0e722b6e
7
+ data.tar.gz: 0d2fd2ab7d43a2ebbe523103b33fc1ce8a0bcd3ce046f2c82fd2e633e8e2b6b80cfede3ffc7758a82d753d69afb7f75c3ce49f69aa278161dbb1586603c017a6
@@ -8,24 +8,20 @@ on:
8
8
  - main
9
9
 
10
10
  jobs:
11
- linux:
12
- name: Linux
11
+ test:
12
+ name: Test
13
13
  runs-on: ubuntu-latest
14
14
  strategy:
15
15
  matrix:
16
- ruby: ['2.6', '2.7', '3.0', '3.1', 'head']
16
+ ruby: ['2.6', '2.7', '3.0', '3.1', '3.2', '3.3', 'head']
17
17
  steps:
18
- - uses: actions/checkout@v1
18
+ - uses: actions/checkout@v4
19
19
  - uses: ruby/setup-ruby@v1
20
20
  with:
21
21
  ruby-version: ${{ matrix.ruby }}
22
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
23
  - name: Test & publish code coverage
28
- uses: paambaati/codeclimate-action@v2.2.1
24
+ uses: paambaati/codeclimate-action@v9.0.0
29
25
  if: github.event_name == 'push'
30
26
  env:
31
27
  CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
@@ -34,38 +30,3 @@ jobs:
34
30
  - name: Test
35
31
  if: github.event_name != 'push'
36
32
  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/Gemfile CHANGED
@@ -1,7 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
-
5
- if /darwin/ === RUBY_PLATFORM
6
- gem 'ffi', '~> 1.9', '!= 1.11.1'
7
- end
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Mittsu
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/mittsu.svg)](https://badge.fury.io/rb/mittsu)
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)
4
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/339a016dc2e7fc51c82a/test_coverage)](https://codeclimate.com/github/danini-the-panini/mittsu/test_coverage)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/339a016dc2e7fc51c82a/maintainability)](https://codeclimate.com/github/danini-the-panini/mittsu/maintainability)
6
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)
7
7
 
8
8
  3D Graphics Library for Ruby
9
9
 
10
- Mittsu makes 3D graphics easier by providing an abstraction over OpenGL, and is based heavily off of [THREE.js](http://threejs.org). 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!
10
+ Mittsu is a 3D Graphics Library for Ruby, based heavily on Three.js
11
11
 
12
12
  ## GIFs!
13
13
 
@@ -19,26 +19,6 @@ Mittsu makes 3D graphics easier by providing an abstraction over OpenGL, and is
19
19
 
20
20
  ## Installation
21
21
 
22
- Install the prerequisites:
23
-
24
- Mittsu depends on Ruby 2.x, OpenGL 3.3+, and GLFW 3.1.x
25
-
26
- ```bash
27
- # OSX
28
- $ brew install glfw3
29
-
30
- # Ubuntu
31
- $ sudo apt-get install libglfw3
32
- ```
33
-
34
- **NOTE:** On Windows, you will have to manually specify the glfw3.dll path in an environment variable
35
- (you can download it [here](http://www.glfw.org/download.html))
36
- ```bash
37
- # ex) set MITTSU_LIBGLFW_PATH=C:\Users\username\lib-mingw-w64
38
- > set MITTSU_LIBGLFW_PATH=C:\path\to\glfw3.dll
39
- > ruby your_awesome_mittsu_app.rb
40
- ```
41
-
42
22
  Add this line to your application's Gemfile:
43
23
 
44
24
  ```ruby
@@ -55,22 +35,14 @@ Or install it yourself as:
55
35
 
56
36
  ## Usage
57
37
 
58
- ### tl;dr
59
-
60
- Copy-Paste and Run:
38
+ Create a basic scene with a perspective camera and a green box:
61
39
 
62
40
  ```ruby
63
41
  require 'mittsu'
64
42
 
65
- SCREEN_WIDTH = 800
66
- SCREEN_HEIGHT = 600
67
- ASPECT = SCREEN_WIDTH.to_f / SCREEN_HEIGHT.to_f
68
-
69
- renderer = Mittsu::OpenGLRenderer.new width: SCREEN_WIDTH, height: SCREEN_HEIGHT, title: 'Hello, World!'
70
-
71
43
  scene = Mittsu::Scene.new
72
44
 
73
- camera = Mittsu::PerspectiveCamera.new(75.0, ASPECT, 0.1, 1000.0)
45
+ camera = Mittsu::PerspectiveCamera.new(75.0, 1.0, 0.1, 1000.0)
74
46
  camera.position.z = 5.0
75
47
 
76
48
  box = Mittsu::Mesh.new(
@@ -79,116 +51,30 @@ box = Mittsu::Mesh.new(
79
51
  )
80
52
 
81
53
  scene.add(box)
82
-
83
- renderer.window.run do
84
- box.rotation.x += 0.1
85
- box.rotation.y += 0.1
86
-
87
- renderer.render(scene, camera)
88
- end
89
- ```
90
-
91
- ### Step by Step
92
-
93
- First, we need to require Mittsu in order to use it:
94
- ```ruby
95
- require 'mittsu'
96
- ```
97
-
98
- Then, we'll define some constants to help us with setting up our 3D environment:
99
- ```ruby
100
- SCREEN_WIDTH = 800
101
- SCREEN_HEIGHT = 600
102
- ASPECT = SCREEN_WIDTH.to_f / SCREEN_HEIGHT.to_f
103
- ```
104
-
105
- The aspect ratio will be used for setting up the camera later.
106
-
107
- Once we have all that we can create the canvas we will use to draw our graphics onto. In Mittsu this is called a renderer. It provides a window and an OpenGL context:
108
-
109
- ```ruby
110
- renderer = Mittsu::OpenGLRenderer.new width: SCREEN_WIDTH, height: SCREEN_HEIGHT, title: 'Hello, World!'
111
- ```
112
- This will give us an 800x600 window with the title `Hello, World!`.
113
-
114
- Now that we have our canvas, let's start setting up the scene we wish to draw onto it:
115
-
116
- ```ruby
117
- scene = Mittsu::Scene.new
118
54
  ```
119
55
 
120
- A scene is like a stage where all our 3D objects live and animate.
121
-
122
- We can't draw a 3D scene without knowing where we're looking:
123
-
124
- ```ruby
125
- camera = Mittsu::PerspectiveCamera.new(75.0, ASPECT, 0.1, 1000.0)
126
- ```
127
-
128
- This camera has a 75° field-of-view (FOV), the aspect ratio of the window (which we defined earlier), and shows everything between a distance of 0.1 to 1000.0 away from the camera.
129
-
130
- The camera starts off at the origin `[0,0,0]` and faces the negative Z-axis. We'll position it somewhere along the positive Z-axis so that it is looking at the center of the scene from a short distance:
56
+ ## More Resources
131
57
 
132
- ```ruby
133
- camera.position.z = 5.0
134
- ```
135
-
136
- Our scene isn't going to be very exciting if there is nothing in it, so we'll create a box:
137
-
138
- ```ruby
139
- box = Mittsu::Mesh.new(
140
- Mittsu::BoxGeometry.new(1.0, 1.0, 1.0),
141
- Mittsu::MeshBasicMaterial.new(color: 0x00ff00)
142
- )
143
- ```
144
-
145
- A `Mesh` in Mittsu is the combination of a `Geometry` (the shape of the object) and a `Material` (the "look" of the object). Here we've created a 1x1x1 box that is colored green.
146
-
147
- Box in hand, we make it part of our scene:
148
-
149
- ```ruby
150
- scene.add(box)
151
- ```
152
-
153
- Here comes the fun part... the render loop!
154
-
155
- ```ruby
156
- renderer.window.run do
157
- ```
158
-
159
- The given block is called every frame. This is where you can tell the renderer what scene to draw, and do any updates to the objects in your scene.
160
-
161
- Just to make things a bit more interesting, we'll make the box rotate around its X and Y axes, so that it spins like crazy.
162
-
163
- ```ruby
164
- box.rotation.x += 0.1
165
- box.rotation.y += 0.1
166
- ```
167
-
168
- Last but not least, we tell the renderer to draw our scene this frame, which will tell the graphics processor to draw our green box with its updated rotation.
169
-
170
- ```ruby
171
- renderer.render(scene, camera)
172
- ```
173
-
174
- Easy peasy! :)
58
+ Mittsu follows a similar structure to THREE.js, so you can generally use [the same documentation](http://threejs.org/docs/) for a description of the various classes and how they work.
175
59
 
176
- ```ruby
177
- end
178
- ```
60
+ If you want to actually render scenes, you'll need a renderer. There is a reference OpenGL renderer [here](https://github.com/danini-the-panini/mittsu-opengl).
179
61
 
62
+ ## See also
180
63
 
181
- ### More Resources
64
+ - [Tank Demo](https://github.com/danini-the-panini/mittsu-tank-demo)
65
+ - [OpenGL Renderer](https://github.com/danini-the-panini/mittsu-opengl)
66
+ - [Mesh Analysis](https://github.com/manyfold3d/mittsu-mesh_analysis)
67
+ - [3MF Support](https://github.com/manyfold3d/mittsu-3mf)
182
68
 
183
- Mittsu follows a similar structure to THREE.js, so you can generally use [the same documentation](http://threejs.org/docs/) for a description of the various classes and how they work.
69
+ ## Where is Mittsu used?
184
70
 
185
- If you just want to see what Mittsu can do and how to do it, take a peek inside the `examples` folder.
71
+ - [Manyfold](https://github.com/manyfold3d/manyfold) - A self-hosted digital asset manager for 3d print files.
186
72
 
187
73
  ## Where you can help
188
74
 
189
75
  1. Testing!
190
76
 
191
- Currently the only unit tests are for most of the maths library, otherwise the library is tested by running the examples and checking that they look correct.
77
+ Currently the only unit tests are for most of the maths library.
192
78
 
193
79
  2. Refactoring!
194
80
 
data/bin/console CHANGED
@@ -6,9 +6,5 @@ require "mittsu"
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
9
  require "irb"
14
10
  IRB.start
@@ -40,7 +40,7 @@ module Mittsu
40
40
  @camera_nz.look_at(Mittsu::Vector3.new(0.0, 0.0, -1.0))
41
41
  self.add(@camera_nz)
42
42
 
43
- @render_target = Mittsu::OpenGLRenderTargetCube(cube_resolution, cube_resolution, format: Mittsu::RGBFormat, mag_filter: Mittsu::LinearFilter, min_filter: Mittsu::LinearFilter)
43
+ @render_target = Mittsu::RenderTargetCube(cube_resolution, format: Mittsu::RGBFormat, mag_filter: Mittsu::LinearFilter, min_filter: Mittsu::LinearFilter)
44
44
  end
45
45
 
46
46
  def update_cube_map(renderer, scene)
@@ -397,7 +397,7 @@ module Mittsu
397
397
  end
398
398
 
399
399
  def merge_mesh(mesh)
400
- if mesh instanceof Mittsu::Mesh == false
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 << vertex.x << vertex.y << vertex.z
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
- @_output = {
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
- data = {
350
- uuid: @uuid,
351
- type: @type,
352
- matrix: @matrix.to_a
353
- }
354
- data[:name] = @name unless @name.nil? || @name.empty?
355
- data[:user_data] = @user_data unless @user_data.nil? || @user_data.empty?
356
- data[:visible] = @visible unless @visible
357
-
358
- if !self.children.empty?
359
- data[:children] = @children.map do |child|
360
- child.jsonify
361
- end
362
- end
363
-
364
- # TODO: implement jsonify for PointCloud
365
-
366
- data
367
- end
368
-
369
- def jsonify_geometry(geometry)
370
- @_output[:geometries] ||= []
371
- if @_geometries[geometry.uuid].nil?
372
- json = geometry.to_json
373
- json.delete :metadata
374
- @_geometries[geometry.uuid] = json
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
@@ -0,0 +1,23 @@
1
+ module Mittsu
2
+ class Uniform
3
+ attr_accessor :type, :value, :needs_update, :array
4
+
5
+ def initialize(type, value)
6
+ super()
7
+ @type, @value = type, value
8
+ @needs_update = nil
9
+ end
10
+
11
+ def clone
12
+ new_value = case self.value
13
+ when Color, Vector2, Vector3, Vector4, Matrix4#, Texture # TODO: when Texture exists
14
+ self.value.clone
15
+ when Array
16
+ self.value.dup
17
+ else
18
+ self.value
19
+ end
20
+ Uniform.new(self.type, new_value)
21
+ end
22
+ end
23
+ end
data/lib/mittsu/core.rb CHANGED
@@ -8,3 +8,4 @@ require "mittsu/core/geometry"
8
8
  require "mittsu/core/object_3d"
9
9
  require "mittsu/core/raycaster"
10
10
  require "mittsu/core/hash_array"
11
+ require "mittsu/core/uniform"
@@ -53,7 +53,7 @@ module Mittsu
53
53
 
54
54
  when FACE_PATTERN then parse_face(line)
55
55
 
56
- when OBJECT_PATTERN then new_object($1) and reset_vertices
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 new_object(object_name = '')
109
- end_object
110
- @object = Object3D.new
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
- new_object if @object.nil?
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
@@ -0,0 +1,186 @@
1
+ require 'stringio'
2
+
3
+ module Mittsu
4
+ class STLLoader
5
+ include EventDispatcher
6
+
7
+ FLOAT = /[\d|.|+|\-|e]+/
8
+ NORMAL_PATTERN = /normal\s+(#{FLOAT})\s+(#{FLOAT})\s+(#{FLOAT})/
9
+ VERTEX_PATTERN = /^\s*vertex\s+(#{FLOAT})\s+(#{FLOAT})\s+(#{FLOAT})/
10
+
11
+ def initialize(manager = DefaultLoadingManager)
12
+ @manager = manager
13
+ @_listeners = {}
14
+ end
15
+
16
+ def load(url)
17
+ loader = FileLoader.new(@manager)
18
+
19
+ data = loader.load(url)
20
+ parse(data)
21
+ end
22
+
23
+ def parse(data)
24
+ reset_loader_vars
25
+ stream = StringIO.new(data, "rb")
26
+ # Load STL header (first 80 bytes max)
27
+ header = stream.read(80)
28
+ if header.slice(0,5) === "solid"
29
+ stream.rewind
30
+ parse_ascii(stream)
31
+ else
32
+ parse_binary(stream)
33
+ end
34
+ @group
35
+ end
36
+
37
+ private
38
+
39
+ def reset_loader_vars
40
+ @vertex_hash = {}
41
+ @vertex_count = 0
42
+ @line_num = 0
43
+ @group = Group.new
44
+ end
45
+
46
+ def parse_ascii(stream)
47
+ while line = read_line(stream)
48
+ case line
49
+ when /^\s*solid/
50
+ parse_ascii_solid(stream)
51
+ else
52
+ raise_error
53
+ end
54
+ end
55
+ end
56
+
57
+ def parse_ascii_solid(stream)
58
+ vertices = []
59
+ faces = []
60
+ while line = read_line(stream)
61
+ case line
62
+ when /^\s*facet/
63
+ facet_vertices, face = parse_ascii_facet(line, stream)
64
+ vertices += facet_vertices
65
+ faces << face
66
+ when /^\s*endsolid/
67
+ break
68
+ else
69
+ raise_error
70
+ end
71
+ end
72
+ add_mesh vertices, faces
73
+ end
74
+
75
+ def parse_ascii_facet(line, stream)
76
+ vertices = []
77
+ normal = nil
78
+ if line.match NORMAL_PATTERN
79
+ normal = Vector3.new($1, $2, $3)
80
+ end
81
+ while line = read_line(stream)
82
+ case line
83
+ when /^\s*outer loop/
84
+ nil # Ignored
85
+ when /^\s*endloop/
86
+ nil # Ignored
87
+ when VERTEX_PATTERN
88
+ vertices << Vector3.new($1, $2, $3)
89
+ when /^\s*endfacet/
90
+ break
91
+ else
92
+ raise_error
93
+ end
94
+ end
95
+ return nil if vertices.length != 3
96
+ # Merge with existing vertices
97
+ face, new_vertices = face_with_merged_vertices(vertices)
98
+ face.normal = normal
99
+ return new_vertices, face
100
+ end
101
+
102
+ def parse_binary(stream)
103
+ vertices = []
104
+ faces = []
105
+ num_faces = stream.read(4).unpack('L<').first
106
+ num_faces.times do |i|
107
+ # Face normal
108
+ normal = read_binary_vector(stream)
109
+ # Vertices
110
+ face_vertices = []
111
+ face_vertices << read_binary_vector(stream)
112
+ face_vertices << read_binary_vector(stream)
113
+ face_vertices << read_binary_vector(stream)
114
+ # Throw away the attribute bytes
115
+ stream.read(2)
116
+ # Store data
117
+ face, new_vertices = face_with_merged_vertices(face_vertices)
118
+ face.normal = normal
119
+ faces << face
120
+ vertices += new_vertices
121
+ end
122
+ add_mesh vertices, faces
123
+ end
124
+
125
+ def face_with_merged_vertices(vertices)
126
+ new_vertices = []
127
+ indices = []
128
+ vertices.each do |v|
129
+ index, is_new = vertex_index(v)
130
+ indices << index
131
+ if is_new
132
+ new_vertices << v
133
+ @vertex_count += 1
134
+ end
135
+ end
136
+ # Return face and new vertex list
137
+ return Face3.new(
138
+ indices[0],
139
+ indices[1],
140
+ indices[2]
141
+ ), new_vertices
142
+ end
143
+
144
+ def vertex_index(vertex)
145
+ key = vertex_key(vertex)
146
+ if i = @vertex_hash[key]
147
+ return i, false
148
+ else
149
+ return (@vertex_hash[key] = @vertex_count), true
150
+ end
151
+ end
152
+
153
+ def vertex_key(vertex)
154
+ vertex.elements.pack("D*")
155
+ end
156
+
157
+ def add_mesh(vertices, faces)
158
+ geometry = Geometry.new
159
+ geometry.vertices = vertices
160
+ geometry.faces = faces
161
+ geometry.compute_bounding_sphere
162
+ @group.add Mesh.new(geometry)
163
+ end
164
+
165
+ def read_binary_vector(stream)
166
+ Vector3.new(
167
+ read_le_float(stream),
168
+ read_le_float(stream),
169
+ read_le_float(stream)
170
+ )
171
+ end
172
+
173
+ def read_le_float(stream)
174
+ stream.read(4).unpack('e').first
175
+ end
176
+
177
+ def read_line(stream)
178
+ @line_num += 1
179
+ stream.gets
180
+ end
181
+
182
+ def raise_error
183
+ raise "Mittsu::STLLoader: Unhandled line #{@line_num}"
184
+ end
185
+ end
186
+ end
@@ -6,3 +6,4 @@ require 'mittsu/loaders/file_loader'
6
6
  require 'mittsu/loaders/obj_loader'
7
7
  require 'mittsu/loaders/mtl_loader'
8
8
  require 'mittsu/loaders/obj_mtl_loader'
9
+ require 'mittsu/loaders/stl_loader'