Add additional set functions
This commit is contained in:
parent
c47fc285f1
commit
879fe9da61
2 changed files with 90 additions and 5 deletions
|
@ -37,6 +37,11 @@
|
||||||
|
|
||||||
// Project includes
|
// Project includes
|
||||||
|
|
||||||
|
namespace NLMISC {
|
||||||
|
class CVector;
|
||||||
|
class CMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
namespace NL3D {
|
namespace NL3D {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -61,8 +66,17 @@ public:
|
||||||
CGPUProgramParams();
|
CGPUProgramParams();
|
||||||
virtual ~CGPUProgramParams();
|
virtual ~CGPUProgramParams();
|
||||||
|
|
||||||
void set(uint index, float f0, float f1, float f2, float f3);
|
void setF(uint index, float f0);
|
||||||
void set(uint index, int i0, int i1, int i2, int i3);
|
void setF(uint index, float f0, float f1);
|
||||||
|
void setF(uint index, float f0, float f1, float f2);
|
||||||
|
void setF(uint index, float f0, float f1, float f2, float f3);
|
||||||
|
void setI(uint index, int i0);
|
||||||
|
void setI(uint index, int i0, int i1);
|
||||||
|
void setI(uint index, int i0, int i1, int i2);
|
||||||
|
void setI(uint index, int i0, int i1, int i2, int i3);
|
||||||
|
void setF(uint index, const NLMISC::CVector& v);
|
||||||
|
void setF(uint index, const NLMISC::CMatrix& m);
|
||||||
|
void setF(uint index, uint num, const float *src);
|
||||||
|
|
||||||
// Internal
|
// Internal
|
||||||
/// Allocate specified number of components if necessary
|
/// Allocate specified number of components if necessary
|
||||||
|
@ -83,6 +97,9 @@ public:
|
||||||
int *getPtrIByOffset(size_t offset) { return m_Vec[offset].I; }
|
int *getPtrIByOffset(size_t offset) { return m_Vec[offset].I; }
|
||||||
TType getTypeByOffset(size_t offset) { return m_Meta[offset].Type; }
|
TType getTypeByOffset(size_t offset) { return m_Meta[offset].Type; }
|
||||||
|
|
||||||
|
// Utility
|
||||||
|
static inline uint getNbRegistersByComponents(uint count) { return (count + 3) >> 2; } // vector register per 4 components
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<CVec> m_Vec;
|
std::vector<CVec> m_Vec;
|
||||||
std::vector<CMeta> m_Meta;
|
std::vector<CMeta> m_Meta;
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
|
|
||||||
// NeL includes
|
// NeL includes
|
||||||
// #include <nel/misc/debug.h>
|
// #include <nel/misc/debug.h>
|
||||||
|
#include <nel/misc/vector.h>
|
||||||
|
#include <nel/misc/matrix.h>
|
||||||
|
|
||||||
// Project includes
|
// Project includes
|
||||||
|
|
||||||
|
@ -50,7 +52,28 @@ CGPUProgramParams::~CGPUProgramParams()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGPUProgramParams::set(uint index, float f0, float f1, float f2, float f3)
|
void CGPUProgramParams::setF(uint index, float f0)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 1, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setF(uint index, float f0, float f1)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 2, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setF(uint index, float f0, float f1, float f2)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 3, Float));
|
||||||
|
f[0] = f0;
|
||||||
|
f[1] = f1;
|
||||||
|
f[2] = f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setF(uint index, float f0, float f1, float f2, float f3)
|
||||||
{
|
{
|
||||||
float *f = getPtrFByOffset(allocOffset(index, 4, Float));
|
float *f = getPtrFByOffset(allocOffset(index, 4, Float));
|
||||||
f[0] = f0;
|
f[0] = f0;
|
||||||
|
@ -59,7 +82,28 @@ void CGPUProgramParams::set(uint index, float f0, float f1, float f2, float f3)
|
||||||
f[3] = f3;
|
f[3] = f3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGPUProgramParams::set(uint index, int i0, int i1, int i2, int i3)
|
void CGPUProgramParams::setI(uint index, int i0)
|
||||||
|
{
|
||||||
|
int *i = getPtrIByOffset(allocOffset(index, 1, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setI(uint index, int i0, int i1)
|
||||||
|
{
|
||||||
|
int *i = getPtrIByOffset(allocOffset(index, 2, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setI(uint index, int i0, int i1, int i2)
|
||||||
|
{
|
||||||
|
int *i = getPtrIByOffset(allocOffset(index, 3, Int));
|
||||||
|
i[0] = i0;
|
||||||
|
i[1] = i1;
|
||||||
|
i[2] = i2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setI(uint index, int i0, int i1, int i2, int i3)
|
||||||
{
|
{
|
||||||
int *i = getPtrIByOffset(allocOffset(index, 4, Int));
|
int *i = getPtrIByOffset(allocOffset(index, 4, Int));
|
||||||
i[0] = i0;
|
i[0] = i0;
|
||||||
|
@ -68,6 +112,30 @@ void CGPUProgramParams::set(uint index, int i0, int i1, int i2, int i3)
|
||||||
i[3] = i3;
|
i[3] = i3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setF(uint index, const NLMISC::CVector& v)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 3, Float));
|
||||||
|
f[0] = v.x;
|
||||||
|
f[1] = v.y;
|
||||||
|
f[2] = v.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setF(uint index, const NLMISC::CMatrix& m)
|
||||||
|
{
|
||||||
|
// TODO: Verify this!
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, 16, Float));
|
||||||
|
NLMISC::CMatrix mt = m;
|
||||||
|
mt.transpose();
|
||||||
|
mt.get(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGPUProgramParams::setF(uint index, uint num, const float *src)
|
||||||
|
{
|
||||||
|
float *f = getPtrFByOffset(allocOffset(index, num, Float));
|
||||||
|
for (uint i = 0; i < num; ++i)
|
||||||
|
f[i] = src[i];
|
||||||
|
}
|
||||||
|
|
||||||
/// Allocate specified number of components if necessary
|
/// Allocate specified number of components if necessary
|
||||||
size_t CGPUProgramParams::allocOffset(uint index, uint count, TType type)
|
size_t CGPUProgramParams::allocOffset(uint index, uint count, TType type)
|
||||||
{
|
{
|
||||||
|
@ -96,7 +164,7 @@ size_t CGPUProgramParams::allocOffset(uint index, uint count, TType type)
|
||||||
|
|
||||||
// Allocate space
|
// Allocate space
|
||||||
offset = m_Meta.size();
|
offset = m_Meta.size();
|
||||||
uint blocks = (count + 3) >> 2; // per 4 components
|
uint blocks = getNbRegistersByComponents(count); // per 4 components
|
||||||
m_Meta.resize(offset + blocks);
|
m_Meta.resize(offset + blocks);
|
||||||
m_Vec.resize(offset + blocks);
|
m_Vec.resize(offset + blocks);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue