int ObjMerger::init(const MergerParamT &param)
{
	clearUp();
	this->param = param;

	rect_groups = new RectGroupT[MAX_RECT_NUM];
	return 1;
}
int Game::run() {
    // Delta time per frames
    sf::Clock clock;
    sf::Time elapsedTime;
    sf::Time deltaTime = sf::Time::Zero;
    // FPS counter
    int framesPerTime = 0;
    sf::Int64 renderTime = 0;

    // Game loop
    while (window.isOpen() && !shouldExit) {
        // Delta time per frames
        elapsedTime = clock.restart();
        deltaTime += elapsedTime;

        // Updating game states
        while (deltaTime > TimePerFrame) {
            deltaTime -= TimePerFrame;
            processEvent();
            update(TimePerFrame);
        }

        // FPS Counter
        renderTime += elapsedTime.asMicroseconds();
        framesPerTime++;
        if (renderTime > 1000000 && framesPerTime > 0) {
            sf::Uint64 fps = (sf::Uint64) (framesPerTime) * 1000000 / renderTime;
            if (fps >= 60)
                fpsCounter.setColor(sf::Color::White);
            else if (fps >= 24)
                fpsCounter.setColor(sf::Color::Yellow);
            else
                fpsCounter.setColor(sf::Color::Red);
            fpsCounter.setString(std::to_string(fps));
            framesPerTime = 0;
            renderTime = 0;
        }

        // Rendering
        render();
    }

    clearUp();

    return exitCode;
}
int HaarFeature::init(int w, int h, int type, int is_abs)
{
	clearUp();

	feature_types = type;
	this->is_abs = is_abs;

	template_w = w;
	template_h = h;

	intg.init(w, h, type);

	feature_num = getAllFeatureInfos(-1);

	pt_features = new float[feature_num];
	pt_feature_infos = new HaarFeatureInfoT[feature_num];
	
	getAllFeatureInfos(0);

	return 1;
}
void Game::exit() {
    exitCode = EXIT_FAILURE;
    shouldExit = true;
    clearUp();
}
HaarFeature::~HaarFeature(void)
{
	clearUp();
}