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

Reply via email to