diff --git a/README.md b/README.md index b617f79..279eebd 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,37 @@ # MCglTF -A 3D model loader library which load glTF format file and prepare the required techniques to render the model for Minecraft Modding enviroment. + +A 3D model loader library which load glTF format file and prepare the required techniques to render the model for +Minecraft Modding enviroment. Various features from glTF spec are available but still remain a good compatibility and performance. [![](https://cf.way2muchnoise.eu/title/mcgltf.svg)](https://www.curseforge.com/minecraft/mc-mods/mcgltf) [![](https://cf.way2muchnoise.eu/versions/mcgltf.svg)](https://www.curseforge.com/minecraft/mc-mods/mcgltf) [![](https://cf.way2muchnoise.eu/mcgltf.svg)](https://www.curseforge.com/minecraft/mc-mods/mcgltf) + ## Usages + The example codes for rendering Block, Item, and Entity + - https://github.com/ModularMods/MCglTF-Example + ## Features + - [x] GLTF format (Embedded resources or via ResourceLocation) - [x] GLB format - [x] UVs - [x] Normals - [x] Tangents - [x] Vertex colors -- [x] Materials (Require [OptiFine](https://github.com/ModularMods/MCglTF/wiki/How-to-make-PBR-Materials-working-with-OptiFine) or [Iris Shaders](https://github.com/ModularMods/MCglTF/wiki/How-to-make-PBR-Materials-working-with-Iris-Shaders) and supported ShaderPack for PBR and Normal map) +- [x] Materials ( + Require [OptiFine](https://github.com/ModularMods/MCglTF/wiki/How-to-make-PBR-Materials-working-with-OptiFine) + or [Iris Shaders](https://github.com/ModularMods/MCglTF/wiki/How-to-make-PBR-Materials-working-with-Iris-Shaders) and + supported ShaderPack for PBR and Normal map) - [x] Textures - [ ] Mutiple texture coordinates (For compatibility reason with Vanilla) - [x] Rig - [x] Animations (multiple) - [x] Morph targets - [x] Zero-scale node culling (https://github.com/KhronosGroup/glTF/pull/2059) + ## Credit + - JglTF by javagl : https://github.com/javagl/JglTF - Mikk Tangent Generator by jMonkeyEngine : https://github.com/jMonkeyEngine/jmonkeyengine \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1523221..e1e61ea 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'fabric-loom' version '1.0-SNAPSHOT' - id 'maven-publish' + id 'fabric-loom' version '1.0-SNAPSHOT' + id 'maven-publish' } sourceCompatibility = JavaVersion.VERSION_17 @@ -11,80 +11,77 @@ version = project.mod_version group = project.maven_group repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - - content { - includeGroup "maven.modrinth" - } - } - flatDir { - dirs 'libs' - } + // Add repositories to retrieve artifacts from in here. + // You should only use this when depending on other mods because + // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html + // for more information about repositories. + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + + content { + includeGroup "maven.modrinth" + } + } + flatDir { + dirs 'libs' + } } dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings loom.officialMojangMappings() - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings loom.officialMojangMappings() + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - // Uncomment the following line to enable the deprecated Fabric API modules. - // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time. + // Uncomment the following line to enable the deprecated Fabric API modules. + // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time. - // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}" - modImplementation "maven.modrinth:iris:${project.iris_version}" + // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}" + modImplementation "maven.modrinth:iris:${project.iris_version}" } processResources { - inputs.property "version", project.version + inputs.property "version", project.version - filesMatching("fabric.mod.json") { - expand "version": project.version - } + filesMatching("fabric.mod.json") { + expand "version": project.version + } } tasks.withType(JavaCompile).configureEach { - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 17 + // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. + it.options.release = 17 } java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() } jar { - from("LICENSE") { - rename { "${it}_${project.archivesBaseName}"} - } + from("LICENSE") { + rename { "${it}_${project.archivesBaseName}" } + } } // configure the maven publication publishing { - publications { - mavenJava(MavenPublication) { - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } + publications { + mavenJava(MavenPublication) { + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + + } } diff --git a/gradle.properties b/gradle.properties index 952b2ff..e5d05b9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,14 @@ # Done to increase the memory available to gradle. org.gradle.jvmargs=-Xmx4G org.gradle.parallel=true - # Fabric Properties - # check these on https://fabricmc.net/develop - minecraft_version=1.20.4 - loader_version=0.16.3 - +# check these on https://fabricmc.net/develop +minecraft_version=1.20.4 +loader_version=0.16.3 # Mod Properties - mod_version = 1.20.4-Fabric-2.1.0.0 - maven_group = com.modularmods.mcgltf - archives_base_name = MCglTF - +mod_version=1.20.4-Fabric-2.2.0.0 +maven_group=com.modularmods.mcgltf +archives_base_name=MCglTF # Dependencies - fabric_version=0.97.2+1.20.4 - iris_version=1.7.2+1.20.4 +fabric_version=0.97.2+1.20.4 +iris_version=1.7.2+1.20.4 diff --git a/settings.gradle b/settings.gradle index b02216b..c556364 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,3 +8,5 @@ pluginManagement { gradlePluginPortal() } } + +rootProject.name = "MCglTF" \ No newline at end of file diff --git a/src/main/java/com/modularmods/mcgltf/RenderedGltfModel.java b/src/main/java/com/modularmods/mcgltf/RenderedGltfModel.java index bb4b3d0..76785d9 100644 --- a/src/main/java/com/modularmods/mcgltf/RenderedGltfModel.java +++ b/src/main/java/com/modularmods/mcgltf/RenderedGltfModel.java @@ -75,8 +75,8 @@ public class RenderedGltfModel { * optifine/shaders.txt */ public static final int COLOR_MAP_INDEX = GL13.GL_TEXTURE0; - public static int NORMAL_MAP_INDEX = GL13.GL_TEXTURE1; - public static int SPECULAR_MAP_INDEX = GL13.GL_TEXTURE3; + public static int NORMAL_MAP_INDEX = GL13.GL_TEXTURE2; + public static int SPECULAR_MAP_INDEX = GL13.GL_TEXTURE1; public static int MODEL_VIEW_MATRIX; public static int MODEL_VIEW_MATRIX_INVERSE; @@ -87,7 +87,7 @@ public class RenderedGltfModel { public static final int vaUV0 = 2; public static final int vaUV1 = 3; public static final int vaUV2 = 4; - public static final int vaNormal = 5; + public static final int vaNormal = 10; protected static final Runnable vanillaDefaultMaterialCommand = () -> { GL11.glBindTexture(GL11.GL_TEXTURE_2D, MCglTF.getInstance().getDefaultColorMap()); @@ -140,21 +140,38 @@ public class RenderedGltfModel { static { if(FabricLoader.getInstance().isModLoaded("iris")) { - mc_midTexCoord = 7; - at_tangent = 8; + mc_midTexCoord = 12; + at_tangent = 13; shaderModDefaultMaterialCommand = () -> { - GL13.glActiveTexture(COLOR_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, MCglTF.getInstance().getDefaultColorMap()); - if(NORMAL_MAP_INDEX != -1) { - GL13.glActiveTexture(NORMAL_MAP_INDEX); + + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + int normalMapLocation = GL20.glGetUniformLocation(currentProgram, "normals"); + if(normalMapLocation != -1) { + GL13.glActiveTexture(GL13.GL_TEXTURE0 + 2); GL11.glBindTexture(GL11.GL_TEXTURE_2D, MCglTF.getInstance().getDefaultNormalMap()); + GL20.glUniform1i(normalMapLocation, 2); } - if(SPECULAR_MAP_INDEX != -1) { - GL13.glActiveTexture(SPECULAR_MAP_INDEX); + int specularMapLocation = GL20.glGetUniformLocation(currentProgram, "specular"); + if(specularMapLocation != -1) { + GL13.glActiveTexture(GL13.GL_TEXTURE0 + 1); GL11.glBindTexture(GL11.GL_TEXTURE_2D, MCglTF.getInstance().getDefaultSpecularMap()); + GL20.glUniform1i(specularMapLocation, 1); } + + // Enhanced color attribute with proper alpha handling GL20.glVertexAttrib4f(vaColor, 1.0F, 1.0F, 1.0F, 1.0F); + + // Add entityColor uniform support for shader packs like SEUS PTGI + int entityColorLocation = GL20.glGetUniformLocation(currentProgram, "entityColor"); + if (entityColorLocation != -1) { + GL20.glUniform4f(entityColorLocation, 1.0f, 1.0f, 1.0f, 0.0f); + } + + // Ensure proper blending state for Iris rendering + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_CULL_FACE); }; } @@ -169,7 +186,20 @@ public class RenderedGltfModel { GL11.glBindTexture(GL11.GL_TEXTURE_2D, MCglTF.getInstance().getDefaultNormalMap()); GL13.glActiveTexture(SPECULAR_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, MCglTF.getInstance().getDefaultSpecularMap()); + + // Enhanced color attribute with proper alpha handling GL20.glVertexAttrib4f(vaColor, 1.0F, 1.0F, 1.0F, 1.0F); + + // Add entityColor uniform support for shader packs like SEUS PTGI + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + int entityColorLocation = GL20.glGetUniformLocation(currentProgram, "entityColor"); + if (entityColorLocation != -1) { + GL20.glUniform4f(entityColorLocation, 1.0f, 1.0f, 1.0f, 0.0f); + } + + // Ensure proper blending state for non-Iris rendering + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_CULL_FACE); }; } @@ -191,15 +221,15 @@ protected void processSceneModels(List gltfRenderData, List, List, List> commands = rootNodeModelToCommands.get(nodeModel); List rootSkinningCommands; List vanillaRootRenderCommands; List shaderModRootRenderCommands; if(commands == null) { - rootSkinningCommands = new ArrayList(); - vanillaRootRenderCommands = new ArrayList(); + rootSkinningCommands = new ArrayList<>(); + vanillaRootRenderCommands = new ArrayList<>(); shaderModRootRenderCommands = new ArrayList(); processNodeModel(gltfRenderData, nodeModel, rootSkinningCommands, vanillaRootRenderCommands, shaderModRootRenderCommands); rootNodeModelToCommands.put(nodeModel, Triple.of(rootSkinningCommands, vanillaRootRenderCommands, shaderModRootRenderCommands)); @@ -474,88 +504,95 @@ protected void processMeshPrimitiveModelIncludedTangent(List gltfRende false, tangentsAccessorModel.getByteStride(), tangentsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(at_tangent); - - AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); - if(colorsAccessorModel != null) { - colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { - colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaColor, - colorsAccessorModel.getElementType().getNumComponents(), - colorsAccessorModel.getComponentType(), - false, - colorsAccessorModel.getByteStride(), - colorsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaColor); - } - - AccessorModel texcoordsAccessorModel = attributes.get("TEXCOORD_0"); - if(texcoordsAccessorModel != null) { - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { - texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaUV0, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaUV0); - - AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); - if(texcoords1AccessorModel != null) { - texcoordsAccessorModel = texcoords1AccessorModel; - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { - texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + GL20.glEnableVertexAttribArray(at_tangent); + + AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); + if(colorsAccessorModel != null) { + colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { + colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaColor, + colorsAccessorModel.getElementType().getNumComponents(), + colorsAccessorModel.getComponentType(), + false, + colorsAccessorModel.getByteStride(), + colorsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaColor); + } + + AccessorModel texcoordsAccessorModel = attributes.get("TEXCOORD_0"); + if(texcoordsAccessorModel != null) { + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { + texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaUV0, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaUV0); + + AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); + if(texcoords1AccessorModel != null) { + texcoordsAccessorModel = texcoords1AccessorModel; + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { + texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + } + GL20.glVertexAttribPointer( + mc_midTexCoord, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(mc_midTexCoord); + } + + int mode = meshPrimitiveModel.getMode(); + AccessorModel indices = meshPrimitiveModel.getIndices(); + if(indices != null) { + int glIndicesBufferView = obtainElementArrayBuffer(gltfRenderData, indices.getBufferViewModel()); + int count = indices.getCount(); + int type = indices.getComponentType(); + int offset = indices.getByteOffset(); + renderCommand.add(() -> { + try { + GL30.glBindVertexArray(glVertexArray); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, glIndicesBufferView); + GL11.glDrawElements(mode, count, type, offset); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } + }); } else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); - } - } - GL20.glVertexAttribPointer( - mc_midTexCoord, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(mc_midTexCoord); - } - - int mode = meshPrimitiveModel.getMode(); - AccessorModel indices = meshPrimitiveModel.getIndices(); - if(indices != null) { - int glIndicesBufferView = obtainElementArrayBuffer(gltfRenderData, indices.getBufferViewModel()); - int count = indices.getCount(); - int type = indices.getComponentType(); - int offset = indices.getByteOffset(); - renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, glIndicesBufferView); - GL11.glDrawElements(mode, count, type, offset); - }); - } - else { - int count = positionsAccessorModel.getCount(); - renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL11.glDrawArrays(mode, 0, count); - }); - } - } + int count = positionsAccessorModel.getCount(); + renderCommand.add(() -> { + try { + GL30.glBindVertexArray(glVertexArray); + GL11.glDrawArrays(mode, 0, count); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } + }); + } } protected void processMeshPrimitiveModelSimpleTangent(List gltfRenderData, NodeModel nodeModel, MeshModel meshModel, MeshPrimitiveModel meshPrimitiveModel, List renderCommand, Map attributes, AccessorModel positionsAccessorModel, AccessorModel normalsAccessorModel) { int glVertexArray = GL30.glGenVertexArrays(); @@ -693,16 +730,24 @@ protected void processMeshPrimitiveModelSimpleTangent(List gltfRenderD int type = indices.getComponentType(); int offset = indices.getByteOffset(); renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, glIndicesBufferView); - GL11.glDrawElements(mode, count, type, offset); + try { + GL30.glBindVertexArray(glVertexArray); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, glIndicesBufferView); + GL11.glDrawElements(mode, count, type, offset); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } }); } else { int count = positionsAccessorModel.getCount(); renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL11.glDrawArrays(mode, 0, count); + try { + GL30.glBindVertexArray(glVertexArray); + GL11.glDrawArrays(mode, 0, count); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } }); } } @@ -751,231 +796,237 @@ protected void processMeshPrimitiveModelMikkTangent(List gltfRenderDat GL20.glEnableVertexAttribArray(vaNormal); AccessorModel texcoordsAccessorModel = attributes.get("TEXCOORD_0"); - AccessorModel tangentsAccessorModel = obtainTangentsAccessorModel(meshPrimitiveModel, positionsAccessorModel, normalsAccessorModel, texcoordsAccessorModel); - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTangentMorphTarget(morphTargets, targetAccessorDatas, positionsAccessorModel, normalsAccessorModel, texcoordsAccessorModel, "TEXCOORD_0", tangentsAccessorModel)) { - bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, tangentsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, tangentsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - at_tangent, - tangentsAccessorModel.getElementType().getNumComponents(), - tangentsAccessorModel.getComponentType(), - false, - tangentsAccessorModel.getByteStride(), - tangentsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(at_tangent); - - AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); - if(colorsAccessorModel != null) { - colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { - colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaColor, - colorsAccessorModel.getElementType().getNumComponents(), - colorsAccessorModel.getComponentType(), - false, - colorsAccessorModel.getByteStride(), - colorsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaColor); - } - - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { - texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaUV0, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaUV0); - - AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); - if(texcoords1AccessorModel != null) { - texcoordsAccessorModel = texcoords1AccessorModel; - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { - texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); - } - } - GL20.glVertexAttribPointer( - mc_midTexCoord, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(mc_midTexCoord); - - int mode = meshPrimitiveModel.getMode(); - int count = positionsAccessorModel.getCount(); - renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL11.glDrawArrays(mode, 0, count); - }); - } - - protected void processMeshPrimitiveModelFlatNormalSimpleTangent(List gltfRenderData, NodeModel nodeModel, MeshModel meshModel, MeshPrimitiveModel meshPrimitiveModel, List renderCommand) { - int glVertexArray = GL30.glGenVertexArrays(); - gltfRenderData.add(() -> GL30.glDeleteVertexArrays(glVertexArray)); - GL30.glBindVertexArray(glVertexArray); - - Pair, List>> unindexed = obtainUnindexed(meshPrimitiveModel); - Map attributes = unindexed.getLeft(); - List> morphTargets = unindexed.getRight(); - - AccessorModel positionsAccessorModel = attributes.get("POSITION"); - AccessorModel normalsAccessorModel = obtainNormalsAccessorModel(positionsAccessorModel); - AccessorModel tangentsAccessorModel = obtainTangentsAccessorModel(normalsAccessorModel); - List targetAccessorDatas = new ArrayList(morphTargets.size()); - List normalTargetAccessorDatas = new ArrayList(morphTargets.size()); - List tangentTargetAccessorDatas = new ArrayList(morphTargets.size()); - if(createPositionNormalTangentMorphTarget(morphTargets, positionsAccessorModel, normalsAccessorModel, tangentsAccessorModel, targetAccessorDatas, normalTargetAccessorDatas, tangentTargetAccessorDatas)) { - bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, positionsAccessorModel, targetAccessorDatas); - GL20.glVertexAttribPointer( - vaPosition, - positionsAccessorModel.getElementType().getNumComponents(), - positionsAccessorModel.getComponentType(), - false, - positionsAccessorModel.getByteStride(), - positionsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaPosition); - - bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, normalsAccessorModel, normalTargetAccessorDatas); - GL20.glVertexAttribPointer( - vaNormal, - normalsAccessorModel.getElementType().getNumComponents(), - normalsAccessorModel.getComponentType(), - false, - normalsAccessorModel.getByteStride(), - normalsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaNormal); - - bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, tangentsAccessorModel, tangentTargetAccessorDatas); - GL20.glVertexAttribPointer( - at_tangent, - tangentsAccessorModel.getElementType().getNumComponents(), - tangentsAccessorModel.getComponentType(), - false, - tangentsAccessorModel.getByteStride(), - tangentsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(at_tangent); - } - else { - bindArrayBufferViewModel(gltfRenderData, positionsAccessorModel.getBufferViewModel()); - GL20.glVertexAttribPointer( - vaPosition, - positionsAccessorModel.getElementType().getNumComponents(), - positionsAccessorModel.getComponentType(), - false, - positionsAccessorModel.getByteStride(), - positionsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaPosition); - - bindArrayBufferViewModel(gltfRenderData, normalsAccessorModel.getBufferViewModel()); - GL20.glVertexAttribPointer( - vaNormal, - normalsAccessorModel.getElementType().getNumComponents(), - normalsAccessorModel.getComponentType(), - false, - normalsAccessorModel.getByteStride(), - normalsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaNormal); - - bindArrayBufferViewModel(gltfRenderData, tangentsAccessorModel.getBufferViewModel()); - GL20.glVertexAttribPointer( + AccessorModel tangentsAccessorModel = obtainTangentsAccessorModel(meshPrimitiveModel, positionsAccessorModel, normalsAccessorModel, texcoordsAccessorModel); + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTangentMorphTarget(morphTargets, targetAccessorDatas, positionsAccessorModel, normalsAccessorModel, texcoordsAccessorModel, "TEXCOORD_0", tangentsAccessorModel)) { + bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, tangentsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, tangentsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( at_tangent, tangentsAccessorModel.getElementType().getNumComponents(), tangentsAccessorModel.getComponentType(), false, tangentsAccessorModel.getByteStride(), tangentsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(at_tangent); - } - - AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); - if(colorsAccessorModel != null) { - colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { - colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaColor, - colorsAccessorModel.getElementType().getNumComponents(), - colorsAccessorModel.getComponentType(), - false, - colorsAccessorModel.getByteStride(), - colorsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaColor); - } - - AccessorModel texcoordsAccessorModel = attributes.get("TEXCOORD_0"); - if(texcoordsAccessorModel != null) { - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { - texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaUV0, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaUV0); - - AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); - if(texcoords1AccessorModel != null) { - texcoordsAccessorModel = texcoords1AccessorModel; + GL20.glEnableVertexAttribArray(at_tangent); + + AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); + if(colorsAccessorModel != null) { + colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { + colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaColor, + colorsAccessorModel.getElementType().getNumComponents(), + colorsAccessorModel.getComponentType(), + false, + colorsAccessorModel.getByteStride(), + colorsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaColor); + } + targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); } else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaUV0, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaUV0); + + AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); + if(texcoords1AccessorModel != null) { + texcoordsAccessorModel = texcoords1AccessorModel; + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { + texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + } + GL20.glVertexAttribPointer( + mc_midTexCoord, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(mc_midTexCoord); + + int mode = meshPrimitiveModel.getMode(); + int count = positionsAccessorModel.getCount(); + renderCommand.add(() -> { + try { + GL30.glBindVertexArray(glVertexArray); + GL11.glDrawArrays(mode, 0, count); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } + }); } + + protected void processMeshPrimitiveModelFlatNormalSimpleTangent(List gltfRenderData, NodeModel nodeModel, MeshModel meshModel, MeshPrimitiveModel meshPrimitiveModel, List renderCommand) { + int glVertexArray = GL30.glGenVertexArrays(); + gltfRenderData.add(() -> GL30.glDeleteVertexArrays(glVertexArray)); + GL30.glBindVertexArray(glVertexArray); + + Pair, List>> unindexed = obtainUnindexed(meshPrimitiveModel); + Map attributes = unindexed.getLeft(); + List> morphTargets = unindexed.getRight(); + + AccessorModel positionsAccessorModel = attributes.get("POSITION"); + AccessorModel normalsAccessorModel = obtainNormalsAccessorModel(positionsAccessorModel); + AccessorModel tangentsAccessorModel = obtainTangentsAccessorModel(normalsAccessorModel); + List targetAccessorDatas = new ArrayList(morphTargets.size()); + List normalTargetAccessorDatas = new ArrayList(morphTargets.size()); + List tangentTargetAccessorDatas = new ArrayList(morphTargets.size()); + if(createPositionNormalTangentMorphTarget(morphTargets, positionsAccessorModel, normalsAccessorModel, tangentsAccessorModel, targetAccessorDatas, normalTargetAccessorDatas, tangentTargetAccessorDatas)) { + bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, positionsAccessorModel, targetAccessorDatas); + GL20.glVertexAttribPointer( + vaPosition, + positionsAccessorModel.getElementType().getNumComponents(), + positionsAccessorModel.getComponentType(), + false, + positionsAccessorModel.getByteStride(), + positionsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaPosition); + + bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, normalsAccessorModel, normalTargetAccessorDatas); + GL20.glVertexAttribPointer( + vaNormal, + normalsAccessorModel.getElementType().getNumComponents(), + normalsAccessorModel.getComponentType(), + false, + normalsAccessorModel.getByteStride(), + normalsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaNormal); + + bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, tangentsAccessorModel, tangentTargetAccessorDatas); + GL20.glVertexAttribPointer( + at_tangent, + tangentsAccessorModel.getElementType().getNumComponents(), + tangentsAccessorModel.getComponentType(), + false, + tangentsAccessorModel.getByteStride(), + tangentsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(at_tangent); + } + else { + bindArrayBufferViewModel(gltfRenderData, positionsAccessorModel.getBufferViewModel()); + GL20.glVertexAttribPointer( + vaPosition, + positionsAccessorModel.getElementType().getNumComponents(), + positionsAccessorModel.getComponentType(), + false, + positionsAccessorModel.getByteStride(), + positionsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaPosition); + + bindArrayBufferViewModel(gltfRenderData, normalsAccessorModel.getBufferViewModel()); + GL20.glVertexAttribPointer( + vaNormal, + normalsAccessorModel.getElementType().getNumComponents(), + normalsAccessorModel.getComponentType(), + false, + normalsAccessorModel.getByteStride(), + normalsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaNormal); + + bindArrayBufferViewModel(gltfRenderData, tangentsAccessorModel.getBufferViewModel()); + GL20.glVertexAttribPointer( + at_tangent, + tangentsAccessorModel.getElementType().getNumComponents(), + tangentsAccessorModel.getComponentType(), + false, + tangentsAccessorModel.getByteStride(), + tangentsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(at_tangent); } - } - GL20.glVertexAttribPointer( - mc_midTexCoord, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(mc_midTexCoord); - } - int mode = meshPrimitiveModel.getMode(); - int count = positionsAccessorModel.getCount(); - renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL11.glDrawArrays(mode, 0, count); - }); - } + AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); + if(colorsAccessorModel != null) { + colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { + colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaColor, + colorsAccessorModel.getElementType().getNumComponents(), + colorsAccessorModel.getComponentType(), + false, + colorsAccessorModel.getByteStride(), + colorsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaColor); + } + + AccessorModel texcoordsAccessorModel = attributes.get("TEXCOORD_0"); + if(texcoordsAccessorModel != null) { + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { + texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaUV0, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaUV0); + + AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); + if(texcoords1AccessorModel != null) { + texcoordsAccessorModel = texcoords1AccessorModel; + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { + texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + } + GL20.glVertexAttribPointer( + mc_midTexCoord, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(mc_midTexCoord); + } + + int mode = meshPrimitiveModel.getMode(); + int count = positionsAccessorModel.getCount(); + renderCommand.add(() -> { + try { + GL30.glBindVertexArray(glVertexArray); + GL11.glDrawArrays(mode, 0, count); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } + }); } protected void processMeshPrimitiveModelFlatNormalMikkTangent(List gltfRenderData, NodeModel nodeModel, MeshModel meshModel, MeshPrimitiveModel meshPrimitiveModel, List renderCommand) { int glVertexArray = GL30.glGenVertexArrays(); @@ -1110,8 +1161,12 @@ protected void processMeshPrimitiveModelFlatNormalMikkTangent(List glt int mode = meshPrimitiveModel.getMode(); int count = positionsAccessorModel.getCount(); renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL11.glDrawArrays(mode, 0, count); + try { + GL30.glBindVertexArray(glVertexArray); + GL11.glDrawArrays(mode, 0, count); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } }); } @@ -1253,162 +1308,165 @@ protected void processMeshPrimitiveModelIncludedTangent(List gltfRende GL20.glEnableVertexAttribArray(skinning_normal); targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createMorphTarget(morphTargets, targetAccessorDatas, "TANGENT")) { - bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, skinningCommand, tangentsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, tangentsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - skinning_tangent, - tangentsAccessorModel.getElementType().getNumComponents(), - tangentsAccessorModel.getComponentType(), - false, - tangentsAccessorModel.getByteStride(), - tangentsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(skinning_tangent); - - int positionBuffer = GL15.glGenBuffers(); - gltfRenderData.add(() -> GL15.glDeleteBuffers(positionBuffer)); - GL15.glBindBuffer(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, positionBuffer); - GL15.glBufferData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, positionsAccessorModel.getBufferViewModel().getByteLength(), GL15.GL_STATIC_DRAW); - GL30.glBindBufferBase(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, skinning_out_position, positionBuffer); - - int normalBuffer = GL15.glGenBuffers(); - gltfRenderData.add(() -> GL15.glDeleteBuffers(normalBuffer)); - GL15.glBindBuffer(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, normalBuffer); - GL15.glBufferData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, normalsAccessorModel.getBufferViewModel().getByteLength(), GL15.GL_STATIC_DRAW); - GL30.glBindBufferBase(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, skinning_out_normal, normalBuffer); - - int tangentBuffer = GL15.glGenBuffers(); - gltfRenderData.add(() -> GL15.glDeleteBuffers(tangentBuffer)); - GL15.glBindBuffer(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, tangentBuffer); - GL15.glBufferData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, tangentsAccessorModel.getBufferViewModel().getByteLength(), GL15.GL_STATIC_DRAW); - GL30.glBindBufferBase(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, skinning_out_tangent, tangentBuffer); - - int pointCount = positionsAccessorModel.getCount(); - skinningCommand.add(() -> { - GL40.glBindTransformFeedback(GL40.GL_TRANSFORM_FEEDBACK, glTransformFeedback); - - GL30.glBeginTransformFeedback(GL11.GL_POINTS); - GL30.glBindVertexArray(glVertexArraySkinning); - GL11.glDrawArrays(GL11.GL_POINTS, 0, pointCount); - GL30.glEndTransformFeedback(); - }); - - int glVertexArray = GL30.glGenVertexArrays(); - gltfRenderData.add(() -> GL30.glDeleteVertexArrays(glVertexArray)); - GL30.glBindVertexArray(glVertexArray); - - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, positionBuffer); - GL20.glVertexAttribPointer( - vaPosition, - positionsAccessorModel.getElementType().getNumComponents(), - positionsAccessorModel.getComponentType(), - false, - 0, - 0); - GL20.glEnableVertexAttribArray(vaPosition); - - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, normalBuffer); - GL20.glVertexAttribPointer( - vaNormal, - normalsAccessorModel.getElementType().getNumComponents(), - normalsAccessorModel.getComponentType(), - false, - 0, - 0); - GL20.glEnableVertexAttribArray(vaNormal); - - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, tangentBuffer); - GL20.glVertexAttribPointer( - at_tangent, - tangentsAccessorModel.getElementType().getNumComponents(), - tangentsAccessorModel.getComponentType(), - false, - 0, - 0); - GL20.glEnableVertexAttribArray(at_tangent); - - AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); - if(colorsAccessorModel != null) { - colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { - colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaColor, - colorsAccessorModel.getElementType().getNumComponents(), - colorsAccessorModel.getComponentType(), - false, - colorsAccessorModel.getByteStride(), - colorsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaColor); - } - - AccessorModel texcoordsAccessorModel = attributes.get("TEXCOORD_0"); - if(texcoordsAccessorModel != null) { - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { - texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); - } - GL20.glVertexAttribPointer( - vaUV0, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(vaUV0); - - AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); - if(texcoords1AccessorModel != null) { - texcoordsAccessorModel = texcoords1AccessorModel; - targetAccessorDatas = new ArrayList(morphTargets.size()); - if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { - texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); - } - else { - bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); - } - } - GL20.glVertexAttribPointer( - mc_midTexCoord, - texcoordsAccessorModel.getElementType().getNumComponents(), - texcoordsAccessorModel.getComponentType(), - false, - texcoordsAccessorModel.getByteStride(), - texcoordsAccessorModel.getByteOffset()); - GL20.glEnableVertexAttribArray(mc_midTexCoord); - } - - int mode = meshPrimitiveModel.getMode(); - AccessorModel indices = meshPrimitiveModel.getIndices(); - if(indices != null) { - int glIndicesBufferView = obtainElementArrayBuffer(gltfRenderData, indices.getBufferViewModel()); - int count = indices.getCount(); - int type = indices.getComponentType(); - int offset = indices.getByteOffset(); - renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, glIndicesBufferView); - GL11.glDrawElements(mode, count, type, offset); - }); - } - else { - renderCommand.add(() -> { - GL30.glBindVertexArray(glVertexArray); - GL40.glDrawTransformFeedback(mode, glTransformFeedback); - }); - } - } + if(createMorphTarget(morphTargets, targetAccessorDatas, "TANGENT")) { + bindVec3FloatMorphed(gltfRenderData, nodeModel, meshModel, skinningCommand, tangentsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, tangentsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + skinning_tangent, + tangentsAccessorModel.getElementType().getNumComponents(), + tangentsAccessorModel.getComponentType(), + false, + tangentsAccessorModel.getByteStride(), + tangentsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(skinning_tangent); + + int positionBuffer = GL15.glGenBuffers(); + gltfRenderData.add(() -> GL15.glDeleteBuffers(positionBuffer)); + GL15.glBindBuffer(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, positionBuffer); + GL15.glBufferData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, positionsAccessorModel.getBufferViewModel().getByteLength(), GL15.GL_STATIC_DRAW); + GL30.glBindBufferBase(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, skinning_out_position, positionBuffer); + + int normalBuffer = GL15.glGenBuffers(); + gltfRenderData.add(() -> GL15.glDeleteBuffers(normalBuffer)); + GL15.glBindBuffer(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, normalBuffer); + GL15.glBufferData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, normalsAccessorModel.getBufferViewModel().getByteLength(), GL15.GL_STATIC_DRAW); + GL30.glBindBufferBase(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, skinning_out_normal, normalBuffer); + + int tangentBuffer = GL15.glGenBuffers(); + gltfRenderData.add(() -> GL15.glDeleteBuffers(tangentBuffer)); + GL15.glBindBuffer(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, tangentBuffer); + GL15.glBufferData(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, tangentsAccessorModel.getBufferViewModel().getByteLength(), GL15.GL_STATIC_DRAW); + GL30.glBindBufferBase(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, skinning_out_tangent, tangentBuffer); + + int pointCount = positionsAccessorModel.getCount(); + skinningCommand.add(() -> { + GL40.glBindTransformFeedback(GL40.GL_TRANSFORM_FEEDBACK, glTransformFeedback); + + GL30.glBeginTransformFeedback(GL11.GL_POINTS); + GL30.glBindVertexArray(glVertexArraySkinning); + GL11.glDrawArrays(GL11.GL_POINTS, 0, pointCount); + GL30.glEndTransformFeedback(); + }); + + int glVertexArray = GL30.glGenVertexArrays(); + gltfRenderData.add(() -> GL30.glDeleteVertexArrays(glVertexArray)); + GL30.glBindVertexArray(glVertexArray); + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, positionBuffer); + GL20.glVertexAttribPointer( + vaPosition, + positionsAccessorModel.getElementType().getNumComponents(), + positionsAccessorModel.getComponentType(), + false, + 0, + 0); + GL20.glEnableVertexAttribArray(vaPosition); + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, normalBuffer); + GL20.glVertexAttribPointer( + vaNormal, + normalsAccessorModel.getElementType().getNumComponents(), + normalsAccessorModel.getComponentType(), + false, + 0, + 0); + GL20.glEnableVertexAttribArray(vaNormal); + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, tangentBuffer); + GL20.glVertexAttribPointer( + at_tangent, + tangentsAccessorModel.getElementType().getNumComponents(), + tangentsAccessorModel.getComponentType(), + false, + 0, + 0); + GL20.glEnableVertexAttribArray(at_tangent); + + AccessorModel colorsAccessorModel = attributes.get("COLOR_0"); + if(colorsAccessorModel != null) { + colorsAccessorModel = obtainVec4ColorsAccessorModel(colorsAccessorModel); + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createColorMorphTarget(morphTargets, targetAccessorDatas, "COLOR_0")) { + colorsAccessorModel = bindColorMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, colorsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, colorsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaColor, + colorsAccessorModel.getElementType().getNumComponents(), + colorsAccessorModel.getComponentType(), + false, + colorsAccessorModel.getByteStride(), + colorsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaColor); + } + + AccessorModel texcoordsAccessorModel = attributes.get("TEXCOORD_0"); + if(texcoordsAccessorModel != null) { + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_0")) { + texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + GL20.glVertexAttribPointer( + vaUV0, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(vaUV0); + + AccessorModel texcoords1AccessorModel = attributes.get("TEXCOORD_1"); + if(texcoords1AccessorModel != null) { + texcoordsAccessorModel = texcoords1AccessorModel; + targetAccessorDatas = new ArrayList(morphTargets.size()); + if(createTexcoordMorphTarget(morphTargets, targetAccessorDatas, "TEXCOORD_1")) { + texcoordsAccessorModel = bindTexcoordMorphed(gltfRenderData, nodeModel, meshModel, renderCommand, texcoordsAccessorModel, targetAccessorDatas); + } + else { + bindArrayBufferViewModel(gltfRenderData, texcoordsAccessorModel.getBufferViewModel()); + } + } + GL20.glVertexAttribPointer( + mc_midTexCoord, + texcoordsAccessorModel.getElementType().getNumComponents(), + texcoordsAccessorModel.getComponentType(), + false, + texcoordsAccessorModel.getByteStride(), + texcoordsAccessorModel.getByteOffset()); + GL20.glEnableVertexAttribArray(mc_midTexCoord); + } + + int mode = meshPrimitiveModel.getMode(); + AccessorModel indices = meshPrimitiveModel.getIndices(); + if(indices != null) { + int glIndicesBufferView = obtainElementArrayBuffer(gltfRenderData, indices.getBufferViewModel()); + int count = indices.getCount(); + int type = indices.getComponentType(); + int offset = indices.getByteOffset(); + renderCommand.add(() -> { + try { + GL30.glBindVertexArray(glVertexArray); + GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, glIndicesBufferView); + GL11.glDrawElements(mode, count, type, offset); + } finally { + GL20.glDisableVertexAttribArray(at_tangent); + } + }); + } + else { + renderCommand.add(() -> { + GL30.glBindVertexArray(glVertexArray); + GL40.glDrawTransformFeedback(mode, glTransformFeedback); + }); + } } protected void processMeshPrimitiveModelSimpleTangent(List gltfRenderData, NodeModel nodeModel, MeshModel meshModel, MeshPrimitiveModel meshPrimitiveModel, List renderCommand, List skinningCommand, Map attributes, AccessorModel positionsAccessorModel, AccessorModel normalsAccessorModel) { int glTransformFeedback = GL40.glGenTransformFeedbacks(); @@ -3297,94 +3355,79 @@ public class TextureInfo { public Runnable shaderModMaterialCommand; public void initMaterialCommand(List gltfRenderData, RenderedGltfModel renderedModel, MaterialModel materialModel) { - int colorMap; - int normalMap; - int specularMap; - List textureModels = renderedModel.gltfModel.getTextureModels(); - if(materialModel instanceof MaterialModelV2) { - MaterialModelV2 materialModelV2 = (MaterialModelV2) materialModel; - - if(baseColorTexture == null) { - TextureModel textureModel = materialModelV2.getBaseColorTexture(); - if(textureModel != null) { - colorMap = renderedModel.obtainGlTexture(gltfRenderData, textureModel); - baseColorTexture = new TextureInfo(); - baseColorTexture.index = textureModels.indexOf(textureModel); - } - else colorMap = MCglTF.getInstance().getDefaultColorMap(); - } - else colorMap = renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(baseColorTexture.index)); - - if(normalTexture == null) { - TextureModel textureModel = materialModelV2.getNormalTexture(); - if(textureModel != null) { - normalMap = renderedModel.obtainGlTexture(gltfRenderData, textureModel); - normalTexture = new TextureInfo(); - normalTexture.index = textureModels.indexOf(textureModel); + int colorMap; + final int normalMap; + final int specularMap; + List textureModels = renderedModel.gltfModel.getTextureModels(); + if(materialModel instanceof MaterialModelV2) { + MaterialModelV2 materialModelV2 = (MaterialModelV2) materialModel; + + if(baseColorTexture == null) { + TextureModel textureModel = materialModelV2.getBaseColorTexture(); + if(textureModel != null) { + colorMap = renderedModel.obtainGlTexture(gltfRenderData, textureModel); + baseColorTexture = new TextureInfo(); + baseColorTexture.index = textureModels.indexOf(textureModel); + } + else colorMap = MCglTF.getInstance().getDefaultColorMap(); + } + else colorMap = renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(baseColorTexture.index)); + + if(normalTexture == null) { + TextureModel textureModel = materialModelV2.getNormalTexture(); + if(textureModel != null) { + normalMap = renderedModel.obtainGlTexture(gltfRenderData, textureModel); + normalTexture = new TextureInfo(); + normalTexture.index = textureModels.indexOf(textureModel); + } + else normalMap = MCglTF.getInstance().getDefaultNormalMap(); + } + else normalMap = renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(normalTexture.index)); + + if(specularTexture == null) { + TextureModel textureModel = materialModelV2.getMetallicRoughnessTexture(); + if(textureModel != null) { + specularMap = renderedModel.obtainGlTexture(gltfRenderData, textureModel); + specularTexture = new TextureInfo(); + specularTexture.index = textureModels.indexOf(textureModel); + } + else specularMap = MCglTF.getInstance().getDefaultSpecularMap(); + } + else specularMap = renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(specularTexture.index)); + + if(baseColorFactor == null) baseColorFactor = materialModelV2.getBaseColorFactor(); + + if(doubleSided == null) doubleSided = materialModelV2.isDoubleSided(); } - else normalMap = MCglTF.getInstance().getDefaultNormalMap(); - } - else normalMap = renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(normalTexture.index)); - - if(specularTexture == null) { - TextureModel textureModel = materialModelV2.getMetallicRoughnessTexture(); - if(textureModel != null) { - specularMap = renderedModel.obtainGlTexture(gltfRenderData, textureModel); - specularTexture = new TextureInfo(); - specularTexture.index = textureModels.indexOf(textureModel); + else { + colorMap = baseColorTexture == null ? MCglTF.getInstance().getDefaultColorMap() : renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(baseColorTexture.index)); + normalMap = normalTexture == null ? MCglTF.getInstance().getDefaultNormalMap() : renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(normalTexture.index)); + specularMap = specularTexture == null ? MCglTF.getInstance().getDefaultSpecularMap() : renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(specularTexture.index)); + if(baseColorFactor == null) baseColorFactor = new float[]{1.0F, 1.0F, 1.0F, 1.0F}; + if(doubleSided == null) doubleSided = false; } - else specularMap = MCglTF.getInstance().getDefaultSpecularMap(); - } - else specularMap = renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(specularTexture.index)); - - if(baseColorFactor == null) baseColorFactor = materialModelV2.getBaseColorFactor(); - - if(doubleSided == null) doubleSided = materialModelV2.isDoubleSided(); - } - else { - colorMap = baseColorTexture == null ? MCglTF.getInstance().getDefaultColorMap() : renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(baseColorTexture.index)); - normalMap = normalTexture == null ? MCglTF.getInstance().getDefaultNormalMap() : renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(normalTexture.index)); - specularMap = specularTexture == null ? MCglTF.getInstance().getDefaultSpecularMap() : renderedModel.obtainGlTexture(gltfRenderData, textureModels.get(specularTexture.index)); - if(baseColorFactor == null) baseColorFactor = new float[]{1.0F, 1.0F, 1.0F, 1.0F}; - if(doubleSided == null) doubleSided = false; - } - - if(doubleSided) { - vanillaMaterialCommand = () -> { - GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); - GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); - GL11.glDisable(GL11.GL_CULL_FACE); - }; - shaderModMaterialCommand = () -> { - GL13.glActiveTexture(COLOR_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); - GL13.glActiveTexture(NORMAL_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, normalMap); - GL13.glActiveTexture(SPECULAR_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, specularMap); - GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); - GL11.glDisable(GL11.GL_CULL_FACE); - }; - } - else { - vanillaMaterialCommand = () -> { - GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); - GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); - GL11.glEnable(GL11.GL_CULL_FACE); - }; - shaderModMaterialCommand = () -> { - GL13.glActiveTexture(COLOR_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); - GL13.glActiveTexture(NORMAL_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, normalMap); - GL13.glActiveTexture(SPECULAR_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, specularMap); - GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); - GL11.glEnable(GL11.GL_CULL_FACE); - }; - } - } - } + + if(doubleSided) { + vanillaMaterialCommand = () -> { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); + GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + GL11.glDisable(GL11.GL_CULL_FACE); + }; + shaderModMaterialCommand = () -> { + GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + GL11.glDisable(GL11.GL_CULL_FACE); + }; } + else { + vanillaMaterialCommand = () -> { + GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); + GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + GL11.glEnable(GL11.GL_CULL_FACE); + }; + shaderModMaterialCommand = () -> { + GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + GL11.glEnable(GL11.GL_CULL_FACE); + }; } + } } public void bindArrayBufferViewModel(List gltfRenderData, BufferViewModel bufferViewModel) { Integer glBufferView = bufferViewModelToGlBufferView.get(bufferViewModel); diff --git a/src/main/java/com/modularmods/mcgltf/RenderedGltfScene.java b/src/main/java/com/modularmods/mcgltf/RenderedGltfScene.java index 15a9ca1..470c83b 100644 --- a/src/main/java/com/modularmods/mcgltf/RenderedGltfScene.java +++ b/src/main/java/com/modularmods/mcgltf/RenderedGltfScene.java @@ -79,7 +79,7 @@ public void renderForVanilla() { public void renderForShaderMod() { int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); - + if(!skinningCommands.isEmpty()) { GL20.glUseProgram(MCglTF.getInstance().getGlProgramSkinnig()); GL11.glEnable(GL30.GL_RASTERIZER_DISCARD); diff --git a/src/main/java/com/modularmods/mcgltf/animation/GltfAnimationCreator.java b/src/main/java/com/modularmods/mcgltf/animation/GltfAnimationCreator.java index 357162f..65d0894 100644 --- a/src/main/java/com/modularmods/mcgltf/animation/GltfAnimationCreator.java +++ b/src/main/java/com/modularmods/mcgltf/animation/GltfAnimationCreator.java @@ -13,6 +13,7 @@ import de.javagl.jgltf.model.AnimationModel.Channel; import de.javagl.jgltf.model.AnimationModel.Interpolation; import de.javagl.jgltf.model.AnimationModel.Sampler; +import net.minecraft.client.Minecraft; public final class GltfAnimationCreator { @@ -31,7 +32,6 @@ public static List createGltfAnimation(AnimationModel anima continue; } AccessorFloatData inputFloatData = (AccessorFloatData)inputData; - AccessorModel output = sampler.getOutput(); AccessorData outputData = output.getAccessorData(); if (!(outputData instanceof AccessorFloatData)) diff --git a/src/main/java/com/modularmods/mcgltf/iris/IrisRenderingHook.java b/src/main/java/com/modularmods/mcgltf/iris/IrisRenderingHook.java index 42b5e68..89cedb6 100644 --- a/src/main/java/com/modularmods/mcgltf/iris/IrisRenderingHook.java +++ b/src/main/java/com/modularmods/mcgltf/iris/IrisRenderingHook.java @@ -145,87 +145,31 @@ private static void setupAndRender(WorldRenderingPhase phase, ShaderInstance sha boolean currentCullFace = GL11.glGetBoolean(GL11.GL_CULL_FACE); - if(phase != WorldRenderingPhase.NONE) { - int currentProgram = shaderInstance.getId(); - RenderedGltfModel.MODEL_VIEW_MATRIX = GL20.glGetUniformLocation(currentProgram, "iris_ModelViewMat"); - RenderedGltfModel.NORMAL_MATRIX = GL20.glGetUniformLocation(currentProgram, "iris_NormalMat"); - int normals = GL20.glGetUniformLocation(currentProgram, "normals"); - int specular = GL20.glGetUniformLocation(currentProgram, "specular"); - - int currentTextureColor; - - if(normals != -1) { - RenderedGltfModel.NORMAL_MAP_INDEX = GL13.GL_TEXTURE0 + GL20.glGetUniformi(currentProgram, normals); - if(specular != -1) { - RenderedGltfModel.SPECULAR_MAP_INDEX = GL13.GL_TEXTURE0 + GL20.glGetUniformi(currentProgram, specular); - - GL13.glActiveTexture(RenderedGltfModel.NORMAL_MAP_INDEX); - int currentTextureNormal = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - GL13.glActiveTexture(RenderedGltfModel.SPECULAR_MAP_INDEX); - int currentTextureSpecular = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - GL13.glActiveTexture(GL13.GL_TEXTURE0); - currentTextureColor = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - - commands.forEach(Runnable::run); - - GL13.glActiveTexture(RenderedGltfModel.NORMAL_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureNormal); - GL13.glActiveTexture(RenderedGltfModel.SPECULAR_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureSpecular); - } - else { - RenderedGltfModel.SPECULAR_MAP_INDEX = -1; - - GL13.glActiveTexture(RenderedGltfModel.NORMAL_MAP_INDEX); - int currentTextureNormal = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - GL13.glActiveTexture(GL13.GL_TEXTURE0); - currentTextureColor = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - - commands.forEach(Runnable::run); - - GL13.glActiveTexture(RenderedGltfModel.NORMAL_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureNormal); - } + int currentTextureColor = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + GL13.glActiveTexture(GL13.GL_TEXTURE0 + 2); + int currentTextureNormal = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + GL13.glActiveTexture(GL13.GL_TEXTURE0 + 1); + int currentTextureSpecular = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + + try { + if(phase != WorldRenderingPhase.NONE) { + int currentProgram = shaderInstance.getId(); + RenderedGltfModel.MODEL_VIEW_MATRIX = GL20.glGetUniformLocation(currentProgram, "iris_ModelViewMat"); + RenderedGltfModel.NORMAL_MATRIX = GL20.glGetUniformLocation(currentProgram, "iris_NormalMat"); } else { - RenderedGltfModel.NORMAL_MAP_INDEX = -1; - if(specular != -1) { - RenderedGltfModel.SPECULAR_MAP_INDEX = GL13.GL_TEXTURE0 + GL20.glGetUniformi(currentProgram, specular); - - GL13.glActiveTexture(RenderedGltfModel.SPECULAR_MAP_INDEX); - int currentTextureSpecular = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - GL13.glActiveTexture(GL13.GL_TEXTURE0); - currentTextureColor = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - - commands.forEach(Runnable::run); - - GL13.glActiveTexture(RenderedGltfModel.SPECULAR_MAP_INDEX); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureSpecular); - } - else { - RenderedGltfModel.SPECULAR_MAP_INDEX = -1; - - GL13.glActiveTexture(GL13.GL_TEXTURE0); - currentTextureColor = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - - commands.forEach(Runnable::run); - } + RenderedGltfModel.LIGHT0_DIRECTION = new Vector3f(shaderInstance.LIGHT0_DIRECTION.getFloatBuffer()); + RenderedGltfModel.LIGHT1_DIRECTION = new Vector3f(shaderInstance.LIGHT1_DIRECTION.getFloatBuffer()); } - - GL13.glActiveTexture(GL13.GL_TEXTURE0); - GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureColor); - } - else { - RenderedGltfModel.LIGHT0_DIRECTION = new Vector3f(shaderInstance.LIGHT0_DIRECTION.getFloatBuffer()); - RenderedGltfModel.LIGHT1_DIRECTION = new Vector3f(shaderInstance.LIGHT1_DIRECTION.getFloatBuffer()); - - GL13.glActiveTexture(GL13.GL_TEXTURE0); - int currentTextureColor = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - commands.forEach(Runnable::run); - + } finally { + GL20.glDisableVertexAttribArray(RenderedGltfModel.at_tangent); GL13.glActiveTexture(GL13.GL_TEXTURE0); GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureColor); + GL13.glActiveTexture(GL13.GL_TEXTURE0 + 2); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureNormal); + GL13.glActiveTexture(GL13.GL_TEXTURE0 + 1); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, currentTextureSpecular); } if(currentCullFace) GL11.glEnable(GL11.GL_CULL_FACE); diff --git a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfModelIris.java b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfModelIris.java index d4507f5..8e3cdc3 100644 --- a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfModelIris.java +++ b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfModelIris.java @@ -155,11 +155,21 @@ public void initMaterialCommand(List gltfRenderData, RenderedGltfModel vanillaMaterialCommand = () -> { GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + + // Enhanced transparency handling for vanilla rendering + if(baseColorFactor[3] < 1.0f) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } else { + GL11.glDisable(GL11.GL_BLEND); + } + GL11.glDisable(GL11.GL_CULL_FACE); }; shaderModMaterialCommand = () -> { GL13.glActiveTexture(COLOR_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); + if(NORMAL_MAP_INDEX != -1) { GL13.glActiveTexture(NORMAL_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, normalMap); @@ -168,7 +178,26 @@ public void initMaterialCommand(List gltfRenderData, RenderedGltfModel GL13.glActiveTexture(SPECULAR_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, specularMap); } - GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + + // Enhanced color attribute with proper alpha handling + GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], + baseColorFactor[2], baseColorFactor[3]); + + // Enhanced transparency handling for Iris shader rendering + if(baseColorFactor[3] < 1.0f) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } else { + GL11.glDisable(GL11.GL_BLEND); + } + + // Add entityColor uniform support for shader packs like SEUS PTGI + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + int entityColorLocation = GL20.glGetUniformLocation(currentProgram, "entityColor"); + if (entityColorLocation != -1) { + GL20.glUniform4f(entityColorLocation, 1.0f, 1.0f, 1.0f, 0.0f); + } + GL11.glDisable(GL11.GL_CULL_FACE); }; } @@ -176,11 +205,21 @@ public void initMaterialCommand(List gltfRenderData, RenderedGltfModel vanillaMaterialCommand = () -> { GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + + // Enhanced transparency handling for vanilla rendering + if(baseColorFactor[3] < 1.0f) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } else { + GL11.glDisable(GL11.GL_BLEND); + } + GL11.glEnable(GL11.GL_CULL_FACE); }; shaderModMaterialCommand = () -> { GL13.glActiveTexture(COLOR_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, colorMap); + if(NORMAL_MAP_INDEX != -1) { GL13.glActiveTexture(NORMAL_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, normalMap); @@ -189,7 +228,26 @@ public void initMaterialCommand(List gltfRenderData, RenderedGltfModel GL13.glActiveTexture(SPECULAR_MAP_INDEX); GL11.glBindTexture(GL11.GL_TEXTURE_2D, specularMap); } - GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], baseColorFactor[2], baseColorFactor[3]); + + // Enhanced color attribute with proper alpha handling + GL20.glVertexAttrib4f(vaColor, baseColorFactor[0], baseColorFactor[1], + baseColorFactor[2], baseColorFactor[3]); + + // Enhanced transparency handling for Iris shader rendering + if(baseColorFactor[3] < 1.0f) { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + } else { + GL11.glDisable(GL11.GL_BLEND); + } + + // Add entityColor uniform support for shader packs like SEUS PTGI + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + int entityColorLocation = GL20.glGetUniformLocation(currentProgram, "entityColor"); + if (entityColorLocation != -1) { + GL20.glUniform4f(entityColorLocation, 1.0f, 1.0f, 1.0f, 0.0f); + } + GL11.glEnable(GL11.GL_CULL_FACE); }; } diff --git a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL30Iris.java b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL30Iris.java index 5b2d772..9ea4eec 100644 --- a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL30Iris.java +++ b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL30Iris.java @@ -1,5 +1,8 @@ package com.modularmods.mcgltf.iris; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; + import com.modularmods.mcgltf.RenderedGltfModel; import com.modularmods.mcgltf.RenderedGltfSceneGL30; @@ -14,6 +17,8 @@ public void renderForVanilla() { @Override public void renderForShaderMod() { + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + shaderModRenderCommands.forEach(Runnable::run); RenderedGltfModel.NODE_GLOBAL_TRANSFORMATION_LOOKUP_CACHE.clear(); diff --git a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL33Iris.java b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL33Iris.java index cb3cb8e..fec95b4 100644 --- a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL33Iris.java +++ b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL33Iris.java @@ -30,13 +30,15 @@ public void renderForVanilla() { @Override public void renderForShaderMod() { + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + if(!skinningCommands.isEmpty()) { GL20.glUseProgram(MCglTF.getInstance().getGlProgramSkinnig()); GL11.glEnable(GL30.GL_RASTERIZER_DISCARD); skinningCommands.forEach(Runnable::run); GL15.glBindBuffer(GL31.GL_TEXTURE_BUFFER, 0); GL11.glDisable(GL30.GL_RASTERIZER_DISCARD); - GL20.glUseProgram(RenderedGltfModel.CURRENT_SHADER_INSTANCE.getId()); + GL20.glUseProgram(currentProgram); } shaderModRenderCommands.forEach(Runnable::run); diff --git a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL40Iris.java b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL40Iris.java index 0db3f0c..8a93d76 100644 --- a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL40Iris.java +++ b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneGL40Iris.java @@ -32,6 +32,8 @@ public void renderForVanilla() { @Override public void renderForShaderMod() { + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + if(!skinningCommands.isEmpty()) { GL20.glUseProgram(MCglTF.getInstance().getGlProgramSkinnig()); GL11.glEnable(GL30.GL_RASTERIZER_DISCARD); @@ -39,7 +41,7 @@ public void renderForShaderMod() { GL15.glBindBuffer(GL31.GL_TEXTURE_BUFFER, 0); GL40.glBindTransformFeedback(GL40.GL_TRANSFORM_FEEDBACK, 0); GL11.glDisable(GL30.GL_RASTERIZER_DISCARD); - GL20.glUseProgram(RenderedGltfModel.CURRENT_SHADER_INSTANCE.getId()); + GL20.glUseProgram(currentProgram); } shaderModRenderCommands.forEach(Runnable::run); diff --git a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneIris.java b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneIris.java index 1e74cb8..9025d68 100644 --- a/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneIris.java +++ b/src/main/java/com/modularmods/mcgltf/iris/RenderedGltfSceneIris.java @@ -32,6 +32,8 @@ public void renderForVanilla() { @Override public void renderForShaderMod() { + int currentProgram = GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM); + if(!skinningCommands.isEmpty()) { GL20.glUseProgram(MCglTF.getInstance().getGlProgramSkinnig()); GL11.glEnable(GL30.GL_RASTERIZER_DISCARD); @@ -39,10 +41,10 @@ public void renderForShaderMod() { GL15.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); GL40.glBindTransformFeedback(GL40.GL_TRANSFORM_FEEDBACK, 0); GL11.glDisable(GL30.GL_RASTERIZER_DISCARD); - GL20.glUseProgram(RenderedGltfModel.CURRENT_SHADER_INSTANCE.getId()); + GL20.glUseProgram(currentProgram); } - - shaderModRenderCommands.forEach(Runnable::run); + + shaderModRenderCommands.forEach(Runnable::run); RenderedGltfModel.NODE_GLOBAL_TRANSFORMATION_LOOKUP_CACHE.clear(); } diff --git a/src/main/java/de/javagl/jgltf/model/GltfAnimations.java b/src/main/java/de/javagl/jgltf/model/GltfAnimations.java index 095ce0e..415ac00 100644 --- a/src/main/java/de/javagl/jgltf/model/GltfAnimations.java +++ b/src/main/java/de/javagl/jgltf/model/GltfAnimations.java @@ -93,12 +93,12 @@ public static List createModelAnimations( } /** - * Create one {@link Animation} for each {@link AnimationModel.Channel}. + * Create one {@link Animation} for each {@link Channel}. * If there is any error or inconsistency in the given data, then a * warning will be printed and the respective animation will be * skipped. * - * @param channels The {@link AnimationModel.Channel} list + * @param channels The {@link Channel} list * @return The list of model animations */ private static List createModelAnimationsForChannels( @@ -119,11 +119,11 @@ private static List createModelAnimationsForChannels( /** * Create the {@link Animation} for the given - * {@link AnimationModel.Channel}. If there is any error or inconsistency + * {@link Channel}. If there is any error or inconsistency * in the given data, then a warning will be printed and null * will be returned. * - * @param channel The {@link AnimationModel.Channel} + * @param channel The {@link Channel} * @return The {@link Animation}, or null. */ private static Animation createModelAnimation(Channel channel) diff --git a/src/main/java/de/javagl/jgltf/model/gl/impl/DefaultShaderModel.java b/src/main/java/de/javagl/jgltf/model/gl/impl/DefaultShaderModel.java index 994147b..9c83acc 100644 --- a/src/main/java/de/javagl/jgltf/model/gl/impl/DefaultShaderModel.java +++ b/src/main/java/de/javagl/jgltf/model/gl/impl/DefaultShaderModel.java @@ -49,7 +49,7 @@ public class DefaultShaderModel extends AbstractNamedModelElement private ByteBuffer shaderData; /** - * The {@link de.javagl.jgltf.model.gl.ShaderModel.ShaderType} + * The {@link ShaderType} */ private final ShaderType shaderType; @@ -58,7 +58,7 @@ public class DefaultShaderModel extends AbstractNamedModelElement * * @param uri The URI * @param shaderType The - * {@link de.javagl.jgltf.model.gl.ShaderModel.ShaderType} + * {@link ShaderType} */ public DefaultShaderModel(String uri, ShaderType shaderType) { diff --git a/src/main/java/de/javagl/jgltf/model/impl/DefaultAnimationModel.java b/src/main/java/de/javagl/jgltf/model/impl/DefaultAnimationModel.java index 49dfc04..d6c565c 100644 --- a/src/main/java/de/javagl/jgltf/model/impl/DefaultAnimationModel.java +++ b/src/main/java/de/javagl/jgltf/model/impl/DefaultAnimationModel.java @@ -43,7 +43,7 @@ public class DefaultAnimationModel extends AbstractNamedModelElement { /** * Default implementation of a - * {@link de.javagl.jgltf.model.AnimationModel.Sampler} + * {@link Sampler} */ public static class DefaultSampler implements Sampler { @@ -103,7 +103,7 @@ public AccessorModel getOutput() /** * Default implementation of a - * {@link de.javagl.jgltf.model.AnimationModel.Channel} + * {@link Channel} */ public static class DefaultChannel implements Channel { @@ -163,7 +163,7 @@ public String getPath() } /** - * The {@link de.javagl.jgltf.model.AnimationModel.Channel} instances + * The {@link Channel} instances * of this animation */ private final List channels; @@ -177,9 +177,9 @@ public DefaultAnimationModel() } /** - * Add the given {@link de.javagl.jgltf.model.AnimationModel.Channel} + * Add the given {@link Channel} * - * @param channel The {@link de.javagl.jgltf.model.AnimationModel.Channel} + * @param channel The {@link Channel} */ public void addChannel(Channel channel) { diff --git a/src/main/java/de/javagl/jgltf/model/v1/GltfModelCreatorV1.java b/src/main/java/de/javagl/jgltf/model/v1/GltfModelCreatorV1.java index bf2bfa0..be2e272 100644 --- a/src/main/java/de/javagl/jgltf/model/v1/GltfModelCreatorV1.java +++ b/src/main/java/de/javagl/jgltf/model/v1/GltfModelCreatorV1.java @@ -729,7 +729,7 @@ private Channel createChannel( NodeModel nodeModel = get("nodes", nodeId, gltfModel::getNodeModel); - AnimationModel.Channel channel = + Channel channel = new DefaultChannel(sampler, nodeModel, path); return channel; } diff --git a/src/main/java/de/javagl/jgltf/model/v2/GltfModelCreatorV2.java b/src/main/java/de/javagl/jgltf/model/v2/GltfModelCreatorV2.java index 682d852..c2f7396 100644 --- a/src/main/java/de/javagl/jgltf/model/v2/GltfModelCreatorV2.java +++ b/src/main/java/de/javagl/jgltf/model/v2/GltfModelCreatorV2.java @@ -802,7 +802,7 @@ private Channel createChannel( } String path = animationChannelTarget.getPath(); - AnimationModel.Channel channel = + Channel channel = new DefaultChannel(sampler, nodeModel, path); return channel; } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 1af12e9..f18e878 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -2,21 +2,19 @@ "schemaVersion": 1, "id": "mcgltf", "version": "${version}", - "name": "MCglTF", "description": "A glTF model loader library based on JglTF for Minecraft.", "authors": [ - "TimLee9024", "Protoxy" + "TimLee9024", + "Protoxy" ], "contact": { "homepage": "https://www.curseforge.com/minecraft/mc-mods/mcgltf", "sources": "https://github.com/singlerr/MCglTF-1.20.4", "issues": "https://github.com/singlerr/MCglTF-1.20.4/issues" }, - "license": "MIT", "icon": "assets/mcgltf/icon.png", - "environment": "client", "entrypoints": { "main": [ @@ -26,7 +24,6 @@ "mixins": [ "mcgltf.iris.mixins.json" ], - "depends": { "fabricloader": ">=0.15.0", "fabric": "*", diff --git a/src/main/resources/mcgltf.iris.mixins.json b/src/main/resources/mcgltf.iris.mixins.json index 38f8b00..debd44a 100644 --- a/src/main/resources/mcgltf.iris.mixins.json +++ b/src/main/resources/mcgltf.iris.mixins.json @@ -5,9 +5,9 @@ "package": "com.modularmods.mcgltf.iris.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "MixinBufferUploader", "MixinRenderStateShard", - "MixinBufferUploader", - "MixinVertexBuffer" + "MixinVertexBuffer" ], "injectors": { "defaultRequire": 1