shader_graph.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  1. /*************************************************************************/
  2. /* shader_graph.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #include "shader_graph.h"
  30. #if 0
  31. void Shader::_set(const String& p_name, const Variant& p_value) {
  32. if (p_name.begins_with("nodes/")) {
  33. int idx=p_name.get_slice("/",1).to_int();
  34. Dictionary data=p_value;
  35. ERR_FAIL_COND(!data.has("type"));
  36. String type=data["type"];
  37. VS::ShaderNodeType node_type=VS::NODE_TYPE_MAX;
  38. for(int i=0;i<NODE_TYPE_MAX;i++) {
  39. if (type==VisualServer::shader_node_get_type_info((VS::ShaderNodeType)i).name)
  40. node_type=(VS::ShaderNodeType)i;
  41. }
  42. ERR_FAIL_COND(node_type==VS::NODE_TYPE_MAX);
  43. node_add( (NodeType)node_type, idx );
  44. if (data.has("param"))
  45. node_set_param(idx,data["param"]);
  46. if (data.has("pos"))
  47. node_set_pos(idx,data["pos"]);
  48. }
  49. if (p_name.begins_with("conns/")) {
  50. Dictionary data=p_value;
  51. ERR_FAIL_COND( !data.has("src_id") );
  52. ERR_FAIL_COND( !data.has("src_slot") );
  53. ERR_FAIL_COND( !data.has("dst_id") );
  54. ERR_FAIL_COND( !data.has("dst_slot") );
  55. connect(data["src_id"],data["src_slot"],data["dst_id"],data["dst_slot"]);
  56. }
  57. }
  58. Variant Shader::_get(const String& p_name) const {
  59. if (p_name.begins_with("nodes/")) {
  60. int idx=p_name.get_slice("/",1).to_int();
  61. Dictionary data;
  62. data["type"]=VisualServer::shader_node_get_type_info((VS::ShaderNodeType)node_get_type(idx)).name;
  63. data["pos"]=node_get_pos(idx);
  64. data["param"]=node_get_param(idx);
  65. return data;
  66. }
  67. if (p_name.begins_with("conns/")) {
  68. int idx=p_name.get_slice("/",1).to_int();
  69. Dictionary data;
  70. List<Connection> connections;
  71. get_connections(&connections);
  72. ERR_FAIL_INDEX_V( idx,connections.size(), Variant() );
  73. Connection c = connections[idx];
  74. data["src_id"]=c.src_id;
  75. data["src_slot"]=c.src_slot;
  76. data["dst_id"]=c.dst_id;
  77. data["dst_slot"]=c.dst_slot;
  78. return data;
  79. }
  80. return Variant();
  81. }
  82. void Shader::_get_property_list( List<PropertyInfo> *p_list) const {
  83. List<int> nodes;
  84. get_node_list(&nodes);
  85. for(List<int>::Element *E=nodes.front();E;E=E->next()) {
  86. int idx=E->get();
  87. p_list->push_back(PropertyInfo( Variant::DICTIONARY , "nodes/"+itos(idx),PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NETWORK|PROPERTY_USAGE_STORAGE ) );
  88. }
  89. List<Connection> connections;
  90. get_connections(&connections);
  91. int idx=0;
  92. for(List<Connection>::Element *E=connections.front();E;E=E->next()) {
  93. p_list->push_back(PropertyInfo( Variant::DICTIONARY , "conns/"+itos(idx++),PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NETWORK|PROPERTY_USAGE_STORAGE ) );
  94. }
  95. }
  96. Array Shader::_get_connections_helper() const {
  97. Array connections_ret;
  98. List<Connection> connections;
  99. get_connections(&connections);
  100. connections_ret.resize(connections.size());
  101. int idx=0;
  102. for(List<Connection>::Element *E=connections.front();E;E=E->next()) {
  103. Connection c = E->get();
  104. Dictionary data;
  105. data["src_id"]=c.src_id;
  106. data["src_slot"]=c.src_slot;
  107. data["dst_id"]=c.dst_id;
  108. data["dst_slot"]=c.dst_slot;
  109. connections_ret.set(idx++,data);
  110. }
  111. return connections_ret;
  112. }
  113. void Shader::_bind_methods() {
  114. ObjectTypeDB::bind_method(_MD("node_add"),&Shader::node_add );
  115. ObjectTypeDB::bind_method(_MD("node_remove"),&Shader::node_remove );
  116. ObjectTypeDB::bind_method(_MD("node_set_param"),&Shader::node_set_param );
  117. ObjectTypeDB::bind_method(_MD("node_set_pos"),&Shader::node_set_pos );
  118. ObjectTypeDB::bind_method(_MD("node_get_pos"),&Shader::node_get_pos );
  119. ObjectTypeDB::bind_method(_MD("node_get_param"),&Shader::node_get_type);
  120. ObjectTypeDB::bind_method(_MD("node_get_type"),&Shader::node_get_param);
  121. ObjectTypeDB::bind_method(_MD("connect"),&Shader::connect );
  122. ObjectTypeDB::bind_method(_MD("disconnect"),&Shader::disconnect );
  123. ObjectTypeDB::bind_method(_MD("get_connections"),&Shader::_get_connections_helper );
  124. ObjectTypeDB::bind_method(_MD("clear"),&Shader::clear );
  125. BIND_CONSTANT( NODE_IN ); ///< param 0: name
  126. BIND_CONSTANT( NODE_OUT ); ///< param 0: name
  127. BIND_CONSTANT( NODE_CONSTANT ); ///< param 0: value
  128. BIND_CONSTANT( NODE_PARAMETER ); ///< param 0: name
  129. BIND_CONSTANT( NODE_ADD );
  130. BIND_CONSTANT( NODE_SUB );
  131. BIND_CONSTANT( NODE_MUL );
  132. BIND_CONSTANT( NODE_DIV );
  133. BIND_CONSTANT( NODE_MOD );
  134. BIND_CONSTANT( NODE_SIN );
  135. BIND_CONSTANT( NODE_COS );
  136. BIND_CONSTANT( NODE_TAN );
  137. BIND_CONSTANT( NODE_ARCSIN );
  138. BIND_CONSTANT( NODE_ARCCOS );
  139. BIND_CONSTANT( NODE_ARCTAN );
  140. BIND_CONSTANT( NODE_POW );
  141. BIND_CONSTANT( NODE_LOG );
  142. BIND_CONSTANT( NODE_MAX );
  143. BIND_CONSTANT( NODE_MIN );
  144. BIND_CONSTANT( NODE_COMPARE );
  145. BIND_CONSTANT( NODE_TEXTURE ); ///< param 0: texture
  146. BIND_CONSTANT( NODE_TIME ); ///< param 0: interval length
  147. BIND_CONSTANT( NODE_NOISE );
  148. BIND_CONSTANT( NODE_PASS );
  149. BIND_CONSTANT( NODE_VEC_IN ); ///< param 0: name
  150. BIND_CONSTANT( NODE_VEC_OUT ); ///< param 0: name
  151. BIND_CONSTANT( NODE_VEC_CONSTANT ); ///< param 0: value
  152. BIND_CONSTANT( NODE_VEC_PARAMETER ); ///< param 0: name
  153. BIND_CONSTANT( NODE_VEC_ADD );
  154. BIND_CONSTANT( NODE_VEC_SUB );
  155. BIND_CONSTANT( NODE_VEC_MUL );
  156. BIND_CONSTANT( NODE_VEC_DIV );
  157. BIND_CONSTANT( NODE_VEC_MOD );
  158. BIND_CONSTANT( NODE_VEC_CROSS );
  159. BIND_CONSTANT( NODE_VEC_DOT );
  160. BIND_CONSTANT( NODE_VEC_POW );
  161. BIND_CONSTANT( NODE_VEC_NORMALIZE );
  162. BIND_CONSTANT( NODE_VEC_TRANSFORM3 );
  163. BIND_CONSTANT( NODE_VEC_TRANSFORM4 );
  164. BIND_CONSTANT( NODE_VEC_COMPARE );
  165. BIND_CONSTANT( NODE_VEC_TEXTURE_2D );
  166. BIND_CONSTANT( NODE_VEC_TEXTURE_CUBE );
  167. BIND_CONSTANT( NODE_VEC_NOISE );
  168. BIND_CONSTANT( NODE_VEC_0 );
  169. BIND_CONSTANT( NODE_VEC_1 );
  170. BIND_CONSTANT( NODE_VEC_2 );
  171. BIND_CONSTANT( NODE_VEC_BUILD );
  172. BIND_CONSTANT( NODE_VEC_PASS );
  173. BIND_CONSTANT( NODE_COLOR_CONSTANT );
  174. BIND_CONSTANT( NODE_COLOR_PARAMETER );
  175. BIND_CONSTANT( NODE_TEXTURE_PARAMETER );
  176. BIND_CONSTANT( NODE_TEXTURE_2D_PARAMETER );
  177. BIND_CONSTANT( NODE_TEXTURE_CUBE_PARAMETER );
  178. BIND_CONSTANT( NODE_TYPE_MAX );
  179. }
  180. void Shader::node_add(NodeType p_type,int p_id) {
  181. VisualServer::get_singleton()->shader_node_add(shader,(VS::ShaderNodeType)p_type,p_id);
  182. #ifdef TOOLS_ENABLED
  183. positions[p_id]=Point2();
  184. #endif
  185. version++;
  186. }
  187. void Shader::node_remove(int p_id) {
  188. VisualServer::get_singleton()->shader_node_remove(shader,p_id);
  189. #ifdef TOOLS_ENABLED
  190. positions.erase(p_id);
  191. #endif
  192. }
  193. void Shader::node_set_param( int p_id, const Variant& p_value) {
  194. VisualServer::get_singleton()->shader_node_set_param(shader,p_id,p_value);
  195. version++;
  196. }
  197. void Shader::get_node_list(List<int> *p_node_list) const {
  198. VisualServer::get_singleton()->shader_get_node_list(shader,p_node_list);
  199. }
  200. Shader::NodeType Shader::node_get_type(int p_id) const {
  201. return (NodeType)VisualServer::get_singleton()->shader_node_get_type(shader,p_id);
  202. }
  203. Variant Shader::node_get_param(int p_id) const {
  204. return VisualServer::get_singleton()->shader_node_get_param(shader,p_id);
  205. }
  206. void Shader::connect(int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot) {
  207. VisualServer::get_singleton()->shader_connect(shader,p_src_id,p_src_slot,p_dst_id,p_dst_slot);
  208. version++;
  209. }
  210. void Shader::disconnect(int p_src_id,int p_src_slot, int p_dst_id,int p_dst_slot) {
  211. VisualServer::get_singleton()->shader_disconnect(shader,p_src_id,p_src_slot,p_dst_id,p_dst_slot);
  212. version++;
  213. }
  214. void Shader::get_connections(List<Connection> *p_connections) const {
  215. List<VS::ShaderConnection> connections;
  216. VisualServer::get_singleton()->shader_get_connections(shader,&connections);
  217. for( List<VS::ShaderConnection>::Element *E=connections.front();E;E=E->next()) {
  218. Connection c;
  219. c.src_id=E->get().src_id;
  220. c.src_slot=E->get().src_slot;
  221. c.dst_id=E->get().dst_id;
  222. c.dst_slot=E->get().dst_slot;
  223. p_connections->push_back(c);
  224. }
  225. }
  226. void Shader::node_set_pos(int p_id,const Point2& p_pos) {
  227. #ifdef TOOLS_ENABLED
  228. ERR_FAIL_COND(!positions.has(p_id));
  229. positions[p_id]=p_pos;
  230. #endif
  231. }
  232. Point2 Shader::node_get_pos(int p_id) const {
  233. #ifdef TOOLS_ENABLED
  234. ERR_FAIL_COND_V(!positions.has(p_id),Point2());
  235. return positions[p_id];
  236. #endif
  237. }
  238. void Shader::clear() {
  239. VisualServer::get_singleton()->shader_clear(shader);
  240. version++;
  241. }
  242. Shader::Shader() {
  243. shader = VisualServer::get_singleton()->shader_create();
  244. version = 1;
  245. }
  246. Shader::~Shader() {
  247. VisualServer::get_singleton()->free(shader);
  248. }
  249. ShaderGraph::ShaderGraph()
  250. {
  251. }
  252. void VisualServer::shader_get_default_input_nodes(ShaderType p_type,List<PropertyInfo> *p_inputs) {
  253. switch(p_type) {
  254. case SHADER_VERTEX: {
  255. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"vertex") );
  256. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"normal") );
  257. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"binormal") );
  258. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"tangent") );
  259. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"uv") );
  260. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"color") );
  261. p_inputs->push_back( PropertyInfo( Variant::REAL,"alpha") );
  262. } break;
  263. case SHADER_FRAGMENT: {
  264. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"position") );
  265. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"normal") );
  266. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"binormal") );
  267. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"tangent") );
  268. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"uv") );
  269. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"color") );
  270. p_inputs->push_back( PropertyInfo( Variant::REAL,"alpha") );
  271. } break;
  272. case SHADER_POST_PROCESS: {
  273. p_inputs->push_back( PropertyInfo( Variant::VECTOR3,"color") );
  274. p_inputs->push_back( PropertyInfo( Variant::REAL,"alpha") );
  275. } break;
  276. }
  277. }
  278. void VisualServer::shader_get_default_output_nodes(ShaderType p_type,List<PropertyInfo> *p_outputs) {
  279. switch(p_type) {
  280. case SHADER_VERTEX: {
  281. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"vertex") );
  282. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"normal") );
  283. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"binormal") );
  284. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"tangent") );
  285. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"uv") );
  286. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"color") );
  287. p_outputs->push_back( PropertyInfo( Variant::REAL,"alpha") );
  288. } break;
  289. case SHADER_FRAGMENT: {
  290. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"normal") );
  291. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"diffuse") );
  292. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"specular") );
  293. p_outputs->push_back( PropertyInfo( Variant::REAL,"alpha") );
  294. p_outputs->push_back( PropertyInfo( Variant::REAL,"emission") );
  295. p_outputs->push_back( PropertyInfo( Variant::REAL,"spec_exp") );
  296. p_outputs->push_back( PropertyInfo( Variant::REAL,"glow") );
  297. p_outputs->push_back( PropertyInfo( Variant::REAL,"alpha_discard") );
  298. } break;
  299. case SHADER_POST_PROCESS: {
  300. p_outputs->push_back( PropertyInfo( Variant::VECTOR3,"color") );
  301. p_outputs->push_back( PropertyInfo( Variant::REAL,"alpha") );
  302. } break;
  303. }
  304. }
  305. PropertyInfo VisualServer::shader_node_get_type_info(ShaderNodeType p_type) {
  306. switch(p_type) {
  307. case NODE_IN: return PropertyInfo(Variant::STRING,"in");
  308. case NODE_OUT: return PropertyInfo(Variant::STRING,"out");
  309. case NODE_CONSTANT: return PropertyInfo(Variant::REAL,"const");
  310. case NODE_PARAMETER: return PropertyInfo(Variant::STRING,"param");
  311. case NODE_ADD: return PropertyInfo(Variant::NIL,"add");
  312. case NODE_SUB: return PropertyInfo(Variant::NIL,"sub");
  313. case NODE_MUL: return PropertyInfo(Variant::NIL,"mul");
  314. case NODE_DIV: return PropertyInfo(Variant::NIL,"div");
  315. case NODE_MOD: return PropertyInfo(Variant::NIL,"rem");
  316. case NODE_SIN: return PropertyInfo(Variant::NIL,"sin");
  317. case NODE_COS: return PropertyInfo(Variant::NIL,"cos");
  318. case NODE_TAN: return PropertyInfo(Variant::NIL,"tan");
  319. case NODE_ARCSIN: return PropertyInfo(Variant::NIL,"arcsin");
  320. case NODE_ARCCOS: return PropertyInfo(Variant::NIL,"arccos");
  321. case NODE_ARCTAN: return PropertyInfo(Variant::NIL,"arctan");
  322. case NODE_POW: return PropertyInfo(Variant::NIL,"pow");
  323. case NODE_LOG: return PropertyInfo(Variant::NIL,"log");
  324. case NODE_MAX: return PropertyInfo(Variant::NIL,"max");
  325. case NODE_MIN: return PropertyInfo(Variant::NIL,"min");
  326. case NODE_COMPARE: return PropertyInfo(Variant::NIL,"cmp");
  327. case NODE_TEXTURE: return PropertyInfo(Variant::_RID,"texture1D",PROPERTY_HINT_RESOURCE_TYPE,"Texture");
  328. case NODE_TIME: return PropertyInfo(Variant::NIL,"time");
  329. case NODE_NOISE: return PropertyInfo(Variant::NIL,"noise");
  330. case NODE_PASS: return PropertyInfo(Variant::NIL,"pass");
  331. case NODE_VEC_IN: return PropertyInfo(Variant::STRING,"vin");
  332. case NODE_VEC_OUT: return PropertyInfo(Variant::STRING,"vout");
  333. case NODE_VEC_CONSTANT: return PropertyInfo(Variant::VECTOR3,"vconst");
  334. case NODE_VEC_PARAMETER: return PropertyInfo(Variant::STRING,"vparam");
  335. case NODE_VEC_ADD: return PropertyInfo(Variant::NIL,"vadd");
  336. case NODE_VEC_SUB: return PropertyInfo(Variant::NIL,"vsub");
  337. case NODE_VEC_MUL: return PropertyInfo(Variant::NIL,"vmul");
  338. case NODE_VEC_DIV: return PropertyInfo(Variant::NIL,"vdiv");
  339. case NODE_VEC_MOD: return PropertyInfo(Variant::NIL,"vrem");
  340. case NODE_VEC_CROSS: return PropertyInfo(Variant::NIL,"cross");
  341. case NODE_VEC_DOT: return PropertyInfo(Variant::NIL,"dot");
  342. case NODE_VEC_POW: return PropertyInfo(Variant::NIL,"vpow");
  343. case NODE_VEC_NORMALIZE: return PropertyInfo(Variant::NIL,"normalize");
  344. case NODE_VEC_INTERPOLATE: return PropertyInfo(Variant::NIL,"mix");
  345. case NODE_VEC_SCREEN_TO_UV: return PropertyInfo(Variant::NIL,"scrn2uv");
  346. case NODE_VEC_TRANSFORM3: return PropertyInfo(Variant::NIL,"xform3");
  347. case NODE_VEC_TRANSFORM4: return PropertyInfo(Variant::NIL,"xform4");
  348. case NODE_VEC_COMPARE: return PropertyInfo(Variant::_RID,"vcmp",PROPERTY_HINT_RESOURCE_TYPE,"Texture");
  349. case NODE_VEC_TEXTURE_2D: return PropertyInfo(Variant::_RID,"texture2D",PROPERTY_HINT_RESOURCE_TYPE,"Texture");
  350. case NODE_VEC_TEXTURE_CUBE: return PropertyInfo(Variant::NIL,"texcube");
  351. case NODE_VEC_NOISE: return PropertyInfo(Variant::NIL,"vec_noise");
  352. case NODE_VEC_0: return PropertyInfo(Variant::NIL,"vec_0");
  353. case NODE_VEC_1: return PropertyInfo(Variant::NIL,"vec_1");
  354. case NODE_VEC_2: return PropertyInfo(Variant::NIL,"vec_2");
  355. case NODE_VEC_BUILD: return PropertyInfo(Variant::NIL,"vbuild");
  356. case NODE_VEC_PASS: return PropertyInfo(Variant::NIL,"vpass");
  357. case NODE_COLOR_CONSTANT: return PropertyInfo(Variant::COLOR,"color_const");
  358. case NODE_COLOR_PARAMETER: return PropertyInfo(Variant::STRING,"color_param");
  359. case NODE_TEXTURE_PARAMETER: return PropertyInfo(Variant::STRING,"tex1D_param");
  360. case NODE_TEXTURE_2D_PARAMETER: return PropertyInfo(Variant::STRING,"tex2D_param");
  361. case NODE_TEXTURE_CUBE_PARAMETER: return PropertyInfo(Variant::STRING,"texcube_param");
  362. case NODE_TRANSFORM_CONSTANT: return PropertyInfo(Variant::TRANSFORM,"xform_const");
  363. case NODE_TRANSFORM_PARAMETER: return PropertyInfo(Variant::STRING,"xform_param");
  364. case NODE_LABEL: return PropertyInfo(Variant::STRING,"label");
  365. default: {}
  366. }
  367. ERR_FAIL_V( PropertyInfo(Variant::NIL,"error") );
  368. }
  369. int VisualServer::shader_get_input_count(ShaderNodeType p_type) {
  370. switch(p_type) {
  371. case NODE_IN: return 0;
  372. case NODE_OUT: return 1;
  373. case NODE_CONSTANT: return 0;
  374. case NODE_PARAMETER: return 0;
  375. case NODE_ADD: return 2;
  376. case NODE_SUB: return 2;
  377. case NODE_MUL: return 2;
  378. case NODE_DIV: return 2;
  379. case NODE_MOD: return 2;
  380. case NODE_SIN: return 1;
  381. case NODE_COS: return 1;
  382. case NODE_TAN: return 1;
  383. case NODE_ARCSIN: return 1;
  384. case NODE_ARCCOS: return 1;
  385. case NODE_ARCTAN: return 1;
  386. case NODE_POW: return 2;
  387. case NODE_LOG: return 1;
  388. case NODE_MAX: return 2;
  389. case NODE_MIN: return 2;
  390. case NODE_COMPARE: return 4;
  391. case NODE_TEXTURE: return 1; ///< param 0: texture
  392. case NODE_TIME: return 1; ///< param 0: interval length
  393. case NODE_NOISE: return 0;
  394. case NODE_PASS: return 1;
  395. case NODE_VEC_IN: return 0; ///< param 0: name
  396. case NODE_VEC_OUT: return 1; ///< param 0: name
  397. case NODE_VEC_CONSTANT: return 0; ///< param 0: value
  398. case NODE_VEC_PARAMETER: return 0; ///< param 0: name
  399. case NODE_VEC_ADD: return 2;
  400. case NODE_VEC_SUB: return 2;
  401. case NODE_VEC_MUL: return 2;
  402. case NODE_VEC_DIV: return 2;
  403. case NODE_VEC_MOD: return 2;
  404. case NODE_VEC_CROSS: return 2;
  405. case NODE_VEC_DOT: return 2;
  406. case NODE_VEC_POW: return 2;
  407. case NODE_VEC_NORMALIZE: return 1;
  408. case NODE_VEC_INTERPOLATE: return 3;
  409. case NODE_VEC_SCREEN_TO_UV: return 1;
  410. case NODE_VEC_TRANSFORM3: return 4;
  411. case NODE_VEC_TRANSFORM4: return 5;
  412. case NODE_VEC_COMPARE: return 4;
  413. case NODE_VEC_TEXTURE_2D: return 1;
  414. case NODE_VEC_TEXTURE_CUBE: return 1;
  415. case NODE_VEC_NOISE: return 0;
  416. case NODE_VEC_0: return 1;
  417. case NODE_VEC_1: return 1;
  418. case NODE_VEC_2: return 1;
  419. case NODE_VEC_BUILD: return 3;
  420. case NODE_VEC_PASS: return 1;
  421. case NODE_COLOR_CONSTANT: return 0;
  422. case NODE_COLOR_PARAMETER: return 0;
  423. case NODE_TEXTURE_PARAMETER: return 1;
  424. case NODE_TEXTURE_2D_PARAMETER: return 1;
  425. case NODE_TEXTURE_CUBE_PARAMETER: return 1;
  426. case NODE_TRANSFORM_CONSTANT: return 1;
  427. case NODE_TRANSFORM_PARAMETER: return 1;
  428. case NODE_LABEL: return 0;
  429. default: {}
  430. }
  431. ERR_FAIL_V( 0 );
  432. }
  433. int VisualServer::shader_get_output_count(ShaderNodeType p_type) {
  434. switch(p_type) {
  435. case NODE_IN: return 1;
  436. case NODE_OUT: return 0;
  437. case NODE_CONSTANT: return 1;
  438. case NODE_PARAMETER: return 1;
  439. case NODE_ADD: return 1;
  440. case NODE_SUB: return 1;
  441. case NODE_MUL: return 1;
  442. case NODE_DIV: return 1;
  443. case NODE_MOD: return 1;
  444. case NODE_SIN: return 1;
  445. case NODE_COS: return 1;
  446. case NODE_TAN: return 1;
  447. case NODE_ARCSIN: return 1;
  448. case NODE_ARCCOS: return 1;
  449. case NODE_ARCTAN: return 1;
  450. case NODE_POW: return 1;
  451. case NODE_LOG: return 1;
  452. case NODE_MAX: return 1;
  453. case NODE_MIN: return 1;
  454. case NODE_COMPARE: return 2;
  455. case NODE_TEXTURE: return 3; ///< param 0: texture
  456. case NODE_TIME: return 1; ///< param 0: interval length
  457. case NODE_NOISE: return 1;
  458. case NODE_PASS: return 1;
  459. case NODE_VEC_IN: return 1; ///< param 0: name
  460. case NODE_VEC_OUT: return 0; ///< param 0: name
  461. case NODE_VEC_CONSTANT: return 1; ///< param 0: value
  462. case NODE_VEC_PARAMETER: return 1; ///< param 0: name
  463. case NODE_VEC_ADD: return 1;
  464. case NODE_VEC_SUB: return 1;
  465. case NODE_VEC_MUL: return 1;
  466. case NODE_VEC_DIV: return 1;
  467. case NODE_VEC_MOD: return 1;
  468. case NODE_VEC_CROSS: return 1;
  469. case NODE_VEC_DOT: return 1;
  470. case NODE_VEC_POW: return 1;
  471. case NODE_VEC_NORMALIZE: return 1;
  472. case NODE_VEC_INTERPOLATE: return 1;
  473. case NODE_VEC_SCREEN_TO_UV: return 1;
  474. case NODE_VEC_TRANSFORM3: return 1;
  475. case NODE_VEC_TRANSFORM4: return 1;
  476. case NODE_VEC_COMPARE: return 2;
  477. case NODE_VEC_TEXTURE_2D: return 3;
  478. case NODE_VEC_TEXTURE_CUBE: return 3;
  479. case NODE_VEC_NOISE: return 1;
  480. case NODE_VEC_0: return 1;
  481. case NODE_VEC_1: return 1;
  482. case NODE_VEC_2: return 1;
  483. case NODE_VEC_BUILD: return 1;
  484. case NODE_VEC_PASS: return 1;
  485. case NODE_COLOR_CONSTANT: return 2;
  486. case NODE_COLOR_PARAMETER: return 2;
  487. case NODE_TEXTURE_PARAMETER: return 3;
  488. case NODE_TEXTURE_2D_PARAMETER: return 3;
  489. case NODE_TEXTURE_CUBE_PARAMETER: return 3;
  490. case NODE_TRANSFORM_CONSTANT: return 1;
  491. case NODE_TRANSFORM_PARAMETER: return 1;
  492. case NODE_LABEL: return 0;
  493. default: {}
  494. }
  495. ERR_FAIL_V( 0 );
  496. }
  497. #define RET2(m_a,m_b) if (p_idx==0) return m_a; else if (p_idx==1) return m_b; else return "";
  498. #define RET3(m_a,m_b,m_c) if (p_idx==0) return m_a; else if (p_idx==1) return m_b; else if (p_idx==2) return m_c; else return "";
  499. #define RET4(m_a,m_b,m_c,m_d) if (p_idx==0) return m_a; else if (p_idx==1) return m_b; else if (p_idx==2) return m_c; else if (p_idx==3) return m_d; else return "";
  500. #define RET5(m_a,m_b,m_c,m_d,m_e) if (p_idx==0) return m_a; else if (p_idx==1) return m_b; else if (p_idx==2) return m_c; else if (p_idx==3) return m_d; else if (p_idx==4) return m_e; else return "";
  501. String VisualServer::shader_get_input_name(ShaderNodeType p_type,int p_idx) {
  502. switch(p_type) {
  503. case NODE_IN: return "";
  504. case NODE_OUT: return "out";
  505. case NODE_CONSTANT: return "";
  506. case NODE_PARAMETER: return "";
  507. case NODE_ADD: RET2("a","b");
  508. case NODE_SUB: RET2("a","b");
  509. case NODE_MUL: RET2("a","b");
  510. case NODE_DIV: RET2("a","b");
  511. case NODE_MOD: RET2("a","b");
  512. case NODE_SIN: return "rad";
  513. case NODE_COS: return "rad";
  514. case NODE_TAN: return "rad";
  515. case NODE_ARCSIN: return "in";
  516. case NODE_ARCCOS: return "in";
  517. case NODE_ARCTAN: return "in";
  518. case NODE_POW: RET2("in","exp");
  519. case NODE_LOG: return "in";
  520. case NODE_MAX: return "in";
  521. case NODE_MIN: return "in";
  522. case NODE_COMPARE: RET4("a","b","ret1","ret2");
  523. case NODE_TEXTURE: return "u";
  524. case NODE_TIME: return "";
  525. case NODE_NOISE: return "";
  526. case NODE_PASS: return "in";
  527. case NODE_VEC_IN: return "";
  528. case NODE_VEC_OUT: return "out";
  529. case NODE_VEC_CONSTANT: return "";
  530. case NODE_VEC_PARAMETER: return "";
  531. case NODE_VEC_ADD: RET2("a","b");
  532. case NODE_VEC_SUB: RET2("a","b");
  533. case NODE_VEC_MUL: RET2("a","b");
  534. case NODE_VEC_DIV: RET2("a","b");
  535. case NODE_VEC_MOD: RET2("a","b");
  536. case NODE_VEC_CROSS: RET2("a","b");
  537. case NODE_VEC_DOT: RET2("a","b");
  538. case NODE_VEC_POW: RET2("a","b");
  539. case NODE_VEC_NORMALIZE: return "vec";
  540. case NODE_VEC_INTERPOLATE: RET3("a","b","c");
  541. case NODE_VEC_SCREEN_TO_UV: return "scr";
  542. case NODE_VEC_TRANSFORM3: RET4("in","col0","col1","col2");
  543. case NODE_VEC_TRANSFORM4: RET5("in","col0","col1","col2","col3");
  544. case NODE_VEC_COMPARE: RET4("a","b","ret1","ret2");
  545. case NODE_VEC_TEXTURE_2D: return "uv";
  546. case NODE_VEC_TEXTURE_CUBE: return "uvw";
  547. case NODE_VEC_NOISE: return "";
  548. case NODE_VEC_0: return "vec";
  549. case NODE_VEC_1: return "vec";
  550. case NODE_VEC_2: return "vec";
  551. case NODE_VEC_BUILD: RET3("x/r","y/g","z/b");
  552. case NODE_VEC_PASS: return "in";
  553. case NODE_COLOR_CONSTANT: return "";
  554. case NODE_COLOR_PARAMETER: return "";
  555. case NODE_TEXTURE_PARAMETER: return "u";
  556. case NODE_TEXTURE_2D_PARAMETER: return "uv";
  557. case NODE_TEXTURE_CUBE_PARAMETER: return "uvw";
  558. case NODE_TRANSFORM_CONSTANT: return "in";
  559. case NODE_TRANSFORM_PARAMETER: return "in";
  560. case NODE_LABEL: return "";
  561. default: {}
  562. }
  563. ERR_FAIL_V("");
  564. }
  565. String VisualServer::shader_get_output_name(ShaderNodeType p_type,int p_idx) {
  566. switch(p_type) {
  567. case NODE_IN: return "in";
  568. case NODE_OUT: return "";
  569. case NODE_CONSTANT: return "out";
  570. case NODE_PARAMETER: return "out";
  571. case NODE_ADD: return "sum";
  572. case NODE_SUB: return "dif";
  573. case NODE_MUL: return "prod";
  574. case NODE_DIV: return "quot";
  575. case NODE_MOD: return "rem";
  576. case NODE_SIN: return "out";
  577. case NODE_COS: return "out";
  578. case NODE_TAN: return "out";
  579. case NODE_ARCSIN: return "rad";
  580. case NODE_ARCCOS: return "rad";
  581. case NODE_ARCTAN: return "rad";
  582. case NODE_POW: RET2("in","exp");
  583. case NODE_LOG: return "out";
  584. case NODE_MAX: return "out";
  585. case NODE_MIN: return "out";
  586. case NODE_COMPARE: RET2("a/b","a/b");
  587. case NODE_TEXTURE: RET3("rgb","a","v");
  588. case NODE_TIME: return "out";
  589. case NODE_NOISE: return "out";
  590. case NODE_PASS: return "out";
  591. case NODE_VEC_IN: return "in";
  592. case NODE_VEC_OUT: return "";
  593. case NODE_VEC_CONSTANT: return "out";
  594. case NODE_VEC_PARAMETER: return "out";
  595. case NODE_VEC_ADD: return "sum";
  596. case NODE_VEC_SUB: return "sub";
  597. case NODE_VEC_MUL: return "mul";
  598. case NODE_VEC_DIV: return "div";
  599. case NODE_VEC_MOD: return "rem";
  600. case NODE_VEC_CROSS: return "crs";
  601. case NODE_VEC_DOT: return "prod";
  602. case NODE_VEC_POW: return "out";
  603. case NODE_VEC_NORMALIZE: return "norm";
  604. case NODE_VEC_INTERPOLATE: return "out";
  605. case NODE_VEC_SCREEN_TO_UV: return "uv";
  606. case NODE_VEC_TRANSFORM3: return "prod";
  607. case NODE_VEC_TRANSFORM4: return "prod";
  608. case NODE_VEC_COMPARE: RET2("a/b","a/b");
  609. case NODE_VEC_TEXTURE_2D: RET3("rgb","a","v");
  610. case NODE_VEC_TEXTURE_CUBE: RET3("rgb","a","v");
  611. case NODE_VEC_NOISE: return "out";
  612. case NODE_VEC_0: return "x/r";
  613. case NODE_VEC_1: return "y/g";
  614. case NODE_VEC_2: return "z/b";
  615. case NODE_VEC_BUILD: return "vec";
  616. case NODE_VEC_PASS: return "out";
  617. case NODE_COLOR_CONSTANT: RET2("rgb","a");
  618. case NODE_COLOR_PARAMETER: RET2("rgb","a");
  619. case NODE_TEXTURE_PARAMETER: RET3("rgb","a","v");
  620. case NODE_TEXTURE_2D_PARAMETER: RET3("rgb","a","v");
  621. case NODE_TEXTURE_CUBE_PARAMETER: RET3("rgb","a","v");
  622. case NODE_TRANSFORM_CONSTANT: return "out";
  623. case NODE_TRANSFORM_PARAMETER: return "out";
  624. case NODE_LABEL: return "";
  625. default: {}
  626. }
  627. ERR_FAIL_V("");
  628. }
  629. bool VisualServer::shader_is_input_vector(ShaderNodeType p_type,int p_input) {
  630. switch(p_type) {
  631. case NODE_IN: return false;
  632. case NODE_OUT: return false;
  633. case NODE_CONSTANT: return false;
  634. case NODE_PARAMETER: return false;
  635. case NODE_ADD: return false;
  636. case NODE_SUB: return false;
  637. case NODE_MUL: return false;
  638. case NODE_DIV: return false;
  639. case NODE_MOD: return false;
  640. case NODE_SIN: return false;
  641. case NODE_COS: return false;
  642. case NODE_TAN: return false;
  643. case NODE_ARCSIN: return false;
  644. case NODE_ARCCOS: return false;
  645. case NODE_ARCTAN: return false;
  646. case NODE_POW: return false;
  647. case NODE_LOG: return false;
  648. case NODE_MAX: return false;
  649. case NODE_MIN: return false;
  650. case NODE_COMPARE: return false;
  651. case NODE_TEXTURE: return false;
  652. case NODE_TIME: return false;
  653. case NODE_NOISE: return false;
  654. case NODE_PASS: return false;
  655. case NODE_VEC_IN: return false;
  656. case NODE_VEC_OUT: return true;
  657. case NODE_VEC_CONSTANT: return false;
  658. case NODE_VEC_PARAMETER: return false;
  659. case NODE_VEC_ADD: return true;
  660. case NODE_VEC_SUB: return true;
  661. case NODE_VEC_MUL: return true;
  662. case NODE_VEC_DIV: return true;
  663. case NODE_VEC_MOD: return true;
  664. case NODE_VEC_CROSS: return true;
  665. case NODE_VEC_DOT: return true;
  666. case NODE_VEC_POW: return (p_input==0)?true:false;
  667. case NODE_VEC_NORMALIZE: return true;
  668. case NODE_VEC_INTERPOLATE: return (p_input<2)?true:false;
  669. case NODE_VEC_SCREEN_TO_UV: return true;
  670. case NODE_VEC_TRANSFORM3: return true;
  671. case NODE_VEC_TRANSFORM4: return true;
  672. case NODE_VEC_COMPARE: return (p_input<2)?false:true;
  673. case NODE_VEC_TEXTURE_2D: return true;
  674. case NODE_VEC_TEXTURE_CUBE: return true;
  675. case NODE_VEC_NOISE: return false;
  676. case NODE_VEC_0: return true;
  677. case NODE_VEC_1: return true;
  678. case NODE_VEC_2: return true;
  679. case NODE_VEC_BUILD: return false;
  680. case NODE_VEC_PASS: return true;
  681. case NODE_COLOR_CONSTANT: return false;
  682. case NODE_COLOR_PARAMETER: return false;
  683. case NODE_TEXTURE_PARAMETER: return false;
  684. case NODE_TEXTURE_2D_PARAMETER: return true;
  685. case NODE_TEXTURE_CUBE_PARAMETER: return true;
  686. case NODE_TRANSFORM_CONSTANT: return true;
  687. case NODE_TRANSFORM_PARAMETER: return true;
  688. case NODE_LABEL: return false;
  689. default: {}
  690. }
  691. ERR_FAIL_V(false);
  692. }
  693. bool VisualServer::shader_is_output_vector(ShaderNodeType p_type,int p_input) {
  694. switch(p_type) {
  695. case NODE_IN: return false;
  696. case NODE_OUT: return false ;
  697. case NODE_CONSTANT: return false;
  698. case NODE_PARAMETER: return false;
  699. case NODE_ADD: return false;
  700. case NODE_SUB: return false;
  701. case NODE_MUL: return false;
  702. case NODE_DIV: return false;
  703. case NODE_MOD: return false;
  704. case NODE_SIN: return false;
  705. case NODE_COS: return false;
  706. case NODE_TAN: return false;
  707. case NODE_ARCSIN: return false;
  708. case NODE_ARCCOS: return false;
  709. case NODE_ARCTAN: return false;
  710. case NODE_POW: return false;
  711. case NODE_LOG: return false;
  712. case NODE_MAX: return false;
  713. case NODE_MIN: return false;
  714. case NODE_COMPARE: return false;
  715. case NODE_TEXTURE: return false;
  716. case NODE_TIME: return false;
  717. case NODE_NOISE: return false;
  718. case NODE_PASS: return false;
  719. case NODE_VEC_IN: return true;
  720. case NODE_VEC_OUT: return false;
  721. case NODE_VEC_CONSTANT: return true;
  722. case NODE_VEC_PARAMETER: return true;
  723. case NODE_VEC_ADD: return true;
  724. case NODE_VEC_SUB: return true;
  725. case NODE_VEC_MUL: return true;
  726. case NODE_VEC_DIV: return true;
  727. case NODE_VEC_MOD: return true;
  728. case NODE_VEC_CROSS: return true;
  729. case NODE_VEC_DOT: return false;
  730. case NODE_VEC_POW: return true;
  731. case NODE_VEC_NORMALIZE: return true;
  732. case NODE_VEC_INTERPOLATE: return true;
  733. case NODE_VEC_SCREEN_TO_UV: return true;
  734. case NODE_VEC_TRANSFORM3: return true;
  735. case NODE_VEC_TRANSFORM4: return true;
  736. case NODE_VEC_COMPARE: return true;
  737. case NODE_VEC_TEXTURE_2D: return (p_input==0)?true:false;
  738. case NODE_VEC_TEXTURE_CUBE: return (p_input==0)?true:false;
  739. case NODE_VEC_NOISE: return true;
  740. case NODE_VEC_0: return false;
  741. case NODE_VEC_1: return false;
  742. case NODE_VEC_2: return false;
  743. case NODE_VEC_BUILD: return true;
  744. case NODE_VEC_PASS: return true;
  745. case NODE_COLOR_CONSTANT: return (p_input==0)?true:false;
  746. case NODE_COLOR_PARAMETER: return (p_input==0)?true:false;
  747. case NODE_TEXTURE_PARAMETER: return (p_input==0)?true:false;
  748. case NODE_TEXTURE_2D_PARAMETER: return (p_input==0)?true:false;
  749. case NODE_TEXTURE_CUBE_PARAMETER: return (p_input==0)?true:false;
  750. case NODE_TRANSFORM_CONSTANT: return true;
  751. case NODE_TRANSFORM_PARAMETER: return true;
  752. case NODE_LABEL: return false;
  753. default: {}
  754. }
  755. ERR_FAIL_V("");
  756. }
  757. #endif