LINUX.ORG.RU

Сообщения Gyros

 

Как обойти/исправить ошибку при сборке библиотек mxe?

Форум — Linux-install

Всех приветствую! Пытаюсь собрать некоторые библиотеки для mxe. На каком-то этапе происходит ошибка:


[download]    libsndfile-1.1.0.tar.xz
[build]       libsndfile              x86_64-w64-mingw32.static

Failed to build package libsndfile for target x86_64-w64-mingw32.static!
------------------------------------------------------------
configure.ac:345: the top level
autom4te: error: /usr/bin/m4 failed with exit status: 1
aclocal: error: /usr/local/bin/autom4te failed with exit status: 1
autoreconf: error: aclocal failed with exit status: 1
make[1]: *** [Makefile:903: build-only-libsndfile_x86_64-w64-mingw32.static] Error 1
make[1]: Leaving directory '/home/bark/mxe'
real	0m5,646s
user	0m4,455s
sys	0m0,188s
------------------------------------------------------------
[log]      /home/bark/mxe/log/libsndfile_x86_64-w64-mingw32.static

make: *** [Makefile:891: /home/bark/mxe/usr/x86_64-w64-mingw32.static/installed/libsndfile] Error 1

Далее смотрю лог, в нем:

cd '/home/bark/mxe/tmp-libsndfile-x86_64-w64-mingw32.static/libsndfile-1.1.0' && autoreconf -fi
configure.ac:345: error: macro PKG_INSTALLDIR is not defined; is a m4 file missing?
m4/ax_require_defined.m4:35: AX_REQUIRE_DEFINED is expanded from...
configure.ac:345: the top level
autom4te: error: /usr/bin/m4 failed with exit status: 1
aclocal: error: /usr/local/bin/autom4te failed with exit status: 1
autoreconf: error: aclocal failed with exit status: 1
make[1]: *** [Makefile:903: build-only-libsndfile_x86_64-w64-mingw32.static] Error 1
make[1]: Leaving directory '/home/bark/mxe'

Моя версия pkg:

pkg-config --version
0.29.1

Читаю про макрос PKG_INSTALLDIR:

PKG_INSTALLDIR(КАТАЛОГ)
Определяет переменную $pkgconfigdir как место, куда пакет должен установить pkg-config.
файлы .pc.

В mxe/tmp-libsndfile-x86_64-w64-mingw32.static/libsndfile-1.1.0/configure.ac указано:

dnl Require autoconf version >= 2.69
AC_PREREQ([2.69])

У меня

autoconf --version
autoconf (GNU Autoconf) 2.71

В этом файле configure.ac макрос PKG_INSTALLDIR упоминается два раза:

dnl Check for pkg-config outside the if statement.
PKG_PROG_PKG_CONFIG
AX_REQUIRE_DEFINED([PKG_INSTALLDIR])
PKG_INSTALLDIR

Версия Убунты 20.04 LTS.

Никто случайно не знает как это решить. Мысли вслух: может вручную создать директорию m4?

Заранее благодарен за ответы со существу.

 , , , ,

Gyros
()

Имитация фиксированного конвейера на современном OpenGL

Форум — Development

Приветстсвую всех!

Пытаюсь воспроизвести древний пример 1996 года на opengl4

(чтобы рендерилась в точности картинка с использованием фиксированных функций - но до этого пока далеко).

Простенькая сцена. Для простоты вывожу только три плоскости: пол, левую и правую стенки.

Последовательные запуски дают разные варианты затенения:

первый вариант

второй

третий

Сталкивался ли кто-нибудь с таким эффектом? Чем он вызван?

В расчете модели освещения нет элементов случайности, так что в этом виноват не шейдер (вершинный/фрагментный).

Тут что-то с vbo?

Инициализация пола

