redid most train physics, pollution handling stuff

This commit is contained in:
Bob 2023-06-04 17:08:11 +02:00
parent 2d3217c96b
commit ff473c51da
19 changed files with 2262 additions and 750 deletions

View File

@ -2136,8 +2136,8 @@ public class ModBlocks {
rail_booster = new RailBooster().setBlockName("rail_booster").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_booster");
rail_narrow_straight = new RailNarrowStraight().setBlockName("rail_narrow_straight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_narrow_neo");
rail_narrow_curve = new RailNarrowCurve().setBlockName("rail_narrow_curve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_narrow_neo");
rail_large_straight = new RailStandardStraight().setBlockName("rail_large_straight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":block_steel");
rail_large_curve = new RailStandardCurve().setBlockName("rail_large_curve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":block_steel");
rail_large_straight = new RailStandardStraight().setBlockName("rail_large_straight").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_standard_straight");
rail_large_curve = new RailStandardCurve().setBlockName("rail_large_curve").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":rail_standard_straight");
rail_large_buffer = new RailStandardBuffer().setBlockName("rail_large_buffer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(CreativeTabs.tabTransport).setBlockTextureName(RefStrings.MODID + ":block_steel");
crate = new BlockCrate(Material.wood).setBlockName("crate").setStepSound(Block.soundTypeWood).setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.consumableTab).setBlockTextureName(RefStrings.MODID + ":crate");

View File

@ -4,6 +4,7 @@ import com.hbm.blocks.BlockDummyable;
import com.hbm.lib.Library;
import com.hbm.util.fauxpointtwelve.BlockPos;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraft.block.material.Material;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
@ -24,9 +25,11 @@ public class RailStandardCurve extends BlockDummyable implements IRailNTM {
return null;
}
public static int renderID = RenderingRegistry.getNextAvailableRenderId();
@Override
public int getRenderType() {
return 0;
return renderID;
}
@Override

View File

@ -12,23 +12,32 @@ import com.hbm.blocks.rail.IRailNTM.RailCheckType;
import com.hbm.blocks.rail.IRailNTM.RailContext;
import com.hbm.blocks.rail.IRailNTM.TrackGauge;
import com.hbm.items.ModItems;
import com.hbm.packet.AuxParticlePacketNT;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.PlayerInformPacket;
import com.hbm.util.ChatBuilder;
import com.hbm.util.fauxpointtwelve.BlockPos;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre;
public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
public LogicalTrainUnit ltu;
public int ltuIndex = 0;
public boolean isOnRail = true;
private int turnProgress;
/* Clientside position that should be approached with smooth interpolation */
@ -103,13 +112,16 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
if(this.ltu != null) this.ltu.dissolveTrain();
if(neighbor.ltu != null) neighbor.ltu.dissolveTrain();
player.swingItem();
player.addChatComponentMessage(new ChatComponentText("Coupled " + this.hashCode() + " (" + closestOwnCoupling.name() + ") to " + neighbor.hashCode() + " (" + closestNeighborCoupling.name() + ")"));
return true;
}
}
}
//DEBUG
/*if(this.ltu != null) {
if(this.ltu != null) {
String id = Integer.toHexString(ltu.hashCode());
@ -122,7 +134,7 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
data.setString("text", id);
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, train.posX, train.posY + 1, train.posZ), new TargetPoint(this.dimension, train.posX, train.posY + 1, train.posZ, 50));
}
}*/
}
return false;
}
@ -152,7 +164,7 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
this.setRotation(this.rotationYaw, this.rotationPitch);
}
BlockPos anchor = this.getCurentAnchorPos();
BlockPos anchor = this.getCurrentAnchorPos();
Vec3 frontPos = getRelPosAlongRail(anchor, this.getLengthSpan(), new MoveContext(RailCheckType.FRONT));
Vec3 backPos = getRelPosAlongRail(anchor, -this.getLengthSpan(), new MoveContext(RailCheckType.BACK));
@ -293,23 +305,51 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
}
}
//TODO: rethink this entire concept
/*
* first, figure out which train is the "front" when moving
* if the train is not in motion, reuse the contract ("combine") function we have now
* move the first wagon until either it finishes or bumps into a buffer
* if it derails, continue using the velocity
* then take the second wagon and move it towards the first wagon's collision point, assuming it didn't derail
* continue with all further wagons
*
* step 3 may also do collision checks for other trains, which is good because that's an issue we would have to solve sooner or later
*/
/* Move carts together with links */
for(LogicalTrainUnit ltu : ltus) ltu.combineWagons();
//for(LogicalTrainUnit ltu : ltus) ltu.combineWagons();
/* Move carts with unified speed */
for(LogicalTrainUnit ltu : ltus) ltu.moveTrain();
//for(LogicalTrainUnit ltu : ltus) ltu.moveTrain();
for(LogicalTrainUnit ltu : ltus) {
double speed = ltu.getTotalSpeed();
if(Math.abs(speed) < 0.001) speed = 0;
if(ltu.trains.length == 1) {
EntityRailCarBase train = ltu.trains[0];
BlockPos anchor = new BlockPos(train.posX, train.posY, train.posZ);
Vec3 newPos = train.getRelPosAlongRail(anchor, speed, new MoveContext(RailCheckType.CORE));
if(newPos == null) {
train.derail();
ltu.dissolveTrain();
continue;
}
train.setPosition(newPos.xCoord, newPos.yCoord, newPos.zCoord);
anchor = train.getCurrentAnchorPos();
Vec3 frontPos = train.getRelPosAlongRail(anchor, train.getLengthSpan(), new MoveContext(RailCheckType.FRONT));
Vec3 backPos = train.getRelPosAlongRail(anchor, -train.getLengthSpan(), new MoveContext(RailCheckType.BACK));
if(frontPos == null || backPos == null) {
train.derail();
ltu.dissolveTrain();
continue;
} else {
ltu.setRenderPos(train, frontPos, backPos);
}
continue;
}
if(speed == 0) {
ltu.combineWagons();
} else {
ltu.moveTrainByApproach(speed);
}
}
}
/** Returns the amount of blocks that the train should move per tick */
@ -331,7 +371,7 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
}*/
/** Returns the "true" position of the train, i.e. the block it wants to snap to */
public BlockPos getCurentAnchorPos() {
public BlockPos getCurrentAnchorPos() {
return new BlockPos(posX, posY, posZ);
}
@ -363,7 +403,7 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
}
/** Invisible entities that make up the dynamic bounding structure of the train, moving as the train rotates. */
public static class BoundingBoxDummyEntity extends Entity {
public static class BoundingBoxDummyEntity extends Entity implements ILookOverlay {
private int turnProgress;
private double trainX;
@ -428,6 +468,13 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
this.trainZ = posZ;
this.turnProgress = turnProg + 2;
}
@Override
public void printHook(Pre event, World world, int x, int y, int z) {
Entity e = worldObj.getEntityByID(this.dataWatcher.getWatchableObjectInt(3));
if(e instanceof EntityRailCarBase) {
((EntityRailCarBase) e).printHook(event, world, x, y, z);
}
}
}
public DummyConfig[] getDummies() {
@ -491,37 +538,36 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
public static LogicalTrainUnit generateTrain(EntityRailCarBase train) {
List<EntityRailCarBase> links = new ArrayList();
Set<EntityRailCarBase> brake = new HashSet();
links.add(train);
brake.add(train);
LogicalTrainUnit ltu = new LogicalTrainUnit();
if(train.coupledFront == null && train.coupledFront == null) {
if(train.coupledFront == null && train.coupledBack == null) {
ltu.trains = new EntityRailCarBase[] {train};
train.ltu = ltu;
train.ltuIndex = 0;
return ltu;
}
EntityRailCarBase prevCar = train;
EntityRailCarBase nextCar = train.coupledBack == null ? train.coupledFront : train.coupledBack;
EntityRailCarBase current = train;
EntityRailCarBase next = null;
while(nextCar != null) {
links.add(nextCar);
brake.add(nextCar);
do {
next = null;
if(current.coupledFront != null && !brake.contains(current.coupledFront)) next = current.coupledFront;
if(current.coupledBack != null && !brake.contains(current.coupledBack)) next = current.coupledBack;
EntityRailCarBase currentCar = nextCar;
nextCar = nextCar.coupledBack == prevCar ? nextCar.coupledFront : nextCar.coupledBack;
prevCar = currentCar;
links.add(current);
brake.add(current);
if(brake.contains(nextCar)) {
break;
}
}
current = next;
} while(next != null);
ltu.trains = new EntityRailCarBase[links.size()];
for(int i = 0; i < ltu.trains.length; i++) {
ltu.trains[i] = links.get(i);
ltu.trains[i].ltu = ltu;
ltu.trains[i].ltuIndex = i;
}
return ltu;
@ -531,6 +577,7 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
public void dissolveTrain() {
for(EntityRailCarBase train : trains) {
train.ltu = null;
train.ltuIndex = 0;
}
}
@ -559,23 +606,34 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
}
/** Moves one wagon to ne next until the coupling points roughly touch */
public static void moveWagonTo(EntityRailCarBase prev, EntityRailCarBase next) {
TrainCoupling prevCouple = prev.getCouplingFrom(next);
TrainCoupling nextCouple = next.getCouplingFrom(prev);
Vec3 prevLoc = prev.getCouplingPos(prevCouple);
Vec3 nextLoc = next.getCouplingPos(nextCouple);
public void moveWagonTo(EntityRailCarBase moveTo, EntityRailCarBase moving) {
TrainCoupling prevCouple = moveTo.getCouplingFrom(moving);
TrainCoupling nextCouple = moving.getCouplingFrom(moveTo);
Vec3 prevLoc = moveTo.getCouplingPos(prevCouple);
Vec3 nextLoc = moving.getCouplingPos(nextCouple);
Vec3 delta = Vec3.createVectorHelper(prevLoc.xCoord - nextLoc.xCoord, 0, prevLoc.zCoord - nextLoc.zCoord);
double len = delta.lengthVector();
len *= 0.25D; //suspension, causes movements to be less rigid
BlockPos anchor = new BlockPos(next.posX, next.posY, next.posZ);
Vec3 trainPos = Vec3.createVectorHelper(next.posX, next.posY, next.posZ);
len *= 0.75; //suspension, causes movements to be less rigid
BlockPos anchor = new BlockPos(moving.posX, moving.posY, moving.posZ);
Vec3 trainPos = Vec3.createVectorHelper(moving.posX, moving.posY, moving.posZ);
float yaw = EntityRailCarBase.generateYaw(prevLoc, nextLoc);
Vec3 newPos = EntityRailCarBase.getRelPosAlongRail(anchor, len, next.getGauge(), next.worldObj, trainPos, yaw, new MoveContext(RailCheckType.CORE));
next.setPosition(newPos.xCoord, newPos.yCoord, newPos.zCoord);
Vec3 newPos = EntityRailCarBase.getRelPosAlongRail(anchor, len, moving.getGauge(), moving.worldObj, trainPos, yaw, new MoveContext(RailCheckType.CORE));
moving.setPosition(newPos.xCoord, newPos.yCoord, newPos.zCoord);
anchor = moving.getCurrentAnchorPos(); //reset origin to new position
Vec3 frontPos = moving.getRelPosAlongRail(anchor, moving.getLengthSpan(), new MoveContext(RailCheckType.FRONT));
Vec3 backPos = moving.getRelPosAlongRail(anchor, -moving.getLengthSpan(), new MoveContext(RailCheckType.BACK));
if(frontPos == null || backPos == null) {
moving.derail();
this.dissolveTrain();
return;
} else {
setRenderPos(moving, frontPos, backPos);
}
}
/** Generates the speed of the train, then moves the rain along the rail */
public void moveTrain() {
@Deprecated public void moveTrain() {
EntityRailCarBase prev = trains[0];
TrainCoupling dir = prev.getCouplingFrom(null);
@ -599,11 +657,11 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
}
/** Moves the entire train along the rail by a certain speed */
public void moveTrainBy(double totalSpeed) {
@Deprecated public void moveTrainBy(double totalSpeed) {
for(EntityRailCarBase train : this.trains) {
BlockPos anchor = train.getCurentAnchorPos();
BlockPos anchor = train.getCurrentAnchorPos();
Vec3 corePos = train.getRelPosAlongRail(anchor, totalSpeed, new MoveContext(RailCheckType.CORE));
if(corePos == null) {
@ -612,7 +670,7 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
return;
} else {
train.setPosition(corePos.xCoord, corePos.yCoord, corePos.zCoord);
anchor = train.getCurentAnchorPos(); //reset origin to new position
anchor = train.getCurrentAnchorPos(); //reset origin to new position
Vec3 frontPos = train.getRelPosAlongRail(anchor, train.getLengthSpan(), new MoveContext(RailCheckType.FRONT));
Vec3 backPos = train.getRelPosAlongRail(anchor, -train.getLengthSpan(), new MoveContext(RailCheckType.BACK));
@ -632,15 +690,110 @@ public abstract class EntityRailCarBase extends Entity implements ILookOverlay {
}
}
}
/** Returns the total speed of the LTU, negative if it is backwards compared to the arbitrary "front" wagon */
public double getTotalSpeed() {
EntityRailCarBase prev = trains[0];
double totalSpeed = 0;
double maxSpeed = Double.POSITIVE_INFINITY;
//if the first car is in reverse, flip all subsequent cars as well
boolean reverseTheReverse = prev.getCouplingFrom(null) == TrainCoupling.BACK;
if(trains.length == 1) {
return prev.getCurrentSpeed();
}
for(EntityRailCarBase train : this.trains) {
//if the car's linked indices are the wrong way, it is in reverse and speed applies negatively
boolean reverse = false;
EntityRailCarBase conFront = train.getCoupledTo(TrainCoupling.FRONT);
EntityRailCarBase conBack = train.getCoupledTo(TrainCoupling.BACK);
if(conFront != null && conFront.ltuIndex > train.ltuIndex) reverse = true;
if(conBack != null && conBack.ltuIndex < train.ltuIndex) reverse = true;
reverse ^= reverseTheReverse;
double speed = train.getCurrentSpeed();
if(reverse) speed *= -1;
totalSpeed += speed;
maxSpeed = Math.min(maxSpeed, train.getMaxRailSpeed());
prev = train;
}
if(Math.abs(totalSpeed) > maxSpeed) {
totalSpeed = maxSpeed * Math.signum(totalSpeed);
}
return totalSpeed;
}
/** Determines the "front" wagon based on the movement and moves it, then moves all other wagons towards that */
public void moveTrainByApproach(double speed) {
boolean forward = speed < 0;
double origSpeed = speed;
speed = Math.abs(speed);
EntityRailCarBase previous = null;
EntityRailCarBase first = this.trains[0];
for(int i = forward ? 0 : this.trains.length - 1; forward ? i < this.trains.length : i >= 0; i += forward ? 1 : -1) {
EntityRailCarBase current = this.trains[i];
if(previous == null) {
PacketDispatcher.wrapper.sendToAllAround(new PlayerInformPacket(ChatBuilder.start("" + current.getClass() + " " + origSpeed).color(EnumChatFormatting.RED).flush(), 1),
new TargetPoint(current.dimension, current.posX, current.posY + 1, current.posZ, 50));
boolean inReverse = first.getCouplingFrom(null) == current.getCouplingFrom(null);
int sigNum = inReverse ? -1 : 1;
BlockPos anchor = current.getCurrentAnchorPos();
Vec3 corePos = current.getRelPosAlongRail(anchor, speed * sigNum, new MoveContext(RailCheckType.CORE));
if(corePos == null) {
current.derail();
this.dissolveTrain();
return;
} else {
current.setPosition(corePos.xCoord, corePos.yCoord, corePos.zCoord);
anchor = current.getCurrentAnchorPos(); //reset origin to new position
Vec3 frontPos = current.getRelPosAlongRail(anchor, current.getLengthSpan(), new MoveContext(RailCheckType.FRONT));
Vec3 backPos = current.getRelPosAlongRail(anchor, -current.getLengthSpan(), new MoveContext(RailCheckType.BACK));
if(frontPos == null || backPos == null) {
current.derail();
this.dissolveTrain();
return;
} else {
setRenderPos(current, frontPos, backPos);
}
}
} else {
this.moveWagonTo(previous, current);
}
previous = current;
}
}
/** Uses the front and back bogey positions to set the render pos and angles of a wagon */
public void setRenderPos(EntityRailCarBase current, Vec3 frontPos, Vec3 backPos) {
current.renderX = (frontPos.xCoord + backPos.xCoord) / 2D;
current.renderY = (frontPos.yCoord + backPos.yCoord) / 2D;
current.renderZ = (frontPos.zCoord + backPos.zCoord) / 2D;
current.prevRotationYaw = current.rotationYaw;
current.rotationYaw = current.movementYaw = generateYaw(frontPos, backPos);
current.motionX = current.rotationYaw / 360D; // hijacking this crap for easy syncing
current.velocityChanged = true;
}
}
@Override
@SideOnly(Side.CLIENT)
public void printHook(RenderGameOverlayEvent.Pre event, World world, int x, int y, int z) {
/*List<String> text = new ArrayList();
text.add("LTU: " + this.ltu);
text.add("Front: " + this.coupledFront);
text.add("Back: " + this.coupledBack);
ILookOverlay.printGeneric(event, this.toString(), 0xffff00, 0x404000, text);*/ //none of this shit is going to work anyway
List<String> text = new ArrayList();
ILookOverlay.printGeneric(event, this.getClass().getSimpleName() + " " + this.hashCode(), 0xffff00, 0x404000, text); //none of this shit is going to work anyway
}
}

View File

@ -15,6 +15,22 @@ public abstract class EntityRailCarCargo extends EntityRailCarBase implements II
public EntityRailCarCargo(World world) {
super(world);
}
@Override
protected void entityInit() {
super.entityInit();
this.dataWatcher.addObject(10, new Integer(0));
}
public int countVacantSlots() {
int slots = 0;
for(int i = 0; i < this.getSizeInventory(); i++) {
if(this.getStackInSlot(i) != null) slots++;
}
return slots;
}
@Override
public ItemStack getStackInSlot(int slot) {
@ -37,9 +53,11 @@ public abstract class EntityRailCarCargo extends EntityRailCarBase implements II
this.slots[slot] = null;
}
if(!this.worldObj.isRemote) this.dataWatcher.updateObject(10, this.countVacantSlots());
return itemstack;
}
} else {
if(!this.worldObj.isRemote) this.dataWatcher.updateObject(10, this.countVacantSlots());
return null;
}
}
@ -49,8 +67,10 @@ public abstract class EntityRailCarCargo extends EntityRailCarBase implements II
if(this.slots[slot] != null) {
ItemStack itemstack = this.slots[slot];
this.slots[slot] = null;
if(!this.worldObj.isRemote) this.dataWatcher.updateObject(10, this.countVacantSlots());
return itemstack;
} else {
if(!this.worldObj.isRemote) this.dataWatcher.updateObject(10, this.countVacantSlots());
return null;
}
}
@ -119,6 +139,8 @@ public abstract class EntityRailCarCargo extends EntityRailCarBase implements II
this.slots[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
}
}
this.dataWatcher.updateObject(10, this.countVacantSlots());
}
@Override

