blob: 3beac40088bd543dac6bd6cb6ff85c598b0e7754 [file] [log] [blame]
#ifndef RTTL_SHADER_HXX
#define RTTL_SHADER_HXX
#include "RTInclude.hxx"
#include "RTVec.hxx"
namespace RTTL {
/* simple class to have something which is capable of handling
material properties, structure need to be properly aligned for
fast access */
class RTMaterial {
public:
RTVec3f m_diffuse;
float m_transparency;
RTVec3f m_specular;
float m_shininess;
RTVec3f m_ambient;
int m_textureId;
RTMaterial() {
m_diffuse = RTVec3f(0.5f,0.5f,0.5f);
m_transparency = 0.0f;
m_specular = RTVec3f(0.0f,0.0f,0.0f);
m_shininess = 0.0f;
m_ambient = RTVec3f(0.0f,0.0f,0.0f);
m_textureId = -1;
}
_INLINE sse_f& ambient() const { return *(sse_f*)&m_ambient; }
_INLINE sse_f& diffuse() const { return *(sse_f*)&m_diffuse; }
_INLINE sse_f& specular() const { return *(sse_f*)&m_specular; }
_INLINE static void getDiffuse(const sse_i id4, const RTMaterial *const mat, RTVec_t<3, sse_f> &dest)
{
//DBG_PRINT(id4);
const RTMaterial &mat0 = mat[M128_INT(id4,0)];
const RTMaterial &mat1 = mat[M128_INT(id4,1)];
const RTMaterial &mat2 = mat[M128_INT(id4,2)];
const RTMaterial &mat3 = mat[M128_INT(id4,3)];
//DBG_PRINT(mat0.m_diffuse);
//DBG_PRINT(mat1.m_diffuse);
//DBG_PRINT(mat2.m_diffuse);
//DBG_PRINT(mat3.m_diffuse);
dest[0] = _mm_setr_ps(mat0.m_diffuse[0],mat1.m_diffuse[0],mat2.m_diffuse[0],mat3.m_diffuse[0]);
dest[1] = _mm_setr_ps(mat0.m_diffuse[1],mat1.m_diffuse[1],mat2.m_diffuse[1],mat3.m_diffuse[1]);
dest[2] = _mm_setr_ps(mat0.m_diffuse[2],mat1.m_diffuse[2],mat2.m_diffuse[2],mat3.m_diffuse[2]);
//DBG_PRINT(dest);
}
};
};
#endif