Files
uLib/src/Vtk/vtkViewport.h

108 lines
3.0 KiB
C++

#ifndef ULIB_VTK_VIEWPORT_H
#define ULIB_VTK_VIEWPORT_H
#include "uLibVtkInterface.h"
#include <vector>
#include <map>
namespace uLib { class Object; }
// VTK classes are in the global namespace
class vtkRenderer;
class vtkCornerAnnotation;
class vtkOrientationMarkerWidget;
class vtkCameraOrientationWidget;
class vtkPlaneSource;
class vtkActor;
class vtkAxes;
class vtkNamedColors;
class vtkCellPicker;
class vtkCallbackCommand;
class vtkProp;
class vtk3DWidget;
class vtkRenderWindow;
class vtkRenderWindowInteractor;
class vtkCamera;
namespace uLib {
namespace Vtk {
struct ViewportData;
class HandlerWidget;
class MultiSelectionProp;
class ObjectsContext;
/**
* @class Viewport
* @brief Base class for VTK viewports, providing core rendering and prop management.
*/
class Viewport {
public:
Viewport();
virtual ~Viewport();
// Render scene
virtual void Render() = 0;
void Reset();
void ZoomAuto();
void ZoomSelected();
// Prop3D / prop management
void AddProp3D(Prop3D &prop);
void RemoveProp3D(Prop3D &prop);
/** @brief Selects a specific Prop3D. If multi is true, it toggles selection in a group. */
void SelectProp3D(Prop3D* target, bool multi = false);
/** @brief Creates a persistent Selection Group from the current multi-selection. */
void GroupSelection(uLib::ObjectsContext* targetCtx);
void addProp(vtkProp *prop);
void RemoveProp(vtkProp *prop);
// Widget integration
void AddWidget(vtk3DWidget *widget);
// Direct access to VTK internals
vtkRenderer* GetRenderer();
virtual vtkRenderWindow* GetRenderWindow() = 0;
virtual vtkRenderWindowInteractor* GetInteractor() = 0;
vtkCornerAnnotation* GetAnnotation();
vtkCameraOrientationWidget* GetCameraWidget();
void DisableHandler();
virtual void OnSelectionChanged(Prop3D* p) {}
const std::vector<Prop3D*>& getProp3Ds() const { return m_Prop3Ds; }
// Grid control
void SetGridVisible(bool visible);
bool GetGridVisible() const;
enum Axis { X=0, Y, Z };
void SetGridAxis(Axis axis);
Axis GetGridAxis() const { return m_GridAxis; }
// Projection control
void SetParallelProjection(bool parallel);
bool GetParallelProjection() const;
protected:
void SetupPipeline(vtkRenderWindowInteractor* iren);
void UpdateGrid();
// Internal Prop3D registration
void RegisterProp3D(Prop3D* p, bool isPart = false);
void UnregisterProp3D(Prop3D* p);
void ObserveContext(ObjectsContext* ctx);
struct ViewportData *pv;
Axis m_GridAxis;
std::vector<Prop3D*> m_Prop3Ds;
std::vector<Prop3D*> m_SelectedProps;
MultiSelectionProp* m_MultiSelectionProp;
std::map<uLib::Object*, Prop3D*> m_ObjectToProp3D;
};
} // namespace Vtk
} // namespace uLib
#endif // ULIB_VTK_VIEWPORT_H