-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
simplex-collider.ts
131 lines (108 loc) · 2.93 KB
/
simplex-collider.ts
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
/**
* @category physics
*/
import {
ccclass,
help,
executeInEditMode,
menu,
visible,
type,
editable,
serializable,
} from 'cc.decorator';
import { Vec3 } from '../../../../core/math';
import { Collider } from './collider';
import { ISimplexShape } from '../../../spec/i-physics-shape';
import { EDITOR, TEST } from 'internal:constants';
import { ESimplexType, EColliderType } from '../../physics-enum';
import { IVec3Like } from '../../../../core/math/type-define';
/**
* @en
* Simplex collider, support point, line, triangle, tetrahedron.
* @zh
* 单纯形碰撞器,支持点、线、三角形、四面体。
*/
@ccclass('cc.SimplexCollider')
@help('i18n:cc.SimplexCollider')
@menu('Physics/SimplexCollider')
@executeInEditMode
export class SimplexCollider extends Collider {
static readonly ESimplexType = ESimplexType;
/// PUBLIC PROPERTY GETTER\SETTER ///
@type(ESimplexType)
get shapeType () {
return this._shapeType;
}
set shapeType (v) {
this._shapeType = v;
if (!EDITOR && !TEST) {
this.shape.setShapeType(v);
}
}
@editable
get vertex0 () {
return this._vertices[0];
}
set vertex0 (v: IVec3Like) {
Vec3.copy(this._vertices[0], v);
this.updateVertices();
}
@visible(function (this: SimplexCollider) { return this._shapeType > 1; })
get vertex1 () {
return this._vertices[1];
}
set vertex1 (v: IVec3Like) {
Vec3.copy(this._vertices[1], v);
this.updateVertices();
}
@visible(function (this: SimplexCollider) { return this._shapeType > 2; })
get vertex2 () {
return this._vertices[2];
}
set vertex2 (v: IVec3Like) {
Vec3.copy(this._vertices[2], v);
this.updateVertices();
}
@visible(function (this: SimplexCollider) { return this._shapeType > 3; })
get vertex3 () {
return this._vertices[3];
}
set vertex3 (v: IVec3Like) {
Vec3.copy(this._vertices[3], v);
this.updateVertices();
}
/**
* @en
* Gets the wrapper object, through which the lowLevel instance can be accessed.
* @zh
* 获取封装对象,通过此对象可以访问到底层实例。
*/
public get shape () {
return this._shape as ISimplexShape;
}
get vertices () {
return this._vertices
}
/// PRIVATE PROPERTY ///
@serializable
private _shapeType: ESimplexType = ESimplexType.TETRAHEDRON;
@serializable
private _vertices: IVec3Like[] = [
new Vec3(0, 0, 0),
new Vec3(0, 0, 1),
new Vec3(1, 0, 0),
new Vec3(0, 1, 0),
];
constructor () {
super(EColliderType.SIMPLEX);
}
updateVertices () {
if (!EDITOR && !TEST) {
this.shape.setVertices(this._vertices);
}
}
}
export namespace SimplexCollider {
export type ESimplexType = EnumAlias<typeof ESimplexType>;
}