Урок 3 - Вращающийся куб с текстурой (комментарии)
Это сообщение сгенерировано автоматически.
Функции snprintf() в <cstdio> нету, но она есть в <stdio.h> :)
А нормально сделать в common.h вот так:
#include <cstdio> #include <stdio.h> ...
?
Ещё 2 вопроса.
1) Зачем функции LoadFile в параметрах указатель на указатель (uint8_t **buffer)? Почему одного указателя не достаточно?
2) И почему мы при переключении в фулскрин изменяем разрешение экрана? Может было бы лучше просто растягивать окно на весь экран? Так переключение будет происходить более красиво и на широкоформатниках не будет ограниченного квадратика с чёрными полосами слева и справа.
===
А, ещё не понятно, почему мы грузим шейдер, как binary? Он же, вроде, в текстовом формате?
Pixar
> Ещё 2 вопроса.
> 1) Зачем функции LoadFile в параметрах указатель на указатель (uint8_t
> **buffer)? Почему одного указателя не достаточно?
В этой функции под буфер выделяется место посредство new, поэтому указатель на указатель.
> 2) И почему мы при переключении в фулскрин изменяем разрешение экрана? Может
> было бы лучше просто растягивать окно на весь экран? Так переключение будет
> происходить более красиво и на широкоформатниках не будет ограниченного
> квадратика с чёрными полосами слева и справа.
Потому что, если вы не заметили, обработчика изменения размеров окна нету, добавить их несложно, но для урока я пока не стал этого делать.
> А, ещё не понятно, почему мы грузим шейдер, как binary? Он же, вроде, в
> текстовом формате?
Компилятору на самом деле все равно, поэтому грузим как есть, "в сыром виде" так сказать. Но можно и в текстовом грузить, разницы никакой быть не должно.
KpeHDeJIb
> В этой функции под буфер выделяется место посредство new, поэтому указатель на указатель.
Всмысле это ты так для себя для удобства делаешь?
Я лично один указатель использую в любом случае...
Спасибо за ответы!
С первым вопросом я почти разобрался. В VisualC++ функция, оказывается, называется по-другому - sprintf_s :).
Теперь такой вопрос. Почему функции snprintf() параметр size передаётся равным 0xFF, а размер буфера равен 0x100? Он ведь, по идее, скопирует на 1 меньше, чем size и в конец добавит '\0"?
Executor
> Я лично один указатель использую в любом случае...
Я тебя видимо не понимаю, вот попробуй это, результат очевиден:
#include <stdio.h> void foo(char *buffer) { buffer = new char [1024]; } void bar( char **buffer) { *buffer = new char [1024]; } int main( ) { char *buffer = NULL; foo( buffer); printf( "buffer = %p\n", buffer); bar( &buffer); printf( "buffer = %p\n", buffer); return 0; }
Pixar
> Теперь такой вопрос. Почему функции snprintf() параметр size передаётся равным
> 0xFF, а размер буфера равен 0x100? Он ведь, по идее, скопирует на 1 меньше, чем
> size и в конец добавит '\0"?
Это у меня плохие воспоминания о всяких strncpy видимо, вообще сама функция добавляет \0 в конец, ты прав.
KpeHDeJIb
> Я тебя видимо не понимаю, вот попробуй это, результат очевиден:
Это я не понял просто о чём речь... Теперь понятно...
bool InputIsKeyDown(uint8_t key) { return ( g_input.keyState[key] != 0); } bool InputIsKeyPressed( uint8_t key) { bool pressed = ( g_input.keyState[key] == INPUT_PRESSED); g_input.keyState[key] = INPUT_DOWN; return pressed; }
Не понимаю, что делает "INPUT_DOWN". Вроде бы достаточно, чтобы событие нажатия клавиши фиксировалось с помощью INPUT_PRESSED, а при отпускании клавиши - с помощью INPUT_UP.
KpeHDeJIb
> В этой функции под буфер выделяется место посредством new, поэтому указатель на
> указатель.
Таким же образом выделяю память через - указатель на указатель.
И мне интересно стало, а такой метод он безопасен с точки зрения утечек памяти?
Кто и когда будет освобождать выделенную память, если это вообще происходит, после того как необходимость в ней отпала?)
При выходе из main’a для char *buffer crt-runtime вызовет delete[]?
.Pixel
> Таким же образом выделяю память через - указатель на указатель.
> И мне интересно стало, а такой метод он безопасен с точки зрения утечек
> памяти?
> Кто и когда будет освобождать выделенную память, если это вообще происходит,
> после того как необходимость в ней отпала?)
>
> При выходе из main’a для char *buffer crt-runtime вызовет delete[]?
Ну указатель на указатель там в силу необходимости, если ты про это, по другому можно сделать только вернув указатель на выделенную память, но когда больше одного параметра надо возвращать (а помимо буфера надо и его размер вернуть), то я предпочитаю не использовать возвращаемое значение функции, чтобы не путаться.
Память освобождается после того как она больше не нужна, т.е. в данном случае я загружаю файл, загружаю его данные в шойдер, и после этого можно освободить память (так в примере и делается).
CRT никогда сам для твоих new не вызовет delete, для каких-то своих вызывает, для твоих - нет.
KpeHDeJIb
А мой вопрос? =)
Pixar
> Не понимаю, что делает "INPUT_DOWN". Вроде бы достаточно, чтобы событие нажатия
> клавиши фиксировалось с помощью INPUT_PRESSED, а при отпускании клавиши - с
> помощью INPUT_UP.
У клавиши три состояния по сути, DOWN - нажата и держится, PRESSED - нажата и отпущена, UP - не нажата. А у меня эмуляция этого, чтобы нажатие не происходило постоянно у клавиши пока ее держат, ставится DOWN - т.е. нажата уже какое-то время, PRESSED - нажата только что. PRESSED полезен для одноразового срабатывания (например Пробел или Ввод единоразово), а DOWN для продолжительного действия, например движение вперед :)
Исправьте
void Matrix4Translation(Matrix4 M, float x, float y, float z) и void Matrix4Mul( Matrix4 M, Matrix4 A, Matrix4 B)
На
void Matrix4Translation(Matrix4& M, float x, float y, float z) и void Matrix4Mul( Matrix4& M, const Matrix4& A, const Matrix4& B)
Без ссылок работать не будет...
Кукурузо!
Тип Matrix4 определен как:
typedef float Matrix4[16];
И вобщем-то передается указатель, а на классы переделано в более поздних уроках, там уже другие функции.
Тема в архиве.