Skip to content

Commit 907f8cb

Browse files
authored
Merge pull request #12 from TimLee9024/1.18.2-Fabric-2.0
Update to 2.0.1.0
2 parents 3c4628c + b8bc118 commit 907f8cb

9 files changed

Lines changed: 535 additions & 66 deletions

README.md

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@ In order to adapt into BSL Shaders' SEUS/Old PBR format, some change were made:
1313
- `Occlusion(R)Roughness(G)Metallic(B)` textures and `Emissive color(RGB)` textures had been edited and combined into `Glossiness(R)Metallic(G)Emissive strength(B)` textures for specular map.
1414
## Additonal Note About Setup This Project
1515
1. Before build MCglTF for developmental environment. There is two ways you can choose to avoid gradle compilation error for OptiFine code reference.
16-
- Simply replace [this line](https://github.com/TimLee9024/MCglTF/blob/c774265e358387646901fedbbd89dc85ebaa987d/src/main/java/com/timlee9024/mcgltf/MCglTF.java#L280) with `return false;` in `isShaderModActive()`.
17-
- Download OptiFine and delete everything except files and folders inside `notch/net/optifine/` of OptiFine JAR. Move all files and folders from `notch/net/optifine/` to `net/optifine/`, which means the `net` folder is now in the root of OptiFine JAR. Then put modified OptiFine JAR into a newly created folder named `libs` in the same dir level as `src` of MCglTF project.
18-
2. Build MCglTF with "gradlew build" to create a `-dev` version of MCglTF which is inside `build/devlibs`.
19-
3. Create a folder named `libs` in the same dir level as `src` of MCglTF-Example project.
20-
4. Put `-dev` version of MCglTF into the `libs` folder.
21-
5. In Eclipse IDE, add MCglTF jar as `Referenced Libraries` via `Project > Properties > Java Build Path > Libraries > Add JARs`.
16+
- Simply remove any OptiFine code reference in MCglTF.java.
17+
- Or download OptiFine and delete everything except files and folders inside `notch/net/optifine/` of OptiFine JAR. Move all files and folders from `notch/net/optifine/` to `net/optifine/`, which means the `net` folder is now in the root of OptiFine JAR. Then put modified OptiFine JAR into a newly created folder named `libs` in the same dir level as `src` of MCglTF project.
18+
2. Build Iris Shaders for development environment and put into `libs` folder in the same dir level as `src` of MCglTF project.
19+
3. Build MCglTF with "gradlew build" to create a `-dev` version of MCglTF which is inside `build/devlibs`.
20+
4. Create a folder named `libs` in the same dir level as `src` of MCglTF-Example project.
21+
5. Put `-dev` version of MCglTF into the `libs` folder.
22+
6. In Eclipse IDE, add MCglTF jar as `Referenced Libraries` via `Project > Properties > Java Build Path > Libraries > Add JARs`.
23+
### Alternative Way
24+
Using [Curse Maven](https://www.cursemaven.com/) to add MCglTF into project via [build.gradle](https://www.cursemaven.com/fabric)

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ org.gradle.jvmargs=-Xmx4G
77
loader_version=0.14.10
88

99
# Mod Properties
10-
mod_version = 1.18.2-Fabric-2.0.0.0
10+
mod_version = 1.18.2-Fabric-2.0.1.0
1111
maven_group = com.modularmods.mcgltf.example
1212
archives_base_name = MCglTF-Example
1313

1414
# Dependencies
15-
fabric_version=0.59.1+1.18.2
15+
fabric_version=0.66.0+1.18.2

src/main/java/com/modularmods/mcgltf/example/ExampleBlockEntityRenderer.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ public void onReceiveSharedModel(RenderedGltfModel renderedModel) {
4949

5050
/**
5151
* Since you use custom BEWLR(DynamicItemRenderer) for BlockItem instead of BER to render item form of block,
52-
* the last parameters p_112312_ which control overlay color is almost never used.
52+
* the last parameters which control overlay color is almost never used.
5353
*/
5454
@Override
55-
public void render(ExampleBlockEntity p_112307_, float p_112308_, PoseStack p_112309_, MultiBufferSource p_112310_, int p_112311_, int p_112312_) {
55+
public void render(ExampleBlockEntity blockEntity, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay) {
5656
int currentVAO = GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING);
5757
int currentArrayBuffer = GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING);
5858
int currentElementArrayBuffer = GL11.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING);
@@ -65,10 +65,10 @@ public void render(ExampleBlockEntity p_112307_, float p_112308_, PoseStack p_11
6565
GL11.glEnable(GL11.GL_BLEND);
6666
GlStateManager._blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
6767

68-
p_112309_.pushPose();
69-
Level level = p_112307_.getLevel();
68+
matrices.pushPose();
69+
Level level = blockEntity.getLevel();
7070
if(level != null) {
71-
float time = (level.getGameTime() + p_112308_) / 20;
71+
float time = (level.getGameTime() + tickDelta) / 20;
7272
//Play every animation clips simultaneously
7373
for(List<InterpolatedChannel> animation : animations) {
7474
animation.parallelStream().forEach((channel) -> {
@@ -77,31 +77,31 @@ public void render(ExampleBlockEntity p_112307_, float p_112308_, PoseStack p_11
7777
});
7878
}
7979

80-
p_112309_.translate(0.5, 0.5, 0.5); //Make sure it is in the center of the block
81-
switch(level.getBlockState(p_112307_.getBlockPos()).getOptionalValue(HorizontalDirectionalBlock.FACING).orElse(Direction.NORTH)) {
80+
matrices.translate(0.5, 0.5, 0.5); //Make sure it is in the center of the block
81+
switch(level.getBlockState(blockEntity.getBlockPos()).getOptionalValue(HorizontalDirectionalBlock.FACING).orElse(Direction.NORTH)) {
8282
case DOWN:
8383
break;
8484
case UP:
8585
break;
8686
case NORTH:
8787
break;
8888
case SOUTH:
89-
p_112309_.mulPose(new Quaternion(0.0F, 1.0F, 0.0F, 0.0F));
89+
matrices.mulPose(new Quaternion(0.0F, 1.0F, 0.0F, 0.0F));
9090
break;
9191
case WEST:
92-
p_112309_.mulPose(new Quaternion(0.0F, 0.7071068F, 0.0F, 0.7071068F));
92+
matrices.mulPose(new Quaternion(0.0F, 0.7071068F, 0.0F, 0.7071068F));
9393
break;
9494
case EAST:
95-
p_112309_.mulPose(new Quaternion(0.0F, -0.7071068F, 0.0F, 0.7071068F));
95+
matrices.mulPose(new Quaternion(0.0F, -0.7071068F, 0.0F, 0.7071068F));
9696
break;
9797
}
9898
}
9999

100-
RenderedGltfModel.CURRENT_POSE = p_112309_.last().pose();
101-
RenderedGltfModel.CURRENT_NORMAL = p_112309_.last().normal();
102-
p_112309_.popPose();
100+
RenderedGltfModel.CURRENT_POSE = matrices.last().pose();
101+
RenderedGltfModel.CURRENT_NORMAL = matrices.last().normal();
102+
matrices.popPose();
103103

104-
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, p_112311_ & '\uffff', p_112311_ >> 16 & '\uffff');
104+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, light & '\uffff', light >> 16 & '\uffff');
105105

106106
if(MCglTF.getInstance().isShaderModActive()) {
107107
renderedScene.renderForShaderMod();
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package com.modularmods.mcgltf.example;
2+
3+
import java.util.List;
4+
5+
import org.lwjgl.opengl.GL11;
6+
import org.lwjgl.opengl.GL30;
7+
8+
import com.modularmods.mcgltf.MCglTF;
9+
import com.modularmods.mcgltf.RenderedGltfModel;
10+
import com.modularmods.mcgltf.animation.InterpolatedChannel;
11+
import com.modularmods.mcgltf.iris.IrisRenderingHook;
12+
import com.mojang.blaze3d.platform.GlStateManager;
13+
import com.mojang.blaze3d.vertex.PoseStack;
14+
import com.mojang.math.Matrix3f;
15+
import com.mojang.math.Matrix4f;
16+
import com.mojang.math.Quaternion;
17+
18+
import net.minecraft.client.renderer.MultiBufferSource;
19+
import net.minecraft.client.renderer.RenderType;
20+
import net.minecraft.client.renderer.texture.TextureAtlas;
21+
import net.minecraft.core.Direction;
22+
import net.minecraft.world.level.Level;
23+
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
24+
25+
public class ExampleBlockEntityRendererIris extends ExampleBlockEntityRenderer {
26+
27+
@Override
28+
public void render(ExampleBlockEntity blockEntity, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay) {
29+
RenderType renderType = RenderType.entitySolid(TextureAtlas.LOCATION_BLOCKS);
30+
vertexConsumers.getBuffer(renderType); //Put renderType into MultiBufferSource to ensure command submit to IrisRenderingHook will be run in Iris batched entity rendering.
31+
Matrix4f modelViewMatrix = matrices.last().pose().copy();
32+
33+
if(MCglTF.getInstance().isShaderModActive()) {
34+
IrisRenderingHook.submitCommandForIrisRenderingByPhaseName("BLOCK_ENTITIES", renderType, () -> {
35+
Level level = blockEntity.getLevel();
36+
if(level != null) {
37+
float time = (level.getGameTime() + tickDelta) / 20;
38+
//Play every animation clips simultaneously
39+
for(List<InterpolatedChannel> animation : animations) {
40+
animation.parallelStream().forEach((channel) -> {
41+
float[] keys = channel.getKeys();
42+
channel.update(time % keys[keys.length - 1]);
43+
});
44+
}
45+
46+
modelViewMatrix.multiplyWithTranslation(0.5F, 0.5F, 0.5F); //Make sure it is in the center of the block
47+
switch(level.getBlockState(blockEntity.getBlockPos()).getOptionalValue(HorizontalDirectionalBlock.FACING).orElse(Direction.NORTH)) {
48+
case DOWN:
49+
break;
50+
case UP:
51+
break;
52+
case NORTH:
53+
break;
54+
case SOUTH:
55+
modelViewMatrix.multiply(new Quaternion(0.0F, 1.0F, 0.0F, 0.0F));
56+
break;
57+
case WEST:
58+
modelViewMatrix.multiply(new Quaternion(0.0F, 0.7071068F, 0.0F, 0.7071068F));
59+
break;
60+
case EAST:
61+
modelViewMatrix.multiply(new Quaternion(0.0F, -0.7071068F, 0.0F, 0.7071068F));
62+
break;
63+
}
64+
}
65+
66+
RenderedGltfModel.CURRENT_POSE = modelViewMatrix;
67+
68+
boolean currentBlend = GL11.glGetBoolean(GL11.GL_BLEND);
69+
GL11.glEnable(GL11.GL_BLEND); //Since the renderType is entity solid, we need to turn on blending manually.
70+
GlStateManager._blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
71+
72+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV1, overlay & '\uffff', overlay >> 16 & '\uffff');
73+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, light & '\uffff', light >> 16 & '\uffff');
74+
75+
renderedScene.renderForShaderMod();
76+
77+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV1, 0, 0);
78+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, 0, 0);
79+
80+
if(!currentBlend) GL11.glDisable(GL11.GL_BLEND);
81+
});
82+
}
83+
else {
84+
Matrix3f normalMatrix = matrices.last().normal().copy();
85+
IrisRenderingHook.submitCommandForIrisRenderingByPhaseName("NONE", renderType, () -> {
86+
Level level = blockEntity.getLevel();
87+
if(level != null) {
88+
float time = (level.getGameTime() + tickDelta) / 20;
89+
for(List<InterpolatedChannel> animation : animations) {
90+
animation.parallelStream().forEach((channel) -> {
91+
float[] keys = channel.getKeys();
92+
channel.update(time % keys[keys.length - 1]);
93+
});
94+
}
95+
96+
modelViewMatrix.multiplyWithTranslation(0.5F, 0.5F, 0.5F);
97+
switch(level.getBlockState(blockEntity.getBlockPos()).getOptionalValue(HorizontalDirectionalBlock.FACING).orElse(Direction.NORTH)) {
98+
case DOWN:
99+
break;
100+
case UP:
101+
break;
102+
case NORTH:
103+
break;
104+
case SOUTH:
105+
Quaternion rotation = new Quaternion(0.0F, 1.0F, 0.0F, 0.0F);
106+
modelViewMatrix.multiply(rotation);
107+
normalMatrix.mul(rotation);
108+
break;
109+
case WEST:
110+
rotation = new Quaternion(0.0F, 0.7071068F, 0.0F, 0.7071068F);
111+
modelViewMatrix.multiply(rotation);
112+
normalMatrix.mul(rotation);
113+
break;
114+
case EAST:
115+
rotation = new Quaternion(0.0F, -0.7071068F, 0.0F, 0.7071068F);
116+
modelViewMatrix.multiply(rotation);
117+
normalMatrix.mul(rotation);
118+
break;
119+
}
120+
}
121+
122+
RenderedGltfModel.CURRENT_POSE = modelViewMatrix;
123+
RenderedGltfModel.CURRENT_NORMAL = normalMatrix;
124+
125+
boolean currentBlend = GL11.glGetBoolean(GL11.GL_BLEND);
126+
GL11.glEnable(GL11.GL_BLEND);
127+
GlStateManager._blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
128+
129+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV1, overlay & '\uffff', overlay >> 16 & '\uffff');
130+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, light & '\uffff', light >> 16 & '\uffff');
131+
132+
renderedScene.renderForVanilla();
133+
134+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV1, 0, 0);
135+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, 0, 0);
136+
137+
if(!currentBlend) GL11.glDisable(GL11.GL_BLEND);
138+
});
139+
}
140+
}
141+
142+
}

src/main/java/com/modularmods/mcgltf/example/ExampleClient.java

Lines changed: 67 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry;
88
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry;
99
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
10+
import net.fabricmc.loader.api.FabricLoader;
1011
import net.minecraft.resources.ResourceLocation;
1112

1213
public class ExampleClient implements ClientModInitializer {
@@ -23,37 +24,72 @@ public void onInitializeClient() {
2324
tickDelta = listener.tickDelta();
2425
});
2526

26-
BlockEntityRendererRegistry.register(Example.INSTANCE.exampleBlockEntityType, (context) -> {
27-
ExampleBlockEntityRenderer ber = new ExampleBlockEntityRenderer();
28-
MCglTF.getInstance().addGltfModelReceiver(ber);
29-
return ber;
30-
});
31-
32-
EntityRendererRegistry.register(Example.INSTANCE.exampleEntityType, (context) -> {
33-
ExampleEntityRenderer entityRenderer = new ExampleEntityRenderer(context);
34-
MCglTF.getInstance().addGltfModelReceiver(entityRenderer);
35-
return entityRenderer;
36-
});
37-
38-
ExampleItemRenderer itemRenderer = new ExampleItemRenderer() {
39-
40-
@Override
41-
public ResourceLocation getModelLocation() {
42-
return new ResourceLocation("mcgltf", "models/item/water_bottle.gltf");
43-
}
44-
};
45-
MCglTF.getInstance().addGltfModelReceiver(itemRenderer);
46-
BuiltinItemRendererRegistry.INSTANCE.register(Example.INSTANCE.item, itemRenderer);
47-
48-
ExampleItemRenderer blockItemRenderer = new ExampleItemRenderer() {
49-
50-
@Override
51-
public ResourceLocation getModelLocation() {
52-
return new ResourceLocation("mcgltf", "models/block/boom_box.gltf");
53-
}
54-
};
55-
MCglTF.getInstance().addGltfModelReceiver(blockItemRenderer);
56-
BuiltinItemRendererRegistry.INSTANCE.register(Example.INSTANCE.blockItem, blockItemRenderer);
27+
if(FabricLoader.getInstance().isModLoaded("iris")) {
28+
BlockEntityRendererRegistry.register(Example.INSTANCE.exampleBlockEntityType, (context) -> {
29+
ExampleBlockEntityRenderer ber = new ExampleBlockEntityRendererIris();
30+
MCglTF.getInstance().addGltfModelReceiver(ber);
31+
return ber;
32+
});
33+
34+
EntityRendererRegistry.register(Example.INSTANCE.exampleEntityType, (context) -> {
35+
ExampleEntityRenderer entityRenderer = new ExampleEntityRendererIris(context);
36+
MCglTF.getInstance().addGltfModelReceiver(entityRenderer);
37+
return entityRenderer;
38+
});
39+
40+
ExampleItemRenderer itemRenderer = new ExampleItemRendererIris() {
41+
42+
@Override
43+
public ResourceLocation getModelLocation() {
44+
return new ResourceLocation("mcgltf", "models/item/water_bottle.gltf");
45+
}
46+
};
47+
MCglTF.getInstance().addGltfModelReceiver(itemRenderer);
48+
BuiltinItemRendererRegistry.INSTANCE.register(Example.INSTANCE.item, itemRenderer);
49+
50+
ExampleItemRenderer blockItemRenderer = new ExampleItemRendererIris() {
51+
52+
@Override
53+
public ResourceLocation getModelLocation() {
54+
return new ResourceLocation("mcgltf", "models/block/boom_box.gltf");
55+
}
56+
};
57+
MCglTF.getInstance().addGltfModelReceiver(blockItemRenderer);
58+
BuiltinItemRendererRegistry.INSTANCE.register(Example.INSTANCE.blockItem, blockItemRenderer);
59+
}
60+
else {
61+
BlockEntityRendererRegistry.register(Example.INSTANCE.exampleBlockEntityType, (context) -> {
62+
ExampleBlockEntityRenderer ber = new ExampleBlockEntityRenderer();
63+
MCglTF.getInstance().addGltfModelReceiver(ber);
64+
return ber;
65+
});
66+
67+
EntityRendererRegistry.register(Example.INSTANCE.exampleEntityType, (context) -> {
68+
ExampleEntityRenderer entityRenderer = new ExampleEntityRenderer(context);
69+
MCglTF.getInstance().addGltfModelReceiver(entityRenderer);
70+
return entityRenderer;
71+
});
72+
73+
ExampleItemRenderer itemRenderer = new ExampleItemRenderer() {
74+
75+
@Override
76+
public ResourceLocation getModelLocation() {
77+
return new ResourceLocation("mcgltf", "models/item/water_bottle.gltf");
78+
}
79+
};
80+
MCglTF.getInstance().addGltfModelReceiver(itemRenderer);
81+
BuiltinItemRendererRegistry.INSTANCE.register(Example.INSTANCE.item, itemRenderer);
82+
83+
ExampleItemRenderer blockItemRenderer = new ExampleItemRenderer() {
84+
85+
@Override
86+
public ResourceLocation getModelLocation() {
87+
return new ResourceLocation("mcgltf", "models/block/boom_box.gltf");
88+
}
89+
};
90+
MCglTF.getInstance().addGltfModelReceiver(blockItemRenderer);
91+
BuiltinItemRendererRegistry.INSTANCE.register(Example.INSTANCE.blockItem, blockItemRenderer);
92+
}
5793
}
5894

