extends Spatial onready var layers = [$base, $panties, $pants] var pairs = [[0, 2], [1, 2], [0, 1]] var cache = [] func cache_data(): for k in range(layers.size()): var arrays = layers[k].mesh.surface_get_arrays(0) var data = {} data.vertices = arrays[Mesh.ARRAY_VERTEX] data.normals = arrays[Mesh.ARRAY_NORMAL] data.indices = arrays[Mesh.ARRAY_INDEX] data.bs = layers[k].mesh.surface_get_blend_shape_arrays(0) data.mat = layers[k].get_surface_material(0) data.mesh_mat = layers[k].mesh.surface_get_material(0) data.shrunk = shrink_vertices(data.vertices, data.normals) data.aabb = layers[k].get_aabb().grow(0.02) cache.push_back(data) func update_meshes(): for k in range(layers.size()): layers[k].hide() var arrays = layers[k].mesh.surface_get_arrays(0) arrays[Mesh.ARRAY_VERTEX] = cache[k].vertices layers[k].mesh.surface_remove(0) layers[k].mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays, cache[k].bs) layers[k].set_surface_material(0, cache[k].mat) layers[k].mesh.surface_set_material(0, cache[k].mesh_mat) layers[k].show() func get_layer_vertices(layer: int) -> PoolVector3Array: return cache[layer].vertices func get_layer_normals(layer: int) -> PoolVector3Array: return cache[layer].normals func get_layer_triangles(layer: int) -> PoolIntArray: return cache[layer].indices func shrink_vertices(v: PoolVector3Array, n: PoolVector3Array) -> PoolVector3Array: var ret : = PoolVector3Array() ret.resize(v.size()) for i in range(v.size()): ret[i] = v[i] - n[i].normalized() * 0.035 return ret func triangle_check(layer_inner: int, layer_outer: int) -> PoolVector3Array: var start_time = OS.get_unix_time() var inner_verts = get_layer_vertices(layer_inner) var inner_normals = get_layer_normals(layer_inner) var inner_verts_shrunk = cache[layer_inner].shrunk var outer_verts = get_layer_vertices(layer_outer) var outer_triangles = get_layer_triangles(layer_outer) for pt in range(inner_verts.size()): if !cache[layer_outer].aabb.has_point(inner_verts_shrunk[pt]): continue for tri in range(0, outer_triangles.size(), 3): var ray_pos = inner_verts_shrunk[pt] var ray_dir = inner_verts[pt] - inner_verts_shrunk[pt] var r = Geometry.ray_intersects_triangle(ray_pos, ray_dir, outer_verts[outer_triangles[tri]], outer_verts[outer_triangles[tri + 1]], outer_verts[outer_triangles[tri + 2]]) if r: var dst = inner_verts_shrunk[pt].distance_to(r) if dst <= 0.035: var ndist = clamp(dst / 0.035, 0.0, 1.0) print(r, " ", ndist) inner_verts[pt] = inner_verts_shrunk[pt].linear_interpolate(inner_verts[pt], ndist) var end_time = OS.get_unix_time() print(" triangle_check time: ", end_time - start_time) return inner_verts func update_layers(layer_inner: int, layer_outer: int): var verts = triangle_check(layer_inner, layer_outer) cache[layer_inner].vertices = verts func _ready(): cache_data() for p in pairs: update_layers(p[0], p[1]) # $panties.hide() # $pants.hide() update_meshes()