Rendering/DayNight: Difference between revisions
Jump to navigation
Jump to search
(→DayNight::SetLightColors: Clean up) |
(→DayNight::SetLightColors: Clean up) |
||
Line 109: | Line 109: | ||
int v7; // [sp+2Ch] [bp-8h]@1 | int v7; // [sp+2Ch] [bp-8h]@1 | ||
int v8; // [sp+30h] [bp-4h]@1 | int v8; // [sp+30h] [bp-4h]@1 | ||
// Light colors | |||
DayNight::g_dnInfo.lightInfo.dirColor = DayNight::g_dnInfo.light.dirColor; | DayNight::g_dnInfo.lightInfo.dirColor = DayNight::g_dnInfo.light.dirColor; | ||
DayNight::g_dnInfo.lightInfo.ambColor = DayNight::g_dnInfo.light.ambColor; | DayNight::g_dnInfo.lightInfo.ambColor = DayNight::g_dnInfo.light.ambColor; | ||
// Window light colors | |||
// MOMT.flags & F_WINDOW | |||
CImVector windowDirColor = DayNight::g_dnInfo.light.dirColor; | CImVector windowDirColor = DayNight::g_dnInfo.light.dirColor; | ||
CImVector::Blend255_(&windowDirColor, 128u, &DayNight::g_dnInfo.light.ambColor); | CImVector::Blend255_(&windowDirColor, 128u, &DayNight::g_dnInfo.light.ambColor); | ||
CImVector windowAmbColor = DayNight::g_dnInfo.light.ambColor; | CImVector windowAmbColor = DayNight::g_dnInfo.light.ambColor; | ||
CImVector::Blend255_(&windowAmbColor, 128u, &DayNight::g_dnInfo.light.dirColor); | CImVector::Blend255_(&windowAmbColor, 128u, &DayNight::g_dnInfo.light.dirColor); | ||
windowAmbColor.r = std::min(windowAmbColor.r, 16u); | |||
windowAmbColor.g = std::min(windowAmbColor.g, 16u); | |||
DayNight::g_dnInfo.lightInfo.windowAmbColor = | windowAmbColor.b = std::min(windowAmbColor.b, 16u); | ||
windowAmbColor.a = windowAmbColor.a - 1; // 0 wraps to 255 | |||
DayNight::g_dnInfo.lightInfo.windowDirColor = windowDirColor; | |||
DayNight::g_dnInfo.lightInfo.windowAmbColor = windowAmbColor; | |||
// Shadow color | |||
// TODO: Clean up | |||
BYTE1(v1) = (unsigned __int16)(85 * (DayNight::g_dnInfo.light.ambColor.r + 3)) >> 8; | BYTE1(v1) = (unsigned __int16)(85 * (DayNight::g_dnInfo.light.ambColor.r + 3)) >> 8; | ||
Line 128: | Line 143: | ||
DayNight::g_dnInfo.shadowColor = (CImVector)(*(_DWORD *)&DayNight::g_dnInfo.light.ambColor & 0xFF000000 | ((unsigned __int16)(85 * (DayNight::g_dnInfo.light.ambColor.b + 3)) >> 8) | ((unsigned __int16)v1 << 8)); | DayNight::g_dnInfo.shadowColor = (CImVector)(*(_DWORD *)&DayNight::g_dnInfo.light.ambColor & 0xFF000000 | ((unsigned __int16)(85 * (DayNight::g_dnInfo.light.ambColor.b + 3)) >> 8) | ((unsigned __int16)v1 << 8)); | ||
DayNight::g_dnInfo.shadowColor.a = DayNight::g_dnInfo.light.shadowOpacity.r; | DayNight::g_dnInfo.shadowColor.a = DayNight::g_dnInfo.light.shadowOpacity.r; | ||
// TODO: What is unkLightInfo? | |||
DayNight::g_dnInfo.unkLightInfo.dir.x = DayNight::g_dnInfo.lightInfo.dir.x; | DayNight::g_dnInfo.unkLightInfo.dir.x = DayNight::g_dnInfo.lightInfo.dir.x; | ||
Line 134: | Line 151: | ||
DayNight::g_dnInfo.unkLightInfo.dirColor = DayNight::g_dnInfo.light.dirColor; | DayNight::g_dnInfo.unkLightInfo.dirColor = DayNight::g_dnInfo.light.dirColor; | ||
DayNight::g_dnInfo.unkLightInfo.ambColor = DayNight::g_dnInfo.light.ambColor; | DayNight::g_dnInfo.unkLightInfo.ambColor = DayNight::g_dnInfo.light.ambColor; | ||
DayNight::g_dnInfo.unkLightInfo.windowDirColor = DayNight::g_dnInfo.lightInfo.windowDirColor; | DayNight::g_dnInfo.unkLightInfo.windowDirColor = DayNight::g_dnInfo.lightInfo.windowDirColor; | ||
DayNight::g_dnInfo.unkLightInfo.windowAmbColor = DayNight::g_dnInfo.lightInfo.windowAmbColor; | DayNight::g_dnInfo.unkLightInfo.windowAmbColor = DayNight::g_dnInfo.lightInfo.windowAmbColor; | ||
Line 143: | Line 162: | ||
DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.z = DayNight::g_dnInfo.lightInfo.shaderShadowColor.z; | DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.z = DayNight::g_dnInfo.lightInfo.shaderShadowColor.z; | ||
DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.w = DayNight::g_dnInfo.lightInfo.shaderShadowColor.w; | DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.w = DayNight::g_dnInfo.lightInfo.shaderShadowColor.w; | ||
// Shader shadow color | |||
C3Vector rgb; | C3Vector rgb; |
Revision as of 17:19, 8 October 2017
In World of Warcraft, the DayNight system governs most of the general appearance of the world.
Things like area lighting, zone lighting, clouds, the sky sphere (ie the color gradient of the sky), stars (ie sky boxes) are all managed by DayNight.
DayNight::DarkenColor
CImVector DayNight::DarkenColor(CImVector const &clr, float amount) {
C3Vector rgb;
C3Vector hsv;
rgb.x = clr->r / 255.0;
rgb.y = clr->g / 255.0;
rgb.z = clr->b / 255.0;
hsv.x = 0.0;
hsv.y = 0.0;
hsv.z = 0.0;
RGBtoHSV(&rgb, &hsv);
hsv.z = hsv.z * amount;
HSVtoRGB(&hsv, &rgb);
CImVector result;
CImVector::operator=(&result, &rgb);
return result;
}
DayNight::SetDirection
DayNight::SetDirection calculates a C3Vector containing the direction vector for the global light, aka sunDir.
This direction vector is transformed by the view matrix prior to being uploaded to the shader.
void DayNight::SetDirection() {
// Phi Table
if ( !(dword_D39104 & 1) ) {
dword_D39104 |= 1u;
DayNight::phiTable = {
{ 0.0, 2.2165682 },
{ 0.25, 1.9198623 },
{ 0.5, 2.2165682 },
{ 0.75, 1.9198623 }
};
}
// Theta Table
if ( !(dword_D39104 & 2) ) {
dword_D39104 |= 2;
DayNight::thetaTable = {
{ 0.0, 3.926991 },
{ 0.25, 3.926991 },
{ 0.5, 3.926991 },
{ 0.75, 3.926991 }
};
}
// D38B04: float DNInfo->dayProgression (0.0 to 1.0)
float phi = DayNight::InterpTable(&DayNight::phiTable, 4u, flt_D38B04);
float theta = DayNight::InterpTable(&DayNight::thetaTable, 4u, flt_D38B04);
// Convert from spherical coordinates to XYZ
// x = rho * sin(phi) * cos(theta)
// y = rho * sin(phi) * sin(theta)
// z = rho * cos(phi)
float sinPhi = CMath::sinoid(phi);
float cosPhi = CMath::cosoid(phi);
float sinTheta = CMath::sinoid(theta);
float cosTheta = CMath::cosoid(theta);
// D38C9C: C3Vector sunDir
dword_D38C9C.x = sinPhi * cosTheta;
dword_D38C9C.y = sinPhi * sinTheta;
dword_D38C9C.z = cosPhi;
}
DayNight::SetLightColors
void DayNight::SetLightColors() {
unsigned __int16 v0; // bx@1
int v1; // eax@1
int v2; // ebx@1
int v6; // [sp+28h] [bp-Ch]@1
int v7; // [sp+2Ch] [bp-8h]@1
int v8; // [sp+30h] [bp-4h]@1
// Light colors
DayNight::g_dnInfo.lightInfo.dirColor = DayNight::g_dnInfo.light.dirColor;
DayNight::g_dnInfo.lightInfo.ambColor = DayNight::g_dnInfo.light.ambColor;
// Window light colors
// MOMT.flags & F_WINDOW
CImVector windowDirColor = DayNight::g_dnInfo.light.dirColor;
CImVector::Blend255_(&windowDirColor, 128u, &DayNight::g_dnInfo.light.ambColor);
CImVector windowAmbColor = DayNight::g_dnInfo.light.ambColor;
CImVector::Blend255_(&windowAmbColor, 128u, &DayNight::g_dnInfo.light.dirColor);
windowAmbColor.r = std::min(windowAmbColor.r, 16u);
windowAmbColor.g = std::min(windowAmbColor.g, 16u);
windowAmbColor.b = std::min(windowAmbColor.b, 16u);
windowAmbColor.a = windowAmbColor.a - 1; // 0 wraps to 255
DayNight::g_dnInfo.lightInfo.windowDirColor = windowDirColor;
DayNight::g_dnInfo.lightInfo.windowAmbColor = windowAmbColor;
// Shadow color
// TODO: Clean up
BYTE1(v1) = (unsigned __int16)(85 * (DayNight::g_dnInfo.light.ambColor.r + 3)) >> 8;
LOBYTE(v1) = (unsigned __int16)(85 * (DayNight::g_dnInfo.light.ambColor.g + 3)) >> 8;
DayNight::g_dnInfo.shadowColor = (CImVector)(*(_DWORD *)&DayNight::g_dnInfo.light.ambColor & 0xFF000000 | ((unsigned __int16)(85 * (DayNight::g_dnInfo.light.ambColor.b + 3)) >> 8) | ((unsigned __int16)v1 << 8));
DayNight::g_dnInfo.shadowColor.a = DayNight::g_dnInfo.light.shadowOpacity.r;
// TODO: What is unkLightInfo?
DayNight::g_dnInfo.unkLightInfo.dir.x = DayNight::g_dnInfo.lightInfo.dir.x;
DayNight::g_dnInfo.unkLightInfo.dir.y = DayNight::g_dnInfo.lightInfo.dir.y;
DayNight::g_dnInfo.unkLightInfo.dir.z = DayNight::g_dnInfo.lightInfo.dir.z;
DayNight::g_dnInfo.unkLightInfo.dirColor = DayNight::g_dnInfo.light.dirColor;
DayNight::g_dnInfo.unkLightInfo.ambColor = DayNight::g_dnInfo.light.ambColor;
DayNight::g_dnInfo.unkLightInfo.windowDirColor = DayNight::g_dnInfo.lightInfo.windowDirColor;
DayNight::g_dnInfo.unkLightInfo.windowAmbColor = DayNight::g_dnInfo.lightInfo.windowAmbColor;
DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.x = DayNight::g_dnInfo.lightInfo.shaderShadowColor.x;
DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.y = DayNight::g_dnInfo.lightInfo.shaderShadowColor.y;
DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.z = DayNight::g_dnInfo.lightInfo.shaderShadowColor.z;
DayNight::g_dnInfo.unkLightInfo.shaderShadowColor.w = DayNight::g_dnInfo.lightInfo.shaderShadowColor.w;
// Shader shadow color
C3Vector rgb;
rgb.x = DayNight::g_dnInfo.light.ambColor.r / 255.0f;
rgb.y = DayNight::g_dnInfo.light.ambColor.g / 255.0f;
rgb.z = DayNight::g_dnInfo.light.ambColor.b / 255.0f;
C3Vector hsv;
hsv.x = 0.0;
hsv.y = 0.0;
hsv.z = 0.0;
RGBtoHSV(&rgb, &hsv);
hsv.y = hsv.y * 0.33000001;
hsv.z = hsv.z * 1.25;
HSVtoRGB(&hsv, &rgb);
DayNight::g_dnInfo.lightInfo.shaderShadowColor.x = rgb.x;
DayNight::g_dnInfo.lightInfo.shaderShadowColor.y = rgb.y;
DayNight::g_dnInfo.lightInfo.shaderShadowColor.z = rgb.z;
DayNight::g_dnInfo.lightInfo.shaderShadowColor.w = 1.0;
}