145 lines
4.5 KiB
C++
145 lines
4.5 KiB
C++
#pragma once
|
|
|
|
#include "IViewportHostService.h"
|
|
|
|
#include <XCEngine/Core/Math/Color.h>
|
|
#include <XCEngine/Core/Math/Vector2.h>
|
|
#include <XCEngine/Core/Math/Vector3.h>
|
|
|
|
#include <array>
|
|
#include <limits>
|
|
#include <vector>
|
|
|
|
namespace XCEngine {
|
|
namespace Editor {
|
|
|
|
enum class SceneViewportOverlayDepthMode : uint8_t {
|
|
DepthTested = 0,
|
|
AlwaysOnTop
|
|
};
|
|
|
|
enum class SceneViewportOverlaySpriteTextureKind : uint8_t {
|
|
Camera = 0,
|
|
Light = 1
|
|
};
|
|
|
|
enum class SceneViewportOverlayHandleKind : uint8_t {
|
|
None = 0,
|
|
SceneIcon,
|
|
MoveAxis,
|
|
MovePlane,
|
|
RotateAxis,
|
|
ScaleAxis,
|
|
ScaleUniform
|
|
};
|
|
|
|
enum class SceneViewportOverlayHandleShape : uint8_t {
|
|
None = 0,
|
|
WorldRect,
|
|
ScreenSegment,
|
|
ScreenRect,
|
|
ScreenQuad
|
|
};
|
|
|
|
struct SceneViewportOverlayLinePrimitive {
|
|
Math::Vector3 startWorld = Math::Vector3::Zero();
|
|
Math::Vector3 endWorld = Math::Vector3::Zero();
|
|
Math::Color color = Math::Color::White();
|
|
float thicknessPixels = 1.0f;
|
|
SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop;
|
|
};
|
|
|
|
struct SceneViewportOverlaySpritePrimitive {
|
|
Math::Vector3 worldPosition = Math::Vector3::Zero();
|
|
Math::Vector2 sizePixels = Math::Vector2::Zero();
|
|
Math::Color tintColor = Math::Color::White();
|
|
float sortDepth = 0.0f;
|
|
uint64_t entityId = 0;
|
|
SceneViewportOverlaySpriteTextureKind textureKind = SceneViewportOverlaySpriteTextureKind::Camera;
|
|
SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop;
|
|
};
|
|
|
|
struct SceneViewportOverlayScreenTriangleVertex {
|
|
Math::Vector2 screenPosition = Math::Vector2::Zero();
|
|
Math::Color color = Math::Color::White();
|
|
};
|
|
|
|
struct SceneViewportOverlayScreenTrianglePrimitive {
|
|
std::array<SceneViewportOverlayScreenTriangleVertex, 3> vertices = {};
|
|
SceneViewportOverlayDepthMode depthMode = SceneViewportOverlayDepthMode::AlwaysOnTop;
|
|
};
|
|
|
|
struct SceneViewportOverlayHandleRecord {
|
|
SceneViewportOverlayHandleKind kind = SceneViewportOverlayHandleKind::None;
|
|
uint64_t handleId = 0;
|
|
uint64_t entityId = 0;
|
|
SceneViewportOverlayHandleShape shape = SceneViewportOverlayHandleShape::None;
|
|
int priority = 0;
|
|
Math::Vector3 worldPosition = Math::Vector3::Zero();
|
|
Math::Vector2 sizePixels = Math::Vector2::Zero();
|
|
float sortDepth = 0.0f;
|
|
Math::Vector2 screenStart = Math::Vector2::Zero();
|
|
Math::Vector2 screenEnd = Math::Vector2::Zero();
|
|
Math::Vector2 screenCenter = Math::Vector2::Zero();
|
|
Math::Vector2 screenHalfSize = Math::Vector2::Zero();
|
|
std::array<Math::Vector2, 4> screenQuad = {};
|
|
float hitThicknessPixels = 0.0f;
|
|
};
|
|
|
|
struct SceneViewportOverlayHandleHitResult {
|
|
SceneViewportOverlayHandleKind kind = SceneViewportOverlayHandleKind::None;
|
|
uint64_t handleId = 0;
|
|
uint64_t entityId = 0;
|
|
int priority = (std::numeric_limits<int>::min)();
|
|
float distanceSq = (std::numeric_limits<float>::max)();
|
|
float depth = (std::numeric_limits<float>::max)();
|
|
|
|
bool HasHit() const {
|
|
return kind != SceneViewportOverlayHandleKind::None;
|
|
}
|
|
};
|
|
|
|
struct SceneViewportOverlayFrameData {
|
|
SceneViewportOverlayData overlay = {};
|
|
std::vector<SceneViewportOverlayLinePrimitive> worldLines = {};
|
|
std::vector<SceneViewportOverlaySpritePrimitive> worldSprites = {};
|
|
std::vector<SceneViewportOverlayScreenTrianglePrimitive> screenTriangles = {};
|
|
std::vector<SceneViewportOverlayHandleRecord> handleRecords = {};
|
|
|
|
bool HasOverlayPrimitives() const {
|
|
return overlay.valid && (!worldLines.empty() || !worldSprites.empty() || !screenTriangles.empty());
|
|
}
|
|
|
|
bool HasWorldOverlay() const {
|
|
return HasOverlayPrimitives();
|
|
}
|
|
};
|
|
|
|
inline void AppendSceneViewportOverlayFrameData(
|
|
SceneViewportOverlayFrameData& target,
|
|
const SceneViewportOverlayFrameData& source) {
|
|
if (!target.overlay.valid && source.overlay.valid) {
|
|
target.overlay = source.overlay;
|
|
}
|
|
|
|
target.worldLines.insert(
|
|
target.worldLines.end(),
|
|
source.worldLines.begin(),
|
|
source.worldLines.end());
|
|
target.worldSprites.insert(
|
|
target.worldSprites.end(),
|
|
source.worldSprites.begin(),
|
|
source.worldSprites.end());
|
|
target.screenTriangles.insert(
|
|
target.screenTriangles.end(),
|
|
source.screenTriangles.begin(),
|
|
source.screenTriangles.end());
|
|
target.handleRecords.insert(
|
|
target.handleRecords.end(),
|
|
source.handleRecords.begin(),
|
|
source.handleRecords.end());
|
|
}
|
|
|
|
} // namespace Editor
|
|
} // namespace XCEngine
|