|
= |
|
|
|
|
|
|
|
|
|
|
|
|
|
package com.maddox.il2.engine; |
|
package com.maddox.il2.engine; |
|
|
|
import com.maddox.JGP.Vector3f; |
|
import com.maddox.JGP.Vector3f; |
import com.maddox.il2.game.Main3D; |
|
import com.maddox.il2.game.Main3D; |
|
-+ |
import com.maddox.il2.game.Mission; |
import com.maddox.rts.CfgInt; |
= |
import com.maddox.rts.CfgInt; |
|
-+ |
import java.util.GregorianCalendar; |
|
= |
|
|
|
|
// Config, EffClouds, Engine, Landscape, |
<> |
// Config, MoonPhase, EffClouds, Engine, |
// LandConf, RenderContext |
|
// Landscape, LandConf, RenderContext |
|
= |
|
public class Sun |
|
public class Sun |
{ |
|
{ |
|
|
|
public Sun() |
|
public Sun() |
{ |
|
{ |
ToLight = new Vector3f(); |
|
ToLight = new Vector3f(); |
SunV = new Vector3f(); |
|
SunV = new Vector3f(); |
ToSun = new Vector3f(); |
|
ToSun = new Vector3f(); |
ToMoon = new Vector3f(); |
|
ToMoon = new Vector3f(); |
MoonPhase = 0.5F; |
<> |
moonPhase = 0.5F; |
|
|
tod = 0.0F; |
|
|
darkness = 1.0F; |
|
|
sunMultiplier = 1.0F; |
SunV.set(0.0F, 0.0F, -1F); |
= |
SunV.set(0.0F, 0.0F, -1F); |
ToSun.set(SunV); |
|
ToSun.set(SunV); |
ToSun.negate(); |
|
ToSun.negate(); |
ToMoon.set(ToSun); |
|
ToMoon.set(ToSun); |
ToMoon.negate(); |
|
ToMoon.negate(); |
ToLight.set(ToSun); |
|
ToLight.set(ToSun); |
Ambient = 0.5F; |
|
Ambient = 0.5F; |
Diffuze = 0.5F; |
|
Diffuze = 0.5F; |
Specular = 1.0F; |
|
Specular = 1.0F; |
Red = 1.0F; |
|
Red = 1.0F; |
Green = 1.0F; |
|
Green = 1.0F; |
Blue = 1.0F; |
|
Blue = 1.0F; |
} |
|
} |
|
|
|
public void activate() |
|
public void activate() |
{ |
|
{ |
if(Config.isUSE_RENDER()) |
|
if(Config.isUSE_RENDER()) |
setNative(ToLight.x, ToLight.y, ToLight.z, Ambient, Diffuze, Specular, Red, Green, Blue); |
|
setNative(ToLight.x, ToLight.y, ToLight.z, Ambient, Diffuze, Specular, Red, Green, Blue); |
} |
|
} |
|
|
|
public void set(Vector3f vector3f) |
|
public void set(Vector3f vector3f) |
{ |
|
{ |
SunV.set(vector3f); |
|
SunV.set(vector3f); |
ToSun.set(SunV); |
|
ToSun.set(SunV); |
ToSun.negate(); |
|
ToSun.negate(); |
ToLight.set(ToSun); |
|
ToLight.set(ToSun); |
} |
|
} |
|
|
|
public void setLight(float f, float f1, float f2, float f3, float f4, float f5) |
|
public void setLight(float f, float f1, float f2, float f3, float f4, float f5) |
{ |
|
{ |
Ambient = f; |
|
Ambient = f; |
Diffuze = f1; |
|
Diffuze = f1; |
Specular = f2; |
|
Specular = f2; |
Red = f3; |
|
Red = f3; |
Green = f4; |
|
Green = f4; |
Blue = f5; |
|
Blue = f5; |
} |
|
} |
|
|
|
public void setAstronomic(int i, int j, int k, int l, int i1, int j1) |
|
public void setAstronomic(int i, int j, int k, int l, int i1, int j1) |
{ |
|
{ |
setAstronomic(i, j, k, (float)l + (float)i1 / 60F + (float)j1 / 3600F); |
|
setAstronomic(i, j, k, (float)l + (float)i1 / 60F + (float)j1 / 3600F); |
} |
|
} |
|
|
|
public void setAstronomic(int i, int j, int k, float f) |
|
public void setAstronomic(int i, int j, int k, float f) |
{ |
|
{ |
|
<> |
setAstronomic(i, j, k, f, 1.0F, 1.0F, 1.0F); |
|
|
} |
|
|
|
|
|
public void resetCalendar() |
|
|
{ |
|
|
missionDate = null; |
|
|
} |
|
|
|
|
|
public void setAstronomic(int i, int j, int k, float f, float f1, float f2, float f3) |
|
|
{ |
float f2 = (float)(90 - i) * DEG2RAD; |
|
float f5 = (float)(90 - i) * DEG2RAD; |
float f3 = (float)Math.cos(f2); |
|
float f6 = (float)Math.cos(f5); |
float f4 = (float)Math.sin(f2); |
|
float f7 = (float)Math.sin(f5); |
float f1 = (float)((j * 30 + k) - 80) * DEG2RAD; |
|
float f4 = (float)((j * 30 + k) - 80) * DEG2RAD; |
float f5 = (6.283185F * f) / 24F; |
|
float f8 = (6.283185F * f) / 24F; |
float f6 = (float)Math.sin(f5); |
|
float f9 = (float)Math.sin(f8); |
float f7 = (float)Math.cos(f5); |
|
float f10 = (float)Math.cos(f8); |
float f8 = (float)Math.sin(22.5F * DEG2RAD * (float)Math.sin(f1)); |
|
float f11 = (float)Math.sin(22.5F * DEG2RAD * (float)Math.sin(f4)); |
ToSun.x = f6; |
|
ToSun.x = f9; |
ToSun.y = f7 * f3 + f8 * f4; |
|
ToSun.y = f10 * f6 + f11 * f7; |
ToSun.z = f8 * f3 - f7 * f4; |
|
ToSun.z = f11 * f6 - f10 * f7; |
ToSun.normalize(); |
= |
ToSun.normalize(); |
SunV.x = -ToSun.x; |
|
SunV.x = -ToSun.x; |
SunV.y = -ToSun.y; |
|
SunV.y = -ToSun.y; |
SunV.z = -ToSun.z; |
|
SunV.z = -ToSun.z; |
MoonPhase = ((float)(j * 30 + k) % 29.53F) / 29.53F; |
<> |
int l = Mission.curYear(); |
|
|
int i1 = (int)Math.floor(f); |
|
|
int j1 = (int)((f - (float)i1) * 60F); |
|
|
int k1 = 0; |
|
|
if(missionDate == null) |
|
|
missionDate = new GregorianCalendar(l, j - 1, k, i1, j1, k1); |
|
|
else |
|
|
if(f != tod) |
|
|
missionDate.roll(13, true); |
|
|
tod = f; |
|
|
double ad[] = new double[10]; |
|
|
ad = MoonPhase.phase(missionDate); |
|
|
moonPhase = (float)ad[0]; |
f1 = (float)((j * 30 + k) - 80) * DEG2RAD; |
|
f4 = (float)((j * 30 + k) - 80) * DEG2RAD; |
f5 = 6.283185F * (-MoonPhase + f / 24F); |
|
f8 = 6.283185F * (-moonPhase + f / 24F); |
f6 = (float)Math.sin(f5); |
|
f9 = (float)Math.sin(f8); |
f7 = (float)Math.cos(f5); |
|
f10 = (float)Math.cos(f8); |
f8 = (float)Math.sin(22.5F * DEG2RAD * (float)Math.sin(f1)); |
|
f11 = (float)Math.sin(22.5F * DEG2RAD * (float)Math.sin(f4)); |
ToMoon.x = f6; |
|
ToMoon.x = f9; |
ToMoon.y = f7 * f3 + f8 * f4; |
|
ToMoon.y = f10 * f6 + f11 * f7; |
ToMoon.z = f8 * f3 - f7 * f4; |
|
ToMoon.z = f11 * f6 - f10 * f7; |
ToMoon.normalize(); |
= |
ToMoon.normalize(); |
boolean flag = true; |
|
boolean flag = true; |
float f10 = 1.0F - 2.0F * Math.abs(MoonPhase - 0.5F); |
<> |
float f13 = 1.0F - 2.0F * Math.abs(moonPhase - 0.5F); |
float f11 = (ToMoon.z - 0.1F) * 7F; |
|
float f14 = (ToMoon.z - 0.1F) * 7F; |
if(f11 < 0.0F) |
|
if(f14 < 0.0F) |
f11 = 0.0F; |
|
f14 = 0.0F; |
if(f11 > 1.0F) |
|
if(f14 > 1.0F) |
f11 = 1.0F; |
|
f14 = 1.0F; |
float f12 = -1F + 0.15F * (f10 - 0.2F) * f11; |
|
float f15 = -1F + 0.15F * (f13 - 0.2F) * f14; |
float f9 = (ToSun.z + 0.11F) * 4F; |
|
float f12 = (ToSun.z + 0.11F) * 4F; |
if(f9 >= 1.0F) |
|
if(f12 >= 1.0F) |
f9 = 1.0F; |
|
f12 = 1.0F; |
else |
= |
else |
if(f9 <= f12) |
<> |
if(f12 <= f15) |
{ |
= |
{ |
if(ToMoon.z > 0.1F && f10 > 0.2F) |
<> |
if(ToMoon.z > 0.1F && f13 > 0.2F) |
flag = false; |
= |
flag = false; |
f9 = f12; |
<> |
f12 = f15; |
} |
= |
} |
f9 = f9 * 0.5F + 0.5F; |
<> |
f12 = f12 * 0.5F + 0.5F; |
float f13 = 0.2F + f9 * 1.25F; |
|
float f16 = 0.2F + f12 * 1.25F; |
Diffuze = 0.05F + f9 * 0.95F; |
|
Diffuze = 0.05F + f12 * 0.95F; |
Specular = 0.4F + f9 * 0.6F; |
|
Specular = 0.4F + f12 * 0.6F; |
Ambient = f13 - Diffuze; |
|
Ambient = f16 - Diffuze; |
if(Config.isUSE_RENDER()) |
= |
if(Config.isUSE_RENDER()) |
{ |
|
{ |
if(Main3D.cur3D().clouds != null && Main3D.cur3D().clouds.type() > 4) |
|
if(Main3D.cur3D().clouds != null && Main3D.cur3D().clouds.type() > 4) |
{ |
|
{ |
float f14 = 0.2F + f9 * 0.7F; |
<> |
float f17 = 0.2F + f12 * 0.7F; |
Diffuze = 0.05F + f9 * 0.95F * 0.4F; |
|
Diffuze = 0.05F + f12 * 0.95F * 0.4F; |
Specular = 0.4F + f9 * 0.6F * 0.5F; |
|
Specular = 0.4F + f12 * 0.6F * 0.5F; |
Ambient = f14 - Diffuze; |
|
Ambient = f17 - Diffuze; |
} |
= |
} |
if(Engine.land().config.camouflage.equalsIgnoreCase("WINTER") && RenderContext.cfgHardwareShaders.get() > 0) |
|
if(Engine.land().config.camouflage.equalsIgnoreCase("WINTER") && RenderContext.cfgHardwareShaders.get() > 0) |
{ |
|
{ |
float f15 = (ToSun.z - 0.1F) * 7F; |
<> |
float f18 = (ToSun.z - 0.1F) * 7F; |
if(f15 < 0.0F) |
|
if(f18 < 0.0F) |
f15 = 0.0F; |
|
f18 = 0.0F; |
if(f15 > 1.0F) |
|
if(f18 > 1.0F) |
f15 = 1.0F; |
|
f18 = 1.0F; |
Ambient *= 1.0F * (1.0F - f15) + 1.7F * f15; |
|
Ambient *= 1.0F * (1.0F - f18) + 1.7F * f18; |
Diffuze *= 1.0F * (1.0F - f15) + 0.6F * f15; |
|
Diffuze *= 1.0F * (1.0F - f18) + 0.6F * f18; |
} |
= |
} |
|
-+ |
float f19 = 1.0F; |
|
|
darkness = 0.095F + f13 * 0.666F; |
|
|
sunMultiplier = cvt(ToSun.z, -0.6F, 0.0F, darkness, 1.0F); |
|
|
f19 = cvt(sunMultiplier, darkness, 1.0F, 0.5F, 1.0F); |
|
|
Ambient *= f1 * sunMultiplier; |
|
|
Specular *= f2 * f19; |
|
|
Diffuze *= f3 * sunMultiplier; |
} |
= |
} |
if(flag) |
|
if(flag) |
{ |
|
{ |
Red = Green = Blue = 1.0F; |
|
Red = Green = Blue = 1.0F; |
float f16 = 1.0F - Math.abs(ToSun.z) * 4F; |
<> |
float f20 = 1.0F - Math.abs(ToSun.z) * 4F; |
if(f16 > 0.0F) |
|
if(f20 > 0.0F) |
{ |
= |
{ |
Green = 1.0F - 0.6F * f16; |
<> |
Green = 1.0F - 0.6F * f20; |
Blue = 1.0F - 0.7F * f16; |
|
Blue = 1.0F - 0.7F * f20; |
} |
= |
} |
ToLight.set(ToSun); |
|
ToLight.set(ToSun); |
if(ToSun.z < 0.0F) |
|
if(ToSun.z < 0.0F) |
{ |
|
{ |
ToLight.z = 0.0F; |
|
ToLight.z = 0.0F; |
ToLight.normalize(); |
|
ToLight.normalize(); |
} |
|
} |
} else |
|
} else |
{ |
|
{ |
Red = 0.7F * f10; |
<> |
Red = 0.7F * f13; |
Green = Blue = f10; |
|
Green = Blue = f13; |
ToLight.set(ToMoon); |
= |
ToLight.set(ToMoon); |
} |
|
} |
activate(); |
|
activate(); |
|
-+ |
} |
|
|
|
|
|
private static float cvt(float f, float f1, float f2, float f3, float f4) |
|
|
{ |
|
|
f = Math.min(Math.max(f, f1), f2); |
|
|
return f3 + ((f4 - f3) * (f - f1)) / (f2 - f1); |
} |
= |
} |
|
|
|
private static native void setNative(float f, float f1, float f2, float f3, float f4, float f5, float f6, float f7, |
|
private static native void setNative(float f, float f1, float f2, float f3, float f4, float f5, float f6, float f7, |
float f8); |
|
float f8); |
|
|
|
public Vector3f ToLight; |
|
public Vector3f ToLight; |
public Vector3f SunV; |
|
public Vector3f SunV; |
public Vector3f ToSun; |
|
public Vector3f ToSun; |
public Vector3f ToMoon; |
|
public Vector3f ToMoon; |
public float Ambient; |
|
public float Ambient; |
public float Diffuze; |
|
public float Diffuze; |
public float Specular; |
|
public float Specular; |
public float Red; |
|
public float Red; |
public float Green; |
|
public float Green; |
public float Blue; |
|
public float Blue; |
public float MoonPhase; |
<> |
public float moonPhase; |
|
|
private static GregorianCalendar missionDate = null; |
|
|
private float tod; |
|
|
private static final float MAX_DARKNESS = 0.095F; |
|
|
public float darkness; |
|
|
public float sunMultiplier; |
private static float DEG2RAD = 0.01745329F; |
= |
private static float DEG2RAD = 0.01745329F; |
|
|
|
} |
|
} |