@dcl/react-ecs 7.27.1-33756439818.commit-3a236ab → 7.27.1-34101585995.commit-6eb5b5d
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/dist/components/Button/index.js +2 -2
- package/dist/components/Dropdown/index.js +5 -2
- package/dist/components/Input/index.js +5 -2
- package/dist/components/Label/index.js +5 -2
- package/dist/components/listeners/types.d.ts +10 -2
- package/dist/components/listeners/types.js +4 -1
- package/dist/components/uiBackground/types.d.ts +12 -1
- package/dist/components/uiBackground/utils.js +8 -0
- package/dist/components/uiTransform/index.js +5 -3
- package/dist/components/uiTransform/types.d.ts +12 -0
- package/dist/components/uiTransform/utils.js +21 -0
- package/dist/react-ecs.d.ts +3 -0
- package/dist/reconciler/index.d.ts +1 -1
- package/dist/reconciler/index.js +31 -6
- package/dist/reconciler/utils.js +3 -0
- package/dist/system.d.ts +14 -0
- package/dist/system.js +30 -0
- package/package.json +3 -3
|
@@ -29,7 +29,7 @@ function getButtonProps(props) {
|
|
|
29
29
|
*/
|
|
30
30
|
/* @__PURE__ */
|
|
31
31
|
export function Button(props) {
|
|
32
|
-
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, ...otherProps } = props;
|
|
32
|
+
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, onMouseDrag, onMouseDragLocked, onMouseDragEnd, ...otherProps } = props;
|
|
33
33
|
const buttonProps = getButtonProps(props);
|
|
34
34
|
const uiBackgroundProps = parseUiBackground({
|
|
35
35
|
...buttonProps.uiBackground,
|
|
@@ -58,5 +58,5 @@ export function Button(props) {
|
|
|
58
58
|
uiBackgroundProps.color = { ...uiBackgroundProps.color, a: uiBackgroundProps.color.a / 2 };
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
return (ReactEcs.createElement("entity", { onMouseDown: !!props.disabled ? undefined : onMouseDown, onMouseUp: !!props.disabled ? undefined : onMouseUp, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, uiTransform: uiTransformProps, uiText: textProps, uiBackground: uiBackgroundProps }));
|
|
61
|
+
return (ReactEcs.createElement("entity", { onMouseDown: !!props.disabled ? undefined : onMouseDown, onMouseUp: !!props.disabled ? undefined : onMouseUp, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onMouseDrag: onMouseDrag, onMouseDragLocked: onMouseDragLocked, onMouseDragEnd: onMouseDragEnd, uiTransform: uiTransformProps, uiText: textProps, uiBackground: uiBackgroundProps }));
|
|
62
62
|
}
|
|
@@ -34,7 +34,7 @@ function parseUiDropdown(props) {
|
|
|
34
34
|
*/
|
|
35
35
|
/* @__PURE__ */
|
|
36
36
|
export function Dropdown(props) {
|
|
37
|
-
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, ...otherProps } = props;
|
|
37
|
+
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, onMouseDrag, onMouseDragLocked, onMouseDragEnd, ...otherProps } = props;
|
|
38
38
|
const dropdownProps = parseUiDropdown(otherProps);
|
|
39
39
|
const commonProps = parseProps({
|
|
40
40
|
uiTransform,
|
|
@@ -42,7 +42,10 @@ export function Dropdown(props) {
|
|
|
42
42
|
onMouseDown,
|
|
43
43
|
onMouseUp,
|
|
44
44
|
onMouseEnter,
|
|
45
|
-
onMouseLeave
|
|
45
|
+
onMouseLeave,
|
|
46
|
+
onMouseDrag,
|
|
47
|
+
onMouseDragLocked,
|
|
48
|
+
onMouseDragEnd
|
|
46
49
|
});
|
|
47
50
|
return ReactEcs.createElement("entity", { ...commonProps, uiDropdown: dropdownProps });
|
|
48
51
|
}
|
|
@@ -35,7 +35,7 @@ function parseUiInput(props) {
|
|
|
35
35
|
* @category Component
|
|
36
36
|
*/ /* @__PURE__ */
|
|
37
37
|
export function Input(props) {
|
|
38
|
-
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, ...otherProps } = props;
|
|
38
|
+
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, onMouseDrag, onMouseDragLocked, onMouseDragEnd, ...otherProps } = props;
|
|
39
39
|
const inputProps = parseUiInput(otherProps);
|
|
40
40
|
const commonProps = parseProps({
|
|
41
41
|
uiTransform,
|
|
@@ -43,7 +43,10 @@ export function Input(props) {
|
|
|
43
43
|
onMouseDown,
|
|
44
44
|
onMouseUp,
|
|
45
45
|
onMouseEnter,
|
|
46
|
-
onMouseLeave
|
|
46
|
+
onMouseLeave,
|
|
47
|
+
onMouseDrag,
|
|
48
|
+
onMouseDragLocked,
|
|
49
|
+
onMouseDragEnd
|
|
47
50
|
});
|
|
48
51
|
return ReactEcs.createElement("entity", { ...commonProps, uiInput: inputProps });
|
|
49
52
|
}
|
|
@@ -16,14 +16,17 @@ export { scaleFontSize } from './utils';
|
|
|
16
16
|
*/
|
|
17
17
|
/* @__PURE__ */
|
|
18
18
|
export function Label(props) {
|
|
19
|
-
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, ...uiTextProps } = props;
|
|
19
|
+
const { uiTransform, uiBackground, onMouseDown, onMouseUp, onMouseEnter, onMouseLeave, onMouseDrag, onMouseDragLocked, onMouseDragEnd, ...uiTextProps } = props;
|
|
20
20
|
const commonProps = parseProps({
|
|
21
21
|
uiTransform,
|
|
22
22
|
uiBackground,
|
|
23
23
|
onMouseDown,
|
|
24
24
|
onMouseUp,
|
|
25
25
|
onMouseEnter,
|
|
26
|
-
onMouseLeave
|
|
26
|
+
onMouseLeave,
|
|
27
|
+
onMouseDrag,
|
|
28
|
+
onMouseDragLocked,
|
|
29
|
+
onMouseDragEnd
|
|
27
30
|
});
|
|
28
31
|
const { font, textAlign, fontSize, textWrap, ...textProps } = uiTextProps;
|
|
29
32
|
const uiText = {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { PBPointerEventsResult } from '@dcl/ecs';
|
|
1
2
|
/**
|
|
2
|
-
* Callback function to be triggered on a specified event
|
|
3
|
+
* Callback function to be triggered on a specified event. Receives the pointer event that
|
|
4
|
+
* fired it (button, hit, and for drags the pointer delta), which handlers may ignore.
|
|
3
5
|
* @public
|
|
4
6
|
*/
|
|
5
|
-
export type Callback = () => void;
|
|
7
|
+
export type Callback = (event: PBPointerEventsResult) => void;
|
|
6
8
|
/**
|
|
7
9
|
* User key event Listeners
|
|
8
10
|
* @public
|
|
@@ -16,4 +18,10 @@ export type Listeners = {
|
|
|
16
18
|
onMouseEnter?: Callback;
|
|
17
19
|
/** triggered on mouse leave event */
|
|
18
20
|
onMouseLeave?: Callback;
|
|
21
|
+
/** triggered while the pointer is dragged after pressing on the element */
|
|
22
|
+
onMouseDrag?: Callback;
|
|
23
|
+
/** triggered while the pointer is dragged with the cursor locked in place */
|
|
24
|
+
onMouseDragLocked?: Callback;
|
|
25
|
+
/** triggered when a drag that started on the element ends */
|
|
26
|
+
onMouseDragEnd?: Callback;
|
|
19
27
|
};
|
|
@@ -2,7 +2,10 @@ const listeners = {
|
|
|
2
2
|
onMouseDown: undefined,
|
|
3
3
|
onMouseUp: undefined,
|
|
4
4
|
onMouseEnter: undefined,
|
|
5
|
-
onMouseLeave: undefined
|
|
5
|
+
onMouseLeave: undefined,
|
|
6
|
+
onMouseDrag: undefined,
|
|
7
|
+
onMouseDragLocked: undefined,
|
|
8
|
+
onMouseDragEnd: undefined
|
|
6
9
|
};
|
|
7
10
|
const listenersKey = Object.keys(listeners);
|
|
8
11
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BorderRect } from '@dcl/ecs';
|
|
1
|
+
import { BorderRect, Entity } from '@dcl/ecs';
|
|
2
2
|
import { Color4 } from '@dcl/ecs/dist/components/generated/pb/decentraland/common/colors.gen';
|
|
3
3
|
/**
|
|
4
4
|
* @public
|
|
@@ -15,6 +15,8 @@ export interface UiBackgroundProps {
|
|
|
15
15
|
uvs?: number[];
|
|
16
16
|
/** AvatarTexture for the background */
|
|
17
17
|
avatarTexture?: UiAvatarTexture;
|
|
18
|
+
/** VideoTexture for the background: the frames of a VideoPlayer on another entity */
|
|
19
|
+
videoTexture?: UiVideoTexture;
|
|
18
20
|
/** Texture for the background */
|
|
19
21
|
texture?: UiTexture;
|
|
20
22
|
}
|
|
@@ -27,6 +29,15 @@ export interface UiAvatarTexture {
|
|
|
27
29
|
wrapMode?: TextureWrapType;
|
|
28
30
|
filterMode?: TextureFilterType;
|
|
29
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Video Texture
|
|
34
|
+
* @public
|
|
35
|
+
*/
|
|
36
|
+
export interface UiVideoTexture {
|
|
37
|
+
videoPlayerEntity: Entity;
|
|
38
|
+
wrapMode?: TextureWrapType;
|
|
39
|
+
filterMode?: TextureFilterType;
|
|
40
|
+
}
|
|
30
41
|
/**
|
|
31
42
|
* Texture
|
|
32
43
|
* @public
|
|
@@ -30,6 +30,14 @@ export function getTexture(props) {
|
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
+
if (props.videoTexture) {
|
|
34
|
+
return {
|
|
35
|
+
tex: {
|
|
36
|
+
$case: 'videoTexture',
|
|
37
|
+
videoTexture: parseTexture(props.videoTexture)
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
33
41
|
return undefined;
|
|
34
42
|
}
|
|
35
43
|
function parseTexture(texture) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getAlign, getDisplay, getFlexDirection, getFlexWrap, getJustify, getOverflow, getPointerFilter, getPositionType, parseBorderColor, parseBorderRadius, parseBorderWidth, parsePosition, parseSize } from './utils';
|
|
1
|
+
import { getAlign, getDisplay, getFlexDirection, getFlexWrap, getJustify, getOverflow, getPointerFilter, getPositionType, getScrollPosition, getScrollVisible, parseBorderColor, parseBorderRadius, parseBorderWidth, parsePosition, parseSize } from './utils';
|
|
2
2
|
/**
|
|
3
3
|
* @internal
|
|
4
4
|
*/
|
|
@@ -60,7 +60,7 @@ const defaultUiTransform = {
|
|
|
60
60
|
*/
|
|
61
61
|
/* @__PURE__ */
|
|
62
62
|
export function parseUiTransform(props = {}) {
|
|
63
|
-
const { height, minHeight, maxHeight, width, minWidth, maxWidth, alignItems, alignContent, flexWrap, borderRadius, borderWidth, borderColor, ...otherProps } = props;
|
|
63
|
+
const { height, minHeight, maxHeight, width, minWidth, maxWidth, alignItems, alignContent, flexWrap, borderRadius, borderWidth, borderColor, scrollPosition, scrollVisible, ...otherProps } = props;
|
|
64
64
|
return {
|
|
65
65
|
...defaultUiTransform,
|
|
66
66
|
...otherProps,
|
|
@@ -86,6 +86,8 @@ export function parseUiTransform(props = {}) {
|
|
|
86
86
|
...(flexWrap && getFlexWrap(flexWrap)),
|
|
87
87
|
...(borderRadius && parseBorderRadius(borderRadius)),
|
|
88
88
|
...(borderWidth && parseBorderWidth(borderWidth)),
|
|
89
|
-
...(borderColor && parseBorderColor(borderColor))
|
|
89
|
+
...(borderColor && parseBorderColor(borderColor)),
|
|
90
|
+
...(scrollPosition && getScrollPosition(scrollPosition)),
|
|
91
|
+
...(scrollVisible && getScrollVisible(scrollVisible))
|
|
90
92
|
};
|
|
91
93
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Color4 } from '@dcl/ecs/dist/components/generated/pb/decentraland/common/colors.gen';
|
|
2
|
+
import { Vector2 } from '@dcl/ecs/dist/components/generated/pb/decentraland/common/vectors.gen';
|
|
2
3
|
import { ScaleUnit } from '../types';
|
|
3
4
|
/**
|
|
4
5
|
* unit value specified. i.e. 1 || '100%' || '1px' || '10vw'
|
|
@@ -131,4 +132,15 @@ export interface UiTransformProps {
|
|
|
131
132
|
opacity?: number;
|
|
132
133
|
/** default 0 */
|
|
133
134
|
zIndex?: number;
|
|
135
|
+
/** A reference id for the element, e.g. as a scrollPosition target or for SetUiFocus. default empty */
|
|
136
|
+
elementId?: string;
|
|
137
|
+
/** Scroll offset when overflow is 'scroll': a position, or the elementId of a child to scroll to. default (0, 0) */
|
|
138
|
+
scrollPosition?: Vector2 | string;
|
|
139
|
+
/** Which scrollbars to show when overflow is 'scroll'. default 'both' */
|
|
140
|
+
scrollVisible?: ScrollVisibleType;
|
|
134
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Which scrollbars are shown when the overflow is scrollable
|
|
144
|
+
* @public
|
|
145
|
+
*/
|
|
146
|
+
export type ScrollVisibleType = 'horizontal' | 'vertical' | 'both' | 'hidden';
|
|
@@ -244,3 +244,24 @@ const parsePointerFilter = {
|
|
|
244
244
|
none: 0 /* PointerFilterMode.PFM_NONE */,
|
|
245
245
|
block: 1 /* PointerFilterMode.PFM_BLOCK */
|
|
246
246
|
};
|
|
247
|
+
/**
|
|
248
|
+
* @internal
|
|
249
|
+
*/
|
|
250
|
+
export function getScrollPosition(scrollPosition) {
|
|
251
|
+
if (typeof scrollPosition === 'string') {
|
|
252
|
+
return { scrollPosition: { value: { $case: 'reference', reference: scrollPosition } } };
|
|
253
|
+
}
|
|
254
|
+
return { scrollPosition: { value: { $case: 'position', position: scrollPosition } } };
|
|
255
|
+
}
|
|
256
|
+
const parseScrollVisible = {
|
|
257
|
+
both: 0 /* ShowScrollBar.SSB_BOTH */,
|
|
258
|
+
hidden: 3 /* ShowScrollBar.SSB_HIDDEN */,
|
|
259
|
+
horizontal: 2 /* ShowScrollBar.SSB_ONLY_HORIZONTAL */,
|
|
260
|
+
vertical: 1 /* ShowScrollBar.SSB_ONLY_VERTICAL */
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* @internal
|
|
264
|
+
*/
|
|
265
|
+
export function getScrollVisible(scrollVisible) {
|
|
266
|
+
return { scrollVisible: parseScrollVisible[scrollVisible] };
|
|
267
|
+
}
|
package/dist/react-ecs.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Entity, IEngine, PointerEventsSystem } from '@dcl/ecs';
|
|
2
2
|
import { ReactEcs } from '../react-ecs';
|
|
3
|
-
export declare function createReconciler(engine: Pick<IEngine, 'getComponent' | 'addEntity' | 'removeEntity' | 'defineComponentFromSchema' | 'getEntitiesWith'>, pointerEvents: PointerEventsSystem): {
|
|
3
|
+
export declare function createReconciler(engine: Pick<IEngine, 'getComponent' | 'addEntity' | 'removeEntity' | 'defineComponentFromSchema' | 'getEntitiesWith'>, pointerEvents: PointerEventsSystem, rootEntity?: Entity): {
|
|
4
4
|
update: (component: ReactEcs.JSX.ReactNode) => number;
|
|
5
5
|
getEntities: () => Entity[];
|
|
6
6
|
};
|
package/dist/reconciler/index.js
CHANGED
|
@@ -8,11 +8,17 @@ function getPointerEnum(pointerKey) {
|
|
|
8
8
|
onMouseDown: 1 /* PointerEventType.PET_DOWN */,
|
|
9
9
|
onMouseUp: 0 /* PointerEventType.PET_UP */,
|
|
10
10
|
onMouseEnter: 2 /* PointerEventType.PET_HOVER_ENTER */,
|
|
11
|
-
onMouseLeave: 3 /* PointerEventType.PET_HOVER_LEAVE
|
|
11
|
+
onMouseLeave: 3 /* PointerEventType.PET_HOVER_LEAVE */,
|
|
12
|
+
onMouseDrag: 7 /* PointerEventType.PET_DRAG */,
|
|
13
|
+
onMouseDragLocked: 6 /* PointerEventType.PET_DRAG_LOCKED */,
|
|
14
|
+
onMouseDragEnd: 8 /* PointerEventType.PET_DRAG_END */
|
|
12
15
|
};
|
|
13
16
|
return pointers[pointerKey];
|
|
14
17
|
}
|
|
15
|
-
export function createReconciler(engine, pointerEvents
|
|
18
|
+
export function createReconciler(engine, pointerEvents,
|
|
19
|
+
// When set, every entity this reconciler creates is parented to it -- a UiCanvas on the root
|
|
20
|
+
// entity then renders the tree to a texture instead of the screen.
|
|
21
|
+
rootEntity) {
|
|
16
22
|
// Store all the entities so when we destroy the UI we can also destroy them
|
|
17
23
|
const entities = new Set();
|
|
18
24
|
// Store the onChange callbacks to be runned every time a Result has changed
|
|
@@ -29,6 +35,7 @@ export function createReconciler(engine, pointerEvents) {
|
|
|
29
35
|
const UiInputResult = components.UiInputResult(engine);
|
|
30
36
|
const UiDropdown = components.UiDropdown(engine);
|
|
31
37
|
const UiDropdownResult = components.UiDropdownResult(engine);
|
|
38
|
+
const Transform = components.Transform(engine);
|
|
32
39
|
const UiInputBinding = components.UiInputBinding(engine);
|
|
33
40
|
// Component ID Helper
|
|
34
41
|
const getComponentId = {
|
|
@@ -39,10 +46,10 @@ export function createReconciler(engine, pointerEvents) {
|
|
|
39
46
|
uiDropdown: UiDropdown.componentId,
|
|
40
47
|
uiInputBinding: UiInputBinding.componentId
|
|
41
48
|
};
|
|
42
|
-
function pointerEventCallback(entity, pointerEvent) {
|
|
49
|
+
function pointerEventCallback(entity, pointerEvent, event) {
|
|
43
50
|
const callback = clickEvents.get(entity)?.get(pointerEvent);
|
|
44
51
|
if (callback)
|
|
45
|
-
callback();
|
|
52
|
+
callback(event);
|
|
46
53
|
return;
|
|
47
54
|
}
|
|
48
55
|
function updateTree(instance, props) {
|
|
@@ -63,6 +70,15 @@ export function createReconciler(engine, pointerEvents) {
|
|
|
63
70
|
else if (update.component === 'onMouseLeave') {
|
|
64
71
|
pointerEvents.removeOnPointerHoverLeave(instance.entity);
|
|
65
72
|
}
|
|
73
|
+
else if (update.component === 'onMouseDrag') {
|
|
74
|
+
pointerEvents.removeOnPointerDrag(instance.entity);
|
|
75
|
+
}
|
|
76
|
+
else if (update.component === 'onMouseDragLocked') {
|
|
77
|
+
pointerEvents.removeOnPointerDragLocked(instance.entity);
|
|
78
|
+
}
|
|
79
|
+
else if (update.component === 'onMouseDragEnd') {
|
|
80
|
+
pointerEvents.removeOnPointerDragEnd(instance.entity);
|
|
81
|
+
}
|
|
66
82
|
return;
|
|
67
83
|
}
|
|
68
84
|
if (update.props) {
|
|
@@ -78,7 +94,13 @@ export function createReconciler(engine, pointerEvents) {
|
|
|
78
94
|
? pointerEvents.onPointerUp
|
|
79
95
|
: update.component === 'onMouseEnter'
|
|
80
96
|
? pointerEvents.onPointerHoverEnter
|
|
81
|
-
: update.component === 'onMouseLeave'
|
|
97
|
+
: update.component === 'onMouseLeave'
|
|
98
|
+
? pointerEvents.onPointerHoverLeave
|
|
99
|
+
: update.component === 'onMouseDrag'
|
|
100
|
+
? pointerEvents.onPointerDrag
|
|
101
|
+
: update.component === 'onMouseDragLocked'
|
|
102
|
+
? pointerEvents.onPointerDragLocked
|
|
103
|
+
: update.component === 'onMouseDragEnd' && pointerEvents.onPointerDragEnd;
|
|
82
104
|
if (pointerEventSystem) {
|
|
83
105
|
pointerEventSystem({
|
|
84
106
|
entity: instance.entity,
|
|
@@ -88,7 +110,7 @@ export function createReconciler(engine, pointerEvents) {
|
|
|
88
110
|
// This is needed for the renderer to know which entities are clickeables
|
|
89
111
|
showFeedback: true
|
|
90
112
|
}
|
|
91
|
-
}, () => pointerEventCallback(instance.entity, pointerEvent));
|
|
113
|
+
}, (event) => pointerEventCallback(instance.entity, pointerEvent, event));
|
|
92
114
|
}
|
|
93
115
|
}
|
|
94
116
|
}
|
|
@@ -217,6 +239,9 @@ export function createReconciler(engine, pointerEvents) {
|
|
|
217
239
|
...noopConfig,
|
|
218
240
|
createInstance(type, props) {
|
|
219
241
|
const entity = engine.addEntity();
|
|
242
|
+
if (rootEntity !== undefined) {
|
|
243
|
+
Transform.createOrReplace(entity, { parent: rootEntity });
|
|
244
|
+
}
|
|
220
245
|
entities.add(entity);
|
|
221
246
|
const instance = {
|
|
222
247
|
entity,
|
package/dist/reconciler/utils.js
CHANGED
|
@@ -49,6 +49,9 @@ const entityComponent = {
|
|
|
49
49
|
onMouseUp: undefined,
|
|
50
50
|
onMouseEnter: undefined,
|
|
51
51
|
onMouseLeave: undefined,
|
|
52
|
+
onMouseDrag: undefined,
|
|
53
|
+
onMouseDragLocked: undefined,
|
|
54
|
+
onMouseDragEnd: undefined,
|
|
52
55
|
uiInput: undefined,
|
|
53
56
|
uiDropdown: undefined,
|
|
54
57
|
uiInputBinding: undefined
|
package/dist/system.d.ts
CHANGED
|
@@ -74,6 +74,20 @@ export interface ReactBasedUiSystem {
|
|
|
74
74
|
* @param entity - The entity whose UI renderer should be removed
|
|
75
75
|
*/
|
|
76
76
|
removeUiRenderer(entity: Entity): void;
|
|
77
|
+
/**
|
|
78
|
+
* Render a UI tree to a texture. The tree is rooted at `entity`, which must carry a UiCanvas
|
|
79
|
+
* describing the texture; the result can be sampled through `TextureUnion.uiTexture`. Replaces
|
|
80
|
+
* any texture renderer already set on the entity, and is torn down when the entity is removed.
|
|
81
|
+
*
|
|
82
|
+
* @param entity - The UiCanvas entity the UI tree hangs from
|
|
83
|
+
* @param ui - The UI component to render
|
|
84
|
+
*/
|
|
85
|
+
setTextureRenderer(entity: Entity, ui: UiComponent): void;
|
|
86
|
+
/**
|
|
87
|
+
* Remove a texture renderer previously set with setTextureRenderer(), destroying its entities.
|
|
88
|
+
* @param entity - The UiCanvas entity the renderer was set on
|
|
89
|
+
*/
|
|
90
|
+
removeTextureRenderer(entity: Entity): void;
|
|
77
91
|
}
|
|
78
92
|
/**
|
|
79
93
|
* @public
|
package/dist/system.js
CHANGED
|
@@ -47,6 +47,18 @@ export function createReactBasedUiSystem(engine, pointerSystem) {
|
|
|
47
47
|
let uiComponent = undefined;
|
|
48
48
|
let mainOptions = undefined;
|
|
49
49
|
const additionalRenderers = new Map();
|
|
50
|
+
// UI trees rendered to a texture, keyed by their UiCanvas entity. Each needs its own reconciler
|
|
51
|
+
// because the root parent is a per-reconciler property.
|
|
52
|
+
const textureRenderers = new Map();
|
|
53
|
+
function destroyTextureRenderer(entity) {
|
|
54
|
+
const entry = textureRenderers.get(entity);
|
|
55
|
+
if (!entry)
|
|
56
|
+
return;
|
|
57
|
+
textureRenderers.delete(entity);
|
|
58
|
+
for (const uiEntity of entry.renderer.getEntities()) {
|
|
59
|
+
engine.removeEntity(uiEntity);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
50
62
|
const UiCanvasInformation = ecsComponents.UiCanvasInformation(engine);
|
|
51
63
|
// Unique owner to prevent other UI systems resetting this scale factor.
|
|
52
64
|
const uiScaleFactorOwner = Symbol('react-ecs-ui-scale');
|
|
@@ -162,6 +174,14 @@ export function createReactBasedUiSystem(engine, pointerSystem) {
|
|
|
162
174
|
else {
|
|
163
175
|
renderer.update(null);
|
|
164
176
|
}
|
|
177
|
+
for (const [entity, entry] of textureRenderers) {
|
|
178
|
+
if (engine.getEntityState(entity) === EntityState.Removed) {
|
|
179
|
+
destroyTextureRenderer(entity);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
entry.renderer.update(React.createElement(entry.ui));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
165
185
|
}
|
|
166
186
|
function UiScaleSystem() {
|
|
167
187
|
const canvasInfo = UiCanvasInformation.getOrNull(engine.RootEntity);
|
|
@@ -219,6 +239,9 @@ export function createReactBasedUiSystem(engine, pointerSystem) {
|
|
|
219
239
|
for (const entity of renderer.getEntities()) {
|
|
220
240
|
engine.removeEntity(entity);
|
|
221
241
|
}
|
|
242
|
+
for (const entity of textureRenderers.keys()) {
|
|
243
|
+
destroyTextureRenderer(entity);
|
|
244
|
+
}
|
|
222
245
|
},
|
|
223
246
|
setUiRenderer(ui, options) {
|
|
224
247
|
uiComponent = ui;
|
|
@@ -229,6 +252,13 @@ export function createReactBasedUiSystem(engine, pointerSystem) {
|
|
|
229
252
|
},
|
|
230
253
|
removeUiRenderer(entity) {
|
|
231
254
|
additionalRenderers.delete(entity);
|
|
255
|
+
},
|
|
256
|
+
setTextureRenderer(entity, ui) {
|
|
257
|
+
destroyTextureRenderer(entity);
|
|
258
|
+
textureRenderers.set(entity, { renderer: createReconciler(engine, pointerSystem, entity), ui });
|
|
259
|
+
},
|
|
260
|
+
removeTextureRenderer(entity) {
|
|
261
|
+
destroyTextureRenderer(entity);
|
|
232
262
|
}
|
|
233
263
|
};
|
|
234
264
|
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/react-ecs",
|
|
3
3
|
"description": "Decentraland ECS",
|
|
4
|
-
"version": "7.27.1-
|
|
4
|
+
"version": "7.27.1-34101585995.commit-6eb5b5d",
|
|
5
5
|
"author": "DCL",
|
|
6
6
|
"bugs": "https://github.com/decentraland/js-sdk-toolchain/issues",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@dcl/ecs": "7.27.1-
|
|
8
|
+
"@dcl/ecs": "7.27.1-34101585995.commit-6eb5b5d",
|
|
9
9
|
"react": "^18.2.0",
|
|
10
10
|
"react-reconciler": "^0.29.0"
|
|
11
11
|
},
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"tsconfig": "./tsconfig.json"
|
|
41
41
|
},
|
|
42
42
|
"types": "./dist/index.d.ts",
|
|
43
|
-
"commit": "
|
|
43
|
+
"commit": "6eb5b5d604be23e8b88950e2cca42f787b44c700"
|
|
44
44
|
}
|