@cyclonium/debug-draw 0.0.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +108 -0
- package/lib/index.js +220 -0
- package/lib/legacy.d.ts +29 -0
- package/lib/legacy.js +75 -0
- package/package.json +26 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Camera, Color, GeometryRenderer, Mat4, Quat, Vec3 } from 'cc';
|
|
2
|
+
import { CycloComponent } from '@cyclonium/core/framework';
|
|
3
|
+
import type { Vec2 } from '@cyclonium/core/math/vec2';
|
|
4
|
+
export declare class DebugDrawTarget extends CycloComponent {
|
|
5
|
+
get geometryRenderer(): GeometryRenderer | null | undefined;
|
|
6
|
+
private get _camera();
|
|
7
|
+
}
|
|
8
|
+
export declare function tryGetDebugGeometryRenderer(camera?: Camera): GeometryRenderer | null | undefined;
|
|
9
|
+
export declare function getDebugGeometryRenderer(): GeometryRenderer;
|
|
10
|
+
export declare class DebugDrawContext {
|
|
11
|
+
static fromEditorCamera(): DebugDrawContext | undefined;
|
|
12
|
+
static fromDebugDrawTarget(target: DebugDrawTarget): DebugDrawContext;
|
|
13
|
+
static fromDebugDrawTargets(target: DebugDrawTarget[]): DebugDrawContext;
|
|
14
|
+
constructor(geometryRenderers: GeometryRenderer[]);
|
|
15
|
+
get geometryRenderers_internal(): GeometryRenderer[];
|
|
16
|
+
rect(opts: {
|
|
17
|
+
center: Readonly<Vec3>;
|
|
18
|
+
halfExtent: Readonly<Vec2> | number;
|
|
19
|
+
right?: Readonly<Vec3>;
|
|
20
|
+
up?: Readonly<Vec3>;
|
|
21
|
+
color?: Readonly<Color>;
|
|
22
|
+
wireframe?: boolean;
|
|
23
|
+
depthTest?: boolean;
|
|
24
|
+
unlit?: boolean;
|
|
25
|
+
transform?: Readonly<Mat4>;
|
|
26
|
+
}): void;
|
|
27
|
+
cube(opts: {
|
|
28
|
+
center: Readonly<Vec3>;
|
|
29
|
+
halfExtent: Readonly<Vec3> | number;
|
|
30
|
+
color?: Readonly<Color>;
|
|
31
|
+
wireframe?: boolean;
|
|
32
|
+
depthTest?: boolean;
|
|
33
|
+
transform?: Readonly<Mat4>;
|
|
34
|
+
}): this;
|
|
35
|
+
lineFromTo(opts: {
|
|
36
|
+
from: Readonly<Vec3>;
|
|
37
|
+
to: Readonly<Vec3>;
|
|
38
|
+
color?: Readonly<Color>;
|
|
39
|
+
depthTest?: boolean;
|
|
40
|
+
}): this;
|
|
41
|
+
lineFromDirLength(opts: {
|
|
42
|
+
from: Readonly<Vec3>;
|
|
43
|
+
dir: Readonly<Vec3>;
|
|
44
|
+
length: number;
|
|
45
|
+
color?: Readonly<Color>;
|
|
46
|
+
depthTest?: boolean;
|
|
47
|
+
}): this;
|
|
48
|
+
sphere(opts: {
|
|
49
|
+
center: Readonly<Vec3>;
|
|
50
|
+
radius: number;
|
|
51
|
+
color?: Readonly<Color>;
|
|
52
|
+
wireframe?: boolean;
|
|
53
|
+
depthTest?: boolean;
|
|
54
|
+
segments?: number;
|
|
55
|
+
}): this;
|
|
56
|
+
capsule(opts: {
|
|
57
|
+
center: Readonly<Vec3>;
|
|
58
|
+
radius: number;
|
|
59
|
+
height: number;
|
|
60
|
+
color?: Readonly<Color>;
|
|
61
|
+
wireframe?: boolean;
|
|
62
|
+
depthTest?: boolean;
|
|
63
|
+
segments?: number;
|
|
64
|
+
transform?: {
|
|
65
|
+
position?: Readonly<Vec3>;
|
|
66
|
+
rotation?: Readonly<Quat>;
|
|
67
|
+
scale?: Readonly<Vec3>;
|
|
68
|
+
};
|
|
69
|
+
}): this;
|
|
70
|
+
circle(opts: {
|
|
71
|
+
center: Readonly<Vec3>;
|
|
72
|
+
radius: number;
|
|
73
|
+
normal?: Readonly<Vec3>;
|
|
74
|
+
color?: Readonly<Color>;
|
|
75
|
+
wireframe?: boolean;
|
|
76
|
+
depthTest?: boolean;
|
|
77
|
+
segments?: number;
|
|
78
|
+
transform?: Mat4;
|
|
79
|
+
}): void;
|
|
80
|
+
arc(opts: {
|
|
81
|
+
center: Readonly<Vec3>;
|
|
82
|
+
radius: number;
|
|
83
|
+
startAngle: number;
|
|
84
|
+
endAngle: number;
|
|
85
|
+
normal?: Readonly<Vec3>;
|
|
86
|
+
color?: Readonly<Color>;
|
|
87
|
+
wireframe?: boolean;
|
|
88
|
+
depthTest?: boolean;
|
|
89
|
+
segments?: number;
|
|
90
|
+
transform?: Mat4;
|
|
91
|
+
}): void;
|
|
92
|
+
sector(opts: {
|
|
93
|
+
center: Readonly<Vec3>;
|
|
94
|
+
radius: number;
|
|
95
|
+
halfVector?: Readonly<Vec3>;
|
|
96
|
+
halfAngle?: number;
|
|
97
|
+
normal?: Readonly<Vec3>;
|
|
98
|
+
color?: Readonly<Color>;
|
|
99
|
+
wireframe?: boolean;
|
|
100
|
+
depthTest?: boolean;
|
|
101
|
+
segments?: number;
|
|
102
|
+
transform?: Mat4;
|
|
103
|
+
unlit?: boolean;
|
|
104
|
+
}): void;
|
|
105
|
+
private _geometryRenderers;
|
|
106
|
+
}
|
|
107
|
+
export * from './legacy.js';
|
|
108
|
+
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Camera, Color, GeometryRenderer, Mat4, Quat, Vec3, director, find, geometry, renderer } from 'cc';
|
|
8
|
+
import { EDITOR_NOT_IN_PREVIEW } from 'cc/env';
|
|
9
|
+
import { CycloComponent } from '@cyclonium/core/framework';
|
|
10
|
+
import { cycloBuiltinClass } from '@cyclonium/core/internal';
|
|
11
|
+
import { requiresComponent } from '@cyclonium/core/legacy-decorator';
|
|
12
|
+
import { toDegrees } from '@cyclonium/core/math/trigonometry';
|
|
13
|
+
let DebugDrawTarget = class DebugDrawTarget extends CycloComponent {
|
|
14
|
+
get geometryRenderer() {
|
|
15
|
+
return tryGetDebugGeometryRenderer(this._camera);
|
|
16
|
+
}
|
|
17
|
+
get _camera() { return undefined; }
|
|
18
|
+
};
|
|
19
|
+
__decorate([
|
|
20
|
+
requiresComponent(Camera)
|
|
21
|
+
], DebugDrawTarget.prototype, "_camera", null);
|
|
22
|
+
DebugDrawTarget = __decorate([
|
|
23
|
+
cycloBuiltinClass('DebugDrawTarget')
|
|
24
|
+
], DebugDrawTarget);
|
|
25
|
+
export { DebugDrawTarget };
|
|
26
|
+
export function tryGetDebugGeometryRenderer(camera) {
|
|
27
|
+
let renderCamera = undefined;
|
|
28
|
+
if (camera) {
|
|
29
|
+
renderCamera = camera.camera;
|
|
30
|
+
}
|
|
31
|
+
else if (EDITOR_NOT_IN_PREVIEW) {
|
|
32
|
+
renderCamera = globalThis.cce?.Camera.camera.camera;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
renderCamera = find('World/Main Camera')?.getComponent(Camera)?.camera;
|
|
36
|
+
}
|
|
37
|
+
if (!renderCamera) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (renderCamera) {
|
|
41
|
+
renderCamera.initGeometryRenderer();
|
|
42
|
+
}
|
|
43
|
+
const geometryRenderer = renderCamera?.geometryRenderer ?? director.root?.pipeline.geometryRenderer;
|
|
44
|
+
return geometryRenderer;
|
|
45
|
+
}
|
|
46
|
+
export function getDebugGeometryRenderer() {
|
|
47
|
+
const geometryRenderer = tryGetDebugGeometryRenderer();
|
|
48
|
+
if (!geometryRenderer) {
|
|
49
|
+
throw new Error(`Can not get debug geometry renderer.`);
|
|
50
|
+
}
|
|
51
|
+
return geometryRenderer;
|
|
52
|
+
}
|
|
53
|
+
function getGeometryRendererFromCamera(camera) {
|
|
54
|
+
const renderCamera = camera.camera;
|
|
55
|
+
if (!renderCamera) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
renderCamera.initGeometryRenderer();
|
|
59
|
+
const geometryRenderer = renderCamera.geometryRenderer;
|
|
60
|
+
if (!geometryRenderer) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return geometryRenderer;
|
|
64
|
+
}
|
|
65
|
+
const cacheAABB = new geometry.AABB();
|
|
66
|
+
export class DebugDrawContext {
|
|
67
|
+
static fromEditorCamera() {
|
|
68
|
+
const camera = globalThis.cce?.Camera.camera;
|
|
69
|
+
if (!camera) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const geometryRenderer = getGeometryRendererFromCamera(camera);
|
|
73
|
+
if (!geometryRenderer) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
return new DebugDrawContext([geometryRenderer]);
|
|
77
|
+
}
|
|
78
|
+
static fromDebugDrawTarget(target) {
|
|
79
|
+
return this.fromDebugDrawTargets([target]);
|
|
80
|
+
}
|
|
81
|
+
static fromDebugDrawTargets(target) {
|
|
82
|
+
const geometryRenderers = target.map((t) => t.geometryRenderer).filter((r) => r !== undefined);
|
|
83
|
+
return new DebugDrawContext(geometryRenderers);
|
|
84
|
+
}
|
|
85
|
+
constructor(geometryRenderers) {
|
|
86
|
+
this._geometryRenderers = geometryRenderers;
|
|
87
|
+
}
|
|
88
|
+
get geometryRenderers_internal() {
|
|
89
|
+
return this._geometryRenderers;
|
|
90
|
+
}
|
|
91
|
+
rect(opts) {
|
|
92
|
+
const { center, halfExtent, right = Vec3.RIGHT, up = Vec3.UP, color, unlit, wireframe, depthTest, transform, } = opts;
|
|
93
|
+
const hx = typeof halfExtent === 'number' ? halfExtent : halfExtent.x;
|
|
94
|
+
const hy = typeof halfExtent === 'number' ? halfExtent : halfExtent.y;
|
|
95
|
+
let iVec3Cache = 0;
|
|
96
|
+
const v1 = Vec3.scaleAndAdd(vec3Caches[iVec3Cache++], center, right, hx);
|
|
97
|
+
Vec3.scaleAndAdd(v1, v1, up, hy);
|
|
98
|
+
const v2 = Vec3.scaleAndAdd(vec3Caches[iVec3Cache++], center, up, hy);
|
|
99
|
+
Vec3.scaleAndAdd(v2, v2, right, -hx);
|
|
100
|
+
const v3 = Vec3.scaleAndAdd(vec3Caches[iVec3Cache++], center, up, -hy);
|
|
101
|
+
Vec3.scaleAndAdd(v3, v3, right, -hx);
|
|
102
|
+
const v4 = Vec3.scaleAndAdd(vec3Caches[iVec3Cache++], center, right, hx);
|
|
103
|
+
Vec3.scaleAndAdd(v4, v4, up, -hy);
|
|
104
|
+
if (transform) {
|
|
105
|
+
Vec3.transformMat4(v1, v1, transform);
|
|
106
|
+
Vec3.transformMat4(v2, v2, transform);
|
|
107
|
+
Vec3.transformMat4(v3, v3, transform);
|
|
108
|
+
Vec3.transformMat4(v4, v4, transform);
|
|
109
|
+
}
|
|
110
|
+
this._geometryRenderers.forEach((g) => {
|
|
111
|
+
g.addQuad(v1, v2, v3, v4, color ?? Color.BLACK, wireframe, depthTest, unlit);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
cube(opts) {
|
|
115
|
+
const { center, halfExtent, color, wireframe, depthTest, transform, } = opts;
|
|
116
|
+
const hx = typeof halfExtent === 'number' ? halfExtent : halfExtent.x;
|
|
117
|
+
const hy = typeof halfExtent === 'number' ? halfExtent : halfExtent.y;
|
|
118
|
+
const hz = typeof halfExtent === 'number' ? halfExtent : halfExtent.z;
|
|
119
|
+
this._geometryRenderers.forEach((g) => {
|
|
120
|
+
g.addBoundingBox(geometry.AABB.set(cacheAABB, center.x, center.y, center.z, hx, hy, hz), color ?? Color.BLACK, wireframe, depthTest, undefined, transform ? true : false, transform);
|
|
121
|
+
});
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
lineFromTo(opts) {
|
|
125
|
+
const { from, to, color = Color.BLACK, depthTest, } = opts;
|
|
126
|
+
this._geometryRenderers.forEach((g) => {
|
|
127
|
+
g.addLine(from, to, color, depthTest);
|
|
128
|
+
});
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
lineFromDirLength(opts) {
|
|
132
|
+
const { from, dir, length, color = Color.BLACK, depthTest, } = opts;
|
|
133
|
+
this._geometryRenderers.forEach((g) => {
|
|
134
|
+
g.addLine(from, Vec3.add(new Vec3(), from, Vec3.multiplyScalar(new Vec3(), dir, length)), color, depthTest);
|
|
135
|
+
});
|
|
136
|
+
return this;
|
|
137
|
+
}
|
|
138
|
+
sphere(opts) {
|
|
139
|
+
const { center, radius, color = Color.BLACK, wireframe, depthTest, segments = 16, } = opts;
|
|
140
|
+
this._geometryRenderers.forEach((g) => {
|
|
141
|
+
g.addSphere(center, radius, color, segments, segments, wireframe, depthTest);
|
|
142
|
+
});
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
capsule(opts) {
|
|
146
|
+
const { center, radius, height, color = Color.BLACK, wireframe, depthTest, segments = 16, transform, } = opts;
|
|
147
|
+
let transformMatrix = undefined;
|
|
148
|
+
if (transform) {
|
|
149
|
+
if (transform instanceof Mat4) {
|
|
150
|
+
transformMatrix = transform;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const { position, rotation, scale } = transform;
|
|
154
|
+
transformMatrix = Mat4.fromSRT(new Mat4(), rotation ?? Quat.IDENTITY, position ?? Vec3.ZERO, scale ?? Vec3.ONE);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
this._geometryRenderers.forEach((g) => {
|
|
158
|
+
g.addCapsule(center, radius, height, color, segments, segments, wireframe, depthTest, undefined, !!transformMatrix, transformMatrix);
|
|
159
|
+
});
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
circle(opts) {
|
|
163
|
+
return this.arc({
|
|
164
|
+
...opts,
|
|
165
|
+
startAngle: 0,
|
|
166
|
+
endAngle: Math.PI * 2,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
arc(opts) {
|
|
170
|
+
const { center, radius, startAngle, endAngle, normal = Vec3.UNIT_Y, color = Color.BLACK, wireframe, depthTest, segments = 64, transform, } = opts;
|
|
171
|
+
const finalTransform = new Mat4();
|
|
172
|
+
Mat4.fromSRT(finalTransform, Quat.rotationTo(new Quat(), Vec3.UNIT_Y, normal), center, Vec3.ONE);
|
|
173
|
+
if (transform) {
|
|
174
|
+
Mat4.multiply(finalTransform, transform, finalTransform);
|
|
175
|
+
}
|
|
176
|
+
this._geometryRenderers.forEach((g) => {
|
|
177
|
+
g.addArc(Vec3.ZERO, radius, color, toDegrees(startAngle), toDegrees(endAngle), segments, depthTest, true, finalTransform);
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
sector(opts) {
|
|
181
|
+
let iCacheMat4 = 0;
|
|
182
|
+
let iCacheQuat = 0;
|
|
183
|
+
let iCacheVec3 = 0;
|
|
184
|
+
const { center, radius, halfVector = Vec3.UNIT_Z, halfAngle = Math.PI / 2, normal = Vec3.UNIT_Y, color = Color.BLACK, wireframe = false, depthTest, segments = 64, transform, unlit = false, } = opts;
|
|
185
|
+
const finalTransform = Mat4.identity(mat4Caches[iCacheMat4++]);
|
|
186
|
+
// Scale
|
|
187
|
+
Mat4.scale(finalTransform, finalTransform, Vec3.multiplyScalar(vec3Caches[iCacheVec3++], Vec3.ONE, radius));
|
|
188
|
+
// Rotate
|
|
189
|
+
{
|
|
190
|
+
const inputHalfVector = Vec3.normalize(vec3Caches[iCacheVec3++], halfVector);
|
|
191
|
+
const inputNormal = Vec3.normalize(vec3Caches[iCacheVec3++], normal);
|
|
192
|
+
const cross = Vec3.cross(vec3Caches[iCacheVec3++], inputHalfVector, inputNormal).normalize();
|
|
193
|
+
const newY = Vec3.cross(vec3Caches[iCacheVec3++], cross, inputHalfVector).normalize();
|
|
194
|
+
const newX = Vec3.transformQuat(vec3Caches[iCacheVec3++], inputHalfVector, Quat.fromAxisAngle(quatCaches[iCacheQuat++], newY, halfAngle));
|
|
195
|
+
const newZ = Vec3.cross(vec3Caches[iCacheVec3++], newX, newY).normalize();
|
|
196
|
+
const newMat4 = mat4FromAxes(mat4Caches[iCacheMat4++], newX, newY, newZ);
|
|
197
|
+
Mat4.multiply(finalTransform, newMat4, finalTransform);
|
|
198
|
+
}
|
|
199
|
+
// Translate
|
|
200
|
+
Mat4.translate(finalTransform, finalTransform, center);
|
|
201
|
+
// User defined transform
|
|
202
|
+
if (transform) {
|
|
203
|
+
Mat4.multiply(finalTransform, transform, finalTransform);
|
|
204
|
+
}
|
|
205
|
+
const startAngle = 0;
|
|
206
|
+
const endAngle = startAngle + halfAngle * 2;
|
|
207
|
+
this._geometryRenderers.forEach((g) => {
|
|
208
|
+
g.addSector(Vec3.ZERO, 1.0, color, toDegrees(startAngle), toDegrees(endAngle), segments, wireframe, depthTest, unlit, true, finalTransform);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
_geometryRenderers;
|
|
212
|
+
}
|
|
213
|
+
function mat4FromAxes(mat4, xAxis, yAxis, zAxis) {
|
|
214
|
+
return Mat4.set(mat4, xAxis.x, xAxis.y, xAxis.z, 0, yAxis.x, yAxis.y, yAxis.z, 0, zAxis.x, zAxis.y, zAxis.z, 0, 0, 0, 0, 1);
|
|
215
|
+
}
|
|
216
|
+
export * from './legacy.js';
|
|
217
|
+
const vec3Caches = Array.from({ length: 10 }, () => new Vec3());
|
|
218
|
+
const mat4Caches = Array.from({ length: 10 }, () => new Mat4());
|
|
219
|
+
const quatCaches = Array.from({ length: 10 }, () => new Quat());
|
|
220
|
+
//# sourceMappingURL=index.js.map
|
package/lib/legacy.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Mat3 } from "@cyclonium/core/math/mat3";
|
|
2
|
+
import { Vec2 } from "@cyclonium/core/math/vec2";
|
|
3
|
+
import { Mat4, type GeometryRenderer, type Color, Vec3 } from "cc";
|
|
4
|
+
export declare const drawBox2D: (geometryRenderer: GeometryRenderer, center: Readonly<Vec2>, halfExtent: Readonly<Vec2> | number, color: Readonly<Color>, { wireframe, depthTest, z, transform, }?: {
|
|
5
|
+
wireframe?: boolean;
|
|
6
|
+
depthTest?: boolean;
|
|
7
|
+
z?: number;
|
|
8
|
+
transform?: Mat3;
|
|
9
|
+
}) => void;
|
|
10
|
+
export declare const drawCircleXY: (geometryRenderer: GeometryRenderer, center: Readonly<Vec3>, radius: number, color: Readonly<Color>, { wireframe, depthTest, segments, }?: {
|
|
11
|
+
wireframe?: boolean;
|
|
12
|
+
depthTest?: boolean;
|
|
13
|
+
segments?: number;
|
|
14
|
+
}) => void;
|
|
15
|
+
export declare const drawLineFromTo2D: (geometryRenderer: GeometryRenderer, from: Readonly<Vec2>, to: Readonly<Vec2>, color: Readonly<Color>, { depthTest, transform, }?: {
|
|
16
|
+
depthTest?: boolean;
|
|
17
|
+
transform?: Mat3 | Mat4;
|
|
18
|
+
}) => void;
|
|
19
|
+
export declare const drawCircle2D: (geometryRenderer: GeometryRenderer, { center, radius, color, segments, wireframe, depthTest, z, transform, }: {
|
|
20
|
+
center: Vec2;
|
|
21
|
+
radius: number;
|
|
22
|
+
color: Color;
|
|
23
|
+
segments?: number;
|
|
24
|
+
wireframe?: boolean;
|
|
25
|
+
depthTest?: boolean;
|
|
26
|
+
z?: number;
|
|
27
|
+
transform?: Mat3;
|
|
28
|
+
}) => void;
|
|
29
|
+
//# sourceMappingURL=legacy.d.ts.map
|
package/lib/legacy.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Mat3 } from "@cyclonium/core/math/mat3";
|
|
2
|
+
import { decomposeSRTMat3 } from "@cyclonium/core/math/transform-2d";
|
|
3
|
+
import { Vec2 } from "@cyclonium/core/math/vec2";
|
|
4
|
+
import { Mat4, Quat, Vec3 } from "cc";
|
|
5
|
+
export const drawBox2D = (() => {
|
|
6
|
+
return (geometryRenderer, center, halfExtent, color, { wireframe = true, depthTest = true, z = 0, transform, } = {}) => {
|
|
7
|
+
const hx = typeof halfExtent === 'number' ? halfExtent : halfExtent.x;
|
|
8
|
+
const hy = typeof halfExtent === 'number' ? halfExtent : halfExtent.y;
|
|
9
|
+
const v0 = new Vec2(center.x + hx, center.y + hy);
|
|
10
|
+
const v1 = new Vec2(center.x - hx, center.y + hy);
|
|
11
|
+
const v2 = new Vec2(center.x - hx, center.y - hy);
|
|
12
|
+
const v3 = new Vec2(center.x + hx, center.y - hy);
|
|
13
|
+
if (transform) {
|
|
14
|
+
transform.transformVec2(v0, v0);
|
|
15
|
+
transform.transformVec2(v1, v1);
|
|
16
|
+
transform.transformVec2(v2, v2);
|
|
17
|
+
transform.transformVec2(v3, v3);
|
|
18
|
+
}
|
|
19
|
+
geometryRenderer.addQuad(new Vec3(v0.x, v0.y, z), new Vec3(v1.x, v1.y, z), new Vec3(v2.x, v2.y, z), new Vec3(v3.x, v3.y, z), color, wireframe, depthTest);
|
|
20
|
+
};
|
|
21
|
+
})();
|
|
22
|
+
export const drawCircleXY = (() => {
|
|
23
|
+
const transform = Mat4.fromQuat(new Mat4(), Quat.fromAxisAngle(new Quat(), Vec3.UNIT_X, Math.PI / 2));
|
|
24
|
+
return (geometryRenderer, center, radius, color, { wireframe = true, depthTest = true, segments = 32, } = {}) => {
|
|
25
|
+
geometryRenderer.addCircle(center, radius, color, segments, depthTest, true, transform);
|
|
26
|
+
};
|
|
27
|
+
})();
|
|
28
|
+
export const drawLineFromTo2D = (() => {
|
|
29
|
+
const from3 = new Vec3();
|
|
30
|
+
const to3 = new Vec3();
|
|
31
|
+
const transform2To3 = (v, out) => {
|
|
32
|
+
Vec3.set(out, v.x, v.y, 0);
|
|
33
|
+
return out;
|
|
34
|
+
};
|
|
35
|
+
const transformMat4 = (v, out, transform) => {
|
|
36
|
+
transform2To3(v, out);
|
|
37
|
+
Vec3.transformMat4(out, out, transform);
|
|
38
|
+
return out;
|
|
39
|
+
};
|
|
40
|
+
const transformMat3 = (v, out, transform) => {
|
|
41
|
+
const v2 = new Vec2(v.x, v.y);
|
|
42
|
+
transform.transformVec2(v, v2);
|
|
43
|
+
transform2To3(v2, out);
|
|
44
|
+
return out;
|
|
45
|
+
};
|
|
46
|
+
return (geometryRenderer, from, to, color, { depthTest = true, transform, } = {}) => {
|
|
47
|
+
if (transform instanceof Mat3) {
|
|
48
|
+
transformMat3(from, from3, transform);
|
|
49
|
+
transformMat3(to, to3, transform);
|
|
50
|
+
}
|
|
51
|
+
else if (transform instanceof Mat4) {
|
|
52
|
+
transformMat4(from, from3, transform);
|
|
53
|
+
transformMat4(to, to3, transform);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
transform2To3(from, from3);
|
|
57
|
+
transform2To3(to, to3);
|
|
58
|
+
}
|
|
59
|
+
geometryRenderer.addLine(from3, to3, color, depthTest);
|
|
60
|
+
};
|
|
61
|
+
})();
|
|
62
|
+
export const drawCircle2D = (() => {
|
|
63
|
+
const rotation2To3 = Quat.fromAxisAngle(new Quat(), Vec3.UNIT_X, Math.PI / 2);
|
|
64
|
+
return (geometryRenderer, { center, radius, color, segments = 32, wireframe = true, depthTest = true, z = 0, transform, }) => {
|
|
65
|
+
const center3 = new Vec3(center.x, center.y, z);
|
|
66
|
+
const transformMatrix = Mat4.fromSRTOrigin(new Mat4(), rotation2To3, Vec3.ZERO, Vec3.ONE, center3);
|
|
67
|
+
if (transform) {
|
|
68
|
+
const srt = decomposeSRTMat3(transform);
|
|
69
|
+
const transform4 = Mat4.fromSRT(new Mat4(), Quat.fromAxisAngle(new Quat(), Vec3.UNIT_Z, srt.rotation), new Vec3(srt.translation.x, srt.translation.y, z), new Vec3(srt.scale.x, srt.scale.y, z));
|
|
70
|
+
Mat4.multiply(transformMatrix, transform4, transformMatrix);
|
|
71
|
+
}
|
|
72
|
+
geometryRenderer.addCircle(center3, radius, color, segments, depthTest, true, transformMatrix);
|
|
73
|
+
};
|
|
74
|
+
})();
|
|
75
|
+
//# sourceMappingURL=legacy.js.map
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cyclonium/debug-draw",
|
|
3
|
+
"version": "0.0.100",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": [
|
|
6
|
+
"lib/**/*{.js,.d.ts}"
|
|
7
|
+
],
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./lib/index.js"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@cyclonium/algorithm": "0.0.100"
|
|
13
|
+
},
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"@cyclonium/core": "0.0.100"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"typescript": "^6.0.2",
|
|
19
|
+
"@cyclonium/types-cc": "0.0.100",
|
|
20
|
+
"@cyclonium/workflow": "0.0.100"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b",
|
|
24
|
+
"dev": "tsc --watch"
|
|
25
|
+
}
|
|
26
|
+
}
|