+// Created on: 2020-09-07
+// Created by: Maria KRYLOVA
+// Copyright (c) 2020 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _AIS_LightSource_HeaderFile
+#define _AIS_LightSource_HeaderFile
+
+#include <AIS_InteractiveObject.hxx>
+#include <Graphic3d_CLight.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+
+class Prs3d_ShadingAspect;
+
+//! Interactive object for a light source.
+//! Each type of light source has it's own presentation:
+//! - Ambient light is displayed as a sphere at view corner;
+//! - Positional light is represented by a sphere or marker;
+//! - Spot light is represented by a cone;
+//! - Directional light is represented by a set of arrows at the corner of view.
+//! In addition, light source name could be displayed, and clicking on presentation will enable/disable light.
+class AIS_LightSource : public AIS_InteractiveObject
+{
+ friend class AIS_LightSourceOwner;
+ DEFINE_STANDARD_RTTIEXT(AIS_LightSource, AIS_InteractiveObject)
+public:
+
+ //! Initializes the light source by copying Graphic3d_CLight settings.
+ Standard_EXPORT AIS_LightSource (const Handle(Graphic3d_CLight)& theLightSource);
+
+ //! Returns the light.
+ const Handle(Graphic3d_CLight)& Light() const { return myLightSource; }
+
+ //! Set the light.
+ void SetLight (const Handle(Graphic3d_CLight)& theLight)
+ {
+ myLightSource = theLight;
+ SetToUpdate();
+ }
+
+public: //! @name Light properties
+
+ //! Returns TRUE if the light source name should be displayed; TRUE by default.
+ Standard_Boolean ToDisplayName() const { return myToDisplayName; }
+
+ //! Show/hide light source name.
+ void SetDisplayName(Standard_Boolean theToDisplay)
+ {
+ if (myToDisplayName != theToDisplay)
+ {
+ myToDisplayName = theToDisplay;
+ SetToUpdate();
+ }
+ }
+
+ //! Returns TRUE to display light source range as sphere (positional light) or cone (spot light); TRUE by default.
+ //! Has no effect for non-zoomable presentation.
+ Standard_Boolean ToDisplayRange() const { return myToDisplayRange; }
+
+ //! Show/hide light source range shaded presentation.
+ void SetDisplayRange (Standard_Boolean theToDisplay)
+ {
+ if (myToDisplayRange != theToDisplay)
+ {
+ myToDisplayRange = theToDisplay;
+ SetToUpdate();
+ }
+ }
+
+ //! Returns the size of presentation; 50 by default.
+ Standard_Real Size() const { return mySize; }
+
+ //! Sets the size of presentation.
+ void SetSize (Standard_Real theSize)
+ {
+ if (mySize != theSize)
+ {
+ mySize = theSize;
+ SetToUpdate();
+ }
+ }
+
+ //! Returns TRUE if transform-persistence is allowed;
+ //! TRUE by default for Ambient and Directional lights
+ //! and FALSE by default for Positional and Spot lights.
+ bool IsZoomable() const { return myIsZoomable; }
+
+ //! Sets if transform-persistence is allowed.
+ void SetZoomable (bool theIsZoomable)
+ {
+ if (myIsZoomable != theIsZoomable)
+ {
+ myIsZoomable = theIsZoomable;
+ SetToUpdate();
+ }
+ }
+
+ //! Returns TRUE if mouse click will turn light on/off; TRUE by default.
+ bool ToSwitchOnClick() const { return myToSwitchOnClick; }
+
+ //! Sets if mouse click should turn light on/off.
+ void SetSwitchOnClick (bool theToHandle) { myToSwitchOnClick = theToHandle; }
+
+ //! Returns a number of directional light arrows to display; 5 by default.
+ Standard_Integer NbArrows() const { return myNbArrows; }
+
+ //! Returns a number of directional light arrows to display (supported values: 1, 3, 5, 9).
+ void SetNbArrows (Standard_Integer theNbArrows)
+ {
+ if (myNbArrows != theNbArrows)
+ {
+ myNbArrows = theNbArrows;
+ SetToUpdate();
+ }
+ }
+
+ //! Returns light source icon.
+ //! @param theIsEnabled [in] marker index for enabled/disabled light source states
+ const Handle(Graphic3d_MarkerImage)& MarkerImage (bool theIsEnabled) const { return myMarkerImages[theIsEnabled ? 1 : 0]; }
+
+ //! Returns light source icon.
+ //! @param theIsEnabled [in] marker index for enabled/disabled light source states
+ Aspect_TypeOfMarker MarkerType (bool theIsEnabled) const { return myMarkerTypes[theIsEnabled ? 1 : 0]; }
+
+ //! Sets custom icon to light source.
+ void SetMarkerImage (const Handle(Graphic3d_MarkerImage)& theImage,
+ bool theIsEnabled)
+ {
+ myMarkerImages[theIsEnabled ? 1 : 0] = theImage;
+ myMarkerTypes [theIsEnabled ? 1 : 0] = !theImage.IsNull()
+ ? Aspect_TOM_USERDEFINED
+ : (theIsEnabled ? Aspect_TOM_O_POINT : Aspect_TOM_O_X);
+ }
+
+ //! Sets standard icon to light source.
+ void SetMarkerType (Aspect_TypeOfMarker theType,
+ bool theIsEnabled)
+ {
+ myMarkerTypes[theIsEnabled ? 1 : 0] = theType;
+ }
+
+ //! Returns tessellation level for quadric surfaces; 30 by default.
+ Standard_Integer NbSplitsQuadric() const { return myNbSplitsQuadric; }
+
+ //! Sets tessellation level for quadric surfaces.
+ void SetNbSplitsQuadric (Standard_Integer theNbSplits) { myNbSplitsQuadric = theNbSplits; }
+
+ //! Returns tessellation level for arrows; 20 by default.
+ Standard_Integer NbSplitsArrow() const { return myNbSplitsArrow; }
+
+ //! Sets tessellation level for arrows.
+ void SetNbSplitsArrow (Standard_Integer theNbSplits) { myNbSplitsArrow = theNbSplits; }
+
+ //! Returns kind of the object.
+ virtual AIS_KindOfInteractive Type() const Standard_OVERRIDE { return AIS_KindOfInteractive_LightSource; }
+
+protected:
+
+ //! Return true if specified display mode is supported: 0 for main presentation and 1 for highlight.
+ virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE
+ {
+ return theMode == 0
+ || theMode == 1;
+ }
+
+ //! Computes selection sensitive zones(triangulation) for light source presentation.
+ Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
+ const Handle(Prs3d_Presentation)& thePrs,
+ const Standard_Integer theMode) Standard_OVERRIDE;
+
+ //! Fills presentation.
+ Standard_EXPORT virtual void ComputeSelection (const Handle(SelectMgr_Selection)& theSel,
+ const Standard_Integer theMode) Standard_OVERRIDE;
+
+ //! Sets new local transformation, which is propagated to Graphic3d_CLight instance.
+ Standard_EXPORT virtual void setLocalTransformation (const Handle(TopLoc_Datum3D)& theTrsf) Standard_OVERRIDE;
+
+ //! Updates local transformation basing on a type of light source.
+ Standard_EXPORT virtual void updateLightLocalTransformation();
+
+ //! Updates transform persistence basing on a type of light source.
+ Standard_EXPORT virtual void updateLightTransformPersistence();
+
+ //! Sets color of light.
+ Standard_EXPORT virtual void updateLightAspects();
+
+ //! Compute ambient light source presentation as a sphere at view corner.
+ Standard_EXPORT virtual void computeAmbient (const Handle(Prs3d_Presentation)& thePrs,
+ const Standard_Integer theMode);
+
+ //! Compute directional light source presentation as a set of arrows at view corner.
+ Standard_EXPORT virtual void computeDirectional (const Handle(Prs3d_Presentation)& thePrs,
+ const Standard_Integer theMode);
+
+ //! Compute positional light source presentation as a sphere of either fixed size (no range) or of size representing a maximum range.
+ Standard_EXPORT virtual void computePositional (const Handle(Prs3d_Presentation)& thePrs,
+ const Standard_Integer theMode);
+
+ //! Compute spot light source presentation as a cone.
+ Standard_EXPORT virtual void computeSpot (const Handle(Prs3d_Presentation)& thePrs,
+ const Standard_Integer theMode);
+
+protected:
+
+ Handle(Graphic3d_CLight) myLightSource; //!< displayed light source
+
+ Handle(Graphic3d_AspectMarker3d) myDisabledMarkerAspect; //!< disabled light source marker style
+ Handle(Graphic3d_AspectLine3d) myArrowLineAspectShadow; //!< arrow shadow style
+ Handle(Graphic3d_MarkerImage) myMarkerImages[2]; //!< icon of disabled (0) and enabled (1) light
+ Aspect_TypeOfMarker myMarkerTypes[2]; //!< icon of disabled (0) and enabled (1) light
+ Aspect_TypeOfMarker myCodirMarkerType; //!< icon of arrow co-directional to camera direction (look from)
+ Aspect_TypeOfMarker myOpposMarkerType; //!< icon of arrow opposite to camera direction (look at)
+
+ Standard_Real mySize; //!< presentation size
+ Standard_Integer myNbArrows; //!< number of directional light arrows
+ Standard_Integer myNbSplitsQuadric; //!< tessellation level for quadric surfaces
+ Standard_Integer myNbSplitsArrow; //!< tessellation level for arrows
+ Standard_Boolean myIsZoomable; //!< flag to allow/disallow transform-persistence when possible
+ Standard_Boolean myToDisplayName; //!< flag to show/hide name
+ Standard_Boolean myToDisplayRange; //!< flag to show/hide range of positional/spot light
+ Standard_Boolean myToSwitchOnClick; //!< flag to handle mouse click to turn light on/off
+
+};
+
+//! Owner of AIS_LightSource presentation.
+class AIS_LightSourceOwner : public SelectMgr_EntityOwner
+{
+ DEFINE_STANDARD_RTTIEXT(AIS_LightSourceOwner, SelectMgr_EntityOwner)
+public:
+
+ //! Main constructor.
+ Standard_EXPORT AIS_LightSourceOwner (const Handle(AIS_LightSource)& theObject,
+ Standard_Integer thePriority = 5);
+
+ //! Handle mouse button click event.
+ Standard_EXPORT virtual Standard_Boolean HandleMouseClick (const Graphic3d_Vec2i& thePoint,
+ Aspect_VKeyMouse theButton,
+ Aspect_VKeyFlags theModifiers,
+ bool theIsDoubleClick) Standard_OVERRIDE;
+
+};
+
+#endif // _AIS_LightSource_HeaderFile