void opengl::ShaderUniforms::setUniformMatrix4fv(const SCP_string &name, const int count, const matrix4 *val) { Assertion(GL_state.IsCurrentProgram(_program->getShaderHandle()), "The program must be current before setting uniforms!"); size_t uniform_index = findUniform(name); bool resident = false; if (uniform_index != (size_t)-1) { Assert((size_t)uniform_index < _uniforms.size()); uniform_bind *bind_info = &_uniforms[uniform_index]; if (bind_info->type == uniform_bind::MATRIX4 && bind_info->count == count) { bool equal = true; // if the values are close enough, pass. for (int i = 0; i < count; ++i) { if (!vm_matrix_equal(val[i], _uniform_data_matrix4[bind_info->index + i])) { equal = false; break; } } if (equal) { return; } resident = true; for (int i = 0; i < count; ++i) { _uniform_data_matrix4[bind_info->index + i] = val[i]; } } } if (!resident) { // uniform doesn't exist in our previous uniform block so queue this new value for (int i = 0; i < count; ++i) { _uniform_data_matrix4.push_back(val[i]); } uniform_bind new_bind; new_bind.count = count; new_bind.index = _uniform_data_matrix4.size() - count; // new_bind.index = num_matrix_uniforms - count; new_bind.type = uniform_bind::MATRIX4; new_bind.name = name; _uniforms.push_back(new_bind); _uniform_lookup[name] = _uniforms.size() - 1; } glUniformMatrix4fv(findUniformLocation(name.c_str()), count, GL_FALSE, (const GLfloat*)val); }
void opengl_uniform_state::setUniformMatrix4fv(const SCP_string &name, const int count, const matrix4 *val) { size_t uniform_index = findUniform(name); bool resident = false; if ( uniform_index != (size_t)-1) { Assert( (size_t)uniform_index < uniforms.size() ); uniform_bind *bind_info = &uniforms[uniform_index]; if ( bind_info->type == uniform_bind::MATRIX4 && bind_info->count == count ) { bool equal = true; // if the values are close enough, pass. for ( int i = 0; i < count; ++i ) { if ( !vm_matrix_equal(val[i], uniform_data_matrix4[bind_info->index+i]) ) { equal = false; break; } } if ( equal ) { return; } resident = true; for ( int i = 0; i < count; ++i ) { uniform_data_matrix4[bind_info->index+i] = val[i]; } } } if ( !resident ) { // uniform doesn't exist in our previous uniform block so queue this new value for ( int i = 0; i < count; ++i ) { uniform_data_matrix4.push_back(val[i]); } uniform_bind new_bind; new_bind.count = count; new_bind.index = uniform_data_matrix4.size() - count; // new_bind.index = num_matrix_uniforms - count; new_bind.type = uniform_bind::MATRIX4; new_bind.name = name; uniforms.push_back(new_bind); uniform_lookup[name] = uniforms.size()-1; } glUniformMatrix4fv(opengl_shader_get_uniform(name.c_str()), count, GL_FALSE, (const GLfloat*)val); }
void opengl::ShaderUniforms::setUniformMatrix4f(const SCP_string &name, const matrix4 &val) { Assertion(GL_state.IsCurrentProgram(_program->getShaderHandle()), "The program must be current before setting uniforms!"); size_t uniform_index = findUniform(name); bool resident = false; if (uniform_index != (size_t)-1) { Assert((size_t)uniform_index < _uniforms.size()); uniform_bind *bind_info = &_uniforms[uniform_index]; if (bind_info->type == uniform_bind::MATRIX4 && bind_info->count == 1) { if (vm_matrix_equal(_uniform_data_matrix4[bind_info->index], val)) { return; } _uniform_data_matrix4[bind_info->index] = val; resident = true; } } if (!resident) { // uniform doesn't exist in our previous uniform block so queue this new value //matrix_uniform_data[num_matrix_uniforms] = val; //memcpy(&(matrix_uniform_data[num_matrix_uniforms]), &val, sizeof(matrix4)); _uniform_data_matrix4.push_back(val); // num_matrix_uniforms += 1; uniform_bind new_bind; new_bind.count = 1; new_bind.index = _uniform_data_matrix4.size() - 1; // new_bind.index = num_matrix_uniforms - 1; new_bind.type = uniform_bind::MATRIX4; new_bind.name = name; _uniforms.push_back(new_bind); _uniform_lookup[name] = _uniforms.size() - 1; } glUniformMatrix4fv(findUniformLocation(name.c_str()), 1, GL_FALSE, (const GLfloat*)&val); }
void opengl_uniform_state::setUniformMatrix4f(const SCP_string &name, const matrix4 &val) { size_t uniform_index = findUniform(name); bool resident = false; if ( uniform_index != (size_t)-1) { Assert( (size_t)uniform_index < uniforms.size() ); uniform_bind *bind_info = &uniforms[uniform_index]; if ( bind_info->type == uniform_bind::MATRIX4 && bind_info->count == 1 ) { if ( vm_matrix_equal(uniform_data_matrix4[bind_info->index], val) ) { return; } uniform_data_matrix4[bind_info->index] = val; resident = true; } } if ( !resident ) { // uniform doesn't exist in our previous uniform block so queue this new value //matrix_uniform_data[num_matrix_uniforms] = val; //memcpy(&(matrix_uniform_data[num_matrix_uniforms]), &val, sizeof(matrix4)); uniform_data_matrix4.push_back(val); // num_matrix_uniforms += 1; uniform_bind new_bind; new_bind.count = 1; new_bind.index = uniform_data_matrix4.size() - 1; // new_bind.index = num_matrix_uniforms - 1; new_bind.type = uniform_bind::MATRIX4; new_bind.name = name; uniforms.push_back(new_bind); uniform_lookup[name] = uniforms.size()-1; } glUniformMatrix4fv(opengl_shader_get_uniform(name.c_str()), 1, GL_FALSE, (const GLfloat*)&val); }