Skip to content

Commit ceff8fa

Browse files
committed
test obj model
1 parent ecff109 commit ceff8fa

File tree

34 files changed

+2429
-12
lines changed

34 files changed

+2429
-12
lines changed

common/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ dependencies {
77
implementation "dev.felnull:felnull-java-library:${rootProject.felnull_version}"
88
implementation "dev.felnull:felnull-java-library-natives:${rootProject.felnull_version}"
99
implementation 'com.madgag:animated-gif-lib:1.4'
10+
implementation 'de.javagl:obj:0.3.0'
1011
}
1112

1213
architectury {

common/src/main/java/dev/felnull/otyacraftengine/client/OtyacraftEngineClient.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import dev.felnull.otyacraftengine.client.gui.screen.debug.RenderTestScreen;
66
import dev.felnull.otyacraftengine.client.handler.ClientHandler;
77
import dev.felnull.otyacraftengine.client.handler.TestClientHandler;
8+
import dev.felnull.otyacraftengine.client.model.TestModel;
89
import dev.felnull.otyacraftengine.client.renderer.blockentity.TestRenderer;
910
import dev.felnull.otyacraftengine.client.renderer.item.TestItemRenderer;
1011
import dev.felnull.otyacraftengine.client.util.ClientUtilInit;
@@ -27,6 +28,7 @@ public static void testInit() {
2728
TestRenderer.init();
2829
TestItemRenderer.init();
2930
TestBEScreen.fInit();
30-
RenderTestScreen.first();
31+
RenderTestScreen.fInit();
32+
TestModel.init();
3133
}
3234
}

common/src/main/java/dev/felnull/otyacraftengine/client/gui/screen/debug/RenderTestScreen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public static void addRenderTest(IRenderTest renderTest) {
197197
renderTests.add(renderTest);
198198
}
199199

