CWindowClient::CWindowClient(CWindow &window)
    : CAbstractWindowClient(window)
    , m_defaultVAO(CArrayObject::do_bind_tag())
    , m_mouseGrabber(window)
    , m_camera(CAMERA_EYE, CAMERA_AT, CAMERA_UP)
{
    const vec4 BLACK_RGBA = {0, 0, 0, 1};
    const float CAM_SPEED = 20;

    window.SetBackgroundColor(BLACK_RGBA);
    SetupOpenGLState();

    m_camera.SetMoveSpeed(CAM_SPEED);
    m_renderSystem.SetupLight0(SUNLIGHT_DIRECTION, WHITE_RGBA, FADED_WHITE_RGBA);

    CSceneLoader loader(m_world);
    loader.LoadScene(SCENE_JSON);
    loader.LoadSkybox(SKYBOX_PLIST);

    // Добавляем систему, отвечающую за рендеринг моделей.
    m_world.addSystem(m_renderSystem);

    // Добавляем систему, отвечающую за проигрывание анимаций.
    m_world.addSystem(m_animationSystem);

    // После активации новых сущностей или деактивации,
    //  а при добавления новых систем следует
    //  вызывать refresh() у мира.
    m_world.refresh();
}
CWindowClient::CWindowClient(CWindow &window)
    : CAbstractWindowClient(window)
    , m_defaultVAO(CArrayObject::do_bind_tag())
    , m_keplerSystem(m_timeController)
    , m_rotationSystem(m_timeController)
    , m_mouseGrabber(window)
    , m_camera(CAMERA_EYE)
{
    const vec4 BLACK_RGBA = {0, 0, 0, 1};
    window.SetBackgroundColor(BLACK_RGBA);
    SetupOpenGLState();

    m_renderSystem.SetupLight0(SUNLIGHT_POSITION, WHITE_RGBA, FADED_WHITE_RGBA);

    CSceneLoader loader(m_world);
    loader.LoadScene("res/solar_system/solar_system_2012.json");
    loader.LoadSkybox("res/solar_system/skybox.plist");

    // Добавляем систему, отвечающую за изменение положения планет
    //  согласно их орбитам и прошедшему времени по законам Кеплера.
    m_world.addSystem(m_keplerSystem);

    // Добавляем систему, выполняющую вращение тел вокруг своих осей.
    m_world.addSystem(m_rotationSystem);

    // Добавляем систему, отвечающую за обновление систем частиц
    m_world.addSystem(m_particleUpdateSystem);

    // Добавляем систему, отвечающую за рендеринг планет.
    m_world.addSystem(m_renderSystem);

    // Добавляем систему, отвечающую за рендеринг систем частиц
    m_world.addSystem(m_particleRenderSystem);

    // После активации новых сущностей или деактивации,
    //  а при добавления новых систем следует
    //  вызывать refresh() у мира.
    m_world.refresh();
}