Set target dimensions from browser dimensions

This commit is contained in:
Ester Lindgren
2021-03-19 09:57:14 +01:00
parent ac4fc926a2
commit 543e3641ab
9 changed files with 143 additions and 26 deletions
@@ -19,16 +19,26 @@ namespace openspace {
glm::vec2 getUpperRightCornerScreenSpace();
glm::vec2 getLowerLeftCornerScreenSpace();
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
<<<<<<< Updated upstream
glm::vec2 coordIsOnResizeArea(glm::vec2 coord);
=======
bool coordIsOnResizeButton(glm::vec2 coord);
>>>>>>> Stashed changes
void scale(glm::vec2 scalingFactor);
glm::mat4 scaleMatrix() override;
void saveResizeStartSize();
void updateBrowserSize();
void scale(float scalingFactor);
glm::vec2 getScreenSpaceBrowserDimension();
bool _browserDimIsDirty;
private:
glm::vec2 _startSize;
float _startScale;
properties::Vec2Property _browserDimensions;
};
}
@@ -3,7 +3,11 @@
#include <openspace/rendering/screenspacerenderable.h>
#include <openspace/documentation/documentation.h>
#include <openspace/properties/scalar/floatproperty.h>
#include <openspace/properties/vector/vec2property.h>
#include <openspace/properties/numericalproperty.h>
#include <ghoul/opengl/ghoul_gl.h>
#include <ghoul/opengl/texture.h>
@@ -27,6 +31,8 @@ namespace openspace {
void createShaders();
void setScreenSpaceTargetDimension(glm::vec2 currentBrowserDimension);
glm::vec2 getScreenSpacePosition();
glm::vec2 getAnglePosition();
@@ -36,12 +42,17 @@ namespace openspace {
glm::vec2 getUpperRightCornerScreenSpace();
glm::vec2 getLowerLeftCornerScreenSpace();
bool coordIsInsideCornersScreenSpace(glm::vec2 coord);
glm::mat4 scaleMatrix() override;
void bindTexture() override;
private:
std::unique_ptr<ghoul::opengl::Texture> _texture;
UniformCache(modelTransform, viewProj, texture, borderWidth, scale) _uniformCache;
properties::Vec2Property _targetDimensions;
std::unique_ptr<ghoul::opengl::Texture> _texture;
//glm::vec2 _browserDimension = glm::vec2(0);
UniformCache(modelTransform, viewProj, texture, borderWidth, targetRatio) _uniformCache;
GLuint _vertexArray = 0;
GLuint _vertexBuffer = 0;
};
+7 -7
View File
@@ -1,6 +1,6 @@
uniform sampler2D texture1;
uniform float Scale;
uniform float BorderWidth;
uniform float borderWidth;
uniform vec2 targetRatio;
in vec2 vs_st;
in vec4 vs_position;
@@ -10,17 +10,17 @@ in vec4 vs_position;
Fragment getFragment() {
Fragment frag;
vec2 bl = step(vec2(BorderWidth),1.0-vs_st); // bottom-left line
vec2 tr = step(vec2(BorderWidth),vs_st); // top-right line
// draw square border
vec2 bl = step(vec2(borderWidth),(1.0-vs_st)*targetRatio); // bottom-left line
vec2 tr = step(vec2(borderWidth),vs_st*targetRatio); // top-right line
vec3 border = vec3(tr.x * tr.y * bl.x * bl.y);
frag.color = texture(texture1, vs_st);
frag.color = vec4(1,1,1,1);
if(border == vec3(1.0)) {
frag.color.a = 0.0;
}
return frag;
}
+12 -4
View File
@@ -182,6 +182,7 @@ SkyBrowserModule::SkyBrowserModule()
}
if (currentlyResizingBrowser) {
currentlyResizingBrowser = false;
_skyBrowser->_browserDimIsDirty = false;
_skyBrowser->updateBrowserSize();
return true;
}
@@ -301,8 +302,12 @@ void SkyBrowserModule::handleInteractions() {
glm::vec2 newSizeRelToOld = (startResizeBrowserSize + (scalingVector)) / startResizeBrowserSize;
_skyBrowser->scale(newSizeRelToOld);
// Make sure the browser doesn't move in directions it's not supposed to
_skyBrowser->translate(mouseDragVector * abs(resizeVector) /2.f, startDragObjectPosBrowser);
_skyTarget->setScreenSpaceTargetDimension(_skyBrowser->getScreenSpaceBrowserDimension());
}
}
});
@@ -330,7 +335,7 @@ void SkyBrowserModule::WWTfollowCamera() {
glm::vec3 upDirection = global::navigationHandler->camera()->lookUpVectorWorldSpace();
glm::vec3 sideDirection = glm::cross(upDirection, viewDirection);
glm::vec2 angleOffset = _skyTarget->getAnglePosition();
glm::vec2 angleOffset = _skyTarget ? _skyTarget->getAnglePosition() : glm::vec2(0);
// Change view if target is moved
glm::vec3 targetDirection = glm::rotate(viewDirection, angleOffset.x, upDirection);
targetDirection = glm::rotate(targetDirection, angleOffset.y, sideDirection);
@@ -410,23 +415,26 @@ glm::dvec2 SkyBrowserModule::convertGalacticToCelestial(glm::dvec3 rGal) const {
return glm::dvec2(glm::degrees(ra), glm::degrees(dec));
}
void SkyBrowserModule::createTarget() {
void SkyBrowserModule::createTarget(glm::ivec2 dimension) {
std::string browserDim = fmt::format("{{{},{}}}", dimension.x, dimension.y);
LINFO(browserDim);
using namespace std::string_literals;
std::string node = "{"
"Type = 'ScreenSpaceSkyTarget',"
"Identifier = 'ScreenSpaceTarget',"
"Name = 'Screen Space Target',"
"FaceCamera = false,"
"Scale = 0.04,"
"TargetDimensions = " + browserDim + ""
"}";
openspace::global::scriptEngine->queueScript(
"openspace.addScreenSpaceRenderable(" + node + ")",
scripting::ScriptEngine::RemoteScripting::Yes
);
}
+1 -2
View File
@@ -51,9 +51,8 @@ public:
void WWTfollowCamera();
// target
void createTarget();
void createBrowser();
void createTarget(glm::ivec2 dimension);
ghoul::Dictionary createMessageForMovingWWTCamera(const glm::dvec2 celestCoords, const float fov, const bool moveInstantly = true) const;
ghoul::Dictionary createMessageForPausingWWTTime() const;
+14 -5
View File
@@ -44,6 +44,14 @@ namespace openspace::skybrowser::luascriptfunctions {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::followCamera");
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
ScreenSpaceSkyTarget* target = nullptr;
while (!target) {
target = dynamic_cast<ScreenSpaceSkyTarget*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceTarget"));
}
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser"));
module->initializeBrowser(browser, target);
module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0));
module->WWTfollowCamera();
module->handleInteractions();
@@ -54,11 +62,11 @@ namespace openspace::skybrowser::luascriptfunctions {
int moveBrowser(lua_State* L) {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::moveBrowser");
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser"));
ScreenSpaceSkyTarget* target = dynamic_cast<ScreenSpaceSkyTarget*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceTarget"));
module->initializeBrowser(browser, target);
module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0));
// target test
module->createTarget(browser->getScreenSpaceBrowserDimension());
return 1;
}
@@ -67,9 +75,10 @@ namespace openspace::skybrowser::luascriptfunctions {
ghoul::lua::checkArgumentsAndThrow(L, 0, "lua::createBrowser");
SkyBrowserModule* module = global::moduleEngine->module<SkyBrowserModule>();
module->createBrowser();
module->createTarget();
return 1;
}
@@ -20,12 +20,33 @@
namespace {
constexpr const char* _loggerCat = "ScreenSpaceSkyBrowser";
constexpr const openspace::properties::Property::PropertyInfo BrowserDimensionInfo =
{
"BrowserDimensions",
"Browser Dimensions Info",
"Set the dimensions of the SkyTarget according to the SkyBrowser ratio "
};
struct [[codegen::Dictionary(ScreenSpaceSkyBrowser)]] Parameters {
// [[codegen::verbatim(BrowserDimensionInfo.description)]]
std::optional<glm::vec2> browserDimensions;
};
#include "screenspaceskybrowser_codegen.cpp"
} // namespace
namespace openspace {
ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary)
: ScreenSpaceBrowser(dictionary)
, _browserDimensions(BrowserDimensionInfo, _dimensions, glm::ivec2(0.f), glm::ivec2(300.f))
{
// Handle target dimension property
const Parameters p = codegen::bake<Parameters>(dictionary);
_browserDimensions = p.browserDimensions.value_or(_browserDimensions);
_browserDimensions.onChange([&]() { _browserDimIsDirty = true; });
addProperty(_browserDimensions);
std::string identifier;
if (dictionary.hasValue<std::string>(KeyIdentifier)) {
identifier = dictionary.value<std::string>(KeyIdentifier);
@@ -109,13 +130,14 @@ namespace openspace {
}
// Scales the ScreenSpaceBrowser to a new ratio
void ScreenSpaceSkyBrowser::scale(glm::vec2 scalingFactor) {
// 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));
_browserDimensions = newSize;
// To not make it glitch... Makes it glitch in other ways however
//updateBrowserSize();
}
@@ -146,4 +168,8 @@ namespace openspace {
void ScreenSpaceSkyBrowser::scale(float scalingFactor) {
_scale = _startScale * scalingFactor;
}
glm::vec2 ScreenSpaceSkyBrowser::getScreenSpaceBrowserDimension() {
return _browserDimensions.value();
}
}
@@ -31,16 +31,39 @@
namespace {
constexpr const char* _loggerCat = "ScreenSpaceSkyTarget";
constexpr const std::array<const char*, 5> UniformNames = {
"ModelTransform", "ViewProjectionMatrix", "texture1", "BorderWidth", "Scale"
constexpr const openspace::properties::Property::PropertyInfo TargetDimensionInfo =
{
"TargetDimensions",
"Target Dimensions Info",
"Set the dimensions of the SkyTarget according to the SkyBrowser ratio "
};
constexpr const std::array<const char*, 5> UniformNames = {
"ModelTransform", "ViewProjectionMatrix", "texture1", "borderWidth", "targetRatio"
};
struct [[codegen::Dictionary(ScreenSpaceSkyTarget)]] Parameters {
// [[codegen::verbatim(TargetDimensionInfo.description)]]
std::optional<glm::vec2> targetDimensions;
};
#include "screenspaceskytarget_codegen.cpp"
} //namespace
namespace openspace {
ScreenSpaceSkyTarget::ScreenSpaceSkyTarget(const ghoul::Dictionary& dictionary)
: ScreenSpaceRenderable(dictionary)
, _targetDimensions(TargetDimensionInfo, glm::ivec2(1000.f), glm::ivec2(0.f), glm::ivec2(6000.f))
{
// Handle target dimension property
const Parameters p = codegen::bake<Parameters>(dictionary);
_targetDimensions = p.targetDimensions.value_or(_targetDimensions);
addProperty(_targetDimensions);
std::string identifier;
if (dictionary.hasValue<std::string>(KeyIdentifier)) {
identifier = dictionary.value<std::string>(KeyIdentifier);
@@ -51,6 +74,9 @@ 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"));
@@ -66,7 +92,9 @@ namespace openspace {
_texture = std::move(texture);
_objectSize = _texture->dimensions();
}
*/
_cartesianPosition.setValue(glm::vec3(_cartesianPosition.value().x, _cartesianPosition.value().y, -2.1f));
}
void ScreenSpaceSkyTarget::bindTexture() {
@@ -105,6 +133,22 @@ namespace openspace {
return isReady();
}
glm::mat4 ScreenSpaceSkyTarget::scaleMatrix() {
// To ensure the plane has the right ratio
// The _scale 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>(_targetDimensions.value().x) / static_cast<float>(_targetDimensions.value().y);
glm::mat4 scale = glm::scale(
glm::mat4(1.f),
glm::vec3(textureRatio * _scale, _scale, 1.f)
);
return scale;
}
void ScreenSpaceSkyTarget::createShaders() {
_shader = global::renderEngine->buildRenderProgram(
@@ -122,11 +166,14 @@ namespace openspace {
glDisable(GL_CULL_FACE);
glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * scaleMatrix();
float borderWidth = 0.002f;
float borderWidth = 0.005f / _scale.value();
glm::vec2 targetRatio;
_targetDimensions.value() == glm::vec2(0) ? targetRatio = glm::vec2(1) : targetRatio = _targetDimensions.value() / _targetDimensions.value().y;
_shader->activate();
_shader->setUniform(_uniformCache.borderWidth, borderWidth);
_shader->setUniform(_uniformCache.targetRatio, targetRatio);
_shader->setUniform(_uniformCache.modelTransform, modelTransform);
_shader->setUniform(
@@ -184,4 +231,11 @@ namespace openspace {
bool moreThanLowerLeft = coord.x > getLowerLeftCornerScreenSpace().x && coord.y > getLowerLeftCornerScreenSpace().y;
return lessThanUpperRight && moreThanLowerLeft;
}
void ScreenSpaceSkyTarget::setScreenSpaceTargetDimension(glm::vec2 currentBrowserDimension) {
_targetDimensions = currentBrowserDimension; // TA IN SOM EN PROP!
}
}
@@ -76,8 +76,8 @@ protected:
properties::Vec2Property _dimensions;
std::unique_ptr<BrowserInstance> _browserInstance;
std::unique_ptr<ghoul::opengl::Texture> _texture;
private:
class ScreenSpaceRenderHandler : public WebRenderHandler {
public: