added skyplaneEmitter

This commit is contained in:
AndreaRigoni
2026-03-19 15:45:48 +00:00
parent 7c8c7beae4
commit a8a313e5cf
6 changed files with 315 additions and 5 deletions

View File

@@ -6,18 +6,24 @@
#include <vtkPolyDataMapper.h>
#include <vtkTransform.h>
#include <vtkTransformPolyDataFilter.h>
#include <vtkPlaneSource.h>
#include <vtkAppendPolyData.h>
#include <vtkPolyData.h>
#include <vtkProperty.h>
#include "Math/vtkDense.h"
namespace uLib {
namespace Vtk {
vtkEmitterPrimary::vtkEmitterPrimary(Geant::EmitterPrimary &emitter)
: m_emitter(emitter), m_Poly(nullptr), m_Actor(vtkActor::New()) {
: m_emitter(emitter), m_Actor(vtkActor::New()) {
vtkNew<vtkArrowSource> arrow;
// Default arrow is along X+. Rotate to point towards Z- relative to the origin
// Default arrow is along X+.
// Scale it to 1 meter (1000 mm) and rotate to point towards Z- (local)
vtkNew<vtkTransform> transform;
transform->Scale(1000.0, 1000.0, 1000.0);
transform->RotateY(90.0);
vtkNew<vtkTransformPolyDataFilter> transformFilter;
@@ -28,7 +34,7 @@ vtkEmitterPrimary::vtkEmitterPrimary(Geant::EmitterPrimary &emitter)
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(transformFilter->GetOutput());
m_Actor->SetMapper(mapper);
m_Actor->SetScale(1000.0); // 1 meter long
m_Actor->SetScale(1.0);
vtkNew<vtkMatrix4x4> vmat;
Matrix4fToVtk(m_emitter.GetWorldMatrix(), vmat);
@@ -68,5 +74,53 @@ void vtkEmitterPrimary::Update() {
m_emitter.Updated();
}
// -------------------------------------------------------------------------- //
// vtkSkyPlaneEmitterPrimary
vtkSkyPlaneEmitterPrimary::vtkSkyPlaneEmitterPrimary(Geant::SkyPlaneEmitterPrimary &emitter)
: vtkEmitterPrimary(emitter), m_skyEmitter(emitter), m_PlaneSource(vtkPlaneSource::New()) {
vtkNew<vtkAppendPolyData> append;
// Base class constructor already set an arrow. We keep it as a directional indicator.
append->AddInputData(vtkPolyData::SafeDownCast(m_Actor->GetMapper()->GetInput()));
append->AddInputConnection(m_PlaneSource->GetOutputPort());
vtkNew<vtkPolyDataMapper> mapper;
mapper->SetInputConnection(append->GetOutputPort());
m_Actor->SetMapper(mapper);
m_Actor->GetProperty()->SetOpacity(0.5);
m_Actor->GetProperty()->SetColor(0.2, 0.6, 0.9);
this->contentUpdate();
}
vtkSkyPlaneEmitterPrimary::~vtkSkyPlaneEmitterPrimary() {
m_PlaneSource->Delete();
}
void vtkSkyPlaneEmitterPrimary::contentUpdate() {
uLib::Vector2f size = m_skyEmitter.GetSkySize();
m_PlaneSource->SetOrigin(-size(0)/2.0, -size(1)/2.0, 0.0);
m_PlaneSource->SetPoint1( size(0)/2.0, -size(1)/2.0, 0.0);
m_PlaneSource->SetPoint2(-size(0)/2.0, size(1)/2.0, 0.0);
m_PlaneSource->Update();
vtkEmitterPrimary::contentUpdate();
}
// -------------------------------------------------------------------------- //
// vtkQuadMeshEmitterPrimary
vtkQuadMeshEmitterPrimary::vtkQuadMeshEmitterPrimary(Geant::QuadMeshEmitterPrimary &emitter)
: vtkEmitterPrimary(emitter), m_meshEmitter(emitter) {
this->contentUpdate();
}
void vtkQuadMeshEmitterPrimary::contentUpdate() {
// For now stick with the arrow. In the future visualize the mesh if useful.
vtkEmitterPrimary::contentUpdate();
}
} // namespace Vtk
} // namespace uLib