Overlay: Wireframe: Add visualization for Hairs in wireframe mode
This only works for particle systems for now. Fix T61928 Wireframe mode hair not visible
This commit is contained in:
parent
e4e31e4f14
commit
af3a55bb1b
Notes:
blender-bot
2023-02-14 03:35:22 +01:00
Referenced by issue #77249, Operators that create library data without being flaged to UNDO crash when undoing Referenced by issue #61928, Wireframe mode hair is displayed behind meshes.
|
@ -253,8 +253,9 @@ typedef struct OVERLAY_PrivateData {
|
|||
DRWShadingGroup *particle_shapes_grp;
|
||||
DRWShadingGroup *pointcloud_dots_grp;
|
||||
DRWShadingGroup *sculpt_mask_grp;
|
||||
DRWShadingGroup *wires_grp[2][2]; /* With and without coloring. */
|
||||
DRWShadingGroup *wires_all_grp[2][2]; /* With and without coloring. */
|
||||
DRWShadingGroup *wires_grp[2][2]; /* With and without coloring. */
|
||||
DRWShadingGroup *wires_all_grp[2][2]; /* With and without coloring. */
|
||||
DRWShadingGroup *wires_hair_grp[2][2]; /* With and without coloring. */
|
||||
DRWShadingGroup *wires_sculpt_grp[2];
|
||||
|
||||
DRWView *view_default;
|
||||
|
|
|
@ -21,15 +21,18 @@
|
|||
*/
|
||||
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_particle_types.h"
|
||||
#include "DNA_view3d_types.h"
|
||||
#include "DNA_volume_types.h"
|
||||
|
||||
#include "BKE_curve.h"
|
||||
#include "BKE_displist.h"
|
||||
#include "BKE_duplilist.h"
|
||||
#include "BKE_editmesh.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_object.h"
|
||||
#include "BKE_paint.h"
|
||||
#include "BKE_particle.h"
|
||||
|
||||
#include "BLI_hash.h"
|
||||
|
||||
|
@ -95,16 +98,24 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
|
|||
DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "isObjectColor", is_object_color);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "isHair", false);
|
||||
|
||||
pd->wires_all_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass);
|
||||
DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tx);
|
||||
DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 1.0f);
|
||||
|
||||
pd->wires_hair_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass);
|
||||
/* TODO(fclem) texture ref persist */
|
||||
DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tx);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "isHair", true);
|
||||
DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 10.0f);
|
||||
}
|
||||
|
||||
pd->wires_sculpt_grp[xray] = grp = DRW_shgroup_create(wires_sh, pass);
|
||||
DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tx);
|
||||
DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 10.0f);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "useColoring", false);
|
||||
DRW_shgroup_uniform_bool_copy(grp, "isHair", false);
|
||||
}
|
||||
|
||||
if (is_material_shmode) {
|
||||
|
@ -112,19 +123,53 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
|
|||
for (int use_coloring = 0; use_coloring < 2; use_coloring++) {
|
||||
pd->wires_grp[1][use_coloring] = pd->wires_grp[0][use_coloring];
|
||||
pd->wires_all_grp[1][use_coloring] = pd->wires_all_grp[0][use_coloring];
|
||||
pd->wires_hair_grp[1][use_coloring] = pd->wires_hair_grp[0][use_coloring];
|
||||
}
|
||||
pd->wires_sculpt_grp[1] = pd->wires_sculpt_grp[0];
|
||||
psl->wireframe_xray_ps = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void wireframe_hair_cache_populate(OVERLAY_Data *vedata, Object *ob, ParticleSystem *psys)
|
||||
{
|
||||
OVERLAY_PrivateData *pd = vedata->stl->pd;
|
||||
const bool is_xray = (ob->dtx & OB_DRAWXRAY) != 0;
|
||||
|
||||
Object *dupli_parent = DRW_object_get_dupli_parent(ob);
|
||||
DupliObject *dupli_object = DRW_object_get_dupli(ob);
|
||||
|
||||
float dupli_mat[4][4];
|
||||
if ((dupli_parent != NULL) && (dupli_object != NULL)) {
|
||||
if (dupli_object->type & OB_DUPLICOLLECTION) {
|
||||
copy_m4_m4(dupli_mat, dupli_parent->obmat);
|
||||
}
|
||||
else {
|
||||
copy_m4_m4(dupli_mat, dupli_object->ob->obmat);
|
||||
invert_m4(dupli_mat);
|
||||
mul_m4_m4m4(dupli_mat, ob->obmat, dupli_mat);
|
||||
}
|
||||
}
|
||||
else {
|
||||
unit_m4(dupli_mat);
|
||||
}
|
||||
|
||||
struct GPUBatch *hairs = DRW_cache_particles_get_hair(ob, psys, NULL);
|
||||
|
||||
const bool use_coloring = true;
|
||||
DRWShadingGroup *shgrp = DRW_shgroup_create_sub(pd->wires_hair_grp[is_xray][use_coloring]);
|
||||
DRW_shgroup_uniform_vec4_copy(shgrp, "hairDupliMatrix[0]", dupli_mat[0]);
|
||||
DRW_shgroup_uniform_vec4_copy(shgrp, "hairDupliMatrix[1]", dupli_mat[1]);
|
||||
DRW_shgroup_uniform_vec4_copy(shgrp, "hairDupliMatrix[2]", dupli_mat[2]);
|
||||
DRW_shgroup_uniform_vec4_copy(shgrp, "hairDupliMatrix[3]", dupli_mat[3]);
|
||||
DRW_shgroup_call_no_cull(shgrp, hairs, ob);
|
||||
}
|
||||
|
||||
void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
|
||||
Object *ob,
|
||||
OVERLAY_DupliData *dupli,
|
||||
bool init_dupli)
|
||||
{
|
||||
OVERLAY_Data *data = vedata;
|
||||
OVERLAY_PrivateData *pd = data->stl->pd;
|
||||
OVERLAY_PrivateData *pd = vedata->stl->pd;
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
const bool all_wires = (ob->dtx & OB_DRAW_ALL_EDGES) != 0;
|
||||
const bool is_xray = (ob->dtx & OB_DRAWXRAY) != 0;
|
||||
|
@ -134,6 +179,19 @@ void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata,
|
|||
const bool use_wire = !is_mesh_verts_only && ((pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) ||
|
||||
(ob->dtx & OB_DRAWWIRE) || (ob->dt == OB_WIRE));
|
||||
|
||||
if (use_wire && pd->wireframe_mode && ob->particlesystem.first) {
|
||||
for (ParticleSystem *psys = ob->particlesystem.first; psys != NULL; psys = psys->next) {
|
||||
if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
|
||||
continue;
|
||||
}
|
||||
ParticleSettings *part = psys->part;
|
||||
const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
|
||||
if (draw_as == PART_DRAW_PATH) {
|
||||
wireframe_hair_cache_populate(vedata, ob, psys);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ELEM(ob->type, OB_CURVE, OB_FONT, OB_SURF)) {
|
||||
OVERLAY_ExtraCallBuffers *cb = OVERLAY_extra_call_buffer_get(vedata, ob);
|
||||
float *color;
|
||||
|
|
|
@ -4,6 +4,8 @@ uniform bool useColoring;
|
|||
uniform bool isTransform;
|
||||
uniform bool isObjectColor;
|
||||
uniform bool isRandomColor;
|
||||
uniform bool isHair;
|
||||
uniform vec4 hairDupliMatrix[4];
|
||||
|
||||
in vec3 pos;
|
||||
in vec3 nor;
|
||||
|
@ -103,9 +105,16 @@ void main()
|
|||
{
|
||||
bool no_attr = all(equal(nor, vec3(0)));
|
||||
vec3 wnor = no_attr ? ViewMatrixInverse[2].xyz : normalize(normal_object_to_world(nor));
|
||||
|
||||
vec3 wpos = point_object_to_world(pos);
|
||||
|
||||
if (isHair) {
|
||||
mat4 obmat = mat4(
|
||||
hairDupliMatrix[0], hairDupliMatrix[1], hairDupliMatrix[2], hairDupliMatrix[3]);
|
||||
|
||||
wpos = (obmat * vec4(pos, 1.0)).xyz;
|
||||
wnor = -normalize(mat3(obmat) * nor);
|
||||
}
|
||||
|
||||
bool is_persp = (ProjectionMatrix[3][3] == 0.0);
|
||||
vec3 V = (is_persp) ? normalize(ViewMatrixInverse[3].xyz - wpos) : ViewMatrixInverse[2].xyz;
|
||||
|
||||
|
|
Loading…
Reference in New Issue