Создание нового нода

Материал из CryWiki Russia

(Различия между версиями)
Перейти к: навигация, поиск
Строка 87: Строка 87:
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными.  
''OutputPortConfig'' является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными.  
-
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра:
+
Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: '''SFlowSystemVoid''', '''int''', '''float''', '''EntityId''', '''Vec3''', '''string''', и '''bool'''. ''SFlowSystemVoid'' - это специальный тип, который представляет собой «no value» (нет значения). ''OutputPortConfig'' принимает три параметра: имя порта '''output''', некоторый описательный вспомогательный текст показываемый в редакторе '''GUI''' и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все '''ФГ''', которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр.
 +
 
 +
Чтобы передать значение из порта, вы можете использовать функцию ''CFlowBaseNode::ActivateOutput( pActInfo, nPort, value )''. Эта функция принимает ''pActInfo'' (обычно передается в ''ProcessEvent()'') идентификатор порта (отсчет начинается нулевым значением с верху ''out_config''), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать: 
 +
 
 +
<source lang="cpp">
 +
ActivateOutput( pActInfo, 0, 3 );
 +
</source>
 +
 
 +
 
 +
== Добавление портов Input==
 +
 
 +
Порт '''Input''' может быть добавлен таким же путем, как и «Output» порт за счет изменения ''GetConfiguration'' функции:
 +
 
 +
<source lang="cpp">
 +
class CFlowNode_MyName : public CFlowBaseNode
 +
{
 +
public:
 +
  // ...
 +
 +
  virtual void GetConfiguration( SFlowNodeConfig& config )
 +
  {
 +
    static const SInputPortConfig in_config[] = {
 +
      InputPortConfig<int>("someInput", _HELP("useful help text")),
 +
      {0}
 +
    };
 +
    static const SOutputPortConfig out_config[] = {
 +
      {0}
 +
    };
 +
    config.sDescription = _HELP( "A description of this flow node" );
 +
    config.pInputPorts = in_config;
 +
    config.pOutputPorts = out_config;
 +
    config.nFlags = 0;
 +
  }
 +
 +
  // ...
 +
};
 +
</source>
 +
 
 +
''InputPortConfig'' такая же шаблонная вспомогательная функция как и ''OutputPortConfig''.
 +
 
 +
Такие же типы как и для '''output''' портов могут быть определены и для '''input''' портов. ''InputPortConfig'' принимает три или четыре параметра:
 +
 
 +
*имя '''input''' порта, описание порта и читаемое человеком имя порта.
 +
*имя '''input '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта. Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод.

Версия 11:43, 1 февраля 2013

Эта страница страница помечена как находящиеся в процессе перевода с: 13 января 2013.


О статье
ПереводчикAndreyFilantrop
СложностьСредняя
ТребованияMicrosoft Visual Studio 2010
Дата добавления13/01/13



Содержание

Создание нового нода

Статья описывает шаги по внедрению нового нода Flowgraph.

Базовый код

Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином cpp файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите cpp файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes.

В cpp файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего ФГ [сокр. Флоуграф] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться:

#include "stdafx.h"
#include "FlowBaseNode.h"
 
class CFlowNode_MyName : public CFlowBaseNode
{
public:
  CFlowNode_MyName( SActivationInfo * pActInfo )
  {
  };
 
  virtual void GetConfiguration( SFlowNodeConfig& config )
  {
    static const SInputPortConfig in_config[] = {
      {0}
    };
    static const SOutputPortConfig out_config[] = {
      {0}
    };
    config.sDescription = _HELP( "A description of this flow node" );
    config.pInputPorts = in_config;
    config.pOutputPorts = out_config;
    config.nFlags = 0;
  }
 
  virtual void ProcessEvent( EFlowEvent event, SActivationInfo * pActInfo )
  {
     switch (event)
     {
     };
  }
};
 
REGISTER_FLOW_NODE("FlowNodeGroup:MyName", CFlowNode_MyName);


Добавление портов Output

ФГ ноды имеют как input (т.е. входящие ) так и output (исходящие) порты. Output порт может быть добавлен за счет изменения GetConfiguration функции, как видно на следующем примере:

class CFlowNode_MyName : public CFlowBaseNode
{
public:
  // ...
 
  virtual void GetConfiguration( SFlowNodeConfig& config )
  {
    static const SInputPortConfig in_config[] = {
      {0}
    };
    static const SOutputPortConfig out_config[] = {
      OutputPortConfig<int>("alertness", _HELP("useful help text")),
      {0}
    };
    config.sDescription = _HELP( "A description of this flow node" );
    config.pInputPorts = in_config;
    config.pOutputPorts = out_config;
    config.nFlags = 0;
  }
 
  // ...
};

OutputPortConfig является шаблонной вспомогательной функцией, которая полезна для заполнения маленькой структуры соответствующими данными. Могут быть определены разные типы, но в примере тип порта «int». Доступны следующие типы: SFlowSystemVoid, int, float, EntityId, Vec3, string, и bool. SFlowSystemVoid - это специальный тип, который представляет собой «no value» (нет значения). OutputPortConfig принимает три параметра: имя порта output, некоторый описательный вспомогательный текст показываемый в редакторе GUI и по желанию читаемый текст имени порта, который виден и читаем для человека. Убедитесь, что вы выбрали нормальное имя для порта, т.к. смена его в дальнейшем разрушит вам все ФГ, которые используют этот нод. Если вам нужно сменить отображаемое имя, используйте третий параметр.

Чтобы передать значение из порта, вы можете использовать функцию CFlowBaseNode::ActivateOutput( pActInfo, nPort, value ). Эта функция принимает pActInfo (обычно передается в ProcessEvent()) идентификатор порта (отсчет начинается нулевым значением с верху out_config), и значение того же типа, что и порт. Поэтому чтобы активировать нашу «alertness» значением 3 мы можем написать:

ActivateOutput( pActInfo, 0, 3 );


Добавление портов Input

Порт Input может быть добавлен таким же путем, как и «Output» порт за счет изменения GetConfiguration функции:

class CFlowNode_MyName : public CFlowBaseNode
{
public:
  // ...
 
  virtual void GetConfiguration( SFlowNodeConfig& config )
  {
    static const SInputPortConfig in_config[] = {
      InputPortConfig<int>("someInput", _HELP("useful help text")),
      {0}
    };
    static const SOutputPortConfig out_config[] = {
      {0}
    };
    config.sDescription = _HELP( "A description of this flow node" );
    config.pInputPorts = in_config;
    config.pOutputPorts = out_config;
    config.nFlags = 0;
  }
 
  // ...
};

InputPortConfig такая же шаблонная вспомогательная функция как и OutputPortConfig.

Такие же типы как и для output портов могут быть определены и для input портов. InputPortConfig принимает три или четыре параметра:

  • имя input порта, описание порта и читаемое человеком имя порта.
  • имя input порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта. Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод.