mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-05-05 10:59:47 -05:00
Set target dimensions from browser dimensions
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user