Rendering/DayNight: Difference between revisions

From wowdev
Jump to navigation Jump to search
(Add initial reversal of DayNight::SetLightColors)
Line 113: Line 113:
   DayNight::g_dnInfo.lightInfo.ambColor = DayNight::g_dnInfo.light.ambColor;
   DayNight::g_dnInfo.lightInfo.ambColor = DayNight::g_dnInfo.light.ambColor;


   v7 = DayNight::g_dnInfo.light.dirColor.g;
   CImVector windowDirColor = DayNight::g_dnInfo.light.dirColor;
  v8 = DayNight::g_dnInfo.light.ambColor.b;
   CImVector::Blend255_(&windowDirColor, 128u, &DayNight::g_dnInfo.light.ambColor);
  HIBYTE(v0) = DayNight::g_dnInfo.light.ambColor.r
   DayNight::g_dnInfo.lightInfo.windowDirColor = windowDirColor;
            + ((unsigned __int16)(DayNight::g_dnInfo.light.dirColor.r - DayNight::g_dnInfo.light.ambColor.r) >> 1);
  LOBYTE(v0) = DayNight::g_dnInfo.light.ambColor.g
            + ((unsigned __int16)(DayNight::g_dnInfo.light.dirColor.g - DayNight::g_dnInfo.light.ambColor.g) >> 1);
  v1 = (v0 << 8) | (unsigned __int8)(DayNight::g_dnInfo.light.ambColor.b
                                  + ((unsigned __int16)(DayNight::g_dnInfo.light.dirColor.b
                                                      - DayNight::g_dnInfo.light.ambColor.b) >> 1));
   HIBYTE(v0) = DayNight::g_dnInfo.light.dirColor.r
            + ((unsigned __int16)(DayNight::g_dnInfo.light.ambColor.r - DayNight::g_dnInfo.light.dirColor.r) >> 1);
   LOBYTE(v0) = DayNight::g_dnInfo.light.dirColor.g
            + ((unsigned __int16)(DayNight::g_dnInfo.light.ambColor.g - DayNight::g_dnInfo.light.dirColor.g) >> 1);
  v2 = v0 << 8;


   DayNight::g_dnInfo.lightInfo.windowAmbColor =
   CImVector windowAmbColor = DayNight::g_dnInfo.light.ambColor;
    (CImVector)((v1 - 0xEFEFF0 - (((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100)) | ((((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100) - ((((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100) >> 8)));
  CImVector::Blend255_(&windowAmbColor, 128u, &DayNight::g_dnInfo.light.dirColor);


   DayNight::g_dnInfo.lightInfo.windowDirColor =
   uint32_t v1 = (uint32_t)windowAmbColor;
    (CImVector)(v2 | (unsigned __int8)(DayNight::g_dnInfo.light.dirColor.b + ((unsigned __int16)(DayNight::g_dnInfo.light.ambColor.b - DayNight::g_dnInfo.light.dirColor.b) >> 1)));
  v1 = (v1 - 0xEFEFF0 - (((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100)) | ((((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100) - ((((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100) >> 8)));
  DayNight::g_dnInfo.lightInfo.windowAmbColor = (CImVector)v1;


   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;

Revision as of 16:23, 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

  DayNight::g_dnInfo.lightInfo.dirColor = DayNight::g_dnInfo.light.dirColor;
  DayNight::g_dnInfo.lightInfo.ambColor = DayNight::g_dnInfo.light.ambColor;

  CImVector windowDirColor = DayNight::g_dnInfo.light.dirColor;
  CImVector::Blend255_(&windowDirColor, 128u, &DayNight::g_dnInfo.light.ambColor);
  DayNight::g_dnInfo.lightInfo.windowDirColor = windowDirColor;

  CImVector windowAmbColor = DayNight::g_dnInfo.light.ambColor;
  CImVector::Blend255_(&windowAmbColor, 128u, &DayNight::g_dnInfo.light.dirColor);

  uint32_t v1 = (uint32_t)windowAmbColor;
  v1 = (v1 - 0xEFEFF0 - (((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100)) | ((((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100) - ((((v1 - 0xEFEFF0) ^ v1 ^ 0xFFFEFEFF) & 0x1010100) >> 8)));
  DayNight::g_dnInfo.lightInfo.windowAmbColor = (CImVector)v1;

  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;

  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;

  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;

}