5995
}

src/main/java/com/modularmods/mcgltf/example/ExampleEntityRenderer.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ public ResourceLocation getTextureLocation(ExampleEntity p_114482_) {
5656
}
5757

5858
@Override
59-
public void render(ExampleEntity p_114485_, float p_114486_, float p_114487_, PoseStack p_114488_, MultiBufferSource p_114489_, int p_114490_) {
60-
float time = (p_114485_.level.getGameTime() + p_114487_) / 20;
59+
public void render(ExampleEntity entity, float yRotDelta, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light) {
60+
float time = (entity.level.getGameTime() + tickDelta) / 20;
6161
//Play every animation clips simultaneously
6262
for(List<InterpolatedChannel> animation : animations) {
6363
animation.parallelStream().forEach((channel) -> {
@@ -78,13 +78,13 @@ public void render(ExampleEntity p_114485_, float p_114486_, float p_114487_, Po
7878
GL11.glEnable(GL11.GL_BLEND);
7979
GlStateManager._blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
8080

81-
p_114488_.pushPose();
82-
p_114488_.mulPose(new Quaternion(0.0F, Mth.rotLerp(p_114487_, p_114485_.yBodyRotO, p_114485_.yBodyRot), 0.0F, true));
83-
RenderedGltfModel.CURRENT_POSE = p_114488_.last().pose();
84-
RenderedGltfModel.CURRENT_NORMAL = p_114488_.last().normal();
85-
p_114488_.popPose();
81+
matrices.pushPose();
82+
matrices.mulPose(new Quaternion(0.0F, Mth.rotLerp(tickDelta, entity.yBodyRotO, entity.yBodyRot), 0.0F, true));
83+
RenderedGltfModel.CURRENT_POSE = matrices.last().pose();
84+
RenderedGltfModel.CURRENT_NORMAL = matrices.last().normal();
85+
matrices.popPose();
8686

87-
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, p_114490_ & '\uffff', p_114490_ >> 16 & '\uffff');
87+
GL30.glVertexAttribI2i(RenderedGltfModel.vaUV2, light & '\uffff', light >> 16 & '\uffff');
8888

8989
if(MCglTF.getInstance().isShaderModActive()) {
9090
renderedScene.renderForShaderMod();
@@ -122,7 +122,11 @@ public void render(ExampleEntity p_114485_, float p_114486_, float p_114487_, Po
122122
GL30.glBindVertexArray(currentVAO);
123123
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, currentArrayBuffer);
124124
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, currentElementArrayBuffer);
125-
super.render(p_114485_, p_114486_, p_114487_, p_114488_, p_114489_, p_114490_);
125+
super.render(entity, yRotDelta, tickDelta, matrices, vertexConsumers, light);
126+
}
127+
128+
protected void checkAndRenderNameTag(ExampleEntity entity, float yRotDelta, float tickDelta, PoseStack matrices, MultiBufferSource vertexConsumers, int light) {
129+
super.render(entity, yRotDelta, tickDelta, matrices, vertexConsumers, light);
126130
}
127131

128132
}

0 commit comments

Comments
 (0)