void initFloor()
{

    // 1) Текстура
    GLfloat *textureData = make_texture(TEXDIM, TEXDIM);
    glGenTextures(1, &tex_id);

    glBindTexture(GL_TEXTURE_2D, tex_id);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, TEXDIM, TEXDIM);
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TEXDIM, TEXDIM, GL_RED, GL_FLOAT, textureData);
    free(textureData);
    CHECK_GL_ERROR();
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);


    glActiveTexture(GL_TEXTURE0);
    CHECK_GL_ERROR();
    prog_set_uniform_int(&floorsh, "tex1", 0);

    // 2) Геометрия
    float vertexData[4*3]=
    {
         -100.f,  -100.f, -320.f,  
          100.f,  -100.f, -320.f,  
          100.f,  -100.f, -640.f,  
         -100.f,  -100.f, -640.f   
    };

    GLubyte colorData[4*3] =
    {
        200, 200, 200,
        200, 200, 200,
        200, 200, 200,
        200, 200, 200 
       
    };

    GLubyte texCoords[4*2] =
    {
        0, 0, 
        1, 0, 
        1, 1, 
        0, 1
    };

    GLuint indexList[2][3] =
    {
        {0, 1, 2},   // first triangle
        {0, 2, 3}    // second triangle
    };



    glGenBuffers(1, &vbo_floor_pos);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_floor_pos);
    glBufferData(GL_ARRAY_BUFFER, 4*3 * sizeof(float), vertexData, GL_STATIC_DRAW);

    glGenBuffers(1, &vbo_floor_color);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_floor_color);
    glBufferData(GL_ARRAY_BUFFER, 4*3 * sizeof(GLubyte), colorData, GL_STATIC_DRAW);

    glGenBuffers(1, &vbo_floor_tex);
    glBindBuffer(GL_ARRAY_BUFFER, vbo_floor_tex);
    glBufferData(GL_ARRAY_BUFFER, 4*2 * sizeof(float), texCoords, GL_STATIC_DRAW);

    glGenBuffers(1, &ebo_floor);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo_floor);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 2*3 * sizeof(GLuint), indexList, GL_STATIC_DRAW);

    

    glGenVertexArrays( 1, &vao_floor );
    glBindVertexArray(vao_floor);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo_floor);

    

    glEnableVertexAttribArray(0);  // position
    glEnableVertexAttribArray(1);  // color
    glEnableVertexAttribArray(2);  // texture coords

    glBindBuffer(GL_ARRAY_BUFFER, vbo_floor_pos);
    glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, NULL );

    glBindBuffer(GL_ARRAY_BUFFER, vbo_floor_color);
    glVertexAttribPointer( 1, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, NULL );

    glBindBuffer(GL_ARRAY_BUFFER, vbo_floor_tex);
    glVertexAttribPointer( 2, 2, GL_UNSIGNED_BYTE, GL_FALSE, 0, NULL );

    glBindVertexArray(0);
}

Отрисовка пола

void drawFloor()
{
    prog_use(&floorsh);

    glEnable(GL_TEXTURE_2D);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, tex_id);
    
    glBindVertexArray(vao_floor);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo_floor);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    glBindVertexArray(0);
    glDisable(GL_TEXTURE_2D);
}

Инициализация левой и правой стены

/* left wall */
static float left_wall[12] = {-100.f, -100.f, -320.f,
                              -100.f, -100.f, -640.f,
                              -100.f,  100.f, -640.f,
                              -100.f,  100.f, -320.f };
static float left_normal[3] = {1.f, 0.f, 0.f};
static float left_color[3] = {165, 165, 165};
static struct PLANE left;

/* right wall */
static float right_wall[12] = {  100.f, -100.f, -320.f,
                                 100.f,  100.f, -320.f,
                                 100.f,  100.f, -640.f,
                                 100.f, -100.f, -640.f };
static float right_normal[3] = {-1.f, 0.f, 0.f};
static float right_color[3] = {165, 165, 165};
static struct PLANE right;

void plane_init(PLANE *plane, const float *points, float *normal, float *color)
{
    
    float vertexData[4*3]=
    {
          points[0],  points[ 1], points[ 2],  
          points[3],  points[ 4], points[ 5], 
          points[6],  points[ 7], points[ 8], 
          points[9],  points[10], points[11]
    };

    GLubyte colorData[4*3] =
    {
        color[0], color[1], color[2],
        color[0], color[1], color[2],
        color[0], color[1], color[2],
        color[0], color[1], color[2]
    };

    GLubyte texCoords[4*2] =
    {
        0, 0, 
        1, 0, 
        1, 1, 
        0, 1
    };

    GLubyte normalData[4*3] =
    {
        normal[0], normal[1], normal[2],
        normal[0], normal[1], normal[2],
        normal[0], normal[1], normal[2],
        normal[0], normal[1], normal[2] 
    };

    GLuint indexList[2][3] =
    {
        {0, 1, 2},   // first triangle
        {0, 2, 3}    // second triangle
    };



    glGenBuffers(1, &plane->vbo_pos);
    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_pos);
    glBufferData(GL_ARRAY_BUFFER, 4*3 * sizeof(float), vertexData, GL_STATIC_DRAW);

    glGenBuffers(1, &plane->vbo_color);
    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_color);
    glBufferData(GL_ARRAY_BUFFER, 4*3 * sizeof(GLubyte), colorData, GL_STATIC_DRAW);

    glGenBuffers(1, &plane->vbo_tex);
    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_tex);
    glBufferData(GL_ARRAY_BUFFER, 4*2 * sizeof(float), texCoords, GL_STATIC_DRAW);

    glGenBuffers(1, &plane->vbo_normal);
    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_normal);
    glBufferData(GL_ARRAY_BUFFER, 4*3 * sizeof(float), normalData, GL_STATIC_DRAW);

    glGenBuffers(1, &plane->ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, plane->ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 2*3 * sizeof(GLuint), indexList, GL_STATIC_DRAW);

    

    glGenVertexArrays( 1, &plane->vao );
    glBindVertexArray(plane->vao);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, plane->ebo);

    

    glEnableVertexAttribArray(0);  // position
    glEnableVertexAttribArray(1);  // color
    glEnableVertexAttribArray(2);  // texture coords
    glEnableVertexAttribArray(3);  // normal

    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_pos);
    glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, NULL );

    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_color);
    glVertexAttribPointer( 1, 3, GL_UNSIGNED_BYTE, GL_TRUE, 0, NULL );

    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_tex);
    glVertexAttribPointer( 2, 2, GL_UNSIGNED_BYTE, GL_FALSE, 0, NULL );

    glBindBuffer(GL_ARRAY_BUFFER, plane->vbo_normal);
    glVertexAttribPointer( 3, 3, GL_FLOAT, GL_FALSE, 0, NULL );

    glBindVertexArray(0);

}

void plane_draw(PLANE *plane)
{
    glBindVertexArray(plane->vao);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, plane->ebo);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

    glBindVertexArray(0);
}

Инициализация шейдеров:

void init_scene()
{
    glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
   
    glClearColor(0.5f, 0.5f, 0.5f, 1.0f );  

    prog_create(&floorsh);
    prog_attach_shader_from_file(&floorsh, FLOOR_VERTEX_SHADER_NAME);
    prog_attach_shader_from_file(&floorsh, FLOOR_FRAGMENT_SHADER_NAME);
    prog_link(&floorsh);
    prog_use(&floorsh);
    initFloor();
    
    
    
    prog_create(&wallsh);
    prog_attach_shader_from_file(&wallsh, WALL_VERTEX_SHADER_NAME);
    prog_attach_shader_from_file(&wallsh, WALL_FRAGMENT_SHADER_NAME);
    prog_link(&wallsh);
    prog_use(&wallsh);
    initWalls();
      
 
    prog_set_uniform_3f(&wallsh, "lightSource.ambient",  1.0f, 1.0f, 1.0f);  
    prog_set_uniform_3f(&wallsh, "lightSource.diffuse",  1.0f, 1.0f, 1.0f); 
    prog_set_uniform_3f(&wallsh, "lightSource.specular", 1.0f, 1.0f, 1.0f);  
    prog_set_uniform_3f(&wallsh, "lightSource.position", 50.f, 50.f, -320.f);

    prog_set_uniform_3f(&wallsh, "lightModel.ambient",  1.0f, 1.0f, 1.0f);  
    prog_set_uniform_3f(&wallsh, "material.emission",   1.0f, 1.0f, 1.0f); 
    prog_set_uniform_3f(&wallsh, "material.ambient",    1.0f, 1.0f, 1.0f);  
    prog_set_uniform_3f(&wallsh, "material.diffuse",    1.0f, 1.0f, 1.0f); 
    prog_set_uniform_3f(&wallsh, "material.specular",   1.0f, 1.0f, 1.0f); 
    prog_set_uniform_float(&wallsh, "material.shininess",   10.0f); 

    mat4_identity(&model);
    mat4_identity(&view);
   
    MAT4 MV; 
    mat4_multiply(&MV, &view,  &model);
    prog_set_uniform_mat4(&wallsh, "modelViewMatrix", &MV);

    MAT3 NormalMatrix;
    NormalMatrix.M[0] = MV.M[0];     NormalMatrix.M[3] = MV.M[4];     NormalMatrix.M[6] = MV.M[8];
    NormalMatrix.M[1] = MV.M[1];     NormalMatrix.M[4] = MV.M[5];     NormalMatrix.M[7] = MV.M[9];
    NormalMatrix.M[2] = MV.M[2];     NormalMatrix.M[5] = MV.M[6];     NormalMatrix.M[8] = MV.M[10];
    prog_set_uniform_mat3(&wallsh,"normalMatrix", &NormalMatrix);

    
    mat4_perspective_projection(&projection, -FRUSTDIM, FRUSTDIM, -FRUSTDIM, FRUSTDIM, FRUSTNEAR, FRUSTFAR);
    prog_set_uniform_mat4(&wallsh, "projectionMatrix", &projection);
    

    glEnable(GL_DEPTH_TEST);
    //glPolygonMode(GL_FRONT, GL_FILL);

    //glCullFace(GL_BACK);

    CHECK_GL_ERROR();
}

