[dasher: 16/28] DemoFilter follows brachistochrone path with noise (from old DasherGameMode)



commit 174a01351d047cbe019b365ff4c7019ca29eed58
Author: Alan Lawrence <acl33 inf phy cam ac uk>
Date:   Thu Sep 8 09:25:25 2011 +0100

    DemoFilter follows brachistochrone path with noise (from old DasherGameMode)
    
    Reorganise startup - create alphabet before filter, then notify ControlMgr

 Src/DasherCore/ControlManager.cpp           |    2 +-
 Src/DasherCore/DashIntfScreenMsgs.cpp       |    2 +-
 Src/DasherCore/DasherInterfaceBase.cpp      |   14 ++-
 Src/DasherCore/DasherInterfaceBase.h        |    6 ++
 Src/DasherCore/DemoFilter.cpp               |  131 +++++++++++++++++++++++++++
 Src/DasherCore/DemoFilter.h                 |   29 ++++++
 Src/DasherCore/GameModule.h                 |    3 +-
 Src/DasherCore/Makefile.am                  |    2 +
 Src/DasherCore/OneButtonFilter.cpp          |    1 +
 Src/MacOSX/Dasher.xcodeproj/project.pbxproj |    8 ++
 Src/iPhone/Dasher.xcodeproj/project.pbxproj |    6 ++
 11 files changed, 197 insertions(+), 7 deletions(-)
