Рендер блоков

Введение в рендер блоков

Кроме формы из одного параллелепипеда, которой обладает большинство блоков, Inner Core позволяет задать им почти любой внешний вид.  

Формат описания текстуры и ее наложение на блок

Хоть наложение текстур и было описано ранее, оно имеет непосредственное отношение к дальнейшему описанию.

Ссылка на каждую отдельную текстуру блока состоит из двух элементов - ее названия и индекса, напомню, что название и индекс задаются для файла текстуры в ресурсах в формате "имя_индекс.png", где имя - произвольная строка, а индекс - неотрицательное целое число.

Текстура целого блока может быть описана либо двумя параметрами - именем и индексом текстуры, в таком случае весь блок будет иметь одну и ту же текстуру, либо массивом текстур, формат которого приведен ниже.

[
    ["название1", индекс1], // bottom
    ["название2", индекс2], // top
    ["название3", индекс3], // back
    ["название4", индекс4], // front
    ["название5", индекс5], // left
    ["название6", индекс6]  // right
]

Каждый из элементов массива отвечает за одну текстуру, если элементов меньше 6, то текстуры недостающих сторон скопируют последний элемент массива.

Статичная модель блока

Статичная модель является самым простым типом рендера блока и представляет из себя набор различных элементов внешнего вида блока, которые могут быть отрисованы на произвольных координатах. Внешний вид статичной модели не зависит от того, что ее окружает.

Основной, хоть и не единственный элемент модели - бокс - является текстурированным параллелепипедом с заданными начальными и конечными координатами x1, y1, z1, x2, y2, z2 в пространстве конкретного блока (0 означает начало блока, 1 - конец по данной координате, координаты могут выходить за пределы 0-1).  

Пустая статичная модель создается с помощью конструктора new BlockRenderer.Model() и обладает следующими методами:

model.addBox(x1, y1, z1, x2, y2, z2, id, data) - добавляет бокс с текстурой блока с данными id, data

model.addBox(x1, y1, z1, x2, y2, z2, "name", index) - добавляет бокс с текстурой с именем name и индексом index на всех сторонах

model.addBox(x1, y1, z1, x2, y2, z2, [… texture set ...]) - добавляет бокс с заданным массивом текстур (формат см. выше)

model.addMesh(mesh) - добавляет в модель объект RenderMesh - произвольную полигональную 3D модель, о которых будет рассказано позднее

Существуют так же другие конструкторы, упрощающие быстрое создание простых моделей:

new BlockRenderer.Model(mesh) - создает модель, которая содержит в себе данный объект RenderMesh

new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, [… texture set ...]) - создает модель, которая является одним боксом с данным массивом текстур

new BlockRenderer.Model([… texture set ...]) - создает модель, которая является полным блоком с данным массивом текстур

new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, "name", index) - создает модель, которая является одним боксом с данной текстурой на всех сторонах

new BlockRenderer.Model("name", index) - создает модель, которая является полным блоком с данной текстурой на всех сторонах

new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, id, data) - создает модель, которая является одним боксом, копирующим текстуру из блока с данными id, data

new BlockRenderer.Model(id, data) -  создает модель, которая является полным блоком, копирующим текстуру из блока с данными id, data

Основы ICRender

ICRender является системой, позволяющей заранее задать блоку внешний вид в зависимости от внешних условий. Основным объектом для рендера блоков является модель ICRender, которая является набором статических моделей и условий, при которых они будут отрисовываться.

Для создания модели ICRender используется конструктор new ICRender.Model(), для добавления статичной модели в модель ICRender используется метод addEntry(model): var staticModel = new BlockRenderer.Model(); // модификация модели staticModel var icRenderModel = new ICRender.Model(); icRenderModel.addEntry(staticModel); 

Чтобы установить блоку модель ICRender используется метод

BlockRenderer.setStaticICRender(id, data, model) - где id и data - целевой блок (если надо установить для любого значения data, вместо него нужно передать -1), а model - модель ICRender.

Пример:

BlockRenderer.setStaticICRender(BlockID.testRenderBlock, -1, icRenderModel); // после этого требуемый блок будет иметь созданную ранее модель

Маппинг рендера

Кроме обычной установки ICRender блокам, им можно так же включить режим маппинга рендера. Он позволяет устанавливать любые модели ICRender конкретным блокам в мире, для которых маппинг включен, не затрагивая остальные блоки.

Для включения маппинга используется метод BlockRenderer.enableCoordMapping(id, data, model) - где id и data - целевой блок, а model - модель ICRender, которая будет использована для данного блока по умолчанию.

Без дополнительных действий такой вызов ничем не будет отличаться по действию от вызова BlockRenderer.setStaticICRender. Для маппинга используются следующие методы:

BlockRenderer.mapAtCoords(x, y, z, model) - устанавливает данную модель ICRender на данные координаты, любой блок, для которого включен маппинг и который стоит на этих координатах, будет иметь эту модель.

BlockRender.unmapAtCoords(x, y, z) - отменяет действие предыдущей функции на данных координатах, возвращая стандартную модель любого блока.

Важно отметить:  

  1. Все установленные на координатах модели очищаются при выходе из мира.
  2. Наличие блока никак не связано с тем, что на данных координатах установлена модель, это значит, что если сломать блок, подверженный маппингу, у которого была изменена модель и поставить на его место другой блок, тоже подверженный маппингу, то модель сохранится. Потому важно следить, на какой именно блок вызывается mapAtCoords и обязательно вызывать unmapAtCoords при уничтожении блока.