summaryrefslogtreecommitdiff
path: root/servers/visual
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2016-12-23 00:37:38 -0300
committerJuan Linietsky <reduzio@gmail.com>2016-12-23 00:37:38 -0300
commit4e729f38e02274afc91319d8dc9d2dfea9e9438e (patch)
tree48fa8b974220e1e1de3edf32c15906af18d98fe0 /servers/visual
parentf9603d82365823938129e68823a19739a3dd0b23 (diff)
baking now shows a proper button, and bakes can be saved.
Diffstat (limited to 'servers/visual')
-rw-r--r--servers/visual/rasterizer.h11
-rw-r--r--servers/visual/visual_server_raster.h8
-rw-r--r--servers/visual/visual_server_scene.cpp90
3 files changed, 45 insertions, 64 deletions
diff --git a/servers/visual/rasterizer.h b/servers/visual/rasterizer.h
index f22b7e04f6..725a325909 100644
--- a/servers/visual/rasterizer.h
+++ b/servers/visual/rasterizer.h
@@ -193,6 +193,9 @@ public:
virtual RID texture_create_radiance_cubemap(RID p_source,int p_resolution=-1) const=0;
+
+ virtual void textures_keep_original(bool p_enable)=0;
+
/* SKYBOX API */
virtual RID skybox_create()=0;
@@ -427,14 +430,6 @@ public:
virtual void gi_probe_set_interior(RID p_probe,bool p_enable)=0;
virtual bool gi_probe_is_interior(RID p_probe) const=0;
- virtual void gi_probe_set_static_data(RID p_gi_probe,const DVector<uint8_t>& p_data,VS::GIProbeDataFormat p_format,int p_width,int p_height,int p_depth)=0;
- virtual DVector<uint8_t> gi_probe_get_static_data(RID p_gi_probe) const=0;
- virtual VS::GIProbeDataFormat gi_probe_get_static_data_format(RID p_gi_probe) const=0;
- virtual int gi_probe_get_static_data_width(RID p_probe) const=0;
- virtual int gi_probe_get_static_data_height(RID p_probe) const=0;
- virtual int gi_probe_get_static_data_depth(RID p_probe) const=0;
-
- virtual RID gi_probe_get_data(RID p_probe)=0; //get data in case this is static
virtual uint32_t gi_probe_get_version(RID p_probe)=0;
virtual RID gi_probe_dynamic_data_create(int p_width,int p_height,int p_depth)=0;
diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h
index 9dec587d1e..fcfaf52e0b 100644
--- a/servers/visual/visual_server_raster.h
+++ b/servers/visual/visual_server_raster.h
@@ -629,6 +629,8 @@ public:
BIND1(texture_set_shrink_all_x2_on_set_data,bool)
BIND1(texture_debug_usage,List<TextureInfo>*)
+ BIND1(textures_keep_original,bool)
+
/* SKYBOX API */
BIND0R(RID,skybox_create)
@@ -828,12 +830,6 @@ public:
BIND2(gi_probe_set_dynamic_data,RID,const DVector<int>& )
BIND1RC( DVector<int>,gi_probe_get_dynamic_data,RID)
- BIND6(gi_probe_set_static_data,RID,const DVector<uint8_t>&,GIProbeDataFormat,int,int,int)
- BIND1RC(DVector<uint8_t>,gi_probe_get_static_data,RID)
- BIND1RC(GIProbeDataFormat,gi_probe_get_static_data_format,RID)
- BIND1RC(int,gi_probe_get_static_data_width,RID)
- BIND1RC(int,gi_probe_get_static_data_height,RID)
- BIND1RC(int,gi_probe_get_static_data_depth,RID)
#undef BINDBASE
diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp
index d74f5265e4..a7876d0815 100644
--- a/servers/visual/visual_server_scene.cpp
+++ b/servers/visual/visual_server_scene.cpp
@@ -2390,78 +2390,68 @@ void VisualServerScene::_setup_gi_probe(Instance *p_instance) {
probe->dynamic.light_data=VSG::storage->gi_probe_get_dynamic_data(p_instance->base);
- if (probe->dynamic.light_data.size()) {
- //using dynamic data
- DVector<int>::Read r=probe->dynamic.light_data.read();
+ if (probe->dynamic.light_data.size()==0)
+ return;
+ //using dynamic data
+ DVector<int>::Read r=probe->dynamic.light_data.read();
- const GIProbeDataHeader *header = (GIProbeDataHeader *)r.ptr();
+ const GIProbeDataHeader *header = (GIProbeDataHeader *)r.ptr();
- probe->dynamic.local_data.resize(header->cell_count);
+ probe->dynamic.local_data.resize(header->cell_count);
- DVector<InstanceGIProbeData::LocalData>::Write ldw = probe->dynamic.local_data.write();
+ DVector<InstanceGIProbeData::LocalData>::Write ldw = probe->dynamic.local_data.write();
- const GIProbeDataCell *cells = (GIProbeDataCell*)&r[16];
+ const GIProbeDataCell *cells = (GIProbeDataCell*)&r[16];
- probe->dynamic.level_cell_lists.resize(header->cell_subdiv);
+ probe->dynamic.level_cell_lists.resize(header->cell_subdiv);
- _gi_probe_fill_local_data(0,0,0,0,0,cells,header,ldw.ptr(),probe->dynamic.level_cell_lists.ptr());
+ _gi_probe_fill_local_data(0,0,0,0,0,cells,header,ldw.ptr(),probe->dynamic.level_cell_lists.ptr());
- probe->dynamic.probe_data=VSG::storage->gi_probe_dynamic_data_create(header->width,header->height,header->depth);
+ probe->dynamic.probe_data=VSG::storage->gi_probe_dynamic_data_create(header->width,header->height,header->depth);
- probe->dynamic.bake_dynamic_range=VSG::storage->gi_probe_get_dynamic_range(p_instance->base);
+ probe->dynamic.bake_dynamic_range=VSG::storage->gi_probe_get_dynamic_range(p_instance->base);
- probe->dynamic.mipmaps_3d.clear();
+ probe->dynamic.mipmaps_3d.clear();
- probe->dynamic.grid_size[0]=header->width;
- probe->dynamic.grid_size[1]=header->height;
- probe->dynamic.grid_size[2]=header->depth;
+ probe->dynamic.grid_size[0]=header->width;
+ probe->dynamic.grid_size[1]=header->height;
+ probe->dynamic.grid_size[2]=header->depth;
- for(int i=0;i<(int)header->cell_subdiv;i++) {
-
- uint32_t x = header->width >> i;
- uint32_t y = header->height >> i;
- uint32_t z = header->depth >> i;
-
- //create and clear mipmap
- DVector<uint8_t> mipmap;
- mipmap.resize(x*y*z*4);
- DVector<uint8_t>::Write w = mipmap.write();
- zeromem(w.ptr(),x*y*z*4);
- w = DVector<uint8_t>::Write();
-
- probe->dynamic.mipmaps_3d.push_back(mipmap);
+ for(int i=0;i<(int)header->cell_subdiv;i++) {
- if (x<=1 || y<=1 || z<=1)
- break;
- }
+ uint32_t x = header->width >> i;
+ uint32_t y = header->height >> i;
+ uint32_t z = header->depth >> i;
- probe->dynamic.updating_stage=GI_UPDATE_STAGE_CHECK;
- probe->invalid=false;
- probe->dynamic.enabled=true;
+ //create and clear mipmap
+ DVector<uint8_t> mipmap;
+ mipmap.resize(x*y*z*4);
+ DVector<uint8_t>::Write w = mipmap.write();
+ zeromem(w.ptr(),x*y*z*4);
+ w = DVector<uint8_t>::Write();
- Transform cell_to_xform = VSG::storage->gi_probe_get_to_cell_xform(p_instance->base);
- AABB bounds = VSG::storage->gi_probe_get_bounds(p_instance->base);
- float cell_size = VSG::storage->gi_probe_get_cell_size(p_instance->base);
+ probe->dynamic.mipmaps_3d.push_back(mipmap);
- probe->dynamic.light_to_cell_xform=cell_to_xform * p_instance->transform.affine_inverse();
+ if (x<=1 || y<=1 || z<=1)
+ break;
+ }
- VSG::scene_render->gi_probe_instance_set_light_data(probe->probe_instance,p_instance->base,probe->dynamic.probe_data);
- VSG::scene_render->gi_probe_instance_set_transform_to_data(probe->probe_instance,probe->dynamic.light_to_cell_xform);
+ probe->dynamic.updating_stage=GI_UPDATE_STAGE_CHECK;
+ probe->invalid=false;
+ probe->dynamic.enabled=true;
+ Transform cell_to_xform = VSG::storage->gi_probe_get_to_cell_xform(p_instance->base);
+ AABB bounds = VSG::storage->gi_probe_get_bounds(p_instance->base);
+ float cell_size = VSG::storage->gi_probe_get_cell_size(p_instance->base);
+ probe->dynamic.light_to_cell_xform=cell_to_xform * p_instance->transform.affine_inverse();
- VSG::scene_render->gi_probe_instance_set_bounds(probe->probe_instance,bounds.size/cell_size);
+ VSG::scene_render->gi_probe_instance_set_light_data(probe->probe_instance,p_instance->base,probe->dynamic.probe_data);
+ VSG::scene_render->gi_probe_instance_set_transform_to_data(probe->probe_instance,probe->dynamic.light_to_cell_xform);
- } else {
- RID data = VSG::storage->gi_probe_get_data(p_instance->base);
- probe->dynamic.enabled=false;
- probe->invalid=!data.is_valid();
- if (data.is_valid()) {
- VSG::scene_render->gi_probe_instance_set_light_data(probe->probe_instance,p_instance->base,data);
- }
- }
+ VSG::scene_render->gi_probe_instance_set_bounds(probe->probe_instance,bounds.size/cell_size);
probe->base_version=VSG::storage->gi_probe_get_version(p_instance->base);