среда, 21 октября 2015 г.

Создаём свой собственный курсор

Думаю, пора продолжить... Сейчас вкратце изложу, как создать свой курсор для окна. В принципе код очень прост, вся проблема в том, что нам надо загрузить картинку, в библиотеке glfw не предусмотрена загрузка картинок. Мы используем самое простое и минималистское решение, что мне удалось найти, ссылка. Не будем сильно вдаваться в подробности, возмём код из примеров, которые есть на той страницы. И добавим к нашему проекту пару файлов: lodepng.h, lodepng.cpp  (как это сделать, будет зависеть от вашей IDE), так что это останется вашей проблемой. При желание, вы можете загрузить картинку и при помощи другой библиотеки, их полно в сети...

Не забудьте приготовить картинку самого курсора ;)



#include <glfw3.h>

#include<vector>
#include "lodepng.h"

std::vector<unsigned char> image; //the raw pixels
unsigned width, height;

void decodeOneStep(const char* filename)
{
    // Декодируем файл
    unsigned error = lodepng::decode(image, width, height, filename);

    //Выводим ошибку, если возникли проблемы
    if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl;

    //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ...
}

int main(void)
{
    GLFWwindow* window;

    // Инициализация библиотеки
    if (!glfwInit())
        return -1;

    // Создание окна
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }
    // Загружаем картинку
    decodeOneStep("test.png");

    // Создаём картинку,в формате понятном GLFW
    GLFWimage* img = new GLFWimage;
        img->height = height;
        img->width = width;
        img->pixels = &image[0];

    // Создаём курсор, указываем позицию срабатывания курсора
    GLFWcursor* cursor = glfwCreateCursor(img, 0, 0);

        //Назначаем наш курсор действующим в этом окне
        glfwSetCursor(window, cursor);


    // Связываем контекст и окно
    glfwMakeContextCurrent(window);

    // Считайте, что это будет цвет нашего окна
    glClearColor(.5f, .5f, .5f, 1.f);

    // Главный цикл - кpутится пока окно не закрыто
    while (!glfwWindowShouldClose(window))
    {
        // Заливка окна нашим цветом (очистка)
        glClear(GL_COLOR_BUFFER_BIT);

        // Переключаем буфер
        glfwSwapBuffers(window);

        // Обработка событий
        glfwPollEvents();
    }

    glfwTerminate();

}


Незнаю, как на разных ОС, но у меня при загрузке очень больших курсоров (знаю, что глупость но хотелось попробовать, аж с размер окна), курсор начинал моргать. Нормальные курсоры работают как надо.

вторник, 13 октября 2015 г.

Получение списка поддерживаемых разрешений

Решил я таки познакомится поближе, с библиотекой glfw. Интернет завален информацией по использованию этой либы, особенно из разряда "Hello world", ну и инициализации контекста OpenGL. Думаю все это уже нашли и разобрались с основами.

Попробую написать, что-то более продвинутое, но тем не менее простое, если такое возможно )) И так попробуем получить список разрешений, которые потянет наш монитор.

#include <glfw3.h>
#include <cstdio>

int main(void)
{
    // Инициализация библиотеки
    if (!glfwInit())
        return -1;

    int count; // Счётчик режимов
    // Получаем список поддерживаемых режимов экрана
    const GLFWvidmode* modes = glfwGetVideoModes(glfwGetPrimaryMonitor(), &count);
    // Выводим на консоль
    printf ("Video modes:\n");
    for(int i = 0; i < count; ++i)
    {
            printf ("resolution: %i %i\t", modes[i].width, modes[i].height);
            printf ("resolution: %i Hz\n", modes[i].refreshRate);
    }
   
    // Завершаем работу glfw
    glfwTerminate();
}


Код жутко простой, мы даже не создаём окно, просто получаем информацию, выводим в консоль и завершаем работу.
Программ создавалась и тестировалась под Убунтой.