Add resizing functionality to all corners and side of browser

This commit is contained in:
Ylva Selling
2021-03-18 16:13:46 +01:00
parent 1a49b1c4ba
commit 3573859ffe
8 changed files with 46 additions and 33 deletions

View File

@@ -77,7 +77,7 @@ protected:
void createShaders();
std::string makeUniqueIdentifier(std::string name);
glm::mat4 scaleMatrix();
virtual glm::mat4 scaleMatrix();
glm::mat4 globalRotationMatrix();
glm::mat4 translationMatrix();
glm::mat4 localRotationMatrix();

View File

@@ -19,7 +19,7 @@ namespace openspace {
glm::vec2 getUpperRightCornerScreenSpace();
glm::vec2 getLowerLeftCornerScreenSpace();
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
bool coordIsOnResizeButton(glm::vec2 coord);
glm::vec2 coordIsOnResizeArea(glm::vec2 coord);
void scale(glm::vec2 scalingFactor);
glm::mat4 scaleMatrix() override;

View File

@@ -143,7 +143,9 @@ SkyBrowserModule::SkyBrowserModule()
startDragMousePosBrowser = _mousePosition;
startDragObjectPosBrowser = _skyBrowser->getScreenSpacePosition();
// Resize browser if mouse is over resize button
if (_skyBrowser->coordIsOnResizeButton(_mousePosition)) {
resizeVector = _skyBrowser->coordIsOnResizeArea(_mousePosition);
if (resizeVector != glm::vec2{0}) {
_skyBrowser->saveResizeStartSize();
startResizeBrowserSize = _skyBrowser->getScreenSpaceDimensions();
currentlyResizingBrowser = true;
@@ -294,11 +296,13 @@ void SkyBrowserModule::handleInteractions() {
}
if (currentlyResizingBrowser) {
// Calculate scaling factor
glm::vec2 mouseDragVector = _mousePosition - startDragMousePosBrowser;
glm::vec2 mouseDragVector = (_mousePosition - startDragMousePosBrowser);
glm::vec2 scalingVector = mouseDragVector * resizeVector;
glm::vec2 newSizeRelToOld = (startResizeBrowserSize + mouseDragVector) / startResizeBrowserSize;
glm::vec2 newSizeRelToOld = (startResizeBrowserSize + (scalingVector)) / startResizeBrowserSize;
_skyBrowser->scale(newSizeRelToOld);
_skyBrowser->translate(mouseDragVector/2.f, startDragObjectPosBrowser);
// Make sure the browser doesn't move in directions it's not supposed to
_skyBrowser->translate(mouseDragVector * abs(resizeVector) /2.f, startDragObjectPosBrowser);
}
}
});

View File

@@ -84,6 +84,7 @@ protected:
glm::vec2 startDragMousePosTarget;
glm::vec2 startDragObjectPosTarget;
glm::vec2 startResizeBrowserSize;
glm::vec2 resizeVector;
bool currentlyDraggingBrowser;
bool currentlyResizingBrowser;
bool currentlyDraggingTarget;

View File

