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.
o3de/Code/Editor/Include/HitContext.h

145 lines
4.1 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
// Description : Hit testing for editor viewport operations
#ifndef CRYINCLUDE_EDITOR_INCLUDE_HITCONTEXT_H
#define CRYINCLUDE_EDITOR_INCLUDE_HITCONTEXT_H
#pragma once
class CGizmo;
class CBaseObject;
struct IDisplayViewport;
class CDeepSelection;
struct AABB;
class CCamera;
#include <QRect>
#include <platform.h>
//! Flags used in HitContext for nSubObjFlags member.
enum ESubObjHitFlags
{
//! When set all hit elements will be selected.
SO_HIT_SELECT = BIT(1),
//! Only test selected elements for hit.
SO_HIT_TEST_SELECTED = BIT(2),
//! Only hit test point2d, not rectangle
//! Will only test/select 1 closest element
SO_HIT_POINT = BIT(3),
//! Adds hit elements to previously selected ones.
SO_HIT_SELECT_ADD = BIT(4),
//! Remove hit elements from previously selected ones.
SO_HIT_SELECT_REMOVE = BIT(5),
//! Output flag, set if selection was changed.
SO_HIT_SELECTION_CHANGED = BIT(6),
//! Hit testing to highlight sub object-element.
SO_HIT_HIGHLIGHT_ONLY = BIT(7),
//! This hit test is not for editing sub-objects.
//! (ex. for moving an object by its face-normal)
SO_HIT_NO_EDIT = BIT(8),
// Check hit with vertices.
SO_HIT_ELEM_VERTEX = BIT(10),
// Check hit with edges.
SO_HIT_ELEM_EDGE = BIT(11),
// Check hit with faces.
SO_HIT_ELEM_FACE = BIT(12),
// Check hit with polygons.
SO_HIT_ELEM_POLYGON = BIT(13)
};
#define SO_HIT_ELEM_ALL (SO_HIT_ELEM_VERTEX | SO_HIT_ELEM_EDGE | SO_HIT_ELEM_FACE | SO_HIT_ELEM_POLYGON)
//! Collision structure passed to HitTest function.
struct HitContext
{
//! Viewport that originates hit testing.
IDisplayViewport* view;
//! 2D point on view that is used for hit testing.
QPoint point2d;
//! 2D Selection rectangle (Only when HitTestRect)
QRect rect;
//! Optional limiting bounding box for hit testing.
AABB* bounds;
//! Optional camera for culling perspective viewports.
CCamera* camera;
//! Testing performed in 2D viewport.
bool b2DViewport;
//! True if axis collision must be ignored.
bool bIgnoreAxis;
//! Hit test only gizmo objects
bool bOnlyGizmo;
//! Test objects using advanced selection helpers.
bool bUseSelectionHelpers;
//! an object excluded in hittest.
CBaseObject* pExcludedObject;
// Input parameters.
//! Ray origin.
Vec3 raySrc;
//! Ray direction.
Vec3 rayDir;
//! Relaxation parameter for hit testing.
float distanceTolerance;
//! Sub object hit testing flags, @see ESubObjHitFlags
int nSubObjFlags;
// Output parameters.
//! true if this hit should have less priority then non weak hits.
//! (exp: Ray hit entity bounding box but not entity geometry.)
bool weakHit;
//! constrain axis if hit AxisGizmo.
int axis;
//! if hit axis gizmo, 1 - move mode, 2 - rotate mode, 3 - scale mode, 4 - rotate circle mode
int manipulatorMode;
//! distance to the object from src.
float dist;
//! object that have been hit.
CBaseObject* object;
//! gizmo object that have been hit.
CGizmo* gizmo;
//! for deep selection mode
CDeepSelection* pDeepSelection;
//! For linking tool
const char* name;
//! true if this hit was from the object icon
bool iconHit;
HitContext()
{
rect = QRect();
b2DViewport = false;
view = 0;
camera = 0;
point2d = QPoint();
axis = 0;
distanceTolerance = 0;
raySrc(0, 0, 0);
rayDir(0, 0, 0);
dist = 0;
object = 0;
weakHit = false;
manipulatorMode = 0;
nSubObjFlags = 0;
bounds = 0;
bIgnoreAxis = false;
bOnlyGizmo = false;
bUseSelectionHelpers = false;
pDeepSelection = 0;
name = nullptr;
iconHit = false;
}
};
#endif // CRYINCLUDE_EDITOR_INCLUDE_HITCONTEXT_H