Skip to content

Commit a6b2932

Browse files
committed
Fixed some instance selection issues
1 parent bbfd1b0 commit a6b2932

4 files changed

Lines changed: 44 additions & 5 deletions

File tree

editor/window/SceneWindow.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,17 @@ void editor::SceneWindow::sceneEventHandler(SceneProject* sceneProject) {
575575
std::vector<Entity> selEntities = project->getSelectedEntities(sceneId);
576576
if (selEntities.size() == 1 && !io.KeyShift) {
577577
Entity selEntity = selEntities[0];
578-
bool gizmoSideActiveLocal = sceneProject->sceneRender->isAnyGizmoSideSelected();
579-
if (!gizmoSideActiveLocal) {
578+
bool blockInstanceHit;
579+
if (gizmoSelected == GizmoSelected::OBJECT2D) {
580+
// With the 2D gizmo, CENTER is set when hovering over the entity body —
581+
// the same region where instances live. Allow hit-testing in that case,
582+
// mirroring the logic used for tile sub-selection.
583+
Gizmo2DSideSelected gizmo2DSide = sceneProject->sceneRender->getToolsLayer()->getGizmo2DSideSelected();
584+
blockInstanceHit = !(gizmo2DSide == Gizmo2DSideSelected::NONE || gizmo2DSide == Gizmo2DSideSelected::CENTER);
585+
} else {
586+
blockInstanceHit = sceneProject->sceneRender->isAnyGizmoSideSelected();
587+
}
588+
if (!blockInstanceHit) {
580589
int instHit = sceneProject->sceneRender->hitTestInstance(selEntity, x, y);
581590
if (instHit >= 0) {
582591
sceneProject->sceneRender->selectInstance(selEntity, instHit);

editor/window/Structure.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include "command/type/DeleteEntityCmd.h"
1212
#include "command/type/DuplicateEntityCmd.h"
1313
#include "command/type/AddComponentCmd.h"
14+
#include "command/type/MultiPropertyCmd.h"
15+
#include "component/InstancedMeshComponent.h"
1416
#include "command/type/ImportEntityBundleCmd.h"
1517
#include "command/type/RemoveEntityFromBundleCmd.h"
1618
#include "command/type/AddEntityToBundleCmd.h"
@@ -880,13 +882,33 @@ void editor::Structure::showTreeNode(editor::TreeNode& node) {
880882
selectedScenes.clear();
881883
project->addSelectedEntity(node.entitySceneId, node.id);
882884
project->setSelectedSceneForProperties(node.entitySceneId);
885+
// Clear any selected instance or tile that belonged to this entity
886+
SceneProject* sp = project->getScene(node.entitySceneId);
887+
if (sp && sp->sceneRender) {
888+
if (sp->sceneRender->getSelectedInstanceEntity() == node.id) {
889+
sp->sceneRender->clearInstanceSelection();
890+
}
891+
if (sp->sceneRender->getSelectedTileEntity() == (Entity)node.id) {
892+
sp->sceneRender->clearTileSelection();
893+
}
894+
}
883895
} else if (!node.isScene){
884896
ImGuiIO& io = ImGui::GetIO();
885897
if (!io.KeyShift){
886898
project->clearAllSelections(project->getSelectedSceneId());
887899
}
888900
project->addSelectedEntity(project->getSelectedSceneId(), node.id);
889901
project->setSelectedSceneForProperties(project->getSelectedSceneId());
902+
// Clear any selected instance or tile that belonged to this entity
903+
SceneProject* sp = project->getSelectedScene();
904+
if (sp && sp->sceneRender) {
905+
if (sp->sceneRender->getSelectedInstanceEntity() == node.id) {
906+
sp->sceneRender->clearInstanceSelection();
907+
}
908+
if (sp->sceneRender->getSelectedTileEntity() == (Entity)node.id) {
909+
sp->sceneRender->clearTileSelection();
910+
}
911+
}
890912
}else{
891913
project->clearAllSelections(project->getSelectedSceneId());
892914
selectedScenes.clear();
@@ -1011,7 +1033,11 @@ void editor::Structure::showTreeNode(editor::TreeNode& node) {
10111033
bool hasMesh = signature.test(selectedScene->scene->getComponentId<MeshComponent>());
10121034
bool hasInstanced = signature.test(selectedScene->scene->getComponentId<InstancedMeshComponent>());
10131035
if (hasMesh && ImGui::MenuItem(ICON_FA_LAYER_GROUP " Add Instanced Mesh", nullptr, false, !node.isLocked && !hasInstanced)) {
1014-
CommandHandle::get(project->getSelectedSceneId())->addCommandNoMerge(new AddComponentCmd(project, project->getSelectedSceneId(), node.id, ComponentType::InstancedMeshComponent));
1036+
MultiPropertyCmd* multiCmd = new MultiPropertyCmd();
1037+
multiCmd->addCommand(std::make_unique<AddComponentCmd>(project, project->getSelectedSceneId(), node.id, ComponentType::InstancedMeshComponent));
1038+
std::vector<InstanceData> initialInstances = { InstanceData() };
1039+
multiCmd->addPropertyCmd<std::vector<InstanceData>>(project, project->getSelectedSceneId(), node.id, ComponentType::InstancedMeshComponent, "instances", initialInstances);
1040+
CommandHandle::get(project->getSelectedSceneId())->addCommandNoMerge(multiCmd);
10151041
}
10161042
}
10171043
}

engine/core/subsystem/MeshSystem.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2948,6 +2948,8 @@ void MeshSystem::onComponentRemoved(Entity entity, ComponentId componentId) {
29482948
}
29492949
if (componentId == scene->getComponentId<InstancedMeshComponent>()) {
29502950
if (MeshComponent* mesh = scene->findComponent<MeshComponent>(entity)) {
2951+
mesh->aabb = mesh->verticesAABB;
2952+
mesh->needUpdateAABB = true;
29512953
if (mesh->loaded) mesh->needReload = true;
29522954
}
29532955
}

engine/core/subsystem/RenderSystem.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2903,11 +2903,13 @@ void RenderSystem::update(double dt){
29032903
if (instmesh){
29042904
bool sortTransparentInstances = mesh.transparent && mainCamera.type != CameraType::CAMERA_UI;
29052905

2906-
if (instmesh->needUpdateInstances && !instmesh->instancedBillboard){
2906+
bool instancesNeedUpdate = instmesh->needUpdateInstances || mesh.needUpdateAABB;
2907+
2908+
if (instancesNeedUpdate && !instmesh->instancedBillboard){
29072909
updateInstancedMesh(*instmesh, mesh, transform, mainCamera, mainCameraTransform);
29082910
}
29092911

2910-
if (instmesh->needUpdateInstances || ((mainCamera.needUpdate || transform.needUpdate) && sortTransparentInstances)){
2912+
if (instancesNeedUpdate || ((mainCamera.needUpdate || transform.needUpdate) && sortTransparentInstances)){
29112913
if (!hasMultipleCameras || !sortTransparentInstances){
29122914
if (instmesh->instancedBillboard){
29132915
updateInstancedMesh(*instmesh, mesh, transform, mainCamera, mainCameraTransform);

0 commit comments

Comments
 (0)