|
= |
|
|
|
|
|
|
|
|
|
|
| |
|
|
| 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; |
| |
|
|
| } |
|
} |