Merge pull request #24 from Silent-Client/TEST2

New Model
This commit is contained in:
kirillsaint 2023-08-18 17:35:17 +06:00 committed by GitHub
commit 62d03543c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 370 additions and 90 deletions

View File

@ -1,17 +1,6 @@
package net.silentclient.client.admin; package net.silentclient.client.admin;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.text.DecimalFormat;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.silentclient.client.cosmetics.StaticResourceLocation;
import net.silentclient.client.mixin.ducks.AbstractClientPlayerExt;
import org.lwjgl.Sys;
import org.lwjgl.input.Mouse;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.util.MathHelper; import net.minecraft.util.MathHelper;
@ -20,15 +9,25 @@ import net.minecraft.util.Util;
import net.silentclient.client.Client; import net.silentclient.client.Client;
import net.silentclient.client.cosmetics.AnimatedResourceLocation; import net.silentclient.client.cosmetics.AnimatedResourceLocation;
import net.silentclient.client.cosmetics.ShieldData; import net.silentclient.client.cosmetics.ShieldData;
import net.silentclient.client.cosmetics.StaticResourceLocation;
import net.silentclient.client.cosmetics.gui.CosmeticsGui; import net.silentclient.client.cosmetics.gui.CosmeticsGui;
import net.silentclient.client.gui.elements.StaticButton;
import net.silentclient.client.gui.lite.clickgui.utils.GlUtils; import net.silentclient.client.gui.lite.clickgui.utils.GlUtils;
import net.silentclient.client.gui.lite.clickgui.utils.MouseUtils; import net.silentclient.client.gui.lite.clickgui.utils.MouseUtils;
import net.silentclient.client.gui.lite.clickgui.utils.RenderUtils; import net.silentclient.client.gui.lite.clickgui.utils.RenderUtils;
import net.silentclient.client.gui.elements.StaticButton; import net.silentclient.client.mixin.ducks.AbstractClientPlayerExt;
import net.silentclient.client.mods.CustomFontRenderer; import net.silentclient.client.mods.CustomFontRenderer;
import net.silentclient.client.mods.CustomFontRenderer.RenderMode; import net.silentclient.client.mods.CustomFontRenderer.RenderMode;
import net.silentclient.client.utils.FileUtils; import net.silentclient.client.utils.FileUtils;
import net.silentclient.client.utils.Players; import net.silentclient.client.utils.Players;
import org.lwjgl.Sys;
import org.lwjgl.input.Mouse;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.text.DecimalFormat;
public class AdminRender extends GuiScreen { public class AdminRender extends GuiScreen {
public static File adminRenderPath = new File(Client.getInstance().configDir, "admin-render"); public static File adminRenderPath = new File(Client.getInstance().configDir, "admin-render");

View File

@ -59,79 +59,77 @@ public class Cosmetics {
} }
Client.logger.info("STARTING > cosmeitcs > default_icon"); Client.logger.info("STARTING > cosmeitcs > default_icon");
defaultIcon = new StaticResourceLocation("silentclient/icons/player_icon.png"); defaultIcon = new StaticResourceLocation("silentclient/icons/player_icon.png");
if(!Client.getInstance().isDebug()) { PlayerResponse.Account.Cosmetics allCosmetics = getAllCosmetics();
PlayerResponse.Account.Cosmetics allCosmetics = getAllCosmetics(); Client.logger.info("STARTING > cosmeitcs > capes");
Client.logger.info("STARTING > cosmeitcs > capes"); capes.clear();
capes.clear(); capesShoulders.clear();
capesShoulders.clear();
if(allCosmetics != null && allCosmetics.getCapes() != null) { if(allCosmetics != null && allCosmetics.getCapes() != null) {
allCosmetics.getCapes().forEach((cape) -> { allCosmetics.getCapes().forEach((cape) -> {
capes.put(cape.getId(), new AnimatedResourceLocation("silentclient/cosmetics/capes/"+cape.getId(), cape.getFrames(), cape.getFrameDelay(), false, cape.getId() == Client.getInstance().getAccount().getSelectedCape())); capes.put(cape.getId(), new AnimatedResourceLocation("silentclient/cosmetics/capes/"+cape.getId(), cape.getFrames(), cape.getFrameDelay(), false, cape.getId() == Client.getInstance().getAccount().getSelectedCape()));
capesShoulders.put(cape.getId(), new StaticResourceLocation("silentclient/cosmetics/capes/"+cape.getId()+"/shoulders.png")); capesShoulders.put(cape.getId(), new StaticResourceLocation("silentclient/cosmetics/capes/"+cape.getId()+"/shoulders.png"));
}); });
} }
Client.logger.info("STARTING > cosmeitcs > wings"); Client.logger.info("STARTING > cosmeitcs > wings");
wings.clear(); wings.clear();
if(allCosmetics != null && allCosmetics.getWings() != null) { if(allCosmetics != null && allCosmetics.getWings() != null) {
allCosmetics.getWings().forEach((wing) -> { allCosmetics.getWings().forEach((wing) -> {
wings.put(wing.getId(), new AnimatedResourceLocation("silentclient/cosmetics/wings/"+ wing.getId(), wing.getFrames(), wing.getFrameDelay(), false, wing.getId() == Client.getInstance().getAccount().getSelectedWings())); wings.put(wing.getId(), new AnimatedResourceLocation("silentclient/cosmetics/wings/"+ wing.getId(), wing.getFrames(), wing.getFrameDelay(), false, wing.getId() == Client.getInstance().getAccount().getSelectedWings()));
}); });
} }
Client.logger.info("STARTING > cosmeitcs > bandanas"); Client.logger.info("STARTING > cosmeitcs > bandanas");
bandanas.clear(); bandanas.clear();
if(allCosmetics != null && allCosmetics.getBandanas() != null) { if(allCosmetics != null && allCosmetics.getBandanas() != null) {
allCosmetics.getBandanas().forEach((bandana) -> { allCosmetics.getBandanas().forEach((bandana) -> {
bandanas.put(bandana.getId(), new AnimatedResourceLocation("silentclient/cosmetics/bandanas/"+bandana.getId(), bandana.getFrames(), bandana.getFrameDelay(), false, bandana.getId() == Client.getInstance().getAccount().getSelectedBandana())); bandanas.put(bandana.getId(), new AnimatedResourceLocation("silentclient/cosmetics/bandanas/"+bandana.getId(), bandana.getFrames(), bandana.getFrameDelay(), false, bandana.getId() == Client.getInstance().getAccount().getSelectedBandana()));
}); });
} }
Client.logger.info("STARTING > cosmeitcs > hats"); Client.logger.info("STARTING > cosmeitcs > hats");
hats.clear(); hats.clear();
if(allCosmetics != null && allCosmetics.getHats() != null) { if(allCosmetics != null && allCosmetics.getHats() != null) {
allCosmetics.getHats().forEach((hat) -> { allCosmetics.getHats().forEach((hat) -> {
hats.put(hat.getId(), new HatData(new AnimatedResourceLocation("silentclient/cosmetics/hats/"+hat.getId(), hat.getFrames(), hat.getFrameDelay(), false, hat.getId() == Client.getInstance().getAccount().getSelectedHat()), hat.getModel())); hats.put(hat.getId(), new HatData(new AnimatedResourceLocation("silentclient/cosmetics/hats/"+hat.getId(), hat.getFrames(), hat.getFrameDelay(), false, hat.getId() == Client.getInstance().getAccount().getSelectedHat()), hat.getModel()));
if(!hatModels.containsKey(hat.getModel())) { if(!hatModels.containsKey(hat.getModel())) {
try { try {
Client.logger.info("STARTING > cosmeitcs > hats > model > " + hat.getModel()); Client.logger.info("STARTING > cosmeitcs > hats > model > " + hat.getModel());
ModelBuffer model = new ModelBuffer(new ResourceLocation("silentclient/models/"+ hat.getModel() + ".obj")); ModelBuffer model = new ModelBuffer(new ResourceLocation("silentclient/models/"+ hat.getModel() + ".obj"));
if(model != null) { if(model != null) {
hatModels.put(hat.getModel(), model); hatModels.put(hat.getModel(), model);
}
} catch (Exception e) {
e.printStackTrace();
} }
} catch (Exception e) {
e.printStackTrace();
} }
}); }
} });
Client.logger.info("STARTING > cosmeitcs > shields"); }
shields.clear(); Client.logger.info("STARTING > cosmeitcs > shields");
if(allCosmetics != null && allCosmetics.getShields() != null) { shields.clear();
allCosmetics.getShields().forEach((shield) -> { if(allCosmetics != null && allCosmetics.getShields() != null) {
shields.put(shield.getId(), new ShieldData(new AnimatedResourceLocation("silentclient/cosmetics/shields/"+shield.getId(), shield.getFrames(), shield.getFrameDelay(), false, shield.getId() == Client.getInstance().getAccount().getSelectedShield()), shield.getModel())); allCosmetics.getShields().forEach((shield) -> {
if(!hatModels.containsKey(shield.getModel())) { shields.put(shield.getId(), new ShieldData(new AnimatedResourceLocation("silentclient/cosmetics/shields/"+shield.getId(), shield.getFrames(), shield.getFrameDelay(), false, shield.getId() == Client.getInstance().getAccount().getSelectedShield()), shield.getModel()));
try { if(!hatModels.containsKey(shield.getModel())) {
Client.logger.info("STARTING > cosmeitcs > shields > model > " + shield.getModel()); try {
ModelBuffer model = new ModelBuffer(new ResourceLocation("silentclient/models/"+ shield.getModel() + ".obj")); Client.logger.info("STARTING > cosmeitcs > shields > model > " + shield.getModel());
if(model != null) { ModelBuffer model = new ModelBuffer(new ResourceLocation("silentclient/models/"+ shield.getModel() + ".obj"));
shieldModels.put(shield.getModel(), model); if(model != null) {
} shieldModels.put(shield.getModel(), model);
} catch (Exception e) {
e.printStackTrace();
} }
} catch (Exception e) {
e.printStackTrace();
} }
}); }
} });
}
Client.logger.info("STARTING > cosmeitcs > icons"); Client.logger.info("STARTING > cosmeitcs > icons");
icons.clear(); icons.clear();
if(allCosmetics != null && allCosmetics.getIcons() != null) { if(allCosmetics != null && allCosmetics.getIcons() != null) {
allCosmetics.getIcons().forEach((icon) -> { allCosmetics.getIcons().forEach((icon) -> {
icons.put(icon.getId(), new StaticResourceLocation("silentclient/cosmetics/icons/"+ icon.getId() + "/0.png")); icons.put(icon.getId(), new StaticResourceLocation("silentclient/cosmetics/icons/"+ icon.getId() + "/0.png"));
}); });
}
} }
Client.logger.info("STARTING > cosmeitcs > outfits"); Client.logger.info("STARTING > cosmeitcs > outfits");

View File

@ -1,19 +1,5 @@
package net.silentclient.client.cosmetics; package net.silentclient.client.cosmetics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.UUID;
import javax.imageio.ImageIO;
import javax.vecmath.Vector3f;
import javax.vecmath.Vector4f;
import net.silentclient.client.mixin.accessors.MinecraftAccessor;
import net.silentclient.client.mixin.ducks.AbstractClientPlayerExt;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelBase;
@ -23,7 +9,19 @@ import net.minecraft.client.renderer.entity.layers.LayerRenderer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.silentclient.client.Client; import net.silentclient.client.Client;
import net.silentclient.client.blc.BlcGlStateManager; import net.silentclient.client.blc.BlcGlStateManager;
import net.silentclient.client.mixin.accessors.MinecraftAccessor;
import net.silentclient.client.mixin.ducks.AbstractClientPlayerExt;
import net.silentclient.client.mods.settings.CosmeticsMod; import net.silentclient.client.mods.settings.CosmeticsMod;
import org.lwjgl.opengl.GL11;
import javax.imageio.ImageIO;
import javax.vecmath.Vector3f;
import javax.vecmath.Vector4f;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.UUID;
public class HatRenderer extends ModelBase implements LayerRenderer<AbstractClientPlayer> { public class HatRenderer extends ModelBase implements LayerRenderer<AbstractClientPlayer> {
private final RenderPlayer playerRenderer; private final RenderPlayer playerRenderer;
@ -176,6 +174,11 @@ public class HatRenderer extends ModelBase implements LayerRenderer<AbstractClie
translations = new Vector3f(0.0f, 0.5f, 0.0f); translations = new Vector3f(0.0f, 0.5f, 0.0f);
scale = 0.0101f; scale = 0.0101f;
break; break;
case "snapback":
rotations = new Vector4f(180.0f, 90.0f, 1.0f, 0.0f);
translations = new Vector3f(0.0f, 1.5f, 0.0f);
scale = 1;
break;
case "crown": case "crown":
rotations = null; rotations = null;
translations = new Vector3f(0.08f, 0.4f, 0.0f); translations = new Vector3f(0.08f, 0.4f, 0.0f);
@ -229,6 +232,10 @@ public class HatRenderer extends ModelBase implements LayerRenderer<AbstractClie
case "gaming_headset": case "gaming_headset":
n = 0.018; n = 0.018;
break; break;
case "snapback":
n = 0.25;
GL11.glTranslatef(0.0f, 0.3f, 0.0f);
break;
} }
} else { } else {
final Integer n2 = HatRenderer.uuidToHatLayer.get(entity.getUniqueID()); final Integer n2 = HatRenderer.uuidToHatLayer.get(entity.getUniqueID());

View File

@ -0,0 +1,276 @@
# Blender v3.2.0 OBJ File: ''
# www.blender.org
mtllib Lunar_Cap.mtl
o Lunar_Cap_cube.001
v -0.281251 -1.906250 0.218750
v 0.281249 -1.906250 0.218750
v 0.281249 -2.031250 0.218750
v -0.281251 -2.031250 0.218750
v -0.281251 -1.906250 0.281250
v -0.281251 -2.031250 0.281250
v 0.281249 -1.906250 0.281250
v 0.281249 -2.031250 0.281250
v -0.281251 -1.781250 0.218750
v 0.281249 -1.781250 0.218750
v 0.281249 -1.843750 0.218750
v -0.281251 -1.843750 0.218750
v -0.281251 -1.781250 0.281250
v -0.281251 -1.843750 0.281250
v 0.281249 -1.781250 0.281250
v 0.281249 -1.843750 0.281250
v -0.281251 -1.781250 -0.593750
v 0.281249 -1.781250 -0.593750
v 0.281249 -1.843750 -0.593750
v -0.281251 -1.843750 -0.593750
v -0.281251 -1.781250 -0.281250
v -0.281251 -1.843750 -0.281250
v 0.281249 -1.781250 -0.281250
v 0.281249 -1.843750 -0.281250
v -0.281251 -1.781250 -0.281250
v 0.281249 -1.781250 -0.281250
v 0.281249 -2.031250 -0.281250
v -0.281251 -2.031250 -0.281250
v -0.281251 -1.781250 0.218750
v -0.281251 -2.031250 0.218750
v 0.281249 -1.781250 0.218750
v 0.281249 -2.031250 0.218750
v -0.281251 -1.843750 0.218750
v -0.156251 -1.843750 0.218750
v -0.156251 -1.906250 0.218750
v -0.281251 -1.906250 0.218750
v -0.281251 -1.843750 0.281250
v -0.281251 -1.906250 0.281250
v -0.156251 -1.843750 0.281250
v -0.156251 -1.906250 0.281250
v 0.156249 -1.843750 0.218750
v 0.281249 -1.843750 0.218750
v 0.281249 -1.906250 0.218750
v 0.156249 -1.906250 0.218750
v 0.156249 -1.843750 0.281250
v 0.156249 -1.906250 0.281250
v 0.281249 -1.843750 0.281250
v 0.281249 -1.906250 0.281250
vt 0.843750 0.812500
vt 0.562500 0.875000
vt 0.562500 0.812500
vt 0.281250 0.437500
vt 0.250000 0.500000
vt 0.250000 0.437500
vt 0.843750 0.750000
vt 0.562500 0.812500
vt 0.562500 0.750000
vt 0.562500 0.375000
vt 0.531250 0.437500
vt 0.531250 0.375000
vt 0.562500 0.593750
vt 0.843750 0.562500
vt 0.843750 0.593750
vt 0.562500 0.531250
vt 0.843750 0.562500
vt 0.843750 0.531250
vt 0.531250 0.406250
vt 0.250000 0.437500
vt 0.250000 0.406250
vt 0.531250 0.375000
vt 0.500000 0.406250
vt 0.500000 0.375000
vt 0.843750 0.718750
vt 0.562500 0.750000
vt 0.562500 0.718750
vt 0.093750 0.343750
vt 0.062500 0.375000
vt 0.062500 0.343750
vt 0.562500 0.718750
vt 0.843750 0.687500
vt 0.843750 0.718750
vt 0.562500 0.656250
vt 0.843750 0.687500
vt 0.843750 0.656250
vt 0.843750 0.625000
vt 0.562500 0.656250
vt 0.562500 0.625000
vt 0.718750 0.500000
vt 0.562500 0.531250
vt 0.562500 0.500000
vt 0.843750 0.593750
vt 0.562500 0.625000
vt 0.562500 0.593750
vt 0.718750 0.468750
vt 0.562500 0.500000
vt 0.562500 0.468750
vt 0.281250 1.000000
vt 0.562500 0.843750
vt 0.562500 1.000000
vt 0.281250 0.687500
vt 0.562500 0.843750
vt 0.562500 0.687500
vt 0.562500 0.562500
vt 0.281250 0.687500
vt 0.281250 0.562500
vt 0.250000 0.375000
vt 0.000000 0.500000
vt 0.000000 0.375000
vt 0.562500 0.437500
vt 0.281250 0.562500
vt 0.281250 0.437500
vt 0.812500 0.875000
vt 0.562500 1.000000
vt 0.562500 0.875000
vt 0.000000 1.000000
vt 0.281250 0.750000
vt 0.281250 1.000000
vt 0.000000 0.500000
vt 0.281250 0.750000
vt 0.281250 0.500000
vt 0.625000 0.437500
vt 0.562500 0.468750
vt 0.562500 0.437500
vt 0.125000 0.343750
vt 0.093750 0.375000
vt 0.093750 0.343750
vt 0.625000 0.406250
vt 0.562500 0.437500
vt 0.562500 0.406250
vt 0.156250 0.343750
vt 0.125000 0.375000
vt 0.125000 0.343750
vt 0.250000 0.406250
vt 0.312500 0.375000
vt 0.312500 0.406250
vt 0.312500 0.375000
vt 0.375000 0.406250
vt 0.375000 0.375000
vt 0.437500 0.375000
vt 0.375000 0.406250
vt 0.375000 0.375000
vt 0.187500 0.343750
vt 0.156250 0.375000
vt 0.156250 0.343750
vt 0.500000 0.375000
vt 0.437500 0.406250
vt 0.437500 0.375000
vt 0.218750 0.343750
vt 0.187500 0.375000
vt 0.187500 0.343750
vt 0.562500 0.406250
vt 0.625000 0.375000
vt 0.625000 0.406250
vt 0.000000 0.343750
vt 0.062500 0.375000
vt 0.062500 0.343750
vt 0.843750 0.875000
vt 0.281250 0.500000
vt 0.843750 0.812500
vt 0.562500 0.437500
vt 0.562500 0.562500
vt 0.562500 0.562500
vt 0.531250 0.437500
vt 0.531250 0.406250
vt 0.843750 0.750000
vt 0.093750 0.375000
vt 0.562500 0.687500
vt 0.562500 0.687500
vt 0.843750 0.656250
vt 0.718750 0.531250
vt 0.843750 0.625000
vt 0.718750 0.500000
vt 0.281250 0.843750
vt 0.281250 0.843750
vt 0.562500 0.687500
vt 0.250000 0.500000
vt 0.562500 0.562500
vt 0.812500 1.000000
vt 0.000000 0.750000
vt 0.000000 0.750000
vt 0.625000 0.468750
vt 0.125000 0.375000
vt 0.625000 0.437500
vt 0.156250 0.375000
vt 0.250000 0.375000
vt 0.312500 0.406250
vt 0.437500 0.406250
vt 0.187500 0.375000
vt 0.500000 0.406250
vt 0.218750 0.375000
vt 0.562500 0.375000
vt 0.000000 0.375000
vn 0.0000 -0.0000 -1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 1.0000 -0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
usemtl Lunar_Cap
s 1
f 2/1/1 4/2/1 1/3/1
f 1/4/2 6/5/2 5/6/2
f 5/7/3 8/8/3 7/9/3
f 7/10/4 3/11/4 2/12/4
f 6/13/5 3/14/5 8/15/5
f 1/16/6 7/17/6 2/18/6
f 10/19/1 12/20/1 9/21/1
f 9/22/2 14/23/2 13/24/2
f 13/25/3 16/26/3 15/27/3
f 15/28/4 11/29/4 10/30/4
f 14/31/5 11/32/5 16/33/5
f 9/34/6 15/35/6 10/36/6
f 18/37/1 20/38/1 17/39/1
f 17/40/2 22/41/2 21/42/2
f 21/43/3 24/44/3 23/45/3
f 23/46/4 19/47/4 18/48/4
f 22/49/5 19/50/5 24/51/5
f 17/52/6 23/53/6 18/54/6
f 26/55/1 28/56/1 25/57/1
f 25/58/2 30/59/2 29/60/2
f 29/61/3 32/62/3 31/63/3
f 31/64/4 27/65/4 26/66/4
f 30/67/5 27/68/5 32/69/5
f 25/70/6 31/71/6 26/72/6
f 34/73/1 36/74/1 33/75/1
f 33/76/2 38/77/2 37/78/2
f 37/79/3 40/80/3 39/81/3
f 39/82/4 35/83/4 34/84/4
f 38/85/5 35/86/5 40/87/5
f 33/88/6 39/89/6 34/90/6
f 42/91/1 44/92/1 41/93/1
f 41/94/2 46/95/2 45/96/2
f 45/97/3 48/98/3 47/99/3
f 47/100/4 43/101/4 42/102/4
f 46/103/5 43/104/5 48/105/5
f 41/106/6 47/107/6 42/108/6
f 2/1/1 3/109/1 4/2/1
f 1/4/2 4/110/2 6/5/2
f 5/7/3 6/111/3 8/8/3
f 7/10/4 8/112/4 3/11/4
f 6/13/5 4/113/5 3/14/5
f 1/16/6 5/114/6 7/17/6
f 10/19/1 11/115/1 12/20/1
f 9/22/2 12/116/2 14/23/2
f 13/25/3 14/117/3 16/26/3
f 15/28/4 16/118/4 11/29/4
f 14/31/5 12/119/5 11/32/5
f 9/34/6 13/120/6 15/35/6
f 18/37/1 19/121/1 20/38/1
f 17/40/2 20/122/2 22/41/2
f 21/43/3 22/123/3 24/44/3
f 23/46/4 24/124/4 19/47/4
f 22/49/5 20/125/5 19/50/5
f 17/52/6 21/126/6 23/53/6
f 26/55/1 27/127/1 28/56/1
f 25/58/2 28/128/2 30/59/2
f 29/61/3 30/129/3 32/62/3
f 31/64/4 32/130/4 27/65/4
f 30/67/5 28/131/5 27/68/5
f 25/70/6 29/132/6 31/71/6
f 34/73/1 35/133/1 36/74/1
f 33/76/2 36/134/2 38/77/2
f 37/79/3 38/135/3 40/80/3
f 39/82/4 40/136/4 35/83/4
f 38/85/5 36/137/5 35/86/5
f 33/88/6 37/138/6 39/89/6
f 42/91/1 43/139/1 44/92/1
f 41/94/2 44/140/2 46/95/2
f 45/97/3 46/141/3 48/98/3
f 47/100/4 48/142/4 43/101/4
f 46/103/5 44/143/5 43/104/5
f 41/106/6 45/144/6 47/107/6