Рендер блоков — различия между версиями

Строка 1: Строка 1:
<div class="mw-parser-output">
+
<div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">
<div class="mw-parser-output">
 
 
= <span style="font-size:18.0pt"><span style="line-height:107%">Введение в рендер блоков</span></span> =
 
= <span style="font-size:18.0pt"><span style="line-height:107%">Введение в рендер блоков</span></span> =
  
 
Кроме формы из одного параллелепипеда, которой обладает большинство блоков, Inner Core позволяет задать им почти любой внешний вид. &nbsp;
 
Кроме формы из одного параллелепипеда, которой обладает большинство блоков, Inner Core позволяет задать им почти любой внешний вид. &nbsp;
 
 
<div class="mw-parser-output">
 
<div class="mw-parser-output">
 
== Формат описания текстуры и ее наложение на блок ==
 
== Формат описания текстуры и ее наложение на блок ==
Строка 13: Строка 11:
  
 
Текстура целого блока может быть описана либо двумя параметрами - именем и индексом текстуры, в таком случае весь блок будет иметь одну и ту же текстуру, либо массивом текстур, формат которого приведен ниже.
 
Текстура целого блока может быть описана либо двумя параметрами - именем и индексом текстуры, в таком случае весь блок будет иметь одну и ту же текстуру, либо массивом текстур, формат которого приведен ниже.
<syntaxhighlight lang="Javascript">[
+
 
    ["название1", индекс1], // bottom
+
<syntaxhighlight lang="Javascript">[<br/> &nbsp;&nbsp;&nbsp; ["название1", индекс1], // bottom<br/> &nbsp;&nbsp;&nbsp; ["название2", индекс2], // top<br/> &nbsp;&nbsp;&nbsp; ["название3", индекс3], // back<br/> &nbsp;&nbsp;&nbsp; ["название4", индекс4], // front<br/> &nbsp;&nbsp;&nbsp; ["название5", индекс5], // left<br/> &nbsp;&nbsp;&nbsp; ["название6", индекс6]&nbsp; // right<br/> ]</syntaxhighlight>
    ["название2", индекс2], // top
 
    ["название3", индекс3], // back
 
    ["название4", индекс4], // front
 
    ["название5", индекс5], // left
 
    ["название6", индекс6]  // right
 
]
 
</syntaxhighlight>
 
  
 
Каждый из элементов массива отвечает за одну текстуру, если элементов меньше 6, то текстуры недостающих сторон скопируют последний элемент массива.
 
Каждый из элементов массива отвечает за одну текстуру, если элементов меньше 6, то текстуры недостающих сторон скопируют последний элемент массива.
</div>
+
</div>  
 
 
 
== Статичная модель блока ==
 
== Статичная модель блока ==
  
Строка 34: Строка 24:
 
Пустая статичная модель создается с помощью конструктора ''new BlockRenderer.Model()'' и обладает следующими методами:
 
Пустая статичная модель создается с помощью конструктора ''new BlockRenderer.Model()'' и обладает следующими методами:
  
<span style="line-height:108%">''model.addBox(x1, y1, z1, x2, y2, z2, id, data) - добавляет бокс с текстурой блока с данными id, data''</span>
+
<span style="line-height:108%">model.addBox(x1, y1, z1, x2, y2, z2, id, data) - добавляет бокс с текстурой блока с данными id, data</span>
  
<span style="line-height:108%">''model.addBox(x1, y1, z1, x2, y2, z2, "name", index) - добавляет бокс с текстурой с именем name и индексом index на всех сторонах''</span>
+
<span style="line-height:108%">model.addBox(x1, y1, z1, x2, y2, z2, "name", index) - добавляет бокс с текстурой с именем name и индексом index на всех сторонах</span>
  
<span style="line-height:108%">''model.addBox(x1, y1, z1, x2, y2, z2, [… texture set ...]) - добавляет бокс с заданным массивом текстур (формат см. выше)''</span>
+
<span style="line-height:108%">model.addBox(x1, y1, z1, x2, y2, z2, [… texture set ...]) - добавляет бокс с заданным массивом текстур (формат см. выше)</span>
  
<span style="line-height:108%">''model.addMesh(mesh) - добавляет в модель объект RenderMesh - произвольную полигональную 3D модель, о которых будет рассказано позднее''</span>
+
<span style="line-height:108%">model.addMesh(mesh) - добавляет в модель объект RenderMesh - произвольную полигональную 3D модель, о которых будет рассказано позднее</span>
  
 
Существуют так же другие конструкторы, упрощающие быстрое создание простых моделей:
 
Существуют так же другие конструкторы, упрощающие быстрое создание простых моделей:
  
<span style="line-height:108%">''new BlockRenderer.Model(mesh) - создает модель, которая содержит в себе данный объект RenderMesh''</span>
+
<span style="line-height:108%">new BlockRenderer.Model(mesh) - создает модель, которая содержит в себе данный объект RenderMesh</span>
  
<span style="line-height:108%">''new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, [… texture set ...]) - создает модель, которая является одним боксом с данным массивом текстур''</span>
+
<span style="line-height:108%">new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, [… texture set ...]) - создает модель, которая является одним боксом с данным массивом текстур</span>
  
