Fix errors in color transforms.
Add support for color offsets. Add support for special swizzles that select default const values.
This commit is contained in:
parent
206bfcf0f3
commit
756f12c994
@ -242,7 +242,7 @@ void FloatImage::exponentiate(uint base_component, uint num, float power)
|
||||
}
|
||||
|
||||
/// Apply linear transform.
|
||||
void FloatImage::transform(uint base_component, const Matrix & m)
|
||||
void FloatImage::transform(uint base_component, const Matrix & m, Vector4::Arg offset)
|
||||
{
|
||||
nvCheck(base_component + 4 <= m_componentNum);
|
||||
|
||||
@ -255,7 +255,7 @@ void FloatImage::transform(uint base_component, const Matrix & m)
|
||||
|
||||
for (uint i = 0; i < size; i++)
|
||||
{
|
||||
Vector4 color = nv::transform(m, Vector4(*r, *g, *b, *a));
|
||||
Vector4 color = nv::transform(m, Vector4(*r, *g, *b, *a)) + offset;
|
||||
|
||||
*r++ = color.x();
|
||||
*g++ = color.y();
|
||||
@ -267,14 +267,19 @@ void FloatImage::transform(uint base_component, const Matrix & m)
|
||||
void FloatImage::swizzle(uint base_component, uint r, uint g, uint b, uint a)
|
||||
{
|
||||
nvCheck(base_component + 4 <= m_componentNum);
|
||||
nvCheck(r < 7 && g < 7 && b < 7 && a < 7);
|
||||
|
||||
const uint size = m_width * m_height;
|
||||
|
||||
float * c[4];
|
||||
float consts[] = { 1.0f, 0.0f, -1.0f };
|
||||
float * c[7];
|
||||
c[0] = this->channel(base_component + 0);
|
||||
c[1] = this->channel(base_component + 1);
|
||||
c[2] = this->channel(base_component + 2);
|
||||
c[3] = this->channel(base_component + 3);
|
||||
c[4] = consts;
|
||||
c[5] = consts + 1;
|
||||
c[6] = consts + 2;
|
||||
|
||||
for (uint i = 0; i < size; i++)
|
||||
{
|
||||
|
@ -63,7 +63,7 @@ public:
|
||||
NVIMAGE_API void toGamma(uint base_component, uint num, float gamma = 2.2f);
|
||||
NVIMAGE_API void exponentiate(uint base_component, uint num, float power);
|
||||
|
||||
NVIMAGE_API void transform(uint base_component, const Matrix & m);
|
||||
NVIMAGE_API void transform(uint base_component, const Matrix & m, Vector4::Arg offset);
|
||||
NVIMAGE_API void swizzle(uint base_component, uint r, uint g, uint b, uint a);
|
||||
|
||||
NVIMAGE_API FloatImage * fastDownSample() const;
|
||||
|
@ -665,7 +665,13 @@ void Compressor::Private::processInputImage(Mipmap & mipmap, const InputOptions:
|
||||
FloatImage * image = mipmap.asFloatImage();
|
||||
nvDebugCheck(image != NULL);
|
||||
|
||||
image->transform(0, inputOptions.linearTransform);
|
||||
Vector4 offset(
|
||||
inputOptions.colorOffsets[0],
|
||||
inputOptions.colorOffsets[1],
|
||||
inputOptions.colorOffsets[2],
|
||||
inputOptions.colorOffsets[3]);
|
||||
|
||||
image->transform(0, inputOptions.linearTransform, offset);
|
||||
}
|
||||
else if (inputOptions.colorTransform == ColorTransform_Swizzle)
|
||||
{
|
||||
|
@ -103,6 +103,8 @@ void InputOptions::reset()
|
||||
|
||||
m.colorTransform = ColorTransform_None;
|
||||
m.linearTransform = Matrix(identity);
|
||||
for (int i = 0; i < 4; i++) m.colorOffsets[i] = 0;
|
||||
for (int i = 0; i < 4; i++) m.swizzleTransform[i] = i;
|
||||
|
||||
m.generateMipmaps = true;
|
||||
m.maxLevel = -1;
|
||||
@ -344,16 +346,27 @@ void InputOptions::setLinearTransform(int channel, float w0, float w1, float w2,
|
||||
{
|
||||
nvCheck(channel >= 0 && channel < 4);
|
||||
|
||||
Vector4 w(w0, w1, w2, w3);
|
||||
//m.linearTransform.setRow(channel, w);
|
||||
m.linearTransform(0, channel) = w0;
|
||||
m.linearTransform(1, channel) = w1;
|
||||
m.linearTransform(2, channel) = w2;
|
||||
m.linearTransform(3, channel) = w3;
|
||||
}
|
||||
|
||||
void InputOptions::setLinearTransform(int channel, float w0, float w1, float w2, float w3, float offset)
|
||||
{
|
||||
nvCheck(channel >= 0 && channel < 4);
|
||||
|
||||
setLinearTransform(channel, w0, w1, w2, w3);
|
||||
|
||||
m.colorOffsets[channel] = offset;
|
||||
}
|
||||
|
||||
void InputOptions::setSwizzleTransform(int x, int y, int z, int w)
|
||||
{
|
||||
nvCheck(x >= 0 && x < 3);
|
||||
nvCheck(y >= 0 && y < 3);
|
||||
nvCheck(z >= 0 && z < 3);
|
||||
nvCheck(w >= 0 && w < 3);
|
||||
nvCheck(x >= 0 && x <= 6);
|
||||
nvCheck(y >= 0 && y <= 6);
|
||||
nvCheck(z >= 0 && z <= 6);
|
||||
nvCheck(w >= 0 && w <= 6);
|
||||
|
||||
m.swizzleTransform[0] = x;
|
||||
m.swizzleTransform[1] = y;
|
||||
|
@ -57,6 +57,7 @@ namespace nvtt
|
||||
// Color transform.
|
||||
ColorTransform colorTransform;
|
||||
nv::Matrix linearTransform;
|
||||
float colorOffsets[4];
|
||||
uint swizzleTransform[4];
|
||||
|
||||
// Mipmap generation options.
|
||||
|
@ -220,9 +220,10 @@ namespace nvtt
|
||||
NVTT_API void setNormalFilter(float sm, float medium, float big, float large);
|
||||
NVTT_API void setNormalizeMipmaps(bool b);
|
||||
|
||||
// Set color transforms. @@ Not implemented!
|
||||
// Set color transforms.
|
||||
NVTT_API void setColorTransform(ColorTransform t);
|
||||
NVTT_API void setLinearTransform(int channel, float w0, float w1, float w2, float w3);
|
||||
NVTT_API void setLinearTransform(int channel, float w0, float w1, float w2, float w3, float offset);
|
||||
NVTT_API void setSwizzleTransform(int x, int y, int z, int w);
|
||||
|
||||
// Set resizing options.
|
||||
|
Loading…
Reference in New Issue
Block a user