#ifndef __PERFORMANCE_MATH_TEST_H__
#define __PERFORMANCE_MATH_TEST_H__

#include "PerformanceTest.h"

class PerformanceMathLayer : public PerformBasicLayer
{
public:
    PerformanceMathLayer(bool bControlMenuVisible, int nMaxCases = 0, int nCurCase = 0):
    PerformBasicLayer(bControlMenuVisible, nMaxCases, nCurCase)
    , _loopCount(1000)
    , _stepCount(500)
    , _profileName("")
    {
        
    }
    
    virtual void onEnter() override;
    virtual void restartCallback(Ref* sender) override;
    virtual void nextCallback(Ref* sender) override;
    virtual void backCallback(Ref* sender) override;
    
    virtual void showCurrentTest() {}
    
    virtual std::string title() const { return "Math Performance Test"; }
    virtual std::string subtitle() const { return "PerformanceMathLayer subTitle"; }
    
    void addLoopCount(Ref* sender);
    void subLoopCount(Ref* sender);
protected:
    virtual void doPerformanceTest(float dt) {};
    
    void dumpProfilerInfo(float dt);
    void updateLoopLabel();
protected:
    int _loopCount;
    int _stepCount;
    std::string _profileName;
};

class PerformanceMathLayer1 : public PerformanceMathLayer
{
public:
    PerformanceMathLayer1(bool bControlMenuVisible, int nMaxCases = 0, int nCurCase = 0):
    PerformanceMathLayer(bControlMenuVisible, nMaxCases, nCurCase)
    {
        _profileName = "profile_Mat4*Mat4";
    }
    
    virtual void doPerformanceTest(float dt) override;
    
    virtual std::string subtitle() const { return "Mat4 * Mat4"; }
private:
};

class PerformanceMathLayer2 : public PerformanceMathLayer
{
public:
    PerformanceMathLayer2(bool bControlMenuVisible, int nMaxCases = 0, int nCurCase = 0):
    PerformanceMathLayer(bControlMenuVisible, nMaxCases, nCurCase)
    {
        _profileName = "profile_MatTransformVec4";
    }
    
    virtual void doPerformanceTest(float dt) override;
    
    virtual std::string subtitle() const { return "Mat4 TransformVec4"; }
    
};

void runMathPerformanceTest();

#endif //__PERFORMANCE_MATH_TEST_H__