---
diff --git a/Src/DasherCore/ControlManager.cpp b/Src/DasherCore/ControlManager.cpp
index 48cc5ae..d769333 100644
--- a/Src/DasherCore/ControlManager.cpp
+++ b/Src/DasherCore/ControlManager.cpp
@@ -403,7 +403,7 @@ void CControlManager::updateActions() {
   //filter is pauseable, and either 'stop' would do something (so pause is different),
   // or we're told to have a stop node but it would be indistinguishable from pause (=>have pause)
   CInputFilter *pInput(m_pInterface->GetActiveInputMethod());
-  if (pInput->supportsPause() && (m_pInterface->hasDone() || GetBoolParameter(BP_CONTROL_MODE_HAS_HALT)))
+  if (pInput && pInput->supportsPause() && (m_pInterface->hasDone() || GetBoolParameter(BP_CONTROL_MODE_HAS_HALT)))
     vRootSuccessors.push_back(m_pPause);
   if (it!=vOldRootSuccessors.end() && *it == m_pPause) it++;
 
diff --git a/Src/DasherCore/DashIntfScreenMsgs.cpp b/Src/DasherCore/DashIntfScreenMsgs.cpp
index 7ef8b30..4925cba 100644
--- a/Src/DasherCore/DashIntfScreenMsgs.cpp
+++ b/Src/DasherCore/DashIntfScreenMsgs.cpp
@@ -12,7 +12,7 @@ void CDashIntfScreenMsgs::Message(const string &strText, bool bInterrupt) {
   CDasherScreen::Label *lab = m_DasherScreen->MakeLabel(strText,GetLongParameter(LP_MESSAGE_FONTSIZE));
   if (bInterrupt) {
     m_dqModalMessages.push_back(pair<CDasherScreen::Label*,bool>(lab,false));
-    GetActiveInputMethod()->pause();
+    if (CInputFilter *fil=GetActiveInputMethod()) fil->pause();
   }
   else
     m_dqAsyncMessages.push_back(pair<CDasherScreen::Label*,unsigned long>(lab, 0));
diff --git a/Src/DasherCore/DasherInterfaceBase.cpp b/Src/DasherCore/DasherInterfaceBase.cpp
index e51e938..bb39fb9 100644
--- a/Src/DasherCore/DasherInterfaceBase.cpp
+++ b/Src/DasherCore/DasherInterfaceBase.cpp
@@ -44,7 +44,7 @@
 #include "ClickFilter.h"
 #include "CompassMode.h"
 #include "DefaultFilter.h"
-
+#include "DemoFilter.h"
 #include "OneButtonFilter.h"
 #include "OneButtonDynamicFilter.h"
 #include "OneDimensionalFilter.h"
@@ -157,12 +157,17 @@ void CDasherInterfaceBase::Realize(unsigned long ulTime) {
 
   CreateModules();
 
-  CreateInput();
-  CreateInputFilter();
-
   ChangeAlphabet(); // This creates the NodeCreationManager, the Alphabet,
   //and the tree of nodes in the model.
 
+  CreateInput();
+  CreateInputFilter();
+  //we may have created a control manager already; in which case, we need
+  // it to realize there's now an inputfilter (which may provide more actions).
+  // So tell it the setting has changed...
+  if (CControlManager *pCon = m_pNCManager->GetControlManager())
+    pCon->HandleEvent(SP_INPUT_FILTER);
+
   HandleEvent(LP_NODE_BUDGET);
 
   // FIXME - need to rationalise this sort of thing.
@@ -808,6 +813,7 @@ void CDasherInterfaceBase::CreateModules() {
   RegisterModule(new CAlternatingDirectMode(this, this));
   RegisterModule(new CCompassMode(this, this));
   RegisterModule(new CStylusFilter(this, this, m_pFramerate));
+  RegisterModule(new CDemoFilter(this, this, m_pFramerate));
 }
 
 void CDasherInterfaceBase::GetPermittedValues(int iParameter, std::vector<std::string> &vList) {
diff --git a/Src/DasherCore/DasherInterfaceBase.h b/Src/DasherCore/DasherInterfaceBase.h
index 0a88681..671e201 100644
--- a/Src/DasherCore/DasherInterfaceBase.h
+++ b/Src/DasherCore/DasherInterfaceBase.h
@@ -360,6 +360,12 @@ public:
   ///
   virtual int GetFileSize(const std::string &strFileName) = 0;
 
+  ///Gets a pointer to the game module. Will return null if game mode
+  /// is not on.
+  CGameModule *GetGameModule() {
+    return m_pGameModule;
+  }
+
 protected:
 
   /// @name Startup
diff --git a/Src/DasherCore/DemoFilter.cpp b/Src/DasherCore/DemoFilter.cpp
new file mode 100644
index 0000000..d1d5e96
--- /dev/null
+++ b/Src/DasherCore/DemoFilter.cpp
@@ -0,0 +1,131 @@
+#include "../Common/Common.h"
+#include "DemoFilter.h"
+#include "DasherInterfaceBase.h"
+#include "Event.h"
+
+#include "CircleStartHandler.h"
+#include "TwoBoxStartHandler.h"
+#include "GameModule.h"
+
+#include <iostream>
+
+using namespace Dasher;
+
+CDemoFilter::CDemoFilter(CSettingsUser *pCreator, CDasherInterfaceBase *pInterface, CFrameRate *pFramerate)
+  : CDynamicFilter(pCreator, pInterface, pFramerate, 19, _("Demo Mode (no input)")),
+m_dNoiseX(0.0), m_dNoiseY(0.0), m_iDemoX(0), m_iDemoY(0) {
+
+}
+
+CDemoFilter::~CDemoFilter() {
+}
+
+bool CDemoFilter::DecorateView(CDasherView *pView, CDasherInput *pInput) {
+
+  if(GetBoolParameter(BP_DRAW_MOUSE)) {
+    pView->DasherDrawCentredRectangle(m_iDemoX, m_iDemoY, 5, 2, false);
+  }
+
+  myint x[2];
+  myint y[2];
+  
+  // Start of line is the crosshair location
+  
+  x[0] = CDasherModel::ORIGIN_X;
+  y[0] = CDasherModel::ORIGIN_Y;
+  
+  x[1] = m_iDemoX; y[1] = m_iDemoY;
+  
+  // Actually plot the line
+  if (GetBoolParameter(BP_CURVE_MOUSE_LINE))
+    pView->DasherSpaceLine(x[0],y[0],x[1],y[1], GetLongParameter(LP_LINE_WIDTH), 1);
+  else
+    pView->DasherPolyline(x, y, 2, GetLongParameter(LP_LINE_WIDTH), 1);
+  
+  return true;
+}
+
+void CDemoFilter::Activate() {
+  SetBoolParameter(BP_GAME_MODE, true);
+  HandleEvent(LP_FRAMERATE); //just to make sure!
+}
+
+void CDemoFilter::Deactivate() {
+  SetBoolParameter(BP_GAME_MODE, false);
+}
+
+std::pair<double,double> GaussianRand() // Is there a random number class already?
+{
+  double u1 = (double(rand())+1)/(double(RAND_MAX)+1.0);
+  double u2 = (double(rand())+1)/(double(RAND_MAX)+1.0);
+  double g1 = sqrt(-2.0*log(u1))*cos(6.283185307*u2);
+  double g2 = sqrt(-2.0*log(u1))*sin(6.283185307*u2);
+  //  std::cout << u1 << " : " << u2 << " : " << g1 << std::endl;
+  return std::pair<double,double>(g1,g2);
+}
+
+void CDemoFilter::Timer(unsigned long Time, CDasherView *m_pDasherView, CDasherInput *pInput, CDasherModel *m_pDasherModel, CExpansionPolicy **pol) {
+  if (isPaused()) return;
+  CGameModule *mod = (CGameModule *)m_pInterface->GetGameModule();
+  const myint iTargetY(mod->m_iTargetY);
+  myint iCenterY = mod->ComputeBrachCenter();
+
+  // ...and now calculate the ideal direction...
+  double iIdealUnitVec[2];  
+  
+  iIdealUnitVec[0] = double(CDasherModel::ORIGIN_Y<iTargetY?(iCenterY-CDasherModel::ORIGIN_Y):(CDasherModel::ORIGIN_Y-iCenterY));
+  iIdealUnitVec[1] = double(CDasherModel::ORIGIN_Y<iTargetY ? CDasherModel::ORIGIN_X : -CDasherModel::ORIGIN_X);
+  double mag = sqrt((double)(iIdealUnitVec[0]*iIdealUnitVec[0]+iIdealUnitVec[1]*iIdealUnitVec[1]));
+  iIdealUnitVec[0] = iIdealUnitVec[0]/mag;
+  iIdealUnitVec[1] = iIdealUnitVec[1]/mag;
+  
+  // ...and then modify for realism... 
+  // ...by adding noise...
+  std::pair<double,double> noise = GaussianRand();
+  m_dNoiseX = m_dNoiseOld*m_dNoiseX + m_dNoiseNew*noise.first;
+  m_dNoiseY = m_dNoiseOld*m_dNoiseY + m_dNoiseNew*noise.second;
+  
+  // ...and springy behaviour...
+  //if(!m_bSentenceFinished) {
+    const myint iNoiseMag(GetLongParameter(LP_DEMO_NOISE_MAG));
+    m_iDemoX = myint((CDasherModel::ORIGIN_X+(1500*iIdealUnitVec[0])+iNoiseMag*m_dNoiseX)*m_dSpring
+                     +(1.0-m_dSpring)*m_iDemoX);
+    m_iDemoY = myint((CDasherModel::ORIGIN_Y+(1500*iIdealUnitVec[1])+iNoiseMag*m_dNoiseY)*m_dSpring
+                     +(1.0-m_dSpring)*m_iDemoY);
+  //} else {
+  //  m_iDemoX = myint(ORIGIN_X*m_DemoCfg.dSpring + (1.0-m_DemoCfg.dSpring)*m_iDemoX);
+  //  m_iDemoY = myint(ORIGIN_Y*m_DemoCfg.dSpring + (1.0-m_DemoCfg.dSpring)*m_iDemoY);
+  //}
+  
+  // ...and finally set the mouse coordinates.
+
+  OneStepTowards(m_pDasherModel, m_iDemoX, m_iDemoY, Time, 1.0);
+}
+
+void CDemoFilter::KeyDown(unsigned long iTime, int iId, CDasherView *pDasherView, CDasherInput *pInput, CDasherModel *pModel) {
+  
+  if ((iId==0 && GetBoolParameter(BP_START_SPACE))
+      || (iId==100 && GetBoolParameter(BP_START_MOUSE))) {
+    if(isPaused())
+      run(iTime);
+    else
+      pause();
+  }
+}
+
+void CDemoFilter::HandleEvent(int iParameter) {
+    switch (iParameter) {
+      case LP_DEMO_SPRING:
+      case LP_DEMO_NOISE_MEM:
+      case LP_MAX_BITRATE:
+      case LP_FRAMERATE:
+        // Recalculates the parameters used in the demo following a change in framerate or speed.
+        double spring = GetLongParameter(LP_DEMO_SPRING)/100.0;
+        double noisemem = GetLongParameter(LP_DEMO_NOISE_MEM)/100.0;
+        double lambda = 0.7*GetLongParameter(LP_MAX_BITRATE)/(double)GetLongParameter(LP_FRAMERATE);
+        
+        m_dSpring = (1-exp(-spring*lambda));
+        m_dNoiseNew = noisemem*(1-exp(-lambda));
+        m_dNoiseOld = sqrt(1.0-m_dNoiseNew*m_dNoiseNew);
+    }
+}
diff --git a/Src/DasherCore/DemoFilter.h b/Src/DasherCore/DemoFilter.h
new file mode 100644
index 0000000..ea8375a
--- /dev/null
+++ b/Src/DasherCore/DemoFilter.h
@@ -0,0 +1,29 @@
+#ifndef __DEMO_FILTER_H__
+#define __DEMO_FILTER_H__
+
+#include "DynamicFilter.h"
+
+namespace Dasher {
+/// \ingroup InputFilter
+/// @{
+class CDemoFilter : public CDynamicFilter {
+ public:
+  CDemoFilter(CSettingsUser *pCreator, CDasherInterfaceBase *pInterface, CFrameRate *pFramerate);
+  ~CDemoFilter();
+
+  virtual void HandleEvent(int iParameter);
+
+  virtual bool DecorateView(CDasherView *pView, CDasherInput *pInput);
+  virtual void Timer(unsigned long Time, CDasherView *m_pDasherView, CDasherInput *pInput, CDasherModel *m_pDasherModel, CExpansionPolicy **pol);
+  virtual void KeyDown(unsigned long iTime, int iId, CDasherView *pDasherView, CDasherInput *pInput, CDasherModel *pModel);
+  virtual void Activate();
+  virtual void Deactivate();
+ private:
+  double m_dSpring, m_dNoiseNew, m_dNoiseOld;
+  double m_dNoiseX, m_dNoiseY;
+  myint m_iDemoX, m_iDemoY;
+};
+}
+/// @}
+
+#endif
diff --git a/Src/DasherCore/GameModule.h b/Src/DasherCore/GameModule.h
index 8549cc3..6e6dda1 100644
--- a/Src/DasherCore/GameModule.h
+++ b/Src/DasherCore/GameModule.h
@@ -16,7 +16,7 @@ using namespace std;
 #include "DasherTypes.h"
 #include "DasherInterfaceBase.h"
 #include "WordGeneratorBase.h"
-
+#include "DemoFilter.h"
 
 namespace Dasher {
 
@@ -34,6 +34,7 @@ namespace Dasher {
  */
 class CGameModule : protected CSettingsUser, protected TransientObserver<const CEditEvent *>, protected TransientObserver<CGameNodeDrawEvent*>, private TransientObserver<CDasherNode*>, private TransientObserver<CDasherView*> {
  public:
+  friend class CDemoFilter;
   /**
    * Constructor
    * @param pEventHandler A pointer to the event handler
diff --git a/Src/DasherCore/Makefile.am b/Src/DasherCore/Makefile.am
index 2b33044..f65426c 100644
--- a/Src/DasherCore/Makefile.am
+++ b/Src/DasherCore/Makefile.am
@@ -68,6 +68,8 @@ libdashercore_a_SOURCES = \
 		DasherViewSquare.inl \
 		DefaultFilter.cpp \
 		DefaultFilter.h \
+		DemoFilter.cpp \
+		DemoFilter.h \
 		DynamicButtons.cpp \
 		DynamicButtons.h \
 		DynamicFilter.cpp \
diff --git a/Src/DasherCore/OneButtonFilter.cpp b/Src/DasherCore/OneButtonFilter.cpp
index c09291b..7b728e3 100644
--- a/Src/DasherCore/OneButtonFilter.cpp
+++ b/Src/DasherCore/OneButtonFilter.cpp
@@ -4,6 +4,7 @@
 #include "OneButtonFilter.h"
 #include "Event.h"
 #include "DasherScreen.h"
+#include "DasherModel.h"
 
 using namespace Dasher;
 
diff --git a/Src/MacOSX/Dasher.xcodeproj/project.pbxproj b/Src/MacOSX/Dasher.xcodeproj/project.pbxproj
index 6592b6b..4155ef4 100755
--- a/Src/MacOSX/Dasher.xcodeproj/project.pbxproj
+++ b/Src/MacOSX/Dasher.xcodeproj/project.pbxproj
@@ -324,6 +324,8 @@
 		33135356102C6D8E00E28220 /* ButtonMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3313534E102C6D8E00E28220 /* ButtonMode.h */; };
 		3335F60013AB50E9004F9371 /* DashIntfSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3335F5FE13AB50E9004F9371 /* DashIntfSettings.cpp */; };
 		3335F60113AB50E9004F9371 /* DashIntfSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 3335F5FF13AB50E9004F9371 /* DashIntfSettings.h */; };
+		333B409412088AFA00235721 /* DemoFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 333B409212088AFA00235721 /* DemoFilter.cpp */; };
+		333B409512088AFA00235721 /* DemoFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 333B409312088AFA00235721 /* DemoFilter.h */; };
 		3344F0691341297F001FACAB /* UserLogBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3344F0681341297F001FACAB /* UserLogBase.cpp */; };
 		334DE238135E3E68007C8D6D /* control.textlabels.xml in Resources */ = {isa = PBXBuildFile; fileRef = 334DE236135E3E68007C8D6D /* control.textlabels.xml */; };
 		334DE239135E3E68007C8D6D /* control.xml in Resources */ = {isa = PBXBuildFile; fileRef = 334DE237135E3E68007C8D6D /* control.xml */; };
@@ -728,6 +730,8 @@
 		3313534E102C6D8E00E28220 /* ButtonMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ButtonMode.h; sourceTree = "<group>"; };
 		3335F5FE13AB50E9004F9371 /* DashIntfSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DashIntfSettings.cpp; sourceTree = "<group>"; };
 		3335F5FF13AB50E9004F9371 /* DashIntfSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DashIntfSettings.h; sourceTree = "<group>"; };
+		333B409212088AFA00235721 /* DemoFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DemoFilter.cpp; sourceTree = "<group>"; };
+		333B409312088AFA00235721 /* DemoFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoFilter.h; sourceTree = "<group>"; };
 		3344F0681341297F001FACAB /* UserLogBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserLogBase.cpp; sourceTree = "<group>"; };
 		334DE236135E3E68007C8D6D /* control.textlabels.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = control.textlabels.xml; sourceTree = "<group>"; };
 		334DE237135E3E68007C8D6D /* control.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = control.xml; sourceTree = "<group>"; };
@@ -955,6 +959,8 @@
 				1948BE3C0C226CFD001DFA32 /* DefaultFilter.h */,
 				33DDB9DE13B8AF360001C52D /* DynamicButtons.cpp */,
 				33DDB9DF13B8AF360001C52D /* DynamicButtons.h */,
+				333B409212088AFA00235721 /* DemoFilter.cpp */,
+				333B409312088AFA00235721 /* DemoFilter.h */,
 				3300115010A2EA7700D31B1D /* ExpansionPolicy.cpp */,
 				3300115110A2EA7700D31B1D /* ExpansionPolicy.h */,
 				1948BE3E0C226CFD001DFA32 /* DynamicFilter.cpp */,
@@ -1460,6 +1466,7 @@
 				33FC1D2C13ACE7E7007642CD /* ScreenGameModule.h in Headers */,
 				33C3BDD213854CC000C768E0 /* DasherTextView.h in Headers */,
 				33DDB9E113B8AF360001C52D /* DynamicButtons.h in Headers */,
+				333B409512088AFA00235721 /* DemoFilter.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1816,6 +1823,7 @@
 				33FC1D2B13ACE7E7007642CD /* ScreenGameModule.cpp in Sources */,
 				33C3BDD313854CC000C768E0 /* DasherTextView.mm in Sources */,
 				33DDB9E013B8AF360001C52D /* DynamicButtons.cpp in Sources */,
+				333B409412088AFA00235721 /* DemoFilter.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/Src/iPhone/Dasher.xcodeproj/project.pbxproj b/Src/iPhone/Dasher.xcodeproj/project.pbxproj
index ca50947..733f194 100755
--- a/Src/iPhone/Dasher.xcodeproj/project.pbxproj
+++ b/Src/iPhone/Dasher.xcodeproj/project.pbxproj
@@ -249,6 +249,7 @@
 		3378A23F1335425300A96C5D /* AbstractXMLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3378A23D1335425200A96C5D /* AbstractXMLParser.cpp */; };
 		3378A267133543B800A96C5D /* control.xml in Resources */ = {isa = PBXBuildFile; fileRef = 3378A266133543B800A96C5D /* control.xml */; };
 		337ECC1B10DD5E0700D0C6A5 /* ExpansionPolicy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 337ECC1910DD5E0700D0C6A5 /* ExpansionPolicy.cpp */; };
