baked_light.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. #include "baked_light.h"
  2. #include "servers/visual_server.h"
  3. void BakedLight::set_mode(Mode p_mode) {
  4. mode=p_mode;
  5. VS::get_singleton()->baked_light_set_mode(baked_light,(VS::BakedLightMode(p_mode)));
  6. }
  7. BakedLight::Mode BakedLight::get_mode() const{
  8. return mode;
  9. }
  10. void BakedLight::set_octree(const DVector<uint8_t>& p_octree) {
  11. VS::get_singleton()->baked_light_set_octree(baked_light,p_octree);
  12. }
  13. DVector<uint8_t> BakedLight::get_octree() const {
  14. return VS::get_singleton()->baked_light_get_octree(baked_light);
  15. }
  16. void BakedLight::add_lightmap(const Ref<Texture> &p_texture,Size2 p_gen_size) {
  17. LightMap lm;
  18. lm.texture=p_texture;
  19. lm.gen_size=p_gen_size;
  20. lightmaps.push_back(lm);
  21. _update_lightmaps();
  22. _change_notify();
  23. }
  24. void BakedLight::set_lightmap_gen_size(int p_idx,const Size2& p_size){
  25. ERR_FAIL_INDEX(p_idx,lightmaps.size());
  26. lightmaps[p_idx].gen_size=p_size;
  27. _update_lightmaps();
  28. }
  29. Size2 BakedLight::get_lightmap_gen_size(int p_idx) const{
  30. ERR_FAIL_INDEX_V(p_idx,lightmaps.size(),Size2());
  31. return lightmaps[p_idx].gen_size;
  32. }
  33. void BakedLight::set_lightmap_texture(int p_idx,const Ref<Texture> &p_texture){
  34. ERR_FAIL_INDEX(p_idx,lightmaps.size());
  35. lightmaps[p_idx].texture=p_texture;
  36. _update_lightmaps();
  37. }
  38. Ref<Texture> BakedLight::get_lightmap_texture(int p_idx) const{
  39. ERR_FAIL_INDEX_V(p_idx,lightmaps.size(),Ref<Texture>());
  40. return lightmaps[p_idx].texture;
  41. }
  42. void BakedLight::erase_lightmap(int p_idx){
  43. ERR_FAIL_INDEX(p_idx,lightmaps.size());
  44. lightmaps.remove(p_idx);
  45. _update_lightmaps();
  46. _change_notify();
  47. }
  48. int BakedLight::get_lightmaps_count() const{
  49. return lightmaps.size();
  50. }
  51. void BakedLight::clear_lightmaps(){
  52. lightmaps.clear();
  53. _update_lightmaps();
  54. _change_notify();
  55. }
  56. void BakedLight::_update_lightmaps() {
  57. VS::get_singleton()->baked_light_clear_lightmaps(baked_light);
  58. for(int i=0;i<lightmaps.size();i++) {
  59. RID tid;
  60. if (lightmaps[i].texture.is_valid())
  61. tid=lightmaps[i].texture->get_rid();
  62. VS::get_singleton()->baked_light_add_lightmap(baked_light,tid,i);
  63. }
  64. }
  65. RID BakedLight::get_rid() const {
  66. return baked_light;
  67. }
  68. Array BakedLight::_get_lightmap_data() const {
  69. Array ret;
  70. ret.resize(lightmaps.size()*2);
  71. int idx=0;
  72. for(int i=0;i<lightmaps.size();i++) {
  73. ret[idx++]=Size2(lightmaps[i].gen_size);
  74. ret[idx++]=lightmaps[i].texture;
  75. }
  76. return ret;
  77. }
  78. void BakedLight::_set_lightmap_data(Array p_array){
  79. lightmaps.clear();
  80. for(int i=0;i<p_array.size();i+=2) {
  81. Size2 size = p_array[i];
  82. Ref<Texture> tex = p_array[i+1];
  83. // ERR_CONTINUE(tex.is_null());
  84. LightMap lm;
  85. lm.gen_size=size;
  86. lm.texture=tex;
  87. lightmaps.push_back(lm);
  88. }
  89. _update_lightmaps();
  90. }
  91. void BakedLight::set_cell_subdivision(int p_subdiv) {
  92. cell_subdiv=p_subdiv;
  93. }
  94. int BakedLight::get_cell_subdivision() const{
  95. return cell_subdiv;
  96. }
  97. void BakedLight::set_initial_lattice_subdiv(int p_size){
  98. lattice_subdiv=p_size;
  99. }
  100. int BakedLight::get_initial_lattice_subdiv() const{
  101. return lattice_subdiv;
  102. }
  103. void BakedLight::set_plot_size(float p_size){
  104. plot_size=p_size;
  105. }
  106. float BakedLight::get_plot_size() const{
  107. return plot_size;
  108. }
  109. void BakedLight::set_bounces(int p_size){
  110. bounces=p_size;
  111. }
  112. int BakedLight::get_bounces() const{
  113. return bounces;
  114. }
  115. void BakedLight::set_cell_extra_margin(float p_margin) {
  116. cell_extra_margin=p_margin;
  117. }
  118. float BakedLight::get_cell_extra_margin() const {
  119. return cell_extra_margin;
  120. }
  121. void BakedLight::set_edge_damp(float p_margin) {
  122. edge_damp=p_margin;
  123. }
  124. float BakedLight::get_edge_damp() const {
  125. return edge_damp;
  126. }
  127. void BakedLight::set_normal_damp(float p_margin) {
  128. normal_damp=p_margin;
  129. }
  130. float BakedLight::get_normal_damp() const {
  131. return normal_damp;
  132. }
  133. void BakedLight::set_energy_multiplier(float p_multiplier){
  134. energy_multiply=p_multiplier;
  135. }
  136. float BakedLight::get_energy_multiplier() const{
  137. return energy_multiply;
  138. }
  139. void BakedLight::set_gamma_adjust(float p_adjust){
  140. gamma_adjust=p_adjust;
  141. }
  142. float BakedLight::get_gamma_adjust() const{
  143. return gamma_adjust;
  144. }
  145. void BakedLight::set_bake_flag(BakeFlags p_flags,bool p_enable){
  146. flags[p_flags]=p_enable;
  147. }
  148. bool BakedLight::get_bake_flag(BakeFlags p_flags) const{
  149. return flags[p_flags];
  150. }
  151. void BakedLight::set_format(Format p_format) {
  152. format=p_format;
  153. VS::get_singleton()->baked_light_set_lightmap_multiplier(baked_light,format==FORMAT_HDR8?8.0:1.0);
  154. }
  155. BakedLight::Format BakedLight::get_format() const{
  156. return format;
  157. }
  158. void BakedLight::set_transfer_lightmaps_only_to_uv2(bool p_enable) {
  159. transfer_only_uv2=p_enable;
  160. }
  161. bool BakedLight::get_transfer_lightmaps_only_to_uv2() const{
  162. return transfer_only_uv2;
  163. }
  164. bool BakedLight::_set(const StringName& p_name, const Variant& p_value) {
  165. String n = p_name;
  166. if (!n.begins_with("lightmap"))
  167. return false;
  168. int idx = n.get_slice("/",1).to_int();
  169. ERR_FAIL_COND_V(idx<0,false);
  170. ERR_FAIL_COND_V(idx>lightmaps.size(),false);
  171. String what = n.get_slice("/",2);
  172. Ref<Texture> tex;
  173. Size2 gens;
  174. if (what=="texture")
  175. tex=p_value;
  176. else if (what=="gen_size")
  177. gens=p_value;
  178. if (idx==lightmaps.size()) {
  179. if (tex.is_valid() || gens!=Size2())
  180. add_lightmap(tex,gens);
  181. } else {
  182. if (tex.is_valid())
  183. set_lightmap_texture(idx,tex);
  184. else if (gens!=Size2())
  185. set_lightmap_gen_size(idx,gens);
  186. }
  187. return true;
  188. }
  189. bool BakedLight::_get(const StringName& p_name,Variant &r_ret) const{
  190. String n = p_name;
  191. if (!n.begins_with("lightmap"))
  192. return false;
  193. int idx = n.get_slice("/",1).to_int();
  194. ERR_FAIL_COND_V(idx<0,false);
  195. ERR_FAIL_COND_V(idx>lightmaps.size(),false);
  196. String what = n.get_slice("/",2);
  197. if (what=="texture") {
  198. if (idx==lightmaps.size())
  199. r_ret=Ref<Texture>();
  200. else
  201. r_ret=lightmaps[idx].texture;
  202. } else if (what=="gen_size") {
  203. if (idx==lightmaps.size())
  204. r_ret=Size2();
  205. else
  206. r_ret=Size2(lightmaps[idx].gen_size);
  207. } else
  208. return false;
  209. return true;
  210. }
  211. void BakedLight::_get_property_list( List<PropertyInfo> *p_list) const{
  212. for(int i=0;i<=lightmaps.size();i++) {
  213. p_list->push_back(PropertyInfo(Variant::VECTOR2,"lightmaps/"+itos(i)+"/gen_size",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_EDITOR));
  214. p_list->push_back(PropertyInfo(Variant::OBJECT,"lightmaps/"+itos(i)+"/texture",PROPERTY_HINT_RESOURCE_TYPE,"Texture",PROPERTY_USAGE_EDITOR));
  215. }
  216. }
  217. void BakedLight::_bind_methods(){
  218. ObjectTypeDB::bind_method(_MD("set_mode","mode"),&BakedLight::set_mode);
  219. ObjectTypeDB::bind_method(_MD("get_mode"),&BakedLight::get_mode);
  220. ObjectTypeDB::bind_method(_MD("set_octree","octree"),&BakedLight::set_octree);
  221. ObjectTypeDB::bind_method(_MD("get_octree"),&BakedLight::get_octree);
  222. ObjectTypeDB::bind_method(_MD("add_lightmap","texture:Texture","gen_size"),&BakedLight::add_lightmap);
  223. ObjectTypeDB::bind_method(_MD("erase_lightmap","id"),&BakedLight::erase_lightmap);
  224. ObjectTypeDB::bind_method(_MD("clear_lightmaps"),&BakedLight::clear_lightmaps);
  225. ObjectTypeDB::bind_method(_MD("_set_lightmap_data","lightmap_data"),&BakedLight::_set_lightmap_data);
  226. ObjectTypeDB::bind_method(_MD("_get_lightmap_data"),&BakedLight::_get_lightmap_data);
  227. ObjectTypeDB::bind_method(_MD("set_cell_subdivision","cell_subdivision"),&BakedLight::set_cell_subdivision);
  228. ObjectTypeDB::bind_method(_MD("get_cell_subdivision"),&BakedLight::get_cell_subdivision);
  229. ObjectTypeDB::bind_method(_MD("set_initial_lattice_subdiv","cell_subdivision"),&BakedLight::set_initial_lattice_subdiv);
  230. ObjectTypeDB::bind_method(_MD("get_initial_lattice_subdiv","cell_subdivision"),&BakedLight::get_initial_lattice_subdiv);
  231. ObjectTypeDB::bind_method(_MD("set_plot_size","plot_size"),&BakedLight::set_plot_size);
  232. ObjectTypeDB::bind_method(_MD("get_plot_size"),&BakedLight::get_plot_size);
  233. ObjectTypeDB::bind_method(_MD("set_bounces","bounces"),&BakedLight::set_bounces);
  234. ObjectTypeDB::bind_method(_MD("get_bounces"),&BakedLight::get_bounces);
  235. ObjectTypeDB::bind_method(_MD("set_cell_extra_margin","cell_extra_margin"),&BakedLight::set_cell_extra_margin);
  236. ObjectTypeDB::bind_method(_MD("get_cell_extra_margin"),&BakedLight::get_cell_extra_margin);
  237. ObjectTypeDB::bind_method(_MD("set_edge_damp","edge_damp"),&BakedLight::set_edge_damp);
  238. ObjectTypeDB::bind_method(_MD("get_edge_damp"),&BakedLight::get_edge_damp);
  239. ObjectTypeDB::bind_method(_MD("set_normal_damp","normal_damp"),&BakedLight::set_normal_damp);
  240. ObjectTypeDB::bind_method(_MD("get_normal_damp"),&BakedLight::get_normal_damp);
  241. ObjectTypeDB::bind_method(_MD("set_format","format"),&BakedLight::set_format);
  242. ObjectTypeDB::bind_method(_MD("get_format"),&BakedLight::get_format);
  243. ObjectTypeDB::bind_method(_MD("set_transfer_lightmaps_only_to_uv2","enable"),&BakedLight::set_transfer_lightmaps_only_to_uv2);
  244. ObjectTypeDB::bind_method(_MD("get_transfer_lightmaps_only_to_uv2"),&BakedLight::get_transfer_lightmaps_only_to_uv2);
  245. ObjectTypeDB::bind_method(_MD("set_energy_multiplier","energy_multiplier"),&BakedLight::set_energy_multiplier);
  246. ObjectTypeDB::bind_method(_MD("get_energy_multiplier"),&BakedLight::get_energy_multiplier);
  247. ObjectTypeDB::bind_method(_MD("set_gamma_adjust","gamma_adjust"),&BakedLight::set_gamma_adjust);
  248. ObjectTypeDB::bind_method(_MD("get_gamma_adjust"),&BakedLight::get_gamma_adjust);
  249. ObjectTypeDB::bind_method(_MD("set_bake_flag","flag","enabled"),&BakedLight::set_bake_flag);
  250. ObjectTypeDB::bind_method(_MD("get_bake_flag","flag"),&BakedLight::get_bake_flag);
  251. ADD_PROPERTY( PropertyInfo(Variant::INT,"mode/mode",PROPERTY_HINT_ENUM,"Octree,Lightmaps"),_SCS("set_mode"),_SCS("get_mode"));
  252. ADD_PROPERTY( PropertyInfo(Variant::INT,"baking/format",PROPERTY_HINT_ENUM,"RGB,HDR8,HDR16"),_SCS("set_format"),_SCS("get_format"));
  253. ADD_PROPERTY( PropertyInfo(Variant::INT,"baking/cell_subdiv",PROPERTY_HINT_RANGE,"4,14,1"),_SCS("set_cell_subdivision"),_SCS("get_cell_subdivision"));
  254. ADD_PROPERTY( PropertyInfo(Variant::INT,"baking/lattice_subdiv",PROPERTY_HINT_RANGE,"1,5,1"),_SCS("set_initial_lattice_subdiv"),_SCS("get_initial_lattice_subdiv"));
  255. ADD_PROPERTY( PropertyInfo(Variant::INT,"baking/light_bounces",PROPERTY_HINT_RANGE,"0,3,1"),_SCS("set_bounces"),_SCS("get_bounces"));
  256. ADD_PROPERTY( PropertyInfo(Variant::REAL,"baking/plot_size",PROPERTY_HINT_RANGE,"1.0,16.0,0.01"),_SCS("set_plot_size"),_SCS("get_plot_size"));
  257. ADD_PROPERTY( PropertyInfo(Variant::REAL,"baking/energy_mult",PROPERTY_HINT_RANGE,"0.01,4096.0,0.01"),_SCS("set_energy_multiplier"),_SCS("get_energy_multiplier"));
  258. ADD_PROPERTY( PropertyInfo(Variant::REAL,"baking/gamma_adjust",PROPERTY_HINT_EXP_EASING),_SCS("set_gamma_adjust"),_SCS("get_gamma_adjust"));
  259. ADD_PROPERTYI( PropertyInfo(Variant::BOOL,"baking_flags/diffuse"),_SCS("set_bake_flag"),_SCS("get_bake_flag"),BAKE_DIFFUSE);
  260. ADD_PROPERTYI( PropertyInfo(Variant::BOOL,"baking_flags/specular"),_SCS("set_bake_flag"),_SCS("get_bake_flag"),BAKE_SPECULAR);
  261. ADD_PROPERTYI( PropertyInfo(Variant::BOOL,"baking_flags/translucent"),_SCS("set_bake_flag"),_SCS("get_bake_flag"),BAKE_TRANSLUCENT);
  262. ADD_PROPERTYI( PropertyInfo(Variant::BOOL,"baking_flags/conserve_energy"),_SCS("set_bake_flag"),_SCS("get_bake_flag"),BAKE_CONSERVE_ENERGY);
  263. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"lightmap/use_only_uv2"),_SCS("set_transfer_lightmaps_only_to_uv2"),_SCS("get_transfer_lightmaps_only_to_uv2"));
  264. ADD_PROPERTY( PropertyInfo(Variant::RAW_ARRAY,"octree",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("set_octree"),_SCS("get_octree"));
  265. ADD_PROPERTY( PropertyInfo(Variant::ARRAY,"lightmaps",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR),_SCS("_set_lightmap_data"),_SCS("_get_lightmap_data"));
  266. ADD_PROPERTY( PropertyInfo(Variant::REAL,"advanced/cell_margin",PROPERTY_HINT_RANGE,"0.01,0.8,0.01"),_SCS("set_cell_extra_margin"),_SCS("get_cell_extra_margin"));
  267. ADD_PROPERTY( PropertyInfo(Variant::REAL,"advanced/edge_damp",PROPERTY_HINT_RANGE,"0.0,8.0,0.1"),_SCS("set_edge_damp"),_SCS("get_edge_damp"));
  268. ADD_PROPERTY( PropertyInfo(Variant::REAL,"advanced/normal_damp",PROPERTY_HINT_RANGE,"0.0,1.0,0.01"),_SCS("set_normal_damp"),_SCS("get_normal_damp"));
  269. BIND_CONSTANT( MODE_OCTREE );
  270. BIND_CONSTANT( MODE_LIGHTMAPS );
  271. BIND_CONSTANT( BAKE_DIFFUSE );
  272. BIND_CONSTANT( BAKE_SPECULAR );
  273. BIND_CONSTANT( BAKE_TRANSLUCENT );
  274. BIND_CONSTANT( BAKE_CONSERVE_ENERGY );
  275. BIND_CONSTANT( BAKE_MAX );
  276. }
  277. BakedLight::BakedLight() {
  278. cell_subdiv=8;
  279. lattice_subdiv=4;
  280. plot_size=2.5;
  281. bounces=1;
  282. energy_multiply=1.0;
  283. gamma_adjust=1.0;
  284. cell_extra_margin=0.05;
  285. edge_damp=0.0;
  286. normal_damp=0.0;
  287. format=FORMAT_RGB;
  288. transfer_only_uv2=false;
  289. flags[BAKE_DIFFUSE]=true;
  290. flags[BAKE_SPECULAR]=false;
  291. flags[BAKE_TRANSLUCENT]=true;
  292. flags[BAKE_CONSERVE_ENERGY]=false;
  293. mode=MODE_OCTREE;
  294. baked_light=VS::get_singleton()->baked_light_create();
  295. }
  296. BakedLight::~BakedLight() {
  297. VS::get_singleton()->free(baked_light);
  298. }