[Bf-blender-cvs] [090127099de] greasepencil-refactor: GPencil: Refactor: Quick implementation of object matrices

Clément Foucault noreply at git.blender.org
Mon Dec 9 02:30:49 CET 2019


Commit: 090127099de161205ce43fac00baa1eac0b5eb1d
Author: Clément Foucault
Date:   Mon Dec 9 02:28:06 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB090127099de161205ce43fac00baa1eac0b5eb1d

GPencil: Refactor: Quick implementation of object matrices

This is just for testing. Not the final implementation

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

M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 1870aa816d2..2818434b7b7 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -751,6 +751,10 @@ static void gp_layer_cache_populate(bGPDlayer *layer,
 
   struct GPUShader *sh = GPENCIL_shader_geometry_get(&en_data);
   iter->grp = DRW_shgroup_create(sh, tgp_layer->geom_ps);
+  DRW_shgroup_uniform_vec4_copy(iter->grp, "gpModelMatrix[0]", iter->ob->obmat[0]);
+  DRW_shgroup_uniform_vec4_copy(iter->grp, "gpModelMatrix[1]", iter->ob->obmat[1]);
+  DRW_shgroup_uniform_vec4_copy(iter->grp, "gpModelMatrix[2]", iter->ob->obmat[2]);
+  DRW_shgroup_uniform_vec4_copy(iter->grp, "gpModelMatrix[3]", iter->ob->obmat[3]);
   DRW_shgroup_uniform_vec2_copy(iter->grp, "sizeViewportInv", DRW_viewport_invert_size_get());
   DRW_shgroup_uniform_vec2_copy(iter->grp, "sizeViewport", DRW_viewport_size_get());
   DRW_shgroup_uniform_float_copy(iter->grp, "thicknessScale", object_scale);
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl
index b9abd914926..acd92000ec7 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl
@@ -4,6 +4,7 @@ uniform vec2 sizeViewport;
 uniform vec2 sizeViewportInv;
 
 /* Per Object */
+uniform vec4 gpModelMatrix[4];
 uniform float thicknessScale;
 uniform float thicknessWorldScale;
 #define thicknessIsScreenSpace (thicknessWorldScale < 0.0)
@@ -38,6 +39,16 @@ vec2 rotate_90deg(vec2 v)
   return vec2(-v.y, v.x);
 }
 
+mat4 model_matrix_get()
+{
+  return mat4(gpModelMatrix[0], gpModelMatrix[1], gpModelMatrix[2], gpModelMatrix[3]);
+}
+
+vec3 transform_point(mat4 m, vec3 v)
+{
+  return (m * vec4(v, 1.0)).xyz;
+}
+
 void stroke_vertex()
 {
   /* Enpoints, we discard the vertices. */
@@ -46,13 +57,15 @@ void stroke_vertex()
     return;
   }
 
+  mat4 model_mat = model_matrix_get();
+
   /* Avoid using a vertex attrib for quad positioning. */
   float x = float(gl_VertexID & 1);       /* [0..1] */
   float y = float(gl_VertexID & 2) - 1.0; /* [-1..1] */
 
-  vec3 wpos_adj = (x == 0.0) ? pos.xyz : pos3.xyz;
-  vec3 wpos1 = pos1.xyz;
-  vec3 wpos2 = pos2.xyz;
+  vec3 wpos_adj = transform_point(model_mat, (x == 0.0) ? pos.xyz : pos3.xyz);
+  vec3 wpos1 = transform_point(model_mat, pos1.xyz);
+  vec3 wpos2 = transform_point(model_mat, pos2.xyz);
 
   vec4 ndc_adj = point_world_to_ndc(wpos_adj);
   vec4 ndc1 = point_world_to_ndc(wpos1);
@@ -104,7 +117,9 @@ void dots_vertex()
 
 void fill_vertex()
 {
-  vec3 wpos = pos1.xyz;
+  mat4 model_mat = model_matrix_get();
+
+  vec3 wpos = transform_point(model_mat, pos1.xyz);
   gl_Position = point_world_to_ndc(wpos);
   gl_Position.z += 1e-2;



More information about the Bf-blender-cvs mailing list