-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmaterial_body.gd
More file actions
88 lines (67 loc) · 2.04 KB
/
Copy pathmaterial_body.gd
File metadata and controls
88 lines (67 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
extends Node3D
class_name MaterialBody
const MATBODY_PHYSICS_LAYER := 1 << 1 # layer 2
var meshlib : Dictionary # < Mesh, [each surface convex] >
var meshins : Array[MeshInstance3D]
func _ready() -> void :
generate_matbody()
func _iterate_mesh(n : Node) -> void :
if n is MeshInstance3D :
var mesh : Mesh = n.mesh
if !meshlib.has(mesh) :
_add_mesh(mesh)
meshins.append(n)
for c in n.get_children() :
_iterate_mesh(c)
func generate_matbody() -> void :
_iterate_mesh(self)
var static_body : StaticBody3D
if !meshins.is_empty() :
static_body = StaticBody3D.new()
static_body.collision_layer = MATBODY_PHYSICS_LAYER
static_body.name = &"_matbody_"
for m in meshins :
var cc : Array[ConcavePolygonShape3D] = meshlib[m.mesh]
for i in m.get_surface_override_material_count() :
var mat := m.material_override
if !mat :
mat = m.get_surface_override_material(i)
if !mat :
mat = m.mesh.surface_get_material(i)
if !mat :
continue
var shape := CollisionShape3D.new()
shape.transform = global_transform.affine_inverse() * m.global_transform
shape.shape = cc[i]
shape.set_meta(&'mb_mat', mat)
static_body.add_child(shape)
add_child(static_body)
meshlib.clear()
meshins.clear()
func _add_mesh(mesh : Mesh) -> void :
var arrcc : Array[ConcavePolygonShape3D]
var rmesh := mesh
if rmesh is PrimitiveMesh :
var amesh := ArrayMesh.new()
amesh.add_surface_from_arrays(
Mesh.PRIMITIVE_TRIANGLES,
mesh.get_mesh_arrays()
)
rmesh = amesh
for i in rmesh.get_surface_count() :
var pv3 : PackedVector3Array
var mdts := MeshDataTool.new()
mdts.create_from_surface(rmesh, i)
var V := mdts.get_vertex
var F := mdts.get_face_vertex
var cursor := pv3.size()
pv3.resize(pv3.size() + mdts.get_face_count() * 3)
for j in mdts.get_face_count() :
for k in 3 :
pv3[cursor + (j * 3) + k] = V.call(
F.call(j, k)
)
var concave := ConcavePolygonShape3D.new()
concave.set_faces(pv3)
arrcc.append(concave)
meshlib[mesh] = arrcc