Визуальная составляющая ICRender — различия между версиями

(Новая страница: «<div class="mw-parser-output"><div class="mw-parser-output"> = <span style="font-size:18.0pt"><span style="line-height:107%">Визуальная составля…»)
 
(Модель ICRender)
 
(не показано 7 промежуточных версий 3 участников)
Строка 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">
 +
<div class="mw-parser-output">
 
= <span style="font-size:18.0pt"><span style="line-height:107%">Визуальная составляющая ICRender</span></span> =
 
= <span style="font-size:18.0pt"><span style="line-height:107%">Визуальная составляющая ICRender</span></span> =
  
Строка 7: Строка 8:
  
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Используя модели ICRender для обработки простых условий и их маппинг на координаты, который был рассмотрен ранее, можно создать любой внешний вид блока и в абсолютном большинстве случаев заменить прямой каллбек рендера.</span></span></span>
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Используя модели ICRender для обработки простых условий и их маппинг на координаты, который был рассмотрен ранее, можно создать любой внешний вид блока и в абсолютном большинстве случаев заменить прямой каллбек рендера.</span></span></span>
 
+
<div class="mw-parser-output">
 
== Модель ICRender ==
 
== Модель ICRender ==
  
Строка 14: Строка 15:
  
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Для добавления статичной модели (они были рассмотрены ранее) в модель ICRender используется метод ''addEntry(model)'', отдающий объект, позволяющий установить условия отрисовки:</span></span></span>
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Для добавления статичной модели (они были рассмотрены ранее) в модель ICRender используется метод ''addEntry(model)'', отдающий объект, позволяющий установить условия отрисовки:</span></span></span>
<syntaxhighlight lang="Javascript">var model = new BlockRender.BlockModel(); … modify model ... var entry = icRender.addEntry(model);</syntaxhighlight>
+
<syntaxhighlight lang="Javascript">var model = new BlockRenderer.Model(); … modify model ... var entry = icRender.addEntry(model);</syntaxhighlight>
  
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Для установки условий отрисовки используется метод полученного объекта ''setCondition(condition)'', где condition - объект условия, которые будут рассмотрены далее:</span></span></span>
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Для установки условий отрисовки используется метод полученного объекта ''setCondition(condition)'', где condition - объект условия, которые будут рассмотрены далее:</span></span></span>
<p style="margin-top:0cm; margin-right:264.45pt; margin-bottom:.0001pt; margin-left:0cm; text-align:justify">&nbsp;</p> <syntaxhighlight lang="Javascript">var entry = icRender.addEntry(model); entry.setCondition(…); // короткая запись
+
<syntaxhighlight lang="Javascript">var entry = icRender.addEntry(model);  
 +
entry.setCondition(…);  
  
 +
// короткая запись
 
icRender.addEntry(model).setCondition(…); </syntaxhighlight>
 
icRender.addEntry(model).setCondition(…); </syntaxhighlight>
  
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Если условие не было установлено, то данная статичная модель будет всегда видима.</span></span></span>
 
<span style="line-height:104%"><span style="font-size:12.0pt"><span style="line-height:104%">Если условие не было установлено, то данная статичная модель будет всегда видима.</span></span></span>
 +
</div> <div class="mw-parser-output">
  
 
== Группы блоков ==
 
== Группы блоков ==
Строка 29: Строка 33:
 
<u style="text-underline:black"><span style="font-size:12.0pt"><span style="line-height:107%">Для создания группы используются методы:</span></span></u>
 
<u style="text-underline:black"><span style="font-size:12.0pt"><span style="line-height:107%">Для создания группы используются методы:</span></span></u>
  
