Blob Blame Raw
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<title>Текстуры и анимация - Helianthus</title>
</head>
<body>
<div class="navigation">
  <p><a href="https://coolbug.org/users/bw/helianthus/ru.html">Helianthus</a></p>
  <hr />
  <p><a href="index.html">Helianthus: Документация</a></p>
  <p><a href="install.html">Установка</a></p>
  <p><a href="common.html">Запуск и общие функции</a></p>
  <p><a href="input.html">Клавиатура и мышь</a></p>
  <p><a href="drawing.html">Рисование</a></p>
  <p><a href="font.html">Шрифты и текст</a></p>
  <p><a href="animation.html">Текстуры и анимация</a></p>
  <p><a href="framebuffer.html">Буфер кадра</a></p>
  <p><a href="sprites.html">Спрайты</a></p>
  <p><a href="groups.html">Группы спрайтов</a></p>
  <p><a href="sound.html">Звук</a></p>
  <p><a href="ui.html">Пользовательский интерфейс</a></p>
  <hr />
  <p><a href="functions.html">Все функции</a></p>
</div>
<div class="content">

<h1>Текстуры и анимация</h1>

<p>Библиотека Helianthus позволяет вам загружать и использовать в ваших программах различные изображения (текстуры) из файлов PNG. Также вы можете использовать анимированные текстуры — для создания анимации нужно все кадры в формате PNG разместить в одной папке и указать эту папку в качестве имени файла для загрузки. Для вашего удобства и сокращения количества используемых функций и одиночная текстура и анимация представлены в Helianthus в качестве одного и того же типа объектов — это всё анимации. Просто для одиночной текстуры количество кадров анимации равно одному. Количество кадров для загруженной анимации можно узнать при помощи функции <a href="animation.html#animationGetFramesCount">animationGetFramesCount</a>.</p>

<p>Чтобы загрузить текстуру используйте функцию <a href="animation.html#createAnimation">createAnimation</a>, которая возвращает значение типа <i>Animation</i>, которое по сути является адресом в памяти — указателем на описание текстуры внутри библиотеки Helianthus. Библиотека запоминает пути к загружаемым файлам, и, в случае многократной загрузки одного и того же файла не расходует лишнюю память, а работает лишь с одной копией изображения. Это изображение будет выгружено из памяти в тот момент когда будет удалена (<a href="animation.html#animationDestroy">animationDestroy</a>) последняя использующая его анимация.</p>

<p>Помимо загрузки анимации из папки вы можете скомпоновать анимацию из отдельных кадров при помощи функций <a href="animation.html#createAnimationEmpty">createAnimationEmpty</a>, <a href="animation.html#animationInsert">animationInsert</a>, <a href="animation.html#animationRemove">animationRemove</a>, <a href="animation.html#animationClear">animationClear</a>.</p>

<p>Анимация загружается установленной на паузу — то есть по-умолчанию она не воспроизводится. Запустить воспроизведение можно функцией <a href="animation.html#animationPlay">animationPlay</a>, снова поставить на паузу — <a href="animation.html#animationPause">animationPause</a>. Кроме того анимация по-умолчанию зациклена, то есть когда она проиграет до конца — она сразу же начинается сначала. Вы можете это изменить используя функцию <a href="animation.html#animationSetLoop">animationSetLoop</a>.</p>

<p>Ещё один важный параметр анимации это скорость её воспроизведения. По-умолчанию она равна общей частоте перерисовки кадров (см. <a href="common.html#windowSetFrameRate">windowSetFrameRate</a>), но если задан диапазон частоты — переменная частота кадров (<a href="common.html#windowSetFrameRateEx">windowSetFrameRateEx</a>), то берётся значение из этого диапазона ближайшее к 24 кадрам в секунду. Если вас это не устраивает, задайте свою частоту смены кадров функцией <a href="animation.html#animationSetFps">animationSetFps</a>.</p>

<p>Вы можете и вручную управлять воспроизведением анимации — используйте функции <a href="animation.html#animationNextFrame">animationNextFrame</a>, <a href="animation.html#animationSetFrame">animationSetFrame</a>, <a href="animation.html#animationAddTime">animationAddTime</a> и <a href="animation.html#animationSetPos">animationSetPos</a>.</p>

<p>Текстуры и анимации описанные выше — это уже загруженные на видеокарту данные и читать или менять пиксели в них нельзя. Для того чтобы работать с пикселями напрямую вам  нужно загрузить их в оперативную память из файла — <a href="animation.html#imageLoad">imageLoad</a>, из текстуры — <a href="animation.html#imageFromGLTexture">imageFromGLTexture</a> и <a href="animation.html#animationGetGLTexId">animationGetGLTexId</a> или из пикселей на экране — <a href="animation.html#imageFromViewport">imageFromViewport</a>.</p>

<p>В отличие от анимации данные изображения не сгруппированы в структуру, а представлены в виде трёх отдельных переменных: ширина изображения, высота изображения и указатель на данные — массив пикселей. Данные это простая последовательность байтов — пикселив них записаны по строкам сверху вниз слева направо. Каждый пиксель — это четыре байта в формате RGBA — красный, зелёный, синий и непрозрачность (alpha). Для хранения этих данных выделяется оперативная память и прежде чем закончить с ними работу и забыть нужно эту память освободить функцией <i>free</i> из стандартного модуля <i>&lt;stdlib.h&gt;</i>. Сложновато? Да. Но ведь это низкоуровневые функции и прибегать к ним вам придётся только в редких случаях — если вам не хватило базового функционала.</p>

