You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
4.7 KiB
C++
172 lines
4.7 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkFlagpoleLabel.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkFlagpoleLabel
|
|
* @brief Renders a flagpole (line) with a label at the top that faces the camera
|
|
*
|
|
* This class draws a line from the base to the top of the flagpole. It then
|
|
* places a text annotation at the top, centered horizontally. The text is
|
|
* always oriented with the flagpole but will rotate aroundthe flagpole to
|
|
* face the camera.
|
|
*/
|
|
|
|
#ifndef vtkFlagpoleLabel_h
|
|
#define vtkFlagpoleLabel_h
|
|
|
|
#include "vtkActor.h"
|
|
#include "vtkNew.h" // For.... vtkNew!
|
|
#include "vtkRenderingCoreModule.h" // For export macro
|
|
#include "vtkSmartPointer.h" // For.... vtkSmartPointer!
|
|
|
|
class vtkActor;
|
|
class vtkImageData;
|
|
class vtkLineSource;
|
|
class vtkPolyData;
|
|
class vtkPolyDataMapper;
|
|
class vtkRenderer;
|
|
class vtkTextProperty;
|
|
class vtkTextRenderer;
|
|
|
|
class VTKRENDERINGCORE_EXPORT vtkFlagpoleLabel : public vtkActor
|
|
{
|
|
public:
|
|
static vtkFlagpoleLabel* New();
|
|
vtkTypeMacro(vtkFlagpoleLabel, vtkActor);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* The UTF-8 encoded string to display.
|
|
* @{
|
|
*/
|
|
void SetInput(const char* in);
|
|
vtkGetStringMacro(Input);
|
|
/** @} */
|
|
|
|
/**
|
|
* The vtkTextProperty object that controls the rendered text.
|
|
* @{
|
|
*/
|
|
void SetTextProperty(vtkTextProperty* tprop);
|
|
vtkGetObjectMacro(TextProperty, vtkTextProperty);
|
|
/** @} */
|
|
|
|
/**
|
|
* Force the actor to render during the opaque or translucent pass.
|
|
* @{
|
|
*/
|
|
void SetForceOpaque(bool opaque) override;
|
|
bool GetForceOpaque() override;
|
|
void ForceOpaqueOn() override;
|
|
void ForceOpaqueOff() override;
|
|
void SetForceTranslucent(bool trans) override;
|
|
bool GetForceTranslucent() override;
|
|
void ForceTranslucentOn() override;
|
|
void ForceTranslucentOff() override;
|
|
/**@}*/
|
|
|
|
/**
|
|
* Defers to internal actor.
|
|
*/
|
|
vtkTypeBool HasTranslucentPolygonalGeometry() override;
|
|
|
|
/**
|
|
* Check/update geometry/texture in opaque pass, since it only happens once.
|
|
*/
|
|
int RenderOpaqueGeometry(vtkViewport* vp) override;
|
|
|
|
/**
|
|
* Just render in translucent pass, since it can execute multiple times
|
|
* (depth peeling, for instance).
|
|
*/
|
|
int RenderTranslucentPolygonalGeometry(vtkViewport* vp) override;
|
|
|
|
void ReleaseGraphicsResources(vtkWindow* win) override;
|
|
double* GetBounds() override;
|
|
using Superclass::GetBounds;
|
|
|
|
/**
|
|
* Set/Get the world coordinate position of the base
|
|
*/
|
|
vtkGetVector3Macro(BasePosition, double);
|
|
void SetBasePosition(double x, double y, double z);
|
|
|
|
/**
|
|
* Set/Get the world coordinate position of the top
|
|
*/
|
|
vtkGetVector3Macro(TopPosition, double);
|
|
void SetTopPosition(double x, double y, double z);
|
|
|
|
/**
|
|
* Set/Get the size of the flag. 1.0 is the default size
|
|
* which corresponds to a preset texels/window value. Adjust this
|
|
* to increase or decrease the default size.
|
|
*/
|
|
vtkGetMacro(FlagSize, double);
|
|
vtkSetMacro(FlagSize, double);
|
|
|
|
protected:
|
|
vtkFlagpoleLabel();
|
|
~vtkFlagpoleLabel() override;
|
|
|
|
bool InputIsValid();
|
|
|
|
void UpdateInternals(vtkRenderer* ren);
|
|
|
|
bool TextureIsStale(vtkRenderer* ren);
|
|
void GenerateTexture(vtkRenderer* ren);
|
|
|
|
bool QuadIsStale(vtkRenderer* ren);
|
|
void GenerateQuad(vtkRenderer* ren);
|
|
|
|
// Used by the opaque pass to tell the translucent pass not to render.
|
|
void Invalidate();
|
|
bool IsValid();
|
|
|
|
// Used to sync the internal actor's state.
|
|
void PreRender();
|
|
|
|
// Text specification:
|
|
char* Input;
|
|
vtkTextProperty* TextProperty;
|
|
|
|
// Cached metadata to determine if things need rebuildin'
|
|
int RenderedDPI;
|
|
vtkTimeStamp InputMTime;
|
|
|
|
// We cache this so we can recompute the bounds between renders, if needed.
|
|
vtkSmartPointer<vtkRenderer> RenderedRenderer;
|
|
|
|
// Rendering stuffies
|
|
vtkNew<vtkTextRenderer> TextRenderer;
|
|
vtkNew<vtkImageData> Image;
|
|
vtkNew<vtkPolyData> Quad;
|
|
vtkNew<vtkPolyDataMapper> QuadMapper;
|
|
vtkNew<vtkActor> QuadActor;
|
|
|
|
vtkNew<vtkPolyDataMapper> PoleMapper;
|
|
vtkNew<vtkLineSource> LineSource;
|
|
vtkNew<vtkActor> PoleActor;
|
|
|
|
double TopPosition[3];
|
|
double BasePosition[3];
|
|
double FlagSize;
|
|
|
|
private:
|
|
vtkFlagpoleLabel(const vtkFlagpoleLabel&) = delete;
|
|
void operator=(const vtkFlagpoleLabel&) = delete;
|
|
};
|
|
|
|
#endif // vtkFlagpoleLabel_h
|