-
Notifications
You must be signed in to change notification settings - Fork 1
/
ConvexHullColliderShapeDesc.cs
183 lines (141 loc) · 6.21 KB
/
ConvexHullColliderShapeDesc.cs
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
using System;
using System.Collections.Generic;
using Stride.Core;
using Stride.Core.Annotations;
using Stride.Core.Mathematics;
using Stride.Core.Serialization.Contents;
using Stride.Rendering;
namespace Stride.Physics
{
[ContentSerializer(typeof(DataContentSerializer<ConvexHullColliderShapeDesc>))]
[DataContract("ConvexHullColliderShapeDesc")]
[Display(500, "Convex Hull")]
public class ConvexHullColliderShapeDesc : IAssetColliderShapeDesc
{
[Display(Browsable = false)]
[DataMember(10)]
public List<List<List<Vector3>>> ConvexHulls; // Multiple meshes -> Multiple Hulls -> Hull points
[Display(Browsable = false)]
[DataMember(20)]
public List<List<List<uint>>> ConvexHullsIndices; // Multiple meshes -> Multiple Hulls -> Hull tris
/// <userdoc>
/// Model asset from where the engine will derive the convex hull.
/// </userdoc>
[DataMember(30)]
public Model Model;
/// <userdoc>
/// The offset with the real graphic mesh.
/// </userdoc>
[DataMember(31)]
public Vector3 LocalOffset;
/// <userdoc>
/// The local rotation of the collider shape.
/// </userdoc>
[DataMember(32)]
public Quaternion LocalRotation = Quaternion.Identity;
/// <userdoc>
/// The scaling of the generated convex hull.
/// </userdoc>
[DataMember(45)]
public Vector3 Scaling = Vector3.One;
/// <userdoc>
/// The Marge of the generated convex hull.
/// </userdoc>
[DataMember(48)]
public float Margin { get; set; } = .04f;
/// <userdoc>
/// If this is not checked, the contained parameters are ignored and only a simple convex hull of the model will be generated.
/// </userdoc>
[DataMember(50)]
[NotNull]
public ConvexHullDecompositionParameters Decomposition { get; set; } = new ConvexHullDecompositionParameters();
public bool Match(object obj)
{
var other = obj as ConvexHullColliderShapeDesc;
if (other == null)
return false;
if (other.LocalOffset != LocalOffset || other.LocalRotation != LocalRotation)
return false;
return other.Model == Model &&
other.Scaling == Scaling &&
other.Decomposition.Match(Decomposition);
}
public ColliderShape CreateShape(IServiceRegistry services)
{
if (ConvexHulls == null) return null;
ColliderShape shape;
//Optimize performance and focus on less shapes creation since this shape could be nested
if (ConvexHulls.Count == 1)
{
if (ConvexHulls[0].Count == 1 && ConvexHullsIndices[0][0].Count > 0)
{
shape = new ConvexHullColliderShape(ConvexHulls[0][0], ConvexHullsIndices[0][0], Scaling)
{
NeedsCustomCollisionCallback = true,
Margin = Margin,
};
//shape.UpdateLocalTransformations();
shape.Description = this;
return shape;
}
if (ConvexHulls[0].Count <= 1) return null;
var subCompound = new CompoundColliderShape
{
NeedsCustomCollisionCallback = true,
};
for (var i = 0; i < ConvexHulls[0].Count; i++)
{
var verts = ConvexHulls[0][i];
var indices = ConvexHullsIndices[0][i];
if (indices.Count == 0) continue;
var subHull = new ConvexHullColliderShape(verts, indices, Scaling);
subHull.Margin = Margin;
//subHull.UpdateLocalTransformations();
subCompound.AddChildShape(subHull);
}
//subCompound.UpdateLocalTransformations();
subCompound.Description = this;
return subCompound;
}
if (ConvexHulls.Count <= 1) return null;
var compound = new CompoundColliderShape
{
NeedsCustomCollisionCallback = true,
};
for (var i = 0; i < ConvexHulls.Count; i++)
{
var verts = ConvexHulls[i];
var indices = ConvexHullsIndices[i];
if (verts.Count == 1)
{
if (indices[0].Count == 0) continue;
var subHull = new ConvexHullColliderShape(verts[0], indices[0], Scaling);
subHull.Margin = Margin;
//subHull.UpdateLocalTransformations();
compound.AddChildShape(subHull);
}
else if (verts.Count > 1)
{
var subCompound = new CompoundColliderShape();
for (var b = 0; b < verts.Count; b++)
{
var subVerts = verts[b];
var subIndex = indices[b];
if (subIndex.Count == 0) continue;
var subHull = new ConvexHullColliderShape(subVerts, subIndex, Scaling);
//subHull.UpdateLocalTransformations();
subHull.Margin = Margin;
subCompound.AddChildShape(subHull);
}
//subCompound.UpdateLocalTransformations();
compound.AddChildShape(subCompound);
}
}
//compound.UpdateLocalTransformations();
compound.Description = this;
return compound;
}
}
}