Заранее благодарю за осмысленные ответы и помощь!

 , , ,

Gyros
()

Названия для размеров часто используемых буферов

Форум — Development

Приветствую всех!

Сделал так:

#define GIANT_SIZE     1024*32
#define HUGE_SIZE      1024*16 
#define LARGE_SIZE     1024*8 
#define BIG_SIZE       1024 
#define MIDDLE_SIZE    512
#define MEDIUM_SIZE    256
#define SMALL_SIZE     128 
#define LITTLE_SIZE    64 
#define TINY_SIZE      32 

Стильно получилось?

Часто требуется, например, считать строку из файла, и чтобы не плодить магических констант, вместо 512 писать MIDDLE_SIZE

...
while (!feof(fp))
{
    char buff[MIDDLE_SIZE];
    fgets(buff, MIDDLE_SIZE, fp);
    buff[MIDDLE_SIZE-1]='\0';
    char* line = str_dup(buff);
    str_trim(line);
...

Например, загрузка матрицы из файла формата (нарочно зашумленный пробелами и tab-ами):



DIM1=	3
	
  DIM2 = 7


{
   	 0.935    0.674    -1.687    0.468  2.436   -1.743  0.275

   	 0.111    0.346    0.368   0.907    -7.346     -0.235    -0.139  
0.436    -0.134    -1.047    0.879    -1.051  -0.367         -0.196

}
	

выглядит вот так

void matrix_load( MATRIX* A, const char* fileName)
{
    FILE* fp;
    bool b_is_dim1_read=false;
    bool b_is_dim2_read=false;
    unsigned int dim1, dim2;
    bool begin=false;
    bool end = false;
    int row_count = 0;


    if ((fp = fopen(fileName,"r")) == NULL)
    {
      fprintf(stderr,"File '%s' open failed\n", fileName);
      enter_pause();
      exit(EXIT_FAILURE);
    }
    else
    {
        while (!feof(fp))
        {
            char buff[MIDDLE_SIZE];
            fgets(buff, MIDDLE_SIZE, fp);
            buff[MIDDLE_SIZE-1]='\0';
            char* line = str_dup(buff); // 
            str_trim(line);  // обрезаем '\t','\v', '\f', '\n', '\r', ' '      

            if (0==strlen(line)) // если после обрезки строка пустая, то пропускаем обработку
            {
                free(line);
                continue;
            }
            
            if (line[0] == 'D' && line[1] == 'I' && line[2]== 'M') // если встретилось "DIM"
            {
                Tokens* dim  = tokens_new(2);
                string_split(dim, line, "="); // разбиваем строку по '='
                

                if (line[3]== '1' || line[3]== '2') // DIM1 или DIM2
                {
                    errno = 0;
                    char *endptr;
                    unsigned int d = strtoul(dim->array[1]->data, &endptr, 10);
                    
                    if (*endptr != '\0' || errno !=0 || d==0 || d>30) // не более 30x30
                    {
                        fprintf(stderr,"Error: dimension wrong '%s'\n", dim->array[1]->data);
                        tokens_free(dim);
                        free(line);
                        enter_pause();
                        exit(EXIT_FAILURE);
                    }
                    
                    switch (line[3])
                    {
                    case '1':
                        dim1 = d;
                        b_is_dim1_read = true;
                        break;

                    case '2':
                        dim2 = d;
                        b_is_dim2_read = true;
                        break;

                    }
                }
                
                 // если все размерности считаны, то выделяем память для матрицы
                if (b_is_dim1_read && b_is_dim2_read)
                {
                    matrix_create(A, dim1, dim2);
                }

                tokens_clear(dim);
                tokens_free(dim);
            }

            

            if (line[0] =='{') { begin=true; free(line); continue; } // признак начала значений матрицы
            if (line[0] =='}') { end=true;   free(line); continue; }
            if (begin && !end)
            {
                //printf("%s\n", line);
                Tokens* row  = tokens_new(dim2); // по кол-ву элементов в строке
                string_split(row, line, " ");

                // если столбцов недостаточно или строк больше заявленных
                if (dim2 != row->size || row_count >= dim1)
                {
                    fprintf(stderr,"Error: Invalid file format '%s'\n", fileName);
                    enter_pause();
                    exit(EXIT_FAILURE);
                }

                // заполнение строки матрицы
                for (int j=0; j<dim2; ++j)
                {
                    
                    errno = 0;
                    char *endptr;
                    double value = strtod(row->array[j]->data, &endptr);
                    if (*endptr != '\0' || errno != 0 || 10 < strlen(row->array[j]->data) ) //не более 10-значное число
                    {
                        fprintf(stderr,"Error: wrong value '%s'\n", row->array[j]->data);
                        tokens_free(row);
                        free(line);
                        matrix_free(A);
                        enter_pause();
                        exit(EXIT_FAILURE);
                    }
                    matrix_set_elem(A, row_count, j,  value);
                }
                row_count++;
                tokens_clear(row);
                tokens_free(row);
            }


            free(line);
        }
        fclose(fp);

        if (row_count != dim1) // недочитали заявленные dim1 строк
        {
            fprintf(stderr,"Error: Invalid file format '%s'\n", fileName);
            enter_pause();
            exit(EXIT_FAILURE);
        }
    }

}

Функция str_dup:

char *str_dup(char const *in)
{
    if ( !in ) return NULL;
    size_t len = strlen(in);
    char *out = malloc(len+1);
    strncpy(out, in, len+1);
    return out;
}

Буду рад услышать отзывы о стиле.

 , , ,

Gyros
()

Форматирование даты-времени для лога: strftime не работает с mingw?

Форум — Development

Всех приветствую!

Необходимо выводить дату-время в лог-файл.

char* get_datetime_str_alt1(char *str_datetime)
{
    char buff[64]={'\0'};

    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
  
    strftime(buff, sizeof(buff), "%e-%b-%Y %Z %T", localtime(&ts.tv_sec));
    sprintf(str_datetime, "%s", buff);
       
    return str_datetime;
}


char* get_datetime_str_alt2(char *str_datetime)
{
    char buff[64]={'\0'};
       
    time_t t = time(NULL);
    struct tm *local = localtime(&t);
  
    strftime(buff, sizeof(buff), "%e-%b-%Y %Z %H:%M:%S", local);
    sprintf(str_datetime, "%s", buff);
       
    return str_datetime;
}

Эти два варианта работают после gcc

1-Aug-2024 MSK 12:32:45: Start!
1-Aug-2024 MSK 12:32:45: Bla-bla
1-Aug-2024 MSK 12:32:46: End!

, но ничего не выводят после mingw:

: Start!
: Bla-bla
: End!

Работает отлично только

char* get_datetime_str(char *str_datetime)
{
    time_t t = time(NULL);
        
    sprintf(str_datetime, "%s", ctime(&t) );
    char *p = strchr(str_datetime, '\n');
    *p = '\0';
 
    return str_datetime;
}

Но форматирование уже выбираю не я:

Thu Aug 01 12:13:08 2024: Start!
Thu Aug 01 12:13:08 2024: Bla-bla
Thu Aug 01 12:13:09 2024: End!

По идее и так работает. Но все таки какая-то неудовлетворенность остается. Сталкивался кто-нибудь с подобным эффектом?

Подозреваю нужно обновлять mingw, но так не хочется: столько библиотек опять устанавливать (к тому же я уже забыл как это делал).

PS gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0

x86_64-w64-mingw32-gcc (GCC) 9.3-win32 20200320 wincrt

 , , , ,

Gyros
()

printf vs fprintf(stderr)

Форум — Development

Всех приветствую!

Задался таким вопросом: а нужно ли городить

 fprintf(stderr, "Error: bla-bla\n");

вместо простого

printf("Error: bla-bla\n");

Ведь результат один и тот же.

Когда необходимо разделять stderr и stdout? Вообще, когда и как может использоваться stderr?

PS Заранее благодарю за ответы.

 , ,

Gyros
()

Есть ли тема курсора, чтобы при нажатии кнопки мыши была анимация курсора?

Форум — Desktop

Приветствую всех!

Не подскажете существует ли тема курсора (для xfce, xubuntu), чтобы принажатии кнопки мыши производилась какая-нибудь анимация, например маленький фейерверк исходящий от курсора или он как-то бы подсвечивался интересно.

Или, если нет темы, то как сделать подсветку курсора при нажатии.

Заранее благодарю за содержательные ответы.

 , , , ,

Gyros
()

Поле редактирования в Nuklear

Форум — Development

Всех приветствую!

Имеется проблема с работой nk_edit_string, библиотека Nuklear.

Суть: вводим в поле целое число и нажимаем кнопочку рядом, число выводится в консоле (для отладки).

int F=5; // глобальная
...

static char text[64];
static int text_len;
active = nk_edit_string(ctx, NK_EDIT_SIMPLE, text, &text_len, 64, nk_filter_decimal);
            if (nk_button_label(ctx, "->")) // || active & NK_EDIT_COMMITED)
{
   text_len = strlen(text);
   if (text_len !=0 && text_len<8)
   {
       F = atoi(text);
       printf("F=%d\n", F);
       memset(text, '\0', 64);
       text_len=0;
   }
   printf("text=%s\n", text);
}
...

Тест 1: ввели 77, вывод: F=77, text="";

Тест 2: ввели 555, но тут же передумали, стерли и снова набрали 77, вывод: F=775, text="";

Получается буфер text был «555», но был перебит «775», т.е. он не чиститься при каждом новом вводе/редактировании.

Кто-нибудь умеет правильно использовать NK_EDIT_SIMPLE, чтобы не было такого эффекта (вернее сказать, дефекта)?

 , , ,

Gyros
()

Числа с плавающей запятой. Откуда взялся минус и как его убрать?

Форум — Development

Тестовый пример, показывающий суть явления:

#include <stdio.h>
int main()
{
    float right=-2.0f, left=2.0f; 
    float res = (right+left)/(right-left);
    printf("%5.12e\n", res);

    float test = -0.00000000000000424f;
    printf("%3.3f\n", test);
}

Результат:

-0.000000000000e+00
-0.000

Понятно, что после right-left знаковый бит становится 1. Но выглядит (когда выводишь на экран с %3.3f) так как будто есть где-то далеко после нулей числа, например -0.00000000000000424. А на самом деле их нет. Это ноль, только со знаком (IEEE754 это допускает). Но с математической точки зрения и при выводе матрицы нам хотелось бы видеть настоящий ноль (в математике он один) без знака. Кто-нибудь сталкивался с такой «проблемой»? Как красиво сделать в программе, чтобы ноль был единственным, без знака. Есть ли изящные решения? Просто не хочется чтобы в матрице было -0.000, это может сбить с толка того, кто будет смотреть вывод на экран или распечатку, по уже выше описанной причине.

 , , ,

Gyros
()

Imgui и чистый C

Форум — Development

Приветствую всех! Никто не знает как собрать программу, если библиотека Imgui использует C++, а main.c и др. используемые библиотеки написаны на чистом C (C11). Вызовы Imgui происходят только в одном main.c Как быть? Может есть какой-нибудь способ собрать. Или отказываться от Imgui? А есть ли альтернатива пользовательского интерфейса для OpenGL на C?

 , , , ,

Gyros
()

Программирование анимации персонажа. Есть проблема

Форум — Development

Всех приветствую! Хочу двигать персонаж вправо на 10.0f ровно за свое заданное время: 2 сек, 0.5 сек и т.п.

Имеются следующие функции и глобальные переменные (очищенный от несущественного псевдокод):

float personage_X=-5.0f, personage_Y=-5.0f;
float distance_X=10.0, distance_Y=0.0;
float dX, dY;
double DELTA_T = 0.01667; //среднее значение delta_T даваемое программой 
                            //(по сути это 1000/60=16.6(6) мс/кадр)
double last_T_move;
double duration_T;
int duration_tick;
bool bmoveLeft  = false;
bool bmoveRight = false;



moveRight
{
   bmoveRight = true; // начинаю движение
   duration_T = 0.9;   // длительность в сек
   duration_tick = (int) (duration_T/DELTA_T); // кол-во тиков(кадров) для перемещения
   dX = distance_X/duration_tick;                   // шаг перемещения
   last_T_move = get_time();
}

update
{
  printf("update()\n");
  if (bmoveRight)
  {
      personage_X += dX;
      printf("now_T - last_T_move = %5.7f\n", now_T - last_T_move);
      if (now_T - last_T_move >= duration_T )
      {
         bmoveRight = false; // остановить движение
      }
    }
}

idle
{
  const double now_T = get_time();
  const double delta_T = now_T - last_T;
  last_T = now_T;
  printf("delta_T = %5.5f\n", delta_T);

  update(now_T);

  redisplay();
}

display
{
  printf("display()\n");
  render_personage();

  swap_buffers();
}

Вывод консоли работающей программы:

( читать дальше... )

1) Теперь я начинаю движение, например за 2.2 сек вправо на 10:

