diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
deleted file mode 100644
index eaf02df..0000000
--- a/.github/workflows/codeql-analysis.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-# For most projects, this workflow file will not need changing; you simply need
-# to commit it to your repository.
-#
-# You may wish to alter this file to override the set of languages analyzed,
-# or to provide custom queries or build logic.
-#
-# ******** NOTE ********
-# We have attempted to detect the languages in your repository. Please check
-# the `language` matrix defined below to confirm you have the correct set of
-# supported CodeQL languages.
-#
-name: "CodeQL"
-
-on: [push, pull_request, workflow_dispatch]
-
-jobs:
- analyze:
- name: Analyze
- runs-on: ubuntu-latest
- permissions:
- actions: read
- contents: read
- security-events: write
-
- strategy:
- fail-fast: false
- matrix:
- language: [ 'java' ]
- # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
- # Learn more:
- # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v3
-
- # Initializes the CodeQL tools for scanning.
- - name: Setup Java JDK
- uses: actions/setup-java@v2
- with:
- distribution: 'adopt'
- java-version: '21'
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v2
- with:
- languages: ${{ matrix.language }}
- # If you wish to specify custom queries, you can do so here or in a config file.
- # By default, queries listed here will override any specified in a config file.
- # Prefix the list here with "+" to use these queries and those in the config file.
- # queries: ./path/to/local/query, your-org/your-repo/queries@main
-
- # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
- # If this step fails, then you should remove it and run the build manually (see below)
- - name: Autobuild
- uses: github/codeql-action/autobuild@v2
-
- # âšī¸ Command-line programs to run using the OS shell.
- # đ https://git.io/JvXDl
-
- # âī¸ If the Autobuild fails above, remove it and uncomment the following three lines
- # and modify them (or add more) to build your code if your project
- # uses a compiled language
-
- #- run: |
- # make bootstrap
- # make release
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
diff --git a/.github/workflows/main.yml b/.github/workflows/maven.yml
similarity index 89%
rename from .github/workflows/main.yml
rename to .github/workflows/maven.yml
index 161eaf9..2295aa6 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/maven.yml
@@ -1,6 +1,6 @@
# This is a basic workflow to help you get started with Actions
-name: CI
+name: Publish to Maven Repository.
# Controls when the action will run.
on: [workflow_dispatch]
@@ -25,6 +25,5 @@ jobs:
- name: Publish package
run: gradle publish --no-daemon
env:
- MAVEN_USER: ${{ secrets.MAVEN_USER }}
- MAVEN_PASS: ${{ secrets.MAVEN_PASS }}
+ MAVEN_PASSWORD: ${{ secrets.REDLANCE_PASSWORD }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..7da51c7
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,159 @@
+name: Publish on Modrinth & CurseForge
+
+on:
+ workflow_dispatch:
+ secrets:
+ CURSEFORGE_TOKEN:
+ required: true
+ MODRINTH_TOKEN:
+ required: true
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Branch
+ uses: actions/checkout@v3
+
+ - name: Get Artifact Id
+ uses: actions/github-script@v5
+ env:
+ branch: ${{ github.head_ref || github.ref_name }}
+ id: artifact_id
+ with:
+ result-encoding: string
+ script: |
+ // use env branch replace / with _
+ return process.env.branch.replace(/\//g, '_')
+
+ - name: Setup Java
+ uses: actions/setup-java@v4
+ with:
+ distribution: 'adopt'
+ java-version: 21
+
+ - name: Grant Execute Permission
+ run: chmod +x gradlew
+
+ - name: Build
+ run: |
+ ./gradlew build
+
+ - name: Upload To Artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ steps.artifact_id.outputs.result }}
+ path: |
+ ./dist/**/*
+ ./fabric/build/libs
+ ./neoforge/build/libs
+ ./gradle.properties
+
+ deploy:
+ runs-on: ubuntu-latest
+ needs:
+ - build
+ steps:
+ - name: Checkout Branch
+ uses: actions/checkout@v3
+
+ - name: Get Artifact Id
+ uses: actions/github-script@v5
+ env:
+ branch: ${{ github.head_ref || github.ref_name }}
+ id: artifact_id
+ with:
+ result-encoding: string
+ script: |
+ // use env branch replace / with _
+ return process.env.branch.replace(/\//g, '_')
+
+ - name: Download Artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: ${{ steps.artifact_id.outputs.result }}
+
+ - name: Load Gradle Properties
+ uses: christian-draeger/read-properties@1.1.1
+ id: gradle_properties
+ with:
+ path: './gradle.properties'
+ properties: 'java_version minecraft_version mod_version'
+
+ - name: Check For Fabric Jar
+ uses: actions/github-script@v5
+ id: fabric_release
+ with:
+ result-encoding: string
+ script: |
+ const fs = require("fs")
+ return fs.readdirSync("./fabric/build/libs")[0] || false;
+
+ - name: Check For Forge Jar
+ uses: actions/github-script@v5
+ id: forge_release
+ with:
+ result-encoding: string
+ script: |
+ const fs = require("fs")
+ return fs.readdirSync("./neoforge/build/libs")[0] || false;
+
+ - name: Run Publish Fabric
+ if: ${{ steps.fabric_release.outputs.result != 'false' }}
+ uses: Kir-Antipov/mc-publish@v3.3
+ with:
+ modrinth-id: OI3FlFon
+ modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
+ modrinth-featured: false
+ modrinth-unfeature-mode: any
+
+ curseforge-id: 1302303
+ curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }}
+
+ name: ${{ steps.gradle_properties.outputs.mod_version }}+${{ steps.gradle_properties.outputs.minecraft_version }}-Fabric
+ version: ${{ steps.gradle_properties.outputs.mod_version }}
+
+ files: |
+ ./fabric/build/libs/!(*-@(dev|sources|javadoc|all|dev-shadow)).jar
+ ./fabric/build/libs/*-@(dev|sources|javadoc|all|dev-shadow).jar
+ version-type: release
+
+ loaders: fabric
+ game-versions: ${{ steps.gradle_properties.outputs.minecraft_version }}
+
+ changelog-file: CHANGELOG.md
+
+ java: ${{ steps.gradle_properties.outputs.java_version }}
+ retry-attempts: 5
+ retry-delay: 60000
+ fail-mode: skip
+
+ - name: Run Publish Forge
+ if: ${{ steps.forge_release.outputs.result != 'false' }}
+ uses: Kir-Antipov/mc-publish@v3.3
+ with:
+ modrinth-id: OI3FlFon
+ modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
+ modrinth-featured: false
+ modrinth-unfeature-mode: any
+
+ curseforge-id: 1302303
+ curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }}
+
+ name: ${{ steps.gradle_properties.outputs.mod_version }}+${{ steps.gradle_properties.outputs.minecraft_version }}-NeoForge
+ version: ${{ steps.gradle_properties.outputs.mod_version }}
+
+ files: |
+ ./neoforge/build/libs/!(*-@(dev|sources|javadoc|all|dev-shadow)).jar
+ ./neoforge/build/libs/*-@(dev|sources|javadoc|all|dev-shadow).jar
+ version-type: release
+
+ loaders: neoforge
+ game-versions: ${{ steps.gradle_properties.outputs.minecraft_version }}
+
+ changelog-file: CHANGELOG.md
+
+ java: ${{ steps.gradle_properties.outputs.java_version }}
+ retry-attempts: 5
+ retry-delay: 60000
+ fail-mode: skip
diff --git a/.gitignore b/.gitignore
index ccb0c56..c2d2c4d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,4 +16,5 @@ classes/
.metadata
.vscode
.settings
-*.launch
\ No newline at end of file
+*.launch
+.DS_Store
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..eda771d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1 @@
+RELEASE!
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 6caf39f..2611402 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
plugins {
- id "com.github.johnrengelman.shadow" version "8.1.1" apply false
+ id "com.gradleup.shadow" version "8.3.8" apply false
id "architectury-plugin" version "3.4-SNAPSHOT"
- id "dev.architectury.loom" version "1.9-SNAPSHOT" apply false
+ id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false
}
architectury {
@@ -15,30 +15,12 @@ subprojects {
silentMojangMappingsLicense()
}
- repositories {
- maven {
- name = "Modrinth"
- url = "https://api.modrinth.com/maven"
- content {
- includeGroup "maven.modrinth"
- }
- }
- maven {
- name "zigythebirdMods"
- url "https://maven.zigythebird.com/mods"
- }
- maven {
- name = 'GeckoLib'
- url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/'
- content {
- includeGroup("software.bernie.geckolib")
- }
- }
- }
-
dependencies {
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
- mappings loom.officialMojangMappings()
+ mappings loom.layered() {
+ officialMojangMappings()
+ parchment("org.parchmentmc.data:parchment-1.21.6:${rootProject.parchment_version}@zip")
+ }
}
}
@@ -47,12 +29,26 @@ allprojects {
apply plugin: "architectury-plugin"
apply plugin: "maven-publish"
- archivesBaseName = rootProject.archives_base_name
- version = rootProject.mod_version
+ base.archivesName = rootProject.archives_base_name
+ version = "${rootProject.mod_version}+mc${rootProject.minecraft_version}"
group = rootProject.maven_group
repositories {
- maven { url "https://maven.neoforged.net/releases" }
+ // Fix issue with lwjgl-freetype not being found on macOS
+ maven {
+ url = "https://libraries.minecraft.net"
+ content {
+ includeModule("org.lwjgl", "lwjgl-freetype")
+ }
+ }
+ maven {
+ name = "NeoForged"
+ url = "https://maven.neoforged.net/releases"
+ }
+ maven {
+ name = "RedlanceMinecraft"
+ url = "https://repo.redlance.org/public"
+ }
mavenLocal()
}
@@ -61,19 +57,25 @@ allprojects {
options.release.set 21
}
+ jar {
+ if (!rootProject.version.toString().contains("dev") && !project.gradle.startParameter.taskNames.contains("runClient"))
+ processResources.exclude('assets/bendable_cuboids/player_animations/*')
+ }
+
java {
withSourcesJar()
}
-}
-project.ext.keys = new Properties()
-ext.ENV = System.getenv()
-ext.keysExists = ENV.MAVEN_PASS != null
-if (keysExists) {
- project.ext.keys.kosmx_maven = ENV.MAVEN_PASS
- project.ext.keys.maven_user = ENV.MAVEN_USER
-} else {
- project.ext.keys.kosmx_maven = "V2h5IGRpZCB5b3UgZGVjb2RlIGl0PyAg"
- project.ext.keys.maven_user = "username"
+ publishing {
+ repositories {
+ maven {
+ name = "RedlanceMinecraft"
+ url = "https://repo.redlance.org/public"
+ credentials {
+ username = "dima_dencep"
+ password = System.getenv("MAVEN_PASSWORD")
+ }
+ }
+ }
+ }
}
-
diff --git a/common/build.gradle b/common/build.gradle
index a9dbdb2..aceabb2 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -7,32 +7,17 @@ loom {
}
dependencies {
- modImplementation "net.fabricmc:fabric-loader:${rootProject.loader_version}"
+ modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
- modCompileOnly "software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}"
- modCompileOnly "com.zigythebird.playeranim:player_animation_library-neoforge-${minecraft_version}:${player_anim_version}"
- modCompileOnly "maven.modrinth:3dskinlayers:D4TLEY5I"
+ modCompileOnly "com.zigythebird.playeranim:PlayerAnimationLibCommon:${rootProject.player_anim_version}"
+ compileOnly "com.zigythebird.playeranim:PlayerAnimationLibCore:${rootProject.player_anim_version}"
}
publishing {
publications {
- maven(MavenPublication) {
- groupId = "com.zigythebird.bendable_cuboids"
- artifactId = "bendable_cuboids-common-$minecraft_version"
- version = rootProject.mod_version
+ mavenCommon(MavenPublication) {
+ artifactId = "BendableCuboidsCommon"
from components.java
}
}
-
- repositories {
- if (System.getenv("GITHUB_ACTOR") != null) {
- maven {
- url = "https://maven.zigythebird.com/mods"
- credentials(PasswordCredentials)
- authentication {
- basic(BasicAuthentication)
- }
- }
- }
- }
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java
index be53520..3d3e66a 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java
@@ -12,13 +12,7 @@
public class ModMixinPlugin implements IMixinConfigPlugin {
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
- if (mixinClassName.endsWith("_geckoOnly") && !hasClass("software.bernie.geckolib.GeckoLib")) {
- return false;
- }
- if (mixinClassName.endsWith("_playerAnim") && !hasClass("com.zigythebird.playeranim.PlayerAnimLibMod")) {
- return false;
- }
- return true;
+ return !mixinClassName.endsWith("_playerAnim") || hasClass("com.zigythebird.playeranim.PlayerAnimLibMod");
}
private static boolean hasClass(String name) {
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/Bendable.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/Bendable.java
new file mode 100644
index 0000000..2c6bb36
--- /dev/null
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/api/Bendable.java
@@ -0,0 +1,5 @@
+package com.zigythebird.bendable_cuboids.api;
+
+public interface Bendable {
+ float getBend();
+}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableCube.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableCube.java
new file mode 100644
index 0000000..1f5c57b
--- /dev/null
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableCube.java
@@ -0,0 +1,54 @@
+package com.zigythebird.bendable_cuboids.api;
+
+import com.zigythebird.bendable_cuboids.impl.Plane;
+import net.minecraft.core.Direction;
+import net.minecraft.util.Mth;
+import org.joml.Matrix4f;
+
+/**
+ * Should be pretty self-explanatory...
+ * Bend XYZ are the coordinates of the bend's center
+ * If you don't know the math behind it, don't try to edit.
+ *
+ * Use {@link BendableCube#applyBend} to bend the cube
+ */
+public interface BendableCube extends Bendable {
+ /**
+ * Apply bend on this cuboid
+ * Values are in radians
+ * @param bendValue bend value (Same as rotX)
+ * @return Transformation matrix for transforming children
+ */
+ Matrix4f applyBend(float bendValue);
+
+ default Matrix4f applyBendDegrees(float bendValue) {
+ return applyBend(bendValue * Mth.DEG_TO_RAD);
+ }
+
+ Direction getBendDirection();
+
+ float getBendX();
+ float getBendY();
+ float getBendZ();
+
+ Plane getBasePlane();
+ Plane getOtherPlane();
+
+ /**
+ * Distance between the two opposite surface of the cuboid.
+ * Calculate two plane distance is inefficient.
+ * Try to override it (If you have size)
+ * @return the size of the cube
+ */
+ float bendHeight();
+
+ default boolean isBendInverted() {
+ return getBendDirection() == Direction.UP || getBendDirection() == Direction.SOUTH || getBendDirection() == Direction.EAST;
+ }
+
+ default void rebuild(Direction direction) {
+ rebuild(direction, -1);
+ }
+
+ void rebuild(Direction direction, int pivot);
+}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableModelPart.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableModelPart.java
new file mode 100644
index 0000000..6bf020a
--- /dev/null
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableModelPart.java
@@ -0,0 +1,11 @@
+package com.zigythebird.bendable_cuboids.api;
+
+import org.jetbrains.annotations.Nullable;
+
+public interface BendableModelPart {
+ /**
+ * Get a cuboid, and cast it to {@link BendableCube}
+ */
+ @Nullable
+ BendableCube bc$getCuboid(int index);
+}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/ModelPartAccessor.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/ModelPartAccessor.java
deleted file mode 100644
index 5480743..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/api/ModelPartAccessor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.zigythebird.bendable_cuboids.api;
-
-import com.zigythebird.bendable_cuboids.impl.accessors.IModelPartAccessor;
-import net.minecraft.client.model.geom.ModelPart;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * Access to children and cuboids in {@link ModelPart}
- * Don't have to reinterpret the object...
- */
-public final class ModelPartAccessor {
-
- public static Map getChildren(ModelPart modelPart){
- return ((IModelPartAccessor)modelPart).bendableCuboids$getChildren();
- }
-
- /**
- * Get a cuboid, and cast it to {@link MutableCuboid}
- */
- public static Optional optionalGetCuboid(ModelPart modelPart, int index){
- if(modelPart == null || getCuboids(modelPart) == null || getCuboids(modelPart).size() <= index) return Optional.empty();
- return Optional.of((MutableCuboid)getCuboids(modelPart).get(index));
- }
-
- public static List getCuboids(ModelPart modelPart){
- return ((IModelPartAccessor)modelPart).bendableCuboids$getCuboids();
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/MutableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/MutableCuboid.java
deleted file mode 100644
index 8b6bed2..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/api/MutableCuboid.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.zigythebird.bendable_cuboids.api;
-
-import com.zigythebird.bendable_cuboids.impl.BendableCuboid;
-import com.zigythebird.bendable_cuboids.impl.BendableCuboidData;
-import net.minecraft.util.Tuple;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.function.Function;
-
-public interface MutableCuboid {
-
- /**
- * Register a mutator to a cuboid
- * @param name registration name
- * @param builder BendableCuboid builder
- * @return is the registration success
- */
- boolean bendableCuboids$registerMutator(String name, Function builder);
-
- /**
- * Unregister a mutator
- * @param name registration name
- * @return could unregister something
- */
- boolean bendableCuboids$unregisterMutator(String name);
-
- /**
- * Get the active mutator and its identifier
- * @return null, if no active
- */
- @Nullable
- Tuple bendableCuboids$getActiveMutator();
-
- /**
- * Check if mutator with key exists
- * @param key key
- * @return is the mutator registered (even if not active)
- */
- boolean bendableCuboids$hasMutator(String key);
-
- @Nullable
- Function bendableCuboids$getCuboidBuilder(String key);
-
- /**
- * Get a mutator
- * @param name mutator identifier
- * @return null, if no mutator exists or created
- */
- @Nullable
- @Deprecated
- //it can be removed in any future version
- BendableCuboid bendableCuboids$getMutator(String name);
-
- /**
- * Get a mutator and make it the active
- * @param name mutator identifier
- * @return null, if no registered
- */
- @Nullable
- BendableCuboid bendableCuboids$getAndActivateMutator(@Nullable String name);
-
- void bendableCuboids$copyStateFrom(MutableCuboid other);
-
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java
index 1542097..c68dc0b 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java
@@ -1,6 +1,8 @@
package com.zigythebird.bendable_cuboids.impl;
import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.math.Axis;
+import com.zigythebird.bendable_cuboids.api.BendableCube;
import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.PlayerModel;
@@ -10,37 +12,35 @@
import java.lang.Math;
public class BendUtil {
- public static BendApplier getBend(BendableCuboid cuboid, float bendAxis, float bendValue) {
- return getBend(cuboid.getBendDirection(), cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(),
- cuboid.basePlane, cuboid.otherPlane, false, cuboid.bendHeight(), bendAxis, bendValue);
+ private static final Vector3f Z_AXIS = new Vector3f(0, 0, 1);
+
+ public static BendApplier getBend(BendableCube cuboid, float bendValue) {
+ return getBend(cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(),
+ cuboid.getBasePlane(), cuboid.getOtherPlane(), false, cuboid.bendHeight(), bendValue);
}
/**
* Applies the transformation to every position in posSupplier
- * @param bendAxis axis for the bend
* @param bendValue bend value
*/
- public static BendApplier getBend(Direction bendDirection, float bendX, float bendY, float bendZ, Plane basePlane, Plane otherPlane,
- boolean mirrorBend, float bendHeight, float bendAxis, float bendValue) {
- Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis));
- Matrix3f matrix3f = new Matrix3f().set(bendDirection.getRotation());
- axis.mul(matrix3f);
+ public static BendApplier getBend(float bendX, float bendY, float bendZ, Plane basePlane, Plane otherPlane,
+ boolean mirrorBend, float bendHeight, float bendValue) {
if (mirrorBend) bendValue *= -1;
final float finalBend = bendValue;
- Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendAxis, bendValue);
+ Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendValue);
float halfSize = bendHeight/2;
return new BendApplier(transformMatrix, pos -> {
float distFromBase = Math.abs(basePlane.distanceTo(pos));
float distFromOther = Math.abs(otherPlane.distanceTo(pos));
- float s = (float) Math.clamp(Math.tan(finalBend/2)*pos.z, -2f, 2f);
+ float s = (float) Math.tan(finalBend/2)*pos.z;
if (mirrorBend) {
float temp = distFromBase;
distFromBase = distFromOther;
distFromOther = temp;
}
- float v = halfSize - (s < 0 ? Math.abs(s)/2 : Math.abs(s));
+ float v = halfSize - (s < 0 ? Math.min(Math.abs(s)/2, 1) : Math.abs(s));
if (distFromBase < distFromOther) {
if (distFromBase + distFromOther <= bendHeight && distFromBase > v)
pos.y = bendY + s;
@@ -55,29 +55,25 @@ else if (distFromBase + distFromOther <= bendHeight && distFromOther > v) {
});
}
- public static BendApplier getBendLegacy(BendableCuboid cuboid, float bendAxis, float bendValue) {
+ public static BendApplier getBendLegacy(BendableCube cuboid, float bendValue) {
return getBendLegacy(cuboid.getBendDirection(), cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(),
- cuboid.basePlane, cuboid.otherPlane, cuboid.isBendInverted(), false, cuboid.bendHeight(), bendAxis, bendValue);
+ cuboid.getBasePlane(), cuboid.getOtherPlane(), cuboid.isBendInverted(), false, cuboid.bendHeight(), bendValue);
}
/**
* Bends in the old pre-1.21.6 way which is more stretchy, but works in more situations, like for GeckoLib armor.
- * @param bendAxis axis for the bend
* @param bendValue bend value
*/
public static BendApplier getBendLegacy(Direction bendDirection, float bendX, float bendY, float bendZ, Plane basePlane, Plane otherPlane,
- boolean isBendInverted, boolean mirrorBend, float bendHeight, float bendAxis, float bendValue) {
- Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis));
- Matrix3f matrix3f = new Matrix3f().set(bendDirection.getRotation());
- axis.mul(matrix3f);
+ boolean isBendInverted, boolean mirrorBend, float bendHeight, float bendValue) {
if (mirrorBend) bendValue *= -1;
final float finalBend = bendValue;
- Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendAxis, bendValue);
+ Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendValue);
Vector3f directionUnit;
directionUnit = bendDirection.step();
- directionUnit.cross(axis);
+ directionUnit.cross(Z_AXIS);
//parallel to the bend's axis and to the cube's bend direction
Plane bendPlane = new Plane(directionUnit, new Vector3f(bendX, bendY, bendZ));
float halfSize = bendHeight/2;
@@ -112,21 +108,17 @@ else if (isInBendArea) {
});
}
- public static Matrix4f applyBendToMatrix(Matrix4f transformMatrix, float bendX, float bendY, float bendZ, float bendAxis, float bendValue) {
- Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis));
-
+ public static Matrix4f applyBendToMatrix(Matrix4f transformMatrix, float bendX, float bendY, float bendZ, float bendValue) {
transformMatrix.translate(bendX, bendY, bendZ);
- transformMatrix.rotate(bendValue, axis);
+ transformMatrix.rotateX(bendValue);
transformMatrix.translate(-bendX, -bendY, -bendZ);
return transformMatrix;
}
- public static PoseStack applyBendToMatrix(PoseStack transformMatrix, float bendX, float bendY, float bendZ, float bendAxis, float bendValue) {
- Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis));
-
+ public static PoseStack applyBendToMatrix(PoseStack transformMatrix, float bendX, float bendY, float bendZ, float bendValue) {
transformMatrix.translate(bendX, bendY, bendZ);
- transformMatrix.mulPose(new Quaternionf().rotateAxis(bendValue, axis));
+ transformMatrix.mulPose(Axis.XP.rotation(bendValue));
transformMatrix.translate(-bendX, -bendY, -bendZ);
return transformMatrix;
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java
deleted file mode 100644
index ebbcfe1..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl;
-
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.blaze3d.vertex.VertexConsumer;
-import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper;
-import net.minecraft.core.Direction;
-import net.minecraft.util.Mth;
-import org.joml.Matrix4f;
-import org.joml.Vector3f;
-import org.joml.Vector4f;
-
-import java.util.function.Function;
-
-/**
- * Should be pretty self-explanatory...
- * Bend XYZ are the coordinates of the bend's center
- * If you don't know the math behind it, don't try to edit.
- *
- * Use {@link BendableCuboid#applyBend} to bend the cube
- */
-public class BendableCuboid {
- protected final Quad[] sides;
- protected final RememberingPos[] positions;
-
- //to shift the matrix to the center axis
- protected final float fixX;
- protected final float fixY;
- protected final float fixZ;
- protected final Direction direction;
- protected final Plane basePlane;
- protected final Plane otherPlane;
- protected final float fullSize;
-
- protected float bend, bendAxis;
-
- /**
- * To see how you can make existing model parts bendable look at {@link PlayerBendHelper}
- * Or you can use {@link BendableCuboidBuilder#build}.
- */
- public BendableCuboid(Quad[] sides, RememberingPos[] positions, float fixX, float fixY, float fixZ, Direction direction, Plane basePlane, Plane otherPlane, float fullSize) {
- this.sides = sides;
- this.positions = positions;
- this.fixX = fixX;
- this.fixY = fixY;
- this.fixZ = fixZ;
- this.direction = direction;
- this.basePlane = basePlane;
- this.otherPlane = otherPlane;
- this.fullSize = fullSize;
-
- this.applyBend(0, 0);//Init values to render
- }
-
- /**
- * Apply bend on this cuboid
- * Values are in radians
- * @param bendAxis bend axis (rotY can be used instead)
- * @param bendValue bend value (Same as rotX)
- * @return Transformation matrix for transforming children
- */
- public Matrix4f applyBend(float bendAxis, float bendValue) {
- this.bend = bendValue; this.bendAxis = bendAxis;
- BendApplier bendApplier = BendUtil.getBend(this, bendAxis, bendValue);
- this.iteratePositions(bendApplier.consumer());
- return bendApplier.matrix4f();
- }
-
- public Matrix4f applyBendDegrees(float bendAxis, float bendValue) {
- return applyBend(bendAxis * Mth.DEG_TO_RAD, bendValue * Mth.DEG_TO_RAD);
- }
-
- public Direction getBendDirection() {
- return this.direction;
- }
-
- public float getBendX() {
- return fixX;
- }
-
- public float getBendY() {
- return fixY;
- }
-
- public float getBendZ() {
- return fixZ;
- }
-
- public Plane getBasePlane() {
- return basePlane;
- }
-
- public Plane getOtherSidePlane() {
- return otherPlane;
- }
-
- /**
- * Distance between the two opposite surface of the cuboid.
- * Calculate two plane distance is inefficient.
- * Try to override it (If you have size)
- * @return the size of the cube
- */
- public float bendHeight() {
- return fullSize;
- }
-
- public boolean isBendInverted() {
- return getBendDirection() == Direction.UP || getBendDirection() == Direction.SOUTH || getBendDirection() == Direction.EAST;
- }
-
- public void iteratePositions(Function function) {
- for(RememberingPos pos: positions){
- pos.setPos(function.apply(pos.getOriginalPos()));
- }
- }
-
- public float getBend() {
- return bend;
- }
-
- public float getBendAxis() {
- return bendAxis;
- }
-
- public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) {
- for(Quad quad:sides) {
- quad.render(matrices, vertexConsumer, light, overlay, color);
- }
- }
-
- public void copyState(BendableCuboid other) {
- if(other instanceof BendableCuboid b){
- this.applyBend(b.bendAxis, b.bend); //This works only in J16 or higher
- }
- }
-
- /*
- * A replica of {@link ModelPart.Quad}
- * with IVertex and render()
- */
- public static class Quad {
- public final RepositionableVertex[] vertices;
-
- public Quad(RememberingPos[] vertices, float u1, float v1, float u2, float v2, boolean flip) {
- this.vertices = new RepositionableVertex[4];
- this.vertices[0] = new RepositionableVertex(u2, v1, vertices[0]);
- this.vertices[1] = new RepositionableVertex(u1, v1, vertices[1]);
- this.vertices[2] = new RepositionableVertex(u1, v2, vertices[2]);
- this.vertices[3] = new RepositionableVertex(u2, v2, vertices[3]);
- if (flip){
- int i = vertices.length;
-
- for(int j = 0; j < i / 2; ++j) {
- RepositionableVertex vertex = this.vertices[j];
- this.vertices[j] = this.vertices[i - 1 - j];
- this.vertices[i - 1 - j] = vertex;
- }
- }
- }
-
- public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) {
- Vector3f normal = this.getDirection();
- normal.mul(matrices.normal());
-
- for (int i = 0; i != 4; ++i){
- IVertex vertex = this.vertices[i];
- Vector3f vertexPos = vertex.getPos();
- Vector4f pos = new Vector4f(vertexPos.x/16f, vertexPos.y/16f, vertexPos.z/16f, 1);
- pos.mul(matrices.pose());
- vertexConsumer.addVertex(pos.x, pos.y, pos.z, color, vertex.getU(), vertex.getV(), overlay, light, normal.x, normal.y, normal.z);
- }
- }
-
- /**
- * calculate the normal vector from the vertices' coordinates with cross-product
- * @return the normal vector (direction)
- */
- private Vector3f getDirection() {
- Vector3f buf = new Vector3f(vertices[3].getPos());
- buf.mul(-1);
- Vector3f vecB = new Vector3f(vertices[1].getPos());
- vecB.add(buf);
- buf = new Vector3f(vertices[2].getPos());
- buf.mul(-1);
- Vector3f vecA = new Vector3f(vertices[0].getPos());
- vecA.add(buf);
- vecA.cross(vecB);
- // Return the cross-product, if it's zero then return anything non-zero to not cause crash...
- return vecA.normalize().isFinite() ? vecA : Direction.NORTH.step();
- }
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java
deleted file mode 100644
index 16a2beb..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl;
-
-import net.minecraft.core.Direction;
-import org.joml.Vector3f;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-public class BendableCuboidBuilder {
- public Direction direction;
-
- public BendableCuboidBuilder setDirection(Direction d) {
- this.direction = d;
- return this;
- }
-
- public BendableCuboid build(BendableCuboidData data) {
- ArrayList planes = new ArrayList<>();
- HashMap positions = new HashMap<>();
- float minX = data.x, minY = data.y, minZ = data.z, maxX = data.x + data.sizeX, maxY = data.y + data.sizeY, maxZ = data.z + data.sizeZ;
- float pminX = data.x - data.extraX, pminY = data.y - data.extraY, pminZ = data.z - data.extraZ, pmaxX = maxX + data.extraX, pmaxY = maxY + data.extraY, pmaxZ = maxZ + data.extraZ;
- if(data.mirror){
- float tmp = pminX;
- pminX = pmaxX;
- pmaxX = tmp;
- }
-
- //this is copy from MC's cuboid constructor
- Vector3f vertex1 = new Vector3f(pminX, pminY, pminZ); //west south down
- Vector3f vertex2 = new Vector3f(pmaxX, pminY, pminZ); //east south down
- Vector3f vertex3 = new Vector3f(pmaxX, pmaxY, pminZ); //east south up
- Vector3f vertex4 = new Vector3f(pminX, pmaxY, pminZ); //west south up
- Vector3f vertex5 = new Vector3f(pminX, pminY, pmaxZ); //west north down
- Vector3f vertex6 = new Vector3f(pmaxX, pminY, pmaxZ); //east north down
- Vector3f vertex7 = new Vector3f(pmaxX, pmaxY, pmaxZ); //east north up
- Vector3f vertex8 = new Vector3f(pminX, pmaxY, pmaxZ); //west north up
-
- Vector3f center = new Vector3f();
- center.add(vertex1);
- center.add(vertex2);
- center.add(vertex3);
- center.add(vertex4);
- center.add(vertex5);
- center.add(vertex6);
- center.add(vertex7);
- center.add(vertex8);
- center.div(8);
-
- int j = data.u;
- int k = (int) (data.u + data.sizeZ);
- int l = (int) (data.u + data.sizeZ + data.sizeX);
- int m = (int) (data.u + data.sizeZ + data.sizeX + data.sizeX);
- int n = (int) (data.u + data.sizeZ + data.sizeX + data.sizeZ);
- int o = (int) (data.u + data.sizeZ + data.sizeX + data.sizeZ + data.sizeX);
- int p = data.v;
- int q = (int) (data.v + data.sizeZ);
- int r = (int) (data.v + data.sizeZ + data.sizeY);
- float textureWidth = data.textureWidth;
- float textureHeight = data.textureHeight;
- boolean mirror = data.mirror;
- createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex5, vertex2}, k, p, l, q, textureWidth, textureHeight, mirror); //down
- createAndAddQuads(planes, positions, new Vector3f[]{vertex3, vertex4, vertex7}, l, q, m, p, textureWidth, textureHeight, mirror); //up
- createAndAddQuads(planes, positions, new Vector3f[]{vertex1, vertex5, vertex4}, j, q, k, r, textureWidth, textureHeight, mirror); //west
- createAndAddQuads(planes, positions, new Vector3f[]{vertex2, vertex1, vertex3}, k, q, l, r, textureWidth, textureHeight, mirror); //south
- createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex2, vertex7}, l, q, n, r, textureWidth, textureHeight, mirror); //east
- createAndAddQuads(planes, positions, new Vector3f[]{vertex5, vertex6, vertex8}, n, q, o, r, textureWidth, textureHeight, mirror); //north
-
- Vector3f pivot = new Vector3f(0, 0, 0);
- if (data.pivot >= 0) {
- float size = direction.step().mul(maxX - minX, maxY - minY, maxZ - minZ).length();
- if (data.pivot <= size) {
- pivot = direction.step().mul(size - (data.pivot * 2));
- vertex7 = vertex7.sub(pivot);
- }
- }
- boolean bl = direction == Direction.UP || direction == Direction.SOUTH || direction == Direction.EAST;
- Plane aPlane = new Plane(direction.step(), vertex7);
- Plane bPlane = new Plane(direction.step(), vertex1);
- float fullSize = - direction.step().dot(vertex1) + direction.step().dot(vertex7);
- float bendX = (data.sizeX + data.x + data.x - pivot.x())/2;
- float bendY = (data.sizeY + data.y + data.y - pivot.y())/2;
- float bendZ = (data.sizeZ + data.z + data.z - pivot.z())/2;
- return new BendableCuboid(planes.toArray(new BendableCuboid.Quad[0]), positions.values().toArray(new RememberingPos[0]), bendX, bendY, bendZ, direction, bl ? aPlane : bPlane, bl ? bPlane : aPlane, fullSize);
- }
-
- //edge[2] can be calculated from edge 0, 1, 3...
- protected void createAndAddQuads(Collection quads, HashMap positions, Vector3f[] edges, int u1, int v1, int u2, int v2, float textureWidth, float textureHeight, boolean mirror) {
- int du = u2 < u1 ? 1 : -1;
- int dv = v1 < v2 ? 1 : -1;
- for (int localU = u2; localU != u1; localU += du) {
- for (int localV = v1; localV != v2; localV += dv) {
- int localU2 = localU + du;
- int localV2 = localV + dv;
- RememberingPos rp0 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV));
- RememberingPos rp1 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV2));
- RememberingPos rp2 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV2));
- RememberingPos rp3 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV));
- quads.add(new BendableCuboid.Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2/textureWidth, localV/textureHeight, localU/textureWidth, localV2/textureHeight, mirror));
- }
- }
- }
-
- protected Vector3f transformVector(Vector3f pos, Vector3f vectorU, Vector3f vectorV, int u1, int v1, int u2, int v2, int u, int v) {
- vectorU.sub(pos);
- vectorU.mul(((float)u - u1)/(u2-u1));
- vectorV.sub(pos);
- vectorV.mul(((float)v - v1)/(v2-v1));
- pos.add(vectorU);
- pos.add(vectorV);
- return pos;
- }
-
- protected RememberingPos getOrCreate(HashMap positions, Vector3f pos) {
- if(!positions.containsKey(pos)){
- positions.put(pos, new RememberingPos(pos));
- }
- return positions.get(pos);
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java
index 4e9cec6..b098b9a 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java
@@ -1,39 +1,15 @@
package com.zigythebird.bendable_cuboids.impl;
-public class BendableCuboidData {
- /**
- * Size parameters
- */
- public float x, y, z, sizeX, sizeY, sizeZ;
- public float extraX, extraY, extraZ;
- public int u, v;
- public boolean mirror = false;
- public int textureWidth, textureHeight; //That will be int
- public int pivot;
- //public float bendX, bendY, bendZ;
-
- public BendableCuboidData() {}
-
- public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, int pivot) {
- this.u = u;
- this.v = v;
- this.x = x;
- this.y = y;
- this.z = z;
- this.sizeX = sizeX;
- this.sizeY = sizeY;
- this.sizeZ = sizeZ;
- this.extraX = extraX;
- this.extraY = extraY;
- this.extraZ = extraZ;
- this.mirror = mirror;
- this.pivot = pivot;
- //Casting
- this.textureWidth = (int) textureWidth;
- this.textureHeight = (int) textureHeight;
- }
-
- public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight) {
- this(u, v, x, y, z, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, -1);
- }
+import net.minecraft.core.Direction;
+
+import java.util.Set;
+
+public record BendableCuboidData(
+ int u, int v,
+ float sizeX, float sizeY, float sizeZ,
+ float extraX, float extraY, float extraZ,
+ boolean mirror,
+ float textureWidth, float textureHeight,
+ Set visibleFaces
+) {
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/MutableModelPart.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/MutableModelPart.java
deleted file mode 100644
index 25998bb..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/MutableModelPart.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl;
-
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.blaze3d.vertex.VertexConsumer;
-import com.zigythebird.bendable_cuboids.api.ModelPartAccessor;
-import com.zigythebird.bendable_cuboids.api.MutableCuboid;
-import it.unimi.dsi.fastutil.objects.ObjectArrayList;
-import it.unimi.dsi.fastutil.objects.ObjectList;
-import net.minecraft.client.model.geom.ModelPart;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * ModelPart to support BendableCuboids
- *
- * If you want to mutate existing Cuboids, see {@link ModelPartAccessor} and {@link MutableCuboid}
- *
- * This can be used with {@link BendableCuboid}.
- */
-public abstract class MutableModelPart extends ModelPart {
-
- @Nullable
- @Deprecated
- private MutableModelPart last = null;
-
- protected final ObjectList BendableCuboids = new ObjectArrayList<>();
-
- public MutableModelPart(List cuboids, Map children) {
- super(cuboids, children);
- }
-
- @Override
- public void render(PoseStack matrices, VertexConsumer vertices, int light, int overlay, int color) {
- super.render(matrices, vertices, light, overlay);
- if(!BendableCuboids.isEmpty()){
- matrices.pushPose();
- this.translateAndRotate(matrices);
- this.renderBendableCuboids(matrices.last(), vertices, light, overlay, color);
- matrices.popPose();
- }
- }
-
- protected void renderBendableCuboids(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) {
- this.BendableCuboids.forEach((cuboid)-> cuboid.render(matrices, vertexConsumer, light, overlay, color));
- }
-
- public void addBendableCuboid(BendableCuboid cuboid){
- this.BendableCuboids.add(cuboid);
- }
-
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java
new file mode 100644
index 0000000..0ad6dc0
--- /dev/null
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java
@@ -0,0 +1,181 @@
+package com.zigythebird.bendable_cuboids.impl;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.blaze3d.vertex.VertexConsumer;
+import net.minecraft.core.Direction;
+import net.minecraft.util.Mth;
+import org.joml.Vector3f;
+import org.joml.Vector4f;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/*
+ * A replica of {@link ModelPart.Quad}
+ * with IVertex and render()
+ */
+public class Quad {
+ public final RepositionableVertex[] vertices;
+
+ public Quad(RememberingPos[] vertices, float u1, float v1, float u2, float v2, boolean flip) {
+ this.vertices = new RepositionableVertex[4];
+ this.vertices[0] = new RepositionableVertex(u2, v1, vertices[0]);
+ this.vertices[1] = new RepositionableVertex(u1, v1, vertices[1]);
+ this.vertices[2] = new RepositionableVertex(u1, v2, vertices[2]);
+ this.vertices[3] = new RepositionableVertex(u2, v2, vertices[3]);
+ if (flip){
+ int i = vertices.length;
+
+ for(int j = 0; j < i / 2; ++j) {
+ RepositionableVertex vertex = this.vertices[j];
+ this.vertices[j] = this.vertices[i - 1 - j];
+ this.vertices[i - 1 - j] = vertex;
+ }
+ }
+ }
+
+ public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) {
+ Vector3f normal = this.getDirection();
+ normal.mul(matrices.normal());
+
+ for (int i = 0; i != 4; ++i){
+ IVertex vertex = this.vertices[i];
+ Vector3f vertexPos = vertex.getPos();
+ Vector4f pos = new Vector4f(vertexPos.x/16f, vertexPos.y/16f, vertexPos.z/16f, 1);
+ pos.mul(matrices.pose());
+ vertexConsumer.addVertex(pos.x, pos.y, pos.z, color, vertex.getU(), vertex.getV(), overlay, light, normal.x, normal.y, normal.z);
+ }
+ }
+
+ /**
+ * calculate the normal vector from the vertices' coordinates with cross-product
+ * @return the normal vector (direction)
+ */
+ private Vector3f getDirection() {
+ Vector3f buf = new Vector3f(vertices[3].getPos());
+ buf.mul(-1);
+ Vector3f vecB = new Vector3f(vertices[1].getPos());
+ vecB.add(buf);
+ buf = new Vector3f(vertices[2].getPos());
+ buf.mul(-1);
+ Vector3f vecA = new Vector3f(vertices[0].getPos());
+ vecA.add(buf);
+ vecA.cross(vecB);
+ // Return the cross-product, if it's zero then return anything non-zero to not cause crash...
+ return vecA.normalize().isFinite() ? vecA : Direction.NORTH.step();
+ }
+
+ // edge[2] can be calculated from edge 0, 1, 3...
+ public static void createAndAddQuads(List quads, Map positions, Vector3f[] edges, float u1, float v1, float u2, float v2, float textureWidth, float textureHeight, boolean mirror) {
+ boolean positiveDirection = v2 > v1;
+ float totalTexHeight = Mth.abs(v2 - v1);
+
+ Vector3f origin = edges[0];
+ Vector3f vecV = new Vector3f(edges[2]).sub(origin);
+ float vFracScale = (v1 == v2) ? 0 : 1.0f / (v2 - v1);
+ Vector3f vecU = new Vector3f(edges[1]).sub(origin);
+ float uFracScale = (u1 == u2) ? 0 : 1.0f / (u2 - u1);
+
+ Vector3f vPos = new Vector3f(origin);
+ Vector3f nextVPos = new Vector3f(edges[1]);
+ Vector3f vStep = new Vector3f();
+
+ float[] quadHeights = null;
+ int segmentHeight = 0;
+ if (totalTexHeight > 0 && totalTexHeight % 3.0f == 0) {
+ segmentHeight = (int) (totalTexHeight / 3.0f);
+ if (segmentHeight > 0) {
+ quadHeights = new float[2 + segmentHeight];
+ quadHeights[0] = segmentHeight;
+ Arrays.fill(quadHeights, 1, 1 + segmentHeight, 1.0f);
+ quadHeights[1 + segmentHeight] = segmentHeight;
+ }
+ }
+
+ int layerIndex = 0;
+
+ for (float localV = v1; positiveDirection ? localV < v2 : localV > v2; ) {
+ float dv;
+ boolean isMiddleSegment = false;
+ if (quadHeights != null) {
+ if (layerIndex >= quadHeights.length) {
+ break;
+ }
+ dv = positiveDirection ? quadHeights[layerIndex] : -quadHeights[layerIndex];
+ if (layerIndex > 0 && layerIndex <= segmentHeight) {
+ isMiddleSegment = true;
+ }
+ layerIndex++;
+ } else {
+ dv = positiveDirection ? 1 : -1;
+ }
+
+ float localV2 = localV + dv;
+ if (quadHeights == null) {
+ if (positiveDirection) {
+ if (localV2 > v2) {
+ localV2 = v2;
+ }
+ } else {
+ if (localV2 < v2) {
+ localV2 = v2;
+ }
+ }
+ }
+
+ float actual_dv = localV2 - localV;
+ if (actual_dv == 0) break;
+ vStep.set(vecV).mul(actual_dv * vFracScale);
+
+ if (isMiddleSegment && Mth.abs(u2 - u1) > 1.0f) {
+ boolean uPositive = u2 > u1;
+ float du = uPositive ? 1.0f : -1.0f;
+
+ Vector3f uScanPosBottom = new Vector3f(vPos);
+ Vector3f uScanPosTop = new Vector3f(vPos).add(vStep);
+
+ for (float localU = u2; localU != u1; localU -= du) {
+ float localU2 = localU - du;
+ if (uPositive) {
+ if (localU2 > u2) localU2 = u2;
+ } else {
+ if (localU2 < u2) localU2 = u2;
+ }
+ if (localU == localU2) break;
+
+ float actual_du = localU2 - localU;
+ Vector3f uStep = new Vector3f(vecU).mul(actual_du * uFracScale);
+
+ RememberingPos bottomLeft = getOrCreate(positions, uScanPosBottom);
+ RememberingPos topLeft = getOrCreate(positions, uScanPosTop);
+
+ uScanPosBottom.sub(uStep);
+ uScanPosTop.sub(uStep);
+
+ RememberingPos bottomRight = getOrCreate(positions, uScanPosBottom);
+ RememberingPos topRight = getOrCreate(positions, uScanPosTop);
+
+ quads.add(new Quad(new RememberingPos[]{bottomLeft, bottomRight, topRight, topLeft}, localU2 / textureWidth, localV / textureHeight, localU / textureWidth, localV2 / textureHeight, mirror));
+ }
+
+ vPos.add(vStep);
+ nextVPos.add(vStep);
+ } else {
+ RememberingPos rp3 = getOrCreate(positions, vPos);
+ RememberingPos rp0 = getOrCreate(positions, nextVPos);
+ vPos.add(vStep);
+ nextVPos.add(vStep);
+ RememberingPos rp2 = getOrCreate(positions, vPos);
+ RememberingPos rp1 = getOrCreate(positions, nextVPos);
+ quads.add(new Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, u1 / textureWidth, localV / textureHeight, u2 / textureWidth, localV2 / textureHeight, mirror));
+ }
+
+ localV = localV2;
+ }
+ }
+
+ public static RememberingPos getOrCreate(Map positions, Vector3f pos) {
+ return positions.computeIfAbsent(pos, p -> new RememberingPos(new Vector3f(p)));
+ }
+}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IModelPartAccessor.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IModelPartAccessor.java
deleted file mode 100644
index 1238bd8..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IModelPartAccessor.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl.accessors;
-
-import net.minecraft.client.model.geom.ModelPart;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Basic operation to access cuboid in ModelPart
- */
-public interface IModelPartAccessor {
- List bendableCuboids$getCuboids();
-
- Map bendableCuboids$getChildren(); //easy to search in it :D
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IPlayerModel.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IPlayerModel.java
deleted file mode 100644
index d7f7e84..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IPlayerModel.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl.accessors;
-
-public interface IPlayerModel {
- void bendableCuboids$prepForFirstPersonRender();
- boolean bendableCuboids$isFirstPersonRender();
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java
index e36ea29..fbe7dab 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java
@@ -1,42 +1,37 @@
package com.zigythebird.bendable_cuboids.impl.compatibility;
import com.mojang.blaze3d.vertex.PoseStack;
+import com.zigythebird.bendable_cuboids.api.BendableCube;
+import com.zigythebird.bendable_cuboids.api.BendableModelPart;
import com.zigythebird.bendable_cuboids.impl.BendUtil;
-import com.zigythebird.bendable_cuboids.api.ModelPartAccessor;
-import com.zigythebird.bendable_cuboids.api.MutableCuboid;
-import com.zigythebird.bendable_cuboids.impl.BendableCuboidBuilder;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.core.Direction;
-import java.util.Optional;
-
public class PlayerBendHelper {
- public static void bend(ModelPart modelPart, float axis, float rotation) {
- Optional optionalMutableCuboid = ModelPartAccessor.optionalGetCuboid(modelPart, 0);
- if (optionalMutableCuboid.isPresent()) {
- MutableCuboid cuboid = optionalMutableCuboid.get();
- // Don't enable bend until rotation is bigger than epsilon.
- // This should avoid unnecessary heavy calculations.
- if (Math.abs(rotation) >= 0.0001f && cuboid.bendableCuboids$hasMutator("bend")) {
- cuboid.bendableCuboids$getAndActivateMutator("bend").applyBend(axis, rotation);
- }
- else cuboid.bendableCuboids$getAndActivateMutator(null);
+ public static void bend(ModelPart modelPart, float rotation) {
+ BendableCube cube = ((BendableModelPart) modelPart).bc$getCuboid(0);
+ if (cube == null) return;
+
+ // Don't enable bend until rotation is bigger than epsilon.
+ // This should avoid unnecessary heavy calculations.
+ if (Math.abs(rotation) >= 0.0001f) {
+ cube.applyBend(rotation);
+ } else {
+ cube.applyBend(0);
}
}
public static void initBend(ModelPart modelPart, Direction direction) {
- ModelPartAccessor.optionalGetCuboid(modelPart, 0).ifPresent(mutableModelPart -> mutableModelPart.bendableCuboids$registerMutator("bend", data -> new BendableCuboidBuilder().setDirection(direction).build(data)));
+ BendableCube cube = ((BendableModelPart) modelPart).bc$getCuboid(0);
+ if (cube != null) cube.rebuild(direction);
}
public static void initCapeBend(ModelPart modelPart) {
- ModelPartAccessor.optionalGetCuboid(modelPart, 0).ifPresent(mutableModelPart -> mutableModelPart.bendableCuboids$registerMutator("bend", data -> {
- data.pivot = 6;
-
- return new BendableCuboidBuilder().setDirection(Direction.UP).build(data);
- }));
+ BendableCube cube = ((BendableModelPart) modelPart).bc$getCuboid(0);
+ if (cube != null) cube.rebuild(Direction.UP, 6);
}
- public static void applyTorsoBendToMatrix(PoseStack poseStack, float axis, float bend) {
- BendUtil.applyBendToMatrix(poseStack, 0, 0.375F, 0, axis, bend);
+ public static void applyTorsoBendToMatrix(PoseStack poseStack, float bend) {
+ BendUtil.applyBendToMatrix(poseStack, 0, 0.375F, 0, bend);
}
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java
deleted file mode 100644
index 46ab927..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib;
-
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.zigythebird.bendable_cuboids.impl.*;
-import net.minecraft.core.Direction;
-import org.joml.Matrix4f;
-import org.joml.Vector3f;
-import org.joml.Vector4f;
-
-public class GeckoLibBendableCuboid extends BendableCuboid {
- public GeckoLibBendableCuboid(Quad[] sides, RememberingPos[] positions, float fixX, float fixY, float fixZ, Direction direction, Plane basePlane, Plane otherPlane, float fullSize) {
- super(sides, positions, fixX, fixY, fixZ, direction, basePlane, otherPlane, fullSize);
- }
-
- public Matrix4f applyBend(float bendAxis, float bendValue, PoseStack poseStack) {
- this.bend = bendValue; this.bendAxis = bendAxis;
- BendApplier bendApplier = BendUtil.getBendLegacy(this.getBendDirection(), this.getBendX(), this.getBendY(), this.getBendZ(),
- this.basePlane, this.otherPlane, this.isBendInverted(), direction == Direction.UP, this.bendHeight(), bendAxis, direction == Direction.UP ? bendValue : -bendValue);
- this.iteratePositions(vector3f -> {
- Vector4f vector = new Vector4f(vector3f.x, vector3f.y, vector3f.z, 1).mul(poseStack.last().pose());
- Vector3f vector3f1 = bendApplier.consumer().apply(new Vector3f(vector.x, vector.y, vector.z));
- vector.set(vector3f1.x, vector3f1.y, vector3f1.z, 1);
- vector.mul(poseStack.last().pose().invert(new Matrix4f()));
- return vector3f.set(vector.x, vector.y, vector.z);
- });
- return bendApplier.matrix4f();
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboidBuilder.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboidBuilder.java
deleted file mode 100644
index bea2580..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboidBuilder.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib;
-
-import com.zigythebird.bendable_cuboids.impl.*;
-import org.joml.Vector3f;
-import software.bernie.geckolib.cache.object.BakedGeoModel;
-import software.bernie.geckolib.cache.object.GeoCube;
-import software.bernie.geckolib.cache.object.GeoQuad;
-import software.bernie.geckolib.cache.object.GeoVertex;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-
-public class GeckoLibBendableCuboidBuilder extends BendableCuboidBuilder {
- public GeckoLibBendableCuboid build(GeoCube cube, BakedGeoModel model, String root) {
- ArrayList planes = new ArrayList<>();
- HashMap positions = new HashMap<>();
-
- GeoVertex geoVertex1 = cube.quads()[2].vertices()[3];
- GeoVertex geoVertex2 = cube.quads()[2].vertices()[2];
- GeoVertex geoVertex3 = cube.quads()[2].vertices()[1];
- GeoVertex geoVertex4 = cube.quads()[2].vertices()[0];
- GeoVertex geoVertex5 = cube.quads()[3].vertices()[2];
- GeoVertex geoVertex6 = cube.quads()[3].vertices()[3];
- GeoVertex geoVertex7 = cube.quads()[3].vertices()[0];
- GeoVertex geoVertex8 = cube.quads()[3].vertices()[1];
-
- Vector3f vertex1 = geoVertex1.position();
- Vector3f vertex2 = geoVertex2.position();
- Vector3f vertex3 = geoVertex3.position();
- Vector3f vertex4 = geoVertex4.position();
- Vector3f vertex5 = geoVertex5.position();
- Vector3f vertex6 = geoVertex6.position();
- Vector3f vertex7 = geoVertex7.position();
- Vector3f vertex8 = geoVertex8.position();
-
- boolean mirror = cube.mirror();
- float textureWidth = (float) model.properties().textureWidth();
- float textureHeight = (float) model.properties().textureHeight();
-
- createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex5, vertex2}, cube.quads()[5], textureWidth, textureHeight, mirror);
- createAndAddQuads(planes, positions, new Vector3f[]{vertex3, vertex4, vertex7}, cube.quads()[4], textureWidth, textureHeight, mirror);
- createAndAddQuads(planes, positions, new Vector3f[]{vertex1, vertex5, vertex4}, cube.quads()[0], textureWidth, textureHeight, mirror);
- createAndAddQuads(planes, positions, new Vector3f[]{vertex2, vertex1, vertex3}, cube.quads()[3], textureWidth, textureHeight, mirror);
- createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex2, vertex7}, cube.quads()[1], textureWidth, textureHeight, mirror);
- createAndAddQuads(planes, positions, new Vector3f[]{vertex5, vertex6, vertex8}, cube.quads()[2], textureWidth, textureHeight, mirror);
-
- Vector3f center = new Vector3f();
- center.add(vertex1);
- center.add(vertex2);
- center.add(vertex3);
- center.add(vertex4);
- center.add(vertex5);
- center.add(vertex6);
- center.add(vertex7);
- center.add(vertex8);
- center.mul(2);
-
- Plane aPlane;
- Plane bPlane;
- float fullSize;
- float bendX;
- float bendY;
- float bendZ = 0;
- if (root.contains("arm")) {
- aPlane = new Plane(direction.step(), -10);
- bPlane = new Plane(direction.step(), 2);
- fullSize = 12;
- bendX = root.contains("left") ? 0.5F : -0.5F;
- bendY = 4;
- }
- else {
- aPlane = new Plane(direction.step(), root.equals("torso") ? 12 : -12);
- bPlane = new Plane(direction.step(), 0);
- fullSize = root.equals("torso") ? -12 : 12;
- bendX = 0;
- bendY = 6;
- }
- return new GeckoLibBendableCuboid(planes.toArray(new BendableCuboid.Quad[0]), positions.values().toArray(new RememberingPos[0]), bendX, bendY, bendZ, direction, aPlane, bPlane, fullSize);
- }
-
- protected void createAndAddQuads(Collection quads, HashMap positions, Vector3f[] edges, GeoQuad quad, float textureWidth, float textureHeight, boolean mirror) {
- float u1 = textureWidth * quad.vertices()[3].texU();
- float u2 = textureWidth * quad.vertices()[1].texU();
- float v1 = textureHeight * quad.vertices()[2].texV();
- float v2 = textureHeight * quad.vertices()[0].texV();
- float du = u2 < u1 ? 1 : -1;
- float dv = v1 < v2 ? 1 : -1;
- for (float localU = u2; localU != u1; localU += du) {
- for (float localV = v1; localV != v2; localV += dv) {
- float localU2 = localU + du;
- float localV2 = localV + dv;
- RememberingPos rp0 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV));
- RememberingPos rp1 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV2));
- RememberingPos rp2 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV2));
- RememberingPos rp3 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV));
- quads.add(new BendableCuboid.Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2/textureWidth, localV/textureHeight, localU/textureWidth, localV2/textureHeight, mirror));
- }
- }
- }
-
- protected Vector3f transformVector(Vector3f pos, Vector3f vectorU, Vector3f vectorV, float u1, float v1, float u2, float v2, float u, float v) {
- pos.mul(16);
- vectorU.mul(16);
- vectorV.mul(16);
- vectorU.sub(pos);
- vectorU.mul((u - u1)/(u2-u1));
- vectorV.sub(pos);
- vectorV.mul((v - v1)/(v2-v1));
- pos.add(vectorU);
- pos.add(vectorV);
- return pos;
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoRenderUtil.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoRenderUtil.java
deleted file mode 100644
index 510bade..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoRenderUtil.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib;
-
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.math.Axis;
-import software.bernie.geckolib.cache.object.GeoBone;
-
-public class GeckoRenderUtil {
- public static void translateMatrixToBone(PoseStack poseStack, GeoBone bone) {
- poseStack.translate(-bone.getPosX(), bone.getPosY(), bone.getPosZ());
- }
-
- public static void rotateMatrixAroundBone(PoseStack poseStack, GeoBone bone) {
- if (bone.getRotZ() != 0.0F) {
- poseStack.mulPose(Axis.ZP.rotation(bone.getRotZ()));
- }
-
- if (bone.getRotY() != 0.0F) {
- poseStack.mulPose(Axis.YP.rotation(bone.getRotY()));
- }
-
- if (bone.getRotX() != 0.0F) {
- poseStack.mulPose(Axis.XP.rotation(bone.getRotX()));
- }
-
- }
-
- public static void scaleMatrixForBone(PoseStack poseStack, GeoBone bone) {
- poseStack.scale(bone.getScaleX(), bone.getScaleY(), bone.getScaleZ());
- }
-
- public static void translateToPivotPoint(PoseStack poseStack, GeoBone bone) {
- poseStack.translate(bone.getPivotX(), bone.getPivotY(), bone.getPivotZ());
- }
-
- public static void translateAwayFromPivotPoint(PoseStack poseStack, GeoBone bone) {
- poseStack.translate(-bone.getPivotX(), -bone.getPivotY(), -bone.getPivotZ());
- }
-
- public static void prepMatrixForBone(PoseStack poseStack, GeoBone bone) {
- translateMatrixToBone(poseStack, bone);
- translateToPivotPoint(poseStack, bone);
- rotateMatrixAroundBone(poseStack, bone);
- scaleMatrixForBone(poseStack, bone);
- translateAwayFromPivotPoint(poseStack, bone);
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java
deleted file mode 100644
index 977bc3c..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib;
-
-import com.zigythebird.bendable_cuboids.impl.BendableCuboid;
-import com.zigythebird.playeranim.math.Pair;
-
-public interface GeoCubeAccessor {
- void setBendableCuboid(Pair bendableCuboid);
- Pair getBendableCuboid();
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CubeMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CubeMixin.java
new file mode 100644
index 0000000..8a6cf16
--- /dev/null
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CubeMixin.java
@@ -0,0 +1,220 @@
+package com.zigythebird.bendable_cuboids.mixin;
+
+import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.blaze3d.vertex.VertexConsumer;
+import com.zigythebird.bendable_cuboids.api.BendableCube;
+import com.zigythebird.bendable_cuboids.impl.*;
+import net.minecraft.client.model.geom.ModelPart;
+import net.minecraft.core.Direction;
+import org.joml.Matrix4f;
+import org.joml.Vector3f;
+import org.spongepowered.asm.mixin.*;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.*;
+import java.util.function.Function;
+
+import static com.zigythebird.bendable_cuboids.impl.Quad.createAndAddQuads;
+
+@Mixin(ModelPart.Cube.class)
+public class CubeMixin implements BendableCube {
+ @Shadow
+ @Final
+ public float minX;
+ @Shadow
+ @Final
+ public float minY;
+ @Shadow
+ @Final
+ public float minZ;
+ @Shadow
+ @Final
+ public float maxX;
+ @Shadow
+ @Final
+ public float maxY;
+ @Shadow
+ @Final
+ public float maxZ;
+
+ @Unique
+ private BendableCuboidData bc$data;
+
+ @Unique
+ private final Vector3f[] bc$vertices = new Vector3f[8];
+ @Unique
+ private Quad[] sides;
+ @Unique
+ private RememberingPos[] positions;
+
+ @Unique
+ protected float bc$fixX;
+ @Unique
+ protected float bc$fixY;
+ @Unique
+ protected float bc$fixZ;
+ @Unique
+ protected Direction bc$direction;
+ @Unique
+ protected Plane bc$basePlane;
+ @Unique
+ protected Plane bc$otherPlane;
+ @Unique
+ protected float bc$fullSize;
+
+ @Unique
+ protected float bc$bend;
+
+ @Inject(method = "", at = @At(value = "RETURN"))
+ private void constructor(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces, CallbackInfo ci){
+ this.bc$data = new BendableCuboidData(u, v, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, visibleFaces);
+ }
+
+ @Override
+ public void rebuild(Direction direction, int point) {
+ if (this.sides == null || this.positions == null) bc$build();
+
+ this.bc$direction = direction;
+
+ Vector3f pivot = new Vector3f(0, 0, 0);
+ if (point >= 0) {
+ float size = direction.step().mul(bc$data.sizeX(), bc$data.sizeY(), bc$data.sizeZ()).length();
+ if (point <= size) {
+ pivot = direction.step().mul(size - (point * 2));
+ bc$vertices[6] = bc$vertices[6].sub(pivot);
+ }
+ }
+ boolean bl = direction == Direction.UP || direction == Direction.SOUTH || direction == Direction.EAST;
+ Plane aPlane = new Plane(direction.step(), bc$vertices[6]);
+ Plane bPlane = new Plane(direction.step(), bc$vertices[0]);
+ this.bc$basePlane = bl ? aPlane : bPlane;
+ this.bc$otherPlane = bl ? bPlane : aPlane;
+
+ this.bc$fullSize = -direction.step().dot(bc$vertices[0]) + direction.step().dot(bc$vertices[6]);
+ this.bc$fixX = (bc$data.sizeX() + minX + minX - pivot.x())/2;
+ this.bc$fixY = (bc$data.sizeY() + minY + minY - pivot.y())/2;
+ this.bc$fixZ = (bc$data.sizeZ() + minZ + minZ - pivot.z())/2;
+ }
+
+ @Unique
+ private void bc$build() {
+ List planes = new ArrayList<>();
+ Map positions = new HashMap<>();
+ float pminX = minX - bc$data.extraX(), pminY = minY - bc$data.extraY(), pminZ = minZ - bc$data.extraZ(), pmaxX = maxX + bc$data.extraX(), pmaxY = maxY + bc$data.extraY(), pmaxZ = maxZ + bc$data.extraZ();
+ if (bc$data.mirror()) {
+ float tmp = pminX;
+ pminX = pmaxX;
+ pmaxX = tmp;
+ }
+
+ //this is copy from MC's cuboid constructor
+ this.bc$vertices[0] = new Vector3f(pminX, pminY, pminZ); //west south down
+ this.bc$vertices[1] = new Vector3f(pmaxX, pminY, pminZ); //east south down
+ this.bc$vertices[2] = new Vector3f(pmaxX, pmaxY, pminZ); //east south up
+ this.bc$vertices[3] = new Vector3f(pminX, pmaxY, pminZ); //west south up
+ this.bc$vertices[4] = new Vector3f(pminX, pminY, pmaxZ); //west north down
+ this.bc$vertices[5] = new Vector3f(pmaxX, pminY, pmaxZ); //east north down
+ this.bc$vertices[6] = new Vector3f(pmaxX, pmaxY, pmaxZ); //east north up
+ this.bc$vertices[7] = new Vector3f(pminX, pmaxY, pmaxZ); //west north up
+
+ float j = bc$data.u();
+ float k = bc$data.u() + bc$data.sizeZ();
+ float l = bc$data.u() + bc$data.sizeZ() + bc$data.sizeX();
+ float m = bc$data.u() + bc$data.sizeZ() + bc$data.sizeX() + bc$data.sizeX();
+ float n = bc$data.u() + bc$data.sizeZ() + bc$data.sizeX() + bc$data.sizeZ();
+ float o = bc$data.u() + bc$data.sizeZ() + bc$data.sizeX() + bc$data.sizeZ() + bc$data.sizeX();
+ float p = bc$data.v();
+ float q = bc$data.v() + bc$data.sizeZ();
+ float r = bc$data.v() + bc$data.sizeZ() + bc$data.sizeY();
+ float textureWidth = bc$data.textureWidth();
+ float textureHeight = bc$data.textureHeight();
+ boolean mirror = bc$data.mirror();
+ if (bc$data.visibleFaces().contains(Direction.DOWN)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[5], bc$vertices[4], bc$vertices[1]}, k, p, l, q, textureWidth, textureHeight, mirror); //down
+ if (bc$data.visibleFaces().contains(Direction.UP)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[2], bc$vertices[3], bc$vertices[6]}, l, q, m, p, textureWidth, textureHeight, mirror); //up
+ if (bc$data.visibleFaces().contains(Direction.WEST)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[0], bc$vertices[4], bc$vertices[3]}, j, q, k, r, textureWidth, textureHeight, mirror); //west
+ if (bc$data.visibleFaces().contains(Direction.NORTH)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[1], bc$vertices[0], bc$vertices[2]}, k, q, l, r, textureWidth, textureHeight, mirror); //north
+ if (bc$data.visibleFaces().contains(Direction.EAST)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[5], bc$vertices[1], bc$vertices[6]}, l, q, n, r, textureWidth, textureHeight, mirror); //east
+ if (bc$data.visibleFaces().contains(Direction.SOUTH)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[4], bc$vertices[5], bc$vertices[7]}, n, q, o, r, textureWidth, textureHeight, mirror); //south
+
+ this.sides = planes.toArray(new Quad[0]);
+ this.positions = positions.values().toArray(new RememberingPos[0]);
+ }
+
+ @WrapMethod(method = "compile")
+ private void bc$render(PoseStack.Pose pose, VertexConsumer buffer, int packedLight, int packedOverlay, int color, Operation original) {
+ if (bc$bend == 0) {
+ original.call(pose, buffer, packedLight, packedOverlay, color);
+ return;
+ }
+
+ for (Quad quad : sides) {
+ quad.render(pose, buffer, packedLight, packedOverlay, color);
+ }
+ }
+
+ /**
+ * Apply bend on this cuboid
+ * Values are in radians
+ * @param bendValue bend value (Same as rotX)
+ * @return Transformation matrix for transforming children
+ */
+ @Override
+ public Matrix4f applyBend(float bendValue) {
+ this.bc$bend = bendValue;
+ BendApplier bendApplier = BendUtil.getBend(this, bendValue);
+ bc$iteratePositions(bendApplier.consumer());
+ return bendApplier.matrix4f();
+ }
+
+
+ @Override
+ public Direction getBendDirection() {
+ return this.bc$direction;
+ }
+
+ @Override
+ public float getBendX() {
+ return this.bc$fixX;
+ }
+
+ @Override
+ public float getBendY() {
+ return this.bc$fixY;
+ }
+
+ @Override
+ public float getBendZ() {
+ return this.bc$fixZ;
+ }
+
+ @Override
+ public Plane getBasePlane() {
+ return this.bc$basePlane;
+ }
+
+ @Override
+ public Plane getOtherPlane() {
+ return this.bc$otherPlane;
+ }
+
+ @Override
+ public float bendHeight() {
+ return this.bc$fullSize;
+ }
+
+ @Unique
+ public void bc$iteratePositions(Function function) {
+ for (RememberingPos pos: this.positions) {
+ pos.setPos(function.apply(pos.getOriginalPos()));
+ }
+ }
+
+ @Override
+ public float getBend() {
+ return this.bc$bend;
+ }
+}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java
deleted file mode 100644
index de74cf3..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.zigythebird.bendable_cuboids.mixin;
-
-
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.blaze3d.vertex.VertexConsumer;
-import com.zigythebird.bendable_cuboids.api.MutableCuboid;
-import com.zigythebird.bendable_cuboids.impl.BendableCuboid;
-import com.zigythebird.bendable_cuboids.impl.BendableCuboidData;
-import net.minecraft.client.model.geom.ModelPart;
-import net.minecraft.util.Tuple;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.*;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import java.util.HashMap;
-import java.util.Set;
-import java.util.function.Function;
-
-@SuppressWarnings({"rawtypes", "unused"})
-@Mixin(ModelPart.Cube.class)
-public class CuboidMutator implements MutableCuboid {
-
- @Shadow @Final public float minX;
- @Shadow @Final public float minY;
- @Shadow @Final public float minZ;
- //Store the mutators and the mutator builders.
-
- @Mutable
- @Shadow @Final
- public ModelPart.Polygon[] polygons;
- @Unique
- private final HashMap mutators = new HashMap<>();
-
- @Unique
- private final HashMap> mutatorBuilders = new HashMap<>();
-
- @Unique
- private ModelPart.Polygon[] originalQuads;
-
- @Unique
- private BendableCuboidData partData;
-
- @Nullable
- @Unique
- private BendableCuboid activeMutator;
-
- @Nullable
- @Unique
- private String activeMutatorID;
-
- @Inject(method = "", at = @At(value = "RETURN"))
- private void constructor(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set set, CallbackInfo ci){
- partData = new BendableCuboidData(u, v, minX, minY, minZ, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight);
- originalQuads = this.polygons;
- }
-
-
- @Override
- public boolean bendableCuboids$registerMutator(String name, Function builder) {
- if(mutatorBuilders.containsKey(name)) return false;
- if(builder == null) throw new NullPointerException("builder can not be null");
- mutatorBuilders.put(name, builder);
- return true;
- }
-
- @Override
- public boolean bendableCuboids$unregisterMutator(String name) {
- if(mutatorBuilders.remove(name) != null){
- if(name.equals(activeMutatorID)){
- activeMutator = null;
- activeMutatorID = null;
- }
- mutators.remove(name);
-
- return true;
- }
- return false;
- }
-
- @Nullable
- @Override
- public Tuple bendableCuboids$getActiveMutator() {
- return activeMutator == null ? null : new Tuple<>(activeMutatorID, activeMutator);
- }
-
- @Override
- public boolean bendableCuboids$hasMutator(String key) {
- return mutators.containsKey(key) || mutatorBuilders.containsKey(key);
- }
-
- @Nullable
- @Override
- public Function bendableCuboids$getCuboidBuilder(String key) {
- return mutatorBuilders.get(key);
- }
-
- @Nullable
- @Override
- public BendableCuboid bendableCuboids$getMutator(String name) {
- return mutators.get(name);
- }
-
- @Nullable
- @Override
- public BendableCuboid bendableCuboids$getAndActivateMutator(@Nullable String name) {
- if(name == null){
- activeMutatorID = null;
- activeMutator = null;
- return null;
- }
- if(mutatorBuilders.containsKey(name)){
- if(!mutators.containsKey(name)){
- mutators.put(name, mutatorBuilders.get(name).apply(partData));
- }
- activeMutatorID = name;
- return activeMutator = mutators.get(name);
- }
- return null;
- }
-
- @SuppressWarnings("ConstantConditions")
- @Override
- public void bendableCuboids$copyStateFrom(MutableCuboid other) {
- if(other.bendableCuboids$getActiveMutator() == null){
- activeMutator = null;
- activeMutatorID = null;
- }
- else {
- if(this.bendableCuboids$getAndActivateMutator(other.bendableCuboids$getActiveMutator().getA()) != null){
- activeMutator.copyState(other.bendableCuboids$getActiveMutator().getB());
- }
- }
- }
-
- @Inject(method = "compile", at = @At(value = "HEAD"), cancellable = true)
- private void renderRedirect(PoseStack.Pose entry, VertexConsumer vertexConsumer, int light, int overlay, int color, CallbackInfo ci){
- if(bendableCuboids$getActiveMutator() != null){
- bendableCuboids$getActiveMutator().getB().render(entry, vertexConsumer, light, overlay, color);
- ci.cancel();
- }
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/IModelPartMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/IModelPartMixin.java
deleted file mode 100644
index 7cb6519..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/IModelPartMixin.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.zigythebird.bendable_cuboids.mixin;
-
-import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
-import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.blaze3d.vertex.VertexConsumer;
-import com.zigythebird.bendable_cuboids.api.MutableCuboid;
-import com.zigythebird.bendable_cuboids.impl.accessors.IModelPartAccessor;
-import net.minecraft.client.model.geom.ModelPart;
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-@Mixin(ModelPart.class)
-public abstract class IModelPartMixin implements IModelPartAccessor {
- @Shadow @Final private Map children;
-
- @Shadow @Final private List cubes;
-
- @Unique
- private boolean bendableCuboids$hasMutatedCuboid = false;
-
- @Override
- public List bendableCuboids$getCuboids() {
- bendableCuboids$hasMutatedCuboid = true;
- return cubes;
- }
-
- @Override
- public Map bendableCuboids$getChildren() {
- return children;
- }
-
- @Inject(method = "copyFrom", at = @At("RETURN"))
- private void copyTransformExtended(ModelPart part, CallbackInfo ci){
- if (((IModelPartAccessor)part).bendableCuboids$getCuboids() == null || cubes == null) return; // Not copying state
- Iterator iterator0 = ((IModelPartAccessor)part).bendableCuboids$getCuboids().iterator();
- Iterator iterator1 = cubes.iterator();
-
- while (iterator0.hasNext() && iterator1.hasNext()){
- MutableCuboid cuboid1 = (MutableCuboid) iterator1.next();
- MutableCuboid cuboid0 = (MutableCuboid) iterator0.next();
- cuboid1.bendableCuboids$copyStateFrom(cuboid0);
- }
- }
-
- @WrapOperation(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/geom/ModelPart;compile(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V"), require = 0) //It might not find anything if OF already broke the game
- private void redirectRenderCuboids(ModelPart modelPart, PoseStack.Pose entry, VertexConsumer vertexConsumer, int light, int overlay, int color, Operation original){
- bendableCuboids$redirectedFunction(modelPart, entry, vertexConsumer, light, overlay, color, original);
- }
-
- @Unique
- private void bendableCuboids$redirectedFunction(ModelPart modelPart, PoseStack.Pose entry, VertexConsumer vertexConsumer, int light, int overlay, int color, Operation original) {
- if(!bendableCuboids$hasMutatedCuboid || cubes.size() == 1 && ((MutableCuboid)cubes.get(0)).bendableCuboids$getActiveMutator() == null){
- original.call(modelPart, entry, vertexConsumer, light, overlay, color);
- }
- else {
- for(ModelPart.Cube cuboid:cubes){
- cuboid.compile(entry, vertexConsumer, light, overlay, color);
- }
- }
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/ModelPartMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/ModelPartMixin.java
new file mode 100644
index 0000000..0399f7c
--- /dev/null
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/ModelPartMixin.java
@@ -0,0 +1,24 @@
+package com.zigythebird.bendable_cuboids.mixin;
+
+import com.zigythebird.bendable_cuboids.api.BendableCube;
+import com.zigythebird.bendable_cuboids.api.BendableModelPart;
+import net.minecraft.client.model.geom.ModelPart;
+import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Final;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+
+import java.util.List;
+
+@Mixin(ModelPart.class)
+public class ModelPartMixin implements BendableModelPart {
+ @Shadow
+ @Final
+ private List cubes;
+
+ @Override
+ public @Nullable BendableCube bc$getCuboid(int index) {
+ if (index > this.cubes.size() || index < 0) return null;
+ return this.cubes.get(index);
+ }
+}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java
deleted file mode 100644
index bcf6305..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.zigythebird.bendable_cuboids.mixin.geckolib;
-
-import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoLibBendableCuboid;
-import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeoCubeAccessor;
-import com.zigythebird.playeranim.math.Pair;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Unique;
-import software.bernie.geckolib.cache.object.GeoCube;
-
-@Mixin(GeoCube.class)
-public class GeoCubeMixin_geckoOnly implements GeoCubeAccessor {
- @Unique
- Pair bendableCuboid;
-
- @Override
- public void setBendableCuboid(Pair bendableCuboid) {
- this.bendableCuboid = bendableCuboid;
- }
-
- @Override
- public Pair getBendableCuboid() {
- return bendableCuboid;
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java
deleted file mode 100644
index dd744bb..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.zigythebird.bendable_cuboids.mixin.geckolib;
-
-import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
-import com.llamalad7.mixinextras.sugar.Local;
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.blaze3d.vertex.VertexConsumer;
-import com.zigythebird.bendable_cuboids.impl.BendUtil;
-import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoLibBendableCuboid;
-import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoLibBendableCuboidBuilder;
-import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoRenderUtil;
-import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeoCubeAccessor;
-import com.zigythebird.playeranim.accessors.IAnimatedPlayer;
-import com.zigythebird.playeranim.bones.PlayerAnimBone;
-import com.zigythebird.playeranim.math.Pair;
-import net.minecraft.client.player.AbstractClientPlayer;
-import net.minecraft.client.renderer.MultiBufferSource;
-import net.minecraft.client.renderer.RenderType;
-import net.minecraft.core.Direction;
-import org.jetbrains.annotations.Nullable;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import software.bernie.geckolib.animatable.GeoAnimatable;
-import software.bernie.geckolib.cache.object.BakedGeoModel;
-import software.bernie.geckolib.cache.object.GeoBone;
-import software.bernie.geckolib.cache.object.GeoCube;
-import software.bernie.geckolib.renderer.GeoArmorRenderer;
-import software.bernie.geckolib.renderer.GeoRenderer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Mixin(GeoRenderer.class)
-public interface GeoRendererMixin_geckoOnly {
- @Inject(method = "defaultRender", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/renderer/GeoRenderer;preRender(Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/animatable/GeoAnimatable;Lsoftware/bernie/geckolib/cache/object/BakedGeoModel;Lnet/minecraft/client/renderer/MultiBufferSource;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZFIII)V"), remap = false)
- private void initBend(PoseStack poseStack, T animatable, MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, float partialTick, int packedLight, CallbackInfo ci, @Local BakedGeoModel model) {
- if ((GeoRenderer)(Object)this instanceof GeoArmorRenderer> armorRenderer) {
- bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorLeftArm").orElse(null)), Direction.UP, "left_arm", model);
- bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorRightArm").orElse(null)), Direction.UP, "right_arm", model);
- bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorBody").orElse(null)), Direction.DOWN, "torso", model);
- bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorRightLeg").orElse(null)), Direction.UP, "right_leg", model);
- bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorLeftLeg").orElse(null)), Direction.UP, "left_leg", model);
- }
- }
-
- @Inject(method = "renderRecursively", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/util/RenderUtil;prepMatrixForBone(Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/cache/object/GeoBone;)V"), remap = false)
- private void renderBone(PoseStack poseStack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int renderColor, CallbackInfo ci) {
- if ((GeoRenderer)(Object)this instanceof GeoArmorRenderer> armorRenderer && armorRenderer.getCurrentEntity() instanceof AbstractClientPlayer player) {
- String name = bone.getName();
- if (name.equals("armorRightArm") || name.equals("armorLeftArm") || name.equals("armorHead")) {
- PlayerAnimBone bone1 = new PlayerAnimBone("torso");
- ((IAnimatedPlayer)player).playerAnimLib$getAnimManager().get3DTransform(bone1);
- if (Math.abs(bone1.getBend()) >= 0.0001f) {
- BendUtil.applyBendToMatrix(poseStack, 0, 1.125F, 0, bone1.getBendAxis(), -bone1.getBend());
- }
- }
- }
- }
-
- @WrapWithCondition(method = "renderCubesOfBone", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/renderer/GeoRenderer;renderCube(Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/cache/object/GeoCube;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V"), remap = false)
- private boolean renderCube(GeoRenderer instance, PoseStack poseStack, GeoCube cube, VertexConsumer buffer, int packedLight, int packedOverlay, int renderColor, @Local(argsOnly = true) GeoBone geoBone) {
- if (instance instanceof GeoArmorRenderer> armorRenderer && armorRenderer.getCurrentEntity() instanceof AbstractClientPlayer player) {
- Pair bendableCuboid = ((GeoCubeAccessor)(Object)cube).getBendableCuboid();
- if (bendableCuboid == null) return true;
- PlayerAnimBone bone = new PlayerAnimBone(bendableCuboid.getLeft());
- ((IAnimatedPlayer)player).playerAnimLib$getAnimManager().get3DTransform(bone);
- if (Math.abs(bone.getBend()) >= 0.0001f) {
- PoseStack offset = new PoseStack();
- offset.translate(-5.5, -14, 0);
- for (GeoBone bone1 : playerAnimLib$getParents(new ArrayList<>(), geoBone)) {
- GeckoRenderUtil.prepMatrixForBone(offset, bone1);
- }
- bendableCuboid.getRight().applyBend(bone.getBendAxis(), bone.getBend(), offset);
- bendableCuboid.getRight().render(poseStack.last(), buffer, packedLight, packedOverlay, renderColor);
- return false;
- }
- }
- return true;
- }
-
- @Unique
- private List playerAnimLib$getParents(List list, GeoBone bone) {
- if (bone == null || list.contains(bone) || bone.getName().equals("armorRightArm") || bone.getName().equals("armorLeftArm")
- || bone.getName().equals("armorRightLeg") || bone.getName().equals("armorLeftLeg") || bone.getName().equals("armorBody")) return list;
- list.addFirst(bone);
- return playerAnimLib$getParents(list, bone.getParent());
- }
-
- @Unique
- private void bendableCuboids$initBend(List bones, Direction direction, String parent, BakedGeoModel model) {
- if (bones == null) return;
- for (GeoBone bone : bones) {
- if (bone == null) continue;
- for (GeoCube cube : bone.getCubes()) {
- if (((GeoCubeAccessor)(Object)cube).getBendableCuboid() != null) continue;
- GeckoLibBendableCuboidBuilder builder = new GeckoLibBendableCuboidBuilder();
- builder.setDirection(direction);
- ((GeoCubeAccessor)(Object)cube).setBendableCuboid(new Pair<>(parent, builder.build(cube, model, parent)));
- }
- bendableCuboids$initBend(bone.getChildBones(), direction, parent, model);
- }
- }
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java
index 5ac2589..8247625 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java
@@ -1,25 +1,23 @@
package com.zigythebird.bendable_cuboids.mixin.playeranim;
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper;
import com.zigythebird.playeranim.accessors.IPlayerAnimationState;
import com.zigythebird.playeranim.animation.PlayerAnimManager;
-import com.zigythebird.playeranim.bones.PlayerAnimBone;
import com.zigythebird.playeranim.mixin.CapeLayerAccessor;
import com.zigythebird.playeranim.util.RenderUtil;
+import com.zigythebird.playeranimcore.bones.PlayerAnimBone;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.PlayerModel;
-import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.RenderLayerParent;
import net.minecraft.client.renderer.entity.layers.CapeLayer;
import net.minecraft.client.renderer.entity.layers.RenderLayer;
-import net.minecraft.client.renderer.entity.state.HumanoidRenderState;
import net.minecraft.client.renderer.entity.state.PlayerRenderState;
-import net.minecraft.client.resources.model.EquipmentAssetManager;
import org.joml.Quaternionf;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@@ -29,52 +27,39 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(CapeLayer.class)
-public abstract class CapeLayerMixin_playerAnim extends RenderLayer {
+public abstract class CapeLayerMixin_playerAnim extends RenderLayer {
@Shadow @Final private HumanoidModel model;
- @Inject(method = "", at = @At("TAIL"))
- private void init(RenderLayerParent renderLayerParent, EntityModelSet entityModelSet, EquipmentAssetManager equipmentAssetManager, CallbackInfo ci) {
- PlayerBendHelper.initCapeBend(((PlayerCapeModelAccessor_playerAnim)model).getCape());
- }
-
- public CapeLayerMixin_playerAnim(RenderLayerParent renderLayerParent) {
+ private CapeLayerMixin_playerAnim(RenderLayerParent renderLayerParent, Void v) {
super(renderLayerParent);
}
@Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/PlayerRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/HumanoidModel;renderToBuffer(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;II)V"))
private void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, PlayerRenderState playerRenderState, float f, float g, CallbackInfo ci) {
- PlayerAnimManager emote = ((IPlayerAnimationState) playerRenderState).playerAnimLib$getAnimManager();
if (model instanceof CapeLayerAccessor capeLayer) {
- if (emote.isActive()) {
- PlayerAnimBone bone = ((IPlayerAnimationState) playerRenderState).playerAnimLib$getAnimProcessor().getBone("torso");
- emote.get3DTransform(bone);
+ PlayerAnimManager emote = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimManager();
+ if (emote != null && emote.isActive()) {
ModelPart torso = this.getParentModel().body;
+ PlayerAnimBone bone = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimProcessor().getBone("cape");
poseStack.translate(torso.x / 16, torso.y / 16, torso.z / 16);
- poseStack.mulPose((new Quaternionf()).rotateXYZ(torso.xRot, torso.yRot, torso.zRot));
- PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBendAxis(), bone.getBend());
+ poseStack.mulPose((new Quaternionf()).rotateZYX(torso.zRot, torso.yRot, torso.xRot));
+ PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBend());
poseStack.translate(0.0F, 0.0F, 0.125F);
- poseStack.mulPose(Axis.YP.rotationDegrees(180));
+ poseStack.mulPose(Axis.YP.rotation(3.14159f));
ModelPart part = capeLayer.getCape();
- PlayerAnimBone bone1 = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimProcessor().getBone("cape");
- bone1.setToInitialPose();
- bone1.setBendAxis(bone.getBendAxis());
- bone1.setBend(bone.getBend());
- emote.get3DTransform(bone1);
-
- RenderUtil.translatePartToBone(part, bone1, part.getInitialPose());
+ bone.setToInitialPose();
+ emote.get3DTransform(bone);
- PlayerBendHelper.bend(part, bone1.getBendAxis(), bone1.getBend());
- } else {
- PlayerBendHelper.bend(capeLayer.getCape(), 0, 0);
+ RenderUtil.translatePartToBone(part, bone);
}
}
}
- @WrapWithCondition(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/PlayerRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/HumanoidModel;setupAnim(Lnet/minecraft/client/renderer/entity/state/HumanoidRenderState;)V"))
- private boolean setupAnim(HumanoidModel instance, T playerRenderState) {
+ @WrapWithCondition(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/PlayerRenderState;FF)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V"))
+ private boolean translate(PoseStack instance, float f, float g, float h, @Local(argsOnly = true) PlayerRenderState playerRenderState) {
PlayerAnimManager emote = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimManager();
return emote == null || !emote.isActive();
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java
index d2d1eec..dcd32a7 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java
@@ -4,42 +4,50 @@
import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper;
import com.zigythebird.playeranim.accessors.IPlayerAnimationState;
import com.zigythebird.playeranim.animation.PlayerAnimManager;
-import com.zigythebird.playeranim.bones.PlayerAnimBone;
+import com.zigythebird.playeranim.util.RenderUtil;
+import com.zigythebird.playeranimcore.animation.AnimationProcessor;
+import com.zigythebird.playeranimcore.bones.PlayerAnimBone;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.RenderLayerParent;
import net.minecraft.client.renderer.entity.layers.RenderLayer;
import net.minecraft.client.renderer.entity.layers.WingsLayer;
import net.minecraft.client.renderer.entity.state.HumanoidRenderState;
-import org.joml.Quaternionf;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(WingsLayer.class)
+@SuppressWarnings("UnstableApiUsage")
public abstract class ElytraLayerMixin_playerAnim> extends RenderLayer {
public ElytraLayerMixin_playerAnim(RenderLayerParent renderLayerParent) {
super(renderLayerParent);
}
- @Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/HumanoidRenderState;FF)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V"))
+ @Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/HumanoidRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer;renderLayers(Lnet/minecraft/client/resources/model/EquipmentClientInfo$LayerType;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/client/model/Model;Lnet/minecraft/world/item/ItemStack;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/resources/ResourceLocation;)V"))
private void inject(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, S humanoidRenderState, float f, float g, CallbackInfo ci) {
if (humanoidRenderState instanceof IPlayerAnimationState animationState) {
PlayerAnimManager emote = animationState.playerAnimLib$getAnimManager();
- if (emote.isActive()) {
- PlayerAnimBone bone = animationState.playerAnimLib$getAnimProcessor().getBone("torso");
- PlayerAnimBone bone1 = animationState.playerAnimLib$getAnimProcessor().getBone("cape");
- PlayerAnimBone bone2 = animationState.playerAnimLib$getAnimProcessor().getBone("elytra");
- emote.get3DTransform(bone);
- bone1.copyOtherBone(bone);
- emote.get3DTransform(bone1);
- bone2.copyOtherBone(bone1);
- emote.get3DTransform(bone2);
- poseStack.translate(bone2.getPosX() / 16, bone2.getPosX() / 16, bone2.getPosX() / 16);
- poseStack.mulPose((new Quaternionf()).rotateXYZ(-bone2.getRotX(), bone2.getRotY(), -bone2.getRotZ()));
- poseStack.scale(bone2.getScaleX(), bone2.getScaleY(), bone2.getScaleZ());
- PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBendAxis(), bone.getBend());
+ if (emote != null && emote.isActive()) {
+ AnimationProcessor processor = animationState.playerAnimLib$getAnimProcessor();
+ PlayerAnimBone torso = processor.getBone("torso");
+ PlayerAnimBone cape = processor.getBone("cape");
+ PlayerAnimBone elytra = processor.getBone("elytra");
+ torso.setToInitialPose();
+ cape.setToInitialPose();
+ elytra.setToInitialPose();
+ emote.get3DTransform(torso);
+ emote.get3DTransform(cape);
+ emote.get3DTransform(elytra);
+ elytra.applyOtherBone(cape);
+ elytra.mulPos(-1);
+ elytra.mulRot(-1, 1, -1);
+ torso.positionY *= -1;
+ float bend = elytra.getBend();
+ elytra.applyOtherBone(torso);
+ RenderUtil.translateMatrixToBone(poseStack, elytra);
+ PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bend);
}
}
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java
index 6f9ddca..b1996a7 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java
@@ -11,6 +11,7 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(HumanoidArmorLayer.class)
+@SuppressWarnings("rawtypes")
public class HumanoidArmorLayerMixin {
@Inject(method = "(Lnet/minecraft/client/renderer/entity/RenderLayerParent;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer;)V", at = @At("TAIL"))
private void init(RenderLayerParent renderLayerParent, HumanoidModel humanoidModel, HumanoidModel humanoidModel2, HumanoidModel humanoidModel3, HumanoidModel humanoidModel4, EquipmentLayerRenderer equipmentLayerRenderer, CallbackInfo ci) {
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java
index 3005caa..2897535 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java
@@ -1,23 +1,23 @@
package com.zigythebird.bendable_cuboids.mixin.playeranim;
import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.math.Axis;
import com.zigythebird.playeranim.accessors.IPlayerAnimationState;
-import com.zigythebird.playeranim.bones.PlayerAnimBone;
+import com.zigythebird.playeranimcore.bones.PlayerAnimBone;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.layers.ItemInHandLayer;
import net.minecraft.client.renderer.entity.state.ArmedEntityRenderState;
import net.minecraft.client.renderer.item.ItemStackRenderState;
import net.minecraft.world.entity.HumanoidArm;
-import org.joml.Quaternionf;
-import org.joml.Vector3f;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ItemInHandLayer.class)
+@SuppressWarnings("UnstableApiUsage")
public class ItemInHandLayerMixin_playerAnim {
- @Inject(method = "renderArmWithItem", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionf;)V", ordinal = 0))
+ @Inject(method = "renderArmWithItem", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionfc;)V", ordinal = 0))
private void renderMixin(S armedEntityRenderState, ItemStackRenderState itemStackRenderState, HumanoidArm humanoidArm, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci){
if(armedEntityRenderState instanceof IPlayerAnimationState state){
if(state.playerAnimLib$getAnimManager().isActive()){
@@ -25,8 +25,7 @@ private void renderMixin(S armedEntityRenderState, ItemStackRenderState itemStac
state.playerAnimLib$getAnimManager().get3DTransform(bone);
float offset = 0.25f;
poseStack.translate(0, offset, 0);
- Vector3f axis = new Vector3f((float) Math.cos(-bone.getBendAxis()), 0, (float) -Math.sin(-bone.getBendAxis()));
- poseStack.mulPose(new Quaternionf().rotateAxis(bone.getBend(), axis));
+ poseStack.mulPose(Axis.XP.rotation(bone.getBend()));
poseStack.translate(0, - offset, 0);
}
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java
index 3aeab17..68110a8 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java
@@ -5,7 +5,7 @@
import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper;
import com.zigythebird.playeranim.accessors.IPlayerAnimationState;
import com.zigythebird.playeranim.accessors.IUpperPartHelper;
-import com.zigythebird.playeranim.bones.PlayerAnimBone;
+import com.zigythebird.playeranimcore.bones.PlayerAnimBone;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
@@ -17,13 +17,14 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = LivingEntityRenderer.class, priority = 2000)
+@SuppressWarnings("UnstableApiUsage")
public class LivingEntityMixin_playerAnim> {
@Inject(method = "render(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/RenderLayer;render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/EntityRenderState;FF)V"))
private void inject(S livingEntityRenderState, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci, @Local RenderLayer layer) {
if (livingEntityRenderState instanceof IPlayerAnimationState state && state.playerAnimLib$getAnimManager().isActive() && ((IUpperPartHelper) layer).playerAnimLib$isUpperPart()) {
PlayerAnimBone bone = state.playerAnimLib$getAnimProcessor().getBone("torso");
state.playerAnimLib$getAnimManager().get3DTransform(bone);
- PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBendAxis(), bone.getBend());
+ PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBend());
}
}
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityRendererAccessor_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityRendererAccessor_playerAnim.java
deleted file mode 100644
index 6512f70..0000000
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityRendererAccessor_playerAnim.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.zigythebird.bendable_cuboids.mixin.playeranim;
-
-import net.minecraft.client.model.EntityModel;
-import net.minecraft.client.renderer.entity.LivingEntityRenderer;
-import net.minecraft.client.renderer.entity.layers.RenderLayer;
-import net.minecraft.client.renderer.entity.state.LivingEntityRenderState;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-import java.util.List;
-
-@Mixin(LivingEntityRenderer.class)
-public interface LivingEntityRendererAccessor_playerAnim> {
- @Accessor
- List> getLayers();
-}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java
index ff2ebe8..88699a9 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java
@@ -6,7 +6,7 @@
import com.zigythebird.playeranim.accessors.IMutableModel;
import com.zigythebird.playeranim.accessors.IUpperPartHelper;
import com.zigythebird.playeranim.animation.PlayerAnimManager;
-import com.zigythebird.playeranim.bones.PlayerAnimBone;
+import com.zigythebird.playeranimcore.bones.PlayerAnimBone;
import net.minecraft.client.model.Model;
import net.minecraft.client.model.PlayerModel;
import org.spongepowered.asm.mixin.Mixin;
@@ -15,6 +15,7 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Model.class)
+@SuppressWarnings("UnstableApiUsage")
public abstract class ModelMixin_playerAnim {
@Inject(method = "renderToBuffer(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V", at = @At("HEAD"), cancellable = true)
public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, int color, CallbackInfo ci) {
@@ -28,7 +29,7 @@ public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int ligh
PlayerAnimManager emoteSupplier = ((IMutableModel)playerModel).playerAnimLib$getAnimation();
PlayerAnimBone bone = new PlayerAnimBone("torso");
emoteSupplier.get3DTransform(bone);
- PlayerBendHelper.applyTorsoBendToMatrix(matrices, bone.getBendAxis(), bone.getBend());
+ PlayerBendHelper.applyTorsoBendToMatrix(matrices, bone.getBend());
((PlayerModelAccessor_playerAnim)playerModel).getBodyParts().forEach((part)->{
if(((IUpperPartHelper) part).playerAnimLib$isUpperPart()){
part.render(matrices, vertices, light, overlay, color);
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java
index f72db71..699ebd4 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java
@@ -5,8 +5,8 @@
import com.zigythebird.playeranim.accessors.IMutableModel;
import com.zigythebird.playeranim.accessors.IPlayerAnimationState;
import com.zigythebird.playeranim.accessors.IUpperPartHelper;
-import com.zigythebird.playeranim.animation.AnimationProcessor;
-import com.zigythebird.playeranim.bones.PlayerAnimBone;
+import com.zigythebird.playeranimcore.animation.AnimationProcessor;
+import com.zigythebird.playeranimcore.bones.PlayerAnimBone;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.renderer.entity.state.PlayerRenderState;
@@ -17,6 +17,7 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = PlayerModel.class, priority = 2002)
+@SuppressWarnings("UnstableApiUsage")
public abstract class PlayerModelMixin_playerAnim implements IMutableModel {
@Inject(method = "", at = @At("RETURN"))
private void initBendableStuff(ModelPart modelPart, boolean bl, CallbackInfo ci) {
@@ -39,17 +40,17 @@ private void setupPlayerAnimation(PlayerRenderState playerRenderState, CallbackI
PlayerAnimBone rightLeg = processor.getBone("right_leg");
PlayerAnimBone leftLeg = processor.getBone("left_leg");
- PlayerBendHelper.bend(model.body, torso.getBendAxis(), torso.getBend());
- PlayerBendHelper.bend(model.rightArm, rightArm.getBendAxis(), rightArm.getBend());
- PlayerBendHelper.bend(model.leftArm, leftArm.getBendAxis(), leftArm.getBend());
- PlayerBendHelper.bend(model.rightLeg, rightLeg.getBendAxis(), rightLeg.getBend());
- PlayerBendHelper.bend(model.leftLeg, leftLeg.getBendAxis(), leftLeg.getBend());
+ PlayerBendHelper.bend(model.body, torso.getBend());
+ PlayerBendHelper.bend(model.rightArm, rightArm.getBend());
+ PlayerBendHelper.bend(model.leftArm, leftArm.getBend());
+ PlayerBendHelper.bend(model.rightLeg, rightLeg.getBend());
+ PlayerBendHelper.bend(model.leftLeg, leftLeg.getBend());
- PlayerBendHelper.bend(model.jacket, torso.getBendAxis(), torso.getBend());
- PlayerBendHelper.bend(model.rightSleeve, rightArm.getBendAxis(), rightArm.getBend());
- PlayerBendHelper.bend(model.leftSleeve, leftArm.getBendAxis(), leftArm.getBend());
- PlayerBendHelper.bend(model.rightPants, rightLeg.getBendAxis(), rightLeg.getBend());
- PlayerBendHelper.bend(model.leftPants, leftLeg.getBendAxis(), leftLeg.getBend());
+ PlayerBendHelper.bend(model.jacket, torso.getBend());
+ PlayerBendHelper.bend(model.rightSleeve, rightArm.getBend());
+ PlayerBendHelper.bend(model.leftSleeve, leftArm.getBend());
+ PlayerBendHelper.bend(model.rightPants, rightLeg.getBend());
+ PlayerBendHelper.bend(model.leftPants, leftLeg.getBend());
}
else {
resetBend(model.body);
@@ -68,6 +69,6 @@ private void setupPlayerAnimation(PlayerRenderState playerRenderState, CallbackI
@Unique
private static void resetBend(ModelPart part) {
- PlayerBendHelper.bend(part, 0, 0);
+ PlayerBendHelper.bend(part, 0);
}
}
diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java
index 170316e..13d2001 100644
--- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java
+++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java
@@ -18,6 +18,7 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = PlayerRenderer.class, priority = 2000)
+@SuppressWarnings("UnstableApiUsage")
public abstract class PlayerRendererMixin_playerAnim extends LivingEntityRenderer {
public PlayerRendererMixin_playerAnim(EntityRendererProvider.Context context, PlayerModel entityModel, float f) {
super(context, entityModel, f);
@@ -26,7 +27,10 @@ public PlayerRendererMixin_playerAnim(EntityRendererProvider.Context context, Pl
@Inject(method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/geom/ModelPart;render(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;II)V"))
private void renderHand(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, ResourceLocation resourceLocation, ModelPart modelPart, boolean bl, CallbackInfo ci) {
if (((IMutableModel)this.getModel()).playerAnimLib$getAnimation() == null || !((IMutableModel)this.getModel()).playerAnimLib$getAnimation().getFirstPersonMode().isEnabled()) {
- PlayerBendHelper.bend(modelPart, 0, 0);
+ PlayerModel playermodel = (PlayerModel)this.getModel();
+ PlayerBendHelper.bend(modelPart, 0);
+ PlayerBendHelper.bend(playermodel.rightSleeve, 0);
+ PlayerBendHelper.bend(playermodel.leftSleeve, 0);
}
}
}
diff --git a/common/src/main/resources/architectury.common.json b/common/src/main/resources/architectury.common.json
index f7316ae..2c678b6 100644
--- a/common/src/main/resources/architectury.common.json
+++ b/common/src/main/resources/architectury.common.json
@@ -1,3 +1,11 @@
{
+ "injected_interfaces": {
+ "net/minecraft/class_630$class_628": [
+ "com/zigythebird/bendable_cuboids/api/BendableCube"
+ ],
+ "net/minecraft/class_630": [
+ "com/zigythebird/bendable_cuboids/api/BendableModelPart"
+ ]
+ },
"accessWidener": "bendable_cuboids.accesswidener"
}
\ No newline at end of file
diff --git a/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json b/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json
index ec40752..526d017 100644
--- a/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json
+++ b/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json
@@ -6,27 +6,27 @@
"bones": {
"torso": {
"bend": {
- "vector": [0, 25, 0]
+ "vector": [25, 0, 0]
}
},
"right_arm": {
"bend": {
- "vector": [0, -62.5, 0]
+ "vector": [-62.5, 0, 0]
}
},
"left_arm": {
"bend": {
- "vector": [0, -47.5, 0]
+ "vector": [-47.5, 0, 0]
}
},
"head": {
"bend": {
- "vector": [0, 30, 0]
+ "vector": [30, 0, 0]
}
},
"left_leg": {
"bend": {
- "vector": [0, -35, 0]
+ "vector": [-35, 0, 0]
}
}
}
diff --git a/common/src/main/resources/bendable_cuboids.mixins.json b/common/src/main/resources/bendable_cuboids.mixins.json
index 25583fb..d85cbca 100644
--- a/common/src/main/resources/bendable_cuboids.mixins.json
+++ b/common/src/main/resources/bendable_cuboids.mixins.json
@@ -5,15 +5,14 @@
"plugin": "com.zigythebird.bendable_cuboids.ModMixinPlugin",
"compatibilityLevel": "JAVA_21",
"client": [
- "CuboidMutator",
- "IModelPartMixin",
+ "CubeMixin",
+ "ModelPartMixin",
"playeranim.CapeLayerAccessor_playerAnim",
"playeranim.CapeLayerMixin_playerAnim",
"playeranim.ElytraLayerMixin_playerAnim",
"playeranim.HumanoidArmorLayerMixin",
"playeranim.ItemInHandLayerMixin_playerAnim",
"playeranim.LivingEntityMixin_playerAnim",
- "playeranim.LivingEntityRendererAccessor_playerAnim",
"playeranim.ModelMixin_playerAnim",
"playeranim.PlayerCapeModelAccessor_playerAnim",
"playeranim.PlayerCapeModelMixin_playerAnim",
@@ -23,9 +22,5 @@
],
"injectors": {
"defaultRequire": 1
- },
- "mixins": [
- "geckolib.GeoCubeMixin_geckoOnly",
- "geckolib.GeoRendererMixin_geckoOnly"
- ]
+ }
}
\ No newline at end of file
diff --git a/fabric/build.gradle b/fabric/build.gradle
index cdfe837..1b58af6 100644
--- a/fabric/build.gradle
+++ b/fabric/build.gradle
@@ -1,5 +1,9 @@
plugins {
- id "com.github.johnrengelman.shadow"
+ id "com.gradleup.shadow"
+}
+
+loom {
+ accessWidenerPath = project(":common").loom.accessWidenerPath
}
architectury {
@@ -7,32 +11,21 @@ architectury {
fabric()
}
-loom {
- accessWidenerPath = project(":common").loom.accessWidenerPath
-}
-
configurations {
common
- shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
+ shadowCommon
compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common
developmentFabric.extendsFrom common
}
-repositories {
- maven { url "https://maven.terraformersmc.com/releases/" }
- maven { url "https://maven.kosmx.dev/" }
-}
-
-
dependencies {
- modImplementation "net.fabricmc:fabric-loader:${rootProject.loader_version}"
-
+ modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}"
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false }
- modLocalRuntime "software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}"
+ modImplementation "com.zigythebird.playeranim:PlayerAnimationLibFabric:${rootProject.player_anim_version}"
}
processResources {
@@ -44,21 +37,20 @@ processResources {
}
shadowJar {
- exclude "architectury.common.json"
-
configurations = [project.configurations.shadowCommon]
- archiveClassifier.set("dev-shadow")
+ archiveClassifier.set "dev-shadow"
}
remapJar {
injectAccessWidener = true
+
inputFile.set shadowJar.archiveFile
dependsOn shadowJar
- archiveClassifier.set(null)
+ archiveClassifier.set null
}
jar {
- archiveClassifier.set("dev")
+ archiveClassifier.set "dev"
}
sourcesJar {
@@ -75,31 +67,9 @@ components.java {
publishing {
publications {
- maven(MavenPublication) {
- groupId = "com.zigythebird.bendable_cuboids"
- artifactId = "bendable_cuboids-fabric-$minecraft_version"
- version = rootProject.mod_version
+ mavenFabric(MavenPublication) {
+ artifactId = "BendableCuboidsFabric"
from components.java
}
}
-
- repositories {
- if(System.getenv("GITHUB_ACTOR") != null) {
- maven {
- name = "GitHubPackages"
- url = "https://maven.pkg.github.com/zigythebird/bendable_cuboids"
- credentials {
- username = System.getenv("GITHUB_ACTOR")
- password = System.getenv("GITHUB_TOKEN")
- }
- }
- }
- maven {
- url = "https://maven.zigythebird.com/mods"
- credentials(PasswordCredentials)
- authentication {
- basic(BasicAuthentication)
- }
- }
- }
}
diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json
index 2721807..fb13e39 100644
--- a/fabric/src/main/resources/fabric.mod.json
+++ b/fabric/src/main/resources/fabric.mod.json
@@ -24,17 +24,17 @@
"bendable_cuboids.mixins.json"
],
"depends": {
- "fabricloader": ">=0.16.9",
- "minecraft": ">=1.21.4"
+ "fabricloader": ">=0.16.14",
+ "minecraft": ">=1.21.7"
+ },
+ "breaks": {
+ "ears": "*",
+ "skinlayers3d": "*"
},
"custom": {
"modmenu": {
- "badges": ["library"]
- },
- "sodium:options": {
- "mixin.features.render.entity": false,
- "mixin.features.render.entity.cull": true,
- "mixin.features.render.entity.shadow": true
+ "badges": ["library"],
+ "parent": "player_animation_library"
}
}
}
\ No newline at end of file
diff --git a/forge/build.gradle b/forge/build.gradle
index f2cf03d..ba595d4 100644
--- a/forge/build.gradle
+++ b/forge/build.gradle
@@ -1,5 +1,9 @@
plugins {
- id "com.github.johnrengelman.shadow"
+ id "com.gradleup.shadow"
+}
+
+loom {
+ accessWidenerPath = project(":common").loom.accessWidenerPath
}
architectury {
@@ -7,26 +11,22 @@ architectury {
neoForge()
}
-loom {
- accessWidenerPath = project(":common").loom.accessWidenerPath
-}
-
configurations {
common
- shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this.
+ shadowCommon
compileClasspath.extendsFrom common
runtimeClasspath.extendsFrom common
developmentNeoForge.extendsFrom common
}
dependencies {
- neoForge "net.neoforged:neoforge:${rootProject.forge_version}"
+ neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}"
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false }
- modLocalRuntime "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}"
- modLocalRuntime "com.zigythebird.playeranim:player_animation_library-neoforge-${minecraft_version}:${player_anim_version}"
+ modImplementation "com.zigythebird.playeranim:PlayerAnimationLibNeo:${rootProject.player_anim_version}"
+ forgeRuntimeLibrary "org.javassist:javassist:3.30.2-GA"
}
processResources {
@@ -42,7 +42,7 @@ shadowJar {
exclude "architectury.common.json"
configurations = [project.configurations.shadowCommon]
- archiveClassifier.set("dev-shadow")
+ archiveClassifier.set "dev-shadow"
}
remapJar {
@@ -50,11 +50,11 @@ remapJar {
inputFile.set shadowJar.archiveFile
dependsOn shadowJar
- archiveClassifier.set(null)
+ archiveClassifier.set null
}
jar {
- archiveClassifier.set("dev")
+ archiveClassifier.set "dev"
}
sourcesJar {
@@ -71,31 +71,9 @@ components.java {
publishing {
publications {
- maven(MavenPublication) {
- groupId = "com.zigythebird.bendable_cuboids"
- artifactId = "bendable_cuboids-neoforge-$minecraft_version"
- version = rootProject.mod_version
+ mavenNeoForge(MavenPublication) {
+ artifactId = "BendableCuboidsNeo"
from components.java
}
}
-
- repositories {
- if(System.getenv("GITHUB_ACTOR") != null) {
- maven {
- name = "GitHubPackages"
- url = "https://maven.pkg.github.com/zigythebird/bendable_cuboids"
- credentials {
- username = System.getenv("GITHUB_ACTOR")
- password = System.getenv("GITHUB_TOKEN")
- }
- }
- }
- maven {
- url = "https://maven.zigythebird.com/mods"
- credentials(PasswordCredentials)
- authentication {
- basic(BasicAuthentication)
- }
- }
- }
}
diff --git a/forge/src/main/resources/META-INF/neoforge.mods.toml b/forge/src/main/resources/META-INF/neoforge.mods.toml
index 4263585..eea5cb0 100644
--- a/forge/src/main/resources/META-INF/neoforge.mods.toml
+++ b/forge/src/main/resources/META-INF/neoforge.mods.toml
@@ -17,15 +17,23 @@ Adds model cubes that can be bent, for example like arms in MC Story Mode!
[[mixins]]
config = "bendable_cuboids.mixins.json"
-[mods."sodium:options"]
-"mixin.features.render.entity" = false
-"mixin.features.render.entity.cull" = true
-"mixin.features.render.entity.shadow" = true
-
[[dependencies.bendable_cuboids]]
modId = "minecraft"
type = "required"
-mandatory = true
-versionRange = "[1.21,)"
+versionRange = "[1.21.7,)"
+ordering = "NONE"
+side = "CLIENT"
+
+[[dependencies.bendable_cuboids]]
+modId = "ears"
+type = "incompatible"
+versionRange = "[1.0,)"
+ordering = "NONE"
+side = "CLIENT"
+
+[[dependencies.bendable_cuboids]]
+modId = "skinlayers3d"
+type = "incompatible"
+versionRange = "[1.0,)"
ordering = "NONE"
-side = "CLIENT"
\ No newline at end of file
+side = "CLIENT"
diff --git a/gradle.properties b/gradle.properties
index 52618e9..5004dd7 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,18 +1,17 @@
+# Done to increase the memory available to Gradle.
org.gradle.jvmargs=-Xmx4G
+org.gradle.parallel=true
-mod_version=1.0.0+1.21.4
-maven_group=com.zigythebird.bendable_cuboids
-archives_base_name=bendable_cuboids
+# Mod properties
+mod_version = 1.0.0+dev
+maven_group = com.zigythebird.bendable_cuboids
+archives_base_name = BendableCuboids
-minecraft_version=1.21.4
-loader_version=0.16.9
+# Minecraft properties
+minecraft_version = 1.21.7
+parchment_version = 2025.06.29
-#Fabric api
-fabric_version=0.112.2+1.21.4
-
-#Forge thingy
-forge_version=21.4.84-beta
-
-#Other mods
-player_anim_version=0.5.0-BETA
-geckolib_version=4.8.4
\ No newline at end of file
+# Dependencies
+fabric_loader_version = 0.16.14
+neoforge_version = 21.7.11-beta
+player_anim_version = 1.0.0+mc1.21.7
diff --git a/settings.gradle b/settings.gradle
index 5a5f8d2..ebd18d6 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -11,4 +11,4 @@ include("common")
include("fabric")
include("forge")
-rootProject.name = "bendy-lib"
+rootProject.name = "BendableCuboids"