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
|
#pragma once
#include "pivot.h"
namespace selection
{
class Pivot2World
{
public:
Matrix4 _worldSpace;
Matrix4 _viewpointSpace;
Matrix4 _viewplaneSpace;
Vector3 _axisScreen;
void update(const Matrix4& pivot2world, const Matrix4& modelview, const Matrix4& projection, const Matrix4& viewport)
{
calculcateWorldSpace(pivot2world, modelview, projection, viewport);
calculateViewpointSpace(pivot2world, modelview, projection, viewport);
calculateViewplaneSpace(pivot2world, modelview, projection, viewport);
}
private:
void calculcateWorldSpace(const Matrix4& pivot2world, const Matrix4& modelview, const Matrix4& projection, const Matrix4& viewport)
{
_worldSpace = pivot2world;
Matrix4 pivot2screen = constructObject2Screen(pivot2world, modelview, projection, viewport);
Matrix4 scale = getInverseScale(pivot2screen);
_worldSpace.multiplyBy(scale);
scale = getPerspectiveScale(pivot2screen);
_worldSpace.multiplyBy(scale);
}
void calculateViewpointSpace(const Matrix4& pivot2world, const Matrix4& modelview, const Matrix4& projection, const Matrix4& viewport)
{
_viewpointSpace = pivot2world;
Matrix4 pivot2screen = constructObject2Screen(pivot2world, modelview, projection, viewport);
Matrix4 scale = getInverseScale(pivot2screen);
_viewpointSpace.multiplyBy(scale);
billboard_viewpointOriented(scale, pivot2screen);
_axisScreen = scale.zCol3();
_viewpointSpace.multiplyBy(scale);
scale = getPerspectiveScale(pivot2screen);
_viewpointSpace.multiplyBy(scale);
}
void calculateViewplaneSpace(const Matrix4& pivot2world, const Matrix4& modelview, const Matrix4& projection, const Matrix4& viewport)
{
_viewplaneSpace = pivot2world;
Matrix4 pivot2screen = constructObject2Screen(pivot2world, modelview, projection, viewport);
Matrix4 scale = getInverseScale(pivot2screen);
_viewplaneSpace.multiplyBy(scale);
billboard_viewplaneOriented(scale, pivot2screen);
_viewplaneSpace.multiplyBy(scale);
scale = getPerspectiveScale(pivot2screen);
_viewplaneSpace.multiplyBy(scale);
}
};
}
|