Ejemplo n.º 1
0
void iARenderer::emitSelectedCells(vtkUnstructuredGrid* selectedCells)
{
	double cell[DIM] = { 0,0,0 };
	double* spacing = getRenderObserver()->GetImageData()->GetSpacing();
	auto selCellPoints = vtkSmartPointer<vtkPoints>::New();
	for (vtkIdType i = 0; i < selectedCells->GetNumberOfCells(); ++i)
	{
		GetCellCenter(selectedCells, i, cell, spacing);
		selCellPoints->InsertNextPoint(cell);
	}
	emit cellsSelected(selCellPoints);
}
Ejemplo n.º 2
0
void GameGrid::RebuildVerts()
{
	cell_size = sf::Vector2f{
		((drive_tex.getSize().x - (margin_left + margin_right)) / numCells.x) - border_size,
		((drive_tex.getSize().y - (margin_top + margin_bot)) / numCells.y) - border_size
	};

	auto bounds = InteractBounds();

	border_verts = sf::VertexArray(sf::Quads, (numCells.x + 1) * 4 + (numCells.y + 1) * 4);
	int i = 0;
	for (int x = 0; x <= numCells.x; x++) { // VERTICAL LINES
		float xPos = bounds.left + (x * (cell_size.x + border_size));

		border_verts[i++].position = { xPos - border_size * 0.5f, bounds.top - border_size * 0.5f };
		border_verts[i++].position = { xPos - border_size * 0.5f, bounds.top + bounds.height - border_size * 0.5f };
		border_verts[i++].position = { xPos + border_size * 0.5f, bounds.top + bounds.height - border_size * 0.5f };
		border_verts[i++].position = { xPos + border_size * 0.5f, bounds.top - border_size * 0.5f };
	}

	for (int y = 0; y <= numCells.y; y++) { // HORIZONAL LINES
		float yPos = bounds.top + (y * (cell_size.y + border_size));

		border_verts[i++].position = { bounds.left - border_size * 0.5f, yPos - border_size * 0.5f };
		border_verts[i++].position = { bounds.left + bounds.width + border_size * 0.5f, yPos - border_size * 0.5f };
		border_verts[i++].position = { bounds.left + bounds.width + border_size * 0.5f, yPos + border_size * 0.5f };
		border_verts[i++].position = { bounds.left - border_size * 0.5f, yPos + border_size * 0.5f };
	}

	cell_verts = sf::VertexArray(sf::Quads, 4 * cellData.size());
	i = 0;
	for (int y = 0; y < numCells.y; y++) {
		for (int x = 0; x < numCells.x; x++) {
			sf::Vector2f pos = GetCellCenter({ x,y });
			sf::Vector2f tl = pos - (cell_size * 0.5f);
			sf::Vector2f br = pos + (cell_size * 0.5f);
			cell_verts[i++].position = tl;
			cell_verts[i++].position = { br.x, tl.y };
			cell_verts[i++].position = br;
			cell_verts[i++].position = { tl.x, br.y };
		}
	}

	for (int i = 0; i < border_verts.getVertexCount(); i++) border_verts[i].color = borderColor;
	for (int i = 0; i < cell_verts.getVertexCount(); i++) cell_verts[i].color = bgColor;
}
Ejemplo n.º 3
0
void PickCallbackFunction(vtkObject* caller, long unsigned int vtkNotUsed(eventId),
	void* clientData, void* vtkNotUsed(callData))
{
	vtkAreaPicker *areaPicker = static_cast<vtkAreaPicker*>(caller);
	iARenderer *ren = static_cast<iARenderer*>(clientData);
	ren->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->RemoveActor(ren->selectedActor);

	auto extractSelection = vtkSmartPointer<vtkExtractSelectedFrustum>::New();
	extractSelection->SetInputData(0, ren->getRenderObserver()->GetImageData());
	extractSelection->PreserveTopologyOff();
	extractSelection->SetFrustum(areaPicker->GetFrustum());
	extractSelection->Update();

	if (!extractSelection->GetOutput()->GetNumberOfElements(vtkUnstructuredGrid::CELL))
	{
		ren->emitNoSelectedCells();
		return;
	}
	
	if (ren->GetInteractor()->GetControlKey() &&
		!ren->GetInteractor()->GetShiftKey())
	{
		// Adds cells to selection
		auto append = vtkSmartPointer<vtkAppendFilter>::New();
		append->AddInputData(ren->finalSelection);
		append->AddInputData(extractSelection->GetOutput());
		append->Update();
		ren->finalSelection->ShallowCopy(append->GetOutput());
	}
	else if (ren->GetInteractor()->GetControlKey() &&
		ren->GetInteractor()->GetShiftKey())
	{
		// Removes cells from selection 
		auto newfinalSel = vtkSmartPointer<vtkUnstructuredGrid>::New();
		newfinalSel->Allocate(1, 1);
		newfinalSel->SetPoints(ren->finalSelection->GetPoints());
		auto currSel = vtkSmartPointer<vtkUnstructuredGrid>::New();
		currSel->ShallowCopy(extractSelection->GetOutput());
		double f_Cell[DIM] = { 0,0,0 }, c_Cell[DIM] = { 0,0,0 };
		double* spacing = ren->getRenderObserver()->GetImageData()->GetSpacing();

		for (vtkIdType i = 0; i < ren->finalSelection->GetNumberOfCells(); ++i)
		{
			bool addCell = true;
			GetCellCenter(ren->finalSelection, i, f_Cell, spacing);
			for (vtkIdType j = 0; j < currSel->GetNumberOfCells(); ++j)
			{
				GetCellCenter(currSel, j, c_Cell, spacing);
				if (f_Cell[0] == c_Cell[0] &&
					f_Cell[1] == c_Cell[1] &&
					f_Cell[2] == c_Cell[2])
				{
					addCell = false;
					break;
				}
			}
			if (addCell)
				newfinalSel->InsertNextCell(ren->finalSelection->GetCell(i)->GetCellType(),
					ren->finalSelection->GetCell(i)->GetPointIds());
		}		
		ren->finalSelection->ShallowCopy(newfinalSel);
	}
	else
	{
		// New selection
		ren->finalSelection->ShallowCopy(extractSelection->GetOutput());
	}
	ren->selectedMapper->Update();
	ren->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(ren->selectedActor);
	ren->emitSelectedCells(ren->finalSelection);
}