Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package CalcMySky for openSUSE:Factory checked in at 2023-04-20 15:14:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/CalcMySky (Old) and /work/SRC/openSUSE:Factory/.CalcMySky.new.2023 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "CalcMySky" Thu Apr 20 15:14:54 2023 rev:2 rq:1080857 version:0.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/CalcMySky/CalcMySky.changes 2022-11-10 14:22:16.946348993 +0100 +++ /work/SRC/openSUSE:Factory/.CalcMySky.new.2023/CalcMySky.changes 2023-04-20 15:16:01.162490993 +0200 @@ -1,0 +2,15 @@ +Thu Apr 20 09:48:51 UTC 2023 - Paolo Stivanin <i...@paolostivanin.com> + +- Fix packaging issue. + +------------------------------------------------------------------- +Tue Apr 11 12:59:53 UTC 2023 - Paolo Stivanin <i...@paolostivanin.com> + +- Update to 0.3.0: + * Now it's possible to replace view direction shaders via ShowMySky API + without re-creating the renderer. This lets Stellarium switch between + projections while implementing them in fragment shaders for better image quality. + * CMake configuration modules are now installed in paths like /usr/lib/cmake/ShowMySky-Qt6 + instead of /usr/lib/ShowMySky-Qt6/cmake. + +------------------------------------------------------------------- Old: ---- CalcMySky-0.2.1.tar.gz New: ---- CalcMySky-0.3.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ CalcMySky.spec ++++++ --- /var/tmp/diff_new_pack.Bq4O5N/_old 2023-04-20 15:16:01.702494657 +0200 +++ /var/tmp/diff_new_pack.Bq4O5N/_new 2023-04-20 15:16:01.706494685 +0200 @@ -1,7 +1,7 @@ # # spec file for package CalcMySky # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -15,7 +15,8 @@ # Please submit bugfixes or comments via https://bugs.opensuse.org/ # -%define sover 14 + +%define sover 15 %if 0%{?suse_version} > 1550 %define qtver 6 %else @@ -23,13 +24,13 @@ %endif Name: CalcMySky -Version: 0.2.1 +Version: 0.3.0 Release: 0 Summary: Software package that simulates scattering of light by the atmosphere License: GPL-3.0-or-later URL: https://github.com/10110111/CalcMySky Source: https://github.com/10110111/CalcMySky/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -%if 0%{?suse_version} < 1550 +%if 0%{?suse_version} < 1590 BuildRequires: gcc11-c++ %else BuildRequires: gcc-c++ @@ -64,11 +65,14 @@ %description -n libShowMySky-Qt%{qtver}-%{sover} This package contains the library libShowMySky. -%package -n libShowMySky-Qt%{qtver}-%{sover}-devel +%package -n libShowMySky-Qt%{qtver}-devel Summary: Devel files for libShowMySky Requires: libShowMySky-Qt%{qtver}-%{sover} = %{version} +# fix packaging issue that was done when package was created +Provides: libShowMySky-Qt6-14-devel = %{version} +Obsoletes: libShowMySky-Qt6-14-devel < %{version} -%description -n libShowMySky-Qt%{qtver}-%{sover}-devel +%description -n libShowMySky-Qt%{qtver}-devel This package contains the devel files for libShowMySky. %prep @@ -79,7 +83,7 @@ export LDFLAGS="$LDFLAGS -pie" %cmake \ -%if 0%{?suse_version} > 1550 +%if 0%{?suse_version} > 1590 -DQT_VERSION=6 \ %else -DQT_VERSION=5 \ @@ -145,12 +149,11 @@ %{_libdir}/libShowMySky-Qt%{qtver}.so.%{sover} %{_libdir}/libShowMySky-Qt%{qtver}.so.%{sover}.0.0 -%files -n libShowMySky-Qt%{qtver}-%{sover}-devel +%files -n libShowMySky-Qt%{qtver}-devel %{_libdir}/libShowMySky-Qt%{qtver}.so -%dir %{_libdir}/ShowMySky-Qt%{qtver} -%dir %{_libdir}/ShowMySky-Qt%{qtver}/cmake -%{_libdir}/ShowMySky-Qt%{qtver}/cmake/ShowMySky-Qt%{qtver}Config-relwithdebinfo.cmake -%{_libdir}/ShowMySky-Qt%{qtver}/cmake/ShowMySky-Qt%{qtver}Config.cmake +%dir %{_libdir}/cmake/ShowMySky-Qt%{qtver} +%{_libdir}/cmake/ShowMySky-Qt%{qtver}/ShowMySky-Qt%{qtver}Config-relwithdebinfo.cmake +%{_libdir}/cmake/ShowMySky-Qt%{qtver}/ShowMySky-Qt%{qtver}Config.cmake %files devel %dir %{_includedir}/ShowMySky ++++++ CalcMySky-0.2.1.tar.gz -> CalcMySky-0.3.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/CMakeLists.txt new/CalcMySky-0.3.0/CMakeLists.txt --- old/CalcMySky-0.2.1/CMakeLists.txt 2022-10-31 07:28:14.000000000 +0100 +++ new/CalcMySky-0.3.0/CMakeLists.txt 2023-03-28 21:00:36.000000000 +0200 @@ -3,7 +3,7 @@ cmake_policy(SET CMP0110 OLD) endif() -set(staticProjectVersion 0.2.1) +set(staticProjectVersion 0.3.0) project(CalcMySky VERSION ${staticProjectVersion} LANGUAGES CXX) set(CMAKE_FIND_USE_PACKAGE_REGISTRY false) @@ -111,7 +111,7 @@ # The first command is a dummy, it doesn't actually create its output: it's # only needed to force re-running of gen_version.cmake for the case when we've changed # the version but didn't touch other dependencies. -add_custom_command(OUTPUT "${PROJECT_BINARY_DIR}/check version update" COMMAND true) +add_custom_command(OUTPUT "${PROJECT_BINARY_DIR}/check version update" COMMAND $<IF:$<BOOL:${WIN32}>,echo.,true>) add_custom_command(OUTPUT "${PROJECT_BINARY_DIR}/version.cpp" DEPENDS "${PROJECT_BINARY_DIR}/check version update" WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/CalcMySky/util.cpp new/CalcMySky-0.3.0/CalcMySky/util.cpp --- old/CalcMySky-0.2.1/CalcMySky/util.cpp 2022-10-31 07:28:14.000000000 +0100 +++ new/CalcMySky-0.3.0/CalcMySky/util.cpp 2023-03-28 21:00:36.000000000 +0200 @@ -112,12 +112,12 @@ throw MustQuit{}; } + unsigned nanCount = 0; for(size_t i = 0; i < subpixelCount; ++i) { if(std::isnan(subpixels[i])) { - std::cerr << "NaN entries detected while saving " << name << "\n"; - throw MustQuit{}; + ++nanCount; } } std::vector<glm::vec4> dataToReturn; @@ -147,6 +147,12 @@ std::cerr << "failed to write file: " << out.errorString().toStdString() << "\n"; throw MustQuit{}; } + if(nanCount) + { + std::cerr << nanCount << " NaN entries out of " << subpixelCount << " detected while saving " << name << "\n"; + std::cerr << "The texture was saved for diagnostics, further computation is useless.\n"; + throw MustQuit{}; + } std::cerr << "done\n"; return dataToReturn; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/ShowMySky/AtmosphereRenderer.cpp new/CalcMySky-0.3.0/ShowMySky/AtmosphereRenderer.cpp --- old/CalcMySky-0.2.1/ShowMySky/AtmosphereRenderer.cpp 2022-10-31 07:28:14.000000000 +0100 +++ new/CalcMySky-0.3.0/ShowMySky/AtmosphereRenderer.cpp 2023-03-28 21:00:36.000000000 +0200 @@ -2147,6 +2147,61 @@ return totalLoadingStepsToDo_; } +void AtmosphereRenderer::setViewDirShaders(QByteArray viewDirVertShaderSrc, QByteArray viewDirFragShaderSrc, + std::vector<std::pair<std::string,GLuint>> viewDirBindAttribLocations) +{ + viewDirVertShaderSrc_ = viewDirVertShaderSrc; + viewDirFragShaderSrc_ = viewDirFragShaderSrc; + + std::unique_ptr<QOpenGLShader> newVertShader(new QOpenGLShader(QOpenGLShader::Vertex)); + std::unique_ptr<QOpenGLShader> newFragShader(new QOpenGLShader(QOpenGLShader::Fragment)); + + if(!newVertShader->compileSourceCode(viewDirVertShaderSrc_)) + throw DataLoadError{QObject::tr("Failed to compile view direction vertex shader:\n%2").arg(viewDirVertShader_->log())}; + if(!newFragShader->compileSourceCode(viewDirFragShaderSrc_)) + throw DataLoadError{QObject::tr("Failed to compile view direction fragment shader:\n%2").arg(viewDirFragShader_->log())}; + + const auto replaceShaders = [oldVert=viewDirVertShader_.get(), + oldFrag=viewDirFragShader_.get(), + newVert=newVertShader.get(), + newFrag=newFragShader.get()](QOpenGLShaderProgram& prog, QString const& name) + { + prog.removeShader(oldVert); + prog.removeShader(oldFrag); + prog.addShader(newVert); + prog.addShader(newFrag); + link(prog, name); + }; + + for(const auto& map : singleScatteringPrograms_) + for(auto& item : *map) + for(auto& prog : item.second) + replaceShaders(*prog, QObject::tr("single scattering shader program")); + + for(const auto& map : eclipsedSingleScatteringPrograms_) + for(auto& item : *map) + for(auto& prog : item.second) + replaceShaders(*prog, QObject::tr("eclipsed single scattering shader program")); + + for(const auto& prog : eclipsedDoubleScatteringPrecomputedPrograms_) + replaceShaders(*prog, QObject::tr("eclipsed double scattering shader program")); + for(const auto& prog : lightPollutionPrograms_) + replaceShaders(*prog, QObject::tr("light pollution shader program")); + for(const auto& prog : zeroOrderScatteringPrograms_) + replaceShaders(*prog, QObject::tr("zero-order scattering shader program")); + for(const auto& prog : eclipsedZeroOrderScatteringPrograms_) + replaceShaders(*prog, QObject::tr("eclipsed zero-order scattering shader program")); + for(const auto& prog : multipleScatteringPrograms_) + replaceShaders(*prog, QObject::tr("multiple scattering shader program")); + + replaceShaders(*viewDirectionGetterProgram_, QObject::tr("view direction getter shader program")); + + viewDirVertShader_ = std::move(newVertShader); + viewDirFragShader_ = std::move(newFragShader); + viewDirBindAttribLocations_ = std::move(viewDirBindAttribLocations); + +} + auto AtmosphereRenderer::stepDataLoading() -> LoadingStatus { OGL_TRACE(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/ShowMySky/AtmosphereRenderer.hpp new/CalcMySky-0.3.0/ShowMySky/AtmosphereRenderer.hpp --- old/CalcMySky-0.2.1/ShowMySky/AtmosphereRenderer.hpp 2022-10-31 07:28:14.000000000 +0100 +++ new/CalcMySky-0.3.0/ShowMySky/AtmosphereRenderer.hpp 2023-03-28 21:00:36.000000000 +0200 @@ -48,6 +48,8 @@ void setDrawSurfaceCallback(std::function<void(QOpenGLShaderProgram& shprog)> const& drawSurface) override; int initDataLoading(QByteArray viewDirVertShaderSrc, QByteArray viewDirFragShaderSrc, std::vector<std::pair<std::string,GLuint>> viewDirBindAttribLocations) override; + void setViewDirShaders(QByteArray viewDirVertShaderSrc, QByteArray viewDirFragShaderSrc, + std::vector<std::pair<std::string,GLuint>> viewDirBindAttribLocations) override; LoadingStatus stepDataLoading() override; int initPreparationToDraw() override; LoadingStatus stepPreparationToDraw() override; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/ShowMySky/CMakeLists.txt new/CalcMySky-0.3.0/ShowMySky/CMakeLists.txt --- old/CalcMySky-0.2.1/ShowMySky/CMakeLists.txt 2022-10-31 07:28:14.000000000 +0100 +++ new/CalcMySky-0.3.0/ShowMySky/CMakeLists.txt 2023-03-28 21:00:36.000000000 +0200 @@ -39,6 +39,7 @@ Manipulator.cpp RadiancePlot.cpp DockScrollArea.cpp + GLSLCosineQualityChecker.cpp ) target_link_libraries(${showmyskyTarget} PUBLIC Qt${QT_VERSION}::Core Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::OpenGL PRIVATE version common @@ -62,5 +63,5 @@ INCLUDES DESTINATION "${installIncDir}" ) export(TARGETS ShowMySky NAMESPACE ShowMySky:: FILE "${CMAKE_CURRENT_BINARY_DIR}/ShowMySky-Qt${QT_VERSION}Config.cmake") -install(EXPORT ShowMySky-Qt${QT_VERSION}Config NAMESPACE ShowMySky:: DESTINATION "${installConfDir}/ShowMySky-Qt${QT_VERSION}/cmake") +install(EXPORT ShowMySky-Qt${QT_VERSION}Config NAMESPACE ShowMySky:: DESTINATION "${installConfDir}/cmake/ShowMySky-Qt${QT_VERSION}") install(FILES api/ShowMySky/Exception.hpp api/ShowMySky/AtmosphereRenderer.hpp api/ShowMySky/Settings.hpp DESTINATION "${installIncDir}/ShowMySky") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/ShowMySky/GLSLCosineQualityChecker.cpp new/CalcMySky-0.3.0/ShowMySky/GLSLCosineQualityChecker.cpp --- old/CalcMySky-0.2.1/ShowMySky/GLSLCosineQualityChecker.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/CalcMySky-0.3.0/ShowMySky/GLSLCosineQualityChecker.cpp 2023-03-28 21:00:36.000000000 +0200 @@ -0,0 +1,150 @@ +#include "GLSLCosineQualityChecker.hpp" +#include <cmath> +#include <vector> +#include <cassert> +#include <iostream> +#include <QDebug> +#include <QOpenGLFunctions_3_3_Core> + +#include "util.hpp" + +void GLSLCosineQualityChecker::loadShaders() +{ + program = std::make_unique<QOpenGLShaderProgram>(); + addShaderCode(*program, QOpenGLShader::Vertex, + QObject::tr("GLSL cosine quality check vertex shader"), 1+R"( +#version 330 +in vec4 vertex; +void main() { gl_Position=vertex; } +)"); + + addShaderCode(*program, QOpenGLShader::Fragment, + QObject::tr("GLSL cosine quality check fragment shader"), 1+R"( +#version 330 + +out vec4 color; +uniform sampler1D xtex; + +void main() +{ + float texCoord = gl_FragCoord.x / textureSize(xtex,0); + float x = texture(xtex,texCoord).x; + color = vec4(cos(x),x,0,1); +} +)"); + link(*program, QObject::tr("GLSL cosine quality check shader program")); +} + +void GLSLCosineQualityChecker::setupBuffers() +{ + gl.glGenVertexArrays(1, &vao); + gl.glBindVertexArray(vao); + gl.glGenBuffers(1, &vbo); + gl.glBindBuffer(GL_ARRAY_BUFFER, vbo); + const GLfloat vertices[]= + { + -1, -1, + 1, -1, + -1, 1, + 1, 1, + }; + gl.glBufferData(GL_ARRAY_BUFFER, sizeof vertices, vertices, GL_STATIC_DRAW); + constexpr GLuint attribIndex=0; + constexpr int coordsPerVertex=2; + gl.glVertexAttribPointer(attribIndex, coordsPerVertex, GL_FLOAT, false, 0, 0); + gl.glEnableVertexAttribArray(attribIndex); + gl.glBindVertexArray(0); +} + +void GLSLCosineQualityChecker::setupRenderTarget(const int width, const int height) +{ + gl.glGenTextures(1, &texFBO); + gl.glGenFramebuffers(1,&fbo); + + gl.glBindTexture(GL_TEXTURE_2D,texFBO); + gl.glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,nullptr); + gl.glBindTexture(GL_TEXTURE_2D,0); + gl.glBindFramebuffer(GL_FRAMEBUFFER,fbo); + gl.glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,texFBO,0); + [[maybe_unused]] const auto status=gl.glCheckFramebufferStatus(GL_FRAMEBUFFER); + assert(status==GL_FRAMEBUFFER_COMPLETE); + +} + +void GLSLCosineQualityChecker::setupInputTextures(const int width, const int /*height*/) +{ + gl.glGenTextures(1, &inputTexture); + gl.glBindTexture(GL_TEXTURE_1D, inputTexture); + gl.glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + gl.glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + std::vector<GLfloat> data; + constexpr auto degree = M_PI/180; + for(int n = 0; n < width; ++n) + data.push_back(3*degree * n/(width-1.)); + gl.glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, data.size(), 0, GL_RED, GL_FLOAT, data.data()); +} + +GLSLCosineQualityChecker::GLSLCosineQualityChecker(QOpenGLFunctions_3_3_Core& gl) + : gl(gl) +{ + setupRenderTarget(width, height); + setupInputTextures(width, height); + loadShaders(); + setupBuffers(); +} + +bool GLSLCosineQualityChecker::isGood() +{ + gl.glBindFramebuffer(GL_FRAMEBUFFER,fbo); + gl.glViewport(0,0,width,height); + + program->bind(); + gl.glActiveTexture(GL_TEXTURE0); + gl.glBindTexture(GL_TEXTURE_1D, inputTexture); + program->setUniformValue("xtex",0); + + gl.glBindVertexArray(vao); + gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + gl.glBindVertexArray(0); + + gl.glBindTexture(GL_TEXTURE_1D, 0); + gl.glBindTexture(GL_TEXTURE_2D, 0); + program->release(); + gl.glBindFramebuffer(GL_FRAMEBUFFER,0); + + gl.glBindTexture(GL_TEXTURE_2D, texFBO); + + constexpr int numPoints = width*height; + std::vector<GLfloat> data(4*numPoints); + gl.glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, data.data()); + +#if 0 + std::cerr.precision(9); + std::cerr << "x/°,arccos(cos_{intel}(x)))\n"; + for(int i=0;i<numPoints;++i) + std::cerr << data[4*i+1]*180/M_PI << "," << 180/M_PI*std::acos(data[4*i+0]) << "\n"; +#endif + + float prevCos = data[0]; + for(int n=1; n<numPoints; ++n) + { + const auto currCos = data[4*n]; + if(currCos >= prevCos) + { + qWarning() << "WARNING: non-monotonic cosine detected in GLSL test, " + "results of computations might be unreliable"; + return false; + } + prevCos = currCos; + } + return true; +} + +GLSLCosineQualityChecker::~GLSLCosineQualityChecker() +{ + gl.glDeleteVertexArrays(1, &vao); + gl.glDeleteBuffers(1, &vbo); + gl.glDeleteTextures(1, &texFBO); + gl.glDeleteTextures(1, &inputTexture); + gl.glDeleteFramebuffers(1,&fbo); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/ShowMySky/GLSLCosineQualityChecker.hpp new/CalcMySky-0.3.0/ShowMySky/GLSLCosineQualityChecker.hpp --- old/CalcMySky-0.2.1/ShowMySky/GLSLCosineQualityChecker.hpp 1970-01-01 01:00:00.000000000 +0100 +++ new/CalcMySky-0.3.0/ShowMySky/GLSLCosineQualityChecker.hpp 2023-03-28 21:00:36.000000000 +0200 @@ -0,0 +1,29 @@ +#ifndef INCLUDE_ONCE_3D249CBD_E858_4DD8_B420_066C5821EF30 +#define INCLUDE_ONCE_3D249CBD_E858_4DD8_B420_066C5821EF30 + +#include <memory> +#include <QOpenGLShaderProgram> + +class QOpenGLFunctions_3_3_Core; +class GLSLCosineQualityChecker +{ + static constexpr int width = 128, height = 1; + + QOpenGLFunctions_3_3_Core& gl; + GLuint vao, vbo; + GLuint texFBO; + GLuint inputTexture; + std::unique_ptr<QOpenGLShaderProgram> program; + GLuint fbo; + + void loadShaders(); + void setupBuffers(); + void setupRenderTarget(int width, int height); + void setupInputTextures(int width, int height); +public: + GLSLCosineQualityChecker(QOpenGLFunctions_3_3_Core& gl); + bool isGood(); + ~GLSLCosineQualityChecker(); +}; + +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/ShowMySky/GLWidget.cpp new/CalcMySky-0.3.0/ShowMySky/GLWidget.cpp --- old/CalcMySky-0.2.1/ShowMySky/GLWidget.cpp 2022-10-31 07:28:14.000000000 +0100 +++ new/CalcMySky-0.3.0/ShowMySky/GLWidget.cpp 2023-03-28 21:00:36.000000000 +0200 @@ -11,6 +11,7 @@ #include "util.hpp" #include "ToolsWidget.hpp" #include "AtmosphereRenderer.hpp" +#include "GLSLCosineQualityChecker.hpp" #include "BlueNoiseTriangleRemapped.hpp" static QPoint position(QMouseEvent* event) @@ -158,7 +159,7 @@ { QLibrary showMySky(SHOWMYSKY_LIB_NAME, ShowMySky_ABI_version); if(!showMySky.load()) - throw DataLoadError(tr("Failed to load ShowMySky library")); + throw DataLoadError(tr("Failed to load ShowMySky library: %1").arg(showMySky.errorString())); const auto abi=reinterpret_cast<const quint32*>(showMySky.resolve("ShowMySky_ABI_version")); if(!abi) throw DataLoadError(tr("Failed to determine ABI version of ShowMySky library.")); @@ -207,6 +208,9 @@ makeGlareRenderTarget(); setupBuffers(); + GLSLCosineQualityChecker cosineChecker(*this); + const bool cosineIsOK = cosineChecker.isGood(); + luminanceToScreenRGB_=std::make_unique<QOpenGLShaderProgram>(); addShaderCode(*luminanceToScreenRGB_, QOpenGLShader::Fragment, tr("luminanceToScreenRGB fragment shader"), (1+R"( #version 330 @@ -421,7 +425,7 @@ gl_Position=vec4(position,1); } )"; - static constexpr const char* viewDirFragShaderSrc=1+R"( + QByteArray viewDirFragShaderSrc=1+R"( #version 330 in vec3 position; uniform float zoomFactor; @@ -435,6 +439,21 @@ #define PROJ_FISHEYE 2 const float PI=3.1415926535897932; + +#if COSINE_IS_BROKEN +// Define Chebyshoff approximations for sin and cos +float sin(float x) +{ + x = mod(x+PI, 2*PI)-PI; + return x*(0.999999599920672 + x*x*(-0.166665526354071 + x*x*(0.00833240298869917 + x*x*(-0.0001980863334175 + x*x*(2.69971463693744e-6 - 2.03622449118901e-8*x*x))))); +} +float cos(float x) +{ + x = mod(x+PI, 2*PI)-PI; + return 0.999999210782322 + x*x*(-0.499994213384716 + x*x*(0.0416597778065509 + x*x*(-0.00138587899196014 + x*x*(0.0000242029413673591 - 2.19729638194131e-7*x*x)))); +} +#endif + vec3 calcViewDir() { vec2 pos=position.xy/zoomFactor; @@ -467,6 +486,7 @@ return vec3(0); } )"; + viewDirFragShaderSrc.replace("COSINE_IS_BROKEN", cosineIsOK ? "0" : "1"); renderer->initDataLoading(viewDirVertShaderSrc, viewDirFragShaderSrc); stepDataLoading(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CalcMySky-0.2.1/ShowMySky/api/ShowMySky/AtmosphereRenderer.hpp new/CalcMySky-0.3.0/ShowMySky/api/ShowMySky/AtmosphereRenderer.hpp --- old/CalcMySky-0.2.1/ShowMySky/api/ShowMySky/AtmosphereRenderer.hpp 2022-10-31 07:28:14.000000000 +0100 +++ new/CalcMySky-0.3.0/ShowMySky/api/ShowMySky/AtmosphereRenderer.hpp 2023-03-28 21:00:36.000000000 +0200 @@ -97,6 +97,17 @@ virtual int initDataLoading(QByteArray viewDirVertShaderSrc, QByteArray viewDirFragShaderSrc, std::vector<std::pair<std::string,GLuint>> viewDirBindAttribLocations={}) = 0; /** + * \brief Replace the current view direction shaders with a new set. + * + * This method lets the user change the way view direction is computed (e.g. to switch projections). The new vertex and fragment shaders replace the old ones that initially are passed to #initDataLoading. This action may take some time because it causes relinking of all the shader programs in use. + * + * \param viewDirVertShaderSrc a vertex shader that will be used by all the shader programs that implement the atmosphere model; + * \param viewDirFragShaderSrc a fragment shader that implements \c calcViewDir function; + * \param viewDirBindAttribLocations locations of vertex attributes necessary to render the screen surface. Each \c pair consists of an attribute name and its location. + */ + virtual void setViewDirShaders(QByteArray viewDirVertShaderSrc, QByteArray viewDirFragShaderSrc, + std::vector<std::pair<std::string,GLuint>> viewDirBindAttribLocations={}) = 0; + /** * \brief Perform a single step of data loading. * * This method performs a single step of data loading. @@ -288,7 +299,7 @@ * * If the value of the symbol doesn't match the value of this constant, the library loaded is incompatible with the header against which the binary was compiled. Mixing incompatible header and library leads to undefined behavior. */ -#define ShowMySky_ABI_version 14 +#define ShowMySky_ABI_version 15 /** * \brief Name of library to be dlopen()-ed