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:
parent
e05d3d5d9b
commit
6dbc6dfc14
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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*/
|
||||
|
||||
|
|
Loading…
Reference in New Issue