Restored glass model that implements the uv shift.

Added a way to register built-in models to support this.
This commit is contained in:
Sebastian Hartte
2016-08-26 12:35:48 +02:00
parent ea6c892ec0
commit c6b9926d7f
45 changed files with 834 additions and 107 deletions
@@ -1,6 +1,8 @@
package appeng.bootstrap;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiFunction;
import net.minecraft.block.Block;
@@ -9,6 +11,7 @@ import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -34,6 +37,9 @@ class BlockRendering implements IBlockRendering
@SideOnly( Side.CLIENT )
private IStateMapper stateMapper;
@SideOnly( Side.CLIENT )
private Map<String, IModel> builtInModels = new HashMap<>();
@SideOnly( Side.CLIENT )
public IBlockRendering modelCustomizer( BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer )
{
@@ -57,6 +63,13 @@ class BlockRendering implements IBlockRendering
return this;
}
@Override
public IBlockRendering builtInModel( String name, IModel model )
{
this.builtInModels.put( name, model );
return this;
}
@SideOnly( Side.CLIENT )
@Override
public IBlockRendering stateMapper( IStateMapper mapper )
@@ -65,7 +78,7 @@ class BlockRendering implements IBlockRendering
return this;
}
void apply( FeatureFactory registry, Block block, Class<?> tileEntityClass )
void apply( FeatureFactory factory, Block block, Class<?> tileEntityClass )
{
if( tesr != null )
{
@@ -73,27 +86,29 @@ class BlockRendering implements IBlockRendering
{
throw new IllegalStateException( "Tried to register a TESR for " + block + " even though no tile entity has been specified." );
}
registry.addBootstrapComponent( new TesrComponent( tileEntityClass, tesr ) );
factory.addBootstrapComponent( new TesrComponent( tileEntityClass, tesr ) );
}
if( modelCustomizer != null )
{
registry.modelOverrideComponent.addOverride( block.getRegistryName().getResourcePath(), modelCustomizer );
factory.modelOverrideComponent.addOverride( block.getRegistryName().getResourcePath(), modelCustomizer );
}
else if ( block instanceof AEBaseTileBlock )
{
// This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as extended props
registry.modelOverrideComponent.addOverride( block.getRegistryName().getResourcePath(), ( l, m ) -> new CachingRotatingBakedModel( m ) );
factory.modelOverrideComponent.addOverride( block.getRegistryName().getResourcePath(), ( l, m ) -> new CachingRotatingBakedModel( m ) );
}
builtInModels.forEach( factory::addBuiltInModel );
if( blockColor != null )
{
registry.addBootstrapComponent( new BlockColorComponent( block, blockColor ) );
factory.addBootstrapComponent( new BlockColorComponent( block, blockColor ) );
}
if( stateMapper != null )
{
registry.addBootstrapComponent( new StateMapperComponent( block, stateMapper ) );
factory.addBootstrapComponent( new StateMapperComponent( block, stateMapper ) );
}
}
}
@@ -7,12 +7,14 @@ import java.util.function.Supplier;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.definitions.IItemDefinition;
import appeng.api.util.AEColor;
import appeng.api.util.AEColoredItemDefinition;
import appeng.bootstrap.components.BuiltInModelComponent;
import appeng.bootstrap.components.InitComponent;
import appeng.bootstrap.components.ModelOverrideComponent;
import appeng.bootstrap.components.PostInitComponent;
@@ -34,6 +36,9 @@ public class FeatureFactory
@SideOnly( Side.CLIENT )
ModelOverrideComponent modelOverrideComponent;
@SideOnly( Side.CLIENT )
private BuiltInModelComponent builtInModelComponent;
public FeatureFactory()
{
this.defaultFeatures = new AEFeature[] { AEFeature.Core };
@@ -42,7 +47,10 @@ public class FeatureFactory
if( Platform.isClient() )
{
modelOverrideComponent = new ModelOverrideComponent();
this.bootstrapComponents.add( modelOverrideComponent );
bootstrapComponents.add( modelOverrideComponent );
builtInModelComponent = new BuiltInModelComponent();
bootstrapComponents.add( builtInModelComponent );
}
}
@@ -53,6 +61,7 @@ public class FeatureFactory
if( Platform.isClient() )
{
this.modelOverrideComponent = parent.modelOverrideComponent;
this.builtInModelComponent = parent.builtInModelComponent;
}
}
@@ -108,9 +117,14 @@ public class FeatureFactory
this.bootstrapComponents.add( component );
}
@SideOnly( Side.CLIENT )
void addBuiltInModel( String path, IModel model )
{
builtInModelComponent.addModel( path, model );
}
public List<IBootstrapComponent> getBootstrapComponents()
{
return bootstrapComponents;
}
}
@@ -7,8 +7,8 @@ import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.client.renderer.color.IItemColor;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -31,4 +31,10 @@ public interface IBlockRendering
@SideOnly( Side.CLIENT )
IBlockRendering tesr( TileEntitySpecialRenderer<?> tesr );
/**
* Registers a built-in model under the given resource path.
*/
@SideOnly( Side.CLIENT )
IBlockRendering builtInModel( String name, IModel model );
}
@@ -8,6 +8,7 @@ import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.color.IItemColor;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -66,4 +67,11 @@ public interface IItemRendering
*/
@SideOnly( Side.CLIENT )
IItemRendering color( IItemColor itemColor );
/**
* Registers a built-in model under the given resource path.
*/
@SideOnly( Side.CLIENT )
IItemRendering builtInModel( String name, IModel model );
}
@@ -18,6 +18,7 @@ import net.minecraft.client.renderer.color.IItemColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -42,6 +43,9 @@ class ItemRendering implements IItemRendering
@SideOnly( Side.CLIENT )
private Set<ResourceLocation> variants = new HashSet<>();
@SideOnly( Side.CLIENT )
private Map<String, IModel> builtInModels = new HashMap<>();
@Override
@SideOnly( Side.CLIENT )
public IItemRendering meshDefinition( ItemMeshDefinition meshDefinition )
@@ -73,6 +77,13 @@ class ItemRendering implements IItemRendering
return this;
}
@Override
public IItemRendering builtInModel( String name, IModel model )
{
this.builtInModels.put( name, model );
return this;
}
void apply( FeatureFactory factory, Item item )
{
if( this.itemMeshDefinition != null )
@@ -110,6 +121,8 @@ class ItemRendering implements IItemRendering
factory.addBootstrapComponent( new ItemModelComponent( item, ImmutableMap.of( 0, model ) ) );
}
builtInModels.forEach( factory::addBuiltInModel );
if( !resources.isEmpty() )
{
factory.addBootstrapComponent( new ItemVariantsComponent( item, resources ) );
@@ -0,0 +1,39 @@
package appeng.bootstrap.components;
import java.util.HashMap;
import java.util.Map;
import com.google.common.base.Preconditions;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.client.render.model.BuiltInModelLoader;
@SideOnly( Side.CLIENT )
public class BuiltInModelComponent implements PreInitComponent
{
private final Map<String, IModel> builtInModels = new HashMap<>();
private boolean hasInitialized = false;
public void addModel( String path, IModel model )
{
Preconditions.checkState( !hasInitialized );
builtInModels.put( path, model );
}
@Override
public void preInitialize( Side side )
{
hasInitialized = true;
BuiltInModelLoader loader = new BuiltInModelLoader( builtInModels );
ModelLoaderRegistry.registerLoader( loader );
}
}