View File

@ -19,15 +19,17 @@ public abstract class EntityRailCarElectric extends EntityRailCarRidable {
public int getChargeSlot() { return 0; }
@Override protected void entityInit() {
super.entityInit();
this.dataWatcher.addObject(3, new Integer(0));
}
@Override public boolean canAccelerate() {
return this.getPower() >= this.getPowerConsumption();
return true;
//return this.getPower() >= this.getPowerConsumption();
}
@Override public void consumeFuel() {
this.setPower(this.getPower() - this.getPowerConsumption());
//this.setPower(this.getPower() - this.getPowerConsumption());
}
public void setPower(int power) {

View File

@ -5,7 +5,6 @@ import java.util.List;
import com.hbm.blocks.ILookOverlay;
import com.hbm.main.MainRegistry;
import com.hbm.util.BobMathUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -109,9 +108,14 @@ public abstract class EntityRailCarRidable extends EntityRailCarCargo {
public int getNearestSeat(EntityPlayer player) {
double nearestDist = Double.POSITIVE_INFINITY;
int nearestSeat = -2;
int nearestSeat = -3;
Vec3[] seats = getPassengerSeats();
Vec3 look = player.getLook(2);
look.xCoord += player.posX;
look.yCoord += player.posY + player.eyeHeight - player.yOffset;
look.zCoord += player.posZ;
for(int i = 0; i < seats.length; i++) {
Vec3 seat = seats[i];
@ -120,13 +124,11 @@ public abstract class EntityRailCarRidable extends EntityRailCarCargo {
seat.rotateAroundY((float) (-this.rotationYaw * Math.PI / 180));
double x = renderX + seat.xCoord;
double y = renderY + seat.yCoord;
double z = renderZ + seat.zCoord;
double deltaX = player.posX - x;
double deltaZ = player.posZ - z;
double radians = -Math.atan2(deltaX, deltaZ);
double degrees = MathHelper.wrapAngleTo180_double(radians * 180D / Math.PI - 90);
double dist = Math.abs(BobMathUtil.angularDifference(degrees, player.rotationYaw));
Vec3 delta = Vec3.createVectorHelper(look.xCoord - x, look.yCoord - y, look.zCoord - z);
double dist = delta.lengthVector();
if(dist < nearestDist) {
nearestDist = dist;
@ -138,13 +140,11 @@ public abstract class EntityRailCarRidable extends EntityRailCarCargo {
Vec3 seat = getRiderSeatPosition();
seat.rotateAroundY((float) (-this.rotationYaw * Math.PI / 180));
double x = renderX + seat.xCoord;
double y = renderY + seat.yCoord;
double z = renderZ + seat.zCoord;
double deltaX = player.posX - x;
double deltaZ = player.posZ - z;
double radians = -Math.atan2(deltaX, deltaZ);
double degrees = MathHelper.wrapAngleTo180_double(radians * 180D / Math.PI - 90);
double dist = Math.abs(BobMathUtil.angularDifference(degrees, player.rotationYaw));
Vec3 delta = Vec3.createVectorHelper(look.xCoord - x, look.yCoord - y, look.zCoord - z);
double dist = delta.lengthVector();
if(dist < nearestDist) {
nearestDist = dist;
@ -288,6 +288,6 @@ public abstract class EntityRailCarRidable extends EntityRailCarCargo {
text.add("Front: " + this.coupledFront);
text.add("Back: " + this.coupledBack);*/
text.add("Nearest seat: " + this.getNearestSeat(MainRegistry.proxy.me()));
ILookOverlay.printGeneric(event, this.toString(), 0xffff00, 0x404000, text);
ILookOverlay.printGeneric(event, this.getClass().getSimpleName() + " " + this.hashCode(), 0xffff00, 0x404000, text);
}
}

View File

@ -105,7 +105,7 @@ public class TrainCargoTramTrailer extends EntityRailCarCargo implements IGUIPro
this.train = train;
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 9; j++) {
this.addSlotToContainer(new Slot(train, i * 7 + j, 8 + j * 18, 18 + i * 18));
this.addSlotToContainer(new Slot(train, i * 9 + j, 8 + j * 18, 18 + i * 18));
}
}
for(int i = 0; i < 3; i++) {

View File

@ -0,0 +1,139 @@
package com.hbm.handler.pollution;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map.Entry;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.event.world.WorldEvent;
public class PollutionHandler {
public static final String fileName = "hbmpollution.dat";
public static HashMap<World, PollutionPerWorld> perWorld = new HashMap();
@SubscribeEvent
public void onWorldLoad(WorldEvent.Load event) {
if(!event.world.isRemote) {
WorldServer world = (WorldServer) event.world;
String dirPath = getDataDir(world);
try {
File pollutionFile = new File(dirPath, fileName);
if(pollutionFile != null) {
if(pollutionFile.exists()) {
FileInputStream io = new FileInputStream(pollutionFile);
NBTTagCompound data = CompressedStreamTools.readCompressed(io);
io.close();
perWorld.put(event.world, new PollutionPerWorld(data));
} else {
perWorld.put(event.world, new PollutionPerWorld());
}
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload event) {
if(!event.world.isRemote) perWorld.remove(event.world);
}
@SubscribeEvent
public void onWorldSave(WorldEvent.Save event) {
if(!event.world.isRemote) {
WorldServer world = (WorldServer) event.world;
String dirPath = getDataDir(world);
try {
File pollutionFile = new File(dirPath, fileName);
if(!pollutionFile.exists()) pollutionFile.createNewFile();
NBTTagCompound data = perWorld.get(world).writeToNBT();
CompressedStreamTools.writeCompressed(data, new FileOutputStream(pollutionFile));
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
public String getDataDir(WorldServer world) {
String dir = world.getSaveHandler().getWorldDirectory().getAbsolutePath();
if(world.provider.dimensionId != 0) {
dir += File.separator + "DIM" + world.provider.dimensionId;
}
dir += File.separator + "data";
return dir;
}
public static class PollutionPerWorld {
public HashMap<ChunkCoordIntPair, PollutionData> pollution = new HashMap();
public PollutionPerWorld() { }
public PollutionPerWorld(NBTTagCompound data) {
NBTTagList list = data.getTagList("entries", 10);
for(int i = 0; i < list.tagCount(); i++) {
NBTTagCompound nbt = list.getCompoundTagAt(i);
int chunkX = nbt.getInteger("chunkX");
int chunkZ = nbt.getInteger("chunkZ");
pollution.put(new ChunkCoordIntPair(chunkX, chunkZ), PollutionData.fromNBT(nbt));
}
}
public NBTTagCompound writeToNBT() {
NBTTagCompound data = new NBTTagCompound();
NBTTagList list = new NBTTagList();
for(Entry<ChunkCoordIntPair, PollutionData> entry : pollution.entrySet()) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setInteger("chunkX", entry.getKey().chunkXPos);
nbt.setInteger("chunkZ", entry.getKey().chunkZPos);
entry.getValue().toNBT(nbt);
list.appendTag(nbt);
}
data.setTag("entries", list);
return data;
}
}
public static class PollutionData {
float soot;
float poison;
float heavyMetal;
public static PollutionData fromNBT(NBTTagCompound nbt) {
PollutionData data = new PollutionData();
data.soot = nbt.getFloat("soot");
data.poison = nbt.getFloat("poison");
data.heavyMetal = nbt.getFloat("heavyMetal");
return data;
}
public void toNBT(NBTTagCompound nbt) {
nbt.setFloat("soot", soot);
nbt.setFloat("poison", poison);
nbt.setFloat("heavyMetal", heavyMetal);
}
}
}

View File

@ -78,7 +78,7 @@ public class ItemTrain extends ItemEnumMulti {
if(train != null && train.getGauge() == ((IRailNTM) b).getGauge(world, x, y, z)) {
if(!world.isRemote) {
train.setPosition(x + fx, y + fy, z + fz);
BlockPos anchor = train.getCurentAnchorPos();
BlockPos anchor = train.getCurrentAnchorPos();
train.rotationYaw = entity.rotationYaw;
Vec3 corePos = train.getRelPosAlongRail(anchor, 0, new MoveContext(RailCheckType.CORE));
train.setPosition(corePos.xCoord, corePos.yCoord, corePos.zCoord);

View File

@ -787,6 +787,7 @@ public class ClientProxy extends ServerProxy {
RenderingRegistry.registerBlockHandler(new RenderNarrowStraightRail());
RenderingRegistry.registerBlockHandler(new RenderNarrowCurveRail());
RenderingRegistry.registerBlockHandler(new RenderStandardStraightRail());
RenderingRegistry.registerBlockHandler(new RenderStandardCurveRail());
RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite));
RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4));

View File

@ -58,6 +58,7 @@ import com.hbm.entity.logic.*;
import com.hbm.entity.mob.siege.*;
import com.hbm.handler.*;
import com.hbm.handler.imc.*;
import com.hbm.handler.pollution.PollutionHandler;
import com.hbm.handler.radiation.ChunkRadiationManager;
import com.hbm.hazard.HazardRegistry;
import com.hbm.inventory.*;
@ -903,6 +904,10 @@ public class MainRegistry {
ChunkRadiationManager radiationSystem = new ChunkRadiationManager();
MinecraftForge.EVENT_BUS.register(radiationSystem);
FMLCommonHandler.instance().bus().register(radiationSystem);
PollutionHandler pollution = new PollutionHandler();
MinecraftForge.EVENT_BUS.register(pollution);
FMLCommonHandler.instance().bus().register(pollution);
if(event.getSide() == Side.CLIENT) {
HbmKeybinds.register();

View File

@ -259,12 +259,12 @@ public class ModEventHandlerClient {
boolean flip = distanceToCover < 0;
if(it == 1) {
Vec3 snap = next = rail.getTravelLocation(world, x, y, z, next.xCoord, next.yCoord, next.zCoord, rot.xCoord, rot.yCoord, rot.zCoord, 0, info);
Vec3 snap = next = rail.getTravelLocation(world, x, y, z, next.xCoord, next.yCoord, next.zCoord, rot.xCoord, rot.yCoord, rot.zCoord, 0, info, new MoveContext(RailCheckType.CORE));
if(i == 0) world.spawnParticle("reddust", snap.xCoord, snap.yCoord + 0.25, snap.zCoord, 0.1, 1, 0.1);
}
Vec3 prev = next;
next = rail.getTravelLocation(world, x, y, z, prev.xCoord, prev.yCoord, prev.zCoord, rot.xCoord, rot.yCoord, rot.zCoord, distanceToCover, info);
next = rail.getTravelLocation(world, x, y, z, prev.xCoord, prev.yCoord, prev.zCoord, rot.xCoord, rot.yCoord, rot.zCoord, distanceToCover, info, new MoveContext(i == 0 ? RailCheckType.FRONT : RailCheckType.BACK));
distanceToCover = info.overshoot;
anchor = info.pos;
if(i == 0) world.spawnParticle("reddust", next.xCoord, next.yCoord + 0.25, next.zCoord, 0, distanceToCover != 0 ? 0.5 : 0, 0);

View File

@ -1332,6 +1332,7 @@ public class ResourceManager {
public static final IModelCustom rail_narrow_straight = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/rail_narrow.obj"));
public static final IModelCustom rail_narrow_curve = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/rail_narrow_bend.obj"));
public static final IModelCustom rail_standard_straight = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/rail_standard.obj"));
public static final IModelCustom rail_standard_curve = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/rail_standard_bend.obj"));
public static final IModelCustom charge_dynamite = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/charge_dynamite.obj"));
public static final IModelCustom charge_c4 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/charge_c4.obj"));

View File

@ -0,0 +1,70 @@
package com.hbm.render.block;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.rail.RailStandardCurve;
import com.hbm.main.ResourceManager;
import com.hbm.render.util.ObjUtil;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.model.obj.WavefrontObject;
public class RenderStandardCurveRail implements ISimpleBlockRenderingHandler {
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
GL11.glPushMatrix();
Tessellator tessellator = Tessellator.instance;
GL11.glScaled(0.2, 0.2, 0.2);
GL11.glTranslated(2.5, -0.0625, -1.5);
GL11.glRotated(90, 0, 1, 0);
tessellator.startDrawingQuads();
ObjUtil.renderWithIcon((WavefrontObject) ResourceManager.rail_standard_curve, block.getIcon(1, 0), tessellator, 0, false);
tessellator.draw();
GL11.glPopMatrix();
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
int meta = world.getBlockMetadata(x, y, z);
if(meta < 12) return true;
Tessellator tessellator = Tessellator.instance;
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tessellator.setColorOpaque_F(1, 1, 1);
float rotation = 0;
if(meta == 15)
rotation = 90F / 180F * (float) Math.PI;
if(meta == 12)
rotation = 180F / 180F * (float) Math.PI;
if(meta == 14)
rotation = 270F / 180F * (float) Math.PI;
tessellator.addTranslation(x + 0.5F, y, z + 0.5F);
ObjUtil.renderWithIcon((WavefrontObject) ResourceManager.rail_standard_curve, block.getIcon(1, 0), tessellator, rotation, true);
tessellator.addTranslation(-x - 0.5F, -y, -z - 0.5F);
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return RailStandardCurve.renderID;
}
}

View File

@ -2,10 +2,15 @@ package com.hbm.render.entity.item;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.ModBlocks;
import com.hbm.main.ResourceManager;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class RenderTrainCargoTramTrailer extends Render {
@ -31,6 +36,76 @@ public class RenderTrainCargoTramTrailer extends Render {
ResourceManager.train_cargo_tram_trailer.renderAll();
GL11.glEnable(GL11.GL_CULL_FACE);
int slots = entity.getDataWatcher().getWatchableObjectInt(10);
if(slots > 0) {
EntityItem dummy = new EntityItem(entity.worldObj, 0, 0, 0, new ItemStack(ModBlocks.crate));
dummy.hoverStart = 0.0F;
RenderItem.renderInFrame = true;
double scale = 2;
GL11.glScaled(scale, scale, scale);
if(slots <= 5) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.375D, 0.0D, 0.0F, 0.0F);
} else if(slots <= 10) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.1D, 0.375D, 0.25D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.1D, 0.375D, -0.25D, 0.0F, 0.0F);
} else if(slots <= 15) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.1D, 0.375D, 0.0D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.1D, 0.375D, 0.375D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.1D, 0.375D, -0.375D, 0.0F, 0.0F);
} else if(slots <= 20) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.3D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, -0.2D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, 0.2D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.3D, 0.0F, 0.0F);
} else if(slots <= 25) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.6D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.0D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, -0.5D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, 0.2D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.3D, 0.0F, 0.0F);
} else if(slots <= 30) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.6D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.0D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, -0.5D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, 0.5D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.1D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.6D, 0.0F, 0.0F);
} else if(slots <= 35) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.4D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.0D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, -0.4D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, 0.3D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.1D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.5D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.6875D, -0.25D, 0.0F, 0.0F);
} else if(slots <= 40) {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.4D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.0D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, -0.4D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, 0.3D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.1D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.5D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.6875D, -0.25D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.6875D, 0.15D, 0.0F, 0.0F);
} else {
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.4D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, 0.0D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.2D, 0.375D, -0.4D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, 0.3D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.1D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.2D, 0.375D, -0.5D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.6875D, -0.25D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, 0.0D, 0.6875D, 0.15D, 0.0F, 0.0F);
RenderManager.instance.renderEntityWithPosYaw(dummy, -0.1D, 0.375D, 0.8D, 0.0F, 0.0F);
}
RenderItem.renderInFrame = false;
}
GL11.glPopMatrix();
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,982 @@
# Blender v2.79 (sub 0) OBJ File: 'rail_standard_curve.blend'
# www.blender.org
o Plane.001
v -1.312500 0.062500 0.500000
v -1.141243 0.062500 -2.858757
v -1.312500 0.187500 0.500000
v -1.141243 0.187500 -2.858757
v -1.097049 0.062500 -2.902951
v -1.097049 0.187500 -2.902951
v -1.250000 0.062500 0.500000
v -1.250000 0.187500 0.500000
v -4.500000 0.062500 -2.687500
v -4.500000 0.062500 -4.312500
v -4.500000 0.187500 -2.687500
v -4.500000 0.187500 -4.312500
v -4.500000 0.062500 -4.250000
v -4.500000 0.187500 -4.250000
v -4.500000 0.062500 -2.750000
v -4.500000 0.187500 -2.750000
v -2.246097 0.062500 -1.753903
v -0.550519 0.187500 -2.138958
v -2.246097 0.187500 -1.753903
v -0.498553 0.187500 -2.173681
v -0.498553 0.062500 -2.173681
v -0.550519 0.062500 -2.138958
v -2.201903 0.062500 -1.798097
v -2.201903 0.187500 -1.798097
v -3.675014 0.062500 -2.578888
v -3.675014 0.187500 -2.578888
v -3.658838 0.062500 -2.639259
v -3.658838 0.187500 -2.639259
v -2.906250 0.062500 -2.260456
v -2.906250 0.187500 -2.260456
v -2.875000 0.062500 -2.314582
v -2.875000 0.187500 -2.314582
v -1.739544 0.062500 -1.093750
v -1.739544 0.187500 -1.093750
v -1.685418 0.062500 -1.125000
v -1.685418 0.187500 -1.125000
v -1.421111 0.062500 -0.324986
v -1.421111 0.187500 -0.324986
v -1.360741 0.062500 -0.341162
v -1.360741 0.187500 -0.341162
v -3.561128 0.187500 -4.220029
v -3.561128 0.062500 -4.220029
v -3.573321 0.187500 -4.158730
v -3.573321 0.062500 -4.158730
v -2.658336 0.187500 -3.946170
v -2.658336 0.062500 -3.946170
v -2.682254 0.187500 -3.888428
v -2.682254 0.062500 -3.888428
v -1.826319 0.187500 -3.501447
v -1.826319 0.062500 -3.501447
v -1.861041 0.187500 -3.449481
v -1.861041 0.062500 -3.449481
v -0.111573 0.062500 -1.317746
v -0.053831 0.062500 -1.341664
v -0.053831 0.187500 -1.341664
v -0.111573 0.187500 -1.317746
v 0.158730 0.062500 -0.426678
v 0.220028 0.062500 -0.438872
v 0.220028 0.187500 -0.438872
v 0.158730 0.187500 -0.426678
v 0.250000 0.062500 0.500000
v 0.312499 0.062500 0.500000
v 0.312499 0.187500 0.500000
v 0.250000 0.187500 0.500000
v -1.501192 0.000000 0.294317
v 0.481698 0.000000 0.033265
v -1.550139 0.000000 -0.077475
v 0.432751 0.000000 -0.338527
v -1.550139 0.062500 -0.077475
v -1.501192 0.062500 0.294317
v 0.481698 0.062500 0.033265
v 0.432751 0.062500 -0.338527
v -1.656608 0.000000 -0.474823
v 0.191151 0.000000 -1.240190
v -1.800115 0.000000 -0.821278
v 0.047645 0.000000 -1.586645
v -1.800115 0.062500 -0.821278
v -1.656608 0.062500 -0.474823
v 0.191151 0.062500 -1.240190
v 0.047645 0.062500 -1.586645
v -2.005797 0.000000 -1.177531
v -0.419090 0.000000 -2.395053
v -2.234083 0.000000 -1.475038
v -0.647376 0.000000 -2.692561
v -2.234083 0.062500 -1.475038
v -2.005797 0.062500 -1.177531
v -0.419090 0.062500 -2.395053
v -0.647376 0.062500 -2.692561
v -2.524962 0.000000 -1.765917
v -1.307439 0.000000 -3.352624
v -2.822469 0.000000 -1.994203
v -1.604947 0.000000 -3.580910
v -2.822469 0.062500 -1.994203
v -2.524962 0.062500 -1.765917
v -1.307439 0.062500 -3.352624
v -1.604947 0.062500 -3.580910
v -3.178722 0.000000 -2.199886
v -2.413356 0.000000 -4.047645
v -3.525177 0.000000 -2.343392
v -2.759810 0.000000 -4.191151
v -3.525177 0.062500 -2.343392
v -3.178722 0.062500 -2.199886
v -2.413356 0.062500 -4.047645
v -2.759810 0.062500 -4.191151
v -3.922526 0.000000 -2.449861
v -3.661473 0.000000 -4.432751
v -4.294317 0.000000 -2.498808
v -4.033265 0.000000 -4.481698
v -4.294317 0.062500 -2.498808
v -3.922526 0.062500 -2.449861
v -3.661473 0.062500 -4.432751
v -4.033265 0.062500 -4.481698
v 0.387101 0.125000 -0.206438
v 0.077275 0.125000 -0.165649
v 0.403417 0.125000 -0.082508
v 0.093590 0.125000 -0.041718
v 0.387101 0.062500 -0.206438
v 0.077275 0.062500 -0.165649
v 0.403417 0.062500 -0.082508
v 0.093590 0.062500 -0.041718
v -1.455542 0.062500 0.162229
v -1.145715 0.062500 0.121439
v -1.471858 0.062500 0.038298
v -1.162031 0.062500 -0.002491
v -1.455542 0.125000 0.162229
v -1.145715 0.125000 0.121439
v -1.471858 0.125000 0.038298
v -1.162031 0.125000 -0.002491
v 0.037737 0.125000 -1.447242
v -0.250975 0.125000 -1.327653
v 0.085573 0.125000 -1.331757
v -0.203139 0.125000 -1.212168
v 0.037737 0.062500 -1.447242
v -0.250975 0.062500 -1.327653
v 0.085573 0.062500 -1.331757
v -0.203139 0.062500 -1.212168
v -1.646701 0.062500 -0.614226
v -1.357989 0.062500 -0.733814
v -1.694537 0.062500 -0.729711
v -1.405824 0.062500 -0.849299
v -1.646701 0.125000 -0.614226
v -1.357989 0.125000 -0.733814
v -1.694537 0.125000 -0.729711
v -1.405824 0.125000 -0.849299
v -0.620866 0.125000 -2.555344
v -0.868788 0.125000 -2.365106
v -0.544770 0.125000 -2.456175
v -0.792693 0.125000 -2.265937
v -0.620866 0.062500 -2.555344
v -0.868788 0.062500 -2.365106
v -0.544770 0.062500 -2.456175
v -0.792693 0.062500 -2.265937
v -2.032308 0.062500 -1.314747
v -1.784385 0.062500 -1.504985
v -2.108403 0.062500 -1.413917
v -1.860480 0.062500 -1.604154
v -2.032308 0.125000 -1.314747
v -1.784385 0.125000 -1.504985
v -2.108403 0.125000 -1.413917
v -1.860480 0.125000 -1.604154
v -1.543825 0.125000 -3.455230
v -1.734063 0.125000 -3.207307
v -1.444656 0.125000 -3.379134
v -1.634893 0.125000 -3.131212
v -1.543825 0.062500 -3.455230
v -1.734063 0.062500 -3.207307
v -1.444656 0.062500 -3.379134
v -1.634893 0.062500 -3.131212
v -2.586083 0.062500 -1.891597
v -2.395845 0.062500 -2.139520
v -2.685253 0.062500 -1.967692
v -2.495015 0.062500 -2.215615
v -2.586083 0.125000 -1.891597
v -2.395845 0.125000 -2.139520
v -2.685253 0.125000 -1.967692
v -2.495015 0.125000 -2.215615
v -2.668243 0.125000 -4.085573
v -2.787832 0.125000 -3.796861
v -2.552758 0.125000 -4.037737
v -2.672346 0.125000 -3.749025
v -2.668243 0.062500 -4.085573
v -2.787832 0.062500 -3.796861
v -2.552758 0.062500 -4.037737
v -2.672346 0.062500 -3.749025
v -3.270289 0.062500 -2.305463
v -3.150701 0.062500 -2.594176
v -3.385775 0.062500 -2.353299
v -3.266186 0.062500 -2.642011
v -3.270289 0.125000 -2.305463
v -3.150701 0.125000 -2.594176
v -3.385775 0.125000 -2.353299
v -3.266186 0.125000 -2.642011
v -3.917492 0.125000 -4.403417
v -3.958282 0.125000 -4.093591
v -3.793562 0.125000 -4.387100
v -3.834351 0.125000 -4.077275
v -3.917492 0.062500 -4.403417
v -3.958282 0.062500 -4.093591
v -3.793562 0.062500 -4.387100
v -3.834351 0.062500 -4.077275
v -4.038298 0.062500 -2.528142
v -3.997509 0.062500 -2.837969
v -4.162229 0.062500 -2.544458
v -4.121440 0.062500 -2.854284
v -4.038298 0.125000 -2.528142
v -3.997509 0.125000 -2.837969
v -4.162229 0.125000 -2.544458
v -4.121440 0.125000 -2.854284
vt 0.500000 0.656250
vt 0.437500 0.156250
vt 0.500000 0.156250
vt 0.500000 0.656250
vt 0.531250 0.718750
vt 0.531250 0.656250
vt 0.500000 0.656250
vt 0.531250 0.718750
vt 0.500000 0.718750
vt 0.531250 0.718750
vt 0.500000 0.656250
vt 0.531250 0.656250
vt 0.500000 0.656250
vt 0.437500 0.156250
vt 0.500000 0.156250
vt 0.437500 0.156250
vt 0.406250 0.656250
vt 0.437500 0.656250
vt 0.437500 0.156250
vt 0.406250 0.656250
vt 0.437500 0.656250
vt 0.593750 0.156250
vt 0.531250 0.656250
vt 0.593750 0.656250
vt 0.500000 0.156250
vt 0.500000 0.656250
vt 0.437500 0.156250
vt 0.406250 0.656250
vt 0.437500 0.656250
vt 0.437500 0.156250
vt 0.406250 0.656250
vt 0.437500 0.656250
vt 0.500000 0.156250
vt 0.500000 0.656250
vt 0.531250 0.156250
vt 0.531250 0.656250
vt 0.593750 0.156250
vt 0.593750 0.656250
vt 0.500000 0.656250
vt 0.500000 0.156250
vt 0.531250 0.656250
vt 0.531250 0.156250
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.406250 0.656250
vt 0.437500 0.656250
vt 0.500000 0.156250
vt 0.500000 0.656250
vt 0.593750 0.156250
vt 0.531250 0.656250
vt 0.593750 0.656250
vt 0.437500 0.156250
vt 0.500000 0.656250
vt 0.500000 0.156250
vt 0.500000 0.156250
vt 0.500000 0.656250
vt 0.531250 0.656250
vt 0.593750 0.156250
vt 0.593750 0.656250
vt 0.531250 0.656250
vt 0.531250 0.156250
vt 0.593750 0.156250
vt 0.406250 0.156250
vt 0.437500 0.656250
vt 0.531250 0.156250
vt 0.500000 0.656250
vt 0.500000 0.156250
vt 0.531250 0.156250
vt 0.500000 0.656250
vt 0.500000 0.156250
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.437500 0.156250
vt 0.593750 0.656250
vt 0.593750 0.156250
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.437500 0.156250
vt 0.437500 0.156250
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.593750 0.656250
vt 0.593750 0.156250
vt 0.531250 0.156250
vt 0.593750 0.656250
vt 0.531250 0.156250
vt 0.593750 0.156250
vt 0.500000 0.656250
vt 0.500000 0.156250
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.593750 0.656250
vt 0.593750 0.156250
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.437500 0.156250
vt 0.531250 0.156250
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.593750 0.656250
vt 0.593750 0.156250
vt 0.500000 0.656250
vt 0.437500 0.156250
vt 0.500000 0.156250
vt 0.500000 0.656250
vt 0.500000 0.156250
vt 0.531250 0.156250
vt 0.593750 0.656250
vt 0.593750 0.156250
vt 0.593750 0.656250
vt 0.531250 0.156250
vt 0.593750 0.156250
vt 0.531250 0.156250
vt 0.593750 0.656250
vt 0.593750 0.156250
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.531250 0.718750
vt 0.500000 0.656250
vt 0.500000 0.718750
vt 0.437500 0.656250
vt 0.406250 0.156250
vt 0.437500 0.156250
vt 0.500000 0.656250
vt 0.500000 0.156250
vt 0.218750 1.000000
vt 0.406250 0.000000
vt 0.406250 1.000000
vt -0.000000 0.000000
vt 0.187500 1.000000
vt -0.000000 1.000000
vt 0.406250 0.031250
vt 0.593750 -0.000000
vt 0.593750 0.031250
vt 0.218750 1.000000
vt 0.187500 -0.000000
vt 0.218750 -0.000000
vt 0.593750 -0.000000
vt 0.406250 0.031250
vt 0.187500 0.000000
vt 0.218750 0.000000
vt 0.218750 1.000000
vt 0.406250 0.000000
vt 0.406250 1.000000
vt -0.000000 0.000000
vt 0.187500 1.000000
vt -0.000000 1.000000
vt 0.406250 0.031250
vt 0.593750 -0.000000
vt 0.593750 0.031250
vt 0.218750 1.000000
vt 0.187500 -0.000000
vt 0.218750 -0.000000
vt 0.593750 -0.000000
vt 0.406250 0.031250
vt 0.187500 0.000000
vt 0.218750 0.000000
vt 0.406250 1.000000
vt 0.218750 0.000000
vt 0.406250 0.000000
vt -0.000000 0.000000
vt 0.187500 1.000000
vt -0.000000 1.000000
vt 0.406250 0.031250
vt 0.593750 -0.000000
vt 0.593750 0.031250
vt 0.218750 1.000000
vt 0.187500 -0.000000
vt 0.218750 -0.000000
vt 0.593750 -0.000000
vt 0.406250 0.031250
vt 0.218750 1.000000
vt 0.187500 0.000000
vt 0.218750 1.000000
vt 0.406250 0.000000
vt 0.406250 1.000000
vt -0.000000 0.000000
vt 0.187500 1.000000
vt -0.000000 1.000000
vt 0.406250 0.031250
vt 0.593750 -0.000000
vt 0.593750 0.031250
vt 0.218750 1.000000
vt 0.187500 -0.000000
vt 0.218750 -0.000000
vt 0.593750 -0.000000
vt 0.406250 0.031250
vt 0.187500 0.000000
vt 0.218750 0.000000
vt 0.406250 1.000000
vt 0.218750 0.000000
vt 0.406250 0.000000
vt -0.000000 1.000000
vt 0.187500 0.000000
vt 0.187500 1.000000
vt 0.406250 0.031250
vt 0.593750 -0.000000
vt 0.593750 0.031250
vt 0.218750 1.000000
vt 0.187500 -0.000000
vt 0.218750 -0.000000
vt 0.593750 -0.000000
vt 0.406250 0.031250
vt 0.218750 1.000000
vt 0.218750 1.000000
vt 0.406250 0.000000
vt 0.406250 1.000000
vt -0.000000 0.000000
vt 0.187500 1.000000
vt -0.000000 1.000000
vt 0.406250 0.031250
vt 0.593750 -0.000000
vt 0.593750 0.031250
vt 0.218750 1.000000
vt 0.187500 -0.000000
vt 0.218750 -0.000000
vt 0.593750 -0.000000
vt 0.406250 0.031250
vt 0.187500 0.000000
vt 0.218750 0.000000
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.062500
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.593750 0.062500
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.062500
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.593750 0.062500
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.062500
vt 0.593750 0.125000
vt 0.437500 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.593750 0.062500
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.593750 0.062500
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.062500
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.593750 0.062500
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.062500
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.593750 0.062500
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.062500
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.437500 0.062500
vt 0.406250 0.125000
vt 0.406250 0.062500
vt 0.437500 0.125000
vt 0.593750 0.156250
vt 0.437500 0.156250
vt 0.593750 0.062500
vt 0.437500 0.031250
vt 0.593750 0.031250
vt 0.593750 0.125000
vt 0.625000 0.062500
vt 0.625000 0.125000
vt 0.500000 0.718750
vt 0.531250 0.656250
vt 0.500000 0.718750
vt 0.406250 0.156250
vt 0.406250 0.156250
vt 0.531250 0.156250
vt 0.406250 0.156250
vt 0.406250 0.156250
vt 0.593750 0.656250
vt 0.406250 0.156250
vt 0.531250 0.156250
vt 0.531250 0.156250
vt 0.593750 0.656250
vt 0.406250 0.656250
vt 0.531250 0.656250
vt 0.531250 0.656250
vt 0.406250 0.656250
vt 0.406250 0.656250
vt 0.406250 0.656250
vt 0.531250 0.656250
vt 0.531250 0.656250
vt 0.406250 0.656250
vt 0.406250 0.656250
vt 0.531250 0.656250
vt 0.406250 0.656250
vt 0.531250 0.656250
vt 0.531250 0.656250
vt 0.531250 0.656250
vt 0.406250 0.656250
vt 0.531250 0.656250
vt 0.406250 0.656250
vt 0.406250 -0.000000
vt 0.187500 1.000000
vt 0.593750 0.031250
vt 0.406250 -0.000000
vt 0.187500 1.000000
vt 0.593750 0.031250
vt 0.406250 -0.000000
vt 0.187500 1.000000
vt 0.593750 0.031250
vt 0.406250 -0.000000
vt 0.187500 1.000000
vt 0.593750 0.031250
vt -0.000000 0.000000
vt 0.406250 -0.000000
vt 0.187500 1.000000
vt 0.593750 0.031250
vt 0.406250 -0.000000
vt 0.187500 1.000000
vt 0.593750 0.031250
vn 0.7730 0.0000 -0.6344
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.6344 0.0000 -0.7730
vn 0.0000 -1.0000 0.0000
vn -0.1305 0.0000 0.9914
vn 0.0000 1.0000 0.0000
vn 0.1305 0.0000 -0.9914
vn 0.3827 0.0000 -0.9239
vn -0.3827 0.0000 0.9239
vn 0.6088 0.0000 -0.7934
vn -0.6088 0.0000 0.7934
vn 0.7934 0.0000 -0.6088
vn -0.7934 0.0000 0.6088
vn 0.9914 0.0000 -0.1305
vn 0.9239 0.0000 -0.3827
vn -0.9239 0.0000 0.3827
vn -0.9914 0.0000 0.1305
vn -0.0980 0.0000 0.9952
vn 0.0980 0.0000 -0.9952
vn 0.2903 0.0000 -0.9569
vn -0.2903 0.0000 0.9569
vn -0.4714 0.0000 0.8819
vn 0.4714 0.0000 -0.8819
vn -0.6344 0.0000 0.7730
vn -0.7730 0.0000 0.6344
vn 0.9569 0.0000 -0.2903
vn 0.8819 0.0000 -0.4714
vn -0.8819 0.0000 0.4714
vn -0.9952 0.0000 0.0980
vn -0.9569 0.0000 0.2903
vn 0.9952 0.0000 -0.0980
vn 0.1305 0.0000 0.9914
vn -0.1305 0.0000 -0.9914
vn 0.3827 0.0000 0.9239
vn -0.3827 0.0000 -0.9239
vn 0.6088 0.0000 0.7934
vn -0.6088 0.0000 -0.7934
vn 0.7934 0.0000 0.6088
vn -0.7934 0.0000 -0.6088
vn 0.9239 0.0000 0.3827
vn -0.9239 0.0000 -0.3827
vn 0.9914 0.0000 0.1305
vn -0.9914 0.0000 -0.1305
s off
f 20/1/1 5/2/1 6/3/1
f 7/4/2 3/5/2 1/6/2
f 10/7/3 14/8/3 12/9/3
f 11/10/3 15/11/3 9/12/3
f 6/13/4 50/14/4 49/15/4
f 35/16/5 17/17/5 23/18/5
f 31/19/5 25/20/5 27/21/5
f 25/22/6 11/23/6 9/24/6
f 11/23/7 28/25/7 16/26/7
f 27/27/5 9/28/5 15/29/5
f 28/25/8 15/29/8 16/26/8
f 23/30/5 29/31/5 31/32/5
f 32/33/9 27/21/9 28/34/9
f 30/35/7 28/34/7 26/36/7
f 29/37/10 26/36/10 25/38/10
f 23/30/11 32/39/11 24/40/11
f 24/40/7 30/41/7 19/42/7
f 30/41/12 17/43/12 19/42/12
f 39/44/5 33/45/5 35/46/5
f 36/47/13 23/18/13 24/48/13
f 33/49/14 19/50/14 17/51/14
f 19/50/7 36/47/7 24/48/7
f 7/52/15 40/53/15 8/54/15
f 40/55/16 35/46/16 36/56/16
f 34/57/7 40/55/7 36/56/7
f 37/58/17 34/57/17 33/59/17
f 8/54/7 38/60/7 3/61/7
f 38/60/18 1/62/18 3/61/18
f 1/63/5 39/64/5 7/52/5
f 43/65/7 45/66/7 41/67/7
f 14/68/7 41/69/7 12/70/7
f 42/71/5 13/72/5 10/73/5
f 44/74/19 14/68/19 13/75/19
f 41/69/20 10/73/20 12/70/20
f 50/76/5 48/77/5 46/78/5
f 45/66/21 42/79/21 41/67/21
f 46/80/5 44/81/5 42/79/5
f 48/82/22 43/65/22 44/83/22
f 51/84/7 6/13/7 49/15/7
f 52/85/23 47/86/23 48/87/23
f 47/86/7 49/88/7 45/89/7
f 49/88/24 46/78/24 45/89/24
f 5/90/5 52/91/5 50/14/5
f 2/92/25 51/84/25 52/93/25
f 54/94/5 22/95/5 21/96/5
f 4/97/7 20/1/7 6/3/7
f 21/98/5 2/99/5 5/2/5
f 22/100/26 4/97/26 2/101/26
f 59/102/27 54/103/27 55/104/27
f 55/105/28 21/96/28 20/106/28
f 18/107/7 55/105/7 20/106/7
f 53/108/29 18/107/29 22/109/29
f 61/110/30 60/111/30 57/112/30
f 56/113/7 59/102/7 55/104/7
f 57/114/31 56/113/31 53/115/31
f 58/116/5 53/117/5 54/103/5
f 64/118/2 62/119/2 63/120/2
f 62/121/5 57/122/5 58/123/5
f 63/124/32 58/123/32 59/125/32
f 60/111/7 63/124/7 59/125/7
f 67/126/5 66/127/5 65/128/5
f 71/129/7 69/130/7 70/131/7
f 65/132/18 69/133/18 67/134/18
f 66/135/33 70/136/33 65/137/33
f 68/138/15 71/139/15 66/127/15
f 67/126/34 72/140/34 68/141/34
f 75/142/5 74/143/5 73/144/5
f 79/145/7 77/146/7 78/147/7
f 73/148/17 77/149/17 75/150/17
f 74/151/35 78/152/35 73/153/35
f 76/154/16 79/155/16 74/143/16
f 75/142/36 80/156/36 76/157/36
f 81/158/5 84/159/5 82/160/5
f 87/161/7 85/162/7 86/163/7
f 81/164/14 85/165/14 83/166/14
f 82/167/37 86/168/37 81/169/37
f 84/170/13 87/171/13 82/160/13
f 83/172/38 88/173/38 84/159/38
f 91/174/5 90/175/5 89/176/5
f 95/177/7 93/178/7 94/179/7
f 89/180/12 93/181/12 91/182/12
f 90/183/39 94/184/39 89/185/39
f 92/186/11 95/187/11 90/175/11
f 91/174/40 96/188/40 92/189/40
f 97/190/5 100/191/5 98/192/5
f 102/193/7 104/194/7 101/195/7
f 97/196/10 101/197/10 99/198/10
f 98/199/41 102/200/41 97/201/41
f 100/202/9 103/203/9 98/192/9
f 99/204/42 104/194/42 100/191/42
f 107/205/5 106/206/5 105/207/5
f 111/208/7 109/209/7 110/210/7
f 105/211/6 109/212/6 107/213/6
f 106/214/43 110/215/43 105/216/43
f 108/217/8 111/218/8 106/206/8
f 107/205/44 112/219/44 108/220/44
f 125/221/18 123/222/18 121/223/18
f 114/224/7 115/225/7 113/226/7
f 113/226/15 119/227/15 117/228/15
f 115/225/33 120/229/33 119/230/33
f 114/224/34 117/231/34 118/232/34
f 116/233/18 118/234/18 120/235/18
f 127/236/34 124/237/34 123/238/34
f 126/239/33 121/240/33 122/241/33
f 128/242/15 122/243/15 124/244/15
f 125/221/7 128/242/7 127/236/7
f 141/245/17 139/246/17 137/247/17
f 130/248/7 131/249/7 129/250/7
f 129/250/16 135/251/16 133/252/16
f 131/249/35 136/253/35 135/254/35
f 130/248/36 133/255/36 134/256/36
f 132/257/17 134/258/17 136/259/17
f 143/260/36 140/261/36 139/262/36
f 142/263/35 137/264/35 138/265/35
f 144/266/16 138/267/16 140/268/16
f 141/245/7 144/266/7 143/260/7
f 157/269/14 155/270/14 153/271/14
f 148/272/7 145/273/7 146/274/7
f 145/273/13 151/275/13 149/276/13
f 147/277/37 152/278/37 151/279/37
f 146/274/38 149/280/38 150/281/38
f 148/272/14 150/282/14 152/283/14
f 159/284/38 156/285/38 155/286/38
f 158/287/37 153/288/37 154/289/37
f 160/290/13 154/291/13 156/292/13
f 157/269/7 160/290/7 159/284/7
f 173/293/12 171/294/12 169/295/12
f 162/296/7 163/297/7 161/298/7
f 161/298/11 167/299/11 165/300/11
f 163/297/39 168/301/39 167/302/39
f 162/296/40 165/303/40 166/304/40
f 164/305/12 166/306/12 168/307/12
f 175/308/40 172/309/40 171/310/40
f 174/311/39 169/312/39 170/313/39
f 176/314/11 170/315/11 172/316/11
f 173/293/7 176/314/7 175/308/7
f 189/317/10 187/318/10 185/319/10
f 178/320/7 179/321/7 177/322/7
f 177/322/9 183/323/9 181/324/9
f 179/321/41 184/325/41 183/326/41
f 178/320/42 181/327/42 182/328/42
f 180/329/10 182/330/10 184/331/10
f 191/332/42 188/333/42 187/334/42
f 190/335/41 185/336/41 186/337/41
f 192/338/9 186/339/9 188/340/9
f 191/332/7 190/335/7 192/338/7
f 205/341/6 203/342/6 201/343/6
f 194/344/7 195/345/7 193/346/7
f 193/346/8 199/347/8 197/348/8
f 195/345/43 200/349/43 199/350/43
f 194/344/44 197/351/44 198/352/44
f 196/353/6 198/354/6 200/355/6
f 207/356/44 204/357/44 203/358/44
f 206/359/43 201/360/43 202/361/43
f 208/362/8 202/363/8 204/364/8
f 207/356/7 206/359/7 208/362/7
f 20/1/1 21/98/1 5/2/1
f 7/4/2 8/365/2 3/5/2
f 10/7/3 13/366/3 14/8/3
f 11/10/3 16/367/3 15/11/3
f 6/13/4 5/90/4 50/14/4
f 35/16/5 33/368/5 17/17/5
f 31/19/5 29/369/5 25/20/5
f 25/22/6 26/370/6 11/23/6
f 11/23/7 26/370/7 28/25/7
f 27/27/5 25/371/5 9/28/5
f 28/25/8 27/27/8 15/29/8
f 23/30/5 17/372/5 29/31/5
f 32/33/9 31/19/9 27/21/9
f 30/35/7 32/33/7 28/34/7
f 29/37/10 30/35/10 26/36/10
f 23/30/11 31/32/11 32/39/11
f 24/40/7 32/39/7 30/41/7
f 30/41/12 29/373/12 17/43/12
f 39/44/5 37/374/5 33/45/5
f 36/47/13 35/16/13 23/18/13
f 33/49/14 34/375/14 19/50/14
f 19/50/7 34/375/7 36/47/7
f 7/52/15 39/64/15 40/53/15
f 40/55/16 39/44/16 35/46/16
f 34/57/7 38/376/7 40/55/7
f 37/58/17 38/376/17 34/57/17
f 8/54/7 40/53/7 38/60/7
f 38/60/18 37/377/18 1/62/18
f 1/63/5 37/378/5 39/64/5
f 43/65/7 47/379/7 45/66/7
f 14/68/7 43/380/7 41/69/7
f 42/71/5 44/381/5 13/72/5
f 44/74/19 43/380/19 14/68/19
f 41/69/20 42/71/20 10/73/20
f 50/76/5 52/382/5 48/77/5
f 45/66/21 46/80/21 42/79/21
f 46/80/5 48/383/5 44/81/5
f 48/82/22 47/379/22 43/65/22
f 51/84/7 4/384/7 6/13/7
f 52/85/23 51/385/23 47/86/23
f 47/86/7 51/385/7 49/88/7
f 49/88/24 50/76/24 46/78/24
f 5/90/5 2/386/5 52/91/5
f 2/92/25 4/384/25 51/84/25
f 54/94/5 53/387/5 22/95/5
f 4/97/7 18/388/7 20/1/7
f 21/98/5 22/389/5 2/99/5
f 22/100/26 18/388/26 4/97/26
f 59/102/27 58/116/27 54/103/27
f 55/105/28 54/94/28 21/96/28
f 18/107/7 56/390/7 55/105/7
f 53/108/29 56/390/29 18/107/29
f 61/110/30 64/391/30 60/111/30
f 56/113/7 60/392/7 59/102/7
f 57/114/31 60/392/31 56/113/31
f 58/116/5 57/393/5 53/117/5
f 64/118/2 61/394/2 62/119/2
f 62/121/5 61/395/5 57/122/5
f 63/124/32 62/121/32 58/123/32
f 60/111/7 64/391/7 63/124/7
f 67/126/5 68/141/5 66/127/5
f 71/129/7 72/140/7 69/130/7
f 65/132/18 70/396/18 69/133/18
f 66/135/33 71/397/33 70/136/33
f 68/138/15 72/398/15 71/139/15
f 67/126/34 69/130/34 72/140/34
f 75/142/5 76/157/5 74/143/5
f 79/145/7 80/156/7 77/146/7
f 73/148/17 78/399/17 77/149/17
f 74/151/35 79/400/35 78/152/35
f 76/154/16 80/401/16 79/155/16
f 75/142/36 77/146/36 80/156/36
f 81/158/5 83/172/5 84/159/5
f 87/161/7 88/173/7 85/162/7
f 81/164/14 86/402/14 85/165/14
f 82/167/37 87/403/37 86/168/37
f 84/170/13 88/404/13 87/171/13
f 83/172/38 85/162/38 88/173/38
f 91/174/5 92/189/5 90/175/5
f 95/177/7 96/188/7 93/178/7
f 89/180/12 94/405/12 93/181/12
f 90/183/39 95/406/39 94/184/39
f 92/186/11 96/407/11 95/187/11
f 91/174/40 93/178/40 96/188/40
f 97/190/5 99/204/5 100/191/5
f 102/193/7 103/408/7 104/194/7
f 97/196/10 102/409/10 101/197/10
f 98/199/41 103/410/41 102/200/41
f 100/202/9 104/411/9 103/203/9
f 99/204/42 101/195/42 104/194/42
f 107/205/5 108/220/5 106/206/5
f 111/208/7 112/219/7 109/209/7
f 105/211/6 110/412/6 109/212/6
f 106/214/43 111/413/43 110/215/43
f 108/217/8 112/414/8 111/218/8
f 107/205/44 109/209/44 112/219/44
f 125/221/18 127/236/18 123/222/18
f 114/224/7 116/233/7 115/225/7
f 113/226/15 115/225/15 119/227/15
f 115/225/33 116/233/33 120/229/33
f 114/224/34 113/226/34 117/231/34
f 116/233/18 114/224/18 118/234/18
f 127/236/34 128/242/34 124/237/34
f 126/239/33 125/221/33 121/240/33
f 128/242/15 126/239/15 122/243/15
f 125/221/7 126/239/7 128/242/7
f 141/245/17 143/260/17 139/246/17
f 130/248/7 132/257/7 131/249/7
f 129/250/16 131/249/16 135/251/16
f 131/249/35 132/257/35 136/253/35
f 130/248/36 129/250/36 133/255/36
f 132/257/17 130/248/17 134/258/17
f 143/260/36 144/266/36 140/261/36
f 142/263/35 141/245/35 137/264/35
f 144/266/16 142/263/16 138/267/16
f 141/245/7 142/263/7 144/266/7
f 157/269/14 159/284/14 155/270/14
f 148/272/7 147/277/7 145/273/7
f 145/273/13 147/277/13 151/275/13
f 147/277/37 148/272/37 152/278/37
f 146/274/38 145/273/38 149/280/38
f 148/272/14 146/274/14 150/282/14
f 159/284/38 160/290/38 156/285/38
f 158/287/37 157/269/37 153/288/37
f 160/290/13 158/287/13 154/291/13
f 157/269/7 158/287/7 160/290/7
f 173/293/12 175/308/12 171/294/12
f 162/296/7 164/305/7 163/297/7
f 161/298/11 163/297/11 167/299/11
f 163/297/39 164/305/39 168/301/39
f 162/296/40 161/298/40 165/303/40
f 164/305/12 162/296/12 166/306/12
f 175/308/40 176/314/40 172/309/40
f 174/311/39 173/293/39 169/312/39
f 176/314/11 174/311/11 170/315/11
f 173/293/7 174/311/7 176/314/7
f 189/317/10 191/332/10 187/318/10
f 178/320/7 180/329/7 179/321/7
f 177/322/9 179/321/9 183/323/9
f 179/321/41 180/329/41 184/325/41
f 178/320/42 177/322/42 181/327/42
f 180/329/10 178/320/10 182/330/10
f 191/332/42 192/338/42 188/333/42
f 190/335/41 189/317/41 185/336/41
f 192/338/9 190/335/9 186/339/9
f 191/332/7 189/317/7 190/335/7
f 205/341/6 207/356/6 203/342/6
f 194/344/7 196/353/7 195/345/7
f 193/346/8 195/345/8 199/347/8
f 195/345/43 196/353/43 200/349/43
f 194/344/44 193/346/44 197/351/44
f 196/353/6 194/344/6 198/354/6
f 207/356/44 208/362/44 204/357/44
f 206/359/43 205/341/43 201/360/43
f 208/362/8 206/359/8 202/363/8
f 207/356/7 205/341/7 206/359/7

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 B

After

Width:  |  Height:  |  Size: 204 B