Commit: da9dc1518f3e18bf15b380665f37626e4e2b4f06
Author: Antonio Vazquez
Date:   Mon Jul 2 10:48:35 2018 +0200
Branches: temp-greasepencil-vfx
https://developer.blender.org/rBda9dc1518f3e18bf15b380665f37626e4e2b4f06

Refactor Effects loop to reduce complexity

This is the first step to allow multiple effects of the same type.

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

M       source/blender/draw/engines/gpencil/gpencil_shader_fx.c
M       source/blender/makesdna/DNA_shader_fx_types.h

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c 
b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index ce47c7d4b63..fd19083013b 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -247,7 +247,7 @@ static void DRW_gpencil_fx_colorize(
        DRW_shgroup_uniform_int(fx_shgrp, "mode", 
&stl->fx[ob_idx].fx_colorize.mode, 1);
        DRW_shgroup_uniform_float(fx_shgrp, "factor", 
&stl->fx[ob_idx].fx_colorize.factor, 1);
 
-       cache->fx_colorize_sh = fx_shgrp;
+       fxd->runtime.fx_sh = fx_shgrp;
 }
 
 /* Flip FX */
@@ -284,7 +284,7 @@ static void DRW_gpencil_fx_flip(
 
        DRW_shgroup_uniform_vec2(fx_shgrp, "wsize", DRW_viewport_size_get(), 1);
 
-       cache->fx_flip_sh = fx_shgrp;
+       fxd->runtime.fx_sh = fx_shgrp;
 }
 
 /* Light FX */
@@ -342,7 +342,7 @@ static void DRW_gpencil_fx_light(
        DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
        DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &gpd->pixfactor, 1);
 
-       cache->fx_light_sh = fx_shgrp;
+       fxd->runtime.fx_sh = fx_shgrp;
 }
 
 /* Pixelate FX */
@@ -381,7 +381,7 @@ static void DRW_gpencil_fx_pixel(
        DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
        DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &gpd->pixfactor, 1);
        
-       cache->fx_pixel_sh = fx_shgrp;
+       fxd->runtime.fx_sh = fx_shgrp;
 }
 
 /* Rim FX */
@@ -422,7 +422,7 @@ static void DRW_gpencil_fx_rim(
        DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
        DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &gpd->pixfactor, 1);
 
-       cache->fx_rim_sh = fx_shgrp;
+       fxd->runtime.fx_sh = fx_shgrp;
 }
 
 /* Swirl FX */
@@ -467,7 +467,7 @@ static void DRW_gpencil_fx_swirl(
        DRW_shgroup_uniform_float(fx_shgrp, "pixelsize", &U.pixelsize, 1);
        DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &gpd->pixfactor, 1);
 
-       cache->fx_swirl_sh = fx_shgrp;
+       fxd->runtime.fx_sh = fx_shgrp;
 }
 
 /* Wave Distorsion FX */
@@ -500,7 +500,7 @@ static void DRW_gpencil_fx_wave(
        DRW_shgroup_uniform_int(fx_shgrp, "orientation", 
&stl->fx[ob_idx].fx_wave.orientation, 1);
        DRW_shgroup_uniform_vec2(fx_shgrp, "wsize", DRW_viewport_size_get(), 1);
 
-       cache->fx_wave_sh = fx_shgrp;
+       fxd->runtime.fx_sh = fx_shgrp;
 }
 
 /* ************************************************************** */
@@ -607,9 +607,13 @@ void DRW_gpencil_fx_prepare(
 
 /* helper to draw one FX pass and do ping-pong copy */
 static void gpencil_draw_fx_pass(GPENCIL_e_data *e_data,
-       DRWPass *fxpass, DRWPass *copypass,
-       GPENCIL_FramebufferList *fbl, DRWShadingGroup *shgrp)
+       GPENCIL_PassList *psl, GPENCIL_FramebufferList *fbl,
+       DRWShadingGroup *shgrp)
 {
+       if (shgrp == NULL) {
+               return;
+       }
+
        static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
 
        GPU_framebuffer_bind(fbl->temp_fb_b);
@@ -617,7 +621,7 @@ static void gpencil_draw_fx_pass(GPENCIL_e_data *e_data,
 
        /* draw effect pass in temp texture (B) using as source the previous 
image
         * existing in the other temp texture (A) */
-       DRW_draw_pass_subset(fxpass, shgrp, shgrp);
+       DRW_draw_pass_subset(psl->fx_shader_pass, shgrp, shgrp);
 
        /* copy pass from b to a for ping-pong frame buffers */
        e_data->input_depth_tx = e_data->temp_depth_tx_b;
@@ -625,14 +629,19 @@ static void gpencil_draw_fx_pass(GPENCIL_e_data *e_data,
 
        GPU_framebuffer_bind(fbl->temp_fb_a);
        GPU_framebuffer_clear_color_depth(fbl->temp_fb_a, clearcol, 1.0f);
-       DRW_draw_pass(copypass);
+       DRW_draw_pass(psl->mix_pass_noblend);
 }
 
 /* helper to manage gaussian blur passes */
 static void gpencil_blur_passes(struct GPENCIL_e_data *e_data,
                                                                struct 
GPENCIL_Data *vedata,
-                                                               struct 
tGPencilObjectCache *cache)
+                                                               struct 
tGPencilObjectCache *cache,
+                                                               struct 
DRWShadingGroup *shgrp)
 {
+       if (shgrp == NULL) {
+               return;
+       }
+
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
        GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
@@ -654,17 +663,13 @@ static void gpencil_blur_passes(struct GPENCIL_e_data 
*e_data,
                if (bx > 0) {
                        stl->fx[ob_idx].fx_blur.radius[0] = bx;
                        stl->fx[ob_idx].fx_blur.radius[1] = 0;
-                       gpencil_draw_fx_pass(e_data, psl->fx_shader_pass,
-                                                               
psl->mix_pass_noblend,
-                                                               fbl, 
cache->fx_blur_sh);
+                       gpencil_draw_fx_pass(e_data, psl, fbl, shgrp);
                }
                /* vertical */
                if (by > 0) {
                        stl->fx[ob_idx].fx_blur.radius[0] = 0;
                        stl->fx[ob_idx].fx_blur.radius[1] = by;
-                       gpencil_draw_fx_pass(e_data, psl->fx_shader_pass,
-                                                               
psl->mix_pass_noblend,
-                                                               fbl, 
cache->fx_blur_sh);
+                       gpencil_draw_fx_pass(e_data, psl, fbl, shgrp);
                }
        }
 }
@@ -679,63 +684,57 @@ void DRW_gpencil_fx_draw(struct GPENCIL_e_data *e_data,
        Object *ob = cache->ob;
 
        /* loop FX modifiers */
-       for (ShaderFxData *md = ob->shader_fx.first; md; md = md->next) {
-               if (effect_is_active(ob, md, stl->storage->is_render)) {
-                       switch (md->type) {
+       for (ShaderFxData *fx = ob->shader_fx.first; fx; fx = fx->next) {
+               if (effect_is_active(ob, fx, stl->storage->is_render)) {
+                       switch (fx->type) {
                                case eShaderFxType_Blur:
-                                       if (cache->fx_blur_sh) {
-                                               gpencil_blur_passes(e_data, 
vedata, cache);
-                                       }
+                               {
+                                       BlurShaderFxData * fxd = 
(BlurShaderFxData *)fx;
+                                       gpencil_blur_passes(e_data, vedata, 
cache, fxd->runtime.fx_sh);
                                        break;
+                               }
                                case eShaderFxType_Colorize:
-                                       if (cache->fx_colorize_sh) {
-                                               gpencil_draw_fx_pass(e_data, 
psl->fx_shader_pass,
-                                                       psl->mix_pass_noblend,
-                                                       fbl, 
cache->fx_colorize_sh);
-                                       }
+                               {
+                                       ColorizeShaderFxData * fxd = 
(ColorizeShaderFxData *)fx;
+                                       gpencil_draw_fx_pass(e_data, psl, fbl, 
fxd->runtime.fx_sh);
                                        break;
+                               }
                                case eShaderFxType_Flip:
-                                       if (cache->fx_flip_sh) {
-                                               gpencil_draw_fx_pass(e_data, 
psl->fx_shader_pass,
-                                                                               
        psl->mix_pass_noblend,
-                                                                               
        fbl, cache->fx_flip_sh);
-                                       }
+                               {
+                                       FlipShaderFxData *fxd = 
(FlipShaderFxData *)fx;
+                                       gpencil_draw_fx_pass(e_data, psl, fbl, 
fxd->runtime.fx_sh);
                                        break;
+                               }
                                case eShaderFxType_Light:
-                                       if (cache->fx_light_sh) {
-                                               gpencil_draw_fx_pass(e_data, 
psl->fx_shader_pass,
-                                                                               
        psl->mix_pass_noblend,
-                                                                               
        fbl, cache->fx_light_sh);
-                                       }
+                               {
+                                       LightShaderFxData *fxd = 
(LightShaderFxData *)fx;
+                                       gpencil_draw_fx_pass(e_data, psl, fbl, 
fxd->runtime.fx_sh);
                                        break;
+                               }
                                case eShaderFxType_Pixel:
-                                       if (cache->fx_pixel_sh) {
-                                               gpencil_draw_fx_pass(e_data, 
psl->fx_shader_pass,
-                                                                               
        psl->mix_pass_noblend,
-                                                                               
        fbl, cache->fx_pixel_sh);
-                                       }
+                               {
+                                       PixelShaderFxData *fxd = 
(PixelShaderFxData *)fx;
+                                       gpencil_draw_fx_pass(e_data, psl, fbl, 
fxd->runtime.fx_sh);
                                        break;
+                               }
                                case eShaderFxType_Rim:
-                                       if (cache->fx_rim_sh) {
-                                               gpencil_draw_fx_pass(e_data, 
psl->fx_shader_pass,
-                                                       psl->mix_pass_noblend,
-                                                       fbl, cache->fx_rim_sh);
-                                       }
+                               {
+                                       RimShaderFxData *fxd = (RimShaderFxData 
*)fx;
+                                       gpencil_draw_fx_pass(e_data, psl, fbl, 
fxd->runtime.fx_sh);
                                        break;
+                               }
                                case eShaderFxType_Swirl:
-                                       if (cache->fx_swirl_sh) {
-                                               gpencil_draw_fx_pass(e_data, 
psl->fx_shader_pass,
-                                                                               
        psl->mix_pass_noblend,
-                                                                               
        fbl, cache->fx_swirl_sh);
-                                       }
+                               {
+                                       SwirlShaderFxData * fxd = 
(SwirlShaderFxData *)fx;
+                                       gpencil_draw_fx_pass(e_data, psl, fbl, 
fxd->runtime.fx_sh);
                                        break;
+                               }
                                case eShaderFxType_Wave:
-                                       if (cache->fx_wave_sh) {
-                                               gpencil_draw_fx_pass(e_data, 
psl->fx_shader_pass,
-                                                                               
        psl->mix_pass_noblend,
-                                                                               
        fbl, cache->fx_wave_sh);
-                                       }
+                               {
+                                       WaveShaderFxData *fxd = 
(WaveShaderFxData *)fx;
+                                       gpencil_draw_fx_pass(e_data, psl, fbl, 
fxd->runtime.fx_sh);
                                        break;
+                               }
                                default:
                                        break;
                        }
diff --git a/source/blender/makesdna/DNA_shader_fx_types.h 
b/source/blender/makesdna/DNA_shader_fx_types.h
index 483f0250542..09e59419474 100644
--- a/source/blender/makesdna/DNA_shader_fx_types.h
+++ b/source/blender/makesdna/DNA_shader_fx_types.h
@@ -28,6 +28,8 @@
 #include "DNA_defs.h"
 #include "DNA_listBase.h"
 
+struct DRWShadingGroup;
+
 /* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE!
  * (ONLY ADD NEW ITEMS AT THE END)
  */
@@ -69,6 +71,11 @@ typedef struct ShaderFxData {
        char *error;
 } ShaderFxData;
 
+/* Runtime temp data */
+typedef struct ShaderFxData_runtime {
+       struct DRWShadingGroup *fx_sh;
+} ShaderFxData_runtime;
+
 typedef struct BlurShaderFxData {
        ShaderFxData shaderfx;
        int radius[2];
@@ -76,6 +83,7 @@ typedef struct BlurShaderFxData {
        int samples;                 /* number of samples */
        float coc;                   /* circle of confusion */
        char pad[4];
+       ShaderFxData_runtime runtime;
 } BlurShaderFxData;
 
 typedef enum eBlurShaderFx_Flag {
@@ -90,6 +98,7 @@ typedef struct ColorizeShaderFxData {
        float factor;
        int flag;                    /* flags */
        char pad[4];
+       ShaderFxData_runtime runtime;
 } ColorizeShaderFxData;
 
 typedef enum ColorizeShaderFxModes {
@@ -99,16 +108,27 @@ typedef enum ColorizeShaderFxModes {
        eShaderFxColorizeMode_Custom = 3,
 } ColorizeShaderFxModes;
 
+typedef struct FlipShaderFxData {
+       ShaderFxData shaderfx;
+       int flag;                    /* flags */
+       char pad[4];
+       ShaderFxData_runtime runtime;
+} FlipShaderFxData;
 
-typedef struct WaveShaderFxData {
+typedef enum eFlipShaderFx_Flag {
+       FX_FLIP_HORIZONTAL = (1 << 0),
+       FX_FLIP_VERTICAL = (1 << 1),
+} eFlipShaderFx_Flag;
+
+typedef struct LightShaderFxData {
        ShaderFxData shaderfx;
-       float amplitude;
-       float period;
-       float phase;
-       int orientation;
+       struct Object *object;
        int flag;                    /* flags */
+       float energy;
+       float ambient;
        char pad[4];
-} WaveShaderFxData;
+       ShaderFxData_runtime runtime;
+} LightShaderFxData;
 
 typedef struct PixelShaderFxData {
        ShaderFxData shaderfx;
@@ -116,6 +136,7 @@ typedef struct PixelShaderFxData {
        int flag;                    /* flags */
        float rgba[4];
        char pad[4];
+       ShaderFxData_runtime runtime;
 } PixelShaderFxData;
 
 typedef enum ePixelShaderFx_Flag {
@@ -129,6 +150,7 @@ typedef struct RimShaderFxData {
        float rim_rgba[4];
        float mask_rgba[4];
        i

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to