From 202dff3a96b89f52fe9ec766ce4e6d69df43fb23 Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Fri, 14 Oct 2016 00:08:42 +0200 Subject: [PATCH] Fixes #2376: Implemented coloring on color applicator. --- .../render/model/BiometricCardBakedModel.java | 11 +- .../model/ColorApplicatorBakedModel.java | 142 ++++++++++++++++++ .../render/model/ColorApplicatorModel.java | 85 +++++++++++ .../appeng/core/api/definitions/ApiItems.java | 2 + .../tools/ToolBiometricCardRendering.java | 5 +- .../tools/powered/ToolColorApplicator.java | 5 - .../powered/ToolColorApplicatorRendering.java | 67 +++++++++ .../models/item/color_applicator_colored.json | 9 ++ .../item/color_applicator_tip_dark.json | 6 - .../item/color_applicator_tip_light.json | 6 - .../item/color_applicator_tip_medium.json | 6 - ...r.json => color_applicator_uncolored.json} | 0 ...ht.png => color_applicator_tip_bright.png} | Bin 13 files changed, 312 insertions(+), 32 deletions(-) create mode 100644 src/main/java/appeng/client/render/model/ColorApplicatorBakedModel.java create mode 100644 src/main/java/appeng/client/render/model/ColorApplicatorModel.java create mode 100644 src/main/java/appeng/items/tools/powered/ToolColorApplicatorRendering.java create mode 100644 src/main/resources/assets/appliedenergistics2/models/item/color_applicator_colored.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_dark.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_light.json delete mode 100644 src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_medium.json rename src/main/resources/assets/appliedenergistics2/models/item/{color_applicator.json => color_applicator_uncolored.json} (100%) rename src/main/resources/assets/appliedenergistics2/textures/items/{color_applicator_tip_light.png => color_applicator_tip_bright.png} (100%) diff --git a/src/main/java/appeng/client/render/model/BiometricCardBakedModel.java b/src/main/java/appeng/client/render/model/BiometricCardBakedModel.java index 1c77135b..3f132029 100644 --- a/src/main/java/appeng/client/render/model/BiometricCardBakedModel.java +++ b/src/main/java/appeng/client/render/model/BiometricCardBakedModel.java @@ -36,12 +36,7 @@ import appeng.client.render.cablebus.CubeBuilder; import appeng.core.AELog; -/** - * @author Sebastian - * @version rv3 - 10.10.2016 - * @since rv3 10.10.2016 - */ -public class BiometricCardBakedModel implements IPerspectiveAwareModel +class BiometricCardBakedModel implements IPerspectiveAwareModel { private final VertexFormat format; @@ -58,12 +53,12 @@ public class BiometricCardBakedModel implements IPerspectiveAwareModel private final ImmutableList generalQuads; - public BiometricCardBakedModel( VertexFormat format, IBakedModel baseModel, TextureAtlasSprite texture, ImmutableMap transforms ) + BiometricCardBakedModel( VertexFormat format, IBakedModel baseModel, TextureAtlasSprite texture, ImmutableMap transforms ) { this( format, baseModel, texture, 0, transforms ); } - public BiometricCardBakedModel( VertexFormat format, IBakedModel baseModel, TextureAtlasSprite texture, int hash, ImmutableMap transforms ) + BiometricCardBakedModel( VertexFormat format, IBakedModel baseModel, TextureAtlasSprite texture, int hash, ImmutableMap transforms ) { this.format = format; this.baseModel = baseModel; diff --git a/src/main/java/appeng/client/render/model/ColorApplicatorBakedModel.java b/src/main/java/appeng/client/render/model/ColorApplicatorBakedModel.java new file mode 100644 index 00000000..35e92ca5 --- /dev/null +++ b/src/main/java/appeng/client/render/model/ColorApplicatorBakedModel.java @@ -0,0 +1,142 @@ +package appeng.client.render.model; + + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import javax.annotation.Nullable; +import javax.vecmath.Matrix4f; + +import com.google.common.collect.ImmutableMap; + +import org.apache.commons.lang3.tuple.Pair; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms; +import net.minecraft.client.renderer.block.model.ItemOverrideList; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.client.model.IPerspectiveAwareModel; +import net.minecraftforge.common.model.TRSRTransformation; + + +class ColorApplicatorBakedModel implements IPerspectiveAwareModel +{ + + private final IBakedModel baseModel; + + private final ImmutableMap transforms; + + private final EnumMap> quadsBySide; + + private final List generalQuads; + + ColorApplicatorBakedModel( IBakedModel baseModel, ImmutableMap map, + TextureAtlasSprite texDark, TextureAtlasSprite texMedium, TextureAtlasSprite texBright ) + { + this.baseModel = baseModel; + this.transforms = map; + + // Put the tint indices in... Since this is an item model, we are ignoring rand + this.generalQuads = fixQuadTint( null, texDark, texMedium, texBright ); + this.quadsBySide = new EnumMap<>( EnumFacing.class ); + for( EnumFacing facing : EnumFacing.values() ) + { + this.quadsBySide.put( facing, fixQuadTint( facing, texDark, texMedium, texBright ) ); + } + } + + private List fixQuadTint( EnumFacing facing, TextureAtlasSprite texDark, TextureAtlasSprite texMedium, TextureAtlasSprite texBright ) + { + List quads = baseModel.getQuads( null, facing, 0 ); + List result = new ArrayList<>( quads.size() ); + for( BakedQuad quad : quads ) + { + int tint; + + if( quad.getSprite() == texDark ) + { + tint = 1; + } + else if( quad.getSprite() == texMedium ) + { + tint = 2; + } + else if( quad.getSprite() == texBright ) + { + tint = 3; + } + else + { + result.add( quad ); + continue; + } + + BakedQuad newQuad = new BakedQuad( + quad.getVertexData(), + tint, + quad.getFace(), + quad.getSprite(), + quad.shouldApplyDiffuseLighting(), + quad.getFormat() + ); + result.add( newQuad ); + } + + return result; + } + + @Override + public List getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand ) + { + if( side == null ) + { + return generalQuads; + } + return this.quadsBySide.get( side ); + } + + @Override + public boolean isAmbientOcclusion() + { + return baseModel.isAmbientOcclusion(); + } + + @Override + public boolean isGui3d() + { + return baseModel.isGui3d(); + } + + @Override + public boolean isBuiltInRenderer() + { + return baseModel.isBuiltInRenderer(); + } + + @Override + public TextureAtlasSprite getParticleTexture() + { + return baseModel.getParticleTexture(); + } + + @Override + public ItemCameraTransforms getItemCameraTransforms() + { + return baseModel.getItemCameraTransforms(); + } + + @Override + public ItemOverrideList getOverrides() + { + return baseModel.getOverrides(); + } + + @Override + public Pair handlePerspective( ItemCameraTransforms.TransformType type ) + { + return MapWrapper.handlePerspective( this, transforms, type ); + } +} diff --git a/src/main/java/appeng/client/render/model/ColorApplicatorModel.java b/src/main/java/appeng/client/render/model/ColorApplicatorModel.java new file mode 100644 index 00000000..e1ca3351 --- /dev/null +++ b/src/main/java/appeng/client/render/model/ColorApplicatorModel.java @@ -0,0 +1,85 @@ +package appeng.client.render.model; + + +import java.util.Collection; +import java.util.Collections; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModel; +import net.minecraftforge.client.model.IPerspectiveAwareModel; +import net.minecraftforge.client.model.ModelLoaderRegistry; +import net.minecraftforge.common.model.IModelState; +import net.minecraftforge.common.model.TRSRTransformation; + +import appeng.core.AppEng; + + +/** + * A color applicator uses the base model, and extends it with additional layers that are colored according to the selected color of the applicator. + */ +public class ColorApplicatorModel implements IModel +{ + + private static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "item/color_applicator_colored" ); + + private static final ResourceLocation TEXTURE_DARK = new ResourceLocation( AppEng.MOD_ID, "items/color_applicator_tip_dark" ); + private static final ResourceLocation TEXTURE_MEDIUM = new ResourceLocation( AppEng.MOD_ID, "items/color_applicator_tip_medium" ); + private static final ResourceLocation TEXTURE_BRIGHT = new ResourceLocation( AppEng.MOD_ID, "items/color_applicator_tip_bright" ); + + @Override + public Collection getDependencies() + { + return Collections.singletonList( MODEL_BASE ); + } + + @Override + public Collection getTextures() + { + return ImmutableList.of( + TEXTURE_DARK, + TEXTURE_MEDIUM, + TEXTURE_BRIGHT + ); + } + + @Override + public IBakedModel bake( IModelState state, VertexFormat format, Function bakedTextureGetter ) + { + IBakedModel baseModel = getBaseModel( state, format, bakedTextureGetter ); + + TextureAtlasSprite texDark = bakedTextureGetter.apply( TEXTURE_DARK ); + TextureAtlasSprite texMedium = bakedTextureGetter.apply( TEXTURE_MEDIUM ); + TextureAtlasSprite texBright = bakedTextureGetter.apply( TEXTURE_BRIGHT ); + + ImmutableMap map = IPerspectiveAwareModel.MapWrapper.getTransforms( state ); + + return new ColorApplicatorBakedModel( baseModel, map, texDark, texMedium, texBright ); + } + + private IBakedModel getBaseModel( IModelState state, VertexFormat format, Function bakedTextureGetter ) + { + // Load the base model + try + { + return ModelLoaderRegistry.getModel( MODEL_BASE ).bake( state, format, bakedTextureGetter ); + } + catch( Exception e ) + { + throw new RuntimeException( e ); + } + } + + @Override + public IModelState getDefaultState() + { + return TRSRTransformation.identity(); + } +} diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index d8bb8676..39c9b499 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -49,6 +49,7 @@ import appeng.items.tools.ToolMemoryCard; import appeng.items.tools.ToolNetworkTool; import appeng.items.tools.powered.ToolChargedStaff; import appeng.items.tools.powered.ToolColorApplicator; +import appeng.items.tools.powered.ToolColorApplicatorRendering; import appeng.items.tools.powered.ToolEntropyManipulator; import appeng.items.tools.powered.ToolMatterCannon; import appeng.items.tools.powered.ToolPortableCell; @@ -156,6 +157,7 @@ public final class ApiItems implements IItems this.colorApplicator = powerTools.item( "color_applicator", ToolColorApplicator::new ) .addFeatures( AEFeature.ColorApplicator ) .dispenserBehavior( DispenserBlockTool::new ) + .rendering( new ToolColorApplicatorRendering() ) .build(); this.biometricCard = registry.item( "biometric_card", ToolBiometricCard::new ) diff --git a/src/main/java/appeng/items/tools/ToolBiometricCardRendering.java b/src/main/java/appeng/items/tools/ToolBiometricCardRendering.java index b5214324..272d53b8 100644 --- a/src/main/java/appeng/items/tools/ToolBiometricCardRendering.java +++ b/src/main/java/appeng/items/tools/ToolBiometricCardRendering.java @@ -3,6 +3,8 @@ package appeng.items.tools; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.bootstrap.IItemRendering; import appeng.bootstrap.ItemRenderingCustomizer; @@ -13,9 +15,10 @@ import appeng.core.AppEng; public class ToolBiometricCardRendering extends ItemRenderingCustomizer { - public static final ResourceLocation MODEL = new ResourceLocation( AppEng.MOD_ID, "builtin/biometric_card" ); + private static final ResourceLocation MODEL = new ResourceLocation( AppEng.MOD_ID, "builtin/biometric_card" ); @Override + @SideOnly( Side.CLIENT ) public void customize( IItemRendering rendering ) { rendering.builtInModel( "models/item/builtin/biometric_card", new BiometricCardModel() ); diff --git a/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java b/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java index 87f80558..9fb68cd4 100644 --- a/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java +++ b/src/main/java/appeng/items/tools/powered/ToolColorApplicator.java @@ -101,11 +101,6 @@ public class ToolColorApplicator extends AEBasePoweredItem implements IStorageCe public ToolColorApplicator() { super( AEConfig.instance.colorApplicatorBattery ); - if( Platform.isClient() ) - { - // TODO - color applicator - // MinecraftForgeClient.registerItemRenderer( this, new ToolColorApplicatorRender() ); - } } @Override diff --git a/src/main/java/appeng/items/tools/powered/ToolColorApplicatorRendering.java b/src/main/java/appeng/items/tools/powered/ToolColorApplicatorRendering.java new file mode 100644 index 00000000..a53fec61 --- /dev/null +++ b/src/main/java/appeng/items/tools/powered/ToolColorApplicatorRendering.java @@ -0,0 +1,67 @@ +package appeng.items.tools.powered; + + +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.api.util.AEColor; +import appeng.bootstrap.IItemRendering; +import appeng.bootstrap.ItemRenderingCustomizer; +import appeng.client.render.model.ColorApplicatorModel; +import appeng.core.AppEng; + + +public class ToolColorApplicatorRendering extends ItemRenderingCustomizer +{ + + private static final ModelResourceLocation MODEL_COLORED = new ModelResourceLocation( new ResourceLocation( AppEng.MOD_ID, "builtin/color_applicator_colored" ), "inventory" ); + private static final ModelResourceLocation MODEL_UNCOLORED = new ModelResourceLocation( new ResourceLocation( AppEng.MOD_ID, "color_applicator_uncolored" ), "inventory" ); + + @Override + @SideOnly( Side.CLIENT ) + public void customize( IItemRendering rendering ) + { + rendering.builtInModel( "models/item/builtin/color_applicator_colored", new ColorApplicatorModel() ); + rendering.variants( MODEL_COLORED, MODEL_UNCOLORED ); + rendering.color( this::getColor ); + rendering.meshDefinition( this::getMesh ); + } + + private ModelResourceLocation getMesh( ItemStack itemStack ) + { + // If the stack has no color, don't use the colored model since the impact of calling getColor for every quad is extremely high, + // if the stack tries to re-search its inventory for a new paintball everytime + AEColor col = ( (ToolColorApplicator) itemStack.getItem() ).getActiveColor( itemStack ); + return ( col != null ) ? MODEL_COLORED : MODEL_UNCOLORED; + } + + private int getColor( ItemStack itemStack, int idx ) + { + if( idx == 0 ) + { + return -1; + } + + final AEColor col = ( (ToolColorApplicator) itemStack.getItem() ).getActiveColor( itemStack ); + + if( col == null ) + { + return -1; + } + + switch( idx ) + { + case 1: + return col.blackVariant; + case 2: + return col.mediumVariant; + case 3: + return col.whiteVariant; + default: + return -1; + } + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_colored.json b/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_colored.json new file mode 100644 index 00000000..11cc0f46 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_colored.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "appliedenergistics2:items/color_applicator", + "layer1": "appliedenergistics2:items/color_applicator_tip_dark", + "layer2": "appliedenergistics2:items/color_applicator_tip_medium", + "layer3": "appliedenergistics2:items/color_applicator_tip_bright" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_dark.json b/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_dark.json deleted file mode 100644 index e8a4ca66..00000000 --- a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_dark.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "appliedenergistics2:items/color_applicator_tip_dark" - } -} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_light.json b/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_light.json deleted file mode 100644 index 8cec076a..00000000 --- a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_light.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "appliedenergistics2:items/color_applicator_tip_light" - } -} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_medium.json b/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_medium.json deleted file mode 100644 index 7f967866..00000000 --- a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_tip_medium.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "appliedenergistics2:items/color_applicator_tip_medium" - } -} diff --git a/src/main/resources/assets/appliedenergistics2/models/item/color_applicator.json b/src/main/resources/assets/appliedenergistics2/models/item/color_applicator_uncolored.json similarity index 100% rename from src/main/resources/assets/appliedenergistics2/models/item/color_applicator.json rename to src/main/resources/assets/appliedenergistics2/models/item/color_applicator_uncolored.json diff --git a/src/main/resources/assets/appliedenergistics2/textures/items/color_applicator_tip_light.png b/src/main/resources/assets/appliedenergistics2/textures/items/color_applicator_tip_bright.png similarity index 100% rename from src/main/resources/assets/appliedenergistics2/textures/items/color_applicator_tip_light.png rename to src/main/resources/assets/appliedenergistics2/textures/items/color_applicator_tip_bright.png