Foucloids icon indicating copy to clipboard operation
Foucloids copied to clipboard

Build problems on macOS (with workaround)

Open dreness opened this issue 4 years ago • 1 comments

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

dreness avatar May 02 '21 18:05 dreness

Hi, I needed a little bit of your help, I am using Ubuntu and I used the install.sh script to create executable files this is that same script the one in the AntSimulator repository but it is giving an error while compiling [ 50%] Building CXX object CMakeFiles/foucloids.dir/src/main.cpp.o /home/harshal/harshal/fun_github_repos/Foucloids/src/main.cpp:7:10: fatal error: dynamic_blur.hpp: No such file or directory 7 | #include <dynamic_blur.hpp> | ^~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [CMakeFiles/foucloids.dir/build.make:82: CMakeFiles/foucloids.dir/src/main.cpp.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:95: CMakeFiles/foucloids.dir/all] Error 2 make: *** [Makefile:103: all] Error 2 your help will be appreciated, Thankx

HarshalRathore avatar Sep 11 '21 12:09 HarshalRathore