rasterizer.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. /*************************************************************************/
  2. /* rasterizer.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 "rasterizer.h"
  30. #include "print_string.h"
  31. #include "os/os.h"
  32. RID Rasterizer::create_default_material() {
  33. return material_create();
  34. }
  35. /* Fixed MAterial SHADER API */
  36. RID Rasterizer::_create_shader(const FixedMaterialShaderKey& p_key) {
  37. ERR_FAIL_COND_V(!p_key.valid,RID());
  38. Map<FixedMaterialShaderKey,FixedMaterialShader>::Element *E=fixed_material_shaders.find(p_key);
  39. if (E) {
  40. E->get().refcount++;
  41. return E->get().shader;
  42. }
  43. uint64_t t = OS::get_singleton()->get_ticks_usec();
  44. FixedMaterialShader fms;
  45. fms.refcount=1;
  46. fms.shader=shader_create();
  47. //create shader code
  48. int texcoords_used=0;
  49. String code;
  50. static const char* _uv_str[4]={"UV","uv_xform","UV2","uv_sphere"};
  51. #define _TEXUVSTR(m_idx) String( _uv_str[(p_key.texcoord_mask>>(m_idx*2))&0x3] )
  52. if (p_key.use_pointsize) {
  53. code+="UV=POINT_COORD;\n";
  54. }
  55. for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
  56. if (p_key.texture_mask&(1<<i))
  57. texcoords_used|=(1<<((p_key.texcoord_mask>>(i*2))&0x3));
  58. }
  59. if (texcoords_used&(1<<VS::FIXED_MATERIAL_TEXCOORD_UV_TRANSFORM)) {
  60. code+="uniform mat4 fmp_uv_xform;\n";
  61. code+="vec2 uv_xform = fmp_uv_xform * UV;\n";
  62. }
  63. /* HANDLE NORMAL MAPPING */
  64. if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_NORMAL)) {
  65. String scode;
  66. scode+="uniform float fmp_normal;\n";
  67. scode+="uniform texture fmp_normal_tex;\n";
  68. String uv_str;
  69. if ((p_key.texcoord_mask>>(VS::FIXED_MATERIAL_PARAM_NORMAL*2))&0x3==VS::FIXED_MATERIAL_TEXCOORD_SPHERE) {
  70. uv_str="uv"; //sorry not supported
  71. } else {
  72. uv_str=_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_NORMAL);
  73. }
  74. scode+="vec3 normal=tex( fmp_normal_tex,"+uv_str+").xyz * 2.0 - vec3(1.0,1.0,1.0);\n";
  75. scode+="NORMAL = mix( NORMAL,mat3(TANGENT,BINORMAL,NORMAL) * normal, fmp_normal);\n";
  76. code+=scode;
  77. }
  78. //handle sphere uv if used, do it here because it needs the normal, which may be transformed by a normal map
  79. if (texcoords_used&(1<<VS::FIXED_MATERIAL_TEXCOORD_SPHERE)) {
  80. String tcode;
  81. tcode="vec3 eye_normal = normalize(VERTEX);\n";
  82. tcode+="vec3 ref = (eye_normal - 2.0*dot(NORMAL, eye_normal)*NORMAL);\n";
  83. tcode+="ref.z+=1.0;\n";
  84. tcode+="vec2 uv_sphere = ref.xy*vec2(0.5,0.0-0.5)+vec2(0.5,0.0-0.5);\n";
  85. code+=tcode;
  86. }
  87. /* HANDLE DIFFUSE LIGHTING */
  88. code+="uniform color fmp_diffuse;\n";
  89. code+="color diffuse=fmp_diffuse;\n";
  90. if (p_key.use_color_array)
  91. code+="diffuse*=COLOR;\n";
  92. if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_DIFFUSE)) {
  93. code+="uniform texture fmp_diffuse_tex;\n";
  94. code+="diffuse*=tex( fmp_diffuse_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_DIFFUSE)+");\n";
  95. }
  96. if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_DETAIL)) {
  97. String dcode;
  98. dcode+="uniform texture fmp_detail_tex;\n";
  99. dcode+="uniform float fmp_detail;\n";
  100. dcode+="color detail=tex( fmp_detail_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_DETAIL)+");\n";
  101. switch(p_key.detail_blend) {
  102. case VS::MATERIAL_BLEND_MODE_MIX:
  103. dcode+="diffuse=vec4(mix(diffuse.rgb,detail.rgb,detail.a*fmp_detail),diffuse.a);\n";
  104. break;
  105. case VS::MATERIAL_BLEND_MODE_ADD:
  106. dcode+="diffuse=vec4(diffuse.rgb+detail.rgb*fmp_detail,diffuse.a);\n";
  107. break;
  108. case VS::MATERIAL_BLEND_MODE_SUB:
  109. dcode+="diffuse=vec4(diffuse.rgb+detail.rgb*fmp_detail,diffuse.a);\n";
  110. break;
  111. case VS::MATERIAL_BLEND_MODE_MUL:
  112. dcode+="diffuse=diffuse*mix(vec4(1,1,1,1),detail,fmp_detail);\n";
  113. break;
  114. }
  115. code+=dcode;
  116. }
  117. if (p_key.use_alpha) {
  118. code+="DIFFUSE_ALPHA=diffuse;\n";
  119. if (p_key.discard_alpha) {
  120. code+="DISCARD=diffuse.a<0.5;\n";
  121. }
  122. } else {
  123. code+="DIFFUSE=diffuse.rgb;\n";
  124. }
  125. /* HANDLE SPECULAR LIGHTING */
  126. code+="uniform color fmp_specular;\n";
  127. code+="color specular=fmp_specular;\n";
  128. if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_SPECULAR)) {
  129. String scode;
  130. scode+="uniform texture fmp_specular_tex;\n";
  131. scode+="specular*=tex( fmp_specular_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SPECULAR)+");\n";
  132. code+=scode;
  133. }
  134. code+="SPECULAR=specular.rgb;\n";
  135. code+="uniform float fmp_specular_exp;\n";
  136. code+="float specular_exp=fmp_specular_exp;\n";
  137. if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP)) {
  138. String scode;
  139. scode+="uniform texture fmp_specular_exp_tex;\n";
  140. scode+="specular_exp*=tex( fmp_specular_exp_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP)+").r;\n";
  141. code+=scode;
  142. }
  143. code+="SPEC_EXP=specular_exp;\n";
  144. /* HANDLE EMISSION LIGHTING */
  145. code+="uniform color fmp_emission;\n";
  146. code+="color emission=fmp_emission;\n";
  147. if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_EMISSION)) {
  148. String scode;
  149. scode+="uniform texture fmp_emission_tex;\n";
  150. scode+="emission*=tex( fmp_emission_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_EMISSION)+");\n";
  151. code+=scode;
  152. }
  153. code+="EMISSION=emission.rgb;\n";
  154. /* HANDLE GLOW */
  155. code+="uniform float fmp_glow;\n";
  156. code+="float glow=fmp_glow;\n";
  157. if (p_key.texture_mask&(1<<VS::FIXED_MATERIAL_PARAM_GLOW)) {
  158. String scode;
  159. scode+="uniform texture fmp_glow_tex;\n";
  160. scode+="glow*=tex( fmp_glow_tex,"+_TEXUVSTR(VS::FIXED_MATERIAL_PARAM_GLOW)+").r;\n";
  161. code+=scode;
  162. }
  163. code+="GLOW=glow;\n";
  164. //print_line("**FRAGMENT SHADER GENERATED code: \n"+code);
  165. String vcode;
  166. vcode="uniform float "+_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]+";\n";
  167. vcode+="SPEC_EXP="+_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP]+";\n";
  168. if (p_key.use_pointsize) {
  169. vcode+="uniform float "+_fixed_material_point_size_name+";\n";
  170. vcode+="POINT_SIZE="+_fixed_material_point_size_name+";\n";
  171. // vcode+="POINT_SIZE=10.0;\n";
  172. }
  173. //print_line("**VERTEX SHADER GENERATED code: \n"+vcode);
  174. double tf = (OS::get_singleton()->get_ticks_usec()-t)/1000.0;
  175. // print_line("generate: "+rtos(tf));
  176. shader_set_code(fms.shader,vcode,code,0,0);
  177. fixed_material_shaders[p_key]=fms;
  178. return fms.shader;
  179. }
  180. void Rasterizer::_free_shader(const FixedMaterialShaderKey& p_key) {
  181. if (p_key.valid==0)
  182. return; //not a valid key
  183. Map<FixedMaterialShaderKey,FixedMaterialShader>::Element *E=fixed_material_shaders.find(p_key);
  184. ERR_FAIL_COND(!E);
  185. E->get().refcount--;
  186. if (E->get().refcount==0) {
  187. free(E->get().shader);
  188. fixed_material_shaders.erase(E);
  189. }
  190. }
  191. void Rasterizer::fixed_material_set_flag(RID p_material, VS::FixedMaterialFlags p_flag, bool p_enabled) {
  192. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  193. ERR_FAIL_COND(!E);
  194. FixedMaterial &fm=*E->get();
  195. switch(p_flag) {
  196. case VS::FIXED_MATERIAL_FLAG_USE_ALPHA: fm.use_alpha=p_enabled; break;
  197. case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY: fm.use_color_array=p_enabled; break;
  198. case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE: fm.use_pointsize=p_enabled; break;
  199. case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA: fm.discard_alpha=p_enabled; break;
  200. }
  201. if (!fm.dirty_list.in_list())
  202. fixed_material_dirty_list.add( &fm.dirty_list );
  203. }
  204. bool Rasterizer::fixed_material_get_flag(RID p_material, VS::FixedMaterialFlags p_flag) const{
  205. const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  206. ERR_FAIL_COND_V(!E,false);
  207. const FixedMaterial &fm=*E->get();
  208. switch(p_flag) {
  209. case VS::FIXED_MATERIAL_FLAG_USE_ALPHA: return fm.use_alpha;; break;
  210. case VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY: return fm.use_color_array;; break;
  211. case VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE: return fm.use_pointsize;; break;
  212. case VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA: return fm.discard_alpha;; break;
  213. }
  214. return false;
  215. }
  216. RID Rasterizer::fixed_material_create() {
  217. RID mat = material_create();
  218. fixed_materials[mat]=memnew( FixedMaterial() );
  219. FixedMaterial &fm=*fixed_materials[mat];
  220. fm.self=mat;
  221. fm.get_key();
  222. for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
  223. material_set_param(mat,_fixed_material_param_names[i],fm.param[i]); //must be there
  224. }
  225. fixed_material_dirty_list.add(&fm.dirty_list);
  226. //print_line("FMC: "+itos(mat.get_id()));
  227. return mat;
  228. }
  229. void Rasterizer::fixed_material_set_parameter(RID p_material, VS::FixedMaterialParam p_parameter, const Variant& p_value){
  230. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  231. ERR_FAIL_COND(!E);
  232. FixedMaterial &fm=*E->get();
  233. RID material=E->key();
  234. ERR_FAIL_INDEX(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX);
  235. if ((p_parameter==VS::FIXED_MATERIAL_PARAM_DIFFUSE || p_parameter==VS::FIXED_MATERIAL_PARAM_SPECULAR || p_parameter==VS::FIXED_MATERIAL_PARAM_EMISSION)) {
  236. if (p_value.get_type()!=Variant::COLOR) {
  237. ERR_EXPLAIN(String(_fixed_material_param_names[p_parameter])+" expects Color");
  238. ERR_FAIL();
  239. }
  240. } else {
  241. if (!p_value.is_num()) {
  242. ERR_EXPLAIN(String(_fixed_material_param_names[p_parameter])+" expects scalar");
  243. ERR_FAIL();
  244. }
  245. }
  246. fm.param[p_parameter]=p_value;
  247. VS::get_singleton()->material_set_param(material,_fixed_material_param_names[p_parameter],p_value);
  248. }
  249. Variant Rasterizer::fixed_material_get_parameter(RID p_material,VS::FixedMaterialParam p_parameter) const{
  250. const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  251. ERR_FAIL_COND_V(!E,Variant());
  252. const FixedMaterial &fm=*E->get();
  253. ERR_FAIL_INDEX_V(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX,Variant());
  254. return fm.param[p_parameter];
  255. }
  256. void Rasterizer::fixed_material_set_texture(RID p_material,VS::FixedMaterialParam p_parameter, RID p_texture){
  257. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  258. if (!E) {
  259. print_line("Not found: "+itos(p_material.get_id()));
  260. }
  261. ERR_FAIL_COND(!E);
  262. FixedMaterial &fm=*E->get();
  263. ERR_FAIL_INDEX(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX);
  264. RID material=E->key();
  265. fm.texture[p_parameter]=p_texture;
  266. VS::get_singleton()->material_set_param(material,_fixed_material_tex_names[p_parameter],p_texture);
  267. if (!fm.dirty_list.in_list())
  268. fixed_material_dirty_list.add( &fm.dirty_list );
  269. }
  270. RID Rasterizer::fixed_material_get_texture(RID p_material,VS::FixedMaterialParam p_parameter) const{
  271. const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  272. ERR_FAIL_COND_V(!E,RID());
  273. const FixedMaterial &fm=*E->get();
  274. ERR_FAIL_INDEX_V(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX,RID());
  275. return fm.texture[p_parameter];
  276. }
  277. void Rasterizer::fixed_material_set_detail_blend_mode(RID p_material,VS::MaterialBlendMode p_mode){
  278. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  279. ERR_FAIL_COND(!E);
  280. FixedMaterial &fm=*E->get();
  281. fm.get_key();
  282. ERR_FAIL_INDEX(p_mode,4);
  283. fm.detail_blend=p_mode;
  284. if (!fm.dirty_list.in_list())
  285. fixed_material_dirty_list.add( &fm.dirty_list );
  286. }
  287. VS::MaterialBlendMode Rasterizer::fixed_material_get_detail_blend_mode(RID p_material) const{
  288. const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  289. ERR_FAIL_COND_V(!E,VS::MATERIAL_BLEND_MODE_MIX);
  290. const FixedMaterial &fm=*E->get();
  291. return fm.detail_blend;
  292. }
  293. void Rasterizer::fixed_material_set_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter, VS::FixedMaterialTexCoordMode p_mode) {
  294. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  295. ERR_FAIL_COND(!E);
  296. FixedMaterial &fm=*E->get();
  297. ERR_FAIL_INDEX(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX);
  298. fm.get_key();
  299. fm.texture_tc[p_parameter]=p_mode;
  300. if (!fm.dirty_list.in_list())
  301. fixed_material_dirty_list.add( &fm.dirty_list );
  302. }
  303. VS::FixedMaterialTexCoordMode Rasterizer::fixed_material_get_texcoord_mode(RID p_material,VS::FixedMaterialParam p_parameter) const {
  304. const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  305. ERR_FAIL_COND_V(!E,VS::FIXED_MATERIAL_TEXCOORD_UV);
  306. const FixedMaterial &fm=*E->get();
  307. ERR_FAIL_INDEX_V(p_parameter,VS::FIXED_MATERIAL_PARAM_MAX,VS::FIXED_MATERIAL_TEXCOORD_UV);
  308. return fm.texture_tc[p_parameter];
  309. }
  310. void Rasterizer::fixed_material_set_uv_transform(RID p_material,const Transform& p_transform) {
  311. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  312. ERR_FAIL_COND(!E);
  313. FixedMaterial &fm=*E->get();
  314. RID material=E->key();
  315. VS::get_singleton()->material_set_param(material,_fixed_material_uv_xform_name,p_transform);
  316. fm.uv_xform=p_transform;
  317. }
  318. Transform Rasterizer::fixed_material_get_uv_transform(RID p_material) const {
  319. const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  320. ERR_FAIL_COND_V(!E,Transform());
  321. const FixedMaterial &fm=*E->get();
  322. return fm.uv_xform;
  323. }
  324. void Rasterizer::fixed_material_set_point_size(RID p_material,float p_size) {
  325. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  326. ERR_FAIL_COND(!E);
  327. FixedMaterial &fm=*E->get();
  328. RID material=E->key();
  329. VS::get_singleton()->material_set_param(material,_fixed_material_point_size_name,p_size);
  330. fm.point_size=p_size;
  331. }
  332. float Rasterizer::fixed_material_get_point_size(RID p_material) const{
  333. const Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  334. ERR_FAIL_COND_V(!E,1.0);
  335. const FixedMaterial &fm=*E->get();
  336. return fm.point_size;
  337. }
  338. void Rasterizer::_update_fixed_materials() {
  339. while(fixed_material_dirty_list.first()) {
  340. FixedMaterial &fm=*fixed_material_dirty_list.first()->self();
  341. FixedMaterialShaderKey new_key = fm.get_key();
  342. if (new_key.key!=fm.current_key.key) {
  343. _free_shader(fm.current_key);
  344. RID new_rid = _create_shader(new_key);
  345. fm.current_key=new_key;
  346. material_set_shader(fm.self,new_rid);
  347. if (fm.texture[VS::FIXED_MATERIAL_PARAM_DETAIL].is_valid()) {
  348. //send these again just in case.
  349. material_set_param(fm.self,_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_DETAIL],fm.param[VS::FIXED_MATERIAL_PARAM_DETAIL]);
  350. }
  351. if (fm.texture[VS::FIXED_MATERIAL_PARAM_NORMAL].is_valid()) {
  352. //send these again just in case.
  353. material_set_param(fm.self,_fixed_material_param_names[VS::FIXED_MATERIAL_PARAM_NORMAL],fm.param[VS::FIXED_MATERIAL_PARAM_NORMAL]);
  354. }
  355. material_set_param(fm.self,_fixed_material_uv_xform_name,fm.uv_xform);
  356. if (fm.use_pointsize)
  357. material_set_param(fm.self,_fixed_material_point_size_name,fm.point_size);
  358. }
  359. fixed_material_dirty_list.remove(fixed_material_dirty_list.first());
  360. }
  361. }
  362. void Rasterizer::_free_fixed_material(const RID& p_material) {
  363. Map<RID,FixedMaterial*>::Element *E = fixed_materials.find(p_material);
  364. if (E) {
  365. _free_shader(E->get()->current_key); //free shader
  366. if (E->get()->dirty_list.in_list())
  367. fixed_material_dirty_list.remove( &E->get()->dirty_list);
  368. memdelete(E->get());
  369. fixed_materials.erase(E); //free material
  370. }
  371. }
  372. void Rasterizer::flush_frame() {
  373. //not really necesary to implement
  374. }
  375. Rasterizer::Rasterizer() {
  376. static const char* fm_names[VS::FIXED_MATERIAL_PARAM_MAX]={
  377. "diffuse",
  378. "detail",
  379. "specular",
  380. "emission",
  381. "specular_exp",
  382. "glow",
  383. "normal",
  384. "shade_param"};
  385. for(int i=0;i<VS::FIXED_MATERIAL_PARAM_MAX;i++) {
  386. _fixed_material_param_names[i]=String("fmp_")+fm_names[i];
  387. _fixed_material_tex_names[i]=String("fmp_")+fm_names[i]+"_tex";
  388. }
  389. _fixed_material_uv_xform_name="fmp_uv_xform";
  390. _fixed_material_point_size_name="fmp_point_size";
  391. }
  392. RID Rasterizer::create_overdraw_debug_material() {
  393. RID mat = fixed_material_create();
  394. fixed_material_set_parameter( mat,VisualServer::FIXED_MATERIAL_PARAM_SPECULAR,Color(0,0,0) );
  395. fixed_material_set_parameter( mat,VisualServer::FIXED_MATERIAL_PARAM_DIFFUSE,Color(0.1,0.1,0.2) );
  396. fixed_material_set_parameter( mat,VisualServer::FIXED_MATERIAL_PARAM_EMISSION,Color(0,0,0) );
  397. fixed_material_set_flag( mat, VS::FIXED_MATERIAL_FLAG_USE_ALPHA, true);
  398. material_set_flag( mat, VisualServer::MATERIAL_FLAG_UNSHADED, true );
  399. material_set_blend_mode( mat,VisualServer::MATERIAL_BLEND_MODE_ADD );
  400. return mat;
  401. }