This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/draw/engines/basic/basic_shader.c
Jeroen Bakker a8f7d41d38 Draw: Curve outline drawing in object mode.
This patch adds (selected/active) outline around a curve object in object mode.

{F13270680}

In the past the draw bounds option was enabled for any curve objects. With this
patch it isn't needed and will be disabled.

In the future the curve outline could also be enabled to improve GPU selection.

Reviewed By: dfelinto, HooglyBoogly, fclem

Maniphest Tasks: T95933

Differential Revision: https://developer.blender.org/D15308
2022-07-08 12:08:31 +02:00

98 lines
3.1 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2019 Blender Foundation. */
/** \file
* \ingroup draw_engine
*/
#include "DRW_render.h"
#include "GPU_shader.h"
#include "basic_private.h"
extern char datatoc_basic_depth_frag_glsl[];
extern char datatoc_basic_depth_vert_glsl[];
extern char datatoc_basic_conservative_depth_geom_glsl[];
extern char datatoc_common_view_lib_glsl[];
extern char datatoc_common_pointcloud_lib_glsl[];
/* Shaders */
typedef struct BASIC_Shaders {
/* Depth Pre Pass */
struct GPUShader *depth;
struct GPUShader *pointcloud_depth;
struct GPUShader *curves_depth;
struct GPUShader *depth_conservative;
struct GPUShader *pointcloud_depth_conservative;
} BASIC_Shaders;
static struct {
BASIC_Shaders sh_data[GPU_SHADER_CFG_LEN];
} e_data = {{{NULL}}}; /* Engine data */
GPUShader *BASIC_shaders_depth_sh_get(eGPUShaderConfig config)
{
BASIC_Shaders *sh_data = &e_data.sh_data[config];
if (sh_data->depth == NULL) {
sh_data->depth = GPU_shader_create_from_info_name(
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_mesh_clipped" : "basic_depth_mesh");
}
return sh_data->depth;
}
GPUShader *BASIC_shaders_pointcloud_depth_sh_get(eGPUShaderConfig config)
{
BASIC_Shaders *sh_data = &e_data.sh_data[config];
if (sh_data->pointcloud_depth == NULL) {
sh_data->pointcloud_depth = GPU_shader_create_from_info_name(
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_pointcloud_clipped" :
"basic_depth_pointcloud");
}
return sh_data->pointcloud_depth;
}
GPUShader *BASIC_shaders_curves_depth_sh_get(eGPUShaderConfig config)
{
BASIC_Shaders *sh_data = &e_data.sh_data[config];
if (sh_data->curves_depth == NULL) {
sh_data->curves_depth = GPU_shader_create_from_info_name(
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_curves_clipped" : "basic_depth_curves");
}
return sh_data->curves_depth;
}
GPUShader *BASIC_shaders_depth_conservative_sh_get(eGPUShaderConfig config)
{
BASIC_Shaders *sh_data = &e_data.sh_data[config];
if (sh_data->depth_conservative == NULL) {
sh_data->depth_conservative = GPU_shader_create_from_info_name(
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_mesh_conservative_clipped" :
"basic_depth_mesh_conservative");
}
return sh_data->depth_conservative;
}
GPUShader *BASIC_shaders_pointcloud_depth_conservative_sh_get(eGPUShaderConfig config)
{
BASIC_Shaders *sh_data = &e_data.sh_data[config];
if (sh_data->pointcloud_depth_conservative == NULL) {
sh_data->pointcloud_depth_conservative = GPU_shader_create_from_info_name(
config == GPU_SHADER_CFG_CLIPPED ? "basic_depth_pointcloud_conservative_clipped" :
"basic_depth_pointcloud_conservative");
}
return sh_data->pointcloud_depth_conservative;
}
void BASIC_shaders_free(void)
{
for (int i = 0; i < GPU_SHADER_CFG_LEN; i++) {
GPUShader **sh_data_as_array = (GPUShader **)&e_data.sh_data[i];
for (int j = 0; j < (sizeof(BASIC_Shaders) / sizeof(GPUShader *)); j++) {
DRW_SHADER_FREE_SAFE(sh_data_as_array[j]);
}
}
}