@@ -90,30 +90,43 @@ namespace openspace {
return lessThanUpperRight && moreThanLowerLeft;
}
bool ScreenSpaceSkyBrowser::coordIsOnResizeButton(glm::vec2 coord) {
float resizeButtonSize = 0.05f;
bool lessThanUpperRight = coord.x < getUpperRightCornerScreenSpace().x && coord.y < getUpperRightCornerScreenSpace().y;
bool moreThanLowerLeft = coord.x > getUpperRightCornerScreenSpace().x - (getScreenSpaceDimensions().x * resizeButtonSize) &&
coord.y > getLowerLeftCornerScreenSpace().y - (getScreenSpaceDimensions().y * resizeButtonSize);
return lessThanUpperRight && moreThanLowerLeft;
glm::vec2 ScreenSpaceSkyBrowser::coordIsOnResizeArea(glm::vec2 coord) {
glm::vec2 resizePosition = glm::vec2{ 0 };
// Make sure coord is on browser
if (!coordIsInsideCornersScreenSpace(coord)) return resizePosition;
float resizeButtonSize = 0.1f;
bool isOnTop = coord.y > getUpperRightCornerScreenSpace().y - (getScreenSpaceDimensions().y * resizeButtonSize);
bool isOnBottom = coord.y < getLowerLeftCornerScreenSpace().y + (getScreenSpaceDimensions().y * resizeButtonSize);
bool isOnRight = coord.x > getUpperRightCornerScreenSpace().x - (getScreenSpaceDimensions().x * resizeButtonSize);
bool isOnLeft = coord.x < getLowerLeftCornerScreenSpace().x + (getScreenSpaceDimensions().x * resizeButtonSize);
resizePosition.x = isOnRight ? 1.f : isOnLeft ? -1.f : 0.f;
resizePosition.y = isOnTop ? 1.f : isOnBottom ? -1.f : 0.f;
return resizePosition;
}
// Scales the ScreenSpaceBrowser to a new ratio
void ScreenSpaceSkyBrowser::scale(glm::vec2 scalingFactor) {
// Resize the dimensions of the texture on the x axis
glm::vec2 newSize = abs(scalingFactor) * _startSize;
_texture->setDimensions(glm::ivec3(newSize, 1));
// Scale on the y axis, this is to ensure that _scale = 1 is
// equal to the height of the window
scale(abs(scalingFactor.y));
// Resize the dimensions of the texture on the x axis
glm::vec2 newSize = abs(scalingFactor) * _startSize;
_texture->setDimensions(glm::ivec3(newSize, 1));
// To not make it glitch... Makes it glitch in other ways however
//updateBrowserSize();
}
glm::mat4 ScreenSpaceSkyBrowser::scaleMatrix() {
// To ensure the plane has the right ratio
// The _scale us how much of the windows height the
// The _scale tells us how much of the windows height the
// browser covers: eg a browser that covers 0.25 of the
// height of the window will have scale = 0.25
float textureRatio =
static_cast<float>(_objectSize.x) / static_cast<float>(_objectSize.y);
static_cast<float>(_texture->dimensions().x) / static_cast<float>(_texture->dimensions().y);
glm::mat4 scale = glm::scale(
glm::mat4(1.f),

View File

@@ -75,7 +75,10 @@ public:
protected:
properties::Vec2Property _dimensions;
std::unique_ptr<BrowserInstance> _browserInstance;
private:
std::unique_ptr<ghoul::opengl::Texture> _texture;
class ScreenSpaceRenderHandler : public WebRenderHandler {
public:
void draw() override;
@@ -84,18 +87,18 @@ private:
void setTexture(GLuint t);
};
CefRefPtr<ScreenSpaceRenderHandler> _renderHandler;
private:
void bindTexture() override;
properties::StringProperty _url;
properties::TriggerProperty _reload;
CefRefPtr<ScreenSpaceRenderHandler> _renderHandler;
CefRefPtr<WebKeyboardHandler> _keyboardHandler;
std::unique_ptr<ghoul::opengl::Texture> _texture;
bool _isUrlDirty = false;
bool _isDimensionsDirty = false;
};

View File

@@ -553,17 +553,9 @@ glm::mat4 ScreenSpaceRenderable::scaleMatrix() {
glm::mat4 scale = glm::scale(
glm::mat4(1.f),
glm::vec3(_scale, _scale * textureRatio, 1.f)
glm::vec3(_scale, textureRatio*_scale, 1.f)
);
// Simulate orthographic projection by distance to plane.
if (!_usePerspectiveProjection) {
float distance = _useRadiusAzimuthElevation ?
_raePosition.value().x :
-_cartesianPosition.value().z;
scale = glm::scale(scale, glm::vec3(distance));
}
return scale;
}