2017-06-03 00:53:47 +02:00
|
|
|
/*
|
|
|
|
* Copyright 2016, Blender Foundation.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* Contributor(s): Blender Institute
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** \file eevee_data.c
|
|
|
|
* \ingroup draw_engine
|
2017-11-20 14:11:45 +11:00
|
|
|
*
|
|
|
|
* All specific data handler for Objects, Lights, SceneLayers, ...
|
2017-06-03 00:53:47 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "DRW_render.h"
|
|
|
|
|
|
|
|
#include "eevee_private.h"
|
|
|
|
|
|
|
|
static void eevee_scene_layer_data_free(void *storage)
|
|
|
|
{
|
|
|
|
EEVEE_SceneLayerData *sldata = (EEVEE_SceneLayerData *)storage;
|
|
|
|
|
|
|
|
/* Lights */
|
|
|
|
MEM_SAFE_FREE(sldata->lamps);
|
|
|
|
DRW_UBO_FREE_SAFE(sldata->light_ubo);
|
|
|
|
DRW_UBO_FREE_SAFE(sldata->shadow_ubo);
|
|
|
|
DRW_UBO_FREE_SAFE(sldata->shadow_render_ubo);
|
2017-09-01 15:59:01 +02:00
|
|
|
DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_target_fb);
|
|
|
|
DRW_FRAMEBUFFER_FREE_SAFE(sldata->shadow_store_fb);
|
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_target);
|
2017-09-08 20:21:57 +02:00
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->shadow_cube_blur);
|
2017-09-01 15:59:01 +02:00
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_target);
|
2017-09-08 20:21:57 +02:00
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->shadow_cascade_blur);
|
2017-09-01 15:59:01 +02:00
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->shadow_pool);
|
2017-06-03 00:53:47 +02:00
|
|
|
BLI_freelistN(&sldata->shadow_casters);
|
|
|
|
|
|
|
|
/* Probes */
|
|
|
|
MEM_SAFE_FREE(sldata->probes);
|
|
|
|
DRW_UBO_FREE_SAFE(sldata->probe_ubo);
|
2017-06-13 17:39:39 +02:00
|
|
|
DRW_UBO_FREE_SAFE(sldata->grid_ubo);
|
2017-06-17 00:08:03 +02:00
|
|
|
DRW_UBO_FREE_SAFE(sldata->planar_ubo);
|
2017-06-03 00:53:47 +02:00
|
|
|
DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_fb);
|
|
|
|
DRW_FRAMEBUFFER_FREE_SAFE(sldata->probe_filter_fb);
|
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->probe_rt);
|
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->probe_pool);
|
2017-06-13 17:39:39 +02:00
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->irradiance_pool);
|
2017-06-14 18:52:53 +02:00
|
|
|
DRW_TEXTURE_FREE_SAFE(sldata->irradiance_rt);
|
2017-07-05 18:28:48 +02:00
|
|
|
|
|
|
|
/* Volumetrics */
|
|
|
|
MEM_SAFE_FREE(sldata->volumetrics);
|
2017-06-03 00:53:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
static void eevee_lamp_data_free(void *storage)
|
|
|
|
{
|
|
|
|
EEVEE_LampEngineData *led = (EEVEE_LampEngineData *)storage;
|
|
|
|
|
|
|
|
MEM_SAFE_FREE(led->storage);
|
|
|
|
BLI_freelistN(&led->shadow_caster_list);
|
|
|
|
}
|
|
|
|
|
2017-06-12 20:59:54 +10:00
|
|
|
static void eevee_lightprobe_data_free(void *storage)
|
2017-06-08 21:48:50 +02:00
|
|
|
{
|
2017-06-12 20:59:54 +10:00
|
|
|
EEVEE_LightProbeEngineData *ped = (EEVEE_LightProbeEngineData *)storage;
|
2017-06-08 21:48:50 +02:00
|
|
|
|
|
|
|
BLI_freelistN(&ped->captured_object_list);
|
|
|
|
}
|
|
|
|
|
2017-06-03 00:53:47 +02:00
|
|
|
EEVEE_SceneLayerData *EEVEE_scene_layer_data_get(void)
|
|
|
|
{
|
2017-11-20 14:28:24 +11:00
|
|
|
EEVEE_SceneLayerData **sldata = (EEVEE_SceneLayerData **)DRW_scene_layer_engine_data_get(
|
|
|
|
&draw_engine_eevee_type, &eevee_scene_layer_data_free);
|
2017-06-03 00:53:47 +02:00
|
|
|
|
|
|
|
if (*sldata == NULL) {
|
|
|
|
*sldata = MEM_callocN(sizeof(**sldata), "EEVEE_SceneLayerData");
|
|
|
|
}
|
|
|
|
|
|
|
|
return *sldata;
|
|
|
|
}
|
|
|
|
|
|
|
|
EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob)
|
|
|
|
{
|
2017-11-20 14:28:24 +11:00
|
|
|
EEVEE_ObjectEngineData **oedata = (EEVEE_ObjectEngineData **)DRW_object_engine_data_get(
|
|
|
|
ob, &draw_engine_eevee_type, NULL);
|
2017-06-03 00:53:47 +02:00
|
|
|
|
|
|
|
if (*oedata == NULL) {
|
|
|
|
*oedata = MEM_callocN(sizeof(**oedata), "EEVEE_ObjectEngineData");
|
|
|
|
}
|
|
|
|
|
|
|
|
return *oedata;
|
|
|
|
}
|
|
|
|
|
2017-06-12 20:59:54 +10:00
|
|
|
EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_get(Object *ob)
|
2017-06-08 21:48:50 +02:00
|
|
|
{
|
2017-11-20 14:28:24 +11:00
|
|
|
EEVEE_LightProbeEngineData **pedata = (EEVEE_LightProbeEngineData **)DRW_object_engine_data_get(
|
|
|
|
ob, &draw_engine_eevee_type, &eevee_lightprobe_data_free);
|
2017-06-08 21:48:50 +02:00
|
|
|
|
|
|
|
if (*pedata == NULL) {
|
2017-06-12 20:59:54 +10:00
|
|
|
*pedata = MEM_callocN(sizeof(**pedata), "EEVEE_LightProbeEngineData");
|
2017-06-08 21:48:50 +02:00
|
|
|
(*pedata)->need_update = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return *pedata;
|
|
|
|
}
|
|
|
|
|
2017-06-03 00:53:47 +02:00
|
|
|
EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob)
|
|
|
|
{
|
2017-11-20 14:28:24 +11:00
|
|
|
EEVEE_LampEngineData **ledata = (EEVEE_LampEngineData **)DRW_object_engine_data_get(
|
|
|
|
ob, &draw_engine_eevee_type, &eevee_lamp_data_free);
|
2017-06-03 00:53:47 +02:00
|
|
|
|
|
|
|
if (*ledata == NULL) {
|
|
|
|
*ledata = MEM_callocN(sizeof(**ledata), "EEVEE_LampEngineData");
|
|
|
|
(*ledata)->need_update = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return *ledata;
|
|
|
|
}
|