# Multiple renderers in same renderwindow - get event only from the one that was interacted with

**URL:** https://discourse.vtk.org/t/multiple-renderers-in-same-renderwindow-get-event-only-from-the-one-that-was-interacted-with/6775
**Category:** Support
**Created:** [October 7, 2021, 10:54am UTC](https://discourse.vtk.org/t/multiple-renderers-in-same-renderwindow-get-event-only-from-the-one-that-was-interacted-with/6775 "2021-10-07T10:54:53Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![codeling](https://discourse.vtk.org/user_avatar/discourse.vtk.org/codeling/32/3792_2.png) [@codeling](https://discourse.vtk.org/u/codeling)
#### Post date: [October 7, 2021, 10:54am UTC](https://discourse.vtk.org/t/multiple-renderers-in-same-renderwindow-get-event-only-from-the-one-that-was-interacted-with/6775/1 "2021-10-07T10:54:53Z")

</div>

My issue:  
I want to react on the event that a user interacted with a specific `vtkRenderer` in a `vtkRenderWindow` with multiple renderers, each with a separate viewport.

For that purpose, I am observing the `vtkCommand::EndEvent` of each of the renderers. As the situation presents itself to me currently, it seems that any interaction with one of the renderers will trigger an EndEvent for **all** renderers in that RenderWindow.

Is there some other event that I should subscribe to, that will give me **only** an event for the renderer that was actually interacted with?

My test code:

```auto
#include <vtkActor.h>
#include <vtkCommand.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSphereSource.h>

#include <map>

class RenObserver
{
public:
	void addRen(vtkRenderer* ren, int id)
	{
		ren->AddObserver(vtkCommand::EndEvent, this, &RenObserver::endEventTest);
		m_rendererID.emplace(ren, id);
	}
	void endEventTest(vtkObject* caller, long unsigned int /*eventId*/, void* /*callData*/)
	{
		std::cout << "EndEvent, r=" << m_rendererID[dynamic_cast<vtkRenderer*>(caller)] << std::endl;
	}
private:
	std::map<vtkRenderer*, int> m_rendererID;
};

int main(int, char*[])
{
	vtkNew<vtkRenderWindow> renderWindow;
	vtkNew<vtkRenderWindowInteractor> interactor;
	interactor->SetRenderWindow(renderWindow);
	renderWindow->SetSize(300, 300);
	renderWindow->SetWindowName("MultiViewPort");
	RenObserver obs;
	const int RenderCount = 3;
	for (int i=0; i<RenderCount; ++i)
	{
		vtkNew<vtkRenderer> renderer;
		double perc = static_cast<double>(i) / RenderCount;
		renderer->SetBackground(perc, perc, perc);
		renderer->SetViewport(perc, 0, static_cast<double>(i + 1) / RenderCount, 1);
		vtkNew<vtkSphereSource> sphereSource;
		vtkNew<vtkPolyDataMapper> mapper;
		mapper->SetInputConnection(sphereSource->GetOutputPort());
		vtkNew<vtkActor> actor;
		actor->SetMapper(mapper);
		actor->GetProperty()->SetColor(1-perc, 1-perc, 1-perc);
		renderer->AddActor(actor);
		obs.addRen(renderer, i);
		renderWindow->AddRenderer(renderer);
	}
	interactor->Initialize();
	renderWindow->Render();
	interactor->Start();
	return EXIT_SUCCESS;
}

```

Each time I interact with one of the renderers (that is, click (and drag) the mouse, etc.), the program’s output is:

```auto
EndEvent, r=0
EndEvent, r=1
EndEvent, r=2

```

So from these events I cannot tell with which renderer the user has interacted. There is one event per renderer, and the events always come in the same order, no matter which of the renderers actually was interacted with…

(Completely rewrote my original post, as I have more insight now.)

---

<div class="post-metadata">

### Author: ![codeling](https://discourse.vtk.org/user_avatar/discourse.vtk.org/codeling/32/3792_2.png) [@codeling](https://discourse.vtk.org/u/codeling)
#### Post date: [October 28, 2021, 8:35am UTC](https://discourse.vtk.org/t/multiple-renderers-in-same-renderwindow-get-event-only-from-the-one-that-was-interacted-with/6775/2 "2021-10-28T08:35:50Z")

</div>

Finally figured it out - I actually need to observe the camera, not the renderer, and I can subscribe to the vtkCommand::ModifiedEvent of the vtkCamera directly, that gives the expected result!
