mirror of
https://github.com/webbukkit/dynmap.git
synced 2024-11-24 03:05:28 +01:00
Add model element rotation to modellist
This commit is contained in:
parent
d8cf759671
commit
ea79274938
@ -331,6 +331,7 @@ public class HDBlockModels {
|
||||
private static class ModelBox {
|
||||
double[] from = new double[3];
|
||||
double[] to = new double[3];
|
||||
double xrot = 0, yrot = 0, zrot = 0;
|
||||
ArrayList<ModelBoxSide> sides = new ArrayList<ModelBoxSide>();
|
||||
};
|
||||
|
||||
@ -1017,11 +1018,11 @@ public class HDBlockModels {
|
||||
databits.set(getIntValue(varvals,av[1]));
|
||||
}
|
||||
else if(av[0].equals("box")) {
|
||||
// box=fromx/y/z:tox/y/z:<side - upnsew>/<txtidx>/umin/vmin/umax/vmax>:...
|
||||
// box=from-x/y/z:to-x/y/z/rotx/roty/rotz:<side - upnsew>/<txtidx>/umin/vmin/umax/vmax>:...
|
||||
String[] prms = av[1].split(":");
|
||||
|
||||
ModelBox box = new ModelBox();
|
||||
if (prms.length > 0) { // Handle from
|
||||
if (prms.length > 0) { // Handle from (from-x/y/z)
|
||||
String[] xyz = prms[0].split("/");
|
||||
if (xyz.length == 3) {
|
||||
box.from[0] = Double.parseDouble(xyz[0]);
|
||||
@ -1032,12 +1033,17 @@ public class HDBlockModels {
|
||||
Log.severe("Invalid modellist FROM value (" + prms[0] + " at line " + rdr.getLineNumber());
|
||||
}
|
||||
}
|
||||
if (prms.length > 1) { // Handle to
|
||||
if (prms.length > 1) { // Handle to (to-x/y/z or to-x/y/z/rotx/roty/rotz)
|
||||
String[] xyz = prms[1].split("/");
|
||||
if (xyz.length == 3) {
|
||||
if (xyz.length >= 3) {
|
||||
box.to[0] = Double.parseDouble(xyz[0]);
|
||||
box.to[1] = Double.parseDouble(xyz[1]);
|
||||
box.to[2] = Double.parseDouble(xyz[2]);
|
||||
if (xyz.length >= 6) { // If 6, second set are rotations (xrot/yrot/zrot)
|
||||
box.xrot = Double.parseDouble(xyz[3]);
|
||||
box.yrot = Double.parseDouble(xyz[4]);
|
||||
box.zrot = Double.parseDouble(xyz[5]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
Log.severe("Invalid modellist TO value (" + prms[1] + " at line " + rdr.getLineNumber());
|
||||
@ -1052,7 +1058,7 @@ public class HDBlockModels {
|
||||
String face = flds[0];
|
||||
side.side = toBlockSide.get(face);
|
||||
if (side.side == null) {
|
||||
Log.severe("Invalid modellist side value (" + face + " at line " + rdr.getLineNumber());
|
||||
Log.severe("Invalid modellist side value (" + face + ") at line " + rdr.getLineNumber());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -1081,6 +1087,10 @@ public class HDBlockModels {
|
||||
for (ModelBoxSide side : bl.sides) {
|
||||
PatchDefinition patch = pdf.getModelFace(bl.from, bl.to, side.side, side.uv, side.textureid);
|
||||
if (patch != null) {
|
||||
// If any rotations, apply them here
|
||||
if ((bl.xrot != 0) || (bl.yrot != 0) || (bl.zrot != 0)) {
|
||||
patch = pdf.getPatch(patch, bl.xrot, bl.yrot, bl.zrot, patch.textureindex);
|
||||
}
|
||||
pd.add(patch);
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod
|
||||
private HashMap<BlockSide, ModelSide> sides = new HashMap<BlockSide, ModelSide>();
|
||||
private double[] from = { 0, 0, 0 };
|
||||
private double[] to = { 16, 16, 16 };
|
||||
private double xrot = 0, yrot = 0, zrot = 0;
|
||||
@Override
|
||||
public void addBlockSide(BlockSide side, double[] uv, int textureid) {
|
||||
ModelSide ms = new ModelSide();
|
||||
@ -81,6 +82,9 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod
|
||||
else {
|
||||
for (ModelBlockImpl mb: boxes) {
|
||||
line += String.format(",box=%f/%f/%f:%f/%f/%f", mb.from[0], mb.from[1], mb.from[2], mb.to[0], mb.to[1], mb.to[2]);
|
||||
if ((mb.xrot != 0) || (mb.yrot != 0) || (mb.zrot != 0)) { // If needed, add rotation
|
||||
line += String.format("/%f/%f/%f", mb.xrot, mb.yrot, mb.zrot);
|
||||
}
|
||||
for (BlockSide bs : fromBlockSide.keySet()) {
|
||||
String side = fromBlockSide.get(bs);
|
||||
ModelSide mside = mb.sides.get(bs);
|
||||
@ -108,12 +112,16 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod
|
||||
*
|
||||
* @param from - vector of lower left corner of box (0-16 range for coordinates - min x, y, z)
|
||||
* @param to - vector of upper right corner of box (0-16 range for coordinates max x, y, z)
|
||||
* @param xrot - degrees of rotation of block around X
|
||||
* @param yrot - degrees of rotation of block around Y
|
||||
* @param zrot - degrees of rotation of block around Z
|
||||
* @return model block to add faces to
|
||||
*/
|
||||
public ModelBlock addModelBlock(double[] from, double[] to) {
|
||||
public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot) {
|
||||
ModelBlockImpl mbi = new ModelBlockImpl();
|
||||
if (from != null) { mbi.from[0] = from[0]; mbi.from[1] = from[1]; mbi.from[2] = from[2]; }
|
||||
if (to != null) { mbi.to[0] = to[0]; mbi.to[1] = to[1]; mbi.to[2] = to[2]; }
|
||||
mbi.xrot = xrot; mbi.yrot = yrot; mbi.zrot = zrot;
|
||||
boxes.add(mbi);
|
||||
return mbi;
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ public class PatchDefinition implements RenderPatch {
|
||||
* @param rotatez - z rotation in degrees
|
||||
* @param textureindex - texture index for new patch (-1 = use same as original patch)
|
||||
*/
|
||||
PatchDefinition(PatchDefinition orig, int rotatex, int rotatey, int rotatez, int textureindex) {
|
||||
PatchDefinition(PatchDefinition orig, double rotatex, double rotatey, double rotatez, int textureindex) {
|
||||
Vector3D vec = new Vector3D(orig.x0, orig.y0, orig.z0);
|
||||
rotate(vec, rotatex, rotatey, rotatez); /* Rotate origin */
|
||||
x0 = vec.x; y0 = vec.y; z0 = vec.z;
|
||||
@ -101,7 +101,7 @@ public class PatchDefinition implements RenderPatch {
|
||||
update();
|
||||
}
|
||||
|
||||
private void rotate(Vector3D vec, int xcnt, int ycnt, int zcnt) {
|
||||
private void rotate(Vector3D vec, double xcnt, double ycnt, double zcnt) {
|
||||
vec.subtract(offsetCenter); /* Shoft to center of block */
|
||||
/* Do X rotation */
|
||||
double rot = Math.toRadians(xcnt);
|
||||
|
@ -81,14 +81,19 @@ public class PatchDefinitionFactory implements RenderPatchFactory {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public RenderPatch getRotatedPatch(RenderPatch patch, double xrot, double yrot,
|
||||
double zrot, int textureindex) {
|
||||
return getPatch((PatchDefinition)patch, xrot, yrot, zrot, textureindex);
|
||||
}
|
||||
@Override
|
||||
public RenderPatch getRotatedPatch(RenderPatch patch, int xrot, int yrot,
|
||||
int zrot, int textureindex) {
|
||||
return getPatch((PatchDefinition)patch, xrot, yrot, zrot, textureindex);
|
||||
}
|
||||
|
||||
public PatchDefinition getPatch(PatchDefinition patch, int xrot, int yrot,
|
||||
int zrot, int textureindex) {
|
||||
public PatchDefinition getPatch(PatchDefinition patch, double xrot, double yrot,
|
||||
double zrot, int textureindex) {
|
||||
PatchDefinition pd = new PatchDefinition(patch, xrot, yrot, zrot, textureindex);
|
||||
if(pd.validate() == false)
|
||||
return null;
|
||||
|
@ -1,5 +1,7 @@
|
||||
package org.dynmap.modsupport;
|
||||
|
||||
import org.dynmap.modsupport.ModelBlockModel.ModelBlock;
|
||||
|
||||
// Model for more direct translation of MC models
|
||||
// All coordinates are 0-16 range per block, and 0-16 range for UV
|
||||
|
||||
@ -26,7 +28,10 @@ public interface ModelBlockModel extends BlockModel {
|
||||
*
|
||||
* @param from - vector of lower left corner of box (0-16 range for coordinates - min x, y, z)
|
||||
* @param to - vector of upper right corner of box (0-16 range for coordinates max x, y, z)
|
||||
* @param xrot - degrees of rotation of block around X
|
||||
* @param yrot - degrees of rotation of block around Y
|
||||
* @param zrot - degrees of rotation of block around Z
|
||||
* @return model block to add faces to
|
||||
*/
|
||||
public ModelBlock addModelBlock(double[] from, double[] to);
|
||||
public ModelBlock addModelBlock(double[] from, double[] to, double xrot, double yrot, double zrot);
|
||||
}
|
||||
|
@ -85,6 +85,19 @@ public interface RenderPatchFactory {
|
||||
*/
|
||||
@Deprecated
|
||||
public RenderPatch getPatch(double x0, double y0, double z0, double xu, double yu, double zu, double xv, double yv, double zv, double uplusvmax, SideVisible sidevis, int textureidx);
|
||||
/**
|
||||
* Get/create patch with given attributes.
|
||||
*
|
||||
* Generate from existing patch, after rotating xrot degrees around the X axis then yrot degrees around the Y axis, and then zrot degrees arond Z.
|
||||
*
|
||||
* @param patch - original patch
|
||||
* @param xrot - degrees to rotate around X
|
||||
* @param yrot - degrees to rotate around Y
|
||||
* @param zrot - degrees to rotate around Z
|
||||
* @param textureidx - texture index to be used for rotated patch (-1 means same as original patch)
|
||||
* @return patch requested
|
||||
*/
|
||||
public RenderPatch getRotatedPatch(RenderPatch patch, double xrot, double yrot, double zrot, int textureidx);
|
||||
/**
|
||||
* Get/create patch with given attributes.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user