From 7e4a1736e84c8972f110a179ec35ba2b7f86cf65 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= <tseeker@nocternity.net>
Date: Mon, 30 Oct 2017 22:32:28 +0100
Subject: [PATCH] Tested curves using dof:sharp-distance (also fixed a bug)

---
 demo.cc | 34 ++++++++++++++++++++++++++++++++--
 sync.cc | 27 +++++++++++++++++++++++----
 sync.hh |  8 +++++++-
 3 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/demo.cc b/demo.cc
index 6b45eb5..880d9bb 100644
--- a/demo.cc
+++ b/demo.cc
@@ -25,11 +25,41 @@ bool T_Demo::initialise( )
 
 	Globals::Sync( ).clearInputs( );
 	Globals::Sync( ).addInput( "dof:sharp-distance" , 15 );
-	Globals::Sync( ).addInput( "dof:sharp-range" , 25 );
-	Globals::Sync( ).addInput( "dof:falloff" , 100 );
+	Globals::Sync( ).addInput( "dof:sharp-range" , 5 );
+	Globals::Sync( ).addInput( "dof:falloff" , 10 );
 	Globals::Sync( ).addInput( "dof:max-blur" , 16 );
 	Globals::Sync( ).addInput( "dof:samples" , 16 );
 
+	// XXX test curve
+	{
+		T_SyncCurve curve;
+		curve.name = "dof:sharp-distance";
+		{
+			T_SyncSegment seg;
+			seg.nPoints = 4;
+			seg.type = T_SyncSegment::SMOOTH;
+			seg.durations.push_back( 300 );
+			seg.durations.push_back( 300 );
+			seg.durations.push_back( 300 );
+			seg.values.push_back( 15 );
+			seg.values.push_back( 30 );
+			seg.values.push_back( 15 );
+			seg.values.push_back( 15 );
+			curve.segments.emplace_back( std::move( seg ) );
+		}
+		{
+			T_SyncSegment seg;
+			seg.nPoints = 2;
+			seg.type = T_SyncSegment::LINEAR;
+			seg.durations.push_back( 600 );
+			seg.values.push_back( 100 );
+			seg.values.push_back( 20 );
+			curve.segments.emplace_back( std::move( seg ) );
+		}
+		Globals::Sync( ).setCurve( std::move( curve ) );
+	}
+	Globals::Sync( ).updateCurveCaches( );
+
 	return true;
 }
 
diff --git a/sync.cc b/sync.cc
index 48717d9..a27cec3 100644
--- a/sync.cc
+++ b/sync.cc
@@ -22,15 +22,15 @@ void T_SyncCurves::clear( )
 	positions.clear( );
 }
 
-bool T_SyncCurves::addCurve( __rd__ T_SyncCurve curve )
+void T_SyncCurves::setCurve( __rd__ T_SyncCurve curve )
 {
 	const auto p( positions.find( curve.name ) );
 	if ( p == positions.end( ) ) {
 		positions.emplace( curve.name , curves.size( ) );
 		curves.emplace_back( std::move( curve ) );
-		return true;
+	} else {
+		curves[ p->second ] = std::move( curve );
 	}
-	return false;
 }
 
 int32_t T_SyncCurves::indexOf( __rd__ std::string const& name )
@@ -137,7 +137,7 @@ float T_SyncCurveCache::segmentValue(
 	}
 
 	auto const& idxp( segRefs[ segIndex ] );
-	auto const& seg( segments[ idxp.second ] );
+	auto const& seg( segments[ idxp.first ] );
 
 	// Interpolation factor
 	const float st( segStarts[ segIndex ] );
@@ -154,6 +154,10 @@ float T_SyncCurveCache::segmentValue(
 	const auto pid( idxp.second );
 	const float sv( seg.values[ pid ] );
 	const float ev( seg.values[ pid + 1 ] );
+#if 0
+	printf( "[%.2f] gidx %d - seg %d idx %d - %f\n" , time , segIndex ,
+			idxp.first , idxp.second , v * ( ev - sv ) + sv );
+#endif
 	return v * ( ev - sv ) + sv;
 }
 
@@ -224,6 +228,21 @@ void T_SyncManager::setTime(
 
 /*----------------------------------------------------------------------------*/
 
+void T_SyncManager::clearCurves( )
+{
+	curves_.clear( );
+	updateCurveCaches( );
+}
+
+void T_SyncManager::setCurve(
+		__rd__ T_SyncCurve curve )
+{
+	curves_.setCurve( curve );
+	updateCurveCaches( );
+}
+
+/*----------------------------------------------------------------------------*/
+
 void T_SyncManager::updateCurveCaches( )
 {
 	curveCaches_.clear( );
diff --git a/sync.hh b/sync.hh
index ab2fd18..6e4c76b 100644
--- a/sync.hh
+++ b/sync.hh
@@ -61,7 +61,7 @@ struct T_SyncCurves
 	void clear( );
 
 	// Returns true on success, false on duplicate
-	bool addCurve( __rd__ T_SyncCurve curve );
+	void setCurve( __rd__ T_SyncCurve curve );
 
 	// Returns -1 on lookup failure
 	int32_t indexOf( __rd__ std::string const& name );
@@ -171,6 +171,12 @@ struct T_SyncManager
 	std::vector< float > const& inputs( ) const noexcept
 		{ return values_.values; }
 
+	// ---------------------------------------------------------------------
+	// Curves
+
+	void clearCurves( );
+	void setCurve( __rd__ T_SyncCurve curve );
+
 	// ---------------------------------------------------------------------
 
 	void updateCurveCaches( );