Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. extends Spatial
  2.  
  3. onready var layers = [$base, $panties, $pants]
  4. var pairs = [[0, 2], [1, 2], [0, 1]]
  5. var cache = []
  6.  
  7. func cache_data():
  8. for k in range(layers.size()):
  9. var arrays = layers[k].mesh.surface_get_arrays(0)
  10. var data = {}
  11. data.vertices = arrays[Mesh.ARRAY_VERTEX]
  12. data.normals = arrays[Mesh.ARRAY_NORMAL]
  13. data.indices = arrays[Mesh.ARRAY_INDEX]
  14. data.bs = layers[k].mesh.surface_get_blend_shape_arrays(0)
  15. data.mat = layers[k].get_surface_material(0)
  16. data.mesh_mat = layers[k].mesh.surface_get_material(0)
  17. data.shrunk = shrink_vertices(data.vertices, data.normals)
  18. data.aabb = layers[k].get_aabb().grow(0.02)
  19.  
  20. cache.push_back(data)
  21.  
  22. func update_meshes():
  23. for k in range(layers.size()):
  24. layers[k].hide()
  25. var arrays = layers[k].mesh.surface_get_arrays(0)
  26. arrays[Mesh.ARRAY_VERTEX] = cache[k].vertices
  27. layers[k].mesh.surface_remove(0)
  28. layers[k].mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays, cache[k].bs)
  29. layers[k].set_surface_material(0, cache[k].mat)
  30. layers[k].mesh.surface_set_material(0, cache[k].mesh_mat)
  31. layers[k].show()
  32.  
  33. func get_layer_vertices(layer: int) -> PoolVector3Array:
  34. return cache[layer].vertices
  35. func get_layer_normals(layer: int) -> PoolVector3Array:
  36. return cache[layer].normals
  37. func get_layer_triangles(layer: int) -> PoolIntArray:
  38. return cache[layer].indices
  39. func shrink_vertices(v: PoolVector3Array, n: PoolVector3Array) -> PoolVector3Array:
  40. var ret : = PoolVector3Array()
  41. ret.resize(v.size())
  42. for i in range(v.size()):
  43. ret[i] = v[i] - n[i].normalized() * 0.035
  44. return ret
  45. func triangle_check(layer_inner: int, layer_outer: int) -> PoolVector3Array:
  46. var start_time = OS.get_unix_time()
  47. var inner_verts = get_layer_vertices(layer_inner)
  48. var inner_normals = get_layer_normals(layer_inner)
  49. var inner_verts_shrunk = cache[layer_inner].shrunk
  50. var outer_verts = get_layer_vertices(layer_outer)
  51. var outer_triangles = get_layer_triangles(layer_outer)
  52. for pt in range(inner_verts.size()):
  53. if !cache[layer_outer].aabb.has_point(inner_verts_shrunk[pt]):
  54. continue
  55. for tri in range(0, outer_triangles.size(), 3):
  56. var ray_pos = inner_verts_shrunk[pt]
  57. var ray_dir = inner_verts[pt] - inner_verts_shrunk[pt]
  58. var r = Geometry.ray_intersects_triangle(ray_pos, ray_dir,
  59. outer_verts[outer_triangles[tri]],
  60. outer_verts[outer_triangles[tri + 1]],
  61. outer_verts[outer_triangles[tri + 2]])
  62. if r:
  63. var dst = inner_verts_shrunk[pt].distance_to(r)
  64. if dst <= 0.035:
  65. var ndist = clamp(dst / 0.035, 0.0, 1.0)
  66. print(r, " ", ndist)
  67. inner_verts[pt] = inner_verts_shrunk[pt].linear_interpolate(inner_verts[pt], ndist)
  68. var end_time = OS.get_unix_time()
  69. print(" triangle_check time: ", end_time - start_time)
  70. return inner_verts
  71. func update_layers(layer_inner: int, layer_outer: int):
  72. var verts = triangle_check(layer_inner, layer_outer)
  73. cache[layer_inner].vertices = verts
  74. func _ready():
  75. cache_data()
  76. for p in pairs:
  77. update_layers(p[0], p[1])
  78. # $panties.hide()
  79. # $pants.hide()
  80. update_meshes()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement