-
-
Notifications
You must be signed in to change notification settings - Fork 401
Expand file tree
/
Copy pathsprite-renderer-filled.ts
More file actions
146 lines (124 loc) · 4.22 KB
/
sprite-renderer-filled.ts
File metadata and controls
146 lines (124 loc) · 4.22 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
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
/**
* @title Sprite Filled
* @category 2D
*/
import * as dat from "dat.gui";
import {
AssetType,
Camera,
Sprite,
SpriteDrawMode,
SpriteFilledMode,
SpriteFilledOrigin,
SpriteRenderer,
Texture2D,
Vector3,
WebGLEngine
} from "@galacean/engine";
WebGLEngine.create({ canvas: "canvas" }).then((engine) => {
engine.canvas.resizeByClientSize();
const scene = engine.sceneManager.activeScene;
scene.background.solidColor.set(0.15, 0.15, 0.18, 1);
const rootEntity = scene.createRootEntity();
// Create camera
const cameraEntity = rootEntity.createChild("camera");
cameraEntity.transform.setPosition(0, 0, 50);
cameraEntity.addComponent(Camera);
// Load texture and create sprite
engine.resourceManager
.load<Texture2D>({
url: "https://gw.alipayobjects.com/mdn/rms_7c464e/afts/img/A*ApFPTZSqcMkAAAAAAAAAAAAAARQnAQ",
type: AssetType.Texture2D
})
.then((texture) => {
const spriteEntity = rootEntity.createChild("sprite");
spriteEntity.transform.position = new Vector3(0, 0, 0);
spriteEntity.transform.setScale(2, 2, 2);
const renderer = spriteEntity.addComponent(SpriteRenderer);
renderer.sprite = new Sprite(engine, texture);
// Set filled mode
renderer.drawMode = SpriteDrawMode.Filled;
renderer.filledMode = SpriteFilledMode.Radial360;
renderer.filledOrigin = SpriteFilledOrigin.Bottom;
renderer.filledAmount = 0.75;
renderer.filledClockWise = true;
addGUI(renderer);
});
engine.run();
function addGUI(renderer: SpriteRenderer) {
const gui = new dat.GUI();
const filledModeMap: Record<string, SpriteFilledMode> = {
Horizontal: SpriteFilledMode.Horizontal,
Vertical: SpriteFilledMode.Vertical,
Radial90: SpriteFilledMode.Radial90,
Radial180: SpriteFilledMode.Radial180,
Radial360: SpriteFilledMode.Radial360
};
const originForRadial360: string[] = ["Right", "Top", "Left", "Bottom"];
const originForRadial180: string[] = ["Right", "Top", "Left", "Bottom"];
const originForRadial90: string[] = ["BottomLeft", "BottomRight", "TopRight", "TopLeft"];
const originForHorizontal: string[] = ["Left", "Right"];
const originForVertical: string[] = ["Bottom", "Top"];
const originMap: Record<string, SpriteFilledOrigin> = {
Right: SpriteFilledOrigin.Right,
TopRight: SpriteFilledOrigin.TopRight,
Top: SpriteFilledOrigin.Top,
TopLeft: SpriteFilledOrigin.TopLeft,
Left: SpriteFilledOrigin.Left,
BottomLeft: SpriteFilledOrigin.BottomLeft,
Bottom: SpriteFilledOrigin.Bottom,
BottomRight: SpriteFilledOrigin.BottomRight
};
const state = {
filledMode: "Radial360",
origin: "Bottom",
amount: 0.75,
clockWise: true
};
const folder = gui.addFolder("Filled Sprite");
folder.open();
// Filled mode
folder.add(state, "filledMode", Object.keys(filledModeMap)).onChange((value: string) => {
renderer.filledMode = filledModeMap[value];
updateOriginOptions(value);
});
// Origin
let originCtrl = folder.add(state, "origin", originForRadial360).onChange((value: string) => {
renderer.filledOrigin = originMap[value];
});
// Amount
folder.add(state, "amount", 0.0, 1.0, 0.01).onChange((value: number) => {
renderer.filledAmount = value;
});
// ClockWise
folder.add(state, "clockWise").onChange((value: boolean) => {
renderer.filledClockWise = value;
});
function updateOriginOptions(mode: string) {
folder.remove(originCtrl);
let options: string[];
switch (mode) {
case "Horizontal":
options = originForHorizontal;
break;
case "Vertical":
options = originForVertical;
break;
case "Radial90":
options = originForRadial90;
break;
case "Radial180":
options = originForRadial180;
break;
default:
options = originForRadial360;
break;
}
state.origin = options[0];
renderer.filledOrigin = originMap[state.origin];
originCtrl = folder.add(state, "origin", options).onChange((value: string) => {
renderer.filledOrigin = originMap[value];
});
}
}
});