Texture coloring
parent
4f097c10b3
commit
a8554cfae3
|
@ -2082,8 +2082,6 @@ Texture CEngine::CreateTexture(const std::string& texName, const TextureCreatePa
|
||||||
if (m_texBlacklist.find(texName) != m_texBlacklist.end())
|
if (m_texBlacklist.find(texName) != m_texBlacklist.end())
|
||||||
return Texture(); // invalid texture
|
return Texture(); // invalid texture
|
||||||
|
|
||||||
// TODO: detect alpha channel?
|
|
||||||
|
|
||||||
CImage img;
|
CImage img;
|
||||||
if (! img.Load(m_app->GetDataFilePath(DIR_TEXTURE, texName)))
|
if (! img.Load(m_app->GetDataFilePath(DIR_TEXTURE, texName)))
|
||||||
{
|
{
|
||||||
|
@ -2194,6 +2192,146 @@ bool CEngine::LoadAllTextures()
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsExcludeColor(Math::Point *exclude, int x, int y)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while ( exclude[i+0].x != 0.0f || exclude[i+0].y != 0.0f ||
|
||||||
|
exclude[i+1].y != 0.0f || exclude[i+1].y != 0.0f )
|
||||||
|
{
|
||||||
|
if ( x >= static_cast<int>(exclude[i+0].x*256.0f) &&
|
||||||
|
x < static_cast<int>(exclude[i+1].x*256.0f) &&
|
||||||
|
y >= static_cast<int>(exclude[i+0].y*256.0f) &&
|
||||||
|
y < static_cast<int>(exclude[i+1].y*256.0f) ) return true; // exclude
|
||||||
|
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false; // point to include
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool CEngine::ChangeTextureColor(const std::string& texName,
|
||||||
|
Color colorRef1, Color colorNew1,
|
||||||
|
Color colorRef2, Color colorNew2,
|
||||||
|
float tolerance1, float tolerance2,
|
||||||
|
Math::Point ts, Math::Point ti,
|
||||||
|
Math::Point *exclude, float shift, bool hsv)
|
||||||
|
{
|
||||||
|
if ( colorRef1.r == colorNew1.r &&
|
||||||
|
colorRef1.g == colorNew1.g &&
|
||||||
|
colorRef1.b == colorNew1.b &&
|
||||||
|
colorRef2.r == colorNew2.r &&
|
||||||
|
colorRef2.g == colorNew2.g &&
|
||||||
|
colorRef2.b == colorNew2.b ) return true;
|
||||||
|
|
||||||
|
|
||||||
|
DeleteTexture(texName);
|
||||||
|
|
||||||
|
|
||||||
|
CImage img;
|
||||||
|
if (! img.Load(m_app->GetDataFilePath(DIR_TEXTURE, texName)))
|
||||||
|
{
|
||||||
|
std::string error = img.GetError();
|
||||||
|
GetLogger()->Error("Couldn't load texture '%s': %s, blacklisting\n", texName.c_str(), error.c_str());
|
||||||
|
m_texBlacklist.insert(texName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int dx = img.GetSize().x;
|
||||||
|
int dy = img.GetSize().x;
|
||||||
|
|
||||||
|
int sx = static_cast<int>(ts.x*dx);
|
||||||
|
int sy = static_cast<int>(ts.y*dy);
|
||||||
|
|
||||||
|
int ex = static_cast<int>(ti.x*dx);
|
||||||
|
int ey = static_cast<int>(ti.y*dy);
|
||||||
|
|
||||||
|
ColorHSV cr1 = RGB2HSV(colorRef1);
|
||||||
|
ColorHSV cn1 = RGB2HSV(colorNew1);
|
||||||
|
ColorHSV cr2 = RGB2HSV(colorRef2);
|
||||||
|
ColorHSV cn2 = RGB2HSV(colorNew2);
|
||||||
|
|
||||||
|
for (int y = sy; y < ey; y++)
|
||||||
|
{
|
||||||
|
for (int x = sx; x < ex; x++)
|
||||||
|
{
|
||||||
|
if (exclude != nullptr && IsExcludeColor(exclude, x,y) ) continue;
|
||||||
|
|
||||||
|
Color color = img.GetPixel(Math::IntPoint(x, y));
|
||||||
|
|
||||||
|
if (hsv)
|
||||||
|
{
|
||||||
|
ColorHSV c = RGB2HSV(color);
|
||||||
|
if (c.s > 0.01f && fabs(c.h - cr1.h) < tolerance1)
|
||||||
|
{
|
||||||
|
c.h += cn1.h - cr1.h;
|
||||||
|
c.s += cn1.s - cr1.s;
|
||||||
|
c.v += cn1.v - cr1.v;
|
||||||
|
if (c.h < 0.0f) c.h -= 1.0f;
|
||||||
|
if (c.h > 1.0f) c.h += 1.0f;
|
||||||
|
color = HSV2RGB(c);
|
||||||
|
color.r += shift;
|
||||||
|
color.g += shift;
|
||||||
|
color.b += shift;
|
||||||
|
img.SetPixel(Math::IntPoint(x, y), color);
|
||||||
|
}
|
||||||
|
else if (tolerance2 != -1.0f &&
|
||||||
|
c.s > 0.01f && fabs(c.h - cr2.h) < tolerance2)
|
||||||
|
{
|
||||||
|
c.h += cn2.h - cr2.h;
|
||||||
|
c.s += cn2.s - cr2.s;
|
||||||
|
c.v += cn2.v - cr2.v;
|
||||||
|
if (c.h < 0.0f) c.h -= 1.0f;
|
||||||
|
if (c.h > 1.0f) c.h += 1.0f;
|
||||||
|
color = HSV2RGB(c);
|
||||||
|
color.r += shift;
|
||||||
|
color.g += shift;
|
||||||
|
color.b += shift;
|
||||||
|
img.SetPixel(Math::IntPoint(x, y), color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( fabs(color.r - colorRef1.r) +
|
||||||
|
fabs(color.g - colorRef1.g) +
|
||||||
|
fabs(color.b - colorRef1.b) < tolerance1 * 3.0f)
|
||||||
|
{
|
||||||
|
color.r = colorNew1.r + color.r - colorRef1.r + shift;
|
||||||
|
color.g = colorNew1.g + color.g - colorRef1.g + shift;
|
||||||
|
color.b = colorNew1.b + color.b - colorRef1.b + shift;
|
||||||
|
img.SetPixel(Math::IntPoint(x, y), color);
|
||||||
|
}
|
||||||
|
else if (tolerance2 != -1 &&
|
||||||
|
fabs(color.r - colorRef2.r) +
|
||||||
|
fabs(color.g - colorRef2.g) +
|
||||||
|
fabs(color.b - colorRef2.b) < tolerance2 * 3.0f)
|
||||||
|
{
|
||||||
|
color.r = colorNew2.r + color.r - colorRef2.r + shift;
|
||||||
|
color.g = colorNew2.g + color.g - colorRef2.g + shift;
|
||||||
|
color.b = colorNew2.b + color.b - colorRef2.b + shift;
|
||||||
|
img.SetPixel(Math::IntPoint(x, y), color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Texture tex = m_device->CreateTexture(&img, m_defaultTexParams);
|
||||||
|
|
||||||
|
if (! tex.Valid())
|
||||||
|
{
|
||||||
|
GetLogger()->Error("Couldn't load texture '%s', blacklisting\n", texName.c_str());
|
||||||
|
m_texBlacklist.insert(texName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_texNameMap[texName] = tex;
|
||||||
|
m_revTexNameMap[tex] = texName;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void CEngine::DeleteTexture(const std::string& texName)
|
void CEngine::DeleteTexture(const std::string& texName)
|
||||||
{
|
{
|
||||||
auto it = m_texNameMap.find(texName);
|
auto it = m_texNameMap.find(texName);
|
||||||
|
|
|
@ -890,12 +890,20 @@ public:
|
||||||
const Math::Vector& upVec, float eyeDistance);
|
const Math::Vector& upVec, float eyeDistance);
|
||||||
|
|
||||||
//! Loads texture, creating it if not already present
|
//! Loads texture, creating it if not already present
|
||||||
Texture LoadTexture(const std::string& name);
|
Texture LoadTexture(const std::string& name);
|
||||||
//! Loads texture, creating it with given params if not already present
|
//! Loads texture, creating it with given params if not already present
|
||||||
Texture LoadTexture(const std::string& name, const TextureCreateParams& params);
|
Texture LoadTexture(const std::string& name, const TextureCreateParams& params);
|
||||||
//! Loads all necessary textures
|
//! Loads all necessary textures
|
||||||
bool LoadAllTextures();
|
bool LoadAllTextures();
|
||||||
|
|
||||||
|
bool ChangeTextureColor(const std::string& texName,
|
||||||
|
Color colorRef1, Color colorNew1,
|
||||||
|
Color colorRef2, Color colorNew2,
|
||||||
|
float tolerance1, float tolerance2,
|
||||||
|
Math::Point ts, Math::Point ti,
|
||||||
|
Math::Point *exclude = nullptr,
|
||||||
|
float shift = 0.0f, bool hsv = false);
|
||||||
|
|
||||||
//! Sets texture for given stage; if not present in cache, the texture is loaded
|
//! Sets texture for given stage; if not present in cache, the texture is loaded
|
||||||
/** If loading fails, returns false. */
|
/** If loading fails, returns false. */
|
||||||
bool SetTexture(const std::string& name, int stage = 0);
|
bool SetTexture(const std::string& name, int stage = 0);
|
||||||
|
@ -973,19 +981,19 @@ public:
|
||||||
//@{
|
//@{
|
||||||
//! Ambient color management
|
//! Ambient color management
|
||||||
void SetAmbientColor(const Color& color, int rank = 0);
|
void SetAmbientColor(const Color& color, int rank = 0);
|
||||||
Color GetAmbientColor(int rank = 0);
|
Color GetAmbientColor(int rank = 0);
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
//@{
|
//@{
|
||||||
//! Color management under water
|
//! Color management under water
|
||||||
void SetWaterAddColor(const Color& color);
|
void SetWaterAddColor(const Color& color);
|
||||||
Color GetWaterAddColor();
|
Color GetWaterAddColor();
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
//@{
|
//@{
|
||||||
//! Management of the fog color
|
//! Management of the fog color
|
||||||
void SetFogColor(const Color& color, int rank = 0);
|
void SetFogColor(const Color& color, int rank = 0);
|
||||||
Color GetFogColor(int rank = 0);
|
Color GetFogColor(int rank = 0);
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
//@{
|
//@{
|
||||||
|
|
|
@ -4905,7 +4905,7 @@ void CRobotMain::ChangeColor()
|
||||||
exclu[3] = Math::Point(256.0f/256.0f, 256.0f/256.0f); // SatCom screen
|
exclu[3] = Math::Point(256.0f/256.0f, 256.0f/256.0f); // SatCom screen
|
||||||
exclu[4] = Math::Point(0.0f, 0.0f);
|
exclu[4] = Math::Point(0.0f, 0.0f);
|
||||||
exclu[5] = Math::Point(0.0f, 0.0f); // terminator
|
exclu[5] = Math::Point(0.0f, 0.0f); // terminator
|
||||||
// TODO: m_engine->ChangeColor("human.png", colorRef1, colorNew1, colorRef2, colorNew2, 0.30f, 0.01f, ts, ti, exclu);
|
m_engine->ChangeTextureColor("human.png", colorRef1, colorNew1, colorRef2, colorNew2, 0.30f, 0.01f, ts, ti, exclu);
|
||||||
|
|
||||||
float tolerance;
|
float tolerance;
|
||||||
|
|
||||||
|
@ -4952,7 +4952,7 @@ void CRobotMain::ChangeColor()
|
||||||
exclu[1] = Math::Point(153.0f/256.0f, 79.0f/166.0f); // blue canister
|
exclu[1] = Math::Point(153.0f/256.0f, 79.0f/166.0f); // blue canister
|
||||||
exclu[2] = Math::Point(0.0f, 0.0f);
|
exclu[2] = Math::Point(0.0f, 0.0f);
|
||||||
exclu[3] = Math::Point(0.0f, 0.0f); // terminator
|
exclu[3] = Math::Point(0.0f, 0.0f); // terminator
|
||||||
// TODO: m_engine->ChangeColor(name, colorRef1, colorNew1, colorRef2, colorNew2, tolerance, 0.00f, ts, ti, exclu);
|
m_engine->ChangeTextureColor(name, colorRef1, colorNew1, colorRef2, colorNew2, tolerance, 0.00f, ts, ti, exclu);
|
||||||
|
|
||||||
colorRef2.r = 0.0f;
|
colorRef2.r = 0.0f;
|
||||||
colorRef2.g = 0.0f;
|
colorRef2.g = 0.0f;
|
||||||
|
@ -4961,19 +4961,19 @@ void CRobotMain::ChangeColor()
|
||||||
colorNew2.g = 0.0f;
|
colorNew2.g = 0.0f;
|
||||||
colorNew2.b = 0.0f;
|
colorNew2.b = 0.0f;
|
||||||
|
|
||||||
// TODO: m_engine->ChangeColor("base1.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
m_engine->ChangeTextureColor("base1.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
||||||
// TODO: m_engine->ChangeColor("convert.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
m_engine->ChangeTextureColor("convert.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
||||||
// TODO: m_engine->ChangeColor("derrick.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
m_engine->ChangeTextureColor("derrick.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
||||||
// TODO: m_engine->ChangeColor("factory.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
m_engine->ChangeTextureColor("factory.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
||||||
// TODO: m_engine->ChangeColor("lemt.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
m_engine->ChangeTextureColor("lemt.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
||||||
// TODO: m_engine->ChangeColor("roller.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
m_engine->ChangeTextureColor("roller.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
||||||
// TODO: m_engine->ChangeColor("search.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
m_engine->ChangeTextureColor("search.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, 0, 0, true);
|
||||||
|
|
||||||
exclu[0] = Math::Point( 0.0f/256.0f, 160.0f/256.0f);
|
exclu[0] = Math::Point( 0.0f/256.0f, 160.0f/256.0f);
|
||||||
exclu[1] = Math::Point(256.0f/256.0f, 256.0f/256.0f); // pencils
|
exclu[1] = Math::Point(256.0f/256.0f, 256.0f/256.0f); // pencils
|
||||||
exclu[2] = Math::Point(0.0f, 0.0f);
|
exclu[2] = Math::Point(0.0f, 0.0f);
|
||||||
exclu[3] = Math::Point(0.0f, 0.0f); // terminator
|
exclu[3] = Math::Point(0.0f, 0.0f); // terminator
|
||||||
// TODO: m_engine->ChangeColor("drawer.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, exclu, 0, true);
|
m_engine->ChangeTextureColor("drawer.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, exclu, 0, true);
|
||||||
|
|
||||||
exclu[0] = Math::Point(237.0f/256.0f, 176.0f/256.0f);
|
exclu[0] = Math::Point(237.0f/256.0f, 176.0f/256.0f);
|
||||||
exclu[1] = Math::Point(256.0f/256.0f, 220.0f/256.0f); // blue canister
|
exclu[1] = Math::Point(256.0f/256.0f, 220.0f/256.0f); // blue canister
|
||||||
|
@ -4981,26 +4981,26 @@ void CRobotMain::ChangeColor()
|
||||||
exclu[3] = Math::Point(130.0f/256.0f, 214.0f/256.0f); // safe location
|
exclu[3] = Math::Point(130.0f/256.0f, 214.0f/256.0f); // safe location
|
||||||
exclu[4] = Math::Point(0.0f, 0.0f);
|
exclu[4] = Math::Point(0.0f, 0.0f);
|
||||||
exclu[5] = Math::Point(0.0f, 0.0f); // terminator
|
exclu[5] = Math::Point(0.0f, 0.0f); // terminator
|
||||||
// TODO: m_engine->ChangeColor("subm.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, exclu, 0, true);
|
m_engine->ChangeTextureColor("subm.png", m_colorRefBot, m_colorNewBot, colorRef2, colorNew2, 0.10f, -1.0f, ts, ti, exclu, 0, true);
|
||||||
|
|
||||||
exclu[0] = Math::Point(128.0f/256.0f, 160.0f/256.0f);
|
exclu[0] = Math::Point(128.0f/256.0f, 160.0f/256.0f);
|
||||||
exclu[1] = Math::Point(256.0f/256.0f, 256.0f/256.0f); // SatCom
|
exclu[1] = Math::Point(256.0f/256.0f, 256.0f/256.0f); // SatCom
|
||||||
exclu[2] = Math::Point(0.0f, 0.0f);
|
exclu[2] = Math::Point(0.0f, 0.0f);
|
||||||
exclu[3] = Math::Point(0.0f, 0.0f); // terminator
|
exclu[3] = Math::Point(0.0f, 0.0f); // terminator
|
||||||
// TODO: m_engine->ChangeColor("ant.png", m_colorRefAlien, m_colorNewAlien, colorRef2, colorNew2, 0.50f, -1.0f, ts, ti, exclu);
|
m_engine->ChangeTextureColor("ant.png", m_colorRefAlien, m_colorNewAlien, colorRef2, colorNew2, 0.50f, -1.0f, ts, ti, exclu);
|
||||||
// TODO: m_engine->ChangeColor("mother.png", m_colorRefAlien, m_colorNewAlien, colorRef2, colorNew2, 0.50f, -1.0f, ts, ti);
|
m_engine->ChangeTextureColor("mother.png", m_colorRefAlien, m_colorNewAlien, colorRef2, colorNew2, 0.50f, -1.0f, ts, ti);
|
||||||
|
|
||||||
// TODO: m_engine->ChangeColor("plant.png", m_colorRefGreen, m_colorNewGreen, colorRef2, colorNew2, 0.50f, -1.0f, ts, ti);
|
m_engine->ChangeTextureColor("plant.png", m_colorRefGreen, m_colorNewGreen, colorRef2, colorNew2, 0.50f, -1.0f, ts, ti);
|
||||||
|
|
||||||
// PARTIPLOUF0 and PARTIDROP :
|
// PARTIPLOUF0 and PARTIDROP :
|
||||||
ts = Math::Point(0.500f, 0.500f);
|
ts = Math::Point(0.500f, 0.500f);
|
||||||
ti = Math::Point(0.875f, 0.750f);
|
ti = Math::Point(0.875f, 0.750f);
|
||||||
// TODO: m_engine->ChangeColor("effect00.png", m_colorRefWater, m_colorNewWater, colorRef2, colorNew2, 0.20f, -1.0f, ts, ti, 0, m_colorShiftWater, true);
|
m_engine->ChangeTextureColor("effect00.png", m_colorRefWater, m_colorNewWater, colorRef2, colorNew2, 0.20f, -1.0f, ts, ti, 0, m_colorShiftWater, true);
|
||||||
|
|
||||||
// PARTIFLIC :
|
// PARTIFLIC :
|
||||||
ts = Math::Point(0.00f, 0.75f);
|
ts = Math::Point(0.00f, 0.75f);
|
||||||
ti = Math::Point(0.25f, 1.00f);
|
ti = Math::Point(0.25f, 1.00f);
|
||||||
// TODO: m_engine->ChangeColor("effect02.png", m_colorRefWater, m_colorNewWater, colorRef2, colorNew2, 0.20f, -1.0f, ts, ti, 0, m_colorShiftWater, true);
|
m_engine->ChangeTextureColor("effect02.png", m_colorRefWater, m_colorNewWater, colorRef2, colorNew2, 0.20f, -1.0f, ts, ti, 0, m_colorShiftWater, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Updates the number of unnecessary objects
|
//! Updates the number of unnecessary objects
|
||||||
|
|
Loading…
Reference in New Issue