Создание нового нода
Материал из CryWiki Russia
| (13 промежуточных версий не показаны.) | |||
| Строка 1: | Строка 1: | ||
| - | |||
| - | |||
| - | |||
{{Статья | {{Статья | ||
|переводчик=AndreyFilantrop | |переводчик=AndreyFilantrop | ||
| Строка 11: | Строка 8: | ||
= Создание нового нода = | = Создание нового нода = | ||
| + | |||
| + | Статья описывает шаги по внедрению нового нода '''Flowgraph'''. | ||
| + | |||
| + | == Базовый код == | ||
| + | |||
| + | Рекомендуется реализовывать ноды, принадлежащие одинаковой группе в едином '''cpp''' файле. Обычно нет необходимости в заголовке, за исключением некоторых специальных нодов. Поместите''' cpp''' файл в файл проекта CryAction/Flow System Files/Nodes и в рамках структуры директории файловой системы в Code/CryEngine/CryAction/FlowSystem/Nodes. | ||
| + | |||
| + | В '''cpp''' файле добавьте класс используя следующий шаблон кода и замените «MyName» желаемым именем вашего '''ФГ''' [сокр. '''Флоуграф'''] нода. Замените «FlowNodeGroup» желаемым именем группы и создайте соответствующую подпапку в селекторе редактора нода, где этот тип нода будет располагаться: | ||
| + | |||
| + | <source lang="cpp"> | ||
| + | #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); | ||
| + | </source> | ||
| + | |||
| + | |||
| + | == Добавление портов Output== | ||
| + | |||
| + | '''ФГ''' ноды имеют как '''input''' (т.е. входящие ) так и '''output''' (исходящие) порты. | ||
| + | Output порт может быть добавлен за счет изменения ''GetConfiguration'' функции, как видно на следующем примере: | ||
| + | |||
| + | <source lang="cpp"> | ||
| + | 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; | ||
| + | } | ||
| + | |||
| + | // ... | ||
| + | }; | ||
| + | </source> | ||
| + | |||
| + | ''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 '''порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта. | ||
| + | |||
| + | Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: '''не используйте символ нижнего подчеркивания «_» в именах портов''' за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы: | ||
| + | |||
| + | {| border="1" cellpadding="0" cellspacing="3" | ||
| + | |- | ||
| + | | | ||
| + | '''Префикс''' | ||
| + | |||
| + | | | ||
| + | '''Тип редактора свойств''' | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | snd_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOUND | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | sound_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOUND | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | dialogline_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_DIALOG | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | clr_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_COLOR | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | color_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_COLOR | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | tex_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_TEXTURE | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | texture_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_TEXTURE | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | obj_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_OBJECT | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | object_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_OBJECT | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | file_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_FILE | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | text_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_LOCAL_STRING | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | equip_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_EQUIP | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | reverbpreset_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_REVERBPRESET | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | aianchor_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_AI_ANCHOR | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | aibehavior_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_AI_BEHAVIOR | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | aicharacter_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_AI_CHARACTER | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | aipfpropertieslist_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_AI_PFPROPERTIESLIST | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | aiterritory_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_AITERRITORY | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | aiwave_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_AIWAVE | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | soclass_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOCLASS | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | soclasses_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOCLASSES | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | sostate_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOSTATE | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | sostates_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOSTATES | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | sopattern_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOSTATEPATTERN | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | soaction_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOACTION | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | sohelper_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOHELPER | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | sonavhelper_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SONAVHELPER | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | soanimhelper_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOANIMHELPER | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | soevent_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SOEVENT | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | gametoken_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_GAMETOKEN | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | mat_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_MATERIAL | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | seq_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_SEQUENCE | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | mission_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_MISSIONOBJ | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | anim_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | animstate_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | animstateEx_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | bone_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | attachment_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | dialog_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | matparamslot_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | matparamname_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |- | ||
| + | | | ||
| + | matparamcharatt_ | ||
| + | |||
| + | | | ||
| + | IVariable::DT_USERITEMCB | ||
| + | |||
| + | |} | ||
| + | |||
| + | В полной лицензионной версии редактора можно добавлять новые префиксы для дополнительных типов редактора свойств, модифицировать файл ''Sandbox/Editor/HyperGraph/FlowGraphVariables.cpp'' | ||
| + | |||
| + | == Триггерные порты == | ||
| + | |||
| + | Иногда полезно использовать триггерный сигнал как входящий или исходящий порт. Такие порты могут быть реализованы используя тип ''In/OutputPortConfig_Void'' или ''In/OutputPortConfig_AnyType'' и не ''bool''. | ||
| + | |||
| + | [[Категория:CryEngine 3 Free SDK:Техническая документация]] | ||
Текущая версия на 12:36, 7 февраля 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 порта, дефолтное значение порта во время создания нового нода, описание порта и читаемое человеком имя порта.
Снова рекомендуется выбирать имя порта правильно, т.к. смена его позднее сломает ФГ, использующие этот нод. Важно: не используйте символ нижнего подчеркивания «_» в именах портов за исключением случая, когда вы хотите указать, что некоторый определенный редактор свойств должен быть использован. Следующие префиксы в именах входных портов признаются и могут быть использованы:
|
Префикс |
Тип редактора свойств |
|
snd_ |
IVariable::DT_SOUND |
|
sound_ |
IVariable::DT_SOUND |
|
dialogline_ |
IVariable::DT_DIALOG |
|
clr_ |
IVariable::DT_COLOR |
|
color_ |
IVariable::DT_COLOR |
|
tex_ |
IVariable::DT_TEXTURE |
|
texture_ |
IVariable::DT_TEXTURE |
|
obj_ |
IVariable::DT_OBJECT |
|
object_ |
IVariable::DT_OBJECT |
|
file_ |
IVariable::DT_FILE |
|
text_ |
IVariable::DT_LOCAL_STRING |
|
equip_ |
IVariable::DT_EQUIP |
|
reverbpreset_ |
IVariable::DT_REVERBPRESET |
|
aianchor_ |
IVariable::DT_AI_ANCHOR |
|
aibehavior_ |
IVariable::DT_AI_BEHAVIOR |
|
aicharacter_ |
IVariable::DT_AI_CHARACTER |
|
aipfpropertieslist_ |
IVariable::DT_AI_PFPROPERTIESLIST |
|
aiterritory_ |
IVariable::DT_AITERRITORY |
|
aiwave_ |
IVariable::DT_AIWAVE |
|
soclass_ |
IVariable::DT_SOCLASS |
|
soclasses_ |
IVariable::DT_SOCLASSES |
|
sostate_ |
IVariable::DT_SOSTATE |
|
sostates_ |
IVariable::DT_SOSTATES |
|
sopattern_ |
IVariable::DT_SOSTATEPATTERN |
|
soaction_ |
IVariable::DT_SOACTION |
|
sohelper_ |
IVariable::DT_SOHELPER |
|
sonavhelper_ |
IVariable::DT_SONAVHELPER |
|
soanimhelper_ |
IVariable::DT_SOANIMHELPER |
|
soevent_ |
IVariable::DT_SOEVENT |
|
gametoken_ |
IVariable::DT_GAMETOKEN |
|
mat_ |
IVariable::DT_MATERIAL |
|
seq_ |
IVariable::DT_SEQUENCE |
|
mission_ |
IVariable::DT_MISSIONOBJ |
|
anim_ |
IVariable::DT_USERITEMCB |
|
animstate_ |
IVariable::DT_USERITEMCB |
|
animstateEx_ |
IVariable::DT_USERITEMCB |
|
bone_ |
IVariable::DT_USERITEMCB |
|
attachment_ |
IVariable::DT_USERITEMCB |
|
dialog_ |
IVariable::DT_USERITEMCB |
|
matparamslot_ |
IVariable::DT_USERITEMCB |
|
matparamname_ |
IVariable::DT_USERITEMCB |
|
matparamcharatt_ |
IVariable::DT_USERITEMCB |
В полной лицензионной версии редактора можно добавлять новые префиксы для дополнительных типов редактора свойств, модифицировать файл Sandbox/Editor/HyperGraph/FlowGraphVariables.cpp
Триггерные порты
Иногда полезно использовать триггерный сигнал как входящий или исходящий порт. Такие порты могут быть реализованы используя тип In/OutputPortConfig_Void или In/OutputPortConfig_AnyType и не bool.