File: View.h

package info (click to toggle)
darkradiant 3.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 41,080 kB
  • sloc: cpp: 264,743; ansic: 10,659; python: 1,852; xml: 1,650; sh: 92; makefile: 21
file content (95 lines) | stat: -rw-r--r-- 2,965 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#pragma once

#include "render/View.h"
#include "render/CameraView.h"
#include "registry/registry.h"
#include "selection/SelectionVolume.h"

namespace test
{

namespace algorithm
{

constexpr std::size_t DeviceWidth = 640;
constexpr std::size_t DeviceHeight = 640;
constexpr const char* const RKEY_SELECT_EPSILON = "user/ui/selectionEpsilon";

inline void constructCenteredOrthoview(render::View& view, const Vector3& origin)
{
    // Move the orthoview exactly to the center of this object
    double scale = 1.0;

    Matrix4 projection;

    projection[0] = 1.0 / static_cast<double>(DeviceWidth / 2);
    projection[5] = 1.0 / static_cast<double>(DeviceHeight / 2);
    projection[10] = 1.0 / (32768 * scale);

    projection[12] = 0.0;
    projection[13] = 0.0;
    projection[14] = -1.0;

    projection[1] = projection[2] = projection[3] =
        projection[4] = projection[6] = projection[7] =
        projection[8] = projection[9] = projection[11] = 0.0;

    projection[15] = 1.0f;

    // Modelview
    Matrix4 modelView;

    // Translate the view to the center of the brush
    modelView[12] = -origin.x() * scale;
    modelView[13] = -origin.y() * scale;
    modelView[14] = 32768 * scale;

    // axis base
    modelView[0] = scale;
    modelView[1] = 0;
    modelView[2] = 0;

    modelView[4] = 0;
    modelView[5] = scale;
    modelView[6] = 0;

    modelView[8] = 0;
    modelView[9] = 0;
    modelView[10] = -scale;

    modelView[3] = modelView[7] = modelView[11] = 0;
    modelView[15] = 1;

    view.construct(projection, modelView, DeviceWidth, DeviceHeight);
}

inline SelectionVolume constructOrthoviewSelectionTest(const render::View& orthoView)
{
    render::View scissored(orthoView);

    auto epsilon = registry::getValue<float>(RKEY_SELECT_EPSILON);
    Vector2 deviceEpsilon(epsilon / DeviceWidth, epsilon / DeviceHeight);
    ConstructSelectionTest(scissored, selection::Rectangle::ConstructFromPoint(Vector2(0, 0), deviceEpsilon));

    return SelectionVolume(scissored);
}

// Constructs the given view with a camera projection
// - with the view origin being located at three times the bounding box size away (following the view direction)
// - with the given view angles (pitch, yaw, roll)
inline void constructCameraView(render::View& view, const AABB& objectAABB, const Vector3& viewDirection, const Vector3& angles)
{
    // Position the camera top-down, similar to what an XY view is seeing
    auto objectHeight = std::max(objectAABB.getExtents().getLength(), 20.0); // use a minimum height
    Vector3 origin = objectAABB.getOrigin() - (viewDirection * objectHeight * 3);

    auto farClip = 32768.0f;
    Matrix4 projection = camera::calculateProjectionMatrix(farClip / 4096.0f, farClip, 75.0f, algorithm::DeviceWidth, algorithm::DeviceHeight);
    Matrix4 modelview = camera::calculateModelViewMatrix(origin, angles);

    view.construct(projection, modelview, algorithm::DeviceWidth, algorithm::DeviceHeight);
}

}

}