|
|
@@ -53,7 +53,6 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
|
|
|
_color_attrib_index = -1;
|
|
|
_transform_table_index = -1;
|
|
|
_slider_table_index = -1;
|
|
|
- _frame_number_loc = -1;
|
|
|
_frame_number = -1;
|
|
|
_validated = !gl_validate_shaders;
|
|
|
|
|
|
@@ -180,32 +179,6 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
|
|
|
++it;
|
|
|
}
|
|
|
|
|
|
- for (auto it = s->_ptr_spec.begin(); it != s->_ptr_spec.end();) {
|
|
|
- const Shader::ShaderPtrSpec &spec = *it;
|
|
|
-
|
|
|
- GLint location = get_uniform_location(spec._id._location);
|
|
|
- if (location < 0) {
|
|
|
- // Not used. Optimize it out.
|
|
|
- if (GLCAT.is_debug()) {
|
|
|
- GLCAT.debug()
|
|
|
- << "Uniform " << *spec._id._name << " is unused, unbinding\n";
|
|
|
- }
|
|
|
- it = s->_ptr_spec.erase(it);
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- if (GLCAT.is_debug()) {
|
|
|
- GLCAT.debug()
|
|
|
- << "Uniform " << *spec._id._name << " is bound to location "
|
|
|
- << location << "\n";
|
|
|
- }
|
|
|
- ++it;
|
|
|
- }
|
|
|
-
|
|
|
- if (s->_frame_number_loc >= 0) {
|
|
|
- _frame_number_loc = get_uniform_location(s->_frame_number_loc);
|
|
|
- }
|
|
|
-
|
|
|
// Do we have a p3d_Color attribute?
|
|
|
for (auto it = s->_var_spec.begin(); it != s->_var_spec.end(); ++it) {
|
|
|
Shader::ShaderVarSpec &spec = *it;
|
|
|
@@ -240,32 +213,7 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext
|
|
|
}
|
|
|
|
|
|
_mat_part_cache = new LVecBase4[_shader->cp_get_mat_cache_size()];
|
|
|
-
|
|
|
- // Determine the size of the scratch space to allocate on the stack inside
|
|
|
- // issue_parameters().
|
|
|
- for (const Shader::ShaderPtrSpec &spec : _shader->_ptr_spec) {
|
|
|
- size_t size = spec._dim[0] * spec._dim[1] * spec._dim[2];
|
|
|
- if (spec._type == ShaderType::ST_double) {
|
|
|
- size *= 8;
|
|
|
- } else {
|
|
|
- size *= 4;
|
|
|
- }
|
|
|
- if (size > _scratch_space_size) {
|
|
|
- _scratch_space_size = size;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (const Shader::ShaderMatSpec &spec : _shader->_mat_spec) {
|
|
|
- size_t size = spec._array_count * spec._size;
|
|
|
- if (spec._scalar_type == ShaderType::ST_double) {
|
|
|
- size *= 8;
|
|
|
- } else {
|
|
|
- size *= 4;
|
|
|
- }
|
|
|
- if (size > _scratch_space_size) {
|
|
|
- _scratch_space_size = size;
|
|
|
- }
|
|
|
- }
|
|
|
+ _mat_scratch_space = new LVecBase4[_shader->cp_get_mat_scratch_size(false)];
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -371,7 +319,6 @@ reflect_program() {
|
|
|
param_count = 0;
|
|
|
_glgsg->_glGetProgramiv(_glsl_program, GL_ACTIVE_UNIFORMS, ¶m_count);
|
|
|
|
|
|
- _shader->_ptr_spec.clear();
|
|
|
_shader->_mat_spec.clear();
|
|
|
_shader->_tex_spec.clear();
|
|
|
for (int i = 0; i < param_count; ++i) {
|
|
|
@@ -853,10 +800,11 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
}
|
|
|
|
|
|
bind._func = Shader::SMF_first;
|
|
|
- bind._part[0] = Shader::SMO_apiview_to_apiclip_light_source_i;
|
|
|
+ bind._part[0] = Shader::SMO_light_source_i;
|
|
|
bind._arg[0] = nullptr;
|
|
|
bind._part[1] = Shader::SMO_identity;
|
|
|
bind._arg[1] = nullptr;
|
|
|
+ bind._offset = 4 * Shader::LA_shadow_view_matrix;
|
|
|
}
|
|
|
else if (strncmp(name_buffer, "shadowMatrix", 127) == 0) {
|
|
|
// Only supported for backward compatibility: includes the model
|
|
|
@@ -967,7 +915,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.baseColor should be vec4\n";
|
|
|
}
|
|
|
- bind._part[0] = Shader::SMO_attr_material2;
|
|
|
+ bind._offset = 4 * Shader::MA_base_color;
|
|
|
bind._piece = Shader::SMP_vec4;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
@@ -977,6 +925,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.ambient should be vec4\n";
|
|
|
}
|
|
|
+ bind._offset = 4 * Shader::MA_ambient;
|
|
|
bind._piece = Shader::SMP_vec4;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
@@ -986,8 +935,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.diffuse should be vec4\n";
|
|
|
}
|
|
|
+ bind._offset = 4 * Shader::MA_diffuse;
|
|
|
bind._piece = Shader::SMP_vec4;
|
|
|
- bind._offset = 4;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
@@ -996,8 +945,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.emission should be vec4\n";
|
|
|
}
|
|
|
+ bind._offset = 4 * Shader::MA_emission;
|
|
|
bind._piece = Shader::SMP_vec4;
|
|
|
- bind._offset = 8;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1006,8 +955,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.specular should be vec3\n";
|
|
|
}
|
|
|
+ bind._offset = 4 * Shader::MA_specular;
|
|
|
bind._piece = Shader::SMP_vec3;
|
|
|
- bind._offset = 12;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1016,8 +965,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.shininess should be float\n";
|
|
|
}
|
|
|
+ bind._offset = 4 * Shader::MA_specular + 3;
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
- bind._offset = 15;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1026,9 +975,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.roughness should be float\n";
|
|
|
}
|
|
|
- bind._part[0] = Shader::SMO_attr_material2;
|
|
|
+ bind._offset = 4 * Shader::MA_metallic_ior_roughness + 3;
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
- bind._offset = 7;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1037,9 +985,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.metallic should be bool or float\n";
|
|
|
}
|
|
|
- bind._part[0] = Shader::SMO_attr_material2;
|
|
|
+ bind._offset = 4 * Shader::MA_metallic_ior_roughness;
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
- bind._offset = 4;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1048,9 +995,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Material.refractiveIndex should be float\n";
|
|
|
}
|
|
|
- bind._part[0] = Shader::SMO_attr_material2;
|
|
|
+ bind._offset = 4 * Shader::MA_metallic_ior_roughness + 1;
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
- bind._offset = 5;
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1124,7 +1070,8 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
bind._arg[1] = nullptr;
|
|
|
|
|
|
if (noprefix == "Fog.color") {
|
|
|
- bind._part[0] = Shader::SMO_attr_fogcolor;
|
|
|
+ bind._part[0] = Shader::SMO_attr_fog;
|
|
|
+ bind._offset = 4 * Shader::FA_color;
|
|
|
|
|
|
if (param_type == GL_FLOAT_VEC3) {
|
|
|
bind._piece = Shader::SMP_vec3;
|
|
|
@@ -1138,6 +1085,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
}
|
|
|
else if (noprefix == "Fog.density") {
|
|
|
bind._part[0] = Shader::SMO_attr_fog;
|
|
|
+ bind._offset = 4 * Shader::FA_params;
|
|
|
|
|
|
if (param_type == GL_FLOAT) {
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
@@ -1149,10 +1097,10 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
}
|
|
|
else if (noprefix == "Fog.start") {
|
|
|
bind._part[0] = Shader::SMO_attr_fog;
|
|
|
+ bind._offset = 4 * Shader::FA_params + 1;
|
|
|
|
|
|
if (param_type == GL_FLOAT) {
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
- bind._offset = 1;
|
|
|
} else {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Fog.start should be float\n";
|
|
|
@@ -1161,10 +1109,10 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
}
|
|
|
else if (noprefix == "Fog.end") {
|
|
|
bind._part[0] = Shader::SMO_attr_fog;
|
|
|
+ bind._offset = 4 * Shader::FA_params + 2;
|
|
|
|
|
|
if (param_type == GL_FLOAT) {
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
- bind._offset = 2;
|
|
|
} else {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Fog.end should be float\n";
|
|
|
@@ -1173,10 +1121,10 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
}
|
|
|
else if (noprefix == "Fog.scale") {
|
|
|
bind._part[0] = Shader::SMO_attr_fog;
|
|
|
+ bind._offset = 4 * Shader::FA_params + 3;
|
|
|
|
|
|
if (param_type == GL_FLOAT) {
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
- bind._offset = 3;
|
|
|
} else {
|
|
|
GLCAT.error()
|
|
|
<< "p3d_Fog.scale should be float\n";
|
|
|
@@ -1243,11 +1191,78 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
bind._id = param;
|
|
|
bind._func = Shader::SMF_first;
|
|
|
bind._index = index;
|
|
|
- bind._part[0] = Shader::SMO_light_source_i_vec_attrib;
|
|
|
- bind._arg[0] = InternalName::make(member_name);
|
|
|
+ bind._part[0] = Shader::SMO_light_source_i;
|
|
|
+ bind._arg[0] = nullptr;
|
|
|
bind._part[1] = Shader::SMO_identity;
|
|
|
bind._arg[1] = nullptr;
|
|
|
|
|
|
+ GLenum expected = GL_FLOAT_VEC4;
|
|
|
+ if (member_name == "color") {
|
|
|
+ bind._offset = 4 * Shader::LA_color;
|
|
|
+ }
|
|
|
+ else if (member_name == "specular") {
|
|
|
+ bind._offset = 4 * Shader::LA_specular;
|
|
|
+ }
|
|
|
+ else if (member_name == "ambient") {
|
|
|
+ bind._offset = 4 * Shader::LA_ambient;
|
|
|
+ }
|
|
|
+ else if (member_name == "diffuse") {
|
|
|
+ bind._offset = 4 * Shader::LA_diffuse;
|
|
|
+ }
|
|
|
+ else if (member_name == "position") {
|
|
|
+ bind._offset = 4 * Shader::LA_position;
|
|
|
+ }
|
|
|
+ else if (member_name == "halfVector") {
|
|
|
+ bind._offset = 4 * Shader::LA_half_vector;
|
|
|
+ }
|
|
|
+ else if (member_name == "spotDirection") {
|
|
|
+ bind._offset = 4 * Shader::LA_spot_direction;
|
|
|
+ }
|
|
|
+ else if (member_name == "spotCosCutoff") {
|
|
|
+ bind._offset = 4 * Shader::LA_spot_params;
|
|
|
+ expected = GL_FLOAT;
|
|
|
+ }
|
|
|
+ else if (member_name == "spotCutoff") {
|
|
|
+ bind._offset = 4 * Shader::LA_spot_params + 1;
|
|
|
+ expected = GL_FLOAT;
|
|
|
+ }
|
|
|
+ else if (member_name == "spotExponent") {
|
|
|
+ bind._offset = 4 * Shader::LA_spot_params + 2;
|
|
|
+ expected = GL_FLOAT;
|
|
|
+ }
|
|
|
+ else if (member_name == "attenuation") {
|
|
|
+ bind._offset = 4 * Shader::LA_attenuation;
|
|
|
+ expected = GL_FLOAT_VEC3;
|
|
|
+ }
|
|
|
+ else if (member_name == "constantAttenuation") {
|
|
|
+ bind._offset = 4 * Shader::LA_attenuation;
|
|
|
+ expected = GL_FLOAT;
|
|
|
+ }
|
|
|
+ else if (member_name == "linearAttenuation") {
|
|
|
+ bind._offset = 4 * Shader::LA_attenuation + 1;
|
|
|
+ expected = GL_FLOAT;
|
|
|
+ }
|
|
|
+ else if (member_name == "quadraticAttenuation") {
|
|
|
+ bind._offset = 4 * Shader::LA_attenuation + 2;
|
|
|
+ expected = GL_FLOAT;
|
|
|
+ }
|
|
|
+ else if (member_name == "radius") {
|
|
|
+ bind._offset = 4 * Shader::LA_attenuation + 3;
|
|
|
+ expected = GL_FLOAT;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ GLCAT.error()
|
|
|
+ << "Invalid light struct member " << member_name << "\n";
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // It's okay to declare as vec3 if we allow vec4.
|
|
|
+ if (param_type != expected && (expected != GL_FLOAT_VEC4 || param_type != GL_FLOAT_VEC3)) {
|
|
|
+ GLCAT.error()
|
|
|
+ << "p3d_LightSource[]." << member_name << " has unexpected type\n";
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
switch (param_type) {
|
|
|
case GL_FLOAT:
|
|
|
bind._piece = Shader::SMP_scalar;
|
|
|
@@ -1266,8 +1281,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- GLCAT.error()
|
|
|
- << "p3d_LightSource[]." << member_name << " should be float or vec\n";
|
|
|
+ assert(false);
|
|
|
return;
|
|
|
}
|
|
|
_shader->cp_add_mat_spec(bind);
|
|
|
@@ -1354,12 +1368,15 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
return;
|
|
|
}
|
|
|
else if (noprefix == "FrameNumber") {
|
|
|
- // We don't currently support ints with this mechanism, so we special-
|
|
|
- // case this one.
|
|
|
+ bind._piece = Shader::SMP_scalar;
|
|
|
+ bind._func = Shader::SMF_first;
|
|
|
+ bind._part[0] = Shader::SMO_frame_number;
|
|
|
+ bind._part[1] = Shader::SMO_identity;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
if (param_type != GL_INT) {
|
|
|
GLCAT.error() << "osg_FrameNumber should be uniform int\n";
|
|
|
} else {
|
|
|
- _frame_number_loc = p;
|
|
|
+ _shader->cp_add_mat_spec(bind);
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
@@ -1519,64 +1536,115 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
case GL_UNSIGNED_INT_VEC2:
|
|
|
case GL_UNSIGNED_INT_VEC3:
|
|
|
case GL_UNSIGNED_INT_VEC4: {
|
|
|
- Shader::ShaderPtrSpec bind;
|
|
|
+ Shader::ShaderMatSpec bind;
|
|
|
bind._id = param;
|
|
|
- bind._dim[0] = 1;
|
|
|
- bind._dim[1] = 1;
|
|
|
+ bind._func = Shader::SMF_shader_input_ptr;
|
|
|
switch (param_type) {
|
|
|
case GL_BOOL:
|
|
|
- case GL_INT:
|
|
|
- case GL_UNSIGNED_INT:
|
|
|
- case GL_FLOAT: bind._dim[2] = 1; break;
|
|
|
- case GL_BOOL_VEC2:
|
|
|
- case GL_INT_VEC2:
|
|
|
- case GL_UNSIGNED_INT_VEC2:
|
|
|
- case GL_FLOAT_VEC2: bind._dim[2] = 2; break;
|
|
|
- case GL_BOOL_VEC3:
|
|
|
- case GL_INT_VEC3:
|
|
|
- case GL_UNSIGNED_INT_VEC3:
|
|
|
- case GL_FLOAT_VEC3: bind._dim[2] = 3; break;
|
|
|
- case GL_BOOL_VEC4:
|
|
|
- case GL_INT_VEC4:
|
|
|
- case GL_UNSIGNED_INT_VEC4:
|
|
|
- case GL_FLOAT_VEC4: bind._dim[2] = 4; break;
|
|
|
- case GL_FLOAT_MAT3:
|
|
|
- bind._dim[1] = 3;
|
|
|
- bind._dim[2] = 3;
|
|
|
- break;
|
|
|
- case GL_FLOAT_MAT4:
|
|
|
- bind._dim[1] = 4;
|
|
|
- bind._dim[2] = 4;
|
|
|
+ bind._piece = Shader::SMP_scalar;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
break;
|
|
|
- }
|
|
|
- switch (param_type) {
|
|
|
- case GL_BOOL:
|
|
|
case GL_BOOL_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
+ break;
|
|
|
case GL_BOOL_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
+ break;
|
|
|
case GL_BOOL_VEC4:
|
|
|
+ bind._piece = Shader::SMP_vec4;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT:
|
|
|
+ bind._piece = Shader::SMP_scalar;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT_VEC4:
|
|
|
- bind._type = ShaderType::ST_uint;
|
|
|
+ bind._piece = Shader::SMP_vec4;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
break;
|
|
|
case GL_INT:
|
|
|
+ bind._piece = Shader::SMP_scalar;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
+ break;
|
|
|
case GL_INT_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
+ break;
|
|
|
case GL_INT_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
+ break;
|
|
|
case GL_INT_VEC4:
|
|
|
- bind._type = ShaderType::ST_int;
|
|
|
+ bind._piece = Shader::SMP_vec4;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
break;
|
|
|
case GL_FLOAT:
|
|
|
+ bind._piece = Shader::SMP_scalar;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_VEC4:
|
|
|
+ bind._piece = Shader::SMP_vec4;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_MAT3:
|
|
|
+ bind._piece = Shader::SMP_mat3_whole;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_MAT4:
|
|
|
- bind._type = ShaderType::ST_float;
|
|
|
+ bind._piece = Shader::SMP_mat4_whole;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
break;
|
|
|
+#ifndef OPENGLES
|
|
|
+ case GL_DOUBLE:
|
|
|
+ bind._piece = Shader::SMP_scalar;
|
|
|
+ bind._scalar_type = ShaderType::ST_double;
|
|
|
+ break;
|
|
|
+ case GL_DOUBLE_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2;
|
|
|
+ bind._scalar_type = ShaderType::ST_double;
|
|
|
+ break;
|
|
|
+ case GL_DOUBLE_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3;
|
|
|
+ bind._scalar_type = ShaderType::ST_double;
|
|
|
+ break;
|
|
|
+ case GL_DOUBLE_VEC4:
|
|
|
+ bind._piece = Shader::SMP_vec4;
|
|
|
+ bind._scalar_type = ShaderType::ST_double;
|
|
|
+ break;
|
|
|
+ case GL_DOUBLE_MAT3:
|
|
|
+ bind._piece = Shader::SMP_mat3_whole;
|
|
|
+ bind._scalar_type = ShaderType::ST_double;
|
|
|
+ break;
|
|
|
+ case GL_DOUBLE_MAT4:
|
|
|
+ bind._piece = Shader::SMP_mat4_whole;
|
|
|
+ bind._scalar_type = ShaderType::ST_double;
|
|
|
+ break;
|
|
|
+#endif
|
|
|
}
|
|
|
- bind._arg = param._name;
|
|
|
- _shader->_ptr_spec.push_back(bind);
|
|
|
+ bind._part[0] = Shader::SMO_INVALID;
|
|
|
+ bind._part[1] = Shader::SMO_INVALID;
|
|
|
+ bind._arg[0] = param._name;
|
|
|
+ bind._arg[1] = nullptr;
|
|
|
+ bind._array_count = 1;
|
|
|
+ _shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
#ifndef OPENGLES
|
|
|
@@ -1668,64 +1736,89 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) {
|
|
|
case GL_FLOAT_VEC4:
|
|
|
case GL_FLOAT_MAT3:
|
|
|
case GL_FLOAT_MAT4: {
|
|
|
- Shader::ShaderPtrSpec bind;
|
|
|
+ Shader::ShaderMatSpec bind;
|
|
|
bind._id = param;
|
|
|
- bind._dim[0] = param_size;
|
|
|
- bind._dim[1] = 1;
|
|
|
- switch (param_type) {
|
|
|
- case GL_BOOL:
|
|
|
- case GL_INT:
|
|
|
- case GL_UNSIGNED_INT:
|
|
|
- case GL_FLOAT: bind._dim[2] = 1; break;
|
|
|
- case GL_BOOL_VEC2:
|
|
|
- case GL_INT_VEC2:
|
|
|
- case GL_UNSIGNED_INT_VEC2:
|
|
|
- case GL_FLOAT_VEC2: bind._dim[2] = 2; break;
|
|
|
- case GL_BOOL_VEC3:
|
|
|
- case GL_INT_VEC3:
|
|
|
- case GL_UNSIGNED_INT_VEC3:
|
|
|
- case GL_FLOAT_VEC3: bind._dim[2] = 3; break;
|
|
|
- case GL_BOOL_VEC4:
|
|
|
- case GL_INT_VEC4:
|
|
|
- case GL_UNSIGNED_INT_VEC4:
|
|
|
- case GL_FLOAT_VEC4: bind._dim[2] = 4; break;
|
|
|
- case GL_FLOAT_MAT3:
|
|
|
- bind._dim[1] = 3;
|
|
|
- bind._dim[2] = 3;
|
|
|
- break;
|
|
|
- case GL_FLOAT_MAT4:
|
|
|
- bind._dim[1] = 4;
|
|
|
- bind._dim[2] = 4;
|
|
|
- break;
|
|
|
- }
|
|
|
+ bind._func = Shader::SMF_shader_input_ptr;
|
|
|
switch (param_type) {
|
|
|
case GL_BOOL:
|
|
|
+ bind._piece = Shader::SMP_scalar_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
+ break;
|
|
|
case GL_BOOL_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
+ break;
|
|
|
case GL_BOOL_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
+ break;
|
|
|
case GL_BOOL_VEC4:
|
|
|
+ bind._piece = Shader::SMP_vec4_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_bool;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT:
|
|
|
+ bind._piece = Shader::SMP_scalar_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
+ break;
|
|
|
case GL_UNSIGNED_INT_VEC4:
|
|
|
- bind._type = ShaderType::ST_uint;
|
|
|
+ bind._piece = Shader::SMP_vec4_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_uint;
|
|
|
break;
|
|
|
case GL_INT:
|
|
|
+ bind._piece = Shader::SMP_scalar_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
+ break;
|
|
|
case GL_INT_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
+ break;
|
|
|
case GL_INT_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
+ break;
|
|
|
case GL_INT_VEC4:
|
|
|
- bind._type = ShaderType::ST_int;
|
|
|
+ bind._piece = Shader::SMP_vec4_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_int;
|
|
|
break;
|
|
|
case GL_FLOAT:
|
|
|
+ bind._piece = Shader::SMP_scalar_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_VEC2:
|
|
|
+ bind._piece = Shader::SMP_vec2_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_VEC3:
|
|
|
+ bind._piece = Shader::SMP_vec3_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_VEC4:
|
|
|
+ bind._piece = Shader::SMP_vec4_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_MAT3:
|
|
|
+ bind._piece = Shader::SMP_mat3_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
+ break;
|
|
|
case GL_FLOAT_MAT4:
|
|
|
- bind._type = ShaderType::ST_float;
|
|
|
+ bind._piece = Shader::SMP_mat4_array;
|
|
|
+ bind._scalar_type = ShaderType::ST_float;
|
|
|
break;
|
|
|
}
|
|
|
- bind._arg = param._name;
|
|
|
- _shader->_ptr_spec.push_back(bind);
|
|
|
+ bind._part[0] = Shader::SMO_INVALID;
|
|
|
+ bind._part[1] = Shader::SMO_INVALID;
|
|
|
+ bind._arg[0] = param._name;
|
|
|
+ bind._arg[1] = nullptr;
|
|
|
+ bind._array_count = param_size;
|
|
|
+ _shader->cp_add_mat_spec(bind);
|
|
|
return;
|
|
|
}
|
|
|
default:
|
|
|
@@ -2079,6 +2172,7 @@ CLP(ShaderContext)::
|
|
|
~CLP(ShaderContext)() {
|
|
|
// Don't call release_resources; we may not have an active context.
|
|
|
delete[] _mat_part_cache;
|
|
|
+ delete[] _mat_scratch_space;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -2270,201 +2364,17 @@ issue_parameters(int altered) {
|
|
|
<< " (altered 0x" << hex << altered << dec << ")\n";
|
|
|
}
|
|
|
|
|
|
- void *scratch = alloca(_scratch_space_size);
|
|
|
-
|
|
|
- // We have no way to track modifications to PTAs, so we assume that they are
|
|
|
- // modified every frame and when we switch ShaderAttribs.
|
|
|
- if (altered & (Shader::SSD_shaderinputs | Shader::SSD_frame)) {
|
|
|
-
|
|
|
- // If we have an osg_FrameNumber input, set it now.
|
|
|
- if ((altered & Shader::SSD_frame) != 0 && _frame_number_loc >= 0) {
|
|
|
- _glgsg->_glUniform1i(_frame_number_loc, _frame_number);
|
|
|
- }
|
|
|
-
|
|
|
- // Iterate through _ptr parameters
|
|
|
- for (int i = 0; i < (int)_shader->_ptr_spec.size(); ++i) {
|
|
|
- Shader::ShaderPtrSpec &spec = _shader->_ptr_spec[i];
|
|
|
-
|
|
|
- Shader::ShaderPtrData ptr_data;
|
|
|
- if (!_glgsg->fetch_ptr_parameter(spec, ptr_data)) { //the input is not contained in ShaderPtrData
|
|
|
- release_resources();
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- nassertd(spec._dim[1] > 0) continue;
|
|
|
-
|
|
|
- uint32_t dim = spec._dim[1] * spec._dim[2];
|
|
|
- GLint p = get_uniform_location(spec._id._location);
|
|
|
- if (p < 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- int array_size = min(spec._dim[0], (uint32_t)(ptr_data._size / dim));
|
|
|
- switch (spec._type) {
|
|
|
- case ShaderType::ST_bool:
|
|
|
- case ShaderType::ST_float:
|
|
|
- {
|
|
|
- float *data = (float *)scratch;
|
|
|
-
|
|
|
- switch (ptr_data._type) {
|
|
|
- case ShaderType::ST_int:
|
|
|
- // Convert int data to float data.
|
|
|
- for (int i = 0; i < (array_size * dim); ++i) {
|
|
|
- data[i] = (float)(((int*)ptr_data._ptr)[i]);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_uint:
|
|
|
- // Convert unsigned int data to float data.
|
|
|
- for (int i = 0; i < (array_size * dim); ++i) {
|
|
|
- data[i] = (float)(((unsigned int*)ptr_data._ptr)[i]);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_double:
|
|
|
- // Downgrade double data to float data.
|
|
|
- for (int i = 0; i < (array_size * dim); ++i) {
|
|
|
- data[i] = (float)(((double*)ptr_data._ptr)[i]);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_float:
|
|
|
- data = (float *)ptr_data._ptr;
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
-#ifndef NDEBUG
|
|
|
- GLCAT.error()
|
|
|
- << "Invalid ShaderPtrSpec type " << (int)ptr_data._type
|
|
|
- << " for shader input '" << spec._id._name << "'\n";
|
|
|
-#endif
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- switch (dim) {
|
|
|
- case 1: _glgsg->_glUniform1fv(p, array_size, (float*)data); continue;
|
|
|
- case 2: _glgsg->_glUniform2fv(p, array_size, (float*)data); continue;
|
|
|
- case 3: _glgsg->_glUniform3fv(p, array_size, (float*)data); continue;
|
|
|
- case 4: _glgsg->_glUniform4fv(p, array_size, (float*)data); continue;
|
|
|
- case 9: _glgsg->_glUniformMatrix3fv(p, array_size, GL_FALSE, (float*)data); continue;
|
|
|
- case 16: _glgsg->_glUniformMatrix4fv(p, array_size, GL_FALSE, (float*)data); continue;
|
|
|
- }
|
|
|
- nassertd(false) continue;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_int:
|
|
|
- if (ptr_data._type != ShaderType::ST_int &&
|
|
|
- ptr_data._type != ShaderType::ST_uint) {
|
|
|
- GLCAT.error()
|
|
|
- << "Cannot pass floating-point data to integer shader input '" << spec._id._name << "'\n";
|
|
|
-
|
|
|
- // Deactivate it to make sure the user doesn't get flooded with this
|
|
|
- // error.
|
|
|
- set_uniform_location(spec._id._location, -1);
|
|
|
-
|
|
|
- } else {
|
|
|
- switch (spec._dim[1] * spec._dim[2]) {
|
|
|
- case 1: _glgsg->_glUniform1iv(p, array_size, (int*)ptr_data._ptr); continue;
|
|
|
- case 2: _glgsg->_glUniform2iv(p, array_size, (int*)ptr_data._ptr); continue;
|
|
|
- case 3: _glgsg->_glUniform3iv(p, array_size, (int*)ptr_data._ptr); continue;
|
|
|
- case 4: _glgsg->_glUniform4iv(p, array_size, (int*)ptr_data._ptr); continue;
|
|
|
- }
|
|
|
- nassertd(false) continue;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_uint:
|
|
|
- if (ptr_data._type != ShaderType::ST_uint &&
|
|
|
- ptr_data._type != ShaderType::ST_int) {
|
|
|
- GLCAT.error()
|
|
|
- << "Cannot pass floating-point data to integer shader input '" << spec._id._name << "'\n";
|
|
|
-
|
|
|
- // Deactivate it to make sure the user doesn't get flooded with this
|
|
|
- // error.
|
|
|
- set_uniform_location(spec._id._location, -1);
|
|
|
-
|
|
|
- } else {
|
|
|
- switch (spec._dim[1] * spec._dim[2]) {
|
|
|
- case 1: _glgsg->_glUniform1uiv(p, array_size, (GLuint *)ptr_data._ptr); continue;
|
|
|
- case 2: _glgsg->_glUniform2uiv(p, array_size, (GLuint *)ptr_data._ptr); continue;
|
|
|
- case 3: _glgsg->_glUniform3uiv(p, array_size, (GLuint *)ptr_data._ptr); continue;
|
|
|
- case 4: _glgsg->_glUniform4uiv(p, array_size, (GLuint *)ptr_data._ptr); continue;
|
|
|
- }
|
|
|
- nassertd(false) continue;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_double:
|
|
|
-#ifdef OPENGLES
|
|
|
- GLCAT.error()
|
|
|
- << "Passing double-precision shader inputs to shaders is not supported in OpenGL ES.\n";
|
|
|
-
|
|
|
- // Deactivate it to make sure the user doesn't get flooded with this
|
|
|
- // error.
|
|
|
- set_uniform_location(spec._id._location, -1);
|
|
|
-#else
|
|
|
- {
|
|
|
- double *data = (double *)scratch;
|
|
|
-
|
|
|
- switch (ptr_data._type) {
|
|
|
- case ShaderType::ST_int:
|
|
|
- // Convert int data to double data.
|
|
|
- for (int i = 0; i < (array_size * dim); ++i) {
|
|
|
- data[i] = (double)(((int*)ptr_data._ptr)[i]);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_uint:
|
|
|
- // Convert unsigned int data to double data.
|
|
|
- for (int i = 0; i < (array_size * dim); ++i) {
|
|
|
- data[i] = (double)(((unsigned int*)ptr_data._ptr)[i]);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_double:
|
|
|
- data = (double *)ptr_data._ptr;
|
|
|
- break;
|
|
|
-
|
|
|
- case ShaderType::ST_float:
|
|
|
- // Upgrade float data to double data.
|
|
|
- for (int i = 0; i < (array_size * dim); ++i) {
|
|
|
- data[i] = (double)(((float*)ptr_data._ptr)[i]);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- nassertd(false) continue;
|
|
|
- }
|
|
|
-
|
|
|
- switch (dim) {
|
|
|
- case 1: _glgsg->_glUniform1dv(p, array_size, data); continue;
|
|
|
- case 2: _glgsg->_glUniform2dv(p, array_size, data); continue;
|
|
|
- case 3: _glgsg->_glUniform3dv(p, array_size, data); continue;
|
|
|
- case 4: _glgsg->_glUniform4dv(p, array_size, data); continue;
|
|
|
- case 9: _glgsg->_glUniformMatrix3dv(p, array_size, GL_FALSE, data); continue;
|
|
|
- case 16: _glgsg->_glUniformMatrix4dv(p, array_size, GL_FALSE, data); continue;
|
|
|
- }
|
|
|
- nassertd(false) continue;
|
|
|
- }
|
|
|
-#endif
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
if (altered & _shader->_mat_deps) {
|
|
|
- _glgsg->update_shader_matrix_cache(_shader, _mat_part_cache, altered);
|
|
|
+ if (altered & _shader->_mat_cache_deps) {
|
|
|
+ _glgsg->update_shader_matrix_cache(_shader, _mat_part_cache, altered);
|
|
|
+ }
|
|
|
|
|
|
for (Shader::ShaderMatSpec &spec : _shader->_mat_spec) {
|
|
|
if ((altered & spec._dep) == 0) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- const LVecBase4 *val = _glgsg->fetch_specified_value(spec, _mat_part_cache, altered);
|
|
|
+ const void *val = _glgsg->fetch_specified_value(spec, _mat_part_cache, _mat_scratch_space, false);
|
|
|
if (!val) continue;
|
|
|
|
|
|
GLint p = get_uniform_location(spec._id._location);
|
|
|
@@ -2473,24 +2383,19 @@ issue_parameters(int altered) {
|
|
|
}
|
|
|
|
|
|
if (spec._scalar_type == ShaderType::ST_float) {
|
|
|
-#ifdef STDFLOAT_DOUBLE
|
|
|
- float *data = (float *)scratch;
|
|
|
- const double *from_data = val->get_data();
|
|
|
- from_data += spec._offset;
|
|
|
- for (size_t i = 0; i < spec._size; ++i) {
|
|
|
- data[i] = (float)from_data[i];
|
|
|
- }
|
|
|
-#else
|
|
|
- const float *data = val->get_data();
|
|
|
- data += spec._offset;
|
|
|
-#endif
|
|
|
+ const float *data = (const float *)val;
|
|
|
|
|
|
switch (spec._piece) {
|
|
|
case Shader::SMP_scalar: _glgsg->_glUniform1fv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec2: _glgsg->_glUniform2fv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec3: _glgsg->_glUniform3fv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec4: _glgsg->_glUniform4fv(p, 1, data); continue;
|
|
|
+ case Shader::SMP_scalar_array: _glgsg->_glUniform1fv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec2_array: _glgsg->_glUniform2fv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec3_array: _glgsg->_glUniform3fv(p, spec._array_count, data); continue;
|
|
|
case Shader::SMP_vec4_array: _glgsg->_glUniform4fv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_mat3_whole: _glgsg->_glUniformMatrix3fv(p, 1, GL_FALSE, data); continue;
|
|
|
+ case Shader::SMP_mat3_array: _glgsg->_glUniformMatrix3fv(p, spec._array_count, GL_FALSE, data); continue;
|
|
|
case Shader::SMP_mat4_whole: _glgsg->_glUniformMatrix4fv(p, 1, GL_FALSE, data); continue;
|
|
|
case Shader::SMP_mat4_array: _glgsg->_glUniformMatrix4fv(p, spec._array_count, GL_FALSE, data); continue;
|
|
|
case Shader::SMP_mat4_transpose: _glgsg->_glUniformMatrix4fv(p, 1, GL_TRUE, data); continue;
|
|
|
@@ -2528,24 +2433,27 @@ issue_parameters(int altered) {
|
|
|
}
|
|
|
}
|
|
|
else if (spec._scalar_type == ShaderType::ST_double) {
|
|
|
-#ifdef STDFLOAT_DOUBLE
|
|
|
- const double *data = val->get_data();
|
|
|
- data += spec._offset;
|
|
|
-#else
|
|
|
- double *data = (double *)scratch;
|
|
|
- const float *from_data = val->get_data();
|
|
|
- from_data += spec._offset;
|
|
|
- for (size_t i = 0; i < spec._size; ++i) {
|
|
|
- data[i] = (double)from_data[i];
|
|
|
- }
|
|
|
-#endif
|
|
|
+ const double *data = (const double *)val;
|
|
|
|
|
|
+#ifdef OPENGLES
|
|
|
+ GLCAT.error()
|
|
|
+ << "Passing double-precision shader inputs to shaders is not supported in OpenGL ES.\n";
|
|
|
+
|
|
|
+ // Deactivate it to make sure the user doesn't get flooded with this
|
|
|
+ // error.
|
|
|
+ set_uniform_location(spec._id._location, -1);
|
|
|
+#else
|
|
|
switch (spec._piece) {
|
|
|
case Shader::SMP_scalar: _glgsg->_glUniform1dv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec2: _glgsg->_glUniform2dv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec3: _glgsg->_glUniform3dv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec4: _glgsg->_glUniform4dv(p, 1, data); continue;
|
|
|
+ case Shader::SMP_scalar_array: _glgsg->_glUniform1dv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec2_array: _glgsg->_glUniform2dv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec3_array: _glgsg->_glUniform3dv(p, spec._array_count, data); continue;
|
|
|
case Shader::SMP_vec4_array: _glgsg->_glUniform4dv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_mat3_whole: _glgsg->_glUniformMatrix3dv(p, 1, GL_FALSE, data); continue;
|
|
|
+ case Shader::SMP_mat3_array: _glgsg->_glUniformMatrix3dv(p, spec._array_count, GL_FALSE, data); continue;
|
|
|
case Shader::SMP_mat4_whole: _glgsg->_glUniformMatrix4dv(p, 1, GL_FALSE, data); continue;
|
|
|
case Shader::SMP_mat4_array: _glgsg->_glUniformMatrix4dv(p, spec._array_count, GL_FALSE, data); continue;
|
|
|
case Shader::SMP_mat4_transpose: _glgsg->_glUniformMatrix4dv(p, 1, GL_TRUE, data); continue;
|
|
|
@@ -2581,20 +2489,41 @@ issue_parameters(int altered) {
|
|
|
_glgsg->_glUniformMatrix4x3dv(p, 1, GL_TRUE, data);
|
|
|
continue;
|
|
|
}
|
|
|
+#endif
|
|
|
}
|
|
|
else if (spec._scalar_type == ShaderType::ST_int) {
|
|
|
- const int *data = (const int *)val->get_data();
|
|
|
- data += spec._offset;
|
|
|
+ const int *data = (const int *)val;
|
|
|
|
|
|
switch (spec._piece) {
|
|
|
case Shader::SMP_scalar: _glgsg->_glUniform1i(p, ((int *)data)[0]);; continue;
|
|
|
case Shader::SMP_vec2: _glgsg->_glUniform2iv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec3: _glgsg->_glUniform3iv(p, 1, data); continue;
|
|
|
case Shader::SMP_vec4: _glgsg->_glUniform4iv(p, 1, data); continue;
|
|
|
+ case Shader::SMP_scalar_array: _glgsg->_glUniform1iv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec2_array: _glgsg->_glUniform2iv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec3_array: _glgsg->_glUniform3iv(p, spec._array_count, data); continue;
|
|
|
case Shader::SMP_vec4_array: _glgsg->_glUniform4iv(p, spec._array_count, data); continue;
|
|
|
default: nassert_raise("Invalid ShaderMatSpec piece with scalar type int");
|
|
|
}
|
|
|
}
|
|
|
+ else if (spec._scalar_type == ShaderType::ST_uint || spec._scalar_type == ShaderType::ST_bool) {
|
|
|
+ const unsigned int *data = (const unsigned int *)val;
|
|
|
+
|
|
|
+ switch (spec._piece) {
|
|
|
+ case Shader::SMP_scalar: _glgsg->_glUniform1uiv(p, 1, data); continue;
|
|
|
+ case Shader::SMP_vec2: _glgsg->_glUniform2uiv(p, 1, data); continue;
|
|
|
+ case Shader::SMP_vec3: _glgsg->_glUniform3uiv(p, 1, data); continue;
|
|
|
+ case Shader::SMP_vec4: _glgsg->_glUniform4uiv(p, 1, data); continue;
|
|
|
+ case Shader::SMP_scalar_array: _glgsg->_glUniform1uiv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec2_array: _glgsg->_glUniform2uiv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec3_array: _glgsg->_glUniform3uiv(p, spec._array_count, data); continue;
|
|
|
+ case Shader::SMP_vec4_array: _glgsg->_glUniform4uiv(p, spec._array_count, data); continue;
|
|
|
+ default: nassert_raise("Invalid ShaderMatSpec piece with scalar type uint/bool");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ nassert_raise("numeric type not supported");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|