Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file modified gradlew
100644 → 100755
Empty file.
93 changes: 56 additions & 37 deletions src/main/java/stellarium/ClientProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import net.minecraft.client.Minecraft;
Expand All @@ -16,28 +18,29 @@
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.relauncher.ReflectionHelper;
import stellarapi.api.SAPICapabilities;
import stellarapi.api.gui.overlay.OverlayRegistry;
import stellarapi.api.lib.config.ConfigManager;
import stellarapi.api.render.IAdaptiveRenderer;
import stellarapi.api.view.IAtmosphereEffect;
import stellarapi.api.view.ICCoordinates;
import stellarapi.api.world.ICelestialWorld;
import stellarapi.api.world.worldset.WorldSet;
import stellarium.api.StellarSkyAPI;
import stellarium.client.ClientSettings;
import stellarium.client.StellarClientFMLHook;
import stellarium.client.overlay.StellarSkyOverlays;
import stellarium.client.overlay.clientcfg.OverlayClientSettingsType;
import stellarium.client.overlay.clock.OverlayClockType;
import stellarium.display.DisplayRegistry;
import stellarium.render.GenericSkyRenderer;
import stellarium.render.SkyModel;
import stellarium.render.SkyRenderer;
import stellarium.render.stellars.QualitySettings;
import stellarium.render.stellars.atmosphere.AtmosphereSettings;
import stellarium.stellars.OpticsHelper;
import stellarium.stellars.StellarManager;
import stellarium.stellars.layer.CelestialManager;
import stellarium.stellars.layer.StellarLayerRegistry;
import stellarium.view.ViewerInfo;
import stellarium.world.StellarScene;
import stellarium.world.landscape.LandscapeClientSettings;