<span style="line-height:108%">''new BlockRenderer.Model([… texture set ...]) - создает модель, которая является полным блоком с данным массивом текстур''</span>
+
<span style="line-height:108%">new BlockRenderer.Model([… texture set ...]) - создает модель, которая является полным блоком с данным массивом текстур</span>
  
<span style="line-height:108%">''new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, "name", index) - создает модель, которая является одним боксом с данной текстурой на всех сторонах''</span>
+
<span style="line-height:108%">new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, "name", index) - создает модель, которая является одним боксом с данной текстурой на всех сторонах</span>
  
<span style="line-height:108%">''new BlockRenderer.Model("name", index) - создает модель, которая является полным блоком с данной текстурой на всех сторонах''</span>
+
<span style="line-height:108%">new BlockRenderer.Model("name", index) - создает модель, которая является полным блоком с данной текстурой на всех сторонах</span>
  
<span style="line-height:108%">''new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, id, data) - создает модель, которая является одним боксом, копирующим текстуру из блока с данными id, data''</span>
+
<span style="line-height:108%">new BlockRenderer.Model(x1, y1, z1, x2, y2, z2, id, data) - создает модель, которая является одним боксом, копирующим текстуру из блока с данными id, data</span>
  
<span style="line-height:108%">''new BlockRenderer.Model(id, data) -&nbsp; создает модель, которая является полным блоком, копирующим текстуру из блока с данными id, data''</span>
+
<span style="line-height:108%">new BlockRenderer.Model(id, data) -&nbsp; создает модель, которая является полным блоком, копирующим текстуру из блока с данными id, data</span>
  
 
== Основы ICRender ==
 
== Основы ICRender ==
Строка 62: Строка 52:
 
ICRender является системой, позволяющей заранее задать блоку внешний вид в зависимости от внешних условий. Основным объектом для рендера блоков является модель ICRender, которая является набором статических моделей и условий, при которых они будут отрисовываться.
 
ICRender является системой, позволяющей заранее задать блоку внешний вид в зависимости от внешних условий. Основным объектом для рендера блоков является модель ICRender, которая является набором статических моделей и условий, при которых они будут отрисовываться.
  
Для создания модели ICRender используется конструктор ''new ICRender.Model(), ''для добавления статичной модели в модель ICRender используется метод ''addEntry(model)'': ''var staticModel = new BlockRenderer.Model(); // модификация модели staticModel var icRenderModel = new ICRender.Model(); icRenderModel.addEntry(staticModel);&nbsp;''
+
Для создания модели ICRender используется конструктор ''new ICRender.Model(), ''для добавления статичной модели в модель ICRender используется метод ''addEntry(model)'':
 +
<syntaxhighlight lang="Javascript">var staticModel = new BlockRenderer.Model(); // модификация модели staticModel  
 +
var icRenderModel = new ICRender.Model();  
 +
icRenderModel.addEntry(staticModel); </syntaxhighlight>
  
 
Чтобы установить блоку модель ICRender используется метод
 
Чтобы установить блоку модель ICRender используется метод
 
<p style="margin-top:0cm; margin-right:3.2pt; margin-bottom:7.85pt; margin-left:0cm; text-align:justify"><span style="text-justify:inter-ideograph"><span style="line-height:108%">''BlockRenderer.setStaticICRender(id, data, model) - ''где id и data - целевой блок (если надо установить для любого значения data, вместо него нужно передать -1), а model - модель ICRender.</span></span></p>  
 
<p style="margin-top:0cm; margin-right:3.2pt; margin-bottom:7.85pt; margin-left:0cm; text-align:justify"><span style="text-justify:inter-ideograph"><span style="line-height:108%">''BlockRenderer.setStaticICRender(id, data, model) - ''где id и data - целевой блок (если надо установить для любого значения data, вместо него нужно передать -1), а model - модель ICRender.</span></span></p>  
 
Пример:
 
Пример:
 
+
<syntaxhighlight lang="Javascript">BlockRenderer.setStaticICRender(BlockID.testRenderBlock, -1, icRenderModel); // после этого требуемый блок будет иметь созданную ранее модель</syntaxhighlight>
<span style="line-height:108%">''BlockRenderer.setStaticICRender(BlockID.testRenderBlock, -1, icRenderModel); // после этого требуемый блок будет иметь созданную ранее модель''</span>
 
  
 
== Маппинг рендера'' ==
 
== Маппинг рендера'' ==
Строка 78: Строка 70:
 
Без дополнительных действий такой вызов ничем не будет отличаться по действию от вызова ''BlockRenderer.setStaticICRender. ''Для маппинга используются следующие методы:
 
Без дополнительных действий такой вызов ничем не будет отличаться по действию от вызова ''BlockRenderer.setStaticICRender. ''Для маппинга используются следующие методы:
  
<span style="line-height:108%">''BlockRenderer.mapAtCoords(x, y, z, model) - устанавливает данную модель ICRender на данные координаты, любой блок, для которого включен маппинг и который стоит на этих координатах, будет иметь эту модель.''</span>
+
<span style="line-height:108%">BlockRenderer.mapAtCoords(x, y, z, model) - устанавливает данную модель ICRender на данные координаты, любой блок, для которого включен маппинг и который стоит на этих координатах, будет иметь эту модель.</span>
  
<span style="line-height:108%">''BlockRender.unmapAtCoords(x, y, z) - отменяет действие предыдущей функции на данных координатах, возвращая стандартную модель любого блока.''</span>
+
<span style="line-height:108%">BlockRender.unmapAtCoords(x, y, z) - отменяет действие предыдущей функции на данных координатах, возвращая стандартную модель любого блока.</span>
  
 
<u style="text-underline:black">Важно отметить:</u> ''&nbsp;''
 
<u style="text-underline:black">Важно отметить:</u> ''&nbsp;''
Строка 86: Строка 78:
 
#Все установленные на координатах модели очищаются при выходе из мира.  
 
#Все установленные на координатах модели очищаются при выходе из мира.  
 
#Наличие блока никак не связано с тем, что на данных координатах установлена модель, это значит, что если сломать блок, подверженный маппингу, у которого была изменена модель и поставить на его место другой блок, тоже подверженный маппингу, то модель сохранится. Потому важно следить, на какой именно блок вызывается mapAtCoords и обязательно вызывать unmapAtCoords при уничтожении блока.  
 
#Наличие блока никак не связано с тем, что на данных координатах установлена модель, это значит, что если сломать блок, подверженный маппингу, у которого была изменена модель и поставить на его место другой блок, тоже подверженный маппингу, то модель сохранится. Потому важно следить, на какой именно блок вызывается mapAtCoords и обязательно вызывать unmapAtCoords при уничтожении блока.  
</div>
+
</div> </div> </div>

Версия 23:57, 8 июля 2018

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

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

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

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

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

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

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

Каждый из элементов массива отвечает за одну текстуру, если элементов меньше 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 при уничтожении блока.