/**
* Copyright (c) Lambda Innovation, 2013-2015
* 本作品版权由Lambda Innovation所有。
* http://www.li-dev.cn/
*
* This project is open-source, and it is distributed under
* the terms of GNU General Public License. You can modify
* and distribute freely as long as you follow the license.
* 本项目是一个开源项目,且遵循GNU通用公共授权协议。
* 在遵照该协议的情况下,您可以自由传播和修改。
* http://www.gnu.org/licenses/gpl.html
*/
package cn.weaponry.impl.classic.loading;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Vec3;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.client.model.ModelFormatException;
import net.minecraftforge.client.model.obj.WavefrontObject;
import cn.liutils.loading.Loader.ObjectNamespace;
import cn.liutils.loading.item.ItemLoadRule;
import cn.weaponry.api.client.render.CompTransform;
import cn.weaponry.api.client.render.PartedObjModel;
import cn.weaponry.api.client.render.RendererWeapon;
import cn.weaponry.core.Weaponry;
import cn.weaponry.impl.classic.WeaponClassic;
import cn.weaponry.impl.classic.client.animation.Muzzleflash;
import cn.weaponry.impl.classic.client.animation.Recoil;
import cn.weaponry.impl.classic.client.animation.ReloadAnimation;
import cn.weaponry.impl.generic.action.ScreenUplift;
/**
* Provided a chance for subclasses to redirect the searching.
* @author WeAthFolD
*/
public class ClassicRenderRule extends ItemLoadRule<WeaponClassic> {
protected WeaponClassic item;
protected ObjectNamespace ns;
protected String name;
@Override
public void load(WeaponClassic item, ObjectNamespace ns, String name)
throws Exception {
this.item = item;
this.ns = ns;
this.name = name;
WavefrontObject obj = loadModel(); //Currently just support the .obj
if(obj != null) {
//Create the renderer and bind it!
RendererWeapon render = new RendererWeapon(new PartedObjModel(obj), loadTexture());
//Load the comp transform
lookComp(render, render.stdTransform, "t_std");
lookComp(render, render.fpTransform, "t_firstPerson");
lookComp(render, render.tpTransform, "t_thirdPerson");
lookComp(render, render.entityItemTransform, "t_entityItem");
item.reloadAnim.load(ns);
MinecraftForgeClient.registerItemRenderer(item, render);
} else {
Weaponry.log.error("WeaponClassic Render Rule: Model lookup failed for " + name);
}
//Set up muzzleflash
Muzzleflash mf = item.animMuzzleflash;
mf.load(ns);
ReloadAnimation ra = item.reloadAnim;
ra.load(ns);
Recoil r = item.recoilAnim;
r.load(ns);
String[] ul = { "upliftRadius", "upliftSpeed", "recoverSpeed", "degreeFrom", "degreeTo" };
for(String prop : ul) {
Double d = ns.getDouble("weapon", "uplift", prop);
if(d != null) {
//System.out.println(String.format("[%s]Updated field uplift.%s", prop, name));
ScreenUplift.class.getField(prop).set(item.screenUplift, d);
}
}
}
protected WavefrontObject loadModel() {
try {
return new WavefrontObject(new ResourceLocation(ns.getString("render", "model")));
} catch(ModelFormatException e) {
return null;
} catch(NullPointerException e) {
return null;
}
}
protected ResourceLocation loadTexture() {
try {
return new ResourceLocation(ns.getString("render", "texture"));
} catch(NullPointerException e) {
return null;
}
}
protected void lookComp(RendererWeapon render, CompTransform ct, String compName) {
// name/render/<compName>/
// transform
// pivot->pivotPt
// rotation
Vec3 vec;
vec = lookVector("render", compName, "transform");
//System.out.println(vec);
if(vec != null) ct.transform = vec;
vec = lookVector("render", compName, "pivot");
if(vec != null) ct.pivotPt = vec;
vec = lookVector("render", compName, "rotation");
if(vec != null) ct.rotation = vec;
Double scale = ns.getDouble("render", compName, "scale");
if(scale != null) ct.scale = scale;
}
private Vec3 lookVector(String ...base) {
Object[] look = new Object[base.length + 1];
System.arraycopy(base, 0, look, 0, base.length);
Double x, y, z;
look[base.length] = 0;
x = ns.getDouble(look);
look[base.length] = 1;
y = ns.getDouble(look);
look[base.length] = 2;
z = ns.getDouble(look);
if(x != null && y != null && z != null) {
//System.out.println("Located vec " + name + "/" + DebugUtils.formatArray((Object[])base));
return Vec3.createVectorHelper(x, y, z);
} else {
//System.out.println("Not locate vec " + name + "/" + DebugUtils.formatArray((Object[])base));
}
return null;
}
}