Commit: 985574c010d44f0fed96fed0d9c584f84edbf541
Author: Luca Rood
Date:   Fri May 19 18:32:40 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB985574c010d44f0fed96fed0d9c584f84edbf541

Move particle drawing to object mode

===================================================================

M       source/blender/draw/engines/clay/clay_engine.c
M       source/blender/draw/modes/object_mode.c

===================================================================

diff --git a/source/blender/draw/engines/clay/clay_engine.c 
b/source/blender/draw/engines/clay/clay_engine.c
index 4bb8920a2f9..b5000b8314f 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -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 != 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;
-                                       }
-
-                                       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];
-
-                                               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;
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
+   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 (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) {
+                                                                               
   geom = DRW_cache_particles_get_hair(psys);
+                                                                               
   hair_shgrp = CLAY_hair_shgrp_get(ob, stl, psl);
+                                                                               
   DRW_shgroup_call_add(hair_shgrp, geom, mat);
+                                                                  }
+                                                  }
+                                  }
+                  }
+   }
+
 }
 
 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);
diff --git a/source/blender/draw/modes/object_mode.c 
b/source/blender/draw/modes/object_mode.c
index 0a781e61b19..bc1a69fd4ed 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -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_setti

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to