void My_TestGLDrawing::DrawScene() { _Clear(); int width = GetWidth(), height = GetHeight(); GfMatrix4d viewMatrix = GetViewMatrix(); GfFrustum frustum = GetFrustum(); GfVec4d viewport(0, 0, width, height); GfMatrix4d projMatrix = frustum.ComputeProjectionMatrix(); _delegate->SetCamera(viewMatrix, projMatrix); glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); SdfPath renderSetupTask("/renderSetupTask"); SdfPath renderTask("/renderTask"); SdfPath selectionTask("/selectionTask"); // viewport HdxRenderTaskParams param = _delegate->GetTaskParam( renderSetupTask, HdTokens->params).Get<HdxRenderTaskParams>(); param.viewport = viewport; _delegate->SetTaskParam(renderSetupTask, HdTokens->params, VtValue(param)); HdTaskSharedPtrVector tasks; tasks.push_back(_delegate->GetRenderIndex().GetTask(renderSetupTask)); tasks.push_back(_delegate->GetRenderIndex().GetTask(renderTask)); tasks.push_back(_delegate->GetRenderIndex().GetTask(selectionTask)); glEnable(GL_DEPTH_TEST); glBindVertexArray(vao); VtValue v(_picker.GetSelectionTracker()); _engine.SetTaskContextData(HdxTokens->selectionState, v); _engine.Execute(_delegate->GetRenderIndex(), tasks); glBindVertexArray(0); }
void My_TestGLDrawing:: DrawScene(PickParam const * pickParam) { int width = GetWidth(), height = GetHeight(); GfMatrix4d viewMatrix = GetViewMatrix(); GfFrustum frustum = GetFrustum(); GfVec4d viewport(0, 0, width, height); if (pickParam) { frustum = frustum.ComputeNarrowedFrustum( GfVec2d((2.0 * pickParam->location[0]) / width - 1.0, (2.0 * (height-pickParam->location[1])) / height - 1.0), GfVec2d(1.0 / width, 1.0 / height)); viewport = pickParam->viewport; } GfMatrix4d projMatrix = frustum.ComputeProjectionMatrix(); _delegate->SetCamera(viewMatrix, projMatrix); glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); HdTaskSharedPtrVector tasks; SdfPath renderSetupTask("/renderSetupTask"); SdfPath renderTask("/renderTask"); tasks.push_back(_delegate->GetRenderIndex().GetTask(renderSetupTask)); tasks.push_back(_delegate->GetRenderIndex().GetTask(renderTask)); HdxRenderTaskParams param = _delegate->GetTaskParam( renderSetupTask, HdTokens->params).Get<HdxRenderTaskParams>(); param.enableIdRender = (pickParam != NULL); param.viewport = viewport; _delegate->SetTaskParam(renderSetupTask, HdTokens->params, VtValue(param)); glEnable(GL_DEPTH_TEST); glBindVertexArray(vao); _engine.Execute(_delegate->GetRenderIndex(), tasks); glBindVertexArray(0); }
static void CameraAndLightTest() { HdStRenderDelegate renderDelegate; std::unique_ptr<HdRenderIndex> index(HdRenderIndex::New(&renderDelegate)); TF_VERIFY(index); std::unique_ptr<Hdx_UnitTestDelegate> delegate( new Hdx_UnitTestDelegate(index.get())); HdChangeTracker& tracker = index->GetChangeTracker(); HdPerfLog& perfLog = HdPerfLog::GetInstance(); perfLog.Enable(); HdRprimCollection collection(HdTokens->geometry, HdTokens->hull); HdRenderPassStateSharedPtr renderPassState(new HdRenderPassState()); HdRenderPassSharedPtr renderPass( new HdSt_RenderPass(index.get(), collection)); HdEngine engine; HdTaskSharedPtr drawTask = boost::make_shared<Hd_TestTask>(renderPass, renderPassState); HdTaskSharedPtrVector tasks = { drawTask }; GfMatrix4d tx(1.0f); tx.SetRow(3, GfVec4f(5, 0, 5, 1.0)); SdfPath cube("geometry"); delegate->AddCube(cube, tx); SdfPath camera("camera"); SdfPath light("light"); delegate->AddCamera(camera); delegate->AddLight(light, GlfSimpleLight()); delegate->SetLight(light, HdStLightTokens->shadowCollection, VtValue(HdRprimCollection(HdTokens->geometry, HdTokens->hull))); engine.Execute(*index, tasks); VERIFY_PERF_COUNT(HdPerfTokens->rebuildBatches, 1); // Update camera matrix delegate->SetCamera(camera, GfMatrix4d(2), GfMatrix4d(2)); tracker.MarkSprimDirty(camera, HdStCamera::DirtyViewMatrix); tracker.MarkSprimDirty(camera, HdStCamera::DirtyProjMatrix); engine.Execute(*index, tasks); // batch should not be rebuilt VERIFY_PERF_COUNT(HdPerfTokens->rebuildBatches, 1); // Update shadow collection delegate->SetLight(light, HdStLightTokens->shadowCollection, VtValue(HdRprimCollection(HdTokens->geometry, HdTokens->refined))); tracker.MarkSprimDirty(light, HdStLight::DirtyCollection); engine.Execute(*index, tasks); // batch rebuilt VERIFY_PERF_COUNT(HdPerfTokens->rebuildBatches, 2); // Update shadow collection again with the same data delegate->SetLight(light, HdStLightTokens->shadowCollection, VtValue(HdRprimCollection(HdTokens->geometry, HdTokens->refined))); tracker.MarkSprimDirty(light, HdStLight::DirtyCollection); engine.Execute(*index, tasks); // batch should not be rebuilt VERIFY_PERF_COUNT(HdPerfTokens->rebuildBatches, 2); }