public class ClientProxy extends CommonProxy implements IProxy {

Expand All @@ -51,7 +54,7 @@ public class ClientProxy extends CommonProxy implements IProxy {
private ConfigManager guiConfig;
private CelestialManager celestialManager = new CelestialManager(true);

private SkyModel skyModel;
private Map<World, SkyModel> skyModels = new HashMap<>();

public ClientSettings getClientSettings() {
return this.clientSettings;
Expand All @@ -75,8 +78,11 @@ public void preInit(FMLPreInitializationEvent event) {
OverlayRegistry.registerOverlay("clock", new OverlayClockType(), this.guiConfig);
OverlayRegistry.registerOverlay("clientconfig", new OverlayClientSettingsType(), this.guiConfig);

this.skyModel = new SkyModel(this.celestialManager);
skyModel.initializeSettings(this.clientSettings);
clientSettings.putSubConfig(QualitySettings.KEY, new QualitySettings());
clientSettings.putSubConfig(AtmosphereSettings.KEY, new AtmosphereSettings());
clientSettings.putSubConfig(LandscapeClientSettings.KEY, new LandscapeClientSettings());
StellarLayerRegistry.getInstance().composeSettings(clientSettings);
DisplayRegistry.getInstance().composeSettings(clientSettings);
}

@Override
Expand Down Expand Up @@ -111,25 +117,31 @@ public Entity getDefViewerEntity() {

@Override
public void setupStellarLoad(StellarManager manager) {
World world = manager.getWorld();
SkyModel skyModel = new SkyModel(this.celestialManager, world);
skyModel.stellarLoad(manager);
skyModels.put(world, skyModel);
}

@Override
public void setupDimensionLoad(StellarScene dimManager) {
skyModel.dimensionLoad(dimManager);
skyModels.get(dimManager.getWorld()).dimensionLoad(dimManager);
}

public void onSettingsChanged(ClientSettings settings) {
skyModel.updateSettings(settings);
for(SkyModel skyModel : skyModels.values())
skyModel.updateSettings(settings);

SkyRenderer.INSTANCE.initialize(settings);
}

@SuppressWarnings("deprecation")
@Override
public IAdaptiveRenderer setupSkyRenderer(World world, WorldSet worldSet, String option) {
SkyModel skyModel = skyModels.get(world);
skyModel.updateSettings(this.clientSettings);
SkyRenderer.INSTANCE.initialize(this.clientSettings);
IRenderHandler genericRenderer = new GenericSkyRenderer(this.skyModel);
IRenderHandler genericRenderer = new GenericSkyRenderer(skyModel);
return StellarSkyAPI.getRendererFor(option, genericRenderer);
}

Expand All @@ -140,39 +152,46 @@ public float getScreenWidth() {

@Override
public void updateTick() {
if(clientSettings.checkDirty())
this.onSettingsChanged(this.clientSettings);

Minecraft mc = Minecraft.getMinecraft();
World world = mc.world;
Entity viewer = mc.getRenderViewEntity();

// Placeholder fix for vanilla lighting glitch.
try {
@SuppressWarnings("unchecked")
Set<BlockPos> lightUpdates = (Set<BlockPos>) fieldLightUpdateSet.get(mc.renderGlobal);
Iterator<BlockPos> ite = lightUpdates.iterator();
while(ite.hasNext()) {
BlockPos pos = ite.next();
ite.remove();
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
mc.renderGlobal.markBlockRangeForRenderUpdate(x-1, y-1, z-1, x+1, y+1, z+1);
if(!skyModels.isEmpty()) {
Minecraft mc = Minecraft.getMinecraft();
Entity viewer = mc.getRenderViewEntity();

if(clientSettings.checkDirty())
this.onSettingsChanged(this.clientSettings);

// Placeholder fix for vanilla lighting glitch.
try {
@SuppressWarnings("unchecked")
Set<BlockPos> lightUpdates = (Set<BlockPos>) fieldLightUpdateSet.get(mc.renderGlobal);
Iterator<BlockPos> ite = lightUpdates.iterator();
while(ite.hasNext()) {
BlockPos pos = ite.next();
ite.remove();
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
mc.renderGlobal.markBlockRangeForRenderUpdate(x-1, y-1, z-1, x+1, y+1, z+1);
}
} catch(IllegalAccessException exception) {
throw new IllegalStateException("Illegal access to field " + fieldLightUpdateSet.getName() + ", Unexpected.");
}

if(viewer != null) {
for (SkyModel skyModel : skyModels.values()) {
skyModel.onTick(viewer);
}
}
} catch(IllegalAccessException exception) {
throw new IllegalStateException("Illegal access to field " + fieldLightUpdateSet.getName() + ", Unexpected.");
}

ICelestialWorld cWorld = world.getCapability(SAPICapabilities.CELESTIAL_CAPABILITY, null);
ICCoordinates coordinate = cWorld.getCoordinate();
IAtmosphereEffect sky = cWorld.getSkyEffect();

skyModel.onTick(this.getDefWorld(), new ViewerInfo(coordinate, sky, viewer, 0.0f));
}

@Override
public void addScheduledTask(Runnable runnable) {
Minecraft.getMinecraft().addScheduledTask(runnable);
}

@Override
public void removeSkyModel(World world) {
if(skyModels.containsKey(world))
skyModels.remove(world);
}
}
2 changes: 2 additions & 0 deletions src/main/java/stellarium/CommonProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,6 @@ public void setupStellarLoad(StellarManager manager) { }
@Override
public void setupDimensionLoad(StellarScene dimManager) { }

@Override
public void removeSkyModel(World world) { }
}
2 changes: 2 additions & 0 deletions src/main/java/stellarium/IProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,6 @@ public interface IProxy {

public void setupStellarLoad(StellarManager manager);
public void setupDimensionLoad(StellarScene dimManager);

public void removeSkyModel(World world);
}
14 changes: 12 additions & 2 deletions src/main/java/stellarium/StellarForgeEventHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import net.minecraft.world.World;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import stellarapi.api.SAPICapabilities;
import stellarium.stellars.StellarManager;
import stellarium.stellars.layer.CelestialManager;

Expand All @@ -15,14 +17,14 @@ public void preAttachCapabilities(AttachCapabilitiesEvent<World> event) {
// Check if it's initial
if(!world.isRemote && world.provider.getDimension() != 0)
return;

// Now setup StellarManager here
StellarManager manager = StellarManager.loadOrCreateManager(world);
if(!world.isRemote)
manager.setup(new CelestialManager(false));
// On client - load default before the packet arrives
manager.handleServerWithoutMod();
if(manager.getCelestialManager() == null)
if(manager.getCelestialManager() == null && world.hasCapability(SAPICapabilities.CELESTIAL_CAPABILITY, null))
manager.setup(StellarSky.PROXY.getClientCelestialManager().copyFromClient());
}

Expand All @@ -31,4 +33,12 @@ public void onSyncConfig(ConfigChangedEvent.OnConfigChangedEvent event) {
if(StellarSkyReferences.MODID.equals(event.getModID()))
StellarSky.INSTANCE.getCelestialConfigManager().syncFromGUI();
}

@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload event) {
World world = event.getWorld();

if(world.isRemote)
StellarSky.PROXY.removeSkyModel(world);
}
}
16 changes: 2 additions & 14 deletions src/main/java/stellarium/StellarTickHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,8 @@
public class StellarTickHandler {
@SubscribeEvent
public void tickStart(TickEvent.ClientTickEvent e) {
if(e.phase == TickEvent.Phase.START){
World world = StellarSky.PROXY.getDefWorld();

if(world != null) {
StellarManager manager = StellarManager.getManager(world);
if(manager.getCelestialManager() != null) {
manager.update(world.getWorldTime());
StellarScene dimManager = StellarScene.getScene(world);
if(dimManager != null) {
dimManager.update(world, world.getWorldTime(), world.getTotalWorldTime());
StellarSky.PROXY.updateTick();
}
}
}
if(e.phase == TickEvent.Phase.START) {
StellarSky.PROXY.updateTick();
}
}

Expand Down
15 changes: 4 additions & 11 deletions src/main/java/stellarium/display/DisplayModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,16 @@ public class DisplayModel implements IDisplayInjectable {

List<Delegate> displayList = Lists.newArrayList();

public DisplayModel() {
DisplayRegistry.getInstance().setupDisplay(this);
}

@Override
public <Cfg extends PerDisplaySettings, Cache extends IDisplayCache<Cfg>> void injectDisplay(
IDisplayElementType<Cfg, Cache> type, Cfg settings) {
displayList.add(new Delegate(type, settings));
}

@Override
public SimpleHierarchicalConfig getSubSettings(ClientSettings settings) {
DisplayOverallSettings displaySettings = new DisplayOverallSettings();
settings.putSubConfig("Display", displaySettings);
return displaySettings;
}

public void initializeSettings(ClientSettings settings) {
DisplayRegistry.getInstance().setupDisplay(settings, this);
}

public void updateSettings(ClientSettings settings) {
for(Delegate delegate : this.displayList)
delegate.cache.initialize(settings, delegate.settings);
Expand Down
25 changes: 13 additions & 12 deletions src/main/java/stellarium/display/DisplayRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.google.common.collect.ImmutableList;

import stellarapi.api.lib.config.SimpleHierarchicalConfig;
import stellarium.client.ClientSettings;
import stellarium.display.ecgrid.EcGridType;
import stellarium.display.eqgrid.EqGridType;
Expand Down Expand Up @@ -30,23 +29,25 @@ void register(IDisplayElementType<Cfg, Cache> type) {
builder.add(new RegistryDelegate<Cfg, Cache>(type));
}

public void setupDisplay(ClientSettings settings, IDisplayInjectable injectable) {
SimpleHierarchicalConfig displaySettings = injectable.getSubSettings(settings);
public void composeSettings(ClientSettings settings) {
DisplayOverallSettings displaySettings = new DisplayOverallSettings();
settings.putSubConfig("Display", displaySettings);
for(RegistryDelegate delegate : builder.build())
delegate.inject(displaySettings, injectable);
displaySettings.putSubConfig(delegate.type.getName(), delegate.perDisplay);
}

public void setupDisplay(IDisplayInjectable injectable) {
for(RegistryDelegate delegate : builder.build())
injectable.injectDisplay(delegate.type, delegate.perDisplay);
}

private static class RegistryDelegate<Cfg extends PerDisplaySettings, Cache extends IDisplayCache<Cfg>> {
private RegistryDelegate(IDisplayElementType<Cfg, Cache> input) {
this.type = input;
}

private IDisplayElementType<Cfg, Cache> type;
private Cfg perDisplay;

public void inject(SimpleHierarchicalConfig settings, IDisplayInjectable injectable) {
Cfg perDisplay = type.generateSettings();
settings.putSubConfig(type.getName(), perDisplay);
injectable.injectDisplay(this.type, perDisplay);
private RegistryDelegate(IDisplayElementType<Cfg, Cache> type) {
this.type = type;
this.perDisplay = type.generateSettings();
}
}
}
5 changes: 0 additions & 5 deletions src/main/java/stellarium/display/IDisplayInjectable.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
package stellarium.display;

import stellarapi.api.lib.config.SimpleHierarchicalConfig;
import stellarium.client.ClientSettings;

public interface IDisplayInjectable {
public <Cfg extends PerDisplaySettings, Cache extends IDisplayCache<Cfg>> void injectDisplay(
IDisplayElementType<Cfg, Cache> type, Cfg settings);

public SimpleHierarchicalConfig getSubSettings(ClientSettings settings);
}
Loading