<p>Читать и записывать отдельные пиксели можно либо вручную высчитав номера отдельных байтов или при помощи функций <a href="animation.html#imageGetPixel">imageGetPixel</a>, <a href="animation.html#imageSetPixel">imageSetPixel</a> — которые сделают эти вычисления за вас.</p>

<p>Полученное изображение можно сохранить в файл — <a href="animation.html#imageSave">imageSave</a>, отправить на видеокарту в виде текстуры OpenGL — <a href="animation.html#imageToGLTexture">imageToGLTexture</a> или создать из изображения однокадровую анимацию — <a href="animation.html#createAnimationFromImage">createAnimationFromImage</a>.</p>

<p>Вот пример работы с изображениями:</p>
<pre>

// Все три переменные представленные ниже
// необходимы для работы с одним единственным изображением.
// Если вы захотите работать одновременно с двумя изображениями,
// то вам придётся завести дополнительную
// тройку аналогичных переменных.
int width = 0, height = 0; // Сюда будут записаны
                           // ширина и высота изображения.
void *data = NULL;         // Это указатель на данные изображения,
                           // пока он указывает в никуда.

// Попытаемся загрузить изображения
// будьте готовы к тому, что это не всегда удастся -
// вдруг кто-то удалит файл, например.
if (imageLoad("image.png", &width, &height, &data)) {
    // Ура! Файл существует и нам даже удалось его загрузить.
    // Поставим синий пиксель в координатах 10, 2.
    // Если, конечно, в загруженном изображении
    // есть эти координаты.
    if (width &gt; 10 && height &gt; 2)
        imageSetPixel(data, 10, 2, colorByName("blue"));
    
    // Сохраним изображение в другой файлы
    // будьте осторожны если такой файл уже существует,
    // то он будет перезапиан!
    imageSave("image2.png", width, heigh, data);
    
    // Мы закончили работу с изображением -
    // нужно освободить выделенную для его данных память.
    free(data);
    
    // Обнулим указатель на данные. Это необязательно,
    // просто на всякий случай. Это немножко защитит нас
    // от наших ошибок. Если мы вдруг попытаемся использовать
    // нулевой указатель, то в большинстве случаев увидим
    // явную ошибку и её источник. И сможем её исправить.
    // Использование же ненулевого указателя на уже
    // освобождённую память приведёт к совершенно
    // не предсказуемым ошибкам в совсем других
    // частях программы.
    data = NULL;
} else {
    // Не удалось загрузить изображение,
    // возможно файла нет или он есть, но повреждён,
    // или ещё что-то случилось.
    // Сообщим-ка пользователю об этой проблеме.
    printf("Ничего не получилось, увы :(");
}

</pre>

<p>Есть ещё несколько функций, которые могут вас заинтересовать — создание однокадровой анимации прямо из пикселей экрана или буфера кадра: <a href="animation.html#createAnimationFromViewport">createAnimationFromViewport</a>, <a href="animation.html#createAnimationFromFramebuffer">createAnimationFromFramebuffer</a>. Сохранить снимок экрана (окна программы) в файл — <a href="animation.html#viewportSave">viewportSave</a>.</p>

<h2>Функции:</h2>

<h3 id="createAnimation">Animation createAnimation(const char *path);</h3>

<p>Загрузить текстуру из файла PNG или цепочку кадров в формате PNG из папки. Эквивалентно вызову <a href="animation.html#createAnimationEx">createAnimationEx</a>. со включенным сглаживанием (<i>smooth</i>) и отключенными повторами (<i>horWrap</i>, <i>vertWrap</i>).</p>

<h4>Параметры:</h4>

<p><i>path</i> — путь к файлу или папке.</p>

<h3 id="createAnimationEx">Animation createAnimationEx(const char *path, int smooth, int horWrap, int vertWrap);</h3>

<p>Загрузить текстуру из файла PNG или цепочку кадров анимации в формате PNG из папки.</p>

<p>Если в качестве пути указана папка, из неё будут загружены все изображения и отсортированы в алфавитном порядке. Частота кадров для вновь созданной анимации будет равна частоте перерисовки экрана (<a href="common.html#windowSetFrameRate">windowSetFrameRate</a>). Если задан диапазон частоты (<a href="common.html#windowSetFrameRateEx">windowSetFrameRateEx</a>), то из этого диапазона будет выбрана частота ближайшая к 24-м кадрам в секунду.</p>

<p>Если файл не удалось загрузить файл(ы), то функция вернёт анимацию с нулевым количеством кадров.</p>

<p>Helianthus запоминает пути к загружаемым файлам, и, в случае многократной загрузки одного и того же файла не расходует лишнюю память, а работает лишь с одной копией изображения. Это изображение будет выгружено из памяти в тот момент когда будет удалена (<a href="animation.html#animationDestroy">animationDestroy</a>) последняя использующая его анимация.</p>

<p>Если параметр <i>smooth</i> равен <i>TRUE</i>, то загруженная текстура будет отображаться сглаженной — вы не увидите резких переходов между пикселями (трилинейная фильтрация).</p>

<p>Параметры <i>horWrap</i> и <i>vertWrap</i> включают (<i>TRUE</i>) или выключают (<i>FALSE</i>) бесконечное повторение узора текстуры по горизонтали и вертикали соответственно.</p>

<p>См. также <a href="animation.html#createAnimation">createAnimation</a>, <a href="animation.html#createAnimationFromImage">createAnimationFromImage</a>, <a href="animation.html#createAnimationFromViewport">createAnimationFromViewport</a>, <a href="animation.html#createAnimationFromGLTexId">createAnimationFromGLTexId</a>, <a href="animation.html#createAnimationEmpty">createAnimationEmpty</a>, <a href="animation.html#animationClone">animationClone</a>.</p>

