Skip to content

Build problems on macOS (with workaround) #2

@dreness

Description

@dreness

Hi! Cool project :) I had to overcome a few problems to build this in macOS 11.3 20E232, but since I don't really know what I'm doing with C++, I'm not sure how incorrect my workarounds are. That said, I still want to share my notes for anyone else who may be interested:

Adding an int parameter to EventCallbackMap is something I've also had to do in various other projects from johnBuffer. I don't really know why it's needed, although the problem was loosely described as 'non-portable usage' by some SO post.

diff --git a/include/event_manager.hpp b/include/event_manager.hpp
index 99c1bc9..383e4ff 100644
--- a/include/event_manager.hpp
+++ b/include/event_manager.hpp
@@ -11,7 +11,7 @@ namespace sfev
 using EventCallback = std::function<void(const sf::Event& event)>;
 
 template<typename T>
-using EventCallbackMap = std::unordered_map<T, EventCallback>;
+using EventCallbackMap = std::unordered_map<T, EventCallback, std::hash<int>>;
 
 
 /*
@@ -142,4 +142,4 @@ private:
        EventCallbackMap<sf::Event::EventType> m_events_callmap;
 };
 
-} // End namespace
\ No newline at end of file
+} // End namespace

I also ended up grabbing transition.hpp from one johnBuffer's other projects (FastTyper) after noticing that it includes this file as well, and builds without error.

diff --git a/include/transition.hpp b/include/transition.hpp
index cb6c15e..792697f 100644
--- a/include/transition.hpp
+++ b/include/transition.hpp
@@ -2,10 +2,8 @@
 #include <chrono>
 #include <cmath>
 
-float ratio(float t)
+namespace trn
 {
-	return 1.0f / (1.0f + std::expf(-(10.0f*t - 5.0f)));
-}
 
 template<typename T>
 class Transition
@@ -17,31 +15,39 @@ public:
 		: m_start_value()
 		, m_current_value()
 		, m_target_value()
+		, m_delta()
 		, m_start_time(std::chrono::steady_clock::now())
 		, m_speed(0.0f)
-		, m_delta(m_target_value - m_start_value)
-	{}
-
-	Transition(const T& value, float speed=1.0f)
-		: m_start_value(value),
-		, m_current_value(value),
-		, m_target_value(value),
-		, m_start_time(std::chrono::steady_clock::now()),
+	{
+		updateDelta();
+	}
+
+	Transition(const T& value, float speed = 1.0f)
+		: m_start_value(value)
+		, m_current_value(value)
+		, m_target_value(value)
+		, m_delta()
+		, m_last_access(std::chrono::steady_clock::now())
+		, m_start_time(std::chrono::steady_clock::now())
 		, m_speed(speed)
-		, m_delta(m_target_value - m_start_value)
-	{}
+	{
+		updateDelta();
+	}
 
 	template<typename... Args>
 	explicit Transition(Args&&... args)
 		: m_start_value(std::forward<Args>(args)...)
 		, m_current_value(m_start_value)
 		, m_target_value(m_start_value)
+		, m_last_access(std::chrono::steady_clock::now())
 		, m_start_time(std::chrono::steady_clock::now())
 		, m_speed(1.0f)
-		, m_delta(m_target_value - m_start_value)
-	{}
+		, m_delta()
+	{
+		updateDelta();
+	}
 
-	operator const T&()
+	operator const T&() const
 	{
 		autoUpdate();
 		return m_current_value;
@@ -49,10 +55,35 @@ public:
 
 	void operator=(const T& value)
 	{
-		m_start_value = m_current_value;
-		m_start_time = std::chrono::steady_clock::now();
 		m_target_value = value;
-		m_delta = m_target_value - m_start_value;
+		restart();
+	}
+
+	template<typename U>
+	void operator+=(const U& value)
+	{
+		m_target_value += value;
+		restart();
+	}
+
+	template<typename U>
+	void operator-=(const U& value)
+	{
+		m_target_value -= value;
+		restart();
+	}
+
+	template<typename U>
+	U as() const
+	{
+		return static_cast<U>(m_current_value);
+	}
+
+	void setValueInstant(const T& value)
+	{
+		m_current_value = value;
+		m_target_value = value;
+		updateDelta();
 	}
 
 	void setSpeed(float s)
@@ -60,21 +91,58 @@ public:
 		m_speed = s;
 	}
 
+	// Instantly moves the current_value to a new one
+	void setCurrentValue(const T& new_val)
+	{
+		m_current_value = new_val;
+		updateDelta();
+	}
+
 private:
 	T m_start_value;
 	T m_target_value;
 	T m_delta;
-	T m_current_value;
+	mutable ChronoPoint m_last_access;
+	mutable T m_current_value;
 
 	ChronoPoint m_start_time;
 	float m_speed;
 
-	void autoUpdate()
+	void autoUpdate() const
+	{
+		const ChronoPoint now(std::chrono::steady_clock::now());
+		const uint64_t dt(std::chrono::duration_cast<std::chrono::milliseconds>(now - m_last_access).count());
+
+		if (dt > 2)
+		{
+			m_last_access = now;
+			const uint32_t t(static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::milliseconds>(now - m_start_time).count()));
+			if (t > 1)
+			{
+				m_current_value = m_start_value + ratio(t * 0.001f * m_speed) * m_delta;
+			}
+		}
+	}
+
+	static float ratio(float t)
 	{
-		ChronoPoint now(std::chrono::steady_clock::now());
-		float t(static_cast<float>(std::chrono::duration_cast<std::chrono::milliseconds>(now - m_start_time).count()));
-		m_current_value = m_start_value + ratio(t * 0.001f * m_speed) * m_delta;
+		const float width(5.0f);
+		return 1.0f / (1.0f + std::expf(-(width*(2.0f*t - 1.0f))));
+	}
+
+	void restart()
+	{
+		m_start_value = m_current_value;
+		m_start_time = std::chrono::steady_clock::now();
+		updateDelta();
+	}
+
+	void updateDelta()
+	{
+		m_delta = m_target_value - m_start_value;
 	}
 };
 
 
+
+}
\ No newline at end of file

... and corresponding changes to main/src.cpp:

diff --git a/src/main.cpp b/src/main.cpp
index 61365b3..f3c721a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5,7 +5,7 @@
 #include "fourier_painter.hpp"
 #include <event_manager.hpp>
 #include <dynamic_blur.hpp>
-#include "transition.hpp"
+#include <transition.hpp>
 #include <sstream>
 
 template<typename T>
@@ -35,8 +35,8 @@ int main()
 	Signal2D signal;
 
 	FourierPainter painter(main_renderer, signal);
-	Transition<float> zoom(1.0f);
-	Transition<Point> focus(0.0f, 0.0f);
+    trn::Transition<float> zoom(1.0f);
+    trn::Transition<Point> focus(0.0f, 0.0f);
 
 	bool slow(false);
 	painter.setDt(0.016);

Finally, some coercion of CMake was needed. This is probably the most incorrect of these patches. I also set SFML_DIR in my shell environment prior to invoking cmake (in my case, export SFML_DIR=/opt/brew/Cellar/sfml/2.5.1)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e5cf9b6..4ed3acd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,23 +1,26 @@
 cmake_minimum_required(VERSION 3.5)
 project(Foucloids VERSION 1.0.0 LANGUAGES CXX)
 
-set(SFML_DIR "" CACHE PATH "SFML lib path")
-set(SFML_LIB_DIR "${SFML_DIR}/lib")
-set(SFML_INC_DIR "${SFML_DIR}/include")
+set(CMAKE_CXX_FLAGS "-std=c++11")
+
+# Detect and add SFML
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
+find_package(SFML 2 REQUIRED COMPONENTS network audio graphics window system)
 
 find_package(OpenGL)
 
-set(SFML_LIBS "${SFML_LIB_DIR}/sfml-graphics-s.lib"
-    "${SFML_LIB_DIR}/sfml-window-s.lib"
-    "${SFML_LIB_DIR}/sfml-system-s.lib"
-    "${SFML_LIB_DIR}/freetype.lib"
+set(SFML_LIBS "${SFML_LIB_DIR}/libsfml-graphics.2.5.1.dylib"
+    "${SFML_LIB_DIR}/libsfml-window.2.5.1.dylib"
+    "${SFML_LIB_DIR}/libsfml-system.2.5.1.dylib"
+    //"${SFML_LIB_DIR}/freetype.lib"
     "${OPENGL_LIBRARIES}"
     "winmm.lib"
 )
 
+
 set(SOURCES "src/main.cpp")
 
 add_executable(foucloids ${SOURCES})
 add_definitions(-DSFML_STATIC)
-target_include_directories(foucloids PRIVATE "${SFML_INC_DIR}" "include")
-target_link_libraries(foucloids ${SFML_LIBS})
\ No newline at end of file
+target_include_directories(foucloids PRIVATE "${SFML_INC_DIR}" "include" "lib")
+target_link_libraries(foucloids sfml-system sfml-window sfml-graphics)
\ No newline at end of file

To re-iterate, I don't think much of this (if any) should be taken as-is, but this "works for me" in macOS 11.3.

image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions