Almost finished with ModelSpec files. This does not build just yet because ModelSpec Readers and Writers need finishing.

This commit is contained in:
Leon 2016-11-08 23:13:50 -05:00
parent f5d3ac5219
commit f1ad3f02d8
16 changed files with 1076 additions and 643 deletions

View file

@ -51,9 +51,6 @@ public class RenderPart extends ModelRenderer {
MuseTextureUtils.bindTexture(part.get().getTexture(nbt));
applyTransform();
int ix = part.get().getColourIndex(nbt);
if (ix < colours.length && ix >= 0) {
Colour.doGLByInt(colours[ix]);

View file

@ -1,72 +0,0 @@
package net.machinemuse.powersuits.client.render.modelspec;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.model.ModelRenderer;
/**
* Ported to Java by lehjr on 11/5/16.
*/
//public class ArmorMorphTarget {
// public interface MorphTarget {
// String name = null;
// float degrad = (float) (180F / Math.PI);
//
// ModelRenderer apply(ModelBiped m);
// }
//
// public static class Cloak implements MorphTarget {
// String name = "Cloak";
//
// public ModelRenderer apply(ModelBiped m) {
// return m.bipedCloak;
// }
// }
//
// public static class Head implements MorphTarget {
// String name = "Head";
//
// public ModelRenderer apply(ModelBiped m) {
// return m.bipedHead;
// }
// }
//
// public static class Body implements MorphTarget {
// String name = "Body";
//
// public ModelRenderer apply(ModelBiped m) {
// return m.bipedBody;
// }
// }
//
// public static class RightArm implements MorphTarget {
// String name = "RightArm";
//
// public ModelRenderer apply(ModelBiped m) {
// return m.bipedRightArm;
// }
// }
//
// public static class LeftArm implements MorphTarget {
// String name = "LeftArm";
//
// public ModelRenderer apply(ModelBiped m) {
// return m.bipedLeftArm;
// }
// }
//
// public static class RightLeg implements MorphTarget {
// String name = "RightLeg";
//
// public ModelRenderer apply(ModelBiped m) {
// return m.bipedRightLeg;
// }
// }
//
// public static class LeftLeg implements MorphTarget {
// String name = "LeftLeg";
//
// public ModelRenderer apply(ModelBiped m) {
// return m.bipedLeftLeg;
// }
// }
//}

View file

@ -1,57 +1,57 @@
package net.machinemuse.powersuits.client.render.modelspec
import net.minecraft.client.model.{ModelBiped, ModelRenderer}
/**
* Author: MachineMuse (Claire Semple)
* Created: 2:09 AM, 29/04/13
*/
sealed trait MorphTarget {
val name: String
val degrad = 180F / Math.PI.asInstanceOf[Float]
def apply(m: ModelBiped): ModelRenderer
}
case object Cloak extends MorphTarget {
val name = "Cloak"
def apply(m: ModelBiped) = m.bipedCloak
}
case object Head extends MorphTarget {
val name = "Head"
def apply(m: ModelBiped) = m.bipedHead
}
case object Body extends MorphTarget {
val name = "Body"
def apply(m: ModelBiped) = m.bipedBody
}
case object RightArm extends MorphTarget {
val name = "RightArm"
def apply(m: ModelBiped) = m.bipedRightArm
}
case object LeftArm extends MorphTarget {
val name = "LeftArm"
def apply(m: ModelBiped) = m.bipedLeftArm
}
case object RightLeg extends MorphTarget {
val name = "RightLeg"
def apply(m: ModelBiped) = m.bipedRightLeg
}
case object LeftLeg extends MorphTarget {
val name = "LeftLeg"
def apply(m: ModelBiped) = m.bipedLeftLeg
}
//package net.machinemuse.powersuits.client.render.modelspec
//
//import net.minecraft.client.model.{ModelBiped, ModelRenderer}
//
///**
// * Author: MachineMuse (Claire Semple)
// * Created: 2:09 AM, 29/04/13
// */
//
//sealed trait MorphTarget {
// val name: String
// val degrad = 180F / Math.PI.asInstanceOf[Float]
//
// def apply(m: ModelBiped): ModelRenderer
//}
//
//case object Cloak extends MorphTarget {
// val name = "Cloak"
//
// def apply(m: ModelBiped) = m.bipedCloak
//}
//
//case object Head extends MorphTarget {
// val name = "Head"
//
// def apply(m: ModelBiped) = m.bipedHead
//}
//
//case object Body extends MorphTarget {
// val name = "Body"
//
// def apply(m: ModelBiped) = m.bipedBody
//}
//
//case object RightArm extends MorphTarget {
// val name = "RightArm"
//
// def apply(m: ModelBiped) = m.bipedRightArm
//}
//
//case object LeftArm extends MorphTarget {
// val name = "LeftArm"
//
// def apply(m: ModelBiped) = m.bipedLeftArm
//}
//
//case object RightLeg extends MorphTarget {
// val name = "RightLeg"
//
// def apply(m: ModelBiped) = m.bipedRightLeg
//}
//
//case object LeftLeg extends MorphTarget {
// val name = "LeftLeg"
//
// def apply(m: ModelBiped) = m.bipedLeftLeg
//}

View file

@ -0,0 +1,125 @@
package net.machinemuse.powersuits.client.render.modelspec;
import net.machinemuse.numina.geometry.Colour;
import net.machinemuse.powersuits.item.ItemPowerArmor;
import net.machinemuse.utils.MuseStringUtils;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.obj.WavefrontObject;
import java.util.ArrayList;
import java.util.List;
import static net.machinemuse.powersuits.client.render.modelspec.MorphTarget.*;
/**
* Author: MachineMuse (Claire Semple)
* Created: 9:11 AM, 29/04/13
*
* Ported to Java by lehjr on 11/8/16.
*/
public class DefaultModelSpec {
public static Colour normalcolour = Colour.WHITE;
public static Colour glowcolour = new Colour(17.0 / 255, 78.0 / 255, 1, 1);
public static String tex = "/assets/powersuits/textures/models/diffuse.png";
public static ModelSpec[] loadDefaultModel() {
List<ModelSpec> defaultSpecList = new ArrayList<>();
/* Head ----------------------- */
ModelSpec headModel = loadModel(new ResourceLocation("powersuits:models/mps_helm.obj"), tex.split(";"));
makeEntries(Head, 0, 0, false, "helm_main;helm_tube_entry1;helm_tubes;helm_tube_entry2".split(";"), headModel);
makeEntries(Head, 0, 1, true, "visor".split(";"), headModel);
defaultSpecList.add(headModel);
/* Arms ----------------------- */
ModelSpec armsModel = loadModel(new ResourceLocation("powersuits:models/mps_arms.obj"), tex.split(";"));
makeEntries(RightArm, 1, 0, false, "arms3".split(";"),armsModel);
makeEntries(RightArm, 1, 1, true, "crystal_shoulder_2".split(";"), armsModel);
makeEntries(LeftArm, 1, 0, false, "arms2".split(";"), armsModel);
makeEntries(LeftArm, 1, 1, true, "crystal_shoulder_1".split(";"), armsModel);
defaultSpecList.add(armsModel);
/* Body ----------------------- */
ModelSpec bodyModel = loadModel(new ResourceLocation("powersuits:models/mps_chest.obj"), tex.split(";"));
makeEntries(Body, 1, 0, false, "belt;chest_main;polySurface36;backpack;chest_padding".split(";"), bodyModel);
makeEntries(Body, 1, 1, true, "crystal_belt".split(";"), bodyModel);
defaultSpecList.add(bodyModel);
/* Legs ----------------------- */
ModelSpec legsModel = loadModel(new ResourceLocation("powersuits:models/mps_pantaloons.obj"), tex.split(";"));
makeEntries(RightLeg, 2, 0, false, "leg1".split(";"), legsModel);
makeEntries(LeftLeg, 2, 0, false, "leg2".split(";"), legsModel);
defaultSpecList.add(legsModel);
/* Feet ----------------------- */
ModelSpec feetModel = loadModel(new ResourceLocation("powersuits:models/mps_boots.obj"), tex.split(";"));
makeEntries(RightLeg, 3, 0, false, "boots1".split(";"), feetModel);
makeEntries(LeftLeg, 3, 0, false, "boots2".split(";"), feetModel);
defaultSpecList.add(feetModel);
return (ModelSpec[]) defaultSpecList.toArray();
}
public static ModelSpec loadModel(ResourceLocation file, String[] textures) {
WavefrontObject model = ModelRegistry.getInstance().loadModel(file);
if (model != null) {
return (ModelRegistry.getInstance().put(MuseStringUtils.extractName(file), new ModelSpec(model, textures, null, null, file.toString())));
}
return null;
}
public static void makeEntries(MorphTarget target, int slot, int colourIndex, Boolean glow, String[] names, ModelSpec model) {
for (String name: names)
model.put(name, new ModelPartSpec(model, target, name, slot, colourIndex, glow, name));
}
public static NBTTagCompound makeModelPrefs(ItemStack stack, int slot) {
ItemPowerArmor item = (ItemPowerArmor) stack.getItem();
Colour normalcolour = item.getColorFromItemStack(stack);
Colour glowcolour = item.getGlowFromItemStack(stack);
List<NBTTagCompound> list = new ArrayList<>();
switch (slot) {
case 0:
list.addAll(makePrefs("mps_helm", "helm_main;helm_tube_entry1;helm_tubes;helm_tube_entry2".split(";"), 0, false));
list.addAll(makePrefs("mps_helm", "visor".split(";"), 1, true));
break;
case 1:
list.addAll(makePrefs("mps_arms", "arms2;arms3".split(";"), 0, false));
list.addAll(makePrefs("mps_arms", "crystal_shoulder_2;crystal_shoulder_1".split(";"), 1, true));
list.addAll(makePrefs("mps_chest", "belt;chest_main;polySurface36;backpack;chest_padding".split(";"), 0, false));
list.addAll(makePrefs("mps_chest", "crystal_belt".split(";"), 1, true));
break;
case 2:
list.addAll(makePrefs("mps_pantaloons", "leg1;leg2".split(";"), 0, false));
break;
case 3:
list.addAll(makePrefs("mps_boots", "boots1;boots2".split(";"), 0, false));
break;
}
NBTTagCompound nbt = new NBTTagCompound();
for (NBTTagCompound elem: list) {
nbt.setTag(elem.getString("model") + "." + elem.getString("part"), elem);
}
return nbt;
}
public static List<NBTTagCompound> makePrefs(String modelname, String[] partnames, int colour, boolean glow) {
List<NBTTagCompound> prefArray = new ArrayList<>();
ModelSpec model = ModelRegistry.getInstance().get(modelname);
for (String name: partnames)
prefArray.add(makePref(model.get(name), colour, glow));
return prefArray;
}
public static NBTTagCompound makePref(ModelPartSpec partSpec, Integer colourindex, Boolean glow) {
return partSpec.multiSet(new NBTTagCompound(), null, glow, colourindex);
}
}

View file

@ -1,101 +1,101 @@
package net.machinemuse.powersuits.client.render.modelspec
import net.machinemuse.numina.general.MuseLogger
import net.machinemuse.numina.geometry.Colour
import net.machinemuse.powersuits.item.ItemPowerArmor
import net.machinemuse.utils.MuseStringUtils
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.ResourceLocation
/**
* Author: MachineMuse (Claire Semple)
* Created: 9:11 AM, 29/04/13
*/
object DefaultModelSpec {
val normalcolour: Colour = Colour.WHITE
val glowcolour: Colour = new Colour(17.0 / 255, 78.0 / 255, 1, 1)
val tex = "/assets/powersuits/textures/models/diffuse.png"
def loadDefaultModel: Option[ModelSpec] = {
loadModel(new ResourceLocation("powersuits:models/mps_helm.obj"), tex.split(";")).map(model => {
makeEntries(Head, 0, 0, false, "helm_main;helm_tube_entry1;helm_tubes;helm_tube_entry2".split(";"), model)
makeEntries(Head, 0, 1, true, "visor".split(";"), model)
model
})
loadModel(new ResourceLocation("powersuits:models/mps_arms.obj"), tex.split(";")).map(model => {
makeEntries(RightArm, 1, 0, false, "arms3".split(";"), model)
makeEntries(RightArm, 1, 1, true, "crystal_shoulder_2".split(";"), model)
makeEntries(LeftArm, 1, 0, false, "arms2".split(";"), model)
makeEntries(LeftArm, 1, 1, true, "crystal_shoulder_1".split(";"), model)
model
})
loadModel(new ResourceLocation("powersuits:models/mps_chest.obj"), tex.split(";")).map(model => {
makeEntries(Body, 1, 0, false, "belt;chest_main;polySurface36;backpack;chest_padding".split(";"), model)
makeEntries(Body, 1, 1, true, "crystal_belt".split(";"), model)
model
})
loadModel(new ResourceLocation("powersuits:models/mps_pantaloons.obj"), tex.split(";")).map(model => {
makeEntries(RightLeg, 2, 0, false, "leg1".split(";"), model)
makeEntries(LeftLeg, 2, 0, false, "leg2".split(";"), model)
model
})
loadModel(new ResourceLocation("powersuits:models/mps_boots.obj"), tex.split(";")).map(model => {
makeEntries(RightLeg, 3, 0, false, "boots1".split(";"), model)
makeEntries(LeftLeg, 3, 0, false, "boots2".split(";"), model)
model
})
}
def loadModel(file: ResourceLocation, textures: Array[String]): Option[ModelSpec] = {
ModelRegistry.loadModel(file) match {
case Some(m) => Some(ModelRegistry.put(MuseStringUtils.extractName(file), new ModelSpec(m, textures, None, None, file.toString)))
case None => MuseLogger.logError("Model file " + file + " not found! D:")
None
}
}
def makeEntries(target: MorphTarget, slot: Int, colourIndex: Int, glow: Boolean, names: Array[String], model: ModelSpec) {
for (name <- names) {
model.put(name, new ModelPartSpec(model, target, name, slot, colourIndex, glow, name))
}
}
def makeModelPrefs(stack: ItemStack, slot: Int): NBTTagCompound = {
val item = stack.getItem.asInstanceOf[ItemPowerArmor]
val normalcolour = item.getColorFromItemStack(stack)
val glowcolour = item.getGlowFromItemStack(stack)
val list = slot match {
case 0 => {
makePrefs("mps_helm", "helm_main;helm_tube_entry1;helm_tubes;helm_tube_entry2".split(";"), 0, false) ++
makePrefs("mps_helm", "visor".split(";"), 1, true)
}
case 1 => {
makePrefs("mps_arms", "arms2;arms3".split(";"), 0, false) ++
makePrefs("mps_arms", "crystal_shoulder_2;crystal_shoulder_1".split(";"), 1, true) ++
makePrefs("mps_chest", "belt;chest_main;polySurface36;backpack;chest_padding".split(";"), 0, false) ++
makePrefs("mps_chest", "crystal_belt".split(";"), 1, true)
}
case 2 => {
makePrefs("mps_pantaloons", "leg1;leg2".split(";"), 0, false)
}
case 3 => {
makePrefs("mps_boots", "boots1;boots2".split(";"), 0, false)
}
}
(new NBTTagCompound() /: list) {
case (taglist, elem) => taglist.setTag(elem.getString("model") + "." + elem.getString("part"), elem); taglist
}
}
def makePrefs(modelname: String, partnames: Array[String], colour: Int, glow: Boolean): Array[NBTTagCompound] = {
ModelRegistry.get(modelname).map(model =>
for (name <- partnames) yield makePref(model.get(name).get, Some(colour), Some(glow))
) getOrElse Array.empty[NBTTagCompound]
}
def makePref(partSpec: ModelPartSpec, colourindex: Option[Int], glow: Option[Boolean]): NBTTagCompound = {
partSpec.multiSet(new NBTTagCompound(), None, glow, colourindex)
}
}
//package net.machinemuse.powersuits.client.render.modelspec
//
//import net.machinemuse.numina.general.MuseLogger
//import net.machinemuse.numina.geometry.Colour
//import net.machinemuse.powersuits.item.ItemPowerArmor
//import net.machinemuse.utils.MuseStringUtils
//import net.minecraft.item.ItemStack
//import net.minecraft.nbt.NBTTagCompound
//import net.minecraft.util.ResourceLocation
//
///**
// * Author: MachineMuse (Claire Semple)
// * Created: 9:11 AM, 29/04/13
// */
//object DefaultModelSpec {
// val normalcolour: Colour = Colour.WHITE
// val glowcolour: Colour = new Colour(17.0 / 255, 78.0 / 255, 1, 1)
// val tex = "/assets/powersuits/textures/models/diffuse.png"
//
// def loadDefaultModel: Option[ModelSpec] = {
// loadModel(new ResourceLocation("powersuits:models/mps_helm.obj"), tex.split(";")).map(model => {
// makeEntries(Head, 0, 0, false, "helm_main;helm_tube_entry1;helm_tubes;helm_tube_entry2".split(";"), model)
// makeEntries(Head, 0, 1, true, "visor".split(";"), model)
// model
// })
// loadModel(new ResourceLocation("powersuits:models/mps_arms.obj"), tex.split(";")).map(model => {
// makeEntries(RightArm, 1, 0, false, "arms3".split(";"), model)
// makeEntries(RightArm, 1, 1, true, "crystal_shoulder_2".split(";"), model)
// makeEntries(LeftArm, 1, 0, false, "arms2".split(";"), model)
// makeEntries(LeftArm, 1, 1, true, "crystal_shoulder_1".split(";"), model)
// model
// })
// loadModel(new ResourceLocation("powersuits:models/mps_chest.obj"), tex.split(";")).map(model => {
// makeEntries(Body, 1, 0, false, "belt;chest_main;polySurface36;backpack;chest_padding".split(";"), model)
// makeEntries(Body, 1, 1, true, "crystal_belt".split(";"), model)
// model
// })
// loadModel(new ResourceLocation("powersuits:models/mps_pantaloons.obj"), tex.split(";")).map(model => {
// makeEntries(RightLeg, 2, 0, false, "leg1".split(";"), model)
// makeEntries(LeftLeg, 2, 0, false, "leg2".split(";"), model)
// model
// })
// loadModel(new ResourceLocation("powersuits:models/mps_boots.obj"), tex.split(";")).map(model => {
// makeEntries(RightLeg, 3, 0, false, "boots1".split(";"), model)
// makeEntries(LeftLeg, 3, 0, false, "boots2".split(";"), model)
// model
// })
// }
//
// def loadModel(file: ResourceLocation, textures: Array[String]): Option[ModelSpec] = {
// ModelRegistry.loadModel(file) match {
// case Some(m) => Some(ModelRegistry.put(MuseStringUtils.extractName(file), new ModelSpec(m, textures, None, None, file.toString)))
// case None => MuseLogger.logError("Model file " + file + " not found! D:")
// None
// }
// }
//
// def makeEntries(target: MorphTarget, slot: Int, colourIndex: Int, glow: Boolean, names: Array[String], model: ModelSpec) {
// for (name <- names) {
// model.put(name, new ModelPartSpec(model, target, name, slot, colourIndex, glow, name))
// }
// }
//
// def makeModelPrefs(stack: ItemStack, slot: Int): NBTTagCompound = {
// val item = stack.getItem.asInstanceOf[ItemPowerArmor]
// val normalcolour = item.getColorFromItemStack(stack)
// val glowcolour = item.getGlowFromItemStack(stack)
// val list = slot match {
// case 0 => {
// makePrefs("mps_helm", "helm_main;helm_tube_entry1;helm_tubes;helm_tube_entry2".split(";"), 0, false) ++
// makePrefs("mps_helm", "visor".split(";"), 1, true)
// }
// case 1 => {
// makePrefs("mps_arms", "arms2;arms3".split(";"), 0, false) ++
// makePrefs("mps_arms", "crystal_shoulder_2;crystal_shoulder_1".split(";"), 1, true) ++
// makePrefs("mps_chest", "belt;chest_main;polySurface36;backpack;chest_padding".split(";"), 0, false) ++
// makePrefs("mps_chest", "crystal_belt".split(";"), 1, true)
// }
// case 2 => {
// makePrefs("mps_pantaloons", "leg1;leg2".split(";"), 0, false)
// }
// case 3 => {
// makePrefs("mps_boots", "boots1;boots2".split(";"), 0, false)
// }
//
// }
// (new NBTTagCompound() /: list) {
// case (taglist, elem) => taglist.setTag(elem.getString("model") + "." + elem.getString("part"), elem); taglist
// }
// }
//
// def makePrefs(modelname: String, partnames: Array[String], colour: Int, glow: Boolean): Array[NBTTagCompound] = {
// ModelRegistry.get(modelname).map(model =>
// for (name <- partnames) yield makePref(model.get(name).get, Some(colour), Some(glow))
// ) getOrElse Array.empty[NBTTagCompound]
// }
//
// def makePref(partSpec: ModelPartSpec, colourindex: Option[Int], glow: Option[Boolean]): NBTTagCompound = {
// partSpec.multiSet(new NBTTagCompound(), None, glow, colourindex)
// }
//}

View file

@ -0,0 +1,91 @@
package net.machinemuse.powersuits.client.render.modelspec;
import net.minecraft.nbt.NBTTagCompound;
/**
* Ported to Java by lehjr on 11/8/16.
*/
public class ModelPartSpec
{
public ModelSpec modelSpec;
private MorphTarget morph;
public String partName;
private int slot;
private int defaultcolourindex;
private boolean defaultglow;
private String displayName;
public ModelPartSpec(ModelSpec modelSpec, MorphTarget morph, String partName, int slot, Integer defaultcolourindex, Boolean defaultglow, String displayName) {
this.modelSpec = modelSpec;
this.morph = morph;
this.partName = partName;
this.slot = slot;
this.defaultcolourindex = (defaultcolourindex != null) ? defaultcolourindex : 0;
this.defaultglow = (defaultglow != null) ? defaultglow : false;
this.displayName = displayName;
}
public String getTexture(NBTTagCompound nbt) {
return (nbt.hasKey("texture") ? nbt.getString("texture") : modelSpec.textures[0]);
}
public void setTexture(NBTTagCompound nbt, String s) {
if (s.equals("") || s.equalsIgnoreCase(modelSpec.textures[0])) {
nbt.removeTag("texture");
}
else {
nbt.setString("texture", s);
}
}
public int getColourIndex(NBTTagCompound nbt) {
return nbt.hasKey("colourindex") ? nbt.getInteger("colourindex") : this.defaultcolourindex;
}
public void setColourIndex(NBTTagCompound nbt, int c) {
if (c == this.defaultcolourindex) {
nbt.removeTag("colourindex");
}
else {
nbt.setInteger("colourindex", c);
}
}
public boolean getGlow(NBTTagCompound nbt) {
return nbt.hasKey("glow") ? nbt.getBoolean("glow") : this.defaultglow;
}
public void setGlow(NBTTagCompound nbt, boolean g) {
if (g == this.defaultglow) {
nbt.removeTag("glow");
}
else {
nbt.setBoolean("glow", g);
}
}
public void setModel(NBTTagCompound nbt, ModelSpec model) {
String modelString = ModelRegistry.getInstance().inverse().get(model);
setModel(nbt, ((modelString != null) ? modelString : ""));
}
public void setModel(NBTTagCompound nbt, String modelname) {
nbt.setString("model", modelname);
}
public void setPart(NBTTagCompound nbt) {
nbt.setString("part", this.partName);
}
public void setPartAndModel(NBTTagCompound nbt) {
}
public NBTTagCompound multiSet(NBTTagCompound nbt, String tex, Boolean glow, Integer c) {
this.setPart(nbt);
this.setModel(nbt, this.modelSpec);
this.setTexture(nbt, (tex != null) ? tex : "");
this.setGlow(nbt, (glow != null) ? glow : false);
this.setColourIndex(nbt, (c != null) ? c : defaultcolourindex);
return nbt;
}
}

View file

@ -0,0 +1,64 @@
//package net.machinemuse.powersuits.client.render.modelspec
//
//import net.minecraft.nbt.NBTTagCompound
//
///**
// * Ported to Java by lehjr on 11/8/16.
// */
//class ModelPartSpec(val modelSpec: ModelSpec,
// val morph: MorphTarget,
// val partName: String,
// val slot: Int,
// val defaultcolourindex: Int = 0,
// val defaultglow: Boolean = false,
// val displayName: String) {
//
// def getTexture(nbt: NBTTagCompound): String = {
// if (nbt hasKey "texture") nbt getString "texture" else modelSpec.textures.head
// }
//
// def setTexture(nbt: NBTTagCompound, s: String) {
// if (s.equals("") || s.equalsIgnoreCase(modelSpec.textures.head)) nbt removeTag "texture" else nbt setString("texture", s)
// }
//
// def getColourIndex(nbt: NBTTagCompound): Int = {
// if (nbt hasKey "colourindex") nbt getInteger "colourindex" else defaultcolourindex
// }
//
// def setColourIndex(nbt: NBTTagCompound, c: Int) {
// if (c == defaultcolourindex) nbt removeTag "colourindex" else nbt setInteger("colourindex", c)
// }
//
// def getGlow(nbt: NBTTagCompound): Boolean = {
// if (nbt hasKey "glow") nbt getBoolean "glow" else defaultglow
// }
//
// def setGlow(nbt: NBTTagCompound, g: Boolean) {
// if (g == defaultglow) nbt removeTag "glow" else nbt setBoolean("glow", g)
// }
//
// def setModel(nbt: NBTTagCompound, model: ModelSpec) {
// setModel(nbt, ModelRegistry.inverse.getOrElse(model, ""))
// }
//
// def setModel(nbt: NBTTagCompound, modelname: String) {
// nbt setString("model", modelname)
// }
//
// def setPart(nbt: NBTTagCompound) {
// nbt setString("part", partName)
// }
//
// def setPartAndModel(nbt: NBTTagCompound) {
// }
//
// def multiSet(nbt: NBTTagCompound, tex: Option[String], glow: Option[Boolean], c: Option[Int]): NBTTagCompound = {
// setPart(nbt)
// setModel(nbt, this.modelSpec)
// setTexture(nbt, tex.getOrElse(""))
// setGlow(nbt, glow.getOrElse(false))
// setColourIndex(nbt, c.getOrElse(defaultcolourindex))
// nbt
// }
//
//}

View file

@ -0,0 +1,71 @@
package net.machinemuse.powersuits.client.render.modelspec;
import net.machinemuse.numina.general.MuseLogger;
import net.machinemuse.numina.scala.MuseRegistry;
import net.machinemuse.utils.MuseStringUtils;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;
import net.minecraftforge.client.model.obj.WavefrontObject;
/**
* Author: MachineMuse (Claire Semple)
* Created: 7:44 AM, 4/28/13
*
* Ported to Java by lehjr on 11/8/16.
*
* Note: make sure to have null checks in place.
*/
public class ModelRegistry extends MuseRegistry<ModelSpec> {
private ModelRegistry(){
}
private static ModelRegistry INSTANCE;
public static ModelRegistry getInstance() {
if (INSTANCE == null)
INSTANCE = new ModelRegistry();
return INSTANCE;
}
public WavefrontObject loadModel(ResourceLocation resource) {
String name = MuseStringUtils.extractName(resource);
ModelSpec spec = get(name);
if (spec == null)
return wrap(resource);
return spec.model;
}
public WavefrontObject wrap(ResourceLocation resource) {
MuseLogger.logDebug("Loading " + resource + " as " + MuseStringUtils.extractName(resource));
IModelCustom model = AdvancedModelLoader.loadModel(resource);
if (model instanceof WavefrontObject)
return (WavefrontObject) model;
MuseLogger.logError("Model loading failed :( " + resource);
return null;
}
public ModelSpec getModel(NBTTagCompound nbt) {
return get(nbt.getString("model"));
}
public ModelPartSpec getPart(NBTTagCompound nbt, ModelSpec model) {
return model.get(nbt.getString("part"));
}
public ModelPartSpec getPart(NBTTagCompound nbt) {
return getPart(nbt, getModel(nbt));
//getModel(nbt).flatMap(m => m.get(nbt getString "part"))
// FIXME: not sure if this is right
}
public NBTTagCompound getSpecTag(NBTTagCompound museRenderTag, ModelPartSpec spec) {
String name = makeName(spec);
return (museRenderTag.hasKey(name)) ? (museRenderTag.getCompoundTag(name)) : null;
}
public String makeName(ModelPartSpec spec) {
return spec.modelSpec.getOwnName() + "." + spec.partName;
}
}

View file

@ -1,124 +1,124 @@
package net.machinemuse.powersuits.client.render.modelspec
import net.machinemuse.numina.general.MuseLogger
import net.machinemuse.numina.scala.MuseRegistry
import net.machinemuse.utils.MuseStringUtils
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.{ResourceLocation, Vec3}
import net.minecraftforge.client.model.AdvancedModelLoader
import net.minecraftforge.client.model.obj.WavefrontObject
/**
* Author: MachineMuse (Claire Semple)
* Created: 7:44 AM, 4/28/13
*/
object ModelRegistry extends MuseRegistry[ModelSpec] {
def loadModel(resource: ResourceLocation): Option[WavefrontObject] = {
val name = MuseStringUtils.extractName(resource)
get(name) match {
case Some(i) => Some(i.model)
case None => wrap(resource)
}
}
def wrap(resource: ResourceLocation): Option[WavefrontObject] = {
MuseLogger.logDebug("Loading " + resource + " as " + MuseStringUtils.extractName(resource))
AdvancedModelLoader.loadModel(resource) match {
case m: WavefrontObject => Some(m)
case _ => MuseLogger.logError("Model loading failed :( " + resource)
None
}
}
def getModel(nbt: NBTTagCompound): Option[ModelSpec] = {
get(nbt.getString("model"))
}
def getPart(nbt: NBTTagCompound, model: ModelSpec) = {
model.get(nbt getString "part")
}
def getPart(nbt: NBTTagCompound): Option[ModelPartSpec] = {
getModel(nbt).flatMap(m => m.get(nbt getString "part"))
}
def getSpecTag(museRenderTag: NBTTagCompound, spec: ModelPartSpec): Option[NBTTagCompound] = {
val name = makeName(spec)
if (museRenderTag.hasKey(name)) Some(museRenderTag.getCompoundTag(name)) else None
}
def makeName(spec: ModelPartSpec) = spec.modelSpec.getOwnName + "." + spec.partName
}
class ModelSpec(val model: WavefrontObject,
val textures: Array[String],
val offset: Option[Vec3],
val rotation: Option[Vec3],
val filename: String
) extends MuseRegistry[ModelPartSpec] {
def applyOffsetAndRotation() = {
// TODO: Implement
}
def getOwnName = {
ModelRegistry.getName(this).getOrElse("")
}
}
class ModelPartSpec(val modelSpec: ModelSpec,
val morph: MorphTarget,
val partName: String,
val slot: Int,
val defaultcolourindex: Int = 0,
val defaultglow: Boolean = false,
val displayName: String) {
def getTexture(nbt: NBTTagCompound): String = {
if (nbt hasKey "texture") nbt getString "texture" else modelSpec.textures.head
}
def setTexture(nbt: NBTTagCompound, s: String) {
if (s.equals("") || s.equalsIgnoreCase(modelSpec.textures.head)) nbt removeTag "texture" else nbt setString("texture", s)
}
def getColourIndex(nbt: NBTTagCompound): Int = {
if (nbt hasKey "colourindex") nbt getInteger "colourindex" else defaultcolourindex
}
def setColourIndex(nbt: NBTTagCompound, c: Int) {
if (c == defaultcolourindex) nbt removeTag "colourindex" else nbt setInteger("colourindex", c)
}
def getGlow(nbt: NBTTagCompound): Boolean = {
if (nbt hasKey "glow") nbt getBoolean "glow" else defaultglow
}
def setGlow(nbt: NBTTagCompound, g: Boolean) {
if (g == defaultglow) nbt removeTag "glow" else nbt setBoolean("glow", g)
}
def setModel(nbt: NBTTagCompound, model: ModelSpec) {
setModel(nbt, ModelRegistry.inverse.getOrElse(model, ""))
}
def setModel(nbt: NBTTagCompound, modelname: String) {
nbt setString("model", modelname)
}
def setPart(nbt: NBTTagCompound) {
nbt setString("part", partName)
}
def setPartAndModel(nbt: NBTTagCompound) {
}
def multiSet(nbt: NBTTagCompound, tex: Option[String], glow: Option[Boolean], c: Option[Int]): NBTTagCompound = {
setPart(nbt)
setModel(nbt, this.modelSpec)
setTexture(nbt, tex.getOrElse(""))
setGlow(nbt, glow.getOrElse(false))
setColourIndex(nbt, c.getOrElse(defaultcolourindex))
nbt
}
}
//package net.machinemuse.powersuits.client.render.modelspec
//
//import net.machinemuse.numina.general.MuseLogger
//import net.machinemuse.numina.scala.MuseRegistry
//import net.machinemuse.utils.MuseStringUtils
//import net.minecraft.nbt.NBTTagCompound
//import net.minecraft.util.{ResourceLocation, Vec3}
//import net.minecraftforge.client.model.AdvancedModelLoader
//import net.minecraftforge.client.model.obj.WavefrontObject
//
///**
// * Author: MachineMuse (Claire Semple)
// * Created: 7:44 AM, 4/28/13
// */
////object ModelRegistry extends MuseRegistry[ModelSpec] {
//// def loadModel(resource: ResourceLocation): Option[WavefrontObject] = {
//// val name = MuseStringUtils.extractName(resource)
//// get(name) match {
//// case Some(i) => Some(i.model)
//// case None => wrap(resource)
//// }
//// }
////
//// def wrap(resource: ResourceLocation): Option[WavefrontObject] = {
//// MuseLogger.logDebug("Loading " + resource + " as " + MuseStringUtils.extractName(resource))
//// AdvancedModelLoader.loadModel(resource) match {
//// case m: WavefrontObject => Some(m)
//// case _ => MuseLogger.logError("Model loading failed :( " + resource)
//// None
//// }
//// }
////
//// def getModel(nbt: NBTTagCompound): Option[ModelSpec] = {
//// get(nbt.getString("model"))
//// }
////
//// def getPart(nbt: NBTTagCompound, model: ModelSpec) = {
//// model.get(nbt getString "part")
//// }
////
//// def getPart(nbt: NBTTagCompound): Option[ModelPartSpec] = {
//// getModel(nbt).flatMap(m => m.get(nbt getString "part"))
//// }
////
//// def getSpecTag(museRenderTag: NBTTagCompound, spec: ModelPartSpec): Option[NBTTagCompound] = {
//// val name = makeName(spec)
//// if (museRenderTag.hasKey(name)) Some(museRenderTag.getCompoundTag(name)) else None
//// }
////
//// def makeName(spec: ModelPartSpec) = spec.modelSpec.getOwnName + "." + spec.partName
////}
//
////class ModelSpec(val model: WavefrontObject,
//// val textures: Array[String],
//// val offset: Option[Vec3],
//// val rotation: Option[Vec3],
//// val filename: String
//// ) extends MuseRegistry[ModelPartSpec] {
//// def applyOffsetAndRotation() = {
//// // TODO: Implement
//// }
////
//// def getOwnName = {
//// ModelRegistry.getName(this).getOrElse("")
//// }
////}
//
//class ModelPartSpec(val modelSpec: ModelSpec,
// val morph: MorphTarget,
// val partName: String,
// val slot: Int,
// val defaultcolourindex: Int = 0,
// val defaultglow: Boolean = false,
// val displayName: String) {
//
// def getTexture(nbt: NBTTagCompound): String = {
// if (nbt hasKey "texture") nbt getString "texture" else modelSpec.textures.head
// }
//
// def setTexture(nbt: NBTTagCompound, s: String) {
// if (s.equals("") || s.equalsIgnoreCase(modelSpec.textures.head)) nbt removeTag "texture" else nbt setString("texture", s)
// }
//
// def getColourIndex(nbt: NBTTagCompound): Int = {
// if (nbt hasKey "colourindex") nbt getInteger "colourindex" else defaultcolourindex
// }
//
// def setColourIndex(nbt: NBTTagCompound, c: Int) {
// if (c == defaultcolourindex) nbt removeTag "colourindex" else nbt setInteger("colourindex", c)
// }
//
// def getGlow(nbt: NBTTagCompound): Boolean = {
// if (nbt hasKey "glow") nbt getBoolean "glow" else defaultglow
// }
//
// def setGlow(nbt: NBTTagCompound, g: Boolean) {
// if (g == defaultglow) nbt removeTag "glow" else nbt setBoolean("glow", g)
// }
//
// def setModel(nbt: NBTTagCompound, model: ModelSpec) {
// setModel(nbt, ModelRegistry.inverse.getOrElse(model, ""))
// }
//
// def setModel(nbt: NBTTagCompound, modelname: String) {
// nbt setString("model", modelname)
// }
//
// def setPart(nbt: NBTTagCompound) {
// nbt setString("part", partName)
// }
//
// def setPartAndModel(nbt: NBTTagCompound) {
// }
//
// def multiSet(nbt: NBTTagCompound, tex: Option[String], glow: Option[Boolean], c: Option[Int]): NBTTagCompound = {
// setPart(nbt)
// setModel(nbt, this.modelSpec)
// setTexture(nbt, tex.getOrElse(""))
// setGlow(nbt, glow.getOrElse(false))
// setColourIndex(nbt, c.getOrElse(defaultcolourindex))
// nbt
// }
//
//}

View file

@ -1,84 +1,36 @@
//package net.machinemuse.powersuits.client.render.modelspec;
//
//import net.machinemuse.numina.scala.MuseRegistry;
//import net.minecraft.util.Vec3;
//import net.minecraftforge.client.model.obj.WavefrontObject;
//
///**
// * Author: MachineMuse (Claire Semple)
// * Created: 7:44 AM, 4/28/13
// *
// * Ported to Java by lehjr on 10/23/16.
// */
//public class ModelSpec extends MuseRegistry<ModelPartSpec> {
// private final WavefrontObject model;
// private final String[] textures;
// private final Vec3 offset;
// private final Vec3 rotation;
// private final String filename;
//
// public ModelSpec(final WavefrontObject model, final String[] textures, final Vec3 offset, final Vec3 rotation, final String filename) {
// this.model = model;
// this.textures = textures;
// this.offset = offset;
// this.rotation = rotation;
// this.filename = filename;
// }
//
//
//
//
//
//
//// class ModelSpec(val model: WavefrontObject,
//// val textures: Array[String],
//// val offset: Option[Vec3],
//// val rotation: Option[Vec3],
//// val filename: String
//// ) extends MuseRegistry[ModelPartSpec] {
//// def applyOffsetAndRotation() = {
//// // TODO: Implement
//// }
////
//// def getOwnName = {
//// ModelRegistry.getName(this).getOrElse("")
//// }
//// }
//
//
//
//
//
// public WavefrontObject model() {
// return this.model;
// }
//
// public String[] textures() {
// return this.textures;
// }
//
// public Vec3 offset() {
// return this.offset;
// }
//
// public Vec3 rotation() {
// return this.rotation;
// }
//
// public String filename() {
// return this.filename;
// }
//
// public void applyOffsetAndRotation() {
// }
//
// public String getOwnName() {
// return (ModelRegistry.getName(this.) != null) ? ModelRegistry.getName(this) : ("");
//
//
// return (String)((MuseBiMap<Object, T>)ModelRegistry$.MODULE$).getName((T)this).getOrElse((Function0)new ModelSpec$$anonfun$getOwnName.ModelSpec$$anonfun$getOwnName$1(this));
// }
//
//
//}
//
package net.machinemuse.powersuits.client.render.modelspec;
import net.machinemuse.numina.scala.MuseRegistry;
import net.minecraft.util.Vec3;
import net.minecraftforge.client.model.obj.WavefrontObject;
/**
* Author: MachineMuse (Claire Semple)
* Created: 7:44 AM, 4/28/13
*
* Ported to Java by lehjr on 11/8/16.
*/
public class ModelSpec extends MuseRegistry<ModelPartSpec>
{
public WavefrontObject model;
public String[] textures;
public Vec3 offset;
public Vec3 rotation;
public String filename;
public ModelSpec(WavefrontObject model, String[] textures, Vec3 offset, Vec3 rotation, String filename) {
this.model = model;
this.textures = textures;
this.offset = offset;
this.rotation = rotation;
this.filename = filename;
}
public void applyOffsetAndRotation() {
}
public String getOwnName() {
String name = ModelRegistry.getInstance().getName(this);
return (name != null) ? name : "";
}
}

View file

@ -0,0 +1,24 @@
//package net.machinemuse.powersuits.client.render.modelspec
//
//import net.machinemuse.numina.scala.MuseRegistry
//import net.minecraft.util.Vec3
//import net.minecraftforge.client.model.obj.WavefrontObject
//
///**
// * Ported to Java by lehjr on 11/8/16.
// */
//class ModelSpec(val model: WavefrontObject,
// val textures: Array[String],
// val offset: Option[Vec3],
// val rotation: Option[Vec3],
// val filename: String
// ) extends MuseRegistry[ModelPartSpec] {
// def applyOffsetAndRotation() = {
// // TODO: Implement
// }
//
// def getOwnName = {
// ModelRegistry.getName(this).getOrElse("")
// }
//}
//

View file

@ -0,0 +1,21 @@
package net.machinemuse.powersuits.client.render.modelspec
import java.io.{File, FileOutputStream, PrintWriter}
import com.google.gson.Gson
/**
* Author: MachineMuse (Claire Semple)
* Created: 9:10 AM, 29/04/13
*/
object ModelSpecJSONWriter {
def writeRegistry(file: String) {
val gson = new Gson()
import scala.collection.JavaConverters._
val registry = ModelRegistry.apply.asJava
val jsonwrite = gson.toJson(registry)
val w = new PrintWriter(new FileOutputStream(new File(file)))
w.print(jsonwrite)
w.close()
}
}

View file

@ -0,0 +1,154 @@
package net.machinemuse.powersuits.client.render.modelspec;
import net.machinemuse.numina.geometry.Colour;
import net.minecraft.util.Vec3;
import net.minecraftforge.client.model.obj.GroupObject;
import scala.xml.NodeSeq;
import javax.annotation.Nullable;
import java.awt.*;
import java.util.Iterator;
import static net.machinemuse.powersuits.client.render.modelspec.MorphTarget.*;
/**
* Author: MachineMuse (Claire Semple)
* Created: 8:44 AM, 4/28/13
*
* Ported to Java by lehjr on 11/8/16.
*/
public class ModelSpecXMLReader {
//package net.machinemuse.powersuits.client.render.modelspec
//
//import java.awt.Color
//import java.net.URL
//
//import net.machinemuse.numina.general.MuseLogger
//import net.machinemuse.numina.geometry.Colour
//import net.machinemuse.utils.MuseStringUtils
//import net.minecraft.util.{ResourceLocation, Vec3}
//
//import scala.xml.{NodeSeq, XML}
//
//
//object ModelSpecXMLReader {
// def parseFile(file: URL) = {
// val xml = XML.load(file)
// (xml \\ "model") foreach {
// modelnode => parseModel(modelnode)
// }
// }
//
// def parseModel(modelnode: NodeSeq) = {
// val file = (modelnode \ "@file").text
// val textures = (modelnode \ "@textures").text.split(",")
// val offset = parseVector((modelnode \ "@offset").text)
// val rotation = parseVector((modelnode \ "@rotation").text)
//
// ModelRegistry.loadModel(new ResourceLocation(file)) match {
// case Some(m) => {
// val modelspec = new ModelSpec(m, textures, offset, rotation, file)
// val existingspec = ModelRegistry.put(MuseStringUtils.extractName(file), modelspec)
// (modelnode \ "binding").foreach {
// bindingnode => parseBinding(bindingnode, existingspec)
// }
// }
// case None => MuseLogger logError "Model file " + file + " not found! D:"
// }
//
// }
//
def parseBinding(bindingnode: NodeSeq, modelspec: ModelSpec) = {
val slot = parseInt((bindingnode \ "@slot").text)
val target = parseTarget((bindingnode \ "@target").text)
slot.foreach(slot => {
target.foreach(target =>
(bindingnode \ "part").foreach {
partnode =>
parseParts(partnode, modelspec, slot, target)
})
})
}
public void parseParts(NodeSeq partNode, ModelSpec modelspec, int slot, MorphTarget target) {
val defaultcolor = parseColour((partNode \ "@defaultcolor").text)
val defaultglow = parseBool((partNode \ "@defaultglow").text)
val name = (partNode \ "@name").text
val polygroup = validatePolygroup((partNode \ "@polygroup").text, modelspec)
polygroup.map(polygroup => {
val partspec = new ModelPartSpec(modelspec, target, polygroup, slot, 0, defaultglow.getOrElse(false), name)
modelspec.put(polygroup, partspec)
})
}
@Nullable
public String validatePolygroup(String s, ModelSpec m) {
Iterator<GroupObject> it = m.model.groupObjects.iterator();
while (it.hasNext()) {
if (it.next().name.equals(s)) return s;
}
return null;
}
@Nullable
public Boolean parseBool(String s) {
try {
return Boolean.parseBoolean(s);
} catch (Exception e) {
return null;
}
}
@Nullable
public Colour parseColour(String s) {
try {
Color c = Color.decode(s);
return new Colour(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha())
} catch (Exception e){
return null;
}
}
@Nullable
public MorphTarget parseTarget(String s) {
switch (s.toLowerCase()) {
case "head": return Head;
case "body": return Body;
case "leftarm": return LeftArm;
case "rightarm": return RightArm;
case "leftleg": return LeftLeg;
case "rightleg": return RightLeg;
case "cloak": return Cloak;
default: return null;
}
}
@Nullable
public Integer parseInt(String s) {
try {
return Integer.parseInt(s);
} catch (Exception e) {
return null;
}
}
@Nullable
public Vec3 parseVector(String s) {
try {
String[] ss = s.split(",");
double x = Double.parseDouble(ss[0]);
double y = Double.parseDouble(ss[1]);
double z = Double.parseDouble(ss[2]);
return Vec3.createVectorHelper(x, y, z);
} catch (Exception e) {
return null;
}
}
}

View file

@ -1,121 +1,121 @@
package net.machinemuse.powersuits.client.render.modelspec
import java.awt.Color
import java.net.URL
import net.machinemuse.numina.general.MuseLogger
import net.machinemuse.numina.geometry.Colour
import net.machinemuse.utils.MuseStringUtils
import net.minecraft.util.{ResourceLocation, Vec3}
import scala.xml.{NodeSeq, XML}
/**
* Author: MachineMuse (Claire Semple)
* Created: 8:44 AM, 4/28/13
*/
object ModelSpecXMLReader {
def parseFile(file: URL) = {
val xml = XML.load(file)
(xml \\ "model") foreach {
modelnode => parseModel(modelnode)
}
}
def parseModel(modelnode: NodeSeq) = {
val file = (modelnode \ "@file").text
val textures = (modelnode \ "@textures").text.split(",")
val offset = parseVector((modelnode \ "@offset").text)
val rotation = parseVector((modelnode \ "@rotation").text)
ModelRegistry.loadModel(new ResourceLocation(file)) match {
case Some(m) => {
val modelspec = new ModelSpec(m, textures, offset, rotation, file)
val existingspec = ModelRegistry.put(MuseStringUtils.extractName(file), modelspec)
(modelnode \ "binding").foreach {
bindingnode => parseBinding(bindingnode, existingspec)
}
}
case None => MuseLogger logError "Model file " + file + " not found! D:"
}
}
def parseBinding(bindingnode: NodeSeq, modelspec: ModelSpec) = {
val slot = parseInt((bindingnode \ "@slot").text)
val target = parseTarget((bindingnode \ "@target").text)
slot.foreach(slot => {
target.foreach(target =>
(bindingnode \ "part").foreach {
partnode =>
parseParts(partnode, modelspec, slot, target)
})
})
}
def parseParts(partNode: NodeSeq, modelspec: ModelSpec, slot: Int, target: MorphTarget) = {
val defaultcolor = parseColour((partNode \ "@defaultcolor").text)
val defaultglow = parseBool((partNode \ "@defaultglow").text)
val name = (partNode \ "@name").text
val polygroup = validatePolygroup((partNode \ "@polygroup").text, modelspec)
polygroup.map(polygroup => {
val partspec = new ModelPartSpec(modelspec, target, polygroup, slot, 0, defaultglow.getOrElse(false), name)
modelspec.put(polygroup, partspec)
})
}
def validatePolygroup(s: String, m: ModelSpec): Option[String] = {
val it = m.model.groupObjects.iterator
while (it.hasNext) {
if (it.next().name.equals(s)) return Some(s)
}
return None
}
def parseBool(s: String): Option[Boolean] = {
try Some(s.toBoolean) catch {
case _: Throwable => None
}
}
def parseColour(s: String): Option[Colour] = {
try {
val c = Color.decode(s)
Some(new Colour(c.getRed, c.getGreen, c.getBlue, c.getAlpha))
} catch {
case _: Throwable => None
}
}
def parseTarget(s: String): Option[MorphTarget] = {
s.toLowerCase match {
case "head" => Some(Head)
case "body" => Some(Body)
case "leftarm" => Some(LeftArm)
case "rightarm" => Some(RightArm)
case "leftleg" => Some(LeftLeg)
case "rightleg" => Some(RightLeg)
case "cloak" => Some(Cloak)
case _ => None
}
}
def parseInt(s: String): Option[Int] = {
try Some(s.toInt) catch {
case _: Throwable => None
}
}
def parseVector(s: String): Option[Vec3] = {
try {
val ss = s.split(",")
val x = ss(0).toDouble
val y = ss(1).toDouble
val z = ss(2).toDouble
Some(Vec3.createVectorHelper(x, y, z))
} catch {
case _: Throwable => None
}
}
}
//package net.machinemuse.powersuits.client.render.modelspec
//
//import java.awt.Color
//import java.net.URL
//
//import net.machinemuse.numina.general.MuseLogger
//import net.machinemuse.numina.geometry.Colour
//import net.machinemuse.utils.MuseStringUtils
//import net.minecraft.util.{ResourceLocation, Vec3}
//
//import scala.xml.{NodeSeq, XML}
//
//
///**
// * Author: MachineMuse (Claire Semple)
// * Created: 8:44 AM, 4/28/13
// */
//object ModelSpecXMLReader {
// def parseFile(file: URL) = {
// val xml = XML.load(file)
// (xml \\ "model") foreach {
// modelnode => parseModel(modelnode)
// }
// }
//
// def parseModel(modelnode: NodeSeq) = {
// val file = (modelnode \ "@file").text
// val textures = (modelnode \ "@textures").text.split(",")
// val offset = parseVector((modelnode \ "@offset").text)
// val rotation = parseVector((modelnode \ "@rotation").text)
//
// ModelRegistry.loadModel(new ResourceLocation(file)) match {
// case Some(m) => {
// val modelspec = new ModelSpec(m, textures, offset, rotation, file)
// val existingspec = ModelRegistry.put(MuseStringUtils.extractName(file), modelspec)
// (modelnode \ "binding").foreach {
// bindingnode => parseBinding(bindingnode, existingspec)
// }
// }
// case None => MuseLogger logError "Model file " + file + " not found! D:"
// }
//
// }
//
// def parseBinding(bindingnode: NodeSeq, modelspec: ModelSpec) = {
// val slot = parseInt((bindingnode \ "@slot").text)
// val target = parseTarget((bindingnode \ "@target").text)
// slot.foreach(slot => {
// target.foreach(target =>
// (bindingnode \ "part").foreach {
// partnode =>
// parseParts(partnode, modelspec, slot, target)
// })
// })
// }
//
// def parseParts(partNode: NodeSeq, modelspec: ModelSpec, slot: Int, target: MorphTarget) = {
// val defaultcolor = parseColour((partNode \ "@defaultcolor").text)
// val defaultglow = parseBool((partNode \ "@defaultglow").text)
// val name = (partNode \ "@name").text
// val polygroup = validatePolygroup((partNode \ "@polygroup").text, modelspec)
// polygroup.map(polygroup => {
// val partspec = new ModelPartSpec(modelspec, target, polygroup, slot, 0, defaultglow.getOrElse(false), name)
// modelspec.put(polygroup, partspec)
// })
// }
//
// def validatePolygroup(s: String, m: ModelSpec): Option[String] = {
// val it = m.model.groupObjects.iterator
// while (it.hasNext) {
// if (it.next().name.equals(s)) return Some(s)
// }
// return None
// }
//
// def parseBool(s: String): Option[Boolean] = {
// try Some(s.toBoolean) catch {
// case _: Throwable => None
// }
// }
//
// def parseColour(s: String): Option[Colour] = {
// try {
// val c = Color.decode(s)
// Some(new Colour(c.getRed, c.getGreen, c.getBlue, c.getAlpha))
// } catch {
// case _: Throwable => None
// }
// }
//
// def parseTarget(s: String): Option[MorphTarget] = {
// s.toLowerCase match {
// case "head" => Some(Head)
// case "body" => Some(Body)
// case "leftarm" => Some(LeftArm)
// case "rightarm" => Some(RightArm)
// case "leftleg" => Some(LeftLeg)
// case "rightleg" => Some(RightLeg)
// case "cloak" => Some(Cloak)
// case _ => None
// }
// }
//
// def parseInt(s: String): Option[Int] = {
// try Some(s.toInt) catch {
// case _: Throwable => None
// }
// }
//
// def parseVector(s: String): Option[Vec3] = {
// try {
// val ss = s.split(",")
// val x = ss(0).toDouble
// val y = ss(1).toDouble
// val z = ss(2).toDouble
// Some(Vec3.createVectorHelper(x, y, z))
// } catch {
// case _: Throwable => None
// }
// }
//}

View file

@ -26,16 +26,4 @@ object ModelSpecXMLWriter {
}
def concatList(list: Seq[String]): String = list mkString ","
}
object ModelSpecJSONWriter {
def writeRegistry(file: String) {
val gson = new Gson()
import scala.collection.JavaConverters._
val registry = ModelRegistry.apply.asJava
val jsonwrite = gson.toJson(registry)
val w = new PrintWriter(new FileOutputStream(new File(file)))
w.print(jsonwrite)
w.close()
}
}

View file

@ -1,69 +1,87 @@
//package net.machinemuse.powersuits.client.render.modelspec;
//
///**
// * Ported to Java by lehjr on 11/8/16.
// */
//public enum MorphTarget {
// Cloak("Cloak", m.bipedCloak),
// Head("Head", m.bipedHead),
// Body("Body", m.bipedBody),
// RightArm("RightArm", m.bipedRightArm),
// LeftArm("LeftArm", m.bipedRightArm),
// RightLeg("RightLe", m.bipedRightLeg),
// LeftLeg("LeftLeg", m.bipedLeftLeg);
//
//
// public MorphTarget(String name, ModelBiped)
//
//
//
//
//
//// sealed trait MorphTarget {
//// val name: String
//// val degrad = 180F / Math.PI.asInstanceOf[Float]
////
//// def apply(m: ModelBiped): ModelRenderer
//// }
////
////case object Cloak extends MorphTarget {
//// val name = "Cloak"
////
//// def apply(m: ModelBiped) = m.bipedCloak
//// }
////
////case object Head extends MorphTarget {
//// val name = "Head"
////
//// def apply(m: ModelBiped) = m.bipedHead
//// }
////
////case object Body extends MorphTarget {
//// val name = "Body"
////
//// def apply(m: ModelBiped) = m.bipedBody
//// }
////
////case object RightArm extends MorphTarget {
//// val name = "RightArm"
////
//// def apply(m: ModelBiped) = m.bipedRightArm
//// }
////
////case object LeftArm extends MorphTarget {
//// val name = "LeftArm"
////
//// def apply(m: ModelBiped) = m.bipedLeftArm
//// }
////
////case object RightLeg extends MorphTarget {
//// val name = "RightLeg"
////
//// def apply(m: ModelBiped) = m.bipedRightLeg
//// }
////
////case object LeftLeg extends MorphTarget {
//// val name = "LeftLeg"
////
//// def apply(m: ModelBiped) = m.bipedLeftLeg
////}
package net.machinemuse.powersuits.client.render.modelspec;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.model.ModelRenderer;
/**
* Ported to Java by lehjr on 11/8/16.
*/
public enum MorphTarget {
Cloak,
Head,
Body,
RightArm,
LeftArm,
RightLeg,
LeftLeg;
private interface iMorphTarget {
String name = null;
float degrad = (float) (180F / Math.PI);
ModelRenderer apply(ModelBiped m);
}
public class Cloak implements iMorphTarget {
String name = "Cloak";
@Override
public ModelRenderer apply(ModelBiped m) {
return null;
}
}
public class Head implements iMorphTarget {
String name = "Head";
@Override
public ModelRenderer apply(ModelBiped m) {
return m.bipedHead;
}
}
public class Body implements iMorphTarget {
String name = "Body";
@Override
public ModelRenderer apply(ModelBiped m) {
return m.bipedBody;
}
}
public class RightArm implements iMorphTarget {
String name = "RightArm";
@Override
public ModelRenderer apply(ModelBiped m) {
return m.bipedRightArm;
}
}
public class LeftArm implements iMorphTarget {
String name = "LeftArm";
@Override
public ModelRenderer apply(ModelBiped m) {
return m.bipedLeftArm;
}
}
public class RightLeg implements iMorphTarget {
String name = "RightLeg";
@Override
public ModelRenderer apply(ModelBiped m) {
return m.bipedRightLeg;
}
}
public class LeftLeg implements iMorphTarget {
String name = "LeftLeg";
@Override
public ModelRenderer apply(ModelBiped m) {
return m.bipedLeftLeg;
}
}
}