Fixed planet spining while in orbit
Added star colorization
This commit is contained in:
parent
71857b21bc
commit
a6a6adcfbd
1 changed files with 123 additions and 54 deletions
|
@ -4,6 +4,7 @@ import cr0s.warpdrive.WarpDrive;
|
|||
import cr0s.warpdrive.config.WarpDriveConfig;
|
||||
import cr0s.warpdrive.data.CelestialObject;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -282,8 +283,8 @@ public class RenderSpaceSky extends IRenderHandler {
|
|||
final double transitionOrbit = Math.max(0.0D, Math.min(PLANET_ORBIT, distanceToBorder)) / PLANET_ORBIT;
|
||||
|
||||
// relative position above celestialObject
|
||||
final double offsetX = (1.0 - transitionOrbit) * (celestialObject.borderRadiusX - distanceToCenterX) / celestialObject.borderRadiusX;
|
||||
final double offsetZ = (1.0 - transitionOrbit) * (celestialObject.borderRadiusZ - distanceToCenterZ) / celestialObject.borderRadiusZ;
|
||||
final double offsetX = (1.0 - transitionOrbit) * (distanceToCenterX / celestialObject.borderRadiusX);
|
||||
final double offsetZ = (1.0 - transitionOrbit) * (distanceToCenterZ / celestialObject.borderRadiusZ);
|
||||
|
||||
// simulating a non-planar universe...
|
||||
final double planetY_far = (celestialObject.dimensionId + 99 % 100 - 50) * Math.log(distanceToCenter) / 4.0D;
|
||||
|
@ -307,7 +308,13 @@ public class RenderSpaceSky extends IRenderHandler {
|
|||
@SuppressWarnings("SuspiciousNameCombination")
|
||||
final double angleV_far = Math.atan2(Math.sqrt(distanceToCenterX * distanceToCenterX + distanceToCenterZ * distanceToCenterZ), planetY);
|
||||
final double angleV = Math.PI * (1.0D - transitionOrbit) + angleV_far * transitionOrbit;
|
||||
final double angleS = 0.15D * celestialObject.dimensionId * transitionApproaching; // + (world.getTotalWorldTime() + partialTicks) * Math.PI / 6000.0D;
|
||||
final double angleS = 0.15D * celestialObject.dimensionId * transitionApproaching // + (world.getTotalWorldTime() + partialTicks) * Math.PI / 6000.0D;
|
||||
+ angleH * (1.0D - transitionApproaching);
|
||||
|
||||
if (celestialObject.dimensionId == 1 && (Minecraft.getSystemTime() / 10) % 100 == 0) {
|
||||
WarpDrive.logger.info(String.format("transition Far %.2f Approaching %.2f Orbit %.2f distanceToCenter %.3f %.3f offset %.3f %.3f angle H %.3f V_far %.3f V %.3f S %.3f",
|
||||
transitionFar, transitionApproaching, transitionOrbit, distanceToCenterX, distanceToCenterZ, offsetX, offsetZ, angleH, angleV_far, angleV, angleS));
|
||||
}
|
||||
|
||||
// pre-computations
|
||||
final double sinH = Math.sin(angleH);
|
||||
|
@ -328,9 +335,9 @@ public class RenderSpaceSky extends IRenderHandler {
|
|||
final double valH = offset2 * cosS + offset1 * sinS;
|
||||
final double y = valV * sinV + renderRange * cosV;
|
||||
final double valD = renderRange * sinV - valV * cosV;
|
||||
final double x = valD * sinH - valH * cosH;
|
||||
final double z = valH * sinH + valD * cosH;
|
||||
tessellator.addVertexWithUV(100 * (1 - offsetX) + x, y, 100 * (1 - offsetZ) + z, (indexVertex & 2) / 2, (indexVertex + 1 & 2) / 2);
|
||||
final double x = valD * sinH - valH * cosH + renderSize * offsetX;
|
||||
final double z = valH * sinH + valD * cosH + renderSize * offsetZ;
|
||||
tessellator.addVertexWithUV(x, y, z, (indexVertex & 2) / 2, (indexVertex + 1 & 2) / 2);
|
||||
}
|
||||
tessellator.draw();
|
||||
|
||||
|
@ -341,59 +348,121 @@ public class RenderSpaceSky extends IRenderHandler {
|
|||
final Random rand = new Random(10842L);
|
||||
final boolean hasMoreStars = rand.nextBoolean() || rand.nextBoolean();
|
||||
final Tessellator tessellator = Tessellator.instance;
|
||||
tessellator.startDrawingQuads();
|
||||
|
||||
for (int indexStars = 0; indexStars < (hasMoreStars ? 20000 : 6000); indexStars++) {
|
||||
double randomX = rand.nextDouble() * 2.0D - 1.0D;
|
||||
double randomY = rand.nextDouble() * 2.0D - 1.0D;
|
||||
double randomZ = rand.nextDouble() * 2.0D - 1.0D;
|
||||
final double lambda = 1.2D;
|
||||
final double renderSize = 0.10F + 0.03F * Math.log(1.0D - rand.nextDouble()) / (-lambda); // random.nextFloat() * 0.5F;
|
||||
double randomLength = randomX * randomX + randomY * randomY + randomZ * randomZ;
|
||||
final double renderRangeMax = 200.0D;
|
||||
for (int indexStars = 0; indexStars < (hasMoreStars ? 20000 : 2000); indexStars++) {
|
||||
double randomX;
|
||||
double randomY;
|
||||
double randomZ;
|
||||
double randomLength;
|
||||
do {
|
||||
randomX = rand.nextDouble() * 2.0D - 1.0D;
|
||||
randomY = rand.nextDouble() * 2.0D - 1.0D;
|
||||
randomZ = rand.nextDouble() * 2.0D - 1.0D;
|
||||
randomLength = randomX * randomX + randomY * randomY + randomZ * randomZ;
|
||||
} while (randomLength >= 1.0D || randomLength <= 0.90D);
|
||||
|
||||
if (randomLength < 1.0D && randomLength > 0.01D) {
|
||||
// forcing Z-order
|
||||
randomLength = 1.0D / Math.sqrt(randomLength);
|
||||
randomX *= randomLength;
|
||||
randomY *= randomLength;
|
||||
randomZ *= randomLength;
|
||||
|
||||
// scaling
|
||||
final double x0 = randomX * 100.0D;
|
||||
final double y0 = randomY * 100.0D;
|
||||
final double z0 = randomZ * 100.0D;
|
||||
|
||||
// angles
|
||||
@SuppressWarnings("SuspiciousNameCombination")
|
||||
final double angleH = Math.atan2(randomX, randomZ);
|
||||
@SuppressWarnings("SuspiciousNameCombination")
|
||||
final double angleV = Math.atan2(Math.sqrt(randomX * randomX + randomZ * randomZ), randomY);
|
||||
final double angleS = rand.nextDouble() * Math.PI * 2.0D;
|
||||
|
||||
// pre-computations
|
||||
final double sinH = Math.sin(angleH);
|
||||
final double cosH = Math.cos(angleH);
|
||||
final double sinV = Math.sin(angleV);
|
||||
final double cosV = Math.cos(angleV);
|
||||
final double sinS = Math.sin(angleS);
|
||||
final double cosS = Math.cos(angleS);
|
||||
|
||||
for (int indexVertex = 0; indexVertex < 4; indexVertex++) {
|
||||
final double valZero = 0.0D;
|
||||
final double offset1 = ((indexVertex & 2) - 1) * renderSize;
|
||||
final double offset2 = ((indexVertex + 1 & 2) - 1) * renderSize;
|
||||
final double valV = offset1 * cosS - offset2 * sinS;
|
||||
final double valH = offset2 * cosS + offset1 * sinS;
|
||||
final double y1 = valV * sinV + valZero * cosV;
|
||||
final double valD = valZero * sinV - valV * cosV;
|
||||
final double x1 = valD * sinH - valH * cosH;
|
||||
final double z1 = valH * sinH + valD * cosH;
|
||||
tessellator.addVertex(x0 + x1, y0 + y1, z0 + z1);
|
||||
}
|
||||
final double renderSize = 0.4F + 0.05F * Math.log(1.1D - rand.nextDouble());
|
||||
|
||||
// forcing Z-order
|
||||
randomLength = 1.0D / Math.sqrt(randomLength);
|
||||
randomX *= randomLength;
|
||||
randomY *= randomLength;
|
||||
randomZ *= randomLength;
|
||||
|
||||
// scaling
|
||||
final double x0 = randomX * renderRangeMax;
|
||||
final double y0 = randomY * renderRangeMax;
|
||||
final double z0 = randomZ * renderRangeMax;
|
||||
|
||||
// angles
|
||||
@SuppressWarnings("SuspiciousNameCombination")
|
||||
final double angleH = Math.atan2(randomX, randomZ);
|
||||
@SuppressWarnings("SuspiciousNameCombination")
|
||||
final double angleV = Math.atan2(Math.sqrt(randomX * randomX + randomZ * randomZ), randomY);
|
||||
final double angleS = rand.nextDouble() * Math.PI * 2.0D;
|
||||
|
||||
// colorization
|
||||
final int rgb = getStarColorRGB(rand);
|
||||
GL11.glColor4f(((rgb >> 16) & 0xFF) / 255.0F, ((rgb >> 8) & 0xFF) / 255.0F, (rgb & 0xFF) / 255.0F, 1.0F /* isSpace ? 1.0F : 0.2F /**/);
|
||||
|
||||
// pre-computations
|
||||
final double sinH = Math.sin(angleH);
|
||||
final double cosH = Math.cos(angleH);
|
||||
final double sinV = Math.sin(angleV);
|
||||
final double cosV = Math.cos(angleV);
|
||||
final double sinS = Math.sin(angleS);
|
||||
final double cosS = Math.cos(angleS);
|
||||
|
||||
tessellator.startDrawingQuads();
|
||||
for (int indexVertex = 0; indexVertex < 4; indexVertex++) {
|
||||
final double valZero = 0.0D;
|
||||
final double offset1 = ((indexVertex & 2) - 1) * renderSize;
|
||||
final double offset2 = ((indexVertex + 1 & 2) - 1) * renderSize;
|
||||
final double valV = offset1 * cosS - offset2 * sinS;
|
||||
final double valH = offset2 * cosS + offset1 * sinS;
|
||||
final double y1 = valV * sinV + valZero * cosV;
|
||||
final double valD = valZero * sinV - valV * cosV;
|
||||
final double x1 = valD * sinH - valH * cosH;
|
||||
final double z1 = valH * sinH + valD * cosH;
|
||||
tessellator.addVertex(x0 + x1, y0 + y1, z0 + z1);
|
||||
}
|
||||
tessellator.draw();
|
||||
}
|
||||
|
||||
tessellator.draw();
|
||||
}
|
||||
|
||||
// colorization loosely inspired from Hertzsprung-Russell diagram
|
||||
// (we're using it for non-star objects too, so yeah...)
|
||||
private static int getStarColorRGB(Random rand) {
|
||||
final double colorType = rand.nextDouble();
|
||||
float hue;
|
||||
float saturation;
|
||||
float brightness = 1.0F - 0.8F * rand.nextFloat(); // distance effect
|
||||
|
||||
if (colorType <= 0.08D) {// 8% light blue (young star)
|
||||
hue = 0.48F + 0.08F * rand.nextFloat();
|
||||
saturation = 0.18F + 0.22F * rand.nextFloat();
|
||||
|
||||
} else if (colorType <= 0.24D) {// 22% pure white (early age)
|
||||
hue = 0.126F + 0.040F * rand.nextFloat();
|
||||
saturation = 0.00F + 0.15F * rand.nextFloat();
|
||||
brightness *= 0.95F;
|
||||
|
||||
} else if (colorType <= 0.45D) {// 21% yellow white
|
||||
hue = 0.126F + 0.040F * rand.nextFloat();
|
||||
saturation = 0.15F + 0.15F * rand.nextFloat();
|
||||
brightness *= 0.90F;
|
||||
|
||||
} else if (colorType <= 0.67D) {// 22% yellow
|
||||
hue = 0.126F + 0.040F * rand.nextFloat();
|
||||
saturation = 0.80F + 0.15F * rand.nextFloat();
|
||||
if (rand.nextInt(3) == 1) {// yellow giant
|
||||
brightness *= 0.90F;
|
||||
} else {
|
||||
brightness *= 0.85F;
|
||||
}
|
||||
|
||||
} else if (colorType <= 0.92D) {// 25% orange
|
||||
hue = 0.055F + 0.055F * rand.nextFloat();
|
||||
saturation = 0.85F + 0.15F * rand.nextFloat();
|
||||
if (rand.nextInt(3) == 1) {// (orange giant)
|
||||
brightness *= 0.90F;
|
||||
} else {
|
||||
brightness *= 0.80F;
|
||||
}
|
||||
|
||||
} else {// red (mostly giants)
|
||||
hue = 0.95F + 0.05F * rand.nextFloat();
|
||||
if (rand.nextInt(3) == 1) {// (red giant)
|
||||
saturation = 0.80F + 0.20F * rand.nextFloat();
|
||||
brightness *= 0.95F;
|
||||
} else {
|
||||
saturation = 0.70F + 0.20F * rand.nextFloat();
|
||||
brightness *= 0.65F;
|
||||
}
|
||||
}
|
||||
return Color.HSBtoRGB(hue, saturation, brightness);
|
||||
}
|
||||
|
||||
private static Vec3 getCustomSkyColor() {
|
||||
|
|
Loading…
Reference in a new issue