mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-26 22:19:17 -06:00
Merge resolve
This commit is contained in:
@@ -18,7 +18,7 @@ namespace openspace {
|
||||
void sendMouseEvent(CefStructBase<CefMouseEventTraits> event, int x, int y) const;
|
||||
glm::vec2 getUpperRightCornerScreenSpace();
|
||||
glm::vec2 getLowerLeftCornerScreenSpace();
|
||||
bool coordIsInsideBrowserScreenSpace(glm::vec2 coord);
|
||||
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
@@ -27,6 +27,15 @@ namespace openspace {
|
||||
|
||||
void createShaders();
|
||||
|
||||
glm::vec2 getScreenSpacePosition();
|
||||
|
||||
void translate(glm::vec2 translation, glm::vec2 position);
|
||||
|
||||
glm::vec2 getScreenSpaceDimensions();
|
||||
glm::vec2 getUpperRightCornerScreenSpace();
|
||||
glm::vec2 getLowerLeftCornerScreenSpace();
|
||||
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
|
||||
|
||||
void bindTexture() override;
|
||||
private:
|
||||
std::unique_ptr<ghoul::opengl::Texture> _texture;
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
#include <ghoul/misc/dictionaryjsonformatter.h> // formatJson
|
||||
#include <glm/gtx/string_cast.hpp>
|
||||
|
||||
|
||||
namespace {
|
||||
constexpr const openspace::properties::Property::PropertyInfo TestInfo =
|
||||
{
|
||||
@@ -87,18 +86,93 @@ SkyBrowserModule::SkyBrowserModule()
|
||||
, _testProperty(TestInfo)
|
||||
, _zoomFactor(ZoomInfo, 50.f ,0.1f ,70.f)
|
||||
, _skyBrowser(nullptr)
|
||||
, _skyTarget(nullptr)
|
||||
, _camIsSyncedWWT(true)
|
||||
, mouseIsClickedPreviously(false)
|
||||
, currentlyDraggingBrowser(false)
|
||||
, currentlyDraggingTarget(false)
|
||||
, _listenForInteractions(true)
|
||||
, mouseIsOnBrowser(false)
|
||||
, mouseIsOnTarget(false)
|
||||
|
||||
{
|
||||
addProperty(_testProperty);
|
||||
addProperty(_zoomFactor);
|
||||
|
||||
global::callback::mousePosition->emplace_back(
|
||||
[&](double x, double y) {
|
||||
_mousePosition = glm::vec2(static_cast<float>(x), static_cast<float>(y));
|
||||
[&](double x, double y) {
|
||||
glm::vec2 pos = glm::vec2(static_cast<float>(x), static_cast<float>(y));
|
||||
_mousePosition = getMousePositionInScreenSpaceCoords(pos);
|
||||
|
||||
if (_skyTarget) {
|
||||
mouseIsOnTarget = _skyTarget->coordIsInsideCornersScreenSpace(_mousePosition);
|
||||
}
|
||||
else {
|
||||
mouseIsOnTarget = false;
|
||||
}
|
||||
if (_skyBrowser) {
|
||||
mouseIsOnBrowser = _skyBrowser->coordIsInsideCornersScreenSpace(_mousePosition);
|
||||
}
|
||||
else {
|
||||
mouseIsOnBrowser = false;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
global::callback::mouseScrollWheel->emplace_back(
|
||||
[&](double, double scroll) -> bool {
|
||||
if (mouseIsOnBrowser) {
|
||||
float zoom = scroll > 0.0 ? -2.0f : 2.0f;
|
||||
_zoomFactor = std::clamp(_zoomFactor + zoom, 0.001f, 70.0f);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
);
|
||||
|
||||
global::callback::mouseButton->emplace_back(
|
||||
[&](MouseButton button, MouseAction action, KeyModifier modifier) -> bool {
|
||||
|
||||
if (action == MouseAction::Press) {
|
||||
|
||||
if (mouseIsOnBrowser && button == MouseButton::Left) {
|
||||
|
||||
startDragMousePosBrowser = _mousePosition;
|
||||
startDragObjectPosBrowser = _skyBrowser->getScreenSpacePosition();
|
||||
currentlyDraggingBrowser = true;
|
||||
return true;
|
||||
}
|
||||
else if (mouseIsOnTarget && button == MouseButton::Left) {
|
||||
|
||||
startDragMousePosTarget = _mousePosition;
|
||||
startDragObjectPosTarget = _skyTarget->getScreenSpacePosition();
|
||||
currentlyDraggingTarget = true;
|
||||
return true;
|
||||
}
|
||||
else if (mouseIsOnBrowser && button == MouseButton::Right) {
|
||||
|
||||
startDragMousePosTarget = _mousePosition;
|
||||
startDragObjectPosTarget = _skyTarget->getScreenSpacePosition();
|
||||
currentlyDraggingTarget = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (action == MouseAction::Release) {
|
||||
if (currentlyDraggingBrowser) {
|
||||
currentlyDraggingBrowser = false;
|
||||
return true;
|
||||
}
|
||||
if (currentlyDraggingTarget) {
|
||||
currentlyDraggingTarget = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SkyBrowserModule::internalDeinitialize() {
|
||||
@@ -190,49 +264,28 @@ bool SkyBrowserModule::sendMessageToWWT(const ghoul::Dictionary& msg) {
|
||||
}
|
||||
|
||||
void SkyBrowserModule::handleInteractions() {
|
||||
/*
|
||||
float scroll = global::navigationHandler->inputState().mouseScrollDelta();
|
||||
bool mouseIsOverBrowser = _skyBrowser->coordIsInsideBrowserScreenSpace(getMousePositionInScreenSpaceCoords());
|
||||
LINFO(std::to_string(mouseIsOverBrowser));
|
||||
|
||||
_zoomFactor = std::clamp(_zoomFactor - scroll, 0.001f, 70.0f);
|
||||
/*
|
||||
CefStructBase<CefMouseEventTraits> event;
|
||||
_skyBrowser->sendMouseEvent(event, scroll, scroll);
|
||||
*/
|
||||
_threadHandleInteractions = std::thread([&] {
|
||||
while (_listenForInteractions) {
|
||||
bool mouseIsClicked = global::navigationHandler->inputState().isMouseButtonPressed(MouseButton::Left);
|
||||
|
||||
if (mouseIsClicked) {
|
||||
dragBrowser();
|
||||
if (currentlyDraggingBrowser) {
|
||||
_skyBrowser->translate(_mousePosition - startDragMousePosBrowser, startDragObjectPosBrowser);
|
||||
}
|
||||
else {
|
||||
mouseIsClickedPreviously = false;
|
||||
if (currentlyDraggingTarget) {
|
||||
_skyTarget->translate(_mousePosition - startDragMousePosTarget, startDragObjectPosTarget);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords() {
|
||||
glm::vec2 SkyBrowserModule::getMousePositionInScreenSpaceCoords(glm::vec2& mousePos) {
|
||||
glm::vec2 size = glm::vec2(global::windowDelegate->currentWindowSize());
|
||||
|
||||
// Transform pixel coordinates to screen space coordinates [-1,1]
|
||||
return glm::vec2((_mousePosition - (size / 2.0f)) * glm::vec2(1.0f,-1.0f) / (size / 2.0f));
|
||||
}
|
||||
|
||||
void SkyBrowserModule::dragBrowser() {
|
||||
// First click on browser - user is not holding down the button since last frame
|
||||
glm::dvec2 mouseCoords = getMousePositionInScreenSpaceCoords();
|
||||
bool mouseIsOnBrowser = _skyBrowser->coordIsInsideBrowserScreenSpace(mouseCoords);
|
||||
|
||||
if (mouseIsOnBrowser && !mouseIsClickedPreviously) {
|
||||
mouseIsClickedPreviously = true;
|
||||
startDragMousePos = mouseCoords;
|
||||
startDragObjectPos = _skyBrowser->getScreenSpacePosition();
|
||||
}
|
||||
else if (mouseIsClickedPreviously) {
|
||||
_skyBrowser->translate(mouseCoords - startDragMousePos, startDragObjectPos);
|
||||
}
|
||||
return glm::vec2((mousePos - (size / 2.0f)) * glm::vec2(1.0f,-1.0f) / (size / 2.0f));
|
||||
}
|
||||
|
||||
void SkyBrowserModule::WWTfollowCamera() {
|
||||
@@ -288,9 +341,11 @@ ghoul::Dictionary SkyBrowserModule::createMessageForPausingWWTTime() const {
|
||||
}
|
||||
|
||||
|
||||
void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser) {
|
||||
createTarget();
|
||||
|
||||
void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget) {
|
||||
|
||||
_skyBrowser = skyBrowser;
|
||||
_skyTarget = skyTarget;
|
||||
}
|
||||
|
||||
ScreenSpaceSkyBrowser* SkyBrowserModule::skyBrowser() {
|
||||
|
||||
@@ -60,10 +60,9 @@ public:
|
||||
|
||||
bool sendMessageToWWT(const ghoul::Dictionary& msg);
|
||||
void handleInteractions();
|
||||
glm::vec2 getMousePositionInScreenSpaceCoords();
|
||||
void dragBrowser();
|
||||
glm::vec2 getMousePositionInScreenSpaceCoords(glm::vec2& mousePos);
|
||||
|
||||
void initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser_);
|
||||
void initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser, ScreenSpaceSkyTarget* skyTarget);
|
||||
ScreenSpaceSkyBrowser* skyBrowser();
|
||||
scripting::LuaLibrary luaLibrary() const override;
|
||||
//std::vector<documentation::Documentation> documentations() const override;
|
||||
@@ -75,14 +74,21 @@ protected:
|
||||
properties::StringProperty _testProperty;
|
||||
properties::FloatProperty _zoomFactor;
|
||||
ScreenSpaceSkyBrowser* _skyBrowser;
|
||||
ScreenSpaceSkyTarget* _skyTarget;
|
||||
bool _camIsSyncedWWT;
|
||||
bool _listenForInteractions;
|
||||
std::thread _threadWWTMessages;
|
||||
std::thread _threadHandleInteractions;
|
||||
glm::dvec2 startDragMousePos;
|
||||
glm::dvec2 startDragObjectPos;
|
||||
bool mouseIsClickedPreviously;
|
||||
glm::vec2 startDragMousePosBrowser;
|
||||
glm::vec2 startDragObjectPosBrowser;
|
||||
glm::vec2 startDragMousePosTarget;
|
||||
glm::vec2 startDragObjectPosTarget;
|
||||
bool currentlyDraggingBrowser;
|
||||
bool currentlyDraggingTarget;
|
||||
glm::vec2 _mousePosition;
|
||||
double _mouseScroll;
|
||||
bool mouseIsOnBrowser;
|
||||
bool mouseIsOnTarget;
|
||||
};
|
||||
|
||||
} // namespace openspace
|
||||
|
||||
@@ -44,8 +44,7 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::followCamera");
|
||||
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
//ghoul::Dictionary message = module->createMessageForPausingWWTTime();
|
||||
//module->sendMessageToWWT(message);
|
||||
|
||||
module->WWTfollowCamera();
|
||||
module->handleInteractions();
|
||||
|
||||
@@ -57,7 +56,8 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
|
||||
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser"));
|
||||
module->initializeBrowser(browser);
|
||||
ScreenSpaceSkyTarget* target = dynamic_cast<ScreenSpaceSkyTarget*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceTarget"));
|
||||
module->initializeBrowser(browser, target);
|
||||
module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0));
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -119,7 +119,7 @@ namespace openspace {
|
||||
return getScreenSpacePosition() - (getScreenSpaceDimensions()/2.0f);
|
||||
}
|
||||
|
||||
bool ScreenSpaceSkyBrowser::coordIsInsideBrowserScreenSpace(glm::vec2 coord) {
|
||||
bool ScreenSpaceSkyBrowser::coordIsInsideCornersScreenSpace(glm::vec2 coord) {
|
||||
bool lessThanUpperRight = coord.x < getUpperRightCornerScreenSpace().x && coord.y < getUpperRightCornerScreenSpace().y;
|
||||
bool moreThanLowerLeft = coord.x > getLowerLeftCornerScreenSpace().x && coord.y > getLowerLeftCornerScreenSpace().y;
|
||||
return lessThanUpperRight && moreThanLowerLeft;
|
||||
|
||||
@@ -23,8 +23,10 @@
|
||||
#include <ghoul/opengl/openglstatecache.h>
|
||||
#include <glm/gtx/string_cast.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <ghoul/filesystem/filesystem.h>
|
||||
#include <openspace/engine/windowdelegate.h>
|
||||
#include <glm/gtx/matrix_decompose.hpp>
|
||||
|
||||
|
||||
namespace {
|
||||
constexpr const char* _loggerCat = "ScreenSpaceSkyTarget";
|
||||
@@ -48,6 +50,22 @@ namespace openspace {
|
||||
}
|
||||
identifier = makeUniqueIdentifier(identifier);
|
||||
setIdentifier(identifier);
|
||||
|
||||
std::unique_ptr<ghoul::opengl::Texture> texture =
|
||||
ghoul::io::TextureReader::ref().loadTexture(absPath("D:/Ylvas/OpenSpace/modules/skybrowser/target.png"));
|
||||
|
||||
if (texture) {
|
||||
// Images don't need to start on 4-byte boundaries, for example if the
|
||||
// image is only RGB
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
|
||||
texture->uploadTexture();
|
||||
texture->setFilter(ghoul::opengl::Texture::FilterMode::LinearMipMap);
|
||||
texture->purgeFromRAM();
|
||||
|
||||
_texture = std::move(texture);
|
||||
_objectSize = _texture->dimensions();
|
||||
}
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyTarget::bindTexture() {
|
||||
@@ -134,6 +152,65 @@ namespace openspace {
|
||||
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyTarget::translate(glm::vec2 translation, glm::vec2 position) {
|
||||
|
||||
glm::vec2 windowRatio = global::windowDelegate->currentWindowSize();
|
||||
windowRatio /= windowRatio.y;
|
||||
|
||||
_cartesianPosition = glm::translate(glm::mat4(1.f), glm::vec3(translation * windowRatio, 0.0f)) * glm::vec4(position * windowRatio, _cartesianPosition.value().z, 1.0f);
|
||||
}
|
||||
|
||||
glm::vec2 ScreenSpaceSkyTarget::getScreenSpacePosition() {
|
||||
glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() *
|
||||
localRotationMatrix() * scaleMatrix();
|
||||
glm::mat4 viewProj = global::renderEngine->scene()->camera()->viewProjectionMatrix();
|
||||
glm::mat4 screenSpaceTransform = viewProj * modelTransform;
|
||||
|
||||
glm::vec3 scale;
|
||||
glm::quat rotation;
|
||||
glm::vec3 translation;
|
||||
glm::vec3 skew;
|
||||
glm::vec4 perspective;
|
||||
glm::decompose(screenSpaceTransform, scale, rotation, translation, skew, perspective);
|
||||
|
||||
return translation;
|
||||
}
|
||||
|
||||
glm::vec2 ScreenSpaceSkyTarget::getScreenSpaceDimensions() {
|
||||
glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() *
|
||||
localRotationMatrix() * scaleMatrix();
|
||||
glm::mat4 viewProj = global::renderEngine->scene()->camera()->viewProjectionMatrix();
|
||||
glm::mat4 screenSpaceTransform = viewProj * modelTransform;
|
||||
|
||||
|
||||
glm::vec3 scale;
|
||||
glm::quat rotation;
|
||||
glm::vec3 translation;
|
||||
glm::vec3 skew;
|
||||
glm::vec4 perspective;
|
||||
glm::decompose(screenSpaceTransform, scale, rotation, translation, skew, perspective);
|
||||
|
||||
// Scale is negative and relative to the whole screen
|
||||
// Changing to positive and View Coordinates [-1,1]
|
||||
// E.g. a full screen screenspacebrowser will have [2,2]
|
||||
scale = -2.0f * scale;
|
||||
|
||||
return scale;
|
||||
}
|
||||
|
||||
glm::vec2 ScreenSpaceSkyTarget::getUpperRightCornerScreenSpace() {
|
||||
|
||||
return getScreenSpacePosition() + (getScreenSpaceDimensions() / 2.0f);
|
||||
}
|
||||
|
||||
glm::vec2 ScreenSpaceSkyTarget::getLowerLeftCornerScreenSpace() {
|
||||
return getScreenSpacePosition() - (getScreenSpaceDimensions() / 2.0f);
|
||||
}
|
||||
|
||||
bool ScreenSpaceSkyTarget::coordIsInsideCornersScreenSpace(glm::vec2 coord) {
|
||||
bool lessThanUpperRight = coord.x < getUpperRightCornerScreenSpace().x && coord.y < getUpperRightCornerScreenSpace().y;
|
||||
bool moreThanLowerLeft = coord.x > getLowerLeftCornerScreenSpace().x && coord.y > getLowerLeftCornerScreenSpace().y;
|
||||
return lessThanUpperRight && moreThanLowerLeft;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user