Skip to content

Commit eb57063

Browse files
authored
Merge pull request #54 from Kotatsu-RTM/issue/42
モデルごとにアイテムのテクスチャを変更できるようにする
2 parents a6db42e + f236151 commit eb57063

File tree

7 files changed

+225
-2
lines changed

7 files changed

+225
-2
lines changed

.patching-mods/main.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ mods:
139139
- jp.ngt.rtm.modelpack.ModelPackManager
140140
- jp.ngt.rtm.modelpack.RTMResourceManager
141141
- jp.ngt.rtm.modelpack.cfg.ResourceConfig
142+
- jp.ngt.rtm.modelpack.cfg.RRSConfig
142143
- jp.ngt.rtm.modelpack.cfg.TrainConfig
143144
- jp.ngt.rtm.modelpack.cfg.VehicleBaseConfig
144145
- jp.ngt.rtm.modelpack.modelset.ModelSetBase

src/main/java/com/anatawa12/fixRtm/FixRtm.kt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import com.anatawa12.fixRtm.crash.RTMAllModelPackInfoCrashCallable
1010
import com.anatawa12.fixRtm.crash.RTMSmallModelPackInfoCrashCallable
1111
import com.anatawa12.fixRtm.gui.GuiHandler
1212
import com.anatawa12.fixRtm.io.FIXFileLoader
13+
import com.anatawa12.fixRtm.item.OverrideTextureModel
14+
import com.anatawa12.fixRtm.item.OverrideTextureItemStackRenderer
1315
import com.anatawa12.fixRtm.network.NetworkHandler
1416
import com.anatawa12.fixRtm.ngtlib.util.VersionChecker
1517
import com.anatawa12.fixRtm.rtm.modelpack.init.ClientModelPackLoader
@@ -21,9 +23,12 @@ import com.anatawa12.fixRtm.utils.ThreadLocalProperties
2123
import jp.ngt.ngtlib.NGTCore
2224
import jp.ngt.rtm.RTMCore
2325
import jp.ngt.rtm.RTMItem
26+
import jp.ngt.rtm.entity.vehicle.VehicleType
27+
import jp.ngt.rtm.item.ItemInstalledObject
2428
import jp.ngt.rtm.rail.TileEntityLargeRailBase
2529
import net.minecraft.block.Block
2630
import net.minecraft.client.Minecraft
31+
import net.minecraft.client.renderer.block.model.ModelResourceLocation
2732
import net.minecraft.client.resources.IReloadableResourceManager
2833
import net.minecraft.crash.CrashReport
2934
import net.minecraft.entity.player.EntityPlayerMP
@@ -34,6 +39,7 @@ import net.minecraft.util.ResourceLocation
3439
import net.minecraft.util.text.Style
3540
import net.minecraft.util.text.TextComponentString
3641
import net.minecraft.util.text.TextFormatting
42+
import net.minecraftforge.client.event.ModelBakeEvent
3743
import net.minecraftforge.client.event.ModelRegistryEvent
3844
import net.minecraftforge.common.MinecraftForge
3945
import net.minecraftforge.event.RegistryEvent
@@ -129,6 +135,18 @@ object FixRtm {
129135
SoundSystemConfig.setNumberNormalChannels(1024)
130136
SoundSystemConfig.setNumberStreamingChannels(32)
131137
}
138+
139+
if (e.side == Side.CLIENT) {
140+
arrayOf(
141+
RTMItem.installedObject,
142+
RTMItem.itemVehicle,
143+
RTMItem.itemtrain,
144+
RTMItem.itemMotorman,
145+
RTMItem.itemCargo,
146+
RTMItem.itemLargeRail,
147+
RTMItem.itemWire,
148+
).forEach { it.tileEntityItemStackRenderer = OverrideTextureItemStackRenderer }
149+
}
132150
}
133151

134152
private val thrownMarker = CrashReport("", Throwable())
@@ -174,6 +192,39 @@ object FixRtm {
174192
DummyModelObject.init()
175193
}
176194

195+
@SubscribeEvent
196+
@SideOnly(Side.CLIENT)
197+
fun onModelBake(event: ModelBakeEvent) {
198+
if (!MainConfig.useCustomIconTexture) return
199+
200+
val overrideModels: Array<ModelResourceLocation> = arrayOf(
201+
*ItemInstalledObject.IstlObjType.entries
202+
.filter { it.id >= 0 }
203+
.filter { it != ItemInstalledObject.IstlObjType.RAILLOAD_SIGN || MainConfig.rrsImageAsIcon }
204+
.map { ModelResourceLocation("rtm:istl_obj_${it.id}", "inventory") }
205+
.toTypedArray(),
206+
*VehicleType.entries
207+
.map { ModelResourceLocation("rtm:vehicle_${it.id}}", "inventory") }
208+
.toTypedArray(),
209+
ModelResourceLocation("rtm:item_train_0", "inventory"),
210+
ModelResourceLocation("rtm:item_train_1", "inventory"),
211+
ModelResourceLocation("rtm:item_train_2", "inventory"),
212+
ModelResourceLocation("rtm:item_train_3", "inventory"),
213+
ModelResourceLocation("rtm:item_train_fixrtm_test", "inventory"),
214+
ModelResourceLocation("rtm:item_npc_1", "inventory"),
215+
ModelResourceLocation("rtm:cargo_0", "inventory"),
216+
ModelResourceLocation("rtm:cargo_1", "inventory"),
217+
ModelResourceLocation("rtm:item_large_rail", "inventory"),
218+
ModelResourceLocation("rtm:item_wire", "inventory"),
219+
)
220+
221+
overrideModels.forEach {
222+
val baseModel = event.modelManager.getModel(it)
223+
val customRendererModel = OverrideTextureModel(baseModel)
224+
event.modelRegistry.putObject(it, customRendererModel)
225+
}
226+
}
227+
177228
fun registerGenerators() {
178229
Minecraft.getMinecraft().defaultResourcePacks.add(GeneratedResourcePack)
179230
Minecraft.getMinecraft().resourceManager

src/main/java/com/anatawa12/fixRtm/asm/config/MainConfig.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ object MainConfig {
1515
private const val categoryFixRTM = "fixrtm"
1616
private const val categoryModelLoading = "model_loading"
1717
private const val categoryBetterRtm = "better_rtm"
18+
private const val CATEGORY_CUSTOM_ITEM_ICON = "$categoryBetterRtm.custom_item_icon"
1819
private const val categoryBetterNgtLib = "better_ngtlib"
1920

2021
val modelPackLoadSpeed: ModelPackLoadSpeed
@@ -104,6 +105,23 @@ object MainConfig {
104105
""".trimIndent()
105106
)
106107

108+
val useCustomIconTexture = config.getBoolean(
109+
"useCustomIconTexture", CATEGORY_CUSTOM_ITEM_ICON,
110+
true,
111+
"""
112+
Allow to use item icons per model in model pack.
113+
Ported from KaizPatchX.
114+
""".trimIndent()
115+
)
116+
117+
val rrsImageAsIcon = config.getBoolean(
118+
"rrsImageAsIcon", CATEGORY_CUSTOM_ITEM_ICON,
119+
true,
120+
"""
121+
Use images of railroad signs as item icons.
122+
""".trimIndent()
123+
)
124+
107125
val expandPlayableSoundCount = config.getBoolean(
108126
"expandPlayableSoundCount", categoryFixRTM,
109127
true,
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.anatawa12.fixRtm.item
2+
3+
import com.anatawa12.fixRtm.asm.config.MainConfig
4+
import jp.ngt.rtm.RTMItem
5+
import jp.ngt.rtm.item.ItemInstalledObject
6+
import jp.ngt.rtm.item.ItemWithModel
7+
import net.minecraft.client.Minecraft
8+
import net.minecraft.client.renderer.GLAllocation
9+
import net.minecraft.client.renderer.GlStateManager
10+
import net.minecraft.client.renderer.RenderHelper
11+
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
12+
import net.minecraft.item.ItemStack
13+
import net.minecraft.util.ResourceLocation
14+
import org.lwjgl.opengl.GL11
15+
import org.lwjgl.opengl.GL12
16+
import org.lwjgl.opengl.GL13
17+
18+
object OverrideTextureItemStackRenderer : TileEntityItemStackRenderer() {
19+
private val COLOR = floatArrayOf(0.8f, 0.8f, 0.8f)
20+
private const val FRONT_Z = 0.5f + 1.0f / 32.0f
21+
private const val BACK_Z = 0.5f - 1.0f / 32.0f
22+
private val VERTICES = floatArrayOf(
23+
0.0f, 1.0f, 0.0f, 0.0f, FRONT_Z,
24+
1.0f, 1.0f, 1.0f, 0.0f, FRONT_Z,
25+
0.0f, 0.0f, 0.0f, 1.0f, FRONT_Z,
26+
1.0f, 0.0f, 1.0f, 1.0f, FRONT_Z,
27+
1.0f, 0.0f, 1.0f, 1.0f, BACK_Z,
28+
1.0f, 1.0f, 1.0f, 0.0f, BACK_Z,
29+
0.0f, 1.0f, 0.0f, 0.0f, BACK_Z,
30+
0.0f, 0.0f, 0.0f, 1.0f, BACK_Z,
31+
)
32+
private val INDICES = intArrayOf(0, 1, 2, 3, 4, 1, 5, 0, 6, 2, 7, 4, 6, 5)
33+
34+
private val DISPLAY_LIST by lazy {
35+
val id = GLAllocation.generateDisplayLists(1)
36+
37+
GL11.glNewList(id, GL11.GL_COMPILE)
38+
39+
GlStateManager.pushAttrib()
40+
RenderHelper.disableStandardItemLighting()
41+
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE)
42+
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE)
43+
GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL)
44+
45+
GL11.glBegin(GL11.GL_TRIANGLE_STRIP)
46+
for (i in INDICES) {
47+
var j = 5 * i
48+
GL11.glColor3f(COLOR[0], COLOR[1], COLOR[2])
49+
GL11.glTexCoord2f(VERTICES[j++], VERTICES[j++])
50+
GL11.glVertex3f(VERTICES[j++], VERTICES[j++], VERTICES[j])
51+
}
52+
GL11.glEnd()
53+
54+
GlStateManager.popAttrib()
55+
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT)
56+
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT)
57+
GL11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE)
58+
59+
GL11.glEndList()
60+
61+
id
62+
}
63+
64+
override fun renderByItem(itemStack: ItemStack, partialTick: Float) {
65+
val renderItem = Minecraft.getMinecraft().renderItem
66+
67+
val model = renderItem.getItemModelWithOverrides(itemStack, null, null)
68+
if (model !is OverrideTextureModel) {
69+
renderItem.renderItem(itemStack, model)
70+
return
71+
}
72+
73+
val customTexture = getCustomIcon(itemStack)
74+
val isRRS = itemStack.item == RTMItem.installedObject
75+
&& itemStack.itemDamage == ItemInstalledObject.IstlObjType.RAILLOAD_SIGN.id.toInt()
76+
if (customTexture == null || (isRRS && !MainConfig.rrsImageAsIcon)) {
77+
GL11.glTranslatef(0.5f, 0.5f, 0.5f)
78+
renderItem.renderItem(itemStack, model.baseModel)
79+
return
80+
}
81+
82+
Minecraft.getMinecraft().textureManager.bindTexture(customTexture)
83+
GL11.glCallList(DISPLAY_LIST)
84+
}
85+
86+
private fun getCustomIcon(itemStack: ItemStack): ResourceLocation? {
87+
val item = itemStack.item
88+
if (item !is ItemWithModel<*>) {
89+
return null
90+
}
91+
val resourceState = item.getModelState(itemStack) ?: return null
92+
return resourceState.resourceSet.config.customIcon
93+
}
94+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.anatawa12.fixRtm.item
2+
3+
import net.minecraft.block.state.IBlockState
4+
import net.minecraft.client.renderer.block.model.BakedQuad
5+
import net.minecraft.client.renderer.block.model.IBakedModel
6+
import net.minecraft.client.renderer.block.model.ItemCameraTransforms
7+
import net.minecraft.client.renderer.block.model.ItemOverrideList
8+
import net.minecraft.client.renderer.texture.TextureAtlasSprite
9+
import net.minecraft.util.EnumFacing
10+
import org.apache.commons.lang3.tuple.Pair
11+
import javax.vecmath.Matrix4f
12+
13+
class OverrideTextureModel(val baseModel: IBakedModel) : IBakedModel {
14+
override fun getQuads(state: IBlockState?, side: EnumFacing?, rand: Long): List<BakedQuad> =
15+
baseModel.getQuads(state, side, rand)
16+
17+
override fun isAmbientOcclusion(): Boolean = baseModel.isAmbientOcclusion
18+
19+
override fun isGui3d(): Boolean = baseModel.isGui3d
20+
21+
override fun isBuiltInRenderer(): Boolean = true
22+
23+
override fun getParticleTexture(): TextureAtlasSprite = baseModel.particleTexture
24+
25+
override fun getOverrides(): ItemOverrideList = baseModel.overrides
26+
27+
override fun handlePerspective(transformType: ItemCameraTransforms.TransformType): Pair<out IBakedModel?, Matrix4f?> {
28+
val matrix = baseModel.handlePerspective(transformType).right
29+
return Pair.of(this, matrix)
30+
}
31+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- a/jp/ngt/rtm/modelpack/cfg/RRSConfig.java
2+
+++ b/jp/ngt/rtm/modelpack/cfg/RRSConfig.java
3+
@@ -3,10 +3,11 @@
4+
public class RRSConfig extends TextureConfig {
5+
public void init() {
6+
super.init();
7+
this.width = 0.5F;
8+
this.height = 0.5F;
9+
+ customIconTexture = texture;
10+
}
11+
12+
public RRSConfig(String name) {
13+
this.texture = fixName(name);
14+
}

src/main/rtm-patches/jp/ngt/rtm/modelpack/cfg/ResourceConfig.java.patch

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
--- a/jp/ngt/rtm/modelpack/cfg/ResourceConfig.java
22
+++ b/jp/ngt/rtm/modelpack/cfg/ResourceConfig.java
3-
@@ -5,14 +5,17 @@
3+
@@ -1,18 +1,25 @@
4+
package jp.ngt.rtm.modelpack.cfg;
5+
6+
import jp.ngt.rtm.modelpack.state.DataMap;
7+
+import net.minecraft.util.ResourceLocation;
8+
+import org.jetbrains.annotations.Nullable;
9+
410
public abstract class ResourceConfig {
511
public short version;
612
public boolean useCustomColor;
@@ -12,17 +18,25 @@
1218
public String defaultData;
1319

1420
+ public boolean synchronousLoading;
21+
+ @Nullable
22+
+ protected String customIconTexture;
1523
+
1624
public abstract String getName();
1725

1826
public void init() {
1927
if (this.defaultValues == null && this.defaultData != null) {
2028
String[][] astring = DataMap.convertArg(this.defaultData);
21-
@@ -28,14 +31,18 @@
29+
@@ -27,15 +34,24 @@
30+
}
2231
}
2332

2433
}
2534

35+
+ @Nullable
36+
+ public ResourceLocation getCustomIcon() {
37+
+ return customIconTexture != null ? new ResourceLocation(customIconTexture) : null;
38+
+ }
39+
+
2640
protected String fixSoundPath(String path) {
2741
+ return fixSoundPath(path, null);
2842
+ }

0 commit comments

Comments
 (0)