mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-06 03:29:44 -06:00
Add resizing functionality to all corners and side of browser
This commit is contained in:
Submodule ext/ghoul updated: 2180f32860...1625701baa
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -84,6 +84,7 @@ protected:
|
||||
glm::vec2 startDragMousePosTarget;
|
||||
glm::vec2 startDragObjectPosTarget;
|
||||
glm::vec2 startResizeBrowserSize;
|
||||
glm::vec2 resizeVector;
|
||||
bool currentlyDraggingBrowser;
|
||||
bool currentlyResizingBrowser;
|
||||
bool currentlyDraggingTarget;
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user