personage coords: [-5.000, -5.000]
duration_tick = 131 // 131 кадр необходимо для достижения конечной точки перемещения 
dX = 0.07634        // шаг
now_T - last_T_move = 0.0156779
now_T - last_T_move = 0.0324781
now_T - last_T_move = 0.0491800
now_T - last_T_move = 0.0658500
now_T - last_T_move = 0.0825200
...
now_T - last_T_move = 2.1999640
now_T - last_T_move = 2.2166250
personage coords: [5.153, -5.000]  //  в идеале должно быть [5.000, -5.000]
                                   //  еще только маленькая погрешность

2) Движение за 0.9 сек вправо на 10:

personage coords: [-5.000, -5.000]
duration_tick = 53 // 53 кадра необходимо для достижения конечной точки перемещения 
dX = 0.18868       // шаг
now_T - last_T_move = 0.0135901
now_T - last_T_move = 0.0302720
now_T - last_T_move = 0.0469420
now_T - last_T_move = 0.0636110
...
now_T - last_T_move = 0.9139049
personage coords: [5.377, -5.000]  //  в идеале должно быть [5.000, -5.000]
                                   //  уже существенная погрешность

3) Движение за 0.2 сек вправо на 10:

personage coords: [-5.000, -5.000]
duration_tick = 11
dX = 0.90909
now_T - last_T_move = 0.0133729
now_T - last_T_move = 0.0302980
now_T - last_T_move = 0.0469708
now_T - last_T_move = 0.0636489
now_T - last_T_move = 0.0803308
...
now_T - last_T_move = 0.1970379
now_T - last_T_move = 0.2136910
personage coords: [6.818, -5.000]  // в идеале должно быть [5.000, -5.000]
                                   //  бешенейшая погрешность (!)
                                   // Alarm! Что делать?