+		338B38FF1432071C0023A224 /* DemoFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 338B38FD1432071C0023A224 /* DemoFilter.cpp */; };
 		339E340E13C6206E007A2BCC /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 339E340D13C6206E007A2BCC /* Default.png */; };
 		339F8A330FF5088000282847 /* CalibrationController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 339F8A320FF5088000282847 /* CalibrationController.mm */; };
 		33B3430813A8A927009AE0D5 /* DashIntfScreenMsgs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 33B3430613A8A927009AE0D5 /* DashIntfScreenMsgs.cpp */; };
@@ -693,6 +694,8 @@
 		3378A266133543B800A96C5D /* control.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; name = control.xml; path = ../../Data/control/control.xml; sourceTree = SOURCE_ROOT; };
 		337ECC1910DD5E0700D0C6A5 /* ExpansionPolicy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExpansionPolicy.cpp; sourceTree = "<group>"; };
 		337ECC1A10DD5E0700D0C6A5 /* ExpansionPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExpansionPolicy.h; sourceTree = "<group>"; };
+		338B38FD1432071C0023A224 /* DemoFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DemoFilter.cpp; sourceTree = "<group>"; };
+		338B38FE1432071C0023A224 /* DemoFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoFilter.h; sourceTree = "<group>"; };
 		339E340D13C6206E007A2BCC /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
 		339F8A310FF5088000282847 /* CalibrationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CalibrationController.h; sourceTree = "<group>"; };
 		339F8A320FF5088000282847 /* CalibrationController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CalibrationController.mm; sourceTree = "<group>"; };
@@ -1216,6 +1219,8 @@
 				3344FDAB0F71717C00506EAA /* DasherViewSquare.inl */,
 				3344FDAC0F71717C00506EAA /* DefaultFilter.cpp */,
 				3344FDAD0F71717C00506EAA /* DefaultFilter.h */,
+				338B38FD1432071C0023A224 /* DemoFilter.cpp */,
+				338B38FE1432071C0023A224 /* DemoFilter.h */,
 				33B6824E13CA4CC200F0A952 /* DynamicButtons.cpp */,
 				33B6824F13CA4CC200F0A952 /* DynamicButtons.h */,
 				3344FDAF0F71717C00506EAA /* DynamicFilter.cpp */,
@@ -1723,6 +1728,7 @@
 				33DFE416137AA32300F86CDE /* WordGeneratorBase.cpp in Sources */,
 				3360335813ABDF3700417DFE /* ScreenGameModule.cpp in Sources */,
 				33B6825013CA4CC300F0A952 /* DynamicButtons.cpp in Sources */,
+				338B38FF1432071C0023A224 /* DemoFilter.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]