Создание нового нода
Материал из 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
|
Содержание |
Создание нового нода
Статья описывает шаги по внедрению нового нода 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 порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта. Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод.