tweaks
This commit is contained in:
+33
-20
@@ -9,12 +9,13 @@ module MoonModel
|
||||
|
||||
def build(config, data_set)
|
||||
sizing = Sizing.calculate(config, data_set)
|
||||
interior = sizing.segmented? ? "hollow" : config["shell"]["interior"]
|
||||
diameter = sizing.datum_diameter_mm
|
||||
lon_segments = sizing.longitude_segments
|
||||
lat_segments = sizing.latitude_segments
|
||||
palette = Color.ordered_palette(config["palette"])
|
||||
ranges = sizing.segmented? ? section_ranges : [[-90.0, 90.0, 0.0, 360.0, "moon"]]
|
||||
parts = build_parts(config, data_set, diameter, ranges, lon_segments, lat_segments, palette)
|
||||
parts = build_parts(config, data_set, diameter, ranges, lon_segments, lat_segments, palette, interior)
|
||||
radius = diameter / 2.0
|
||||
all_meshes = parts.flat_map { |part| part[:meshes] }
|
||||
keys = sizing.segmented? ? build_keys(config, radius) : []
|
||||
@@ -36,6 +37,7 @@ module MoonModel
|
||||
"safe_exaggeration" => sizing.safe_exaggeration, "mode" => sizing.mode, "mode_source" => sizing.mode_source,
|
||||
"longitude_segments" => lon_segments,
|
||||
"latitude_segments" => lat_segments, "part_count" => parts.length,
|
||||
"interior" => interior,
|
||||
"minimum_radius_mm" => sizing.minimum_radius_mm,
|
||||
"maximum_radius_mm" => sizing.maximum_radius_mm,
|
||||
"relief_range_mm" => relief_range_mm(config, data_set, diameter),
|
||||
@@ -53,10 +55,10 @@ module MoonModel
|
||||
requested
|
||||
end
|
||||
|
||||
def build_parts(config, data_set, diameter, ranges, lon_segments, lat_segments, palette)
|
||||
def build_parts(config, data_set, diameter, ranges, lon_segments, lat_segments, palette, interior)
|
||||
radius = diameter / 2.0
|
||||
ranges.map do |lat0, lat1, lon0, lon1, name|
|
||||
build_patch(config, data_set, radius, lat0, lat1, lon0, lon1, name, lon_segments, lat_segments, palette)
|
||||
build_patch(config, data_set, radius, lat0, lat1, lon0, lon1, name, lon_segments, lat_segments, palette, interior)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -67,13 +69,14 @@ module MoonModel
|
||||
end
|
||||
end
|
||||
|
||||
def build_patch(config, data_set, radius, lat0, lat1, lon0, lon1, name, global_lon_segments, global_lat_segments, palette)
|
||||
def build_patch(config, data_set, radius, lat0, lat1, lon0, lon1, name, global_lon_segments, global_lat_segments, palette, interior)
|
||||
nlon = [(global_lon_segments * (lon1 - lon0) / 360.0).round, 2].max
|
||||
nlat = [(global_lat_segments * (lat1 - lat0) / 180.0).round, 2].max
|
||||
base = Mesh.new(name: "#{name}_structure", material: config["palette"].first)
|
||||
color_meshes = palette.to_h { |color| [color["name"], Mesh.new(name: "#{name}_#{slug(color["name"])}", material: color)] }
|
||||
multicolor = palette.length > 1
|
||||
unified_base = multicolor || !config["grid"]["enabled"]
|
||||
solid = interior == "solid"
|
||||
unified_base = solid || multicolor || !config["grid"]["enabled"]
|
||||
substrate_vertices = {}
|
||||
inner_vertices = {}
|
||||
boundary_edges = {}
|
||||
@@ -99,26 +102,35 @@ module MoonModel
|
||||
else
|
||||
0.0
|
||||
end
|
||||
substrate = coords.map { |lat, lon| point(config, data_set, radius, lat, lon, surface_offset) }
|
||||
inner = coords.map { |lat, lon| point(config, data_set, radius, lat, lon, -config["shell"]["wall_mm"]) }
|
||||
substrate = if solid && !multicolor && config["grid"]["enabled"]
|
||||
coords.map do |lat, lon|
|
||||
vertex_is_grid = on_grid?(config, lat, lon, radius, (a1 - a0).abs / 2.0, (o1 - o0).abs / 2.0)
|
||||
point(config, data_set, radius, lat, lon, vertex_is_grid ? -config["grid"]["depth_mm"] : 0.0)
|
||||
end
|
||||
else
|
||||
coords.map { |lat, lon| point(config, data_set, radius, lat, lon, surface_offset) }
|
||||
end
|
||||
inner = solid ? nil : coords.map { |lat, lon| point(config, data_set, radius, lat, lon, -config["shell"]["wall_mm"]) }
|
||||
if unified_base
|
||||
outer_ids = coords.each_with_index.map do |coord, index|
|
||||
substrate_vertices[coordinate_key(coord)] ||= base.vertex(substrate[index])
|
||||
end
|
||||
inner_ids = coords.each_with_index.map do |coord, index|
|
||||
inner_vertices[coordinate_key(coord)] ||= base.vertex(inner[index])
|
||||
end
|
||||
base.triangle(*outer_ids)
|
||||
base.triangle(inner_ids[0], inner_ids[2], inner_ids[1])
|
||||
3.times do |edge|
|
||||
next_edge = (edge + 1) % 3
|
||||
key = [coordinate_key(coords[edge]), coordinate_key(coords[next_edge])].sort
|
||||
record = boundary_edges[key]
|
||||
if record
|
||||
record[:count] += 1
|
||||
else
|
||||
boundary_edges[key] = { count: 1, outer: [outer_ids[edge], outer_ids[next_edge]],
|
||||
inner: [inner_ids[edge], inner_ids[next_edge]] }
|
||||
unless solid
|
||||
inner_ids = coords.each_with_index.map do |coord, index|
|
||||
inner_vertices[coordinate_key(coord)] ||= base.vertex(inner[index])
|
||||
end
|
||||
base.triangle(inner_ids[0], inner_ids[2], inner_ids[1])
|
||||
3.times do |edge|
|
||||
next_edge = (edge + 1) % 3
|
||||
key = [coordinate_key(coords[edge]), coordinate_key(coords[next_edge])].sort
|
||||
record = boundary_edges[key]
|
||||
if record
|
||||
record[:count] += 1
|
||||
else
|
||||
boundary_edges[key] = { count: 1, outer: [outer_ids[edge], outer_ids[next_edge]],
|
||||
inner: [inner_ids[edge], inner_ids[next_edge]] }
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
@@ -135,6 +147,7 @@ module MoonModel
|
||||
if unified_base
|
||||
boundary_edges.each_value do |edge|
|
||||
next unless edge[:count] == 1
|
||||
next if solid
|
||||
base.quad(edge[:outer][0], edge[:outer][1], edge[:inner][1], edge[:inner][0])
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user