Из трех экспериментов видно, что чем быстрее я хочу переместиться, то тем дальше перелетаю требуемую конечную точку.

Хотелось бы услышать компетентное мнение по устранению данной проблемы и/или возможного изменения подхода к анимации в принципе. Спасибо за помощь!

 , , , ,

Gyros
()

Не хватает библиотеки при сборке cocos2d-x, а она есть!

Форум — Development
~/cocos2d-x-3.17.2/cmake-build$ make
[  1%] Built target ext_unzip
[  3%] Built target ext_recast
[  3%] Built target ext_tinyxml2
[  3%] Built target ext_xxhash
[  3%] Built target ext_xxtea
[  3%] Built target ext_clipper
[  4%] Built target ext_edtaa3func
[  4%] Built target ext_convertUTF
[  4%] Built target ext_poly2tri
[  5%] Built target ext_md5
[  5%] Built target external
[ 70%] Built target cocos2d
[ 71%] Built target ext_tolua
[ 72%] Built target ext_luasocket
[ 79%] Built target luacocos2d
[ 84%] Built target jscocos2d
[ 84%] Linking CXX executable ../../../bin/cpp-empty-test/cpp-empty-test
/usr/bin/ld: ../../../../external/linux-specific/fmod/prebuilt/64-bit/libfmod.so: .dynsym local symbol at index 2 (>= sh_info of 2)
/usr/bin/ld: ../../../../external/linux-specific/fmod/prebuilt/64-bit/libfmod.so: .dynsym local symbol at index 3 (>= sh_info of 2)
/usr/bin/ld: ../../../../external/linux-specific/fmod/prebuilt/64-bit/libfmod.so: .dynsym local symbol at index 4 (>= sh_info of 2)
/usr/bin/ld: cannot find -lXxf86vm
collect2: error: ld returned 1 exit status
make[2]: *** [engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/build.make:153: bin/cpp-empty-test/cpp-empty-test] Error 1
make[1]: *** [CMakeFiles/Makefile2:1292: engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
~/cocos2d-x-3.17.2/cmake-build$ 

Я так понимаю, что библиотеки собрались, а вот примеры не хотят. Кто знает в чем причина? Заранее благодарен за любые содержательные ответы.

PS. Файлы libXxf86vm.so.1 и libXxf86vm.so.1.0.0 в /usr/lib/x86_64-linux-gnu/ присутствуют.

PS2. sudo apt-get update && sudo apt-get install libxxf86vm-dev пробовал.

 , ,

Gyros
()

vbo, vao и шейдеры

Форум — Development

Всем привет! Требуется отправить 6 вершин в GPU. А далее выводить сначала как два анимированных треугольника: (1,2,3)(3,4,1). Потом, тоже как два треугольника, но (4,1,2)(2,3,4). Как сделать так, чтобы не обновлять геометрию в основной программе, т.е. не очищать vao и создавать новый буфер (по сути из тех же самых вершин), и снова его отправлять в GPU. Может индексация тут поможет (можно ли обновлять только буфер индексов?) или в геометрическом шейдере что-то надо делать.

PS: opengl-4

 , , ,

Gyros
()

FreeType2 и mingw32: как получить библиотеку, с которой можно собрать проект для Windows

Форум — Development

Всем добрый вечер! Собственно вопрос в заголовке. Конкрентно интересует для версии FreeType 2.11.1.

Готовую библиотеку что-то навскидку найти не удалось.

Пробовал собирать на месте. Обычную для Linux и g++ без проблем. А для mingw32

В файле INSTALL.GNU говориться заменить config.mk на w32-mingw32.mk из freetype-2.11.1/builds/windows/ Но это ничего не дает:

make CC="x86_64-w64-mingw32-c++"
Вывод:
make: type: Command not found
make: *** No rule to make target '.\src\tools\apinames.c', needed by '.\objs\apinames.exe'.  Stop.

PS Т.е. я правильно понимаю что для того чтобы получить библиотеку (которую можно будет кинуть в /usr/x86_64-w64-mingw32/lib/ и далее использовать для др. проектов для Windows) необходимо собрать исходники FreeType компилятором mingw32?

 

Gyros
()

Cmake, mingw32 и сборка под Ubuntu для получения exe-файла

Форум — Development

Добрый день всем! Есть простенькое графическое приложение, которое без проблем собирается вызовом:

x86_64-w64-mingw32-c++  sailboat.c  -o sailboat.exe  -lglfw3dll -lglfw3 -static-libgcc -static-libstdc++  -lopengl32  -Wl,--subsystem,windows
На выходе получаем exe-шник, который запускается под Windows (или Wine).

Однако, если использовать CMake:

cmake_minimum_required(VERSION 3.0)	# Проверка версии CMake.
					

set (PROJECT sailboat) 		        # Название проекта
project(${PROJECT})

set(OpenGL_GL_PREFERENCE LEGACY)
find_package(OpenGL REQUIRED)
find_package(glfw3  REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})


