Skip to content

Commit 5537319

Browse files
committed
hemesh
1 parent c9d9bd3 commit 5537319

File tree

7 files changed

+384
-0
lines changed

7 files changed

+384
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# HE_Mesh
2+
3+
Is 3D Geometry java library for processing by [Frederik Vanhoutte](http://www.wblut.com/) see http://www.wblut.com/he_mesh/ sketches in this folder are expected to work with version 5.0.3. The library has changed a lot over the years and not necessarily for the better (dependencies seem to be expanding exponentially, this cannot be a good thing, just look at the disaster that is ruby-on-rails)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/usr/bin/env jruby -v -W2
2+
# frozen_string_literal: true
3+
require 'propane'
4+
require 'arcball'
5+
6+
# Catmull Example class
7+
class HES_CatmullClarkExample < Propane::App
8+
load_library :hemesh
9+
java_import 'wblut.processing.WB_Render'
10+
include_package 'wblut.hemesh'
11+
attr_reader :mesh, :render
12+
13+
def setup
14+
sketch_title 'HES_CatmullClark Example'
15+
Processing::ArcBall.init(self)
16+
create_mesh
17+
subdividor = HES_CatmullClark.new
18+
.set_keep_boundary(true) # preserve position of vertices on a surface boundary
19+
.set_keep_edges(true) # preserve position of vertices on edge of selection (only useful if using subdivideSelected)
20+
mesh.subdivide(subdividor, 3)
21+
@render = WB_Render.new(self)
22+
end
23+
24+
def draw
25+
background(55)
26+
directional_light(255, 255, 255, 1, 1, -1)
27+
directional_light(127, 127, 127, -1, -1, 1)
28+
fill(255)
29+
noStroke
30+
render.draw_faces(mesh)
31+
stroke(0)
32+
render.draw_edges(mesh)
33+
end
34+
35+
def create_mesh
36+
creator = HEC_Cylinder.new
37+
.set_facets(6)
38+
.set_steps(1)
39+
.set_radius(250)
40+
.set_height(500)
41+
.set_cap(true, false)
42+
@mesh = HE_Mesh.new(creator)
43+
end
44+
45+
def settings
46+
size(1000, 1000, P3D)
47+
smooth(8)
48+
end
49+
end
50+
51+
HES_CatmullClarkExample.new
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/usr/bin/env jruby -v -W2
2+
# frozen_string_literal: true
3+
require 'propane'
4+
require 'arcball'
5+
6+
# DooSabin Example class
7+
class HES_DooSabinExample < Propane::App
8+
load_library :hemesh
9+
java_import 'wblut.processing.WB_Render' # ren
10+
include_package 'wblut.hemesh'
11+
attr_reader :mesh, :render
12+
13+
def setup
14+
sketch_title 'HES_DooSabin Example'
15+
Processing::ArcBall.init(self)
16+
create_mesh
17+
# HEC_Doo_sabin only support closed meshes.
18+
subdividor = HES_DooSabin.new
19+
.set_factors(1.0, 1.0)# Relative importance of edges vs. face. Default (1.0,1.0)
20+
.set_absolute(false)# Specify offset relative or absolute
21+
.set_distance(50.0)# Specify distance when absolute, will be multiplied with factors
22+
mesh.subdivide(subdividor, 2)
23+
@render = WB_Render.new(self)
24+
end
25+
26+
def draw
27+
background(120)
28+
directional_light(255, 255, 255, 1, 1, -1)
29+
directional_light(127, 127, 127, -1, -1, 1)
30+
fill(255)
31+
no_stroke
32+
render.draw_faces(mesh)
33+
stroke(0)
34+
render.draw_edges(mesh)
35+
end
36+
37+
def create_mesh
38+
creator = HEC_Box.new(100, 200, 400, 1, 2, 4)
39+
@mesh = HE_Mesh.new(creator)
40+
mesh.modify(HEM_Noise.new.set_distance(20))
41+
end
42+
43+
def settings
44+
size(800, 800, P3D)
45+
smooth(8)
46+
end
47+
end
48+
49+
HES_DooSabinExample.new
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#!/usr/bin/env jruby -v -W2
2+
# frozen_string_literal: true
3+
require 'propane'
4+
require 'arcball'
5+
6+
# HalfEdgeMirror class
7+
class HalfEdgeMirror < Propane::App
8+
load_library :hemesh
9+
include_package 'wblut.math'
10+
include_package 'wblut.processing'
11+
include_package 'wblut.core'
12+
include_package 'wblut.hemesh'
13+
include_package 'wblut.geom'
14+
attr_reader :mesh, :render, :plane, :plane2, :plane3, :modifier
15+
16+
def settings
17+
size(1000, 1000, P3D)
18+
smooth(8)
19+
end
20+
21+
def setup
22+
sketch_title 'Half Edge Mirror'
23+
Processing::ArcBall.init(self)
24+
create_mesh
25+
@modifier = HEM_Mirror.new
26+
@plane = WB_Plane.new(0, 0, 0, 0, 1, 1)
27+
modifier.set_plane(plane)
28+
modifier.set_offset(0)
29+
modifier.set_reverse(false)
30+
mesh.modify(modifier)
31+
@plane2 = WB_Plane.new(0, 0, 0, 1, -1, 1)
32+
modifier.set_plane(plane2) # mirror plane
33+
mesh.modify(modifier)
34+
@plane3 = WB_Plane.new(-80, 0, 0, 1, 0, 0)
35+
modifier.set_plane(plane3) # mirror plane
36+
mesh.modify(modifier)
37+
mesh.validate
38+
@render = WB_Render.new(self)
39+
end
40+
41+
def draw
42+
background(120)
43+
setup_lights
44+
fill(255)
45+
no_stroke
46+
render.draw_faces(mesh)
47+
no_fill
48+
stroke(0, 50)
49+
render.draw_edges(mesh)
50+
stroke(255, 0, 0)
51+
render.draw_plane(@plane, 300)
52+
render.draw_plane(@plane2, 300)
53+
render.draw_plane(@plane3, 300)
54+
end
55+
56+
def create_mesh
57+
@mesh = HE_Mesh.new(HEC_Beethoven.new.set_scale(10))
58+
end
59+
60+
def setup_lights
61+
lights
62+
directional_light(255, 255, 255, 1, 1, -1)
63+
directional_light(127, 127, 127, -1, -1, 1)
64+
end
65+
end
66+
67+
HalfEdgeMirror.new
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#!/usr/bin/env jruby -v -W2
2+
# frozen_string_literal: true
3+
require 'propane'
4+
class Simplify < Propane::App
5+
load_library :hemesh
6+
include_package 'wblut.math'
7+
include_package 'wblut.processing'
8+
include_package 'wblut.core'
9+
include_package 'wblut.hemesh'
10+
include_package 'wblut.geom'
11+
12+
attr_reader :mesh, :render, :old_mesh
13+
14+
def settings
15+
size(1000, 1000, P3D)
16+
smooth(8)
17+
end
18+
19+
def setup
20+
sketch_title 'Simplify'
21+
create_mesh
22+
@render = WB_Render.new(self)
23+
text_align(CENTER)
24+
text_size(16)
25+
end
26+
27+
def draw
28+
background(120)
29+
translate(width / 2, height / 2)
30+
setup_lights
31+
fill(255)
32+
no_stroke
33+
text('Click to reduce number of faces by 10%.', 0, 470);
34+
render.draw_faces(mesh)
35+
stroke(255, 0, 0, 100)
36+
render.draw_edges(old_mesh)
37+
stroke(0)
38+
render.draw_edges(mesh)
39+
end
40+
41+
def create_mesh
42+
creator = HEC_Beethoven.new
43+
.set_scale(10)
44+
.set_zaxis(0, -1, 0)
45+
@mesh = HE_Mesh.new(creator)
46+
@old_mesh = mesh.get
47+
end
48+
49+
def setup_lights
50+
lights
51+
directional_light(255, 255, 255, 1, 1, -1)
52+
directional_light(127, 127, 127, -1, -1, 1)
53+
end
54+
55+
def mouse_pressed
56+
mesh.simplify(HES_TriDec.new.set_goal(0.9))
57+
end
58+
end
59+
60+
Simplify.new
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env jruby -v -W2
2+
# frozen_string_literal: true
3+
require 'propane'
4+
require 'arcball'
5+
6+
# SprayNozzle class
7+
class SprayNozzle < Propane::App
8+
load_library :hemesh
9+
java_import 'wblut.processing.WB_Render' # ren
10+
include_package 'wblut.hemesh'
11+
include_package 'wblut.geom'
12+
13+
attr_reader :mesh, :tree, :render, :modifier, :rnds, :random_ray, :growing
14+
15+
def setup
16+
sketch_title 'Spray Nozzle'
17+
Processing::ArcBall.init(self)
18+
@rnds = WB_RandomOnSphere.new
19+
create_mesh
20+
@render = WB_Render.new(self)
21+
@growing = true
22+
end
23+
24+
def draw
25+
background(55)
26+
directional_light(255, 255, 255, 1, 1, -1)
27+
directional_light(127, 127, 127, -1, -1, 1)
28+
fill(255)
29+
no_stroke
30+
render.draw_faces(mesh)
31+
no_fill
32+
stroke(0, 50)
33+
render.draw_edges(mesh)
34+
fill(255, 0, 0)
35+
stroke(255, 0, 0)
36+
if growing
37+
20.times do
38+
grow
39+
end
40+
end
41+
return unless frame_count == 100
42+
mesh.subdivide(HES_CatmullClark.new)
43+
@growing = false
44+
end
45+
46+
def create_mesh
47+
u = 6
48+
v = 12
49+
creator = HEC_Torus.new(50, 150, u, v)
50+
@mesh = HE_Mesh.new(creator)
51+
creator = HEC_Torus.new(40, -150, u, v)
52+
mesh.add(HE_Mesh.new(creator))
53+
@tree = WB_AABBTree.new(mesh, 10)
54+
end
55+
56+
def grow
57+
@random_ray = WB_Ray.new(WB_Point.new(0, 0, -150), WB_Vector.new(rand(-1.0..1), rand(-1.0..1), rand(-1.0..1)))
58+
fint = HET_MeshOp.get_furthest_intersection(tree, random_ray)
59+
return unless fint
60+
point = fint.point
61+
point.add_mul_self(50, random_ray.get_direction)
62+
HEM_TriSplit.splitFaceTri(mesh, fint.face, point)
63+
@tree = WB_AABBTree.new(mesh, 10)
64+
end
65+
66+
def settings
67+
size(1000, 1000, P3D)
68+
smooth(8)
69+
end
70+
end
71+
72+
SprayNozzle.new
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#!/usr/bin/env jruby -v -W2
2+
# frozen_string_literal: true
3+
require 'propane'
4+
require 'arcball'
5+
6+
# TwinIso class
7+
class TwinIso < Propane::App
8+
load_libraries :hemesh
9+
java_import 'wblut.processing.WB_Render'
10+
java_import 'wblut.hemesh.HEC_IsoSurface'
11+
java_import 'wblut.hemesh.HE_Mesh'
12+
java_import 'wblut.hemesh.HEM_Smooth'
13+
14+
RES ||= 20
15+
16+
attr_reader :mesh, :inv_mesh, :render
17+
18+
def setup
19+
sketch_title 'Twin Iso'
20+
Processing::ArcBall.init(self)
21+
values = [] # build a multi-dimensional array in ruby
22+
(0..RES).each do |i| # the inclusive range is intentional here
23+
valu = []
24+
(0..RES).each do |j|
25+
val = []
26+
(0..RES).each do |k|
27+
val << 2.1 * noise(0.35 * i, 0.35 * j, 0.35 * k)
28+
end
29+
valu << val
30+
end
31+
values << valu
32+
end
33+
34+
creator = HEC_IsoSurface.new
35+
creator.set_resolution(RES, RES, RES) # number of cells in x,y,z direction
36+
creator.set_size(400.0 / RES, 400.0 / RES, 400.0 / RES) # cell size
37+
# JRuby requires a bit of help to determine correct 'java args', particulary with
38+
# overloaded arrays args as seen below. Note we are saying we have an 'array' of
39+
# 'float array' here, where the values can also be double[][][].
40+
java_values = values.to_java(Java::float[][]) # pre-coerce values to java
41+
creator.set_values(java_values) # the grid points
42+
creator.set_isolevel(1) # isolevel to mesh
43+
creator.set_invert(false) # invert mesh
44+
creator.set_boundary(100) # value of isoFunction outside grid
45+
# use creator.clear_boundary to set boundary values to "no value".
46+
# A boundary value of "no value" results in an open mesh
47+
@mesh = HE_Mesh.new(creator)
48+
# mesh.modify(HEM_Smooth.new.set_iterations(10).setAutoRescale(true))
49+
creator.set_invert(true)
50+
@inv_mesh = HE_Mesh.new(creator)
51+
inv_mesh.modify(HEM_Smooth.new.set_iterations(10).set_auto_rescale(true))
52+
@render = WB_Render.new(self)
53+
end
54+
55+
def settings
56+
size 800, 800, P3D
57+
smooth(8)
58+
end
59+
60+
def draw
61+
background(200)
62+
lights
63+
define_lights
64+
no_stroke
65+
fill(255, 0, 0)
66+
render.draw_faces(inv_mesh)
67+
stroke(0)
68+
render.draw_edges(mesh)
69+
stroke(255, 0, 0, 80)
70+
render.draw_edges(inv_mesh)
71+
end
72+
73+
def define_lights
74+
ambient(80, 80, 80)
75+
ambient_light(80, 80, 80)
76+
point_light(30, 30, 30, 0, 0, 1)
77+
directional_light(40, 40, 50, 0, 0, 1)
78+
spot_light(30, 30, 30, 0, 40, 200, 0, -0.5, 0.5, PI / 2, 2)
79+
end
80+
end
81+
82+
TwinIso.new

0 commit comments

Comments
 (0)