200-
public static void first() {
200+
public static void fInit() {
201201
// for (Item item : Registry.ITEM) {
202202
// addRenderTest(new ItemRenderTest(item));
203203
// }
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package dev.felnull.otyacraftengine.client.model;
2+
3+
import dev.felnull.otyacraftengine.client.gui.screen.debug.RenderTestScreen;
4+
import dev.felnull.otyacraftengine.client.model.obj.OEOBJLoader;
5+
import dev.felnull.otyacraftengine.client.util.OERenderUtil;
6+
import net.minecraft.client.renderer.LightTexture;
7+
import net.minecraft.client.renderer.Sheets;
8+
import net.minecraft.client.renderer.block.model.ItemTransforms;
9+
import net.minecraft.client.renderer.texture.OverlayTexture;
10+
import net.minecraft.client.resources.model.*;
11+
import net.minecraft.resources.ResourceLocation;
12+
import net.minecraft.server.packs.resources.ResourceManager;
13+
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
17+
public class OEModelLoader {
18+
private static final Map<ResourceLocation, UnbakedModel> UNBAKED_MODELS = new HashMap<>();
19+
private static final Map<ResourceLocation, BakedModel> BAKED_MODELS = new HashMap<>();
20+
21+
public OEModelLoader() {
22+
23+
}
24+
25+
public static OEModelLoader load(ResourceManager manager) {
26+
for (ResourceLocation id : manager.listResources("oe_models", path -> path.endsWith(".obj"))) {
27+
var ubm = OEOBJLoader.getInstance().load(manager, id, ItemTransforms.NO_TRANSFORMS);
28+
UNBAKED_MODELS.put(id, ubm);
29+
}
30+
return new OEModelLoader();
31+
}
32+
33+
34+
public void apply() {
35+
for (ResourceLocation resourceLocation : UNBAKED_MODELS.keySet()) {
36+
RenderTestScreen.addRenderTest((poseStack, multiBufferSource, f) -> {
37+
var model = BAKED_MODELS.get(resourceLocation);
38+
OERenderUtil.renderModel(poseStack, multiBufferSource.getBuffer(Sheets.cutoutBlockSheet()), model, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY);
39+
});
40+
}
41+
}
42+
43+
public static void onBake(ModelBakery bakery) {
44+
ModelState state = BlockModelRotation.by(0, 0);
45+
UNBAKED_MODELS.forEach((n, m) -> BAKED_MODELS.put(n, m.bake(bakery, Material::sprite, state, n)));
46+
}
47+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package dev.felnull.otyacraftengine.client.model;
2+
3+
public class Raw3dModel {
4+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.felnull.otyacraftengine.client.model;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import dev.felnull.otyacraftengine.client.gui.screen.debug.RenderTestScreen;
5+
import dev.felnull.otyacraftengine.client.gui.screen.debug.rendertest.IRenderTest;
6+
import net.minecraft.client.renderer.MultiBufferSource;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
public class TestModel {
10+
public static void init() {
11+
RenderTestScreen.addRenderTest(new TestRender());
12+
}
13+
14+
public static class TestRender implements IRenderTest {
15+
@Override
16+
public void renderTest(@NotNull PoseStack poseStack, @NotNull MultiBufferSource multiBufferSource, float f) {
17+
// var vc = multiBufferSource.getBuffer(Sheets.cutoutBlockSheet());
18+
//OERenderUtil.renderTextureSprite(IOEBaseComponent.WIDGETS, poseStack, multiBufferSource, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY);
19+
20+
}
21+
}
22+
}
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
package dev.felnull.otyacraftengine.client.model.obj;
2+
3+
import de.javagl.obj.FloatTuple;
4+
import de.javagl.obj.Mtl;
5+
import de.javagl.obj.Mtls;
6+
7+
import java.io.BufferedReader;
8+
import java.io.IOException;
9+
import java.io.InputStream;
10+
import java.io.InputStreamReader;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
import java.util.StringTokenizer;
14+
15+
public class OEMtl implements Mtl {
16+
private final Mtl material;
17+
private int tintIndex = -1;
18+
private boolean useDiffuseColor = false;
19+
20+
public OEMtl(Mtl material) {
21+
this.material = material;
22+
}
23+
24+
@Override
25+
public String getName() {
26+
return material.getName();
27+
}
28+
29+
@Override
30+
public FloatTuple getKa() {
31+
return material.getKa();
32+
}
33+
34+
@Override
35+
public void setKa(float ka0, float ka1, float ka2) {
36+
material.setKa(ka0, ka1, ka2);
37+
}
38+
39+
@Override
40+
public FloatTuple getKs() {
41+
return material.getKs();
42+
}
43+
44+
@Override
45+
public void setKs(float ks0, float ks1, float ks2) {
46+
material.setKs(ks0, ks1, ks2);
47+
}
48+
49+
@Override
50+
public FloatTuple getKd() {
51+
return material.getKd();
52+
}
53+
54+
@Override
55+
public void setKd(float kd0, float kd1, float kd2) {
56+
material.setKd(kd0, kd1, kd2);
57+
}
58+
59+
@Override
60+
public String getMapKd() {
61+
return material.getMapKd();
62+
}
63+
64+
@Override
65+
public void setMapKd(String mapKd) {
66+
material.setMapKd(mapKd);
67+
}
68+
69+
@Override
70+
public float getNs() {
71+
return material.getNs();
72+
}
73+
74+
@Override
75+
public void setNs(float ns) {
76+
material.setNs(ns);
77+
}
78+
79+
@Override
80+
public float getD() {
81+
return material.getD();
82+
}
83+
84+
@Override
85+
public void setD(float d) {
86+
material.setD(d);
87+
}
88+
89+
public int getTintIndex() {
90+
return this.tintIndex;
91+
}
92+
93+
public void setTintIndex(int tintIndex) {
94+
this.tintIndex = tintIndex;
95+
}
96+
97+
public boolean useDiffuseColor() {
98+
return this.useDiffuseColor;
99+
}
100+
101+
public void setUseDiffuseColor() {
102+
this.useDiffuseColor = true;
103+
}
104+
105+
public static List<OEMtl> read(InputStream inputStream)
106+
throws IOException {
107+
BufferedReader reader = new BufferedReader(
108+
new InputStreamReader(inputStream));
109+
return readImpl(reader);
110+
}
111+
112+
private static List<OEMtl> readImpl(BufferedReader reader)
113+
throws IOException {
114+
List<OEMtl> mtlList = new ArrayList<>();
115+
116+
OEMtl currentMtl = null;
117+
118+
while (true) {
119+
String line = reader.readLine();
120+
if (line == null) {
121+
break;
122+
}
123+
124+
line = line.trim();
125+
126+
boolean finished = false;
127+
while (line.endsWith("\\")) {
128+
line = line.substring(0, line.length() - 2);
129+
String nextLine = reader.readLine();
130+
if (nextLine == null) {
131+
finished = true;
132+
break;
133+
}
134+
line += " " + nextLine;
135+
}
136+
if (finished) {
137+
break;
138+
}
139+
140+
StringTokenizer st = new StringTokenizer(line);
141+
if (!st.hasMoreTokens()) {
142+
continue;
143+
}
144+
145+
String identifier = st.nextToken();
146+
if (identifier.equalsIgnoreCase("newmtl")) {
147+
String name = line.substring("newmtl".length()).trim();
148+
currentMtl = new OEMtl(Mtls.create(name));
149+
mtlList.add(currentMtl);
150+
} else if (identifier.equalsIgnoreCase("Ka")) {
151+
float ka0 = parseFloat(st.nextToken());
152+
float ka1 = parseFloat(st.nextToken());
153+
float ka2 = parseFloat(st.nextToken());
154+
currentMtl.setKa(ka0, ka1, ka2);
155+
} else if (identifier.equalsIgnoreCase("Ks")) {
156+
float ks0 = parseFloat(st.nextToken());
157+
float ks1 = parseFloat(st.nextToken());
158+
float ks2 = parseFloat(st.nextToken());
159+
currentMtl.setKs(ks0, ks1, ks2);
160+
} else if (identifier.equalsIgnoreCase("Kd")) {
161+
float kd0 = parseFloat(st.nextToken());
162+
float kd1 = parseFloat(st.nextToken());
163+
float kd2 = parseFloat(st.nextToken());
164+
currentMtl.setKd(kd0, kd1, kd2);
165+
} else if (identifier.equalsIgnoreCase("map_Kd")) {
166+
String mapKd = line.substring("map_Kd".length()).trim();
167+
currentMtl.setMapKd(mapKd);
168+
} else if (identifier.equalsIgnoreCase("d")) {
169+
float d = parseFloat(st.nextToken());
170+
currentMtl.setD(d);
171+
} else if (identifier.equalsIgnoreCase("Ns")) {
172+
float ns = parseFloat(st.nextToken());
173+
currentMtl.setNs(ns);
174+
} else if (identifier.equalsIgnoreCase("tintindex")) {
175+
int tint = parseInt(st.nextToken());
176+
currentMtl.setTintIndex(tint);
177+
} else if (identifier.equalsIgnoreCase("use_diffuse")) {
178+
currentMtl.setUseDiffuseColor();
179+
}
180+
}
181+
182+
return mtlList;
183+
}
184+
185+
private static float parseFloat(String s) throws IOException {
186+
try {
187+
return Float.parseFloat(s);
188+
} catch (NumberFormatException e) {
189+
throw new IOException(e);
190+
}
191+
}
192+
193+
private static int parseInt(String s) throws IOException {
194+
try {
195+
return Integer.parseInt(s);
196+
} catch (NumberFormatException e) {
197+
throw new IOException(e);
198+
}
199+
}
200+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package dev.felnull.otyacraftengine.client.model.obj;
2+
3+
import com.google.common.collect.ImmutableSet;
4+
import de.javagl.obj.*;
5+
import net.minecraft.client.Minecraft;
6+
import net.minecraft.client.renderer.block.model.ItemTransforms;
7+
import net.minecraft.client.renderer.texture.TextureAtlas;
8+
import net.minecraft.client.resources.model.UnbakedModel;
9+
import net.minecraft.resources.ResourceLocation;
10+
import net.minecraft.server.packs.resources.ResourceManager;
11+
import net.minecraft.world.inventory.InventoryMenu;
12+
import org.apache.logging.log4j.LogManager;
13+
import org.apache.logging.log4j.Logger;
14+
15+
import java.io.InputStream;
16+
import java.nio.file.Paths;
17+
import java.util.*;
18+
19+
public class OEOBJLoader {
20+
private static final Logger LOGGER = LogManager.getLogger(OEOBJLoader.class);
21+
private static final OEOBJLoader INSTANCE = new OEOBJLoader();
22+
23+
public static OEOBJLoader getInstance() {
24+
return INSTANCE;
25+
}
26+
27+
public UnbakedModel load(ResourceManager manager, ResourceLocation id, ItemTransforms transforms) {
28+
Obj obj = null;
29+
Map<String, List<OEMtl>> mtls = new HashMap<>();
30+
try (InputStream stream = manager.getResource(id).getInputStream()) {
31+
obj = ObjUtils.convertToRenderable(ObjReader.read(stream));
32+
for (String mtlFileName : obj.getMtlFileNames()) {
33+
var mtll = loadMtl(manager, id, mtlFileName);
34+
mtls.put(mtll.get(0).getName(), mtll);
35+
}
36+
} catch (Exception e) {
37+
LOGGER.error("Error occurred while loading resource obj" + id.toString(), e);
38+
}
39+
return load(obj, mtls, transforms);
40+
}
41+
42+
public UnbakedModel load(Obj obj, Map<String, List<OEMtl>> mtls, ItemTransforms transforms) {
43+
return new OEOBJUnbakedModel(obj, mtls, transforms);
44+
}
45+
46+
private List<OEMtl> loadMtl(ResourceManager manager, ResourceLocation objLocation, String mtlFileName) {
47+
List<OEMtl> mtls = new ArrayList<>();
48+
var rl = new ResourceLocation(objLocation.getNamespace(), Paths.get(objLocation.getPath()).getParent().resolve(mtlFileName).toString().replace("\\", "/"));
49+
if (manager.hasResource(rl)) {
50+
try (InputStream stream = manager.getResource(rl).getInputStream()) {
51+
mtls.addAll(OEMtl.read(stream));
52+
} catch (Exception e) {
53+
LOGGER.error("Error occurred while loading resource mtl" + rl, e);
54+
}
55+
}
56+
return mtls;
57+
}
58+
59+
public Set<ResourceLocation> getLoadTextures(TextureAtlas atlas) {
60+
if (atlas.location().equals(InventoryMenu.BLOCK_ATLAS)) {
61+
Set<ResourceLocation> texs = new HashSet<>();
62+
var manager = Minecraft.getInstance().getResourceManager();
63+
for (ResourceLocation id : manager.listResources("oe_models", path -> path.endsWith(".mtl"))) {
64+
try (InputStream stream = manager.getResource(id).getInputStream()) {
65+
var mtl = MtlReader.read(stream);
66+
for (Mtl m : mtl) {
67+
texs.add(new ResourceLocation(m.getMapKd()));
68+
}
69+
} catch (Exception ex) {
70+
LOGGER.error("Error occurred while loading resource mtl texture" + id, ex);
71+
}
72+
}
73+
return texs;
74+
}
75+
return ImmutableSet.of();
76+
}
77+
78+
}

0 commit comments

Comments
 (0)