mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-02-22 04:49:12 -06:00
Add target square with shader
This commit is contained in:
@@ -18,10 +18,22 @@ namespace openspace {
|
||||
ScreenSpaceSkyTarget(const ghoul::Dictionary& dictionary);
|
||||
virtual ~ScreenSpaceSkyTarget() = default;
|
||||
|
||||
// from SSR
|
||||
bool initializeGL() override;
|
||||
bool isReady() const override;
|
||||
|
||||
void render() override;
|
||||
void update() override;
|
||||
|
||||
void createShaders();
|
||||
|
||||
void bindTexture() override;
|
||||
private:
|
||||
std::unique_ptr<ghoul::opengl::Texture> _texture;
|
||||
|
||||
UniformCache(modelTransform, viewProj, texture, borderWidth, scale) _uniformCache;
|
||||
GLuint _vertexArray = 0;
|
||||
GLuint _vertexBuffer = 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
uniform sampler2D texture1;
|
||||
uniform float OcclusionDepth;
|
||||
uniform float Alpha;
|
||||
uniform float Scale;
|
||||
uniform float BorderWidth;
|
||||
|
||||
in vec2 vs_st;
|
||||
in vec4 vs_position;
|
||||
@@ -10,8 +10,17 @@ in vec4 vs_position;
|
||||
Fragment getFragment() {
|
||||
Fragment frag;
|
||||
|
||||
vec3 color = vec3(1.0);
|
||||
frag.color = vec4(color, 1.0);
|
||||
vec2 bl = step(vec2(BorderWidth),1.0-vs_st); // bottom-left line
|
||||
vec2 tr = step(vec2(BorderWidth),vs_st); // top-right line
|
||||
|
||||
vec3 border = vec3(tr.x * tr.y * bl.x * bl.y);
|
||||
|
||||
frag.color = texture(texture1, vs_st);
|
||||
|
||||
if(border == vec3(1.0)) {
|
||||
|
||||
frag.color.a = 0.0;
|
||||
}
|
||||
|
||||
return frag;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,8 +94,6 @@ SkyBrowserModule::SkyBrowserModule()
|
||||
addProperty(_testProperty);
|
||||
addProperty(_zoomFactor);
|
||||
|
||||
createTarget();
|
||||
|
||||
global::callback::mousePosition->emplace_back(
|
||||
[&](double x, double y) {
|
||||
_mousePosition = glm::vec2(static_cast<float>(x), static_cast<float>(y));
|
||||
@@ -291,6 +289,7 @@ ghoul::Dictionary SkyBrowserModule::createMessageForPausingWWTTime() const {
|
||||
|
||||
|
||||
void SkyBrowserModule::initializeBrowser(ScreenSpaceSkyBrowser* skyBrowser) {
|
||||
createTarget();
|
||||
_skyBrowser = skyBrowser;
|
||||
}
|
||||
|
||||
@@ -317,38 +316,26 @@ glm::dvec2 SkyBrowserModule::convertGalacticToCelestial(glm::dvec3 rGal) const {
|
||||
return glm::dvec2(glm::degrees(ra), glm::degrees(dec));
|
||||
}
|
||||
|
||||
|
||||
void SkyBrowserModule::checkIfTargetExist() {
|
||||
ScreenSpaceSkyTarget* target = static_cast<ScreenSpaceSkyTarget*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceTarget"));
|
||||
|
||||
if (target) {
|
||||
LINFO("Target is not null!");
|
||||
|
||||
}
|
||||
LINFO("Target has been checked!");
|
||||
}
|
||||
|
||||
void SkyBrowserModule::createTarget() {
|
||||
|
||||
using namespace std::string_literals;
|
||||
|
||||
// Create target test
|
||||
std::string node = "{"
|
||||
"Type = 'ScreenSpaceSkyTarget',"
|
||||
"Identifier = 'ScreenSpaceTarget',"
|
||||
"Name = 'Screen Space Target',"
|
||||
"FaceCamera = false"
|
||||
"FaceCamera = false,"
|
||||
"Scale = 0.04,"
|
||||
"}";
|
||||
|
||||
openspace::global::scriptEngine->queueScript(
|
||||
"openspace.addScreenSpaceRenderable(" + node + ")",
|
||||
scripting::ScriptEngine::RemoteScripting::Yes
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
std::vector<documentation::Documentation> SkyBrowserModule::documentations() const {
|
||||
return {
|
||||
|
||||
@@ -59,7 +59,6 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
ScreenSpaceSkyBrowser* browser = dynamic_cast<ScreenSpaceSkyBrowser*>(global::renderEngine->screenSpaceRenderable("ScreenSpaceBowser"));
|
||||
module->initializeBrowser(browser);
|
||||
module->skyBrowser()->translate(glm::vec3(-0.8, -0.4, 0.0));
|
||||
module->checkIfTargetExist();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -89,11 +88,7 @@ namespace openspace::skybrowser::luascriptfunctions {
|
||||
openspace::global::scriptEngine->queueScript(
|
||||
"openspace.addScreenSpaceRenderable(" + node + ")",
|
||||
scripting::ScriptEngine::RemoteScripting::Yes
|
||||
);
|
||||
|
||||
//test create target
|
||||
module->createTarget();
|
||||
|
||||
);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
BIN
modules/skybrowser/square.png
Normal file
BIN
modules/skybrowser/square.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 409 B |
@@ -13,7 +13,7 @@
|
||||
#include <ghoul/logging/logmanager.h>
|
||||
|
||||
#include <openspace/scripting/scriptengine.h>
|
||||
|
||||
#include <openspace/engine/windowdelegate.h>
|
||||
#include <ghoul/opengl/programobject.h>
|
||||
#include <ghoul/io/texture/texturereader.h>
|
||||
#include <ghoul/opengl/texture.h>
|
||||
@@ -23,11 +23,14 @@
|
||||
#include <ghoul/opengl/openglstatecache.h>
|
||||
#include <glm/gtx/string_cast.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
namespace {
|
||||
constexpr const char* _loggerCat = "ScreenSpaceSkyTarget";
|
||||
|
||||
constexpr const std::array<const char*, 4> UniformNames = {
|
||||
"Alpha", "ModelTransform", "ViewProjectionMatrix", "texture1"
|
||||
constexpr const std::array<const char*, 5> UniformNames = {
|
||||
"ModelTransform", "ViewProjectionMatrix", "texture1", "BorderWidth", "Scale"
|
||||
};
|
||||
|
||||
} //namespace
|
||||
@@ -52,5 +55,85 @@ namespace openspace {
|
||||
_texture->bind();
|
||||
}
|
||||
}
|
||||
|
||||
bool ScreenSpaceSkyTarget::isReady() const {
|
||||
return _shader != nullptr;
|
||||
}
|
||||
|
||||
bool ScreenSpaceSkyTarget::initializeGL() {
|
||||
|
||||
glGenVertexArrays(1, &_vertexArray);
|
||||
glGenBuffers(1, &_vertexBuffer);
|
||||
|
||||
std::unique_ptr<ghoul::opengl::Texture> texture = ghoul::io::TextureReader::ref().loadTexture(absPath("${MODULE_SKYBROWSER}/square.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();
|
||||
}
|
||||
|
||||
createShaders();
|
||||
|
||||
return isReady();
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyTarget::createShaders() {
|
||||
|
||||
_shader = global::renderEngine->buildRenderProgram(
|
||||
"ScreenSpaceProgram",
|
||||
absPath("${MODULE_SKYBROWSER}/shaders/target_vs.glsl"),
|
||||
absPath("${MODULE_SKYBROWSER}/shaders/target_fs.glsl")
|
||||
);
|
||||
|
||||
ghoul::opengl::updateUniformLocations(*_shader, _uniformCache, UniformNames);
|
||||
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyTarget::render() {
|
||||
|
||||
glDisable(GL_CULL_FACE);
|
||||
|
||||
glm::mat4 modelTransform = globalRotationMatrix() * translationMatrix() * localRotationMatrix() * scaleMatrix();
|
||||
float borderWidth = 0.002f;
|
||||
|
||||
_shader->activate();
|
||||
|
||||
_shader->setUniform(_uniformCache.borderWidth, borderWidth);
|
||||
_shader->setUniform(_uniformCache.modelTransform, modelTransform);
|
||||
|
||||
_shader->setUniform(
|
||||
_uniformCache.viewProj,
|
||||
global::renderEngine->scene()->camera()->viewProjectionMatrix()
|
||||
);
|
||||
|
||||
ghoul::opengl::TextureUnit unit;
|
||||
unit.activate();
|
||||
bindTexture();
|
||||
_shader->setUniform(_uniformCache.texture, unit);
|
||||
|
||||
glBindVertexArray(rendering::helper::vertexObjects.square.vao);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
|
||||
glEnable(GL_CULL_FACE);
|
||||
|
||||
_shader->deactivate();
|
||||
unbindTexture();
|
||||
}
|
||||
|
||||
void ScreenSpaceSkyTarget::update() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user