<h4>Параметры:</h4>

<p><i>path</i> — путь к файлу или папке;<br />
<i>smooth</i> — включить сглаживание (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>horWrap</i> — включить бесконечное повторение узора текстуры по горизонтали (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>vertWrap</i> — включить бесконечное повторение узора текстуры по горизонтали (<i>TRUE</i> или <i>FALSE</i>).</p>

<h3 id="createAnimationFromGLTexId">Animation createAnimationFromGLTexId(unsigned int texid);</h3>

<p>Создать однокадровую анимацию из текстуры OpenGL. Будьте внимательны, не удаляйте текстуру из OpenGL (<i>glDeteteTextures</i>) до тех пор пока существует хотя бы одна анимация её использующая. И более того анимация при своём удалении сама удалит эту текстуру из OpenGL. Если вы создали несколько анимаций с одной и той же текстурой, то текстура будет удалена при удалении последней использующей её анимации. Вы можете отключить автоматическое удаление текстуры обратившись к функции <a href="animation.html#animationGLTexIdSetOwnership">animationGLTexIdSetOwnership</a>.</p>

<p>Настройки повторения узора текстуры и сглаживания уже содержатся в текстуре OpenGL.</p>

<p>См.также <a href="animation.html#animationGetGLTexId">animationGetGLTexId</a>.</p>

<h4>Параметры:</h4>

<p><i>texid</i> — идентификатор текстуры из OpenGL.</p>

<h3 id="createAnimationFromImage">Animation createAnimationFromImage(int width, int height, const void *pixels, int wrap);</h3>

<p>Создать однокадровую анимацию из изображения в памяти. Пиксели должны идти один за другим по строкам сверху вниз, слева на право. По 4 байта на пиксель, по одному байту на каждый из каналов: красный, зелёный, синий, альфа каналы, именно в таком порядке. При загрузке создаётся копия текстуры в видеопамяти, и исходные данные больше не требуются, их можно выгрузить из памяти.</p>

<p>Текстура загружается со включенным сглаживанием (<i>smooth</i>). См. также <a href="animation.html#createAnimationFromImageEx">createAnimationFromImageEx</a>, <a href="animation.html#createAnimationEx">createAnimationEx</a>, <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>width</i> — ширина изображения;<br />
<i>height</i> — высота изображения;<br />
<i>pixels</i> — указатель на первый байт первого пикселя в формате RGBA32;<br />
<i>wrap</i> — включить бесконечное повторение узора текстуры во всех направлениях (<i>TRUE</i> или <i>FALSE</i>).</p>

<h3 id="createAnimationFromImageEx">Animation createAnimationFromImageEx(int width, int height, const void *pixels, int horWrap, int vertWrap, int smooth, int mipMap);</h3>

<p>Создать однокадровую анимацию из изображения в памяти. Пиксели должны идти один за другим по строкам сверху вниз, слева на право. По 4 байта на пиксель, по одному байту на каждый из каналов: красный, зелёный, синий, альфа каналы, именно в таком порядке. При загрузке создаётся копия текстуры в видеопамяти, и исходные данные больше не требуются, их можно выгрузить из памяти.</p>

<p>Вы можете включить или выключить бесконечное повторение узора текстуры по горизонтали и/или вертикали (параметры <i>horWrap</i> и <i>vertWrap</i> соответственно).</p>

<p>Также вы можете включить сглаживание пикселей изображения (<i>smooth</i>) и включить построение mip-уровней (<i>mipMap</i>). Если вы пока не знаете, что такое mip-уровни, то просто включайте их всегда, когда нужно сглаживание и выключайте, когда сглаживание не нужно. Если же вы не знаете требуется или нет вам сглаживание текстуры, то ответ один — требуется — включайте и сглаживание и mip-уровни.</p>

<p>См. также <a href="animation.html#createAnimationFromImage">createAnimationFromImage</a>, <a href="animation.html#createAnimationFromImageEx">createAnimationFromImageEx</a>, <a href="animation.html#createAnimationEx">createAnimationEx</a>, <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>width</i> — ширина изображения;<br />
<i>height</i> — высота изображения;<br />
<i>pixels</i> — указатель на первый байт первого пикселя в формате RGBA32;<br />
<i>horW</i><i>rap</i> — включить бесконечное повторение узора текстуры по горизонтали (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>vertW</i><i>rap</i> — включить бесконечное повторение узора текстуры по вертикали (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>smooth</i> — включить сглаживание (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>mipMap</i> — включить построение mip-уровней (<i>TRUE</i> или <i>FALSE</i>).</p>

<h3 id="createAnimationFromFramebuffer">Animation createAnimationFromFramebuffer(Framebuffer framebuffer);</h3>

<p>Создать новую динамическую текстуру связанную с заданным буфером кадра. Содержимое этой текстуры будет изменяться всякий раз когда вы рисуете в этом буфере кадра. Мгновенно, без каких либо дополнительных затрат на копирование. Дополнительную информацию смотрите в разделе <a href="framebuffer.html" />«Буфер кадра»</a>.</p>

<p>Не удаляйте буфер кадра пока не удалите все связанные с ним анимации.</p>

<p>Если вам нужно зафиксировать именно копию текущего состояния буфера кадра, то используйте функцию <a href="animation.html#createAnimationFromViewport">createAnimationFromViewport</a> в сочетании с функцией <a href="framebuffer.html#target">target</a>.</p>

<h4>Параметры:</h4>

<p><i>framebuffer</i> — буфер кадра.</p>

<h3 id="createAnimationFromViewport">Animation createAnimationFromViewport();</h3>

<p>Создать новую текстуру (однокадровую анимацию) скопировав изображение с экрана.</p>

<p>Если точнее — из текущей области вывода OpenGL (<i>glViewport</i>) — обычно это и есть вся площадь окна. Но если вы переключили буфер кадра функцией <a href="framebuffer.html#target">target</a>, то текстура будет взята из этого буфера кадра.</p>

<p>Текстура создаётся с выключенным повтором узора, но со включенным сглаживанием и mip-уровнями.</p>

<p>См. также <a href="animation.html#createAnimationFromViewportEx">createAnimationFromViewportEx</a>, <a href="animation.html#createAnimationFromFramebuffer">createAnimationFromFramebuffer</a>, <a href="framebuffer.html#viewportByWindow">viewportByWindow</a>, <a href="framebuffer.html#viewportByFramebuffer">viewportByFramebuffer</a> и раздел <a href="framebuffer.html" />«Буфер кадра»</a>.</p>

<h3 id="createAnimationFromViewportEx">Animation createAnimationFromViewportEx(int horWrap, int vertWrap, int smooth, int mipMap);</h3>

<p>Функция работает аналогично функции <a href="animation.html#createAnimationFromViewport">createAnimationFromViewport</a>, но позволяет вам задать повторения узора текстуры по горизонтали и/или вертикали (параметры <i>horWrap</i>, <i>vertWrap</i>) и включить или выключить сглаживание (<i>smooth</i>) и mip-уровни. Подробнее обо всех этих параметрах смотрите в описании функции <a href="animation.html#createAnimationFromImageEx">createAnimationFromImageEx</a>.</p>

<h4>Параметры:</h4>

<p><i>horW</i><i>rap</i> — включить бесконечное повторение узора текстуры по горизонтали (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>vertW</i><i>rap</i> — включить бесконечное повторение узора текстуры по вертикали (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>smooth</i> — включить сглаживание (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>mipMap</i> — включить построение mip-уровней (<i>TRUE</i> или <i>FALSE</i>).</p>

<h3 id="createAnimationEmpty">Animation createAnimationEmpty();</h3>

<p>Создать пустую анимацию — анимацию с нулевым количеством кадров. См. также <a href="animation.html#animationInsert">animationInsert</a>.</p>

<h3 id="animationDestroy">void animationDestroy(Animation animation);</h3>

<p>Удалить анимацию.</p>

<p><b>Важно:</b> Скорее всего у вас в программе останется переменная в которой хранился указатель на анимацию. Этот указатель станет недействителен — будет указывать на неопределённую область памяти — не на анимацию, анимацию уже удалена. Вы можете занести в эту переменную другую анимацию, но использовать старое значение переменной больше нельзя это приведёт к ошибкам и непредсказуемому поведению программы.</p>

<h3 id="animationClone">Animation animationClone(Animation animation);</h3>

<p>Создать копию анимации, которая будет иметь собственные параметрами позиции воспроизведения и частоты кадров. Функция не размножает копии изображений в оперативной памяти — все клоны ссылаются на одни те же изображения. Библиотека Helianthus контролирует сколько анимаций используют конкретный кадр в данный момент времени и выгружают этот кадр из памяти только тогда, когда удалена последняя анимация его использовавшая.</p>

<p>См.также <a href="animation.html#animationCloneEx">animationCloneEx</a>, <a href="animation.html#animationInsert">animationInsert</a>.</p>

<h3 id="animationCloneEx">Animation animationCloneEx(Animation animation, int start, int count);</h3>

<p>Создать копию анимации, которая будет иметь собственные параметрами позиции воспроизведения и частоты кадров. При помощи параметров <i>start</i> и <i>count</i> вы выбираете какие именно кадры из заданной анимации будут скопированы в новую анимацию. См. также <a href="animation.html#animationClone">animationClone</a>, <a href="animation.html#animationInsert">animationInsert</a>.</p>

<h4>Параметры:</h4>

<p><i>start</i> — порядковый номер кадра с которого нужно начать копирование (нумерация от нуля);<br />
<i>count</i> — количество кадров, которое нужно скопировать.</p>

<h3 id="animationGetGLTexId">unsigned int animationGetGLTexId(Animation animation);</h3>

<p>Функция возвращает внутренний идентификатор текстуры OpenGL для текущего кадра анимации. См.также <a href="animation.html#animationGetFrameGLTexId">animationGetFrameGLTexId</a>, <a href="animation.html#animationGetFrame">animationGetFrame</a>, <a href="animation.html#createAnimationFromGLTexId">createAnimationFromGLTexId</a>.</p>

<h3 id="animationGetFrameGLTexId">unsigned int animationGetFrameGLTexId(Animation animation, int frame);</h3>

<p>Функция возвращает внутренний идентификатор текстуры OpenGL для заданного кадра анимации. См.также <a href="animation.html#animationGetGLTexId">animationGetGLTexId</a>, <a href="animation.html#createAnimationFromGLTexId">createAnimationFromGLTexId</a>.</p>

<h4>Параметры:</h4>

<p><i>frame</i> — порядковый номер кадра с для которого нужно получить идентификатор (нумерация от нуля);</p>

<h3 id="animationGLTexIdSetOwnership">void animationGLTexIdSetOwnership(unsigned int texid, int own);</h3>

<p>Функция задаёт правила удаления текстуры с заданным идентификатором из OpenGL. Определяет кто является владельцем текстуры — библиотека Helianthus или ваша собственная программа. Если текстурой владеет Helianthus (own — TRUE), то текстуру из OpenGL удалит Helianthus сам в том момент когда ни одна анимация больше не будет на неё ссылаться. В противном случае вы сами должны позаботиться об удалении текстуры, проконтролировав при этом, что ни одна анимация больше эту текстуру не использует.</p>

<p>Используйте эту функцию если, например, вы не хотите чтобы Helianthus удалил из памяти вашу собственную текстуру, которую вы ему передали через функцию  <a href="animation.html#createAnimationFromGLTexId">createAnimationFromGLTexId</a>.</p>

<h4>Параметры:</h4>

<p>texid — внутренный идентификатор текстуры OpenGL;<br />
own — если <i>TRUE</i>, то об удалении текстуры из видео-памяти позаботится Helianthus, если <i>FALSE</i>, то удалить текстуру должена будет ваша программа.</p>

<h3 id="animationGetFramesCount">int animationGetFramesCount(Animation animation);</h3>

<p>Возвращает количество кадров в данной анимации.</p>

<h3 id="animationInsert">void animationInsert(Animation animation, int index, Animation other);</h3>

<p>Вставить все кадры из анимации <i>other</i> в заданную анимацию, таким образом, что бы вновь вставленные кадры начинались с номера <i>index</i>.</p>

<p>Функция не затирает старые кадры, а вставляет новые прямо в середину анимации, сдвигая при этом последние кадры.</p>

<p>См. также <a href="animation.html#animationInsertEx">animationInsertEx</a>, <a href="animation.html#animationCloneEx">animationCloneEx</a>.</p>

<h4>Параметры:</h4>

<p><i>index</i> — определяет место (номер кадра, нумерация от нуля) в текущей анимации куда нужно вставить новые кадры;<br />
<i>other</i> — другая анимация кадры из которой нужно вставить в текущую.</p>

<h3 id="animationInsertEx">void animationInsertEx(Animation animation, int index, Animation other, int start, int count);</h3>

<p>Вставить некоторое количество подряд идущих кадров из анимации <i>other</i> в заданную анимацию, таким образом, что бы вновь вставленные кадры начинались с номера <i>index</i>.</p>

<p>Функция не затирает старые кадры, а вставляет новые прямо в середину анимации, сдвигая при этом последние кадры.</p>

<p>См. также <a href="animation.html#animationInsert">animationInsert</a>, <a href="animation.html#animationCloneEx">animationCloneEx</a>.</p>

<h4>Параметры:</h4>

<p><i>index</i> — определяет место (номер кадра, нумерация от нуля) в текущей анимации куда нужно вставить новые кадры;<br />
<i>other</i> — другая анимация кадры из которой нужно вставить в текущую;<br />
<i>start</i> — номер вставляемого первого кадра из <i>другой</i> анимации;<br />
<i>count</i> — количество кадров для вставки.</p>

<h3 id="animationRemove">void animationRemove(Animation animation, int start, int count);</h3>

<p>Удалить некоторое количество (count) кадров из анимации начиная с кадра номер start.<br />
См. также <a href="animation.html#animationInsert">animationInsert</a>, <a href="animation.html#animationClear">animationClear</a>.</p>

<h4>Параметры:</h4>

<p><i>start</i> — номер первого удаляемого кадра (нумерация с нуля);<br />
<i>count</i> — количество кадров для вставки.</p>

<h3 id="animationClear">void animationClear(Animation animation);</h3>

<p>Удалить все кадры из анимации. См. также <a href="animation.html#animationRemove">animationRemove</a>, <a href="animation.html#animationInsert">animationInsert</a>, <a href="animation.html#createAnimationEmpty">createAnimationEmpty</a>.</p>

<h3 id="animationGetFps">double animationGetFps(Animation animation);</h3>

<p>Возвращает скорость воспроизведения анимации в кадрах в секунду. См. также <a href="animation.html#animationSetFps">animationSetFps</a>, <a href="animation.html#animationPlay">animationPlay</a>.</p>

<h3 id="animationSetFps">void animationSetFps(Animation animation, double fps);</h3>

<p>Устанавливает скорость воспроизведения анимации в кадрах в секунду. См. также <a href="animation.html#animationGetFps">animationGetFps</a>, <a href="animation.html#animationPlay">animationPlay</a>.</p>

<h3 id="animationIsPlaying">int animationIsPlaying(Animation animation);</h3>

<p>Возвращает <i>TRUE</i> если воспроизведение в данный момент включено и <i>FALSE</i> если выключено. См. также <a href="animation.html#animationPlay">animationPlay</a>, <a href="animation.html#animationPause">animationPause</a>.</p>

<h3 id="animationPlay">void animationPlay(Animation animation);</h3>

<p>Включает воспроизведение анимации. Внутренний счётчик времени будет автоматически обновляться библиотекой Helianthus между вызовами функции перерисовки кадра (<a href="common.html#windowSetDraw">windowSetDraw</a>).</p>

<p>Если вы хотите управлять анимацией вручную, то не вызывайте эту функцию, а воспользуйтесь функциями <a href="animation.html#animationAddTime">animationAddTime</a>, <a href="animation.html#animationSetPos">animationSetPos</a>, <a href="animation.html#animationNextFrame">animationNextFrame</a>, <a href="animation.html#animationSetFrame">animationSetFrame</a>.</p>

<p>См. также <a href="animation.html#animationPause">animationPause</a>, <a href="animation.html#animationIsPlaying">animationIsPlaying</a>, <a href="animation.html#animationSetFps">animationSetFps</a>, <a href="animation.html#animationSetLoop">animationSetLoop</a>.</p>

<h3 id="animationPause">void animationPause(Animation animation);</h3>

<p>Остановить воспроизведение анимации. См. также <a href="animation.html#animationPlay">animationPlay</a>, <a href="animation.html#animationIsPlaying">animationIsPlaying</a>.</p>

<h3 id="animationAddTime">void animationAddTime(Animation animation, double time);</h3>

<p>Увеличить позицию анимации на время <i>time</i> (в секундах). См. также <a href="animation.html#animationPlay">animationPlay</a>, <a href="animation.html#animationSetLoop">animationSetLoop</a>, <a href="animation.html#animationSetPos">animationSetPos</a>, <a href="animation.html#animationNextFrame">animationNextFrame</a>, <a href="animation.html#animationSetFrame">animationSetFrame</a>.</p>

<h3 id="animationGetLoop">int animationGetLoop(Animation animation);</h3>

<p>Возвращает <i>TRUE</i> если анимация зациклена и <i>FALSE</i> если нет. См. также <a href="animation.html#animationSetLoop">animationSetLoop</a>.</p>

<h3 id="animationSetLoop">void animationSetLoop(Animation animation, int loop);</h3>

<p>Функция включает (<i>loop</i> - <i>TRUE</i>) и отключает (<i>loop</i> - <i>FALSE</i>) циклическое воспроизведение анимации, когда анимация повторяется снова и снова, вместо того чтобы остановиться на последнем кадре. См. также <a href="animation.html#animationGetLoop">animationGetLoop</a>, <a href="animation.html#animationPlay">animationPlay</a>.</p>

<h3 id="animationGetPos">double animationGetPos(Animation animation);</h3>

<p>Возвращает текущую позицию анимации в секундах. См. также <a href="animation.html#animationSetPos">animationSetPos</a>.</p>

<h3 id="animationSetPos">void animationSetPos(Animation animation, double pos);</h3>

<p>Функция задаёт текущую позицию анимации в секундах. См. также <a href="animation.html#animationGetPos">animationGetPos</a>, <i>animationAdd</i><i>Time</i>, <a href="animation.html#animationSetFrame">animationSetFrame</a>, <a href="animation.html#animationPlay">animationPlay</a>.</p>

<h3 id="animationGetFrame">int animationGetFrame(Animation animation);</h3>

<p>Возвращает номер текущего кадра анимации, нумерация от нуля. См. также <a href="animation.html#animationSetFrame">animationSetFrame</a>.</p>

<h3 id="animationSetFrame">void animationSetFrame(Animation animation, int frame);</h3>

<p>Функция перематывает анимацию к кадру с заданным номером (нумерация от нуля). См. также <a href="animation.html#animationGetFrame">animationGetFrame</a>, <a href="animation.html#animationGetFramesCount">animationGetFramesCount</a>, <a href="animation.html#animationNextFrame">animationNextFrame</a>, <a href="animation.html#animationSetPos">animationSetPos</a>, <a href="animation.html#animationSetLoop">animationSetLoop</a>, <a href="animation.html#animationPlay">animationPlay</a>.</p>

<h3 id="animationNextFrame">void animationNextFrame(Animation animation);</h3>

<p>Переключает анимацию на следующий кадр. См. также <a href="animation.html#animationPlay">animationPlay</a>, <a href="animation.html#animationSetLoop">animationSetLoop</a>, <a href="animation.html#animationSetFrame">animationSetFrame</a>, <a href="animation.html#animationAddTime">animationAddTime</a>, <a href="animation.html#animationSetPos">animationSetPos</a>.</p>

<h3 id="imageLoad">int imageLoad(const char *path, int *outWidth, int *outHeight, unsigned char **outPixels);</h3>

<p>Функция загружает изображение из файла PNG. Возвращает <i>TRUE</i> если загрузка прошла успешно и <i>FALSE</i> если загрузить файл не удалось.</p>

<p>В результате загрузки в переменные по адресам <i>outWidth</i> и <i>outHeight</i> будут помещены соответственно ширина и высота картинки. В переменную по адресу <i>outPixels</i> будет помещён указатель на пиксели картинки. Пиксели записываются в формате <i>RGBA32</i> — для каждого пикселя последовательно идут 4 байта отвечающие за интенсивность каждой цветовой составляющей — красный, зелёный, синий, непрозрачность (<i>alpha</i>) — именно в таком порядке. Пиксели записаны по строкам сверху вниз, слева на право.</p>

<p>В работе с пикселями вам помогут функции <a href="animation.html#imageGetPixel">imageGetPixel</a>, <a href="animation.html#imageSetPixel">imageSetPixel</a>.</p>

<p>Функция, в случае успешной загрузки изображения, динамически выделяет память под пиксели, и, вам после использования нужно эту память освободить обратившись к стандартной функции <i>free</i>.</p>

<p>В случае если загрузка не удалась в качестве ширины и высоты будет записан ноль, в качестве указателя на пиксели будет записан нулевой указатель — <i>NULL</i>.</p>

<p>См. также <a href="animation.html#imageSave">imageSave</a>, <a href="animation.html#imageLoadFromMemory">imageLoadFromMemory</a>, <a href="animation.html#imageFromViewport">imageFromViewport</a>, <a href="animation.html#imageToGLTexture">imageToGLTexture</a>.</p>

<h4>Параметры:</h4>

<p><i>path</i> — путь к файлу изображения;<br />
<i>outWidth</i> — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;<br />
<i>outHeight</i> — указатель на переменную куда будет записана высота загруженного изображения в пикселях;<br />
<i>outPixels</i> — указатель на переменную куда будет записан указатель на массив пикселей изображения.</p>

<h3 id="imageLoadFromMemory">int imageLoadFromMemory(const void *data, int size, int *outWidth, int *outHeight, unsigned char **outPixels);</h3>

<p>Загрузить изображение из данных файла PNG ранее загруженных в оперативную память.</p>

<p>Эта функция может быть вам полезна если вы хотите хранить все ваши изображения прямо внутри исполняемого файла. Например, при помощи утилиты <i>xxd</i> (в Linux) или подобной ей для вашей операционной системы, вы можете сгенерировать файл на языке Си с массивом содержащим все байты файла изображения. Данная функция позволит вам распаковать изображения из этого массива и получить доступ к его пикселям.</p>

<p>Возвращает <i>TRUE</i> если загрузка прошла успешно и <i>FALSE</i> если распаковать изображение не удалось.</p>

<p>См. также <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>data</i> — указатель на первый байт данных PNG;<br />
<i>size</i> — количество байт данных PNG;<br />
<i>outWidth</i> — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;<br />
<i>outHeight</i> — указатель на переменную куда будет записана высота загруженного изображения в пикселях;<br />
<i>outPixels</i> — указатель на переменную куда будет записан указатель на массив пикселей изображения.</p>

<h3 id="imageSave">int imageSave(const char *path, int width, int height, const void *pixels);</h3>

<p>Функция сохраняет изображение в файл PNG по заданному пути. Возвращает <i>TRUE</i> при успешном сохранении и <i>FALSE</i> если сохранить изображение не удалось.</p>

<p>См. также <a href="animation.html#imageLoad">imageLoad</a>, <a href="animation.html#viewportSave">viewportSave</a>.</p>

<p><b>Важно:</b> Если файл по указанному пути уже существует, то он будет перезаписан. Вы может проверить существование файла функцией <a href="common.html#fileExists">fileExists</a>.</p>

<h4>Параметры:</h4>

<p><i>path</i> — путь к файлу в который нужно записать изображение;<br />
<i>w</i><i>idth</i> — ширина изображения в пикселях;<br />
<i>h</i><i>eight</i> — высота изображения в пикселях;<br />
<i>p</i><i>ixels</i> — указатель на массив пикселей изображения, формат смотрите в описании к функции <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h3 id="imageToGLTexture">unsigned int imageToGLTexture(int width, int height, const void *pixels, int wrap);</h3>

<p>Загрузить изображение в текстуру OpenGL. В случае успешной функция возвращает идентификатор текстуры OpenGL, и возвращает ноль если загрузка не удалась.</p>

<p>Во время загрузки создаётся копия данных изображения в видео-памяти и оригинальное изображение можно выгрузить из памяти.</p>

<p>См. также <a href="animation.html#imageToGLTextureEx">imageToGLTextureEx</a>, <a href="animation.html#imageToExistingGLTexture">imageToExistingGLTexture</a>, <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>w</i><i>idth</i> — ширина изображения в пикселях;<br />
<i>h</i><i>eight</i> — высота изображения в пикселях;<br />
<i>p</i><i>ixels</i> — указатель на массив пикселей изображения, формат смотрите в описании к функции <a href="animation.html#imageLoad">imageLoad</a>;<br />
<i>wrap</i> — если TRUE то узор текстуры будет повторяющимся по горизонтали и вертикали.</p>

<h3 id="imageToGLTextureEx">unsigned int imageToGLTextureEx(int width, int height, const void *pixels, int horWrap, int vertWrap, int smooth, int mipMap);</h3>

<p>Загрузить изображение в текстуру OpenGL. В случае успешной функция возвращает идентификатор текстуры OpenGL, и возвращает ноль если загрузка не удалась.</p>

<p>Во время загрузки создаётся копия данных изображения в видео-памяти и оригинальное изображение можно выгрузить из памяти.</p>

<p>Вы можете включить или выключить бесконечное повторение узора текстуры по горизонтали и/или вертикали (параметры <i>horWrap</i> и <i>vertWrap</i> соответственно). Также вы можете включить сглаживание пикселей изображения (<i>smooth</i>, билинейная или трилинейная фильтрация) и включить построение mip-уровней (<i>mipMap</i>).</p>

<p>См. также <a href="animation.html#imageToGLTexture">imageToGLTexture</a>, <a href="animation.html#imageToExistingGLTexture">imageToExistingGLTexture</a>, <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>w</i><i>idth</i> — ширина изображения в пикселях;<br />
<i>h</i><i>eight</i> — высота изображения в пикселях;<br />
<i>p</i><i>ixels</i> — указатель на массив пикселей изображения, формат смотрите в описании к функции <a href="animation.html#imageLoad">imageLoad</a>;<br />
<i>horW</i><i>rap</i> — включить бесконечное повторение узора текстуры по горизонтали (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>vertW</i><i>rap</i> — включить бесконечное повторение узора текстуры по вертикали (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>smooth</i> — включить сглаживание (<i>TRUE</i> или <i>FALSE</i>);<br />
<i>mipMap</i> — включить построение mip-уровней (<i>TRUE</i> или <i>FALSE</i>).</p>

<h3 id="imageToExistingGLTexture">int imageToExistingGLTexture(unsigned int texid, int width, int height, const void *pixels);</h3>

<p>Заменить пиксели существующей текстуры. Возвращает <i>TRUE</i> в случае успеха, иначе <i>FALSE</i>.</p>

<p>См. также <a href="animation.html#imageToGLTexture">imageToGLTexture</a>, <a href="animation.html#imageToGLTextureEx">imageToGLTextureEx</a>.</p>

<h4>Параметры:</h4>

<p><i>texid</i> — идентификатор существующей текстуры OpenGL;<br />
<i>w</i><i>idth</i> — ширина изображения в пикселях;<br />
<i>h</i><i>eight</i> — высота изображения в пикселях;<br />
<i>p</i><i>ixels</i> — указатель на массив пикселей изображения, формат смотрите в описании к функции <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h3 id="imageFromGLTexture">int imageFromGLTexture(unsigned int texid, int *outWidth, int *outHeight, unsigned char **outPixels);</h3>

<p>Получить пиксели из текстуры OpenGL. Пиксели копируются в новый массив, память для которого выделяется динамически. Поэтому вам, также как при работе с <a href="animation.html#imageLoad">imageLoad</a>, нужно после использования освободить выделенную под пиксели память при помощи стандартной функции <i>free</i>.</p>

<p>Функция возвращает <i>TRUE</i> в случае успеха, иначе <i>FALSE</i>.</p>

<p>См. также <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>texid</i> — идентификатор текстуры OpenGL;<br />
<i>outWidth</i> — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;<br />
<i>outHeight</i> — указатель на переменную куда будет записана высота загруженного изображения в пикселях;<br />
<i>outPixels</i> — указатель на переменную куда будет записан указатель на массив пикселей изображения.</p>

<h3 id="imageFromViewport">int imageFromViewport(int *outWidth, int *outHeight, unsigned char **outPixels);</h3>

<p>Получить пиксели изображения из текущей области вывода OpenGL. Пиксели копируются в новый массив, память для которого выделяется динамически. Поэтому вам, также как при работе с <a href="animation.html#imageLoad">imageLoad</a>, нужно после использования освободить выделенную под пиксели память при помощи стандартной функции <i>free</i>.</p>

<p>Функция возвращает <i>TRUE</i> в случае успеха, иначе <i>FALSE</i>.</p>

<p>См. также <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>outWidth</i> — указатель на переменную куда будет записана ширина загруженного изображения в пикселях;<br />
<i>outHeight</i> — указатель на переменную куда будет записана высота загруженного изображения в пикселях;<br />
<i>outPixels</i> — указатель на переменную куда будет записан указатель на массив пикселей изображения.</p>

<h3 id="viewportSave">int viewportSave(const char *path);</h3>

<p>Сохранить изображение из текущей области рисования OpenGL в файл. Обычно используется чтобы сделать снимок экрана (сохраняется только внутренняя область окна программы).</p>

<p>Функция возвращает <i>TRUE</i> в случае успеха, иначе <i>FALSE</i>.</p>

<p>См. также <a href="animation.html#imageSave">imageSave</a>, <a href="animation.html#imageFromViewport">imageFromViewport</a>.</p>

<p><b>Важно:</b> Если файл по указанному пути уже существует, то он будет перезаписан. Вы может проверить существование файла функцией <a href="common.html#fileExists">fileExists</a>.</p>

<h3 id="pixelGet">unsigned int pixelGet(const void *pixel);</h3>

<p>Сконвертировать пиксель в формате <i>RGBA32</i>, который используется в функции <a href="animation.html#imageLoad">imageLoad</a> в код цвета <i>Helianthus</i>. См. также <a href="animation.html#pixelSet">pixelSet</a>, <a href="animation.html#imageGetPixel">imageGetPixel</a>.</p>

<h3 id="pixelSet">void pixelSet(void *pixel, unsigned int colorCode);</h3>

<p>Записать цвет в пиксель в формате <i>RGBA32</i>, который используется в функции <a href="animation.html#imageLoad">imageLoad</a>. См. также <a href="animation.html#pixelGet">pixelGet</a>, <a href="animation.html#imageSetPixel">imageSetPixel</a>.</p>

<h3 id="imageGetPixel">unsigned int imageGetPixel(int width, int height, const void *pixels, int x, int y);</h3>

<p>Получить цвет пикселя изображения. См. также <a href="animation.html#imageSetPixel">imageSetPixel</a>, <a href="animation.html#pixelGet">pixelGet</a>, <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>w</i><i>idth</i> — ширина изображения в пикселях;<br />
<i>h</i><i>eight</i> — высота изображения в пикселях;<br />
<i>p</i><i>ixels</i> — указатель на массив пикселей изображения, формат смотрите в описании к функции <a href="animation.html#imageLoad">imageLoad</a>;<br />
<i>x</i>, <i>y</i> — координаты пикселя.</p>

<h3 id="imageSetPixel">void imageSetPixel(int width, int height, void *pixels, int x, int y, unsigned int colorCode);</h3>

<p>Установить цвет пикселя изображения. См. также <a href="animation.html#imageGetPixel">imageGetPixel</a>, <a href="animation.html#pixelSet">pixelSet</a>, <a href="animation.html#imageLoad">imageLoad</a>.</p>

<h4>Параметры:</h4>

<p><i>w</i><i>idth</i> — ширина изображения в пикселях;<br />
<i>h</i><i>eight</i> — высота изображения в пикселях;<br />
<i>p</i><i>ixels</i> — указатель на массив пикселей изображения, формат смотрите в описании к функции <a href="animation.html#imageLoad">imageLoad</a>;<br />
<i>x</i>, <i>y</i> — координаты пикселя,<br />
<i>colorCode</i> — код цвета.</p>

</div>
</body>
</html>