bool TweenEx::init(Composite& rootNode) {
	TextLabelPtr label = MakeTextLabel("Hello There!", CoordPercent(0.5f, 0.9f), CoordPX(100, 30), FontType::Normal, UnitPT(16.0f),RGBA(255, 255, 255, 255), HorizontalAlignment::Center,VerticalAlignment::Bottom);
	label->setOrigin(Origin::MiddleCenter);
	std::shared_ptr<ImageGlyph> img = createImageGlyph(getFullPath("images/sfmarket.png"));
	GlyphRegionPtr imgr = MakeGlyphRegion(img, CoordPercent(0.5f, 0.45f),CoordPX(100,300), AspectRule::FixedHeight, Color(32, 64, 128, 255),Color(128, 128, 128, 128), Color(200, 200, 200, 255), UnitPX(1.0f));
	GlyphRegionPtr iconr = MakeGlyphRegion(createAwesomeGlyph(0xf1b3),CoordPX(20, 20), CoordPX(50, 50), Color(32, 64, 128, 255),Color(255, 255, 255, 255));
	imgr->setOrigin(Origin::MiddleCenter);
	addTween(imgr->foregroundColor, Color(128, 128, 128, 255),Color(128, 128, 128, 0), 3.0, SineOut());
	addTween(imgr->dimensions, CoordPX(50, 50), CoordPX(300, 300), 1.0, SineOut());
	addTween(iconr->backgroundColor, Color(255, 64, 32, 255),Color(32, 64, 255, 255), 3.0, SineIn());
	addTween(iconr->foregroundColor, Color(0, 0, 0, 255),Color(255, 255, 255, 255), 3.0, SineIn());
	addTween(iconr->position, CoordPX(100, 10), CoordPerPX(0.5f,0.0f,-25.0f, 10.0f), 3.0, ExponentialOut());
	addTween(label->position, CoordPercent(0.5f, 0.7f), CoordPercent(0.5f, 0.9f), 1.0f, ExponentialOut())->addCompleteEvent([=](Tweenable* tween) {
		addTween(label->fontSize, UnitPT(16.0f), UnitPT(36.0f), 1.0f, ExponentialIn())->addCompleteEvent(
			[=](Tweenable* object) {
			label->setLabel( "Did you like that tween?");
		});
	});
	
	rootNode.add(label);
	rootNode.add(iconr);
	rootNode.add(imgr);
	return true;
}
void Application::run(int swapInterval) {
    const double POLL_INTERVAL_SEC = 0.5f;

    context->makeCurrent();
    if (!init(rootRegion)) {
        throw std::runtime_error("Error occurred in application init()");
    }
    rootRegion.add(getContext()->getGlassPane());
    if (showDebugIcon) {
        GlyphRegionPtr debug = MakeGlyphRegion(
                                   createAwesomeGlyph(0xf188, FontStyle::Outline, 20),
                                   CoordPercent(1.0f, 1.0f), CoordPX(20, 20), RGBA(0, 0, 0, 0),
                                   RGBA(64, 64, 64, 128), RGBA(192, 192, 192, 128), UnitPX(0));

        debug->setOrigin(Origin::BottomRight);
        debug->onMouseDown =
        [this,debug](AlloyContext* context,const InputEvent& e) {
            if(e.button==GLFW_MOUSE_BUTTON_LEFT) {
                context->toggleDebug();
                debug->foregroundColor=context->isDebugEnabled()?MakeColor(255,64,64,255):MakeColor(64,64,64,128);
                context->setMouseFocusObject(nullptr);
                return true;
            }
            return false;
        };
        rootRegion.add(debug);
    }

    //First pack triggers computation of aspect ratios  for components.
    rootRegion.pack(context.get());
    context->getGlassPane()->setVisible(false);
    context->requestPack();
    glfwSwapInterval(swapInterval);
    glfwSetTime(0);
    uint64_t frameCounter = 0;
    std::chrono::steady_clock::time_point endTime;
    std::chrono::steady_clock::time_point lastFpsTime =
        std::chrono::steady_clock::now();
    if (!forceClose) {
        glfwShowWindow(context->window);
    } else {
        context->executeDeferredTasks();
        context->dirtyUI = true;
        context->dirtyLayout = true;
        draw();
        context->dirtyUI = true;
        context->dirtyLayout = true;
        context->update(rootRegion);
    }
    do {
        //Events could have modified layout! Pack before draw to make sure things are correctly positioned.
        if (context->dirtyLayout) {
            context->dirtyLayout = false;
            context->dirtyCursorLocator = true;
            rootRegion.pack();
        }
        draw();
        context->update(rootRegion);
        double elapsed =
            std::chrono::duration<double>(endTime - lastFpsTime).count();
        frameCounter++;
        if (elapsed > POLL_INTERVAL_SEC) {
            frameRate = (float) (frameCounter / elapsed);
            lastFpsTime = endTime;
            frameCounter = 0;
        }
        glfwSwapBuffers(context->window);
        glfwPollEvents();
        for (std::exception_ptr e : caughtExceptions) {
            std::rethrow_exception(e);
        }
        if (glfwWindowShouldClose(context->offscreenWindow)) {
            context->setOffScreenVisible(false);
        }
    } while (!glfwWindowShouldClose(context->window) && !forceClose);
}