Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/main/java/org/useless/DragonFly.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.useless.dragonfly.animation.Animation;
import org.useless.dragonfly.data.block.mojang.BlockModelMojangData;
import org.useless.dragonfly.data.block.mojang.state.AppliedData;
import org.useless.dragonfly.data.block.mojang.state.BlockstateData;
import org.useless.dragonfly.data.block.mojang.state.ModelPart;
import org.useless.dragonfly.data.entity.mojang.EntityGeometryMojangData;
import org.useless.dragonfly.models.entity.StaticEntityModel;
import org.useless.util.AnimationHelper;
import turniplabs.halplibe.util.GameStartEntrypoint;

import java.util.Objects;
Expand All @@ -29,7 +31,7 @@ public class DragonFly implements GameStartEntrypoint {

@Override
public void beforeGameStart() {

//new ModEntity().initializeEntities();
}


Expand All @@ -53,11 +55,17 @@ public static Random getRandomFromPos(int x, int y, int z){
return Objects.requireNonNull(BlockModelMojangData.Cache.loadModelData(mc.texturePackList, id), "Cannot find model for id '" + id + "'!");
}


public static @NotNull StaticEntityModel loadEntityModel(@NotNull final String id, final double inflation) {
final Minecraft mc = Minecraft.getMinecraft();
return Objects.requireNonNull(EntityGeometryMojangData.Cache.getModel(id, inflation), "Cannot find model for id '" + id + "'!");
}

public static @NotNull Animation loadEntityAnimations(@NotNull final String modid, @NotNull final String id) {
final Minecraft mc = Minecraft.getMinecraft();
return Objects.requireNonNull(AnimationHelper.getOrCreateEntityAnimation(modid, id), "Cannot find model for id '" + id + "'!");
}

public static @NotNull BlockstateData loadStateData(@NotNull final String id) {
final Minecraft mc = Minecraft.getMinecraft();
BlockstateData blockstateData = Objects.requireNonNull(BlockstateData.Cache.loadStateData(mc.texturePackList, id), "Cannot find model for id '" + id + "'!");
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/org/useless/DragonFlyClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package org.useless;

import net.minecraft.client.render.EntityRenderDispatcher;
import net.minecraft.client.render.TileEntityRenderDispatcher;
import net.minecraft.client.render.block.color.BlockColorDispatcher;
import net.minecraft.client.render.block.model.BlockModelDispatcher;
import net.minecraft.client.render.item.model.ItemModelDispatcher;
import turniplabs.halplibe.util.ModelEntrypoint;

public class DragonFlyClient implements ModelEntrypoint {
//public static final @NotNull Animation animation = DragonFly.loadEntityAnimations("dragonfly", "walk");


@Override
public void initEntityModels(EntityRenderDispatcher dispatcher) {
//DragonFly.loadEntityModel("geometry.dragonfly.test", 0);
//ModelHelper.setEntityModel(TestMob.class, () -> new MobRendererTest());
}

@Override
public void initTileEntityModels(TileEntityRenderDispatcher tileEntityRenderDispatcher) {

}

@Override
public void initBlockColors(BlockColorDispatcher blockColorDispatcher) {

}

@Override
public void initBlockModels(BlockModelDispatcher blockModelDispatcher) {

}

@Override
public void initItemModels(ItemModelDispatcher itemModelDispatcher) {
}
}
29 changes: 29 additions & 0 deletions src/main/java/org/useless/dragonfly/animation/Animation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.useless.dragonfly.animation;

import java.util.List;

public class Animation {
private final List<AnimationData> animations;
private final float animation_length;
private final boolean loop;


public List<AnimationData> getAnimations() {
return animations;
}


public float getAnimationLength() {
return animation_length;
}

public boolean isLoop() {
return loop;
}

public Animation(List<AnimationData> animations, float animationLength, boolean loop) {
this.animations = animations;
animation_length = animationLength;
this.loop = loop;
}
}
29 changes: 29 additions & 0 deletions src/main/java/org/useless/dragonfly/animation/AnimationData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.useless.dragonfly.animation;

import java.util.List;

public class AnimationData {

private final String bone;
private final String target;
private final List<KeyFrameData> keyFrames;

public AnimationData(String bone, String target, List<KeyFrameData> keyFrames) {

this.bone = bone;
this.target = target;
this.keyFrames = keyFrames;
}

public String getTarget() {
return target;
}

public String getBone() {
return bone;
}

public List<KeyFrameData> getKeyFrames() {
return keyFrames;
}
}
27 changes: 27 additions & 0 deletions src/main/java/org/useless/dragonfly/animation/KeyFrameData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.useless.dragonfly.animation;

import java.util.List;

public class KeyFrameData {
private final List<Float> target;
private final float timestamp;
private final String interpolation;

public KeyFrameData(List<Float> target, float timestamp, String interpolation) {
this.target = target;
this.timestamp = timestamp;
this.interpolation = interpolation;
}

public List<Float> getTarget() {
return target;
}

public String getInterpolation() {
return interpolation;
}

public float getTimestamp() {
return timestamp;
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,13 @@
package org.useless.dragonfly.data.entity.mojang;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.*;
import com.mojang.logging.LogUtils;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.render.texturepack.TexturePack;
import net.minecraft.client.render.texturepack.TexturePackList;
import net.minecraft.core.util.HardIllegalArgumentException;
import net.minecraft.core.util.collection.NamespaceID;
import net.minecraft.core.util.collection.Pair;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
Expand All @@ -30,13 +20,7 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;

public class EntityGeometryMojangData implements EntityModelData {
public static final @NotNull String CURRENT_VERSION = "1.8.0";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.useless.dragonfly.data.entity.mojang;

import com.google.gson.*;
import org.spongepowered.include.com.google.common.collect.Lists;
import org.useless.dragonfly.animation.Animation;
import org.useless.dragonfly.animation.AnimationData;
import org.useless.dragonfly.animation.KeyFrameData;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class MojangAnimationDeserializer implements JsonDeserializer<Animation> {

@Override
public Animation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<AnimationData> animations = new ArrayList<>();
float length = 0;
boolean loop = false;
if (json.isJsonObject()) {
JsonObject obj = (JsonObject) json;
if (obj.has("animations")) {
for (JsonElement entry : obj.getAsJsonArray("animations")) {
animations.add(makeAnimation((JsonObject) entry));
}
}
if (obj.has("length")) {
length = obj.getAsJsonPrimitive("length").getAsFloat();
}
if (obj.has("loop")) {
loop = obj.getAsJsonPrimitive("loop").getAsBoolean();
}
return new Animation(animations, length, loop);
}
return new Animation(animations, 0, true);
}


private AnimationData makeAnimation(JsonObject object) {
String bone = object.has("bone") ? object.getAsJsonPrimitive("bone").getAsString() : "";

String target = object.has("target") ? object.getAsJsonPrimitive("target").getAsString() : "linear";
List<KeyFrameData> boneMap = object.has("keyframes") ? makeKeyFrames(object.getAsJsonArray("keyframes")) : new ArrayList<>();

return new AnimationData(bone, target, boneMap);
}

private List<KeyFrameData> makeKeyFrames(JsonArray object) {
List<KeyFrameData> keyFrames = new ArrayList<>();
for (JsonElement entry : object.asList()) {
keyFrames.add(makePost(entry.getAsJsonObject()));
}
return keyFrames;
}


private KeyFrameData makePost(JsonElement element) {
List<Float> list = Lists.newArrayList();

if (element instanceof JsonObject) {
JsonObject jsonObject = (JsonObject) element;
list.add(0, jsonObject.getAsJsonArray("target").get(0).getAsFloat());
list.add(1, jsonObject.getAsJsonArray("target").get(1).getAsFloat());
list.add(2, jsonObject.getAsJsonArray("target").get(2).getAsFloat());

float timestamp = jsonObject.has("timestamp") ? jsonObject.getAsJsonPrimitive("timestamp").getAsFloat() : 0;
String interpolation = jsonObject.has("interpolation") ? jsonObject.getAsJsonPrimitive("interpolation").getAsString() : "linear";


return new KeyFrameData(list, timestamp, interpolation);
}
return null;
}
}
24 changes: 24 additions & 0 deletions src/main/java/org/useless/dragonfly/renderer/MobRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,21 @@
import net.minecraft.core.util.phys.AABB;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.slf4j.Logger;
import org.useless.dragonfly.animation.Animation;
import org.useless.dragonfly.models.entity.StaticEntityModel;
import org.useless.dragonfly.models.entity.mojang.StaticEntityModelMojang;
import org.useless.util.AnimationHelper;
import org.useless.util.AnimationState;

import java.util.ArrayList;
import java.util.List;

public abstract class MobRenderer<T extends Mob> extends EntityRenderer<T> {
public Vector3f VEC_ANIMATION = new Vector3f();
public static final float ENTITY_RENDER_SCALE = 16f;
private static final Logger LOGGER = LogUtils.getLogger();
private final @NotNull List<@Nullable StaticEntityModel> setupModels = new ArrayList<>();
Expand Down Expand Up @@ -230,4 +236,22 @@ public void loadEntityTexture(final @NotNull T entity)
// return this.entityModel.visibleBounds().cloneMove(entity.x, entity.y, entity.z);
return super.entityViewBox(entity);
}

/*
* Animation Util
*/
protected void animateWalk(StaticEntityModelMojang staticEntityModelMojang, Animation animationData, float p_268057_, float p_268347_, float p_268138_, float p_268165_) {
long time = (long) (p_268057_ * 50.0F * p_268138_);
float scale = Math.min(p_268347_ * p_268165_, 1.0F);
AnimationHelper.animate(staticEntityModelMojang, animationData, time, scale, VEC_ANIMATION);
}

protected void applyStatic(StaticEntityModelMojang staticEntityModelMojang, Animation animationData) {
AnimationHelper.animate(staticEntityModelMojang, animationData, 0L, 1.0F, VEC_ANIMATION);
}

protected void animate(StaticEntityModelMojang staticEntityModelMojang, AnimationState animationState, Animation animationData, float p_233388_, float p_233389_) {
animationState.updateTime(p_233388_, p_233389_);
animationState.ifStarted(p_233392_ -> AnimationHelper.animate(staticEntityModelMojang, animationData, p_233392_.getAccumulatedTime(), 1.0F, VEC_ANIMATION));
}
}
27 changes: 27 additions & 0 deletions src/main/java/org/useless/test_entity/MobRendererTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.useless.test_entity;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.useless.DragonFly;
import org.useless.dragonfly.models.entity.StaticEntityModel;
import org.useless.dragonfly.models.entity.mojang.StaticEntityModelMojang;
import org.useless.dragonfly.renderer.MobRenderer;

public class MobRendererTest extends MobRenderer<TestMob> {
public MobRendererTest() {
super(0.5F);
}


@Override
protected @Nullable StaticEntityModel getAndSetupModelForLayer(@NotNull TestMob entity, float brightness, float partialTick, int layer) {
StaticEntityModel staticEntityModel = DragonFly.loadEntityModel("geometry.dragonfly.test", 0);
if (staticEntityModel instanceof StaticEntityModelMojang) {
staticEntityModel.resetBones();


//animateWalk((StaticEntityModelMojang)staticEntityModel, DragonFlyClient.animation, getLimbSwing(entity, partialTick), getLimbYaw(entity, partialTick), 2.0F, 2.5F);
}
return staticEntityModel;
}
}
17 changes: 17 additions & 0 deletions src/main/java/org/useless/test_entity/ModEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.useless.test_entity;

import net.minecraft.core.util.collection.NamespaceID;
import turniplabs.halplibe.helper.EntityHelper;

import static org.useless.DragonFly.MOD_ID;

public class ModEntity {

public String entityKey(String string) {
return MOD_ID + ".entity." + string;
}

public void initializeEntities() {
EntityHelper.createEntity(TestMob.class, NamespaceID.getPermanent(MOD_ID, "test"), entityKey("test"));
}
}
11 changes: 11 additions & 0 deletions src/main/java/org/useless/test_entity/TestMob.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.useless.test_entity;

import net.minecraft.core.entity.monster.MobMonster;
import net.minecraft.core.world.World;
import org.jetbrains.annotations.Nullable;

public class TestMob extends MobMonster {
public TestMob(@Nullable World world) {
super(world);
}
}
Loading
Loading