find_library(PTHREAD_LIB pthread)

                                   # Установка переменной со списком исходников для исполняемого файла
#set (SOURCES  gl_core_4_3.c)
#set (HEADERS  gl_core_4_3.h)
set (LIBS ${LIBS} ${OPENGL_LIBRARY} ${GLFW_LIBRARIES} )


set (MINGW=ON)
set (CMAKE_SYSTEM_NAME=Windows)
#set_target_properties (${PROJECT} PROPERTIES CMAKE_WIN32_EXECUTABLE True)

set( CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "" )
set( CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "" )

set (BUILD_SHARED_LIBS=OFF)
set (BUILD_CLAR=OFF)
set (THREADSAFE=ON)

set (CMAKE_C_COMPILER   /usr/bin/x86_64-w64-mingw32-c++)
set (CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-c++)

set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -static")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")

set(CMAKE_LIBRARY_PATH /usr/x86_64-w64-mingw32/lib)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--subsystem,windows")


add_executable (${PROJECT} WIN32 ${HEADERS} ${SOURCES} sailboat.c)    # Создает исполняемый файл с именем PROJECT

set_target_properties (${PROJECT} PROPERTIES LINK_FLAGS_DEBUG   "/SUBSYSTEM:windows")
set_target_properties (${PROJECT} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:windows")       

#set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++ -lglfw3dll")

target_include_directories(${PROJECT} PUBLIC
                           $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
                           $<INSTALL_INTERFACE:include>)


				  # Линковка программы с библиотеками
#target_link_libraries( PUBLIC glfw  ${PTHREAD_LIB} )
target_link_libraries(${PROJECT} PUBLIC ${OPENGL_gl_LIBRARY} glfw)
то происходит такая вещь:

[ 50%] Linking C executable sailboat
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lGL
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lrt
/usr/bin/x86_64-w64-mingw32-ld: cannot find -ldl
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lX11
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/sailboat.dir/build.make:89: sailboat] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/sailboat.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

Вообще-то линкер не должен требовать этих библиотек для сборки для Windows. В чем причина?

PS Извините, я новичок в CMake, поэтому CMakeLists.txt такой сумбурный.

 

Gyros
()

RSS подписка на новые темы