<span style="line-height:108%">''<span style="font-size:12.0pt"><span style="line-height:108%">ICRender.getGroup("name") - возвращает группу, зарегистрированную под данным именем, если такой нет, создает новую и регистрирует. Имя нужно для удобства доступа и совместимости между модами (К примеру, все блоки, к которым подключаются провода в Industrial Craft зарегистрированы в группе с именем</span></span>''''<span style="font-size:12.0pt"><span style="line-height:108%"><span style="color:#032f62">"icwire")</span></span></span>''''''</span>
+
<span style="line-height:108%"><span style="font-size:12.0pt"><span style="line-height:108%">ICRender.getGroup("name") - возвращает группу, зарегистрированную под данным именем, если такой нет, создает новую и регистрирует. Имя нужно для удобства доступа и совместимости между модами (К примеру, все блоки, к которым подключаются провода в Industrial Craft зарегистрированы в группе с именем</span></span>''''<span style="font-size:12.0pt"><span style="line-height:108%"><span style="color:#032f62">"icwire")</span></span></span>''''</span>
  
<span style="line-height:135%">''<span style="font-size:12.0pt"><span style="line-height:135%">ICRender.getUnnamedGroup() - создает и возвращает новую группу без имени, используется для создания локальных групп</span></span>''<u style="text-underline:black"><span style="font-size:12.0pt"><span style="line-height:135%">Методы группы блоков:</span></span></u></span>
+
<span style="line-height:135%"><span style="font-size:12.0pt"><span style="line-height:135%">ICRender.getUnnamedGroup() - создает и возвращает новую группу без имени, используется для создания локальных групп</span></span><u style="text-underline:black"><span style="font-size:12.0pt"><span style="line-height:135%">Методы группы блоков:</span></span></u></span>
  
<span style="line-height:135%">''<span style="font-size:12.0pt"><span style="line-height:135%">group.add(id, data) - добавляет блок с данным id и data в группу, если вместо data передано число -1, в группу будут добавлены все блоки с этим id group.getName() - возвращает имя группы</span></span>''</span>
+
<span style="line-height:135%"><span style="font-size:12.0pt"><span style="line-height:135%">group.add(id, data) - добавляет блок с данным id и data в группу, если вместо data передано число -1, в группу будут добавлены все блоки с этим id</span></span></span>
  
&nbsp;
+
<span style="line-height:135%"><span style="font-size:12.0pt"><span style="line-height:135%">group.getName() - возвращает имя группы</span></span></span>
 +
</div> </div>
  
 
= Условия =
 
= Условия =
Строка 49: Строка 54:
 
<span style="line-height:108%">''<span style="font-size:12.0pt"><span style="line-height:108%">ICRender.OR(condition1, condition2, …) - логический оператор ИЛИ, принимает 2 или больше условий на вход, выполняется, если хотя бы одно из условий тоже выполняется.</span></span>''</span>
 
<span style="line-height:108%">''<span style="font-size:12.0pt"><span style="line-height:108%">ICRender.OR(condition1, condition2, …) - логический оператор ИЛИ, принимает 2 или больше условий на вход, выполняется, если хотя бы одно из условий тоже выполняется.</span></span>''</span>
  
 +
<div class="mw-parser-output">
 
== Пример'' ==
 
== Пример'' ==
  
Строка 54: Строка 60:
  
 
&nbsp;
 
&nbsp;
<syntaxhighlight lang="Javascript">var id = … // id блока провода var width = 0.5 // толщина провода
+
<syntaxhighlight lang="Javascript">var id = … // id блока провода  
 +
var width = 0.5 // толщина провода
 
var group = ICRender.getGroup("testWire"); // группа блоков  
 
var group = ICRender.getGroup("testWire"); // группа блоков  
 
group.add(id, -1); // добавим сам провод в группу
 
group.add(id, -1); // добавим сам провод в группу
Строка 87: Строка 94:
 
BlockRenderer.setStaticICRender(id, -1, model);</syntaxhighlight>
 
BlockRenderer.setStaticICRender(id, -1, model);</syntaxhighlight>
  
&nbsp;
+
&nbsp; </div> </div> </div>
</div> </div>
+
</div>

Текущая версия на 14:15, 30 августа 2019

Визуальная составляющая ICRender[править]

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

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

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

Модель ICRender[править]

Модель ICRender является набором статических моделей, рассмотренных ранее, и условий, при которых они видимы. Чтобы создать пустую модель используется конструктор:

var icRender = new ICRender.Model();

Для добавления статичной модели (они были рассмотрены ранее) в модель ICRender используется метод addEntry(model), отдающий объект, позволяющий установить условия отрисовки:

var model = new BlockRenderer.Model();  modify model ... var entry = icRender.addEntry(model);

Для установки условий отрисовки используется метод полученного объекта setCondition(condition), где condition - объект условия, которые будут рассмотрены далее:

var entry = icRender.addEntry(model); 
entry.setCondition(); 

// короткая запись
icRender.addEntry(model).setCondition();

Если условие не было установлено, то данная статичная модель будет всегда видима.

Группы блоков[править]

Группы блоков в ICRender нужны для создания условий, с ними будут сверяться блоки на каких-либо координатах при проверке условий.

Для создания группы используются методы:

ICRender.getGroup("name") - возвращает группу, зарегистрированную под данным именем, если такой нет, создает новую и регистрирует. Имя нужно для удобства доступа и совместимости между модами (К примеру, все блоки, к которым подключаются провода в Industrial Craft зарегистрированы в группе с именем'"icwire")'

ICRender.getUnnamedGroup() - создает и возвращает новую группу без имени, используется для создания локальных группМетоды группы блоков:

group.add(id, data) - добавляет блок с данным id и data в группу, если вместо data передано число -1, в группу будут добавлены все блоки с этим id

group.getName() - возвращает имя группы

Условия[править]

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

ICRender.BLOCK(x, y, z, group, exclude) - условие проверки одного блока на координатах (координаты задаются относительно позиции блока, к примеру, позиция на 1 блоквыше будет задаваться как 0, 1, 0). Если параметр exclude false, условие выполнится, если данная группа содержит блок на данных координатах, а если exclude true, то если группа его не содержит.

ICRender.NOT(condition) - логический оператор НЕТ от данного условия, выполняется, если данное условие не выполняется.

ICRender.AND(condition1, condition2, …) - логический оператор И, принимает 2 или больше условий на вход, выполняется, если все эти условия тоже выполняются.

ICRender.OR(condition1, condition2, …) - логический оператор ИЛИ, принимает 2 или больше условий на вход, выполняется, если хотя бы одно из условий тоже выполняется.

Пример[править]

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

 

var id =  // id блока провода 
var width = 0.5 // толщина провода
var group = ICRender.getGroup("testWire"); // группа блоков 
group.add(id, -1); // добавим сам провод в группу

/* Данные про то, какие боксы должны быть видны в зависимости от того, есть на относительных координатах блок из группы или нет. Каждый объект в массиве — это данные для модели и условия: side - относительные координаты, box - координаты бокса. Можно без проблем реализовать модель без этого массива, но так меньше кода и есть разделение между данными модели и ее созданием.*/

var boxes = [
    {side: [1, 0, 0], box: [0.5 + width / 2, 0.5 - width / 2, 0.5 - width / 2, 1, 0.5 + width / 2, 0.5 + width / 2]},
    {side: [-1, 0, 0], box: [0, 0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2]},
    {side: [0, 1, 0], box: [0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2, 1, 0.5 + width / 2]},
    {side: [0, -1, 0], box: [0.5 - width / 2, 0, 0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2]},
    {side: [0, 0, 1], box: [0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, 1]},
    {side: [0, 0, -1], box: [0.5 - width / 2, 0.5 - width / 2, 0, 0.5 + width / 2, 0.5 + width / 2, 0.5 - width / 2]}
];

var model = new ICRender.Model(); // создаем новую модель

model.addEntry(new BlockRenderer.Model(0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, id, 0)); 
// добавляем центральный бокс, который виден всегда

for(var i in boxes){
    // Получаем относительные координаты и координаты бокса из данных выше 
    var box = boxes[i].box; 
    var side = boxes[i].side;

    /* одним выражением создаем статичную модель из одного бокса (используем текстуру блока с нашим id), добавляем ее в модель ICRender и устанавливаем условие отрисовки    - должен быть блок из созданной ранее группы на данных относительных координатах.*/
    model.addEntry(new BlockRenderer.Model(box[0], box[1], box[2], box[3], box[4], box[5], id, 0))
        .setCondition(new ICRender.BLOCK(side[0], side[1], side[2], group, false));
}

// устанавливаем созданную модель блоку
BlockRenderer.setStaticICRender(id, -1, model);