393 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			393 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
// NoesisGUI - http://www.noesisengine.com
 | 
						|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
 | 
						|
#ifndef __GUI_VISUAL_H__
 | 
						|
#define __GUI_VISUAL_H__
 | 
						|
 | 
						|
 | 
						|
#include <NsCore/Noesis.h>
 | 
						|
#include <NsGui/CoreApi.h>
 | 
						|
#include <NsGui/DependencyObject.h>
 | 
						|
#include <NsDrawing/Point.h>
 | 
						|
#include <NsDrawing/Size.h>
 | 
						|
#include <NsDrawing/Rect.h>
 | 
						|
 | 
						|
 | 
						|
namespace Noesis
 | 
						|
{
 | 
						|
 | 
						|
class Visual;
 | 
						|
class DrawingCommands;
 | 
						|
class Effect;
 | 
						|
class Geometry;
 | 
						|
class Brush;
 | 
						|
class Transform;
 | 
						|
class Transform3D;
 | 
						|
class RenderTreeUpdater;
 | 
						|
class Matrix4;
 | 
						|
class Transform3;
 | 
						|
class View;
 | 
						|
NS_INTERFACE IView;
 | 
						|
enum HitTestFilterBehavior: int32_t;
 | 
						|
enum HitTestResultBehavior: int32_t;
 | 
						|
enum BitmapScalingMode: int32_t;
 | 
						|
enum BlendingMode: int32_t;
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
/// Indicates the visual that was hit in a HitTest operation
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
struct HitTestResult
 | 
						|
{
 | 
						|
    Visual* visualHit;
 | 
						|
 | 
						|
    HitTestResult(): visualHit(0) { }
 | 
						|
};
 | 
						|
 | 
						|
struct HitTest3DResult
 | 
						|
{
 | 
						|
    Visual* visualHit;
 | 
						|
    Point3D worldPos;
 | 
						|
 | 
						|
    HitTest3DResult() : visualHit(0), worldPos(FLT_INF, FLT_INF, FLT_INF) { }
 | 
						|
};
 | 
						|
 | 
						|
typedef Delegate<HitTestFilterBehavior (Visual* target)> HitTestFilterCallback;
 | 
						|
typedef Delegate<HitTestResultBehavior (const HitTestResult& result)> HitTestResultCallback;
 | 
						|
typedef Delegate<HitTestResultBehavior(const HitTest3DResult& result)> HitTest3DResultCallback;
 | 
						|
typedef Noesis::Delegate<void (Visual* visual)> SubtreeDrawingCommandsChangedDelegate;
 | 
						|
 | 
						|
NS_WARNING_PUSH
 | 
						|
NS_MSVC_WARNING_DISABLE(4251 4275)
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
/// Provides rendering support, which includes hit testing, coordinate transformation, and bounding
 | 
						|
/// box calculations.
 | 
						|
///
 | 
						|
/// http://msdn.microsoft.com/en-us/library/system.windows.media.visual.aspx
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
class NS_GUI_CORE_API Visual: public DependencyObject
 | 
						|
{
 | 
						|
public:
 | 
						|
    Visual();
 | 
						|
    Visual(const Visual&) = delete;
 | 
						|
    Visual& operator=(const Visual&) = delete;
 | 
						|
    virtual ~Visual() = 0;
 | 
						|
 | 
						|
    /// Determines whether the visual object is an ancestor of the descendant visual object
 | 
						|
    /// This object is not considered to be an ancestor of *visual* if they are the same
 | 
						|
    bool IsAncestorOf(const Visual* visual) const;
 | 
						|
 | 
						|
    /// Determines whether the visual object is a descendant of the ancestor visual object
 | 
						|
    /// This object is not considered to be a descendant of *visual* if they are the same
 | 
						|
    bool IsDescendantOf(const Visual* visual) const;
 | 
						|
 | 
						|
    /// Finds the common ancestor of two visuals objects
 | 
						|
    /// If *visual* is the same object as this, the common ancestor will be the parent
 | 
						|
    Visual* FindCommonVisualAncestor(const Visual* visual) const;
 | 
						|
 | 
						|
    /// Converts a Point in screen coordinates into a Point that represents the current coordinate
 | 
						|
    /// system of the Visual
 | 
						|
    Point PointFromScreen(const Point& point) const;
 | 
						|
    
 | 
						|
    /// Converts a Point that represents the current coordinate system of the Visual into a Point
 | 
						|
    /// in screen coordinates
 | 
						|
    Point PointToScreen(const Point& point) const;
 | 
						|
 | 
						|
    /// Returns a transform that can be used to transform coordinates from the Visual to the
 | 
						|
    /// specified ancestor of the visual object
 | 
						|
    Matrix4 TransformToAncestor(const Visual* ancestor) const;
 | 
						|
 | 
						|
    /// Returns a transform that can be used to transform coordinates from the Visual to the
 | 
						|
    /// specified visual object descendant
 | 
						|
    Matrix4 TransformToDescendant(const Visual* descendant) const;
 | 
						|
 | 
						|
    /// Returns a transform that can be used to transform coordinates from the Visual to the
 | 
						|
    /// specified visual object
 | 
						|
    Matrix4 TransformToVisual(const Visual* visual) const;
 | 
						|
 | 
						|
    /// Occurs when subtree render commands have changed
 | 
						|
    SubtreeDrawingCommandsChangedDelegate& SubtreeDrawingCommandsChanged();
 | 
						|
 | 
						|
    /// Indicates if this visual is invalidated and should send updates to the render tree
 | 
						|
    bool IsInvalidated() const;
 | 
						|
 | 
						|
    /// Indicates if this visual has been connected to a View
 | 
						|
    bool IsConnectedToView() const;
 | 
						|
 | 
						|
    /// Gets the view where this visual is connected to
 | 
						|
    IView* GetView() const;
 | 
						|
 | 
						|
    /// Indicates if a render node has been created in the RenderTree for this visual
 | 
						|
    bool IsInRenderTree() const;
 | 
						|
 | 
						|
    /// Gets RenderTree's identifier
 | 
						|
    uint32_t GetRenderTreeId() const;
 | 
						|
 | 
						|
    /// Pushes all the layout updates into the UI render thread queue to update render nodes
 | 
						|
    void UpdateRender(RenderTreeUpdater& updater);
 | 
						|
 | 
						|
protected:
 | 
						|
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
    // Protected functions used by child classes or VisualTreeHelper
 | 
						|
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
    //@{
 | 
						|
    /// Gets the parent of the visual object
 | 
						|
    Visual* GetVisualParent() const;
 | 
						|
 | 
						|
    /// Sets up the parent-child relationship between two visuals
 | 
						|
    void AddVisualChild(Visual* child);
 | 
						|
 | 
						|
    /// Removes the parent-child relationship between two visuals
 | 
						|
    void RemoveVisualChild(Visual* child);
 | 
						|
 | 
						|
    /// Gets the bounding box rectangle
 | 
						|
    Rect GetContentBounds() const;
 | 
						|
 | 
						|
    /// Returns a bounding box that encloses this visual and all its children
 | 
						|
    Rect GetDescendantBounds() const;
 | 
						|
 | 
						|
    /// Returns the minimum z of a bounding box that encloses this visual and all its children
 | 
						|
    float GetDescendantBoundsMinZ() const;
 | 
						|
 | 
						|
    /// Returns the maximum z of a bounding box that encloses this visual and all its children
 | 
						|
    float GetDescendantBoundsMaxZ() const;
 | 
						|
 | 
						|
    /// Gets the root of the View tree where this visual is connected to
 | 
						|
    /// \return Null if this visual is not connected to a View
 | 
						|
    Visual* GetRoot() const;
 | 
						|
 | 
						|
    /// Gets the surface size of the View where this visual is connected to
 | 
						|
    Size GetSurfaceSize() const;
 | 
						|
 | 
						|
    /// Gets or sets the BitmapScalingMode for the Visual
 | 
						|
    //@{
 | 
						|
    BitmapScalingMode GetVisualBitmapScalingMode() const;
 | 
						|
    void SetVisualBitmapScalingMode(BitmapScalingMode mode);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets a value indicating how the visual's contents are mixed with the background
 | 
						|
    //@{
 | 
						|
    BlendingMode GetVisualBlendingMode() const;
 | 
						|
    void SetVisualBlendingMode(BlendingMode mode);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the clip region of the Visual as a Geometry value
 | 
						|
    //@{
 | 
						|
    Geometry* GetVisualClip() const;
 | 
						|
    void SetVisualClip(Geometry* clip);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the bitmap effect to apply to this visual
 | 
						|
    //@{
 | 
						|
    Effect* GetVisualEffect() const;
 | 
						|
    void SetVisualEffect(Effect* value);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the offset value of the visual object
 | 
						|
    //@{
 | 
						|
    const Point& GetVisualOffset() const;
 | 
						|
    void SetVisualOffset(const Point& offset);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the size value of the visual object
 | 
						|
    //@{
 | 
						|
    const Size& GetVisualSize() const;
 | 
						|
    void SetVisualSize(const Size& size);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the opacity of the Visual
 | 
						|
    //@{
 | 
						|
    float GetVisualOpacity() const;
 | 
						|
    void SetVisualOpacity(float opacity);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the Brush value that represents the opacity mask of the Visual
 | 
						|
    //@{
 | 
						|
    Brush* GetVisualOpacityMask() const;
 | 
						|
    void SetVisualOpacityMask(Brush* mask);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the Transform value for the Visual
 | 
						|
    //@{
 | 
						|
    Transform* GetVisualTransform() const;
 | 
						|
    void SetVisualTransform(Transform* transform);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the Transform3D value for the Visual
 | 
						|
    //@{
 | 
						|
    Transform3D* GetVisualTransform3D() const;
 | 
						|
    void SetVisualTransform3D(Transform3D* transform);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Disables PPAA generation on this visual node
 | 
						|
    void DisablePPAA(bool disable);
 | 
						|
 | 
						|
    /// Invalidates PPAA generated geometries for this visual node
 | 
						|
    void InvalidatePPAA();
 | 
						|
 | 
						|
    /// Invalidate visual render commands
 | 
						|
    void InvalidateDrawingCommands() const;
 | 
						|
 | 
						|
    /// Indicates to the visual that content bounds changed
 | 
						|
    void InvalidateContentBounds() const;
 | 
						|
 | 
						|
    /// Invalidates visual if the visual or its children intersect the invalidation rectangle
 | 
						|
    void InvalidateRect(const Rect& rect) const;
 | 
						|
 | 
						|
    /// Invalidates children Z-order
 | 
						|
    void InvalidateChildrenZOrder() const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
    // Protected virtual functions to be reimplemented by child classes
 | 
						|
    ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
    //@{
 | 
						|
    /// Gets the number of child elements for the Visual
 | 
						|
    /// \remarks Each visual implementation will decide how to store visual children
 | 
						|
    virtual uint32_t GetVisualChildrenCount() const;
 | 
						|
 | 
						|
    /// Returns the specified Visual in the parent VisualCollection
 | 
						|
    /// \remarks Each visual implementation will decide how to store visual children
 | 
						|
    virtual Visual* GetVisualChild(uint32_t index) const;
 | 
						|
 | 
						|
    /// Called when the VisualCollection of the visual object is modified
 | 
						|
    virtual void OnVisualChildrenChanged(Visual* added, Visual* removed);
 | 
						|
 | 
						|
    /// Called when the parent of the visual object is changed
 | 
						|
    virtual void OnVisualParentChanged(Visual* oldParent);
 | 
						|
 | 
						|
    /// Called when this visual is connected/disconnected to/from a parent that belongs to a View
 | 
						|
    //@{
 | 
						|
    virtual void OnConnectToView(IView* view);
 | 
						|
    virtual void OnDisconnectFromView();
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Called when children of this visual are connected/disconnected to/from render tree
 | 
						|
    //@{
 | 
						|
    virtual void OnConnectToViewChildren();
 | 
						|
    virtual void OnDisconnectFromViewChildren();
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Called when the VisualOffset of the visual object is modified
 | 
						|
    virtual void OnVisualOffsetChanged();
 | 
						|
 | 
						|
    /// Called when the VisualSize of the visual object is modified
 | 
						|
    virtual void OnVisualSizeChanged();
 | 
						|
 | 
						|
    /// Called when the VisualTransform of the visual object is modified
 | 
						|
    virtual void OnVisualTransformChanged();
 | 
						|
 | 
						|
    /// Called when the VisualTransform3D of the visual object is modified
 | 
						|
    virtual void OnVisualTransform3DChanged();
 | 
						|
 | 
						|
    /// Gets the bounding box rectangle
 | 
						|
    virtual Rect GetContentBoundsCore() const;
 | 
						|
 | 
						|
    /// Function to be implemented by Inheriting classes. This function is invoked whenever
 | 
						|
    /// the content bound is hit in a HitTest operation
 | 
						|
    virtual HitTestResult HitTestCore(const Point& point);
 | 
						|
 | 
						|
    /// Updates render commands in the corresponding render node
 | 
						|
    virtual DrawingCommands* GetDrawingCommands() const;
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// From DependencyObject
 | 
						|
    //@{
 | 
						|
    bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override;
 | 
						|
    bool OnSubPropertyChanged(const DependencyProperty* prop) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
private:
 | 
						|
    friend class VisualTest;
 | 
						|
    friend struct VisualTreeHelper;
 | 
						|
    friend class VisualCollection;
 | 
						|
    friend class UIElementCollection;
 | 
						|
    friend class ViewLayout;
 | 
						|
    friend class View;
 | 
						|
    friend class VisualTreeInspector;
 | 
						|
 | 
						|
    void ConnectToView(IView* view);
 | 
						|
    void DisconnectFromView();
 | 
						|
 | 
						|
    void Invalidate();
 | 
						|
 | 
						|
    // Invalidates descendant bounds on a branch
 | 
						|
    void InvalidateBranchBounds(bool raiseDrawingCommandsChanged) const;
 | 
						|
 | 
						|
    // Fires SubtreeDrawingCommandsChanged event
 | 
						|
    void RaiseSubtreeDrawingCommandsChanged() const;
 | 
						|
 | 
						|
    Transform3 InternalTransformToRoot() const;
 | 
						|
    Transform3 InternalTransformToAncestor(const Visual* ancestor) const;
 | 
						|
    Transform3 InternalTransformToParent() const;
 | 
						|
 | 
						|
    Vector3 InternalPointToRoot(const Vector3& point) const;
 | 
						|
    Vector3 InternalPointToAncestor(const Vector3& point, const Visual* ancestor) const;
 | 
						|
    Vector3 InternalPointToParent(const Vector3& point) const;
 | 
						|
 | 
						|
    Point InternalPointToScreen(const Vector3& point) const;
 | 
						|
    Vector3 GetDirection(const Point& point) const;
 | 
						|
 | 
						|
    // point and dir must be in the coordinate system of this Visual
 | 
						|
    HitTestResultBehavior InternalHitTest(const Vector3& point, const Vector3& dir,
 | 
						|
        const HitTestFilterCallback& hitTestFilter,
 | 
						|
        const HitTest3DResultCallback& hitTestResult, bool computeWorldPos);
 | 
						|
 | 
						|
    // point, dir and our are in world-coordinates
 | 
						|
    bool IntersectPlane(const Vector3& point, const Vector3& dir, Vector3& out);
 | 
						|
 | 
						|
    Rect InternalGetContentBounds() const;
 | 
						|
    void EnsureDescendantBounds() const;
 | 
						|
 | 
						|
    void CreateRenderNode(RenderTreeUpdater& updater);
 | 
						|
    void DestroyRenderNode(RenderTreeUpdater& updater);
 | 
						|
    void AddNode(RenderTreeUpdater& updater);
 | 
						|
    void RemoveNode(RenderTreeUpdater& updater, uint32_t parentIndex);
 | 
						|
    void RemoveAllNodes(RenderTreeUpdater& updater);
 | 
						|
 | 
						|
    ///Visual flag management
 | 
						|
    //@{
 | 
						|
    void UpdateBranchVisualFlag(uint32_t flag, bool value) const;
 | 
						|
    void SetVisualFlag(uint32_t flag) const;
 | 
						|
    void ClearVisualFlag(uint32_t flag) const;
 | 
						|
    bool CheckVisualFlag(uint32_t flag) const;
 | 
						|
    //@}
 | 
						|
 | 
						|
    // Manages invalidation of visual in renderer for next update
 | 
						|
    //@{
 | 
						|
    void AddInvalidatedVisual() const;
 | 
						|
    void RemoveInvalidatedVisual() const;
 | 
						|
    void CancelUpdateRequest();
 | 
						|
    //@}
 | 
						|
 | 
						|
private:
 | 
						|
    View* mView;
 | 
						|
    Visual* mVisualParent;
 | 
						|
    void* mUpdateRequest;
 | 
						|
 | 
						|
    uint32_t mIndex;
 | 
						|
 | 
						|
    Point mVisualOffset;
 | 
						|
    Size mVisualSize;
 | 
						|
 | 
						|
    mutable Rect mContentBoundsCache;
 | 
						|
    mutable Rect mDescendantBoundsCache;
 | 
						|
    mutable float mDescendantBoundsMinZ;
 | 
						|
    mutable float mDescendantBoundsMaxZ;
 | 
						|
 | 
						|
    mutable uint32_t mVisualFlags;
 | 
						|
 | 
						|
    SubtreeDrawingCommandsChangedDelegate mSubtreeDrawingCommandsChanged;
 | 
						|
 | 
						|
    NS_DECLARE_REFLECTION(Visual, DependencyObject)
 | 
						|
};
 | 
						|
 | 
						|
NS_WARNING_POP
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#endif
 |