// set uniform to 4D vector void Shader::SetUniform(const c8 * const name, const float4 &val) { PUSH_ACTIVE_SHADER(t); Activate(); glUniform4fv(GetUniformLocation(name),1, val.GetVec()); POP_ACTIVE_SHADER(t); };
// Multiply matrix and 4D vector together float4 Mat44::Mult(const float4 &m) const { Mat44 tr = Transpose(); __m128 matcols[] = { _mm_load_ps(tr.mat), _mm_load_ps(tr.mat+4), _mm_load_ps(tr.mat+8), _mm_load_ps(tr.mat+12) }; __m128 v = _mm_load_ps(m.GetVec()); // Broadcast vector into SSE registers __m128 xb = _mm_shuffle_ps(v,v,0x00); __m128 yb = _mm_shuffle_ps(v,v,0x55); __m128 zb = _mm_shuffle_ps(v,v,0xAA); __m128 wb = _mm_shuffle_ps(v,v,0xFF); // Perform multiplication by matrix columns xb = _mm_mul_ps(xb, matcols[0]); yb = _mm_mul_ps(yb, matcols[1]); zb = _mm_mul_ps(zb, matcols[2]); wb = _mm_mul_ps(wb, matcols[3]); // Add results __m128 r = _mm_add_ps(_mm_add_ps(xb, yb),_mm_add_ps(zb, wb)); float4 returnVec; _mm_store_ps(returnVec.GetVec(), r); return returnVec; };