Use 4 32bit floats for quaternion for sam's wall

This commit is contained in:
Benau 2018-04-12 16:27:48 +08:00
parent 4abdb14a4c
commit 295c793f91
9 changed files with 35 additions and 110 deletions

View File

@ -11,13 +11,7 @@ layout(location = 1) in vec4 i_normal;
layout(location = 2) in vec4 i_color; layout(location = 2) in vec4 i_color;
layout(location = 3) in vec2 i_uv; layout(location = 3) in vec2 i_uv;
layout(location = 8) in vec3 i_origin; layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation; layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale; layout(location = 10) in vec4 i_scale;
layout(location = 12) in ivec2 i_misc_data; layout(location = 12) in ivec2 i_misc_data;
@ -32,16 +26,14 @@ void main()
#if defined(Converts_10bit_Vector) #if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_orig); vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif #endif
vec3 test = sin(wind_direction * (i_position.y * 0.1)); vec3 test = sin(wind_direction * (i_position.y * 0.1));
test += cos(wind_direction) * 0.7; test += cos(wind_direction) * 0.7;
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w));
vec4 world_position = getWorldPosition(i_origin + test * i_color.r, vec4 world_position = getWorldPosition(i_origin + test * i_color.r,
quaternion, i_scale.xyz, i_position); i_rotation, i_scale.xyz, i_position);
vec3 world_normal = rotateVector(quaternion, i_normal.xyz); vec3 world_normal = rotateVector(i_rotation, i_normal.xyz);
normal = (u_view_matrix * vec4(world_normal, 0.0)).xyz; normal = (u_view_matrix * vec4(world_normal, 0.0)).xyz;
uv = i_uv; uv = i_uv;

View File

@ -5,13 +5,7 @@ layout(location = 0) in vec3 i_position;
layout(location = 2) in vec4 i_color; layout(location = 2) in vec4 i_color;
layout(location = 3) in vec2 i_uv; layout(location = 3) in vec2 i_uv;
layout(location = 8) in vec3 i_origin; layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation; layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale; layout(location = 10) in vec4 i_scale;
#stk_include "utils/get_world_location.vert" #stk_include "utils/get_world_location.vert"
@ -20,17 +14,10 @@ out vec2 uv;
void main() void main()
{ {
#if defined(Converts_10bit_Vector)
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
vec3 test = sin(wind_direction * (i_position.y * 0.1)); vec3 test = sin(wind_direction * (i_position.y * 0.1));
test += cos(wind_direction) * 0.7; test += cos(wind_direction) * 0.7;
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w));
vec4 world_position = getWorldPosition(i_origin + test * i_color.r, vec4 world_position = getWorldPosition(i_origin + test * i_color.r,
quaternion, i_scale.xyz, i_position); i_rotation, i_scale.xyz, i_position);
uv = i_uv; uv = i_uv;
gl_Position = u_shadow_projection_view_matrices[layer] * world_position; gl_Position = u_shadow_projection_view_matrices[layer] * world_position;

View File

@ -17,13 +17,7 @@ layout(location = 5) in vec4 i_tangent;
layout(location = 6) in ivec4 i_joint; layout(location = 6) in ivec4 i_joint;
layout(location = 7) in vec4 i_weight; layout(location = 7) in vec4 i_weight;
layout(location = 8) in vec3 i_origin; layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation; layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale; layout(location = 10) in vec4 i_scale;
layout(location = 12) in ivec2 i_misc_data; layout(location = 12) in ivec2 i_misc_data;
@ -39,7 +33,6 @@ void main()
#if defined(Converts_10bit_Vector) #if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_orig); vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_tangent = convert10BitVector(i_tangent_orig); vec4 i_tangent = convert10BitVector(i_tangent_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif #endif
vec4 idle_position = vec4(i_position, 1.0); vec4 idle_position = vec4(i_position, 1.0);
@ -104,12 +97,11 @@ void main()
skinned_position = mix(skinned_position, idle_position, step_mix); skinned_position = mix(skinned_position, idle_position, step_mix);
skinned_normal = mix(skinned_normal, idle_normal, step_mix); skinned_normal = mix(skinned_normal, idle_normal, step_mix);
skinned_tangent = mix(skinned_tangent, idle_tangent, step_mix); skinned_tangent = mix(skinned_tangent, idle_tangent, step_mix);
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w));
gl_Position = getWorldPosition(i_origin, quaternion, i_scale.xyz, gl_Position = getWorldPosition(i_origin, i_rotation, i_scale.xyz,
skinned_position.xyz); skinned_position.xyz);
o_normal = normalize(rotateVector(quaternion, skinned_normal.xyz)); o_normal = normalize(rotateVector(i_rotation, skinned_normal.xyz));
o_tangent = normalize(rotateVector(quaternion, skinned_tangent.xyz)); o_tangent = normalize(rotateVector(i_rotation, skinned_tangent.xyz));
o_bitangent = cross(o_normal, o_tangent) * i_tangent.w; o_bitangent = cross(o_normal, o_tangent) * i_tangent.w;
} }

View File

@ -17,13 +17,7 @@ layout(location = 5) in vec4 i_tangent;
#endif #endif
layout(location = 8) in vec3 i_origin; layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation; layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale; layout(location = 10) in vec4 i_scale;
layout(location = 11) in vec2 i_texture_trans; layout(location = 11) in vec2 i_texture_trans;
layout(location = 12) in ivec2 i_misc_data; layout(location = 12) in ivec2 i_misc_data;
@ -47,14 +41,12 @@ void main()
#if defined(Converts_10bit_Vector) #if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_orig); vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_tangent = convert10BitVector(i_tangent_orig); vec4 i_tangent = convert10BitVector(i_tangent_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif #endif
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w)); vec4 v_world_position = getWorldPosition(i_origin, i_rotation, i_scale.xyz,
vec4 v_world_position = getWorldPosition(i_origin, quaternion, i_scale.xyz,
i_position); i_position);
vec3 v_world_normal = rotateVector(quaternion, i_normal.xyz); vec3 v_world_normal = rotateVector(i_rotation, i_normal.xyz);
vec3 world_tangent = rotateVector(quaternion, i_tangent.xyz); vec3 world_tangent = rotateVector(i_rotation, i_tangent.xyz);
tangent = (u_view_matrix * vec4(world_tangent, 0.0)).xyz; tangent = (u_view_matrix * vec4(world_tangent, 0.0)).xyz;
bitangent = (u_view_matrix * bitangent = (u_view_matrix *

View File

@ -3,13 +3,7 @@ uniform int layer;
layout(location = 0) in vec3 i_position; layout(location = 0) in vec3 i_position;
layout(location = 3) in vec2 i_uv; layout(location = 3) in vec2 i_uv;
layout(location = 8) in vec3 i_origin; layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation; layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale; layout(location = 10) in vec4 i_scale;
#stk_include "utils/get_world_location.vert" #stk_include "utils/get_world_location.vert"
@ -18,13 +12,7 @@ out vec2 uv;
void main() void main()
{ {
vec4 world_position = getWorldPosition(i_origin, i_rotation, i_scale.xyz,
#if defined(Converts_10bit_Vector)
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w));
vec4 world_position = getWorldPosition(i_origin, quaternion, i_scale.xyz,
i_position); i_position);
uv = i_uv; uv = i_uv;
gl_Position = u_shadow_projection_view_matrices[layer] * world_position; gl_Position = u_shadow_projection_view_matrices[layer] * world_position;

View File

@ -24,13 +24,7 @@ layout(location = 5) in vec4 i_tangent;
layout(location = 6) in ivec4 i_joint; layout(location = 6) in ivec4 i_joint;
layout(location = 7) in vec4 i_weight; layout(location = 7) in vec4 i_weight;
layout(location = 8) in vec3 i_origin; layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation; layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale; layout(location = 10) in vec4 i_scale;
layout(location = 11) in vec2 i_texture_trans; layout(location = 11) in vec2 i_texture_trans;
layout(location = 12) in ivec2 i_misc_data; layout(location = 12) in ivec2 i_misc_data;
@ -52,7 +46,6 @@ void main()
#if defined(Converts_10bit_Vector) #if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_orig); vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_tangent = convert10BitVector(i_tangent_orig); vec4 i_tangent = convert10BitVector(i_tangent_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif #endif
vec4 idle_position = vec4(i_position, 1.0); vec4 idle_position = vec4(i_position, 1.0);
@ -113,11 +106,10 @@ void main()
skinned_normal = joint_matrix * idle_normal; skinned_normal = joint_matrix * idle_normal;
skinned_tangent = joint_matrix * idle_tangent; skinned_tangent = joint_matrix * idle_tangent;
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w)); vec4 world_position = getWorldPosition(i_origin, i_rotation, i_scale.xyz,
vec4 world_position = getWorldPosition(i_origin, quaternion, i_scale.xyz,
skinned_position.xyz); skinned_position.xyz);
vec3 world_normal = rotateVector(quaternion, skinned_normal.xyz); vec3 world_normal = rotateVector(i_rotation, skinned_normal.xyz);
vec3 world_tangent = rotateVector(quaternion, skinned_tangent.xyz); vec3 world_tangent = rotateVector(i_rotation, skinned_tangent.xyz);
tangent = (u_view_matrix * vec4(world_tangent, 0.0)).xyz; tangent = (u_view_matrix * vec4(world_tangent, 0.0)).xyz;
bitangent = (u_view_matrix * bitangent = (u_view_matrix *

View File

@ -11,13 +11,7 @@ layout(location = 3) in vec2 i_uv;
layout(location = 6) in ivec4 i_joint; layout(location = 6) in ivec4 i_joint;
layout(location = 7) in vec4 i_weight; layout(location = 7) in vec4 i_weight;
layout(location = 8) in vec3 i_origin; layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation; layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale; layout(location = 10) in vec4 i_scale;
layout(location = 12) in ivec2 i_misc_data; layout(location = 12) in ivec2 i_misc_data;
@ -27,11 +21,6 @@ out vec2 uv;
void main() void main()
{ {
#if defined(Converts_10bit_Vector)
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
vec4 idle_position = vec4(i_position, 1.0); vec4 idle_position = vec4(i_position, 1.0);
vec4 skinned_position = vec4(0.0); vec4 skinned_position = vec4(0.0);
int skinning_offset = i_misc_data.x; int skinning_offset = i_misc_data.x;
@ -83,9 +72,7 @@ void main()
#endif #endif
skinned_position = joint_matrix * idle_position; skinned_position = joint_matrix * idle_position;
vec4 world_position = getWorldPosition(i_origin, i_rotation, i_scale.xyz,
vec4 quaternion = normalize(vec4(i_rotation.xyz, i_scale.w));
vec4 world_position = getWorldPosition(i_origin, quaternion, i_scale.xyz,
skinned_position.xyz); skinned_position.xyz);
uv = i_uv; uv = i_uv;
gl_Position = u_shadow_projection_view_matrices[layer] * world_position; gl_Position = u_shadow_projection_view_matrices[layer] * world_position;

View File

@ -31,13 +31,13 @@ namespace SP
class SPInstancedData class SPInstancedData
{ {
private: private:
char m_data[32]; char m_data[44];
public: public:
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
SPInstancedData() SPInstancedData()
{ {
memset(m_data, 0, 32); memset(m_data, 0, 44);
} }
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
SPInstancedData(const core::matrix4& model_mat, SPInstancedData(const core::matrix4& model_mat,
@ -65,21 +65,19 @@ public:
rotation.W = -rotation.W; rotation.W = -rotation.W;
} }
memcpy(m_data, position, 12); memcpy(m_data, position, 12);
uint32_t _2101010 = normalizedSignedFloatsTo1010102( memcpy(m_data + 12, &rotation, 16);
{{ rotation.X, rotation.Y, rotation.Z, 0.0f }});
memcpy(m_data + 12, &_2101010, 4);
short s[4] = { toFloat16(scale.X), toFloat16(scale.Y), short s[4] = { toFloat16(scale.X), toFloat16(scale.Y),
toFloat16(scale.Z), toFloat16(rotation.W) }; toFloat16(scale.Z), 0 };
memcpy(m_data + 16, s, 8); memcpy(m_data + 28, s, 8);
short tm[2] = short tm[2] =
{ {
short(texture_trans_x * 32767.0f), short(texture_trans_x * 32767.0f),
short(texture_trans_y * 32767.0f) short(texture_trans_y * 32767.0f)
}; };
memcpy(m_data + 24, tm, 4); memcpy(m_data + 36, tm, 4);
memcpy(m_data + 28, &skinning_offset, 2); memcpy(m_data + 40, &skinning_offset, 2);
short hue_packed = short(core::clamp(int(hue * 100.0f), 0, 100)); short hue_packed = short(core::clamp(int(hue * 100.0f), 0, 100));
memcpy(m_data + 30, &hue_packed, 2); memcpy(m_data + 42, &hue_packed, 2);
} }
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
const void* getData() const { return m_data; } const void* getData() const { return m_data; }

View File

@ -247,16 +247,16 @@ void SPMeshBuffer::recreateVAO(unsigned i)
#ifndef USE_GLES2 #ifndef USE_GLES2
if (CVS->isARBBufferStorageUsable()) if (CVS->isARBBufferStorageUsable())
{ {
glBufferStorage(GL_ARRAY_BUFFER, m_gl_instance_size[i] * 32, NULL, glBufferStorage(GL_ARRAY_BUFFER, m_gl_instance_size[i] * 44, NULL,
GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT);
m_ins_dat_mapped_ptr[i] = glMapBufferRange(GL_ARRAY_BUFFER, 0, m_ins_dat_mapped_ptr[i] = glMapBufferRange(GL_ARRAY_BUFFER, 0,
m_gl_instance_size[i] * 32, m_gl_instance_size[i] * 44,
GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT);
} }
else else
#endif #endif
{ {
glBufferData(GL_ARRAY_BUFFER, m_gl_instance_size[i] * 32, NULL, glBufferData(GL_ARRAY_BUFFER, m_gl_instance_size[i] * 44, NULL,
GL_DYNAMIC_DRAW); GL_DYNAMIC_DRAW);
} }
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
@ -346,26 +346,23 @@ void SPMeshBuffer::recreateVAO(unsigned i)
glBindBuffer(GL_ARRAY_BUFFER, m_ins_array[i]); glBindBuffer(GL_ARRAY_BUFFER, m_ins_array[i]);
// Origin // Origin
glEnableVertexAttribArray(8); glEnableVertexAttribArray(8);
glVertexAttribPointer(8, 3, GL_FLOAT, GL_FALSE, 32, (void*)0); glVertexAttribPointer(8, 3, GL_FLOAT, GL_FALSE, 44, (void*)0);
glVertexAttribDivisorARB(8, 1); glVertexAttribDivisorARB(8, 1);
// Rotation (quaternion .xyz) // Rotation (quaternion in 4 32bit floats)
glEnableVertexAttribArray(9); glEnableVertexAttribArray(9);
glVertexAttribPointer(9, 4, GL_INT_2_10_10_10_REV, glVertexAttribPointer(9, 4, GL_FLOAT, GL_FALSE, 44, (void*)12);
GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_CORRECT_10BIT_NORMALIZATION) ? GL_FALSE : GL_TRUE, 32,
(void*)12);
glVertexAttribDivisorARB(9, 1); glVertexAttribDivisorARB(9, 1);
// Scale (3 half floats and .w for quaternion .w) // Scale (3 half floats and .w unused)
glEnableVertexAttribArray(10); glEnableVertexAttribArray(10);
glVertexAttribPointer(10, 4, GL_HALF_FLOAT, GL_FALSE, 32, (void*)16); glVertexAttribPointer(10, 4, GL_HALF_FLOAT, GL_FALSE, 44, (void*)28);
glVertexAttribDivisorARB(10, 1); glVertexAttribDivisorARB(10, 1);
// Texture translation // Texture translation
glEnableVertexAttribArray(11); glEnableVertexAttribArray(11);
glVertexAttribPointer(11, 2, GL_SHORT, GL_TRUE, 32, (void*)24); glVertexAttribPointer(11, 2, GL_SHORT, GL_TRUE, 44, (void*)36);
glVertexAttribDivisorARB(11, 1); glVertexAttribDivisorARB(11, 1);
// Misc data (skinning offset and hue change) // Misc data (skinning offset and hue change)
glEnableVertexAttribArray(12); glEnableVertexAttribArray(12);
glVertexAttribIPointer(12, 2, GL_SHORT, 32, (void*)28); glVertexAttribIPointer(12, 2, GL_SHORT, 44, (void*)40);
glVertexAttribDivisorARB(12, 1); glVertexAttribDivisorARB(12, 1);
glBindVertexArray(0); glBindVertexArray(0);
@ -400,15 +397,15 @@ void SPMeshBuffer::uploadInstanceData()
if (CVS->isARBBufferStorageUsable()) if (CVS->isARBBufferStorageUsable())
{ {
memcpy(m_ins_dat_mapped_ptr[i], m_ins_dat[i].data(), memcpy(m_ins_dat_mapped_ptr[i], m_ins_dat[i].data(),
m_ins_dat[i].size() * 32); m_ins_dat[i].size() * 44);
} }
else else
{ {
glBindBuffer(GL_ARRAY_BUFFER, m_ins_array[i]); glBindBuffer(GL_ARRAY_BUFFER, m_ins_array[i]);
void* ptr = glMapBufferRange(GL_ARRAY_BUFFER, 0, void* ptr = glMapBufferRange(GL_ARRAY_BUFFER, 0,
m_ins_dat[i].size() * 32, GL_MAP_WRITE_BIT | m_ins_dat[i].size() * 44, GL_MAP_WRITE_BIT |
GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
memcpy(ptr, m_ins_dat[i].data(), m_ins_dat[i].size() * 32); memcpy(ptr, m_ins_dat[i].data(), m_ins_dat[i].size() * 44);
glUnmapBuffer(GL_ARRAY_BUFFER); glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
} }