Clay Engine: Prepare for Armature drawing.

- Added runtime display matrices to EditBone and bPoseChannel
- Added Object space instance vertex shader and modified the simple lighting shader accordingly
This commit is contained in:
Clément Foucault 2017-02-22 12:46:27 +01:00
parent e05d3d5d9b
commit 6dbc6dfc14
7 changed files with 58 additions and 9 deletions

View File

@ -83,6 +83,12 @@ typedef struct EditBone {
short segments;
/* Used for display */
float disp_mat[4][4]; /* in Armature space, rest pos matrix */
float disp_tail_mat[4][4]; /* in Armature space, rest pos matrix */
/* 32 == MAX_BBONE_SUBDIV */
float disp_bbone_mat[32][4][4]; /* in Armature space, rest pos matrix */
/* Used to store temporary data */
union {
struct EditBone *ebone;

View File

@ -158,6 +158,7 @@ data_to_c_simple(shaders/gpu_shader_3D_passthrough_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_instance_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_instance_variying_size_variying_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_instance_objectspace_variying_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_instance_screenspace_variying_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_instance_screenspace_axis_name_vert.glsl SRC)

View File

@ -139,6 +139,9 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_3D_GROUNDPOINT,
GPU_SHADER_3D_GROUNDLINE,
GPU_SHADER_3D_SCREENSPACE_VARIYING_COLOR,
/* bone drawing */
GPU_SHADER_3D_OBJECTSPACE_VARIYING_COLOR,
GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR,
/* axis name */
GPU_SHADER_3D_SCREENSPACE_AXIS,
/* instance */

View File

@ -75,6 +75,7 @@ extern char datatoc_gpu_shader_3D_passthrough_vert_glsl[];
extern char datatoc_gpu_shader_instance_vert_glsl[];
extern char datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl[];
extern char datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl[];
extern char datatoc_gpu_shader_instance_screenspace_variying_color_vert_glsl[];
extern char datatoc_gpu_shader_instance_screenspace_axis_name_vert_glsl[];
@ -701,6 +702,11 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
datatoc_gpu_shader_uniform_color_frag_glsl,
datatoc_gpu_shader_3D_groundline_geom_glsl },
[GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR] =
{ datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
datatoc_gpu_shader_simple_lighting_frag_glsl},
[GPU_SHADER_3D_OBJECTSPACE_VARIYING_COLOR] = { datatoc_gpu_shader_instance_objectspace_variying_color_vert_glsl,
datatoc_gpu_shader_flat_color_frag_glsl},
[GPU_SHADER_3D_SCREENSPACE_VARIYING_COLOR] = { datatoc_gpu_shader_instance_screenspace_variying_color_vert_glsl,
datatoc_gpu_shader_flat_color_frag_glsl},
[GPU_SHADER_3D_SCREENSPACE_AXIS] = { datatoc_gpu_shader_instance_screenspace_axis_name_vert_glsl,
@ -745,7 +751,8 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
if (builtin_shaders[shader] == NULL) {
/* just a few special cases */
const char *defines = (shader == GPU_SHADER_SMOKE_COBA) ? "#define USE_COBA;\n" :
(shader == GPU_SHADER_SIMPLE_LIGHTING) ? "#define USE_NORMALS;\n" : NULL;
(shader == GPU_SHADER_SIMPLE_LIGHTING) ? "#define USE_NORMALS;\n" :
(shader == GPU_SHADER_3D_OBJECTSPACE_SIMPLE_LIGHTING_VARIYING_COLOR) ? "#define USE_INSTANCE_COLOR;\n" : NULL;
const GPUShaderStages *stages = builtin_shader_stages + shader;
@ -757,14 +764,6 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
stages = &legacy_fancy_edges;
}
if (shader == GPU_SHADER_EDGES_FRONT_BACK_PERSP && !GLEW_VERSION_3_2) {
/* TODO: remove after switch to core profile (maybe) */
static const GPUShaderStages legacy_fancy_edges =
{ datatoc_gpu_shader_edges_front_back_persp_legacy_vert_glsl,
datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl };
stages = &legacy_fancy_edges;
}
/* common case */
builtin_shaders[shader] = GPU_shader_create(stages->vert, stages->frag, stages->geom,
NULL, defines, 0, 0, 0);

View File

@ -0,0 +1,29 @@
uniform mat4 ViewMatrix;
uniform mat4 ViewProjectionMatrix;
uniform mat4 ModelMatrix;
/* ---- Instanciated Attribs ---- */
in vec3 pos;
in vec3 nor;
/* ---- Per instance Attribs ---- */
in mat4 InstanceModelMatrix;
in vec4 color;
out vec3 normal;
flat out vec4 finalColor;
void main()
{
mat4 FinalModelMatrix = ModelMatrix * InstanceModelMatrix;
mat4 ModelViewProjectionMatrix = ViewProjectionMatrix * FinalModelMatrix;
/* This is slow and run per vertex, but it's still faster than
* doing it per instance on CPU and sending it on via instance attrib */
mat3 NormalMatrix = transpose(inverse(mat3(ViewMatrix * FinalModelMatrix)));
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
normal = NormalMatrix * nor;
finalColor = color;
}

View File

@ -1,12 +1,21 @@
#ifndef USE_INSTANCE_COLOR
uniform vec4 color;
#endif
uniform vec3 light;
#if __VERSION__ == 120
varying vec3 normal;
#ifdef USE_INSTANCE_COLOR
varying vec4 finalColor;
#endif
#define fragColor gl_FragColor
#else
in vec3 normal;
#ifdef USE_INSTANCE_COLOR
flat in vec4 finalColor;
#define color finalColor
#endif
out vec4 fragColor;
#endif

View File

@ -238,6 +238,8 @@ typedef struct bPoseChannel {
float chan_mat[4][4]; /* matrix result of loc/quat/size, and where we put deform in, see next line */
float pose_mat[4][4]; /* constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat
* this matrix is object space */
float disp_mat[4][4]; /* for display, pose_mat with bone length applied */
float disp_tail_mat[4][4]; /* for display, pose_mat with bone length applied and translated to tail*/
float constinv[4][4]; /* inverse result of constraints.
* doesn't include effect of restposition, parent, and local transform*/