0031704: Visualization - add an interactive object AIS_LightSource representing a...
[occt.git] / src / AIS / AIS_LightSource.hxx
diff --git a/src/AIS/AIS_LightSource.hxx b/src/AIS/AIS_LightSource.hxx
new file mode 100644 (file)
index 0000000..27b0bda
--- /dev/null
@@ -0,0 +1,253 @@
+// 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