Skip to content

Commit 609e205

Browse files
[prefab] Lazily allocate children array
Now children is a property that is a ReadOnlyArray. The actual data is in _children, and shouldn't be manipulated directly. Instead use the new add/removeChildren functions. These functions also properly handle parenting.
1 parent 2a5673e commit 609e205

13 files changed

Lines changed: 115 additions & 87 deletions

File tree

hide_js/hide/comp/GradientEditor.hx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ class GradientEditor extends Popup {
672672

673673
for (prefab in currentPrefabs) {
674674
if (searchName == "*") {
675-
nextCurrent = nextCurrent.concat(prefab.children);
675+
nextCurrent = nextCurrent.concat(cast prefab.children);
676676
}
677677
else if (searchName == "**") {
678678
nextCurrent = nextCurrent.concat(prefab.flatten());

hide_js/hide/comp/SceneEditor.hx

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,7 +1791,7 @@ class SceneEditor {
17911791
if(Type.getClass(elt.parent) == hrt.prefab.Object3D)
17921792
selectElements([elt.parent]);
17931793
else
1794-
selectElements(elt.parent.children);
1794+
selectElements(elt.parent.children.copy());
17951795

17961796
}
17971797
else if (K.isDown(K.CTRL)) {
@@ -2074,12 +2074,12 @@ class SceneEditor {
20742074
tree.getChildren = (p : hrt.prefab.Prefab) -> {
20752075
if (p == null) {
20762076
if (isSceneTree)
2077-
return sceneData == null ? [] : sceneData.children;
2077+
return sceneData == null ? [] : sceneData._children ?? [];
20782078
return renderPropsRoot == null ? [] : [renderPropsRoot];
20792079
}
20802080

20812081
var ref = Std.downcast(p, Reference);
2082-
var children = (ref != null && ref.refInstance != null && (ref.editMode == Edit || ref.editMode == Override)) ? ref.refInstance.children : p.children;
2082+
var children = ((ref != null && ref.refInstance != null && (ref.editMode == Edit || ref.editMode == Override)) ? ref.refInstance._children : p._children) ?? [];
20832083

20842084
var props = p.getHideProps();
20852085
if (props != null && props.hideChildren != null)
@@ -2293,22 +2293,21 @@ class SceneEditor {
22932293
var p = createDroppedElement(f.relPath, parent, dragData.shiftKey);
22942294
if (p == null)
22952295
continue;
2296-
parent.children.remove(p);
2297-
parent.children.insert(idx, p);
2296+
parent.addChildAt(p, idx);
22982297
queueRebuild(p);
22992298
createdPrefab.push({ p : p, idx : idx });
23002299
}
23012300

23022301
undo.change(Custom((undo) -> {
23032302
if (undo) {
23042303
for (p in createdPrefab) {
2305-
parent.children.remove(p.p);
2304+
parent.removeChild(p.p);
23062305
p.p.editorRemoveInstanceObjects();
23072306
}
23082307
}
23092308
else {
23102309
for (p in createdPrefab) {
2311-
parent.children.insert(p.idx, p.p);
2310+
parent.addChildAt(p.p, p.idx);
23122311
queueRebuild(p.p);
23132312
}
23142313
}
@@ -3872,7 +3871,7 @@ class SceneEditor {
38723871
beginRebuild();
38733872
for (e in elts) {
38743873
removeInstance(e);
3875-
e.parent.children.remove(e);
3874+
e.parent.removeChild(e);
38763875
}
38773876
endRebuild();
38783877
refreshTree(SceneTree, () -> selectElements([], NoHistory));
@@ -3881,7 +3880,7 @@ class SceneEditor {
38813880

38823881
beginRebuild();
38833882
for (e in elts) {
3884-
e.parent.children.push(e);
3883+
e.parent.addChild(e);
38853884
makePrefab(e);
38863885
if (e.parent != null && doRefresh)
38873886
onPrefabChange(e.parent, "children");
@@ -4445,15 +4444,15 @@ class SceneEditor {
44454444
beginRebuild();
44464445
for(e in elts) {
44474446
removeInstance(e);
4448-
e.parent.children.remove(e);
4447+
e.remove();
44494448
}
44504449
endRebuild();
44514450
refreshTree(SceneTree, () -> selectElements([], NoHistory));
44524451
}
44534452
else {
44544453
beginRebuild();
44554454
for(e in elts) {
4456-
e.parent.children.push(e);
4455+
sceneData.addChild(e);
44574456
makePrefab(e);
44584457
}
44594458
endRebuild();
@@ -4638,12 +4637,11 @@ class SceneEditor {
46384637
return null;
46394638

46404639
prefab.parent = parent;
4641-
parent.children.remove(prefab);
4642-
parent.children.insert(index, prefab);
4640+
parent.addChildAt(prefab, index);
46434641

46444642
var ref = Std.downcast(prefab, Reference);
46454643
if (ref != null && (ref.hasCycle() || ref.source == @:privateAccess view.state.path) ) {
4646-
parent.children.remove(ref);
4644+
parent.removeChild(ref);
46474645
hide.Ide.inst.quickError('Reference to $relative is creating a cycle. The reference creation was aborted.');
46484646
return null;
46494647
}
@@ -5206,8 +5204,7 @@ class SceneEditor {
52065204
for(i => elt in elements) {
52075205
@:pirvateAccess var clone = hrt.prefab.Prefab.createFromDynamic(haxe.Json.parse(Ide.inst.toJSON(elt.serialize())), null, elt.parent.shared);
52085206
var index = lastIndex+1+i;
5209-
elt.parent.children.insert(index, clone);
5210-
@:bypassAccessor clone.parent = elt.parent;
5207+
elt.parent.addChildAt(clone, index);
52115208
autoName(clone);
52125209

52135210
queueRebuild(clone);
@@ -5222,8 +5219,8 @@ class SceneEditor {
52225219
onPrefabChange(elt.parent, "children");
52235220

52245221
undoes.push(function(undo) {
5225-
if(undo) elt.parent.children.remove(clone);
5226-
else elt.parent.children.insert(index, clone);
5222+
if(undo) elt.parent.removeChild(clone);
5223+
else elt.parent.addChildAt(clone, index);
52275224
onPrefabChange(elt.parent, "children");
52285225
});
52295226
}
@@ -5290,12 +5287,12 @@ class SceneEditor {
52905287
var parent = elt.parent;
52915288
var index = elt.parent.children.indexOf(elt);
52925289
removeInstance(elt);
5293-
parent.children.remove(elt);
5290+
parent.removeChild(elt);
52945291
uniqueParents.set(parent, true);
52955292
undoes.unshift(function(undo) {
5296-
if(undo) elt.parent.children.insert(index, elt);
5297-
else elt.parent.children.remove(elt);
5298-
onPrefabChange(elt.parent, "children");
5293+
if(undo) parent.addChildAt(elt, index);
5294+
else parent.removeChild(elt);
5295+
onPrefabChange(parent, "children");
52995296
});
53005297
}
53015298

@@ -5349,12 +5346,8 @@ class SceneEditor {
53495346
return Reflect.compare(prefabIndex.get(a), prefabIndex.get(b));
53505347
});
53515348

5352-
var offset = 0;
5353-
for (p in e)
5354-
if (p.parent == to && p.parent.children.indexOf(p) < index)
5355-
offset++;
5356-
var targetIndex = index - offset;
5357-
var exec = reparentImpl(e, to, targetIndex);
5349+
5350+
var exec = reparentImpl(e, to, index);
53585351
undo.change(Custom(function(undo) {
53595352
exec(undo);
53605353
}));
@@ -5418,22 +5411,17 @@ class SceneEditor {
54185411

54195412
effects.push(function(undo) {
54205413
if( undo ) {
5421-
prefab.parent = prevParent;
5422-
checkWantRebuild(toPrefab, prefab);
5423-
5424-
prevParent.children.remove(prefab);
5425-
prevParent.children.insert(prevIndex, prefab);
5414+
prefab.remove(); // ensure prevIndex target the correct slot
5415+
prevParent.addChildAt(prefab, prevIndex);
54265416

5417+
checkWantRebuild(toPrefab, prefab);
54275418
if(obj3d != null && prevTransform != null)
54285419
obj3d.loadTransform(prevTransform);
54295420
if (obj2d != null && prevTransform2d != null)
54305421
obj2d.setTransformMatrix(prevTransform2d);
54315422
} else {
5432-
@:bypassAccessor prefab.parent = toPrefab;
5423+
toPrefab.addChildAt(prefab, index + i);
54335424
checkWantRebuild(prevParent, prefab);
5434-
5435-
prefab.shared = toPrefab.shared;
5436-
toPrefab.children.insert(index + i, prefab);
54375425
if(obj3d != null && newTransform != null)
54385426
obj3d.loadTransform(newTransform);
54395427
if (obj2d != null && newTransform2d != null)
@@ -5448,9 +5436,6 @@ class SceneEditor {
54485436
function exec(undo: Bool) {
54495437
beginRebuild();
54505438

5451-
for (prefab in prefabs) {
5452-
prefab.parent.children.remove(prefab);
5453-
}
54545439

54555440
for (effect in effects) {
54565441
effect(undo);

hide_js/hide/view/FXEditor.hx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ class FXEditor extends hide.view.FileView {
694694
while (toRemove.length > 0) {
695695
var c = toRemove.pop();
696696
//c.removeInstance();
697-
c.parent.children.remove(c);
697+
c.remove();
698698
}
699699
}
700700

@@ -1364,9 +1364,9 @@ class FXEditor extends hide.view.FileView {
13641364
undo.change(Custom(function(undo) {
13651365
for(c in added) {
13661366
if(undo)
1367-
element.children.remove(c);
1367+
c.remove();
13681368
else
1369-
element.children.push(c);
1369+
element.addChild(c);
13701370
}
13711371
sceneEditor.queueRebuild(@:privateAccess sceneEditor.sceneData);
13721372
sceneEditor.queueRebuildCallback(() -> @:privateAccess sceneEditor.refreshTree(SceneTree, () -> sceneEditor.selectElements(!undo ? [for (a in added) a] : [], NoHistory)));

hide_js/hide/view/Model.hx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,8 +1886,8 @@ class Model extends FileView {
18861886

18871887
// Remove current library to create a new one with the actual render prop
18881888
root = new hrt.prefab.Prefab(null, null);
1889-
for (c in @:privateAccess sceneEditor.sceneData.children)
1890-
@:privateAccess sceneEditor.sceneData.children.remove(c);
1889+
for (c in @:privateAccess sceneEditor.sceneData.children.copy())
1890+
@:privateAccess c.remove();
18911891

18921892
if (sceneEditor.renderPropsRoot != null) {
18931893
@:privateAccess sceneEditor.removeInstance(sceneEditor.renderPropsRoot);
@@ -1897,7 +1897,7 @@ class Model extends FileView {
18971897
@:privateAccess sceneEditor.queueRefreshRenderProps();
18981898

18991899
if (sceneEditor.renderPropsRoot != null && sceneEditor.renderPropsRoot.source != null)
1900-
root.children.push(sceneEditor.renderPropsRoot);
1900+
root.addChild(sceneEditor.renderPropsRoot);
19011901

19021902
// Create default render props if no render props has been created yet
19031903
var r = root.getOpt(hrt.prefab.RenderProps, true);

hide_js/hide/view/l3d/LightProbeBaker.hx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class LightProbeBaker {
7171
function filter( p : hrt.prefab.Prefab ) {
7272
for( c in p.children ) {
7373
if(!keep(c))
74-
sceneData.children.remove(c);
74+
c.remove();
7575
}
7676
for( c in p.children )
7777
filter(c);

hrt/prefab/Model.hx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,15 @@ class Model extends Object3D {
123123
function change(toRemove : hrt.prefab.Object3D, toAddPath : String, undo : Bool) {
124124
var parent = toRemove.parent;
125125
var idx = parent.children.indexOf(toRemove);
126-
parent.children.remove(toRemove);
126+
toRemove.remove();
127127
toRemove.local3d.remove();
128128

129129
var toAdd = undo ? new hrt.prefab.Model(null, toRemove.shared) : new hrt.prefab.Reference(null, toRemove.shared);
130130
toAdd.source = toAddPath;
131131
toAdd.name = toRemove.name;
132132
toAdd.props = toRemove.props;
133133
toAdd.setTransform(toRemove.getTransform());
134-
parent.children.insert(idx, toAdd);
134+
parent.addChildAt(toAdd, idx);
135135
@:bypassAccessor toAdd.parent = parent;
136136
@:privateAccess ctx.scene.editor.rebuild(toAdd);
137137
}

0 commit comments

Comments
 (0)