Move particle drawing to object mode
This commit is contained in:
parent
8561a2dda7
commit
985574c010
|
@ -132,7 +132,6 @@ typedef struct CLAY_PassList {
|
|||
struct DRWPass *clay_pass;
|
||||
struct DRWPass *clay_pass_flat;
|
||||
struct DRWPass *hair_pass;
|
||||
struct DRWPass *part_pass;
|
||||
} CLAY_PassList;
|
||||
|
||||
typedef struct CLAY_Data {
|
||||
|
@ -152,8 +151,6 @@ static struct {
|
|||
struct GPUShader *clay_sh;
|
||||
struct GPUShader *clay_flat_sh;
|
||||
struct GPUShader *hair_sh;
|
||||
struct GPUShader *part_dot_sh;
|
||||
struct GPUShader *part_prim_sh;
|
||||
|
||||
/* Matcap textures */
|
||||
struct GPUTexture *matcap_array;
|
||||
|
@ -182,10 +179,6 @@ typedef struct CLAY_PrivateData {
|
|||
DRWShadingGroup *depth_shgrp_cull;
|
||||
DRWShadingGroup *depth_shgrp_cull_select;
|
||||
DRWShadingGroup *depth_shgrp_cull_active;
|
||||
DRWShadingGroup *part_dot_shgrp;
|
||||
DRWShadingGroup *part_cross_shgrp;
|
||||
DRWShadingGroup *part_circle_shgrp;
|
||||
DRWShadingGroup *part_axis_shgrp;
|
||||
} CLAY_PrivateData; /* Transient data */
|
||||
|
||||
/* Functions */
|
||||
|
@ -374,14 +367,6 @@ static void CLAY_engine_init(void *vedata)
|
|||
e_data.hair_sh = DRW_shader_create(datatoc_particle_vert_glsl, NULL, datatoc_particle_strand_frag_glsl, "#define MAX_MATERIAL 512\n");
|
||||
}
|
||||
|
||||
if (!e_data.part_prim_sh) {
|
||||
e_data.part_prim_sh = DRW_shader_create(datatoc_particle_prim_vert_glsl, NULL, datatoc_particle_prim_frag_glsl, NULL);
|
||||
}
|
||||
|
||||
if (!e_data.part_dot_sh) {
|
||||
e_data.part_dot_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_AA);
|
||||
}
|
||||
|
||||
if (!stl->storage) {
|
||||
stl->storage = MEM_callocN(sizeof(CLAY_Storage), "CLAY_Storage");
|
||||
}
|
||||
|
@ -730,32 +715,6 @@ static void CLAY_cache_init(void *vedata)
|
|||
stl->storage->hair_ubo_current_id = 0;
|
||||
memset(stl->storage->hair_shgrps, 0, sizeof(DRWShadingGroup *) * MAX_CLAY_MAT);
|
||||
}
|
||||
|
||||
{
|
||||
psl->part_pass = DRW_pass_create("Particle Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_POINT | DRW_STATE_BLEND);
|
||||
|
||||
static int screen_space[2] = {0, 1};
|
||||
|
||||
stl->g_data->part_dot_shgrp = DRW_shgroup_create(e_data.part_dot_sh, psl->part_pass);
|
||||
|
||||
stl->g_data->part_cross_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->part_pass, DRW_cache_particles_get_prim(PART_DRAW_CROSS));
|
||||
DRW_shgroup_uniform_int(stl->g_data->part_cross_shgrp, "screen_space", &screen_space[0], 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_cross_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_cross_shgrp, "pos", 3);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_cross_shgrp, "rot", 4);
|
||||
|
||||
stl->g_data->part_circle_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->part_pass, DRW_cache_particles_get_prim(PART_DRAW_CIRC));
|
||||
DRW_shgroup_uniform_int(stl->g_data->part_circle_shgrp, "screen_space", &screen_space[1], 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_circle_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_circle_shgrp, "pos", 3);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_circle_shgrp, "rot", 4);
|
||||
|
||||
stl->g_data->part_axis_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->part_pass, DRW_cache_particles_get_prim(PART_DRAW_AXIS));
|
||||
DRW_shgroup_uniform_int(stl->g_data->part_axis_shgrp, "screen_space", &screen_space[0], 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_axis_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_axis_shgrp, "pos", 3);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_axis_shgrp, "rot", 4);
|
||||
}
|
||||
}
|
||||
|
||||
static void CLAY_cache_populate(void *vedata, Object *ob)
|
||||
|
@ -810,85 +769,33 @@ static void CLAY_cache_populate(void *vedata, Object *ob)
|
|||
}
|
||||
}
|
||||
|
||||
if (ob->type == OB_MESH) {
|
||||
Scene *scene = draw_ctx->scene;
|
||||
Object *obedit = scene->obedit;
|
||||
if (ob->type == OB_MESH) {
|
||||
Scene *scene = draw_ctx->scene;
|
||||
Object *obedit = scene->obedit;
|
||||
|
||||
if (ob != obedit) {
|
||||
for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) {
|
||||
if (psys_check_enabled(ob, psys, false)) {
|
||||
ParticleSettings *part = psys->part;
|
||||
int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
|
||||
if (ob != obedit) {
|
||||
for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) {
|
||||
if (psys_check_enabled(ob, psys, false)) {
|
||||
ParticleSettings *part = psys->part;
|
||||
int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
|
||||
|
||||
if (draw_as == PART_DRAW_PATH && !psys->pathcache && !psys->childcache) {
|
||||
draw_as = PART_DRAW_DOT;
|
||||
}
|
||||
if (draw_as == PART_DRAW_PATH && !psys->pathcache && !psys->childcache) {
|
||||
draw_as = PART_DRAW_DOT;
|
||||
}
|
||||
|
||||
static float mat[4][4];
|
||||
unit_m4(mat);
|
||||
static float mat[4][4];
|
||||
unit_m4(mat);
|
||||
|
||||
if (draw_as == PART_DRAW_PATH) {
|
||||
geom = DRW_cache_particles_get_hair(psys);
|
||||
hair_shgrp = CLAY_hair_shgrp_get(ob, stl, psl);
|
||||
DRW_shgroup_call_add(hair_shgrp, geom, mat);
|
||||
}
|
||||
else {
|
||||
IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_CLAY);
|
||||
int matcap_icon = BKE_collection_engine_property_value_get_int(props, "matcap_icon");
|
||||
float matcap_hue = BKE_collection_engine_property_value_get_float(props, "matcap_hue");
|
||||
float matcap_sat = BKE_collection_engine_property_value_get_float(props, "matcap_saturation");
|
||||
float matcap_val = BKE_collection_engine_property_value_get_float(props, "matcap_value");
|
||||
static float size;
|
||||
static float axis_size;
|
||||
static float col[4];
|
||||
float hsv[3];
|
||||
if (draw_as == PART_DRAW_PATH) {
|
||||
geom = DRW_cache_particles_get_hair(psys);
|
||||
hair_shgrp = CLAY_hair_shgrp_get(ob, stl, psl);
|
||||
DRW_shgroup_call_add(hair_shgrp, geom, mat);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
size = (float)part->draw_size;
|
||||
axis_size = size * 2.0f;
|
||||
|
||||
copy_v3_v3(col, e_data.matcap_colors[matcap_to_index(matcap_icon)]);
|
||||
rgb_to_hsv_v(col, hsv);
|
||||
|
||||
hsv[0] = fmod(hsv[0] + matcap_hue - 0.5f, 1.0f);
|
||||
hsv[1] *= matcap_sat * 2.0f;
|
||||
CLAMP(hsv[1], 0.0f, 1.0f);
|
||||
hsv[2] *= matcap_val * 2.0f;
|
||||
CLAMP(hsv[2], 0.0f, 1.0f);
|
||||
|
||||
hsv_to_rgb_v(hsv, col);
|
||||
col[3] = 1.0f;
|
||||
|
||||
geom = DRW_cache_particles_get_dots(psys);
|
||||
|
||||
switch (draw_as) {
|
||||
case PART_DRAW_DOT:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_dot_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_dot_shgrp, "size", &size, 1);
|
||||
DRW_shgroup_call_add(stl->g_data->part_dot_shgrp, geom, mat);
|
||||
break;
|
||||
case PART_DRAW_CROSS:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_cross_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_cross_shgrp, "draw_size", &size, 1);
|
||||
DRW_shgroup_instance_batch(stl->g_data->part_cross_shgrp, geom);
|
||||
break;
|
||||
case PART_DRAW_CIRC:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_circle_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_circle_shgrp, "draw_size", &size, 1);
|
||||
DRW_shgroup_instance_batch(stl->g_data->part_circle_shgrp, geom);
|
||||
break;
|
||||
case PART_DRAW_AXIS:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_axis_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_axis_shgrp, "draw_size", &axis_size, 1);
|
||||
DRW_shgroup_instance_batch(stl->g_data->part_axis_shgrp, geom);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void CLAY_cache_finish(void *vedata)
|
||||
|
@ -929,7 +836,6 @@ static void CLAY_draw_scene(void *vedata)
|
|||
DRW_draw_pass(psl->clay_pass);
|
||||
DRW_draw_pass(psl->clay_pass_flat);
|
||||
DRW_draw_pass(psl->hair_pass);
|
||||
DRW_draw_pass(psl->part_pass);
|
||||
}
|
||||
|
||||
static void CLAY_layer_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
|
||||
|
@ -965,7 +871,6 @@ static void CLAY_engine_free(void)
|
|||
DRW_SHADER_FREE_SAFE(e_data.clay_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.clay_flat_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.hair_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.part_prim_sh);
|
||||
DRW_TEXTURE_FREE_SAFE(e_data.matcap_array);
|
||||
DRW_TEXTURE_FREE_SAFE(e_data.jitter_tx);
|
||||
DRW_TEXTURE_FREE_SAFE(e_data.sampling_tx);
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "BKE_camera.h"
|
||||
#include "BKE_curve.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_particle.h"
|
||||
|
||||
#include "ED_view3d.h"
|
||||
#include "ED_view3d.h"
|
||||
|
@ -59,6 +60,8 @@ extern char datatoc_object_outline_detect_frag_glsl[];
|
|||
extern char datatoc_object_outline_expand_frag_glsl[];
|
||||
extern char datatoc_object_grid_frag_glsl[];
|
||||
extern char datatoc_object_grid_vert_glsl[];
|
||||
extern char datatoc_particle_prim_vert_glsl[];
|
||||
extern char datatoc_particle_prim_frag_glsl[];
|
||||
extern char datatoc_common_globals_lib_glsl[];
|
||||
|
||||
/* *********** LISTS *********** */
|
||||
|
@ -78,6 +81,7 @@ typedef struct OBJECT_PassList {
|
|||
struct DRWPass *bone_solid;
|
||||
struct DRWPass *bone_wire;
|
||||
struct DRWPass *bone_envelope;
|
||||
struct DRWPass *particle;
|
||||
} OBJECT_PassList;
|
||||
|
||||
typedef struct OBJECT_FramebufferList {
|
||||
|
@ -174,6 +178,12 @@ typedef struct OBJECT_PrivateData{
|
|||
DRWShadingGroup *wire_select;
|
||||
DRWShadingGroup *wire_select_group;
|
||||
DRWShadingGroup *wire_transform;
|
||||
|
||||
/* Particles */
|
||||
DRWShadingGroup *part_dot_shgrp;
|
||||
DRWShadingGroup *part_cross_shgrp;
|
||||
DRWShadingGroup *part_circle_shgrp;
|
||||
DRWShadingGroup *part_axis_shgrp;
|
||||
} OBJECT_PrivateData; /* Transient data */
|
||||
|
||||
static struct {
|
||||
|
@ -181,6 +191,8 @@ static struct {
|
|||
GPUShader *outline_detect_sh;
|
||||
GPUShader *outline_fade_sh;
|
||||
GPUShader *grid_sh;
|
||||
GPUShader *part_dot_sh;
|
||||
GPUShader *part_prim_sh;
|
||||
float camera_pos[3];
|
||||
float grid_settings[5];
|
||||
float grid_mat[4][4];
|
||||
|
@ -251,6 +263,14 @@ static void OBJECT_engine_init(void *vedata)
|
|||
datatoc_common_globals_lib_glsl, NULL);
|
||||
}
|
||||
|
||||
if (!e_data.part_prim_sh) {
|
||||
e_data.part_prim_sh = DRW_shader_create(datatoc_particle_prim_vert_glsl, NULL, datatoc_particle_prim_frag_glsl, NULL);
|
||||
}
|
||||
|
||||
if (!e_data.part_dot_sh) {
|
||||
e_data.part_dot_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_AA);
|
||||
}
|
||||
|
||||
{
|
||||
/* Grid precompute */
|
||||
float viewinvmat[4][4], winmat[4][4], invwinmat[4][4], viewmat[4][4];
|
||||
|
@ -393,6 +413,7 @@ static void OBJECT_engine_free(void)
|
|||
DRW_SHADER_FREE_SAFE(e_data.outline_detect_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.outline_fade_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.grid_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.part_prim_sh);
|
||||
}
|
||||
|
||||
static DRWShadingGroup *shgroup_outline(DRWPass *pass, const float col[4], GPUShader *sh)
|
||||
|
@ -813,6 +834,33 @@ static void OBJECT_cache_init(void *vedata)
|
|||
DRW_shgroup_uniform_vec4(grp, "color", ts.colorLibrary, 1);
|
||||
stl->g_data->center_deselected_lib = grp;
|
||||
}
|
||||
|
||||
{
|
||||
/* Particle Pass */
|
||||
psl->particle = DRW_pass_create("Particle Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_POINT | DRW_STATE_BLEND);
|
||||
|
||||
static int screen_space[2] = {0, 1};
|
||||
|
||||
stl->g_data->part_dot_shgrp = DRW_shgroup_create(e_data.part_dot_sh, psl->particle);
|
||||
|
||||
stl->g_data->part_cross_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_CROSS));
|
||||
DRW_shgroup_uniform_int(stl->g_data->part_cross_shgrp, "screen_space", &screen_space[0], 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_cross_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_cross_shgrp, "pos", 3);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_cross_shgrp, "rot", 4);
|
||||
|
||||
stl->g_data->part_circle_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_CIRC));
|
||||
DRW_shgroup_uniform_int(stl->g_data->part_circle_shgrp, "screen_space", &screen_space[1], 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_circle_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_circle_shgrp, "pos", 3);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_circle_shgrp, "rot", 4);
|
||||
|
||||
stl->g_data->part_axis_shgrp = DRW_shgroup_instance_create(e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_AXIS));
|
||||
DRW_shgroup_uniform_int(stl->g_data->part_axis_shgrp, "screen_space", &screen_space[0], 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_axis_shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_axis_shgrp, "pos", 3);
|
||||
DRW_shgroup_attrib_float(stl->g_data->part_axis_shgrp, "rot", 4);
|
||||
}
|
||||
}
|
||||
|
||||
static void DRW_shgroup_lamp(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl)
|
||||
|
@ -1209,6 +1257,63 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
|
|||
|
||||
switch (ob->type) {
|
||||
case OB_MESH:
|
||||
for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) {
|
||||
if (psys_check_enabled(ob, psys, false)) {
|
||||
ParticleSettings *part = psys->part;
|
||||
int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
|
||||
|
||||
if (draw_as == PART_DRAW_PATH && !psys->pathcache && !psys->childcache) {
|
||||
draw_as = PART_DRAW_DOT;
|
||||
}
|
||||
|
||||
static float mat[4][4];
|
||||
unit_m4(mat);
|
||||
|
||||
if (draw_as != PART_DRAW_PATH) {
|
||||
static float size;
|
||||
static float axis_size;
|
||||
static float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||
static float o_col[4] = {0.5f, 0.5f, 0.5f, 1.0f};
|
||||
struct Batch *geom = DRW_cache_particles_get_dots(psys);
|
||||
|
||||
Material *ma = give_current_material(ob, part->omat);
|
||||
|
||||
if (ma) {
|
||||
copy_v3_v3(col, &ma->r);
|
||||
copy_v3_v3(o_col, &ma->specr);
|
||||
}
|
||||
|
||||
size = (float)part->draw_size;
|
||||
axis_size = size * 2.0f;
|
||||
|
||||
switch (draw_as) {
|
||||
case PART_DRAW_DOT:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_dot_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_dot_shgrp, "outlineColor", o_col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_dot_shgrp, "size", &size, 1);
|
||||
DRW_shgroup_call_add(stl->g_data->part_dot_shgrp, geom, mat);
|
||||
break;
|
||||
case PART_DRAW_CROSS:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_cross_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_cross_shgrp, "draw_size", &size, 1);
|
||||
DRW_shgroup_instance_batch(stl->g_data->part_cross_shgrp, geom);
|
||||
break;
|
||||
case PART_DRAW_CIRC:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_circle_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_circle_shgrp, "draw_size", &size, 1);
|
||||
DRW_shgroup_instance_batch(stl->g_data->part_circle_shgrp, geom);
|
||||
break;
|
||||
case PART_DRAW_AXIS:
|
||||
DRW_shgroup_uniform_vec4(stl->g_data->part_axis_shgrp, "color", col, 1);
|
||||
DRW_shgroup_uniform_float(stl->g_data->part_axis_shgrp, "draw_size", &axis_size, 1);
|
||||
DRW_shgroup_instance_batch(stl->g_data->part_axis_shgrp, geom);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case OB_SURF:
|
||||
break;
|
||||
case OB_LATTICE:
|
||||
|
@ -1352,6 +1457,7 @@ static void OBJECT_draw_scene(void *vedata)
|
|||
DRW_draw_pass(psl->bone_solid);
|
||||
DRW_draw_pass(psl->non_meshes);
|
||||
DRW_draw_pass(psl->ob_center);
|
||||
DRW_draw_pass(psl->particle);
|
||||
|
||||
if (!DRW_state_is_select()) {
|
||||
DRW_draw_pass(psl->grid);
|
||||
|
|
Loading…
Reference in New Issue