Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Moved isolate select scene index creation to avoid losing isolate sel… #197

Merged
merged 1 commit into from
Nov 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 16 additions & 14 deletions lib/mayaHydra/mayaPlugin/renderOverride.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,22 @@ void MtohRenderOverride::_InitHydraResources(const MHWRender::MDrawContext& draw
_dirtyLeadObjectSceneIndex = MAYAHYDRA_NS::MhDirtyLeadObjectSceneIndex::New(_inputSceneIndexOfFilteringSceneIndicesChain);
_inputSceneIndexOfFilteringSceneIndicesChain = _dirtyLeadObjectSceneIndex;

#ifdef MAYA_HAS_VIEW_SELECTED_OBJECT_API
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved from _CreateSceneIndicesChainAfterMergingSceneIndex(). The isolate select scene index is independent of display style and therefore does not need to be re-created on shading change (e.g. bounding box mode).

// _InitHydraResources() is always called from Render(), so
// getFrameContext() will be valid and non-null.
auto viewportId = getRenderingDestination(getFrameContext());

// Add isolate select scene index.
auto& perVpDataMgr = Fvp::ViewportDataMgr::Get();
auto selection = perVpDataMgr.GetOrCreateIsolateSelection(viewportId);
auto isSi = Fvp::IsolateSelectSceneIndex::New(
viewportId, selection, _inputSceneIndexOfFilteringSceneIndicesChain);
// At time of writing we have a single selection scene index serving
// all viewports.
perVpDataMgr.SetIsolateSelectSceneIndex(isSi);
_inputSceneIndexOfFilteringSceneIndicesChain = isSi;
#endif

// Set the initial selection onto the selection scene index later.
_needToReplaceSelection = true;

Expand Down Expand Up @@ -1203,21 +1219,7 @@ void MtohRenderOverride::_CreateSceneIndicesChainAfterMergingSceneIndex(const MH
{
//This function is where happens the ordering of filtering scene indices that are after the merging scene index
//We use as its input scene index : _inputSceneIndexOfFilteringSceneIndicesChain
#ifdef MAYA_HAS_VIEW_SELECTED_OBJECT_API
auto viewportId = getRenderingDestination(getFrameContext());

// Add isolate select scene index.
auto& perVpDataMgr = Fvp::ViewportDataMgr::Get();
auto selection = perVpDataMgr.GetOrCreateIsolateSelection(viewportId);
auto isSi = Fvp::IsolateSelectSceneIndex::New(
viewportId, selection, _inputSceneIndexOfFilteringSceneIndicesChain);
// At time of writing we have a single selection scene index serving
// all viewports.
perVpDataMgr.SetIsolateSelectSceneIndex(isSi);
_lastFilteringSceneIndexBeforeCustomFiltering = isSi;
#else
_lastFilteringSceneIndexBeforeCustomFiltering = _inputSceneIndexOfFilteringSceneIndicesChain;
#endif

// Add display style scene index
_lastFilteringSceneIndexBeforeCustomFiltering = _displayStyleSceneIndex =
Expand Down
1 change: 1 addition & 0 deletions test/lib/mayaUsd/render/mayaToHydra/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ if (MAYA_HAS_VIEW_SELECTED_OBJECT_API)
cpp/testIsolateSelect.py
cpp/testUsdNativeInstancingIsolateSelect.py
cpp/testUsdPointInstancingIsolateSelect.py
cpp/testUsdPointInstancingIsolateSelectBBox.py
)
endif()

Expand Down
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without the fix, the test fails. With the fix, the test passes.

Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Copyright 2024 Autodesk
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import fixturesUtils
import mtohUtils
import mayaUsd
import mayaUsd_createStageWithNewLayer
import maya.cmds as cmds
import maya.mel as mel
import usdUtils
from pxr import UsdGeom
import testUtils

def enableIsolateSelect(modelPanel):
# Surprisingly
#
# cmds.isolateSelect('modelPanel1', state=1)
#
# is insufficient to turn on isolate selection in a viewport, and we must
# use the MEL script used by the menu and Ctrl-1 hotkey. This is because
# the viewport uses the selectionConnection command to filter the selection
# it receives and create its isolate selection, and the the
# mainListConnection, lockMainConnection and unlockMainConnection flags of
# the editor command to suspend changes to its selection connection. See
# the documentation for more details.
cmds.setFocus(modelPanel)
mel.eval("enableIsolateSelect %s 1" % modelPanel)

def disableIsolateSelect(modelPanel):
cmds.setFocus(modelPanel)
mel.eval("enableIsolateSelect %s 0" % modelPanel)

# This test is identical to the one in testIsolateSelect.py, except for
# disabled tests. See HYDRA-1245.

class TestUsdPointInstancingIsolateSelectBBox(mtohUtils.MayaHydraBaseTestCase):
# MayaHydraBaseTestCase.setUpClass requirement.
_file = __file__

# Base class setUp() defines HdStorm as the renderer.

_pluginsToLoad = ['mayaHydraCppTests', 'mayaHydraFlowViewportAPILocator']
_pluginsToUnload = []

@classmethod
def setUpClass(cls):
super(TestUsdPointInstancingIsolateSelectBBox, cls).setUpClass()
for p in cls._pluginsToLoad:
if not cmds.pluginInfo(p, q=True, loaded=True):
cls._pluginsToUnload.append(p)
cmds.loadPlugin(p, quiet=True)

@classmethod
def tearDownClass(cls):
super(TestUsdPointInstancingIsolateSelectBBox, cls).tearDownClass()
# Clean out the scene to allow all plugins to unload cleanly.
cmds.file(new=True, force=True)
for p in reversed(cls._pluginsToUnload):
if p != 'mayaHydraFlowViewportAPILocator':
cmds.unloadPlugin(p)

def setupScene(self):
self.proxyShapePathStr = mayaUsd_createStageWithNewLayer.createStageWithNewLayer()
stage = mayaUsd.lib.GetPrim(self.proxyShapePathStr).GetStage()

# Add in a point instancer and its point instances.
ref = stage.DefinePrim('/ref')
piScenePath = testUtils.getTestScene('testUsdPointInstances', 'pointInstancer.usda')
ref.GetReferences().AddReference(str(piScenePath))
self.pointInstancerPath = self.proxyShapePathStr + ',/ref/CubePointInstancer'

scene = [self.pointInstancerPath]

# Point instances
for i in range(0, 14):
scene.append(self.pointInstancerPath + ('/%s' % i))

return scene

def assertVisible(self, visible):
for v in visible:
self.trace("Testing %s for visibility\n" % v)
cmds.mayaHydraCppTest(v, f="TestHydraPrim.isVisible")

def assertNotVisible(self, notVisible):
for nv in notVisible:
self.trace("Testing %s for invisibility\n" % nv)
cmds.mayaHydraCppTest(nv, f="TestHydraPrim.notVisible")

def assertVisibility(self, visible, notVisible):
self.assertVisible(visible)
self.assertNotVisible(notVisible)

def assertIsolateSelect(self, modelPanel, visible, scene):
cmds.select(*visible)
cmds.editor(modelPanel, edit=True, updateMainConnection=True)
cmds.isolateSelect(modelPanel, loadSelected=True)

notVisible = scene.copy()

for p in visible:
notVisible.remove(p)

cmds.refresh()

self.assertVisibility(visible, notVisible)

def notVisible(self, scene, visible):
notVisible = scene.copy()

for p in visible:
notVisible.remove(p)

return notVisible

def test_isolateSelectPointInstancing(self):

scene = self.setupScene()

cmds.select(clear=True)

# Isolate select not turned on, everything visible.
visible = scene
notVisible = []

cmds.refresh()

self.assertVisibility(visible, notVisible)

# Turn isolate select on, nothing selected, nothing visible.
visible = []
notVisible = scene

modelPanel = 'modelPanel4'
enableIsolateSelect(modelPanel)

cmds.refresh()

self.assertVisibility(visible, notVisible)

# Select various point instances. The instancer itself will be visible,
# everything else not visible.
visible = [
self.pointInstancerPath, self.pointInstancerPath + '/0',
self.pointInstancerPath + '/3', self.pointInstancerPath + '/12']
self.assertIsolateSelect(modelPanel, visible, scene)

cmds.modelEditor(modelPanel, edit=True, displayAppearance='boundingBox')

cmds.refresh()

self.assertVisibility(visible, self.notVisible(scene, visible))

disableIsolateSelect(modelPanel)

if __name__ == '__main__':
fixturesUtils.runTests(globals())