diff --git a/README.md b/README.md index e5ca086..e1141c4 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,16 @@ Current features: * A Sterile Cleaning Maintenance Hatch * An omni-breaker, that can break anything instantly * 64A Energy Converters +* The Power Transfer Einstein-Rosen Bridge (PTERB), a wireless version of the Active Transformer + * Has an opt-in coolant system, where the PTERB requires coolant to be used, or it'll explode (or just stop if GTm is set to have harmless active transformers) All features can be enabled or disabled in the config. While this mod was originally created for Monifactory, feel free to use it in any GregTech modpack you like! +All features (except for the sterile cleaning hatch and optional coolant for the PTERB) have default recipes. +Feel free to change recipes in your own pack! + ## License All code is under LGPL3. Some parts were directly lifted from GregTech Modern. diff --git a/build.gradle b/build.gradle index a353e7f..64e3e5e 100644 --- a/build.gradle +++ b/build.gradle @@ -113,6 +113,7 @@ dependencies { runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") runtimeOnly fg.deobf("dev.emi:emi-forge:${emi_version}+${minecraft_version}") runtimeOnly fg.deobf("curse.maven:jade-324717:5390389") + compileOnly fg.deobf("curse.maven:jade-324717:5390389") // GregTech and dependencies implementation fg.deobf("com.gregtechceu.gtceu:gtceu-${minecraft_version}:${gtceu_version}:slim") { transitive = false } diff --git a/changelog.md b/changelog.md index 9d4868d..73d600a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,3 @@ -# GregTech Modern Utilities version 1.0.3 +# GregTech Modern Utilities version 1.1.0 -HOTFIX - prevent server from trying to load client code \ No newline at end of file +Add the Power Transfer Einstein-Rosen Bridge, a wireless version of the Active Transformer. \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index af79f7e..ecfd7fa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ org.gradle.jvmargs=-Xmx1G mapping_version=2023.09.03-1.20.1 # Mod Properties - mod_version=1.0.3 + mod_version=1.1.0 maven_group=net.neganote.gtmutils archives_base_name=gtmutils mod_id=gtmutils diff --git a/src/generated/resources/assets/gtmutils/lang/en_ud.json b/src/generated/resources/assets/gtmutils/lang/en_ud.json index bd5d9a5..06b4d79 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_ud.json +++ b/src/generated/resources/assets/gtmutils/lang/en_ud.json @@ -7,6 +7,7 @@ "block.gtmutils.max_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§XⱯWן§ɔ§", "block.gtmutils.mv_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§ΛWq§", "block.gtmutils.opv_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§ΛdOן§6§", + "block.gtmutils.pterb_machine": "ǝbpıɹᗺ uǝsoᴚ-uıǝʇsuıƎ ɹǝɟsuɐɹ⟘ ɹǝʍoԀ", "block.gtmutils.sterile_cleaning_maintenance_hatch": "ɥɔʇɐH ǝɔuɐuǝʇuıɐW buıuɐǝןƆ ǝןıɹǝʇS", "block.gtmutils.uev_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§ΛƎ∩ɐ§", "block.gtmutils.uhv_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§ΛH∩ㄣ§", @@ -15,9 +16,27 @@ "block.gtmutils.uv_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§Λ∩Ɛ§", "block.gtmutils.uxv_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§ΛX∩ǝ§", "block.gtmutils.zpm_64a_energy_converter": "ɹǝʇɹǝʌuoƆ ʎbɹǝuƎ ɹ§Ɐǝ§ㄣ9 ɹ§WԀZɔ§", + "config.gtmutils.option.converters64aEnabled": "pǝןqɐuƎɐㄣ9sɹǝʇɹǝʌuoɔ", + "config.gtmutils.option.features": "sǝɹnʇɐǝɟ", + "config.gtmutils.option.omnibreakerEnabled": "pǝןqɐuƎɹǝʞɐǝɹqıuɯo", + "config.gtmutils.option.omnibreakerEnergyCapacity": "ʎʇıɔɐdɐƆʎbɹǝuƎɹǝʞɐǝɹqıuɯo", + "config.gtmutils.option.omnibreakerTier": "ɹǝı⟘ɹǝʞɐǝɹqıuɯo", + "config.gtmutils.option.pterbCoolantBaseDrain": "uıɐɹᗡǝsɐᗺʇuɐןooƆqɹǝʇd", + "config.gtmutils.option.pterbCoolantIOMultiplier": "ɹǝıןdıʇןnWOIʇuɐןooƆqɹǝʇd", + "config.gtmutils.option.pterbEnabled": "pǝןqɐuƎqɹǝʇd", + "config.gtmutils.option.sterileHatchEnabled": "pǝןqɐuƎɥɔʇɐHǝןıɹǝʇs", + "config.jade.plugin_gtmutils.frequency_info": "oɟuI ʎɔuǝnbǝɹℲ ᗺᴚƎ⟘Ԁ", + "gtmutils.gui.pterb.wireless_configurator.title": "ʎɔuǝnbǝɹɟ ssǝןǝɹıM", + "gtmutils.multiblock.pterb_machine.coolant_usage": "puoɔǝs ɹǝd %s ɟo Ꞁ%s suıɐɹᗡɔ§", + "gtmutils.pterb.current_frequency": "%s :ʎɔuǝnbǝɹɟ ʇuǝɹɹnƆ", + "gtmutils.pterb_machine.invalid_frequency": "¡0 ʎɔuǝnbǝɹɟ uo ʞɹoʍ ʇou ןןıʍ sᗺᴚƎ⟘Ԁ", "item.gtmutils.omnibreaker": "ɹǝʞɐǝɹq-ıuɯO", "itemGroup.gtmutils.creative_tab": "sǝıʇıןıʇ∩ uɹǝpoW ɥɔǝ⟘bǝɹ⅁", + "material.gtmutils.quantum_coolant": "ʇuɐןooƆ ɯnʇuɐnὉ", "tooltip.omnibreaker.can_break_anything": "¡⅁NIH⟘ʎNⱯ ǝuıɯ-ɐʇsuı uɐɔ ɹǝʞɐǝɹq-ıuɯO ǝɥ⟘", "tooltip.omnibreaker.charge_status": "∩Ǝ %s / ∩Ǝ %s :ʎbɹǝuƎ", - "tooltip.omnibreaker.right_click_function": "¡ʞɔıןɔ-ʇɥbıɹ ɥʇıʍ sʞɔoןq ןɐnpıʌıpuı ʞɐǝɹᗺ" + "tooltip.omnibreaker.right_click_function": "¡ʞɔıןɔ-ʇɥbıɹ ɥʇıʍ sʞɔoןq ןɐnpıʌıpuı ʞɐǝɹᗺ", + "tooltip.pterb_machine.frequencies": "˙ɹǝɯɹoɟsuɐɹ⟘ ǝʌıʇɔⱯ ǝןbuıs ɐ ǝʞıן ʇɔɐ ʎɔuǝnbǝɹɟ ǝɯɐs ǝɥʇ ɥʇıʍ sᗺᴚƎ⟘Ԁ ןןⱯ", + "tooltip.pterb_machine.purpose": ")ᗺᴚƎ⟘Ԁ( ɹǝɯɹoɟsuɐɹ⟘ ǝʌıʇɔⱯ ssǝןǝɹıM", + "tooltip.pterb_machine.uses_coolant": "¡uoıʇɔunɟ oʇ %s suıɐɹᗡ" } \ No newline at end of file diff --git a/src/generated/resources/assets/gtmutils/lang/en_us.json b/src/generated/resources/assets/gtmutils/lang/en_us.json index 0610b5d..065e89d 100644 --- a/src/generated/resources/assets/gtmutils/lang/en_us.json +++ b/src/generated/resources/assets/gtmutils/lang/en_us.json @@ -7,6 +7,7 @@ "block.gtmutils.max_64a_energy_converter": "§c§lMAX§r 64§eA§r Energy Converter", "block.gtmutils.mv_64a_energy_converter": "§bMV§r 64§eA§r Energy Converter", "block.gtmutils.opv_64a_energy_converter": "§9§lOpV§r 64§eA§r Energy Converter", + "block.gtmutils.pterb_machine": "Power Transfer Einstein-Rosen Bridge", "block.gtmutils.sterile_cleaning_maintenance_hatch": "Sterile Cleaning Maintenance Hatch", "block.gtmutils.uev_64a_energy_converter": "§aUEV§r 64§eA§r Energy Converter", "block.gtmutils.uhv_64a_energy_converter": "§4UHV§r 64§eA§r Energy Converter", @@ -15,9 +16,27 @@ "block.gtmutils.uv_64a_energy_converter": "§3UV§r 64§eA§r Energy Converter", "block.gtmutils.uxv_64a_energy_converter": "§eUXV§r 64§eA§r Energy Converter", "block.gtmutils.zpm_64a_energy_converter": "§cZPM§r 64§eA§r Energy Converter", + "config.gtmutils.option.converters64aEnabled": "converters64aEnabled", + "config.gtmutils.option.features": "features", + "config.gtmutils.option.omnibreakerEnabled": "omnibreakerEnabled", + "config.gtmutils.option.omnibreakerEnergyCapacity": "omnibreakerEnergyCapacity", + "config.gtmutils.option.omnibreakerTier": "omnibreakerTier", + "config.gtmutils.option.pterbCoolantBaseDrain": "pterbCoolantBaseDrain", + "config.gtmutils.option.pterbCoolantIOMultiplier": "pterbCoolantIOMultiplier", + "config.gtmutils.option.pterbEnabled": "pterbEnabled", + "config.gtmutils.option.sterileHatchEnabled": "sterileHatchEnabled", + "config.jade.plugin_gtmutils.frequency_info": "PTERB Frequency Info", + "gtmutils.gui.pterb.wireless_configurator.title": "Wireless frequency", + "gtmutils.multiblock.pterb_machine.coolant_usage": "§cDrains %sL of %s per second", + "gtmutils.pterb.current_frequency": "Current frequency: %s", + "gtmutils.pterb_machine.invalid_frequency": "PTERBs will not work on frequency 0!", "item.gtmutils.omnibreaker": "Omni-breaker", "itemGroup.gtmutils.creative_tab": "GregTech Modern Utilities", + "material.gtmutils.quantum_coolant": "Quantum Coolant", "tooltip.omnibreaker.can_break_anything": "The Omni-breaker can insta-mine ANYTHING!", "tooltip.omnibreaker.charge_status": "Energy: %s EU / %s EU", - "tooltip.omnibreaker.right_click_function": "Break individual blocks with right-click!" + "tooltip.omnibreaker.right_click_function": "Break individual blocks with right-click!", + "tooltip.pterb_machine.frequencies": "All PTERBs with the same frequency act like a single Active Transformer.", + "tooltip.pterb_machine.purpose": "Wireless Active Transformer (PTERB)", + "tooltip.pterb_machine.uses_coolant": "Drains %s to function!" } \ No newline at end of file diff --git a/src/generated/resources/data/ae2/tags/items/p2p_attunements/fluid_p2p_tunnel.json b/src/generated/resources/data/ae2/tags/items/p2p_attunements/fluid_p2p_tunnel.json new file mode 100644 index 0000000..4e47f36 --- /dev/null +++ b/src/generated/resources/data/ae2/tags/items/p2p_attunements/fluid_p2p_tunnel.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gtmutils:quantum_coolant_bucket" + ] +} \ No newline at end of file diff --git a/src/main/java/net/neganote/gtutilities/GregTechModernUtilities.java b/src/main/java/net/neganote/gtutilities/GregTechModernUtilities.java index a4d1e01..f7116cb 100644 --- a/src/main/java/net/neganote/gtutilities/GregTechModernUtilities.java +++ b/src/main/java/net/neganote/gtutilities/GregTechModernUtilities.java @@ -24,10 +24,12 @@ import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.neganote.gtutilities.client.renderer.UtilShaders; import net.neganote.gtutilities.common.item.UtilItems; import net.neganote.gtutilities.common.machine.UtilMachines; +import net.neganote.gtutilities.common.materials.UtilMaterials; import net.neganote.gtutilities.config.UtilConfig; -import net.neganote.gtutilities.data.UtilDatagen; +import net.neganote.gtutilities.datagen.UtilDatagen; import com.tterrag.registrate.util.entry.RegistryEntry; import org.apache.logging.log4j.LogManager; @@ -49,6 +51,7 @@ public GregTechModernUtilities() { modEventBus.addListener(this::commonSetup); if (GTCEu.isClientSide()) { modEventBus.addListener(this::clientSetup); + modEventBus.register(UtilShaders.class); } modEventBus.addListener(this::addMaterialRegistries); modEventBus.addListener(this::addMaterials); @@ -127,7 +130,7 @@ private void addMaterialRegistries(MaterialRegistryEvent event) { // As well as this. private void addMaterials(MaterialEvent event) { - // CustomMaterials.init(); + UtilMaterials.register(); } // This is optional, though. diff --git a/src/main/java/net/neganote/gtutilities/client/renderer/UtilRenderTypes.java b/src/main/java/net/neganote/gtutilities/client/renderer/UtilRenderTypes.java new file mode 100644 index 0000000..51973ca --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/client/renderer/UtilRenderTypes.java @@ -0,0 +1,34 @@ +package net.neganote.gtutilities.client.renderer; + +import net.minecraft.client.renderer.RenderStateShard; +import net.minecraft.client.renderer.RenderStateShard.ShaderStateShard; +import net.minecraft.client.renderer.RenderType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; + +@OnlyIn(Dist.CLIENT) +public class UtilRenderTypes { + + public static final ShaderStateShard WORMHOLE_SHADER_SHARD = new ShaderStateShard( + () -> UtilShaders.WORMHOLE_SHADER); + + public static RenderType WORMHOLE = RenderType.create("wormhole", DefaultVertexFormat.POSITION, + VertexFormat.Mode.QUADS, 131072, false, false, + RenderType.CompositeState.builder() + .setShaderState(WORMHOLE_SHADER_SHARD) + // I would just use RenderStateShard.ADDITIVE_TRANSPARENCY, but that's protected for some reason + // So instead I'm just copying it directly + .setTransparencyState(new RenderStateShard.TransparencyStateShard("additive_transparency", () -> { + RenderSystem.enableBlend(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); + }, () -> { + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + })) + .createCompositeState(false)); +} diff --git a/src/main/java/net/neganote/gtutilities/client/renderer/UtilShaders.java b/src/main/java/net/neganote/gtutilities/client/renderer/UtilShaders.java new file mode 100644 index 0000000..15e6e0c --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/client/renderer/UtilShaders.java @@ -0,0 +1,26 @@ +package net.neganote.gtutilities.client.renderer; + +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraftforge.client.event.RegisterShadersEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.neganote.gtutilities.GregTechModernUtilities; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; + +import java.io.IOException; + +public class UtilShaders { + + public static ShaderInstance WORMHOLE_SHADER; + + @SubscribeEvent + public static void shaderRegistry(RegisterShadersEvent event) { + try { + event.registerShader(new ShaderInstance(event.getResourceProvider(), + GregTechModernUtilities.id("rendertype_wormhole"), DefaultVertexFormat.POSITION), + (shaderInstance -> WORMHOLE_SHADER = shaderInstance)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/client/renderer/machine/PTERBRenderer.java b/src/main/java/net/neganote/gtutilities/client/renderer/machine/PTERBRenderer.java new file mode 100644 index 0000000..3ffc06d --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/client/renderer/machine/PTERBRenderer.java @@ -0,0 +1,92 @@ +package net.neganote.gtutilities.client.renderer.machine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.machine.WorkableCasingMachineRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neganote.gtutilities.GregTechModernUtilities; +import net.neganote.gtutilities.client.renderer.UtilRenderTypes; +import net.neganote.gtutilities.common.machine.multiblock.PTERBMachine; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import java.util.List; +import java.util.function.Consumer; + +public class PTERBRenderer extends WorkableCasingMachineRenderer { + + public static final ResourceLocation TEXTURE = GTCEu.id("block/casings/solid/machine_casing_palladium_substation"); + // TODO: replace this texture with custom casing + public static final ResourceLocation OVERLAY_MODEL_TEXTURES = GTCEu.id("block/multiblock/data_bank"); + + public static final ResourceLocation SPHERE = GregTechModernUtilities.id("render/sphere"); + + public PTERBRenderer() { + super(TEXTURE, OVERLAY_MODEL_TEXTURES); + } + + @Override + public void render(BlockEntity blockEntity, float partialTicks, PoseStack stack, MultiBufferSource buffer, + int combinedLight, int combinedOverlay) { + if (blockEntity instanceof MetaMachineBlockEntity mmbe && mmbe.getMetaMachine() instanceof PTERBMachine pterb && + pterb.isFormed() && pterb.isActive()) { + var frontFacing = pterb.getFrontFacing(); + var upwardsFacing = pterb.getUpwardsFacing(); + + Direction upwards = RelativeDirection.UP.getRelativeFacing(frontFacing, upwardsFacing, false); + + // Disable the rendering for now. Might finish it later if I ever become smart enough/able to understand + // Minecraft's rendering system better. + // renderWormhole(stack, buffer, upwards, combinedLight, combinedOverlay); + } + } + + @SuppressWarnings("deprecation") + private void renderWormhole(PoseStack stack, MultiBufferSource bufferSource, Direction upwards, + int combinedLight, int combinedOverlay) { + stack.pushPose(); + var modelManager = Minecraft.getInstance().getModelManager(); + BakedModel sphere = modelManager.getModel(SPHERE); + Vec3i movement = upwards.getNormal(); + stack.translate(movement.getX() * 8 + 0.5f, movement.getY() * 8 + 0.5f, movement.getZ() * 8 + 0.5f); + PoseStack.Pose pose = stack.last(); + VertexConsumer consumer = bufferSource.getBuffer(UtilRenderTypes.WORMHOLE); + List quads = sphere.getQuads(null, null, GTValues.RNG); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 1.0f, 1.0f, 1.0f, combinedLight, combinedOverlay); + } + stack.popPose(); + } + + @Override + public boolean hasTESR(BlockEntity blockEntity) { + return true; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public boolean isGlobalRenderer(BlockEntity blockEntity) { + return true; + } + + @Override + public void onAdditionalModel(Consumer registry) { + super.onAdditionalModel(registry); + registry.accept(SPHERE); + } +} diff --git a/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java b/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java index 1b110fa..a65a6a5 100644 --- a/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java +++ b/src/main/java/net/neganote/gtutilities/common/machine/UtilMachines.java @@ -6,10 +6,14 @@ import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.client.renderer.machine.MaintenanceHatchPartRenderer; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.CleaningMaintenanceHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -17,7 +21,10 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.neganote.gtutilities.GregTechModernUtilities; +import net.neganote.gtutilities.client.renderer.machine.PTERBRenderer; import net.neganote.gtutilities.client.renderer.machine.UtilConverterRenderer; +import net.neganote.gtutilities.common.machine.multiblock.PTERBMachine; +import net.neganote.gtutilities.common.materials.UtilMaterials; import net.neganote.gtutilities.config.UtilConfig; import java.util.Locale; @@ -25,6 +32,8 @@ import static com.gregtechceu.gtceu.api.GTValues.*; import static com.gregtechceu.gtceu.api.GTValues.V; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; import static net.neganote.gtutilities.GregTechModernUtilities.REGISTRATE; @SuppressWarnings("unused") @@ -106,5 +115,56 @@ public static MachineDefinition[] registerTieredMachines(String name, } } + public static MultiblockMachineDefinition PTERB_MACHINE = null; + + static { + if (UtilConfig.INSTANCE.features.pterbEnabled) { + PTERB_MACHINE = REGISTRATE + .multiblock("pterb_machine", PTERBMachine::new) + .langValue("Power Transfer Einstein-Rosen Bridge") + .rotationState(RotationState.ALL) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(CASING_PALLADIUM_SUBSTATION) + .tooltips(Component.translatable("tooltip.pterb_machine.purpose"), + Component.translatable("gtceu.machine.active_transformer.tooltip.1"), + Component.translatable("tooltip.pterb_machine.frequencies") + .withStyle(ChatFormatting.GRAY)) + .conditionalTooltip( + Component + .translatable("tooltip.pterb_machine.uses_coolant", + UtilMaterials.QuantumCoolant.getLocalizedName() + .withStyle(ChatFormatting.AQUA)) + .withStyle(ChatFormatting.DARK_RED), + UtilConfig.coolantEnabled()) + .pattern((definition) -> FactoryBlockPattern.start() + // spotless:off + .aisle(" XXX ", " F ", " ", " H ", " H ", " H ", " H ", " H ") + .aisle(" XXXXXXX ", " FHF ", " H ", " H ", " H ", " F ", " ", " ") + .aisle(" XXHHHXX ", " ", " ", " ", " F ", " F ", " ", " ") + .aisle("XXHHHHHXX", " F F ", " ", " X ", " XXX ", " XXX ", " X X ", " ") + .aisle("XXHHHHHXX", "FH H HF", " H C H ", "HH XXX HH", "HHFXXXFHH", "HFFXXXFFH", "H H", "H H") + .aisle("XXHHHHHXX", " F F ", " ", " X ", " XXX ", " XXX ", " X X ", " ") + .aisle(" XXHHHXX ", " ", " ", " ", " F ", " F ", " ", " ") + .aisle(" XXXXXXX ", " FHF ", " H ", " H ", " H ", " F ", " ", " ") + .aisle(" XXX ", " F ", " ", " H ", " H ", " H ", " H ", " H ") + // spotless:on + .where(' ', any()) + .where('#', air()) + .where('X', + blocks(CASING_PALLADIUM_SUBSTATION.get()) + .or(PTERBMachine.getEnergyHatchPredicates()) + .or(abilities(PartAbility.IMPORT_FLUIDS_1X) + .setExactLimit(UtilConfig.coolantEnabled() ? 1 : 0))) + .where('H', blocks(HIGH_POWER_CASING.get())) + .where('C', controller(blocks(definition.getBlock()))) + .where('F', frames(GTMaterials.Neutronium)) + .build()) + .renderer(PTERBRenderer::new) + .allowExtendedFacing(true) + .hasTESR(true) + .register(); + } + } + public static void init() {} } diff --git a/src/main/java/net/neganote/gtutilities/common/machine/multiblock/PTERBMachine.java b/src/main/java/net/neganote/gtutilities/common/machine/multiblock/PTERBMachine.java new file mode 100644 index 0000000..b16e442 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/common/machine/multiblock/PTERBMachine.java @@ -0,0 +1,429 @@ +package net.neganote.gtutilities.common.machine.multiblock; + +import com.gregtechceu.gtceu.api.capability.IControllable; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IExplosionMachine; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; +import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.fluids.FluidStack; +import net.neganote.gtutilities.common.materials.UtilMaterials; +import net.neganote.gtutilities.config.UtilConfig; +import net.neganote.gtutilities.saveddata.PTERBSavedData; +import net.neganote.gtutilities.utils.EnergyUtils; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +import static com.gregtechceu.gtceu.api.pattern.Predicates.abilities; + +// A lot of this is copied from the Active Transformer +public class PTERBMachine extends WorkableElectricMultiblockMachine + implements IControllable, IExplosionMachine, IFancyUIMachine, + IDisplayUIMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + PTERBMachine.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + private List localPowerOutput; + + private List localPowerInput; + + protected ConditionalSubscriptionHandler converterSubscription; + + @Persisted + @DescSynced + private BlockPos coolantHatchPos; + + private long coolantDrain; + + @Persisted + @DescSynced + @Getter + private int frequency; + + @Persisted + @DescSynced + private int coolantTimer = 0; + + public PTERBMachine(IMachineBlockEntity holder) { + super(holder); + this.localPowerOutput = new ArrayList<>(); + this.localPowerInput = new ArrayList<>(); + + this.converterSubscription = new ConditionalSubscriptionHandler(this, this::convertEnergyTick, + this::isSubscriptionActive); + + this.frequency = 0; + } + + public void convertEnergyTick() { + if (isWorkingEnabled()) { + getRecipeLogic() + .setStatus(isSubscriptionActive() ? RecipeLogic.Status.WORKING : RecipeLogic.Status.SUSPEND); + } + if (isWorkingEnabled() && getRecipeLogic().getStatus() == RecipeLogic.Status.WORKING && + UtilConfig.coolantEnabled() && coolantTimer == 0 && frequency != 0) { + + FluidHatchPartMachine coolantHatch = Objects.requireNonNull( + (FluidHatchPartMachine) getMachine(Objects.requireNonNull(getLevel()), coolantHatchPos)); + + FluidStack coolant = coolantHatch.tank.getFluidInTank(0); + if (coolant.getFluid() == UtilMaterials.QuantumCoolant.getFluid() && coolant.getAmount() >= coolantDrain) { + coolantHatch.tank.handleRecipe(IO.IN, null, + List.of(FluidIngredient.of((int) coolantDrain, UtilMaterials.QuantumCoolant.getFluid())), null, + false); + } else { + if (!ConfigHolder.INSTANCE.machines.harmlessActiveTransformers) { + doExplosion(6.0f + getTier()); + } else { + coolantTimer = 0; + getRecipeLogic().setStatus(RecipeLogic.Status.SUSPEND); + converterSubscription.updateSubscription(); + return; + } + } + } + if (isWorkingEnabled() && getRecipeLogic().getStatus() == RecipeLogic.Status.WORKING) { + coolantTimer = (coolantTimer + 1) % 20; + } + if (isWorkingEnabled() && frequency != 0) { + if (getLevel() instanceof ServerLevel serverLevel) { + PTERBSavedData savedData = PTERBSavedData.getOrCreate(serverLevel.getServer().overworld()); + + EnergyContainerList powerInput = savedData.getWirelessEnergyInputs(frequency); + EnergyContainerList powerOutput = savedData.getWirelessEnergyOutputs(frequency); + long canDrain = powerInput.getEnergyStored(); + long totalDrained = powerOutput.changeEnergy(canDrain); + powerInput.removeEnergy(totalDrained); + } + } + converterSubscription.updateSubscription(); + } + + private long calculateCoolantDrain() { + long inputAmperage = 0; + long inputVoltage = 0; + long outputAmperage = 0; + long outputVoltage = 0; + + if (!localPowerInput.isEmpty()) { + EnergyContainerList localInputs = EnergyUtils.getEnergyListFromMultiParts(localPowerInput); + inputAmperage = localInputs.getInputAmperage(); + inputVoltage = localInputs.getInputVoltage(); + } + + if (!localPowerOutput.isEmpty()) { + EnergyContainerList localOutputs = EnergyUtils.getEnergyListFromMultiParts(localPowerOutput); + outputAmperage = localOutputs.getOutputAmperage(); + outputVoltage = localOutputs.getOutputVoltage(); + } + + long scalingFactor = Math.max(inputAmperage * inputVoltage, outputAmperage * outputVoltage); + return UtilConfig.INSTANCE.features.pterbCoolantBaseDrain + + (long) (scalingFactor * UtilConfig.INSTANCE.features.pterbCoolantIOMultiplier); + } + + @SuppressWarnings("RedundantIfStatement") // It is cleaner to have the final return true separate. + protected boolean isSubscriptionActive() { + if (!isFormed()) return false; + + if (localPowerInput == null) return false; + if (localPowerOutput == null) return false; + + return true; + } + + @Override + public boolean onWorking() { + return super.onWorking(); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // capture all energy containers + List localPowerInput = new ArrayList<>(); + List localPowerOutput = new ArrayList<>(); + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + + for (IMultiPart part : getPrioritySortedParts()) { + if (part instanceof FluidHatchPartMachine machine) { + this.coolantHatchPos = machine.getPos(); + continue; + } + IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); + if (io == IO.NONE) continue; + for (var handler : part.getRecipeHandlers()) { + var handlerIO = handler.getHandlerIO(); + // If IO not compatible + if (io != IO.BOTH && handlerIO != IO.BOTH && io != handlerIO) continue; + if (handler.getCapability() == EURecipeCapability.CAP && + handler instanceof IEnergyContainer) { + if (handlerIO == IO.IN) { + localPowerInput.add(part); + } else if (handlerIO == IO.OUT) { + localPowerOutput.add(part); + } + traitSubscriptions.add(handler.addChangedListener(converterSubscription::updateSubscription)); + } + } + } + + // Invalidate the structure if there is not at least one output or one input + if (localPowerInput.isEmpty() && localPowerOutput.isEmpty()) { + this.onStructureInvalid(); + } + + this.localPowerInput = localPowerInput; + this.localPowerOutput = localPowerOutput; + + this.coolantDrain = calculateCoolantDrain(); + + if (getLevel() instanceof ServerLevel serverLevel && frequency != 0) { + PTERBSavedData savedData = PTERBSavedData.getOrCreate(serverLevel); + savedData.addEnergyInputs(frequency, localPowerInput); + savedData.addEnergyOutputs(frequency, localPowerOutput); + savedData.saveDataToCache(); + } + + converterSubscription.updateSubscription(); + } + + @NotNull + private List getPrioritySortedParts() { + return getParts().stream().sorted(Comparator.comparing(part -> { + if (part instanceof MetaMachine partMachine) { + Block partBlock = partMachine.getBlockState().getBlock(); + + if (PartAbility.OUTPUT_ENERGY.isApplicable(partBlock)) + return 1; + + if (PartAbility.SUBSTATION_OUTPUT_ENERGY.isApplicable(partBlock)) + return 2; + + if (PartAbility.OUTPUT_LASER.isApplicable(partBlock)) + return 3; + } + + return 4; + })).toList(); + } + + @Override + public @NotNull ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public void onStructureInvalid() { + coolantTimer = 0; + if ((isWorkingEnabled() && recipeLogic.getStatus() == RecipeLogic.Status.WORKING) && + !ConfigHolder.INSTANCE.machines.harmlessActiveTransformers) { + doExplosion(6f + getTier()); + } + super.onStructureInvalid(); + if (getLevel() instanceof ServerLevel serverLevel) { + PTERBSavedData savedData = PTERBSavedData.getOrCreate(serverLevel.getServer().overworld()); + savedData.removeEnergyInputs(frequency, localPowerInput); + savedData.removeEnergyOutputs(frequency, localPowerOutput); + savedData.saveDataToCache(); + } + this.localPowerOutput = new ArrayList<>(); + this.localPowerInput = new ArrayList<>(); + this.coolantHatchPos = null; + getRecipeLogic().setStatus(RecipeLogic.Status.SUSPEND); + converterSubscription.unsubscribe(); + } + + public static TraceabilityPredicate getEnergyHatchPredicates() { + return abilities(PartAbility.INPUT_ENERGY).setPreviewCount(1) + .or(abilities(PartAbility.OUTPUT_ENERGY).setPreviewCount(2)) + .or(abilities(PartAbility.SUBSTATION_INPUT_ENERGY).setPreviewCount(1)) + .or(abilities(PartAbility.SUBSTATION_OUTPUT_ENERGY).setPreviewCount(1)) + .or(abilities(PartAbility.INPUT_LASER).setPreviewCount(1)) + .or(abilities(PartAbility.OUTPUT_LASER).setPreviewCount(1)); + } + + @Override + public void addDisplayText(@NotNull List textList) { + if (isFormed()) { + if (frequency == 0) { + textList.add(Component.translatable("gtmutils.pterb_machine.invalid_frequency") + .withStyle(ChatFormatting.RED)); + return; + } + if (!isWorkingEnabled()) { + textList.add(Component.translatable("gtceu.multiblock.work_paused")); + } else if (isActive()) { + long inputAmperage = 0; + long inputVoltage = 0; + long outputAmperage = 0; + long outputVoltage = 0; + + if (!localPowerInput.isEmpty()) { + EnergyContainerList localInputs = EnergyUtils.getEnergyListFromMultiParts(localPowerInput); + inputAmperage = localInputs.getInputAmperage(); + inputVoltage = localInputs.getInputVoltage(); + } + + if (!localPowerOutput.isEmpty()) { + EnergyContainerList localOutputs = EnergyUtils.getEnergyListFromMultiParts(localPowerOutput); + outputAmperage = localOutputs.getOutputAmperage(); + outputVoltage = localOutputs.getOutputVoltage(); + } + + long inputTotal = inputVoltage * inputAmperage; + long outputTotal = outputVoltage * outputAmperage; + + textList.add(Component.translatable("gtceu.multiblock.running")); + if (inputTotal > 0) { + textList.add(Component + .translatable("gtceu.multiblock.active_transformer.max_input", + FormattingUtil.formatNumbers( + Math.abs(inputTotal)))); + } + if (outputTotal > 0) { + textList.add(Component + .translatable("gtceu.multiblock.active_transformer.max_output", + FormattingUtil.formatNumbers( + Math.abs(outputTotal)))); + } + + textList.add(Component + .translatable("gtmutils.multiblock.pterb_machine.coolant_usage", + FormattingUtil.formatNumbers(coolantDrain), + UtilMaterials.QuantumCoolant.getLocalizedName())); + if (!ConfigHolder.INSTANCE.machines.harmlessActiveTransformers) { + textList.add(Component + .translatable("gtceu.multiblock.active_transformer.danger_enabled")); + } + } else { + textList.add(Component.translatable("gtceu.multiblock.idling")); + } + } + } + + public void setFrequencyFromString(String str) { + if (getLevel() instanceof ServerLevel serverLevel) { + PTERBSavedData savedData = PTERBSavedData.getOrCreate(serverLevel.getServer().overworld()); + savedData.removeEnergyInputs(frequency, localPowerInput); + savedData.removeEnergyOutputs(frequency, localPowerOutput); + savedData.saveDataToCache(); + } + frequency = Integer.parseInt(str); + if (frequency == 0) { + setWorkingEnabled(false); + } + if (getLevel() instanceof ServerLevel serverLevel && frequency != 0) { + PTERBSavedData savedData = PTERBSavedData.getOrCreate(serverLevel.getServer().overworld()); + savedData.addEnergyInputs(frequency, localPowerInput); + savedData.addEnergyOutputs(frequency, localPowerOutput); + savedData.saveDataToCache(); + } + } + + public String getFrequencyString() { + return Integer.valueOf(frequency).toString(); + } + + @Override + public void setWorkingEnabled(boolean isWorkingAllowed) { + if (frequency == 0) { + super.setWorkingEnabled(false); + return; + } + super.setWorkingEnabled(isWorkingAllowed); + if (getLevel() instanceof ServerLevel serverLevel && frequency != 0) { + PTERBSavedData savedData = PTERBSavedData.getOrCreate(serverLevel.getServer().overworld()); + if (isWorkingAllowed) { + savedData.addEnergyInputs(frequency, localPowerInput); + savedData.addEnergyOutputs(frequency, localPowerOutput); + savedData.saveDataToCache(); + } else { + savedData.removeEnergyInputs(frequency, localPowerInput); + savedData.removeEnergyOutputs(frequency, localPowerOutput); + savedData.saveDataToCache(); + } + } + } + + @Override + public void attachConfigurators(ConfiguratorPanel configuratorPanel) { + super.attachConfigurators(configuratorPanel); + configuratorPanel.attachConfigurators(new IFancyConfigurator() { + + @Override + public Component getTitle() { + return Component.translatable("gtmutils.gui.pterb.wireless_configurator.title"); + } + + @Override + public IGuiTexture getIcon() { + return new ItemStackTexture(GTItems.SENSOR_UV.asItem()); + } + + @Override + public Widget createConfigurator() { + return new WidgetGroup(0, 0, 130, 25) + .addWidget(new TextFieldWidget().setNumbersOnly(0, Integer.MAX_VALUE) + .setTextResponder(PTERBMachine.this::setFrequencyFromString) + .setTextSupplier(PTERBMachine.this::getFrequencyString)); + } + }); + } + + @Override + public @NotNull Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); + group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) + .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .setMaxWidthLimit(150) + .clickHandler(this::handleDisplayClick))); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + return group; + } + + @Override + public @NotNull ModularUI createUI(@NotNull Player entityPlayer) { + return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); + } +} diff --git a/src/main/java/net/neganote/gtutilities/common/materials/UtilMaterials.java b/src/main/java/net/neganote/gtutilities/common/materials/UtilMaterials.java new file mode 100644 index 0000000..f91a071 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/common/materials/UtilMaterials.java @@ -0,0 +1,22 @@ +package net.neganote.gtutilities.common.materials; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.fluids.FluidBuilder; +import com.gregtechceu.gtceu.api.fluids.FluidState; + +import net.neganote.gtutilities.GregTechModernUtilities; +import net.neganote.gtutilities.config.UtilConfig; + +public class UtilMaterials { + + public static Material QuantumCoolant; + + public static void register() { + if (UtilConfig.coolantEnabled()) { + QuantumCoolant = new Material.Builder(GregTechModernUtilities.id("quantum_coolant")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).temperature(0)) + .color(0x0040ef).secondaryColor(0x0030cf) + .buildAndRegister(); + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/config/UtilConfig.java b/src/main/java/net/neganote/gtutilities/config/UtilConfig.java index 6b044a9..64b337d 100644 --- a/src/main/java/net/neganote/gtutilities/config/UtilConfig.java +++ b/src/main/java/net/neganote/gtutilities/config/UtilConfig.java @@ -6,6 +6,7 @@ import dev.toma.configuration.Configuration; import dev.toma.configuration.config.Config; +import dev.toma.configuration.config.ConfigHolder; import dev.toma.configuration.config.Configurable; import dev.toma.configuration.config.format.ConfigFormats; @@ -14,8 +15,11 @@ public class UtilConfig { public static UtilConfig INSTANCE; + public static ConfigHolder CONFIG_HOLDER; + public static void init() { - INSTANCE = Configuration.registerConfig(UtilConfig.class, ConfigFormats.yaml()).getConfigInstance(); + CONFIG_HOLDER = Configuration.registerConfig(UtilConfig.class, ConfigFormats.yaml()); + INSTANCE = CONFIG_HOLDER.getConfigInstance(); } @Configurable @@ -39,5 +43,24 @@ public static class FeatureConfigs { @Configurable @Configurable.Comment("The energy capacity of the Omni-breaker.") public long omnibreakerEnergyCapacity = 40_960_000L; + + @Configurable + @Configurable.Comment({ "Whether the Power-Transfer Einstein-Rosen Bridge is enabled." }) + public boolean pterbEnabled = true; + + @Configurable + @Configurable.Comment({ "Base amount of PTERB coolant to drain every second.", + "(Setting both this amount and the IO multiplier to 0 disables the coolant mechanic.)" }) + public int pterbCoolantBaseDrain = 0; + + @Configurable + @Configurable.Comment({ "Multiplier over IO amount for additional coolant drain.", + "(Setting both this and the base drain amount to 0 disables the coolant mechanic.)" }) + public float pterbCoolantIOMultiplier = 0; + } + + public static boolean coolantEnabled() { + return UtilConfig.INSTANCE.features.pterbCoolantBaseDrain != 0 && + UtilConfig.INSTANCE.features.pterbCoolantIOMultiplier != 0.0f; } } diff --git a/src/main/java/net/neganote/gtutilities/data/lang/UtilLangHandler.java b/src/main/java/net/neganote/gtutilities/data/lang/UtilLangHandler.java deleted file mode 100644 index 8c7d128..0000000 --- a/src/main/java/net/neganote/gtutilities/data/lang/UtilLangHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.neganote.gtutilities.data.lang; - -import com.tterrag.registrate.providers.RegistrateLangProvider; - -public class UtilLangHandler { - - public static void init(RegistrateLangProvider provider) { - provider.add("tooltip.omnibreaker.can_break_anything", "The Omni-breaker can insta-mine ANYTHING!"); - provider.add("tooltip.omnibreaker.charge_status", "Energy: %s EU / %s EU"); - provider.add("tooltip.omnibreaker.right_click_function", "Break individual blocks with right-click!"); - } -} diff --git a/src/main/java/net/neganote/gtutilities/data/UtilDatagen.java b/src/main/java/net/neganote/gtutilities/datagen/UtilDatagen.java similarity index 72% rename from src/main/java/net/neganote/gtutilities/data/UtilDatagen.java rename to src/main/java/net/neganote/gtutilities/datagen/UtilDatagen.java index ac8751d..4a6ab34 100644 --- a/src/main/java/net/neganote/gtutilities/data/UtilDatagen.java +++ b/src/main/java/net/neganote/gtutilities/datagen/UtilDatagen.java @@ -1,6 +1,6 @@ -package net.neganote.gtutilities.data; +package net.neganote.gtutilities.datagen; -import net.neganote.gtutilities.data.lang.UtilLangHandler; +import net.neganote.gtutilities.datagen.lang.UtilLangHandler; import com.tterrag.registrate.providers.ProviderType; diff --git a/src/main/java/net/neganote/gtutilities/datagen/lang/UtilLangHandler.java b/src/main/java/net/neganote/gtutilities/datagen/lang/UtilLangHandler.java new file mode 100644 index 0000000..9655ee8 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/datagen/lang/UtilLangHandler.java @@ -0,0 +1,49 @@ +package net.neganote.gtutilities.datagen.lang; + +import net.neganote.gtutilities.GregTechModernUtilities; +import net.neganote.gtutilities.config.UtilConfig; + +import com.tterrag.registrate.providers.RegistrateLangProvider; +import dev.toma.configuration.config.value.ConfigValue; +import dev.toma.configuration.config.value.ObjectValue; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class UtilLangHandler { + + public static void init(RegistrateLangProvider provider) { + provider.add("tooltip.omnibreaker.can_break_anything", "The Omni-breaker can insta-mine ANYTHING!"); + provider.add("tooltip.omnibreaker.charge_status", "Energy: %s EU / %s EU"); + provider.add("tooltip.omnibreaker.right_click_function", "Break individual blocks with right-click!"); + + provider.add("tooltip.pterb_machine.uses_coolant", "Drains %s to function!"); + + provider.add("gtmutils.multiblock.pterb_machine.coolant_usage", "§cDrains %sL of %s per second"); + provider.add("gtmutils.pterb_machine.invalid_frequency", "PTERBs will not work on frequency 0!"); + + provider.add("gtmutils.gui.pterb.wireless_configurator.title", "Wireless frequency"); + + provider.add("tooltip.pterb_machine.purpose", "Wireless Active Transformer (PTERB)"); + provider.add("tooltip.pterb_machine.frequencies", + "All PTERBs with the same frequency act like a single Active Transformer."); + provider.add("gtmutils.pterb.current_frequency", "Current frequency: %s"); + + provider.add("config.jade.plugin_gtmutils.frequency_info", "PTERB Frequency Info"); + + dfs(provider, new HashSet<>(), UtilConfig.CONFIG_HOLDER.getValueMap()); + } + + private static void dfs(RegistrateLangProvider provider, Set added, Map> map) { + for (var entry : map.entrySet()) { + var id = entry.getValue().getId(); + if (added.add(id)) { + provider.add(String.format("config.%s.option.%s", GregTechModernUtilities.MOD_ID, id), id); + } + if (entry.getValue() instanceof ObjectValue objectValue) { + dfs(provider, added, objectValue.get()); + } + } + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java b/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java new file mode 100644 index 0000000..f42f017 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/jade/UtilJadePlugin.java @@ -0,0 +1,25 @@ +package net.neganote.gtutilities.integration.jade; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neganote.gtutilities.integration.jade.provider.PTERBFrequencyProvider; + +import snownee.jade.api.IWailaClientRegistration; +import snownee.jade.api.IWailaCommonRegistration; +import snownee.jade.api.IWailaPlugin; +import snownee.jade.api.WailaPlugin; + +@SuppressWarnings("unused") +@WailaPlugin +public class UtilJadePlugin implements IWailaPlugin { + + @Override + public void register(IWailaCommonRegistration registration) { + registration.registerBlockDataProvider(new PTERBFrequencyProvider(), BlockEntity.class); + } + + @Override + public void registerClient(IWailaClientRegistration registration) { + registration.registerBlockComponent(new PTERBFrequencyProvider(), Block.class); + } +} diff --git a/src/main/java/net/neganote/gtutilities/integration/jade/provider/PTERBFrequencyProvider.java b/src/main/java/net/neganote/gtutilities/integration/jade/provider/PTERBFrequencyProvider.java new file mode 100644 index 0000000..c82edbb --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/integration/jade/provider/PTERBFrequencyProvider.java @@ -0,0 +1,50 @@ +package net.neganote.gtutilities.integration.jade.provider; + +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neganote.gtutilities.GregTechModernUtilities; +import net.neganote.gtutilities.common.machine.multiblock.PTERBMachine; + +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public class PTERBFrequencyProvider implements IBlockComponentProvider, IServerDataProvider { + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { + BlockEntity be = blockAccessor.getBlockEntity(); + if (be instanceof MetaMachineBlockEntity mmbe && mmbe.getMetaMachine() instanceof PTERBMachine) { + CompoundTag data = blockAccessor.getServerData().getCompound(getUid().toString()); + if (data.contains("frequencyData")) { + var tag = data.getCompound("frequencyData"); + iTooltip.add(Component.translatable("gtmutils.pterb.current_frequency", + FormattingUtil.formatNumbers(tag.getInt("currentFrequency")))); + } + } + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + CompoundTag data = compoundTag.getCompound(getUid().toString()); + if (blockAccessor.getBlockEntity() instanceof MetaMachineBlockEntity mmbe && + mmbe.getMetaMachine() instanceof PTERBMachine pterb) { + CompoundTag freqData = new CompoundTag(); + freqData.putInt("currentFrequency", pterb.getFrequency()); + data.put("frequencyData", freqData); + } + compoundTag.put(getUid().toString(), data); + } + + @Override + public ResourceLocation getUid() { + return GregTechModernUtilities.id("frequency_info"); + } +} diff --git a/src/main/java/net/neganote/gtutilities/recipe/UtilRecipes.java b/src/main/java/net/neganote/gtutilities/recipe/UtilRecipes.java index eb1a346..851ad68 100644 --- a/src/main/java/net/neganote/gtutilities/recipe/UtilRecipes.java +++ b/src/main/java/net/neganote/gtutilities/recipe/UtilRecipes.java @@ -1,16 +1,23 @@ package net.neganote.gtutilities.recipe; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.machines.GTMultiMachines; import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.data.recipe.CustomTags; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.world.item.ItemStack; +import net.neganote.gtutilities.common.machine.UtilMachines; import net.neganote.gtutilities.config.UtilConfig; import java.util.function.Consumer; +import static com.gregtechceu.gtceu.common.data.GTBlocks.LASER_PIPES; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.ASSEMBLER_RECIPES; +import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.ASSEMBLY_LINE_RECIPES; import static com.gregtechceu.gtceu.data.recipe.CraftingComponent.*; import static net.neganote.gtutilities.common.item.UtilItems.OMNIBREAKER; import static net.neganote.gtutilities.common.machine.UtilMachines.ENERGY_CONVERTER_64A; @@ -26,6 +33,26 @@ public static void init(Consumer provider) { if (UtilConfig.INSTANCE.features.omnibreakerEnabled) { registerOmnitoolRecipe(provider); } + + if (UtilConfig.INSTANCE.features.pterbEnabled) { + ASSEMBLY_LINE_RECIPES.recipeBuilder("pterb") + .inputItems(GTMultiMachines.ACTIVE_TRANSFORMER) + .inputItems(TagPrefix.plate, GTMaterials.Neutronium, 32) + .inputItems(SENSOR.getIngredient(GTValues.UV), 8) + .inputItems(EMITTER.getIngredient(GTValues.UV), 8) + .inputItems(FIELD_GENERATOR.getIngredient(GTValues.UV), 4) + .inputItems(CustomTags.UHV_CIRCUITS, 2) + .inputItems(TagPrefix.pipeLargeFluid, GTMaterials.Neutronium, 4) + .inputItems(CABLE_QUAD.getIngredient(GTValues.UV), 8) + .inputItems(LASER_PIPES[0], 8) + .inputFluids(GTMaterials.SolderingAlloy.getFluid(GTValues.L * 32)) + .EUt(1_600_000L) + .duration(1200) + .outputItems(UtilMachines.PTERB_MACHINE) + .stationResearch(b -> b + .researchStack(GTMultiMachines.ACTIVE_TRANSFORMER.asStack()).CWUt(16)) + .save(provider); + } } public static void register64AConverterRecipes(Consumer provider) { diff --git a/src/main/java/net/neganote/gtutilities/saveddata/PTERBSavedData.java b/src/main/java/net/neganote/gtutilities/saveddata/PTERBSavedData.java new file mode 100644 index 0000000..d45fb86 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/saveddata/PTERBSavedData.java @@ -0,0 +1,290 @@ +package net.neganote.gtutilities.saveddata; + +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.common.machine.multiblock.part.EnergyHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.LaserHatchPartMachine; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import com.mojang.datafixers.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PTERBSavedData extends SavedData { + + public Map>> energyInputs; + public Map>> energyOutputs; + + public static String DATA_NAME = "pterb_energy"; + public static String ENERGY_INPUT_FREQUENCIES = "pterb_energy_input_frequencies"; + public static String ENERGY_OUTPUT_FREQUENCIES = "pterb_energy_output_frequencies"; + + private final ServerLevel serverLevel; + + private PTERBSavedData(ServerLevel serverLevel) { + energyInputs = new HashMap<>(); + energyOutputs = new HashMap<>(); + this.serverLevel = serverLevel; + } + + private PTERBSavedData(ServerLevel serverLevel, CompoundTag tag) { + this(serverLevel); + var energyInputsTag = tag.getCompound("energy_inputs"); + var energyOutputsTag = tag.getCompound("energy_outputs"); + + var energyInputFrequencies = energyInputsTag.getList(ENERGY_INPUT_FREQUENCIES, CompoundTag.TAG_COMPOUND); + for (Tag t1 : energyInputFrequencies) { + CompoundTag freqCompoundTag = (CompoundTag) t1; + int freq = freqCompoundTag.getInt("frequency"); + var inputs = freqCompoundTag.getList("inputs", CompoundTag.TAG_COMPOUND); + List> energyInputPairs = getEnergyPairs(inputs); + energyInputs.put(freq, energyInputPairs); + } + + var energyOutputFrequencies = energyOutputsTag.getList(ENERGY_OUTPUT_FREQUENCIES, CompoundTag.TAG_COMPOUND); + for (Tag t1 : energyOutputFrequencies) { + CompoundTag freqCompoundTag = (CompoundTag) t1; + int freq = freqCompoundTag.getInt("frequency"); + var outputs = freqCompoundTag.getList("outputs", CompoundTag.TAG_COMPOUND); + List> energyOutputPairs = getEnergyPairs(outputs); + energyOutputs.put(freq, energyOutputPairs); + } + } + + private static @NotNull List> getEnergyPairs(ListTag tags) { + List> energyPairs = new ArrayList<>(); + for (Tag t2 : tags) { + CompoundTag energyTag = (CompoundTag) t2; + String dimensionNamespace = energyTag.getString("dimension_namespace"); + String dimensionPath = energyTag.getString("dimension_path"); + ResourceLocation dimension = new ResourceLocation(dimensionNamespace, dimensionPath); + int x = energyTag.getInt("block_pos_x"); + int y = energyTag.getInt("block_pos_y"); + int z = energyTag.getInt("block_pos_z"); + BlockPos pos = new BlockPos(x, y, z); + energyPairs.add(new Pair<>(dimension, pos)); + } + return energyPairs; + } + + public static PTERBSavedData getOrCreate(ServerLevel serverLevel) { + return serverLevel.getDataStorage().computeIfAbsent((tag) -> new PTERBSavedData(serverLevel, tag), + () -> new PTERBSavedData(serverLevel), DATA_NAME); + } + + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag nbt) { + CompoundTag energyInputsTag = new CompoundTag(); + CompoundTag energyOutputsTag = new CompoundTag(); + + ListTag energyInputFrequencies = new ListTag(); + for (Integer freq : energyInputs.keySet()) { + CompoundTag freqCompoundTag = new CompoundTag(); + freqCompoundTag.putInt("frequency", freq); + + List> energyInputPairs = energyInputs.get(freq); + ListTag inputs = getEnergyTags(energyInputPairs); + freqCompoundTag.put("inputs", inputs); + energyInputFrequencies.add(freqCompoundTag); + } + energyInputsTag.put(ENERGY_INPUT_FREQUENCIES, energyInputFrequencies); + nbt.put("energy_inputs", energyInputsTag); + + ListTag energyOutputFrequencies = new ListTag(); + for (Integer freq : energyInputs.keySet()) { + CompoundTag freqCompoundTag = new CompoundTag(); + freqCompoundTag.putInt("frequency", freq); + + List> energyInputPairs = energyInputs.get(freq); + ListTag inputs = getEnergyTags(energyInputPairs); + freqCompoundTag.put("outputs", inputs); + energyOutputFrequencies.add(freqCompoundTag); + } + energyOutputsTag.put(ENERGY_OUTPUT_FREQUENCIES, energyOutputFrequencies); + nbt.put("energy_outputs", energyOutputsTag); + + return nbt; + } + + private static @NotNull ListTag getEnergyTags(List> pairs) { + ListTag tags = new ListTag(); + for (Pair pair : pairs) { + CompoundTag energyTag = new CompoundTag(); + ResourceLocation dimension = pair.getFirst(); + energyTag.putString("dimension_namespace", dimension.getNamespace()); + energyTag.putString("dimension_path", dimension.getPath()); + BlockPos pos = pair.getSecond(); + energyTag.putInt("block_pos_x", pos.getX()); + energyTag.putInt("block_pos_y", pos.getY()); + energyTag.putInt("block_pos_z", pos.getZ()); + tags.add(energyTag); + } + return tags; + } + + public void addEnergyInputs(int freq, List parts) { + List> inputPairs = energyInputs.computeIfAbsent(freq, + (f) -> new ArrayList<>()); + boolean changed = false; + for (IMultiPart part : parts) { + if (part instanceof MetaMachine machine) { + ServerLevel level = (ServerLevel) machine.getLevel(); + assert level != null; + ResourceLocation dimension = level.dimension().location(); + BlockPos pos = machine.getPos(); + Pair pair = new Pair<>(dimension, pos); + if (!inputPairs.contains(pair)) { + inputPairs.add(pair); + changed = true; + } + } + } + if (changed) { + setDirty(); + } + energyInputs.put(freq, inputPairs); + } + + public void removeEnergyInputs(int freq, List parts) { + List> inputPairs = energyInputs.computeIfAbsent(freq, + (f) -> new ArrayList<>()); + boolean changed = false; + for (IMultiPart part : parts) { + if (part instanceof MetaMachine machine) { + ServerLevel level = (ServerLevel) machine.getLevel(); + assert level != null; + ResourceLocation dimension = level.dimension().location(); + BlockPos pos = machine.getPos(); + Pair pair = new Pair<>(dimension, pos); + if (inputPairs.remove(pair)) { + changed = true; + } + } + } + if (changed) { + setDirty(); + } + energyInputs.put(freq, inputPairs); + } + + public void addEnergyOutputs(int freq, List parts) { + List> outputPairs = energyOutputs.computeIfAbsent(freq, + (f) -> new ArrayList<>()); + boolean changed = false; + for (IMultiPart part : parts) { + if (part instanceof MetaMachine machine) { + ServerLevel level = (ServerLevel) machine.getLevel(); + assert level != null; + ResourceLocation dimension = level.dimension().location(); + BlockPos pos = machine.getPos(); + Pair pair = new Pair<>(dimension, pos); + if (!outputPairs.contains(pair)) { + outputPairs.add(pair); + changed = true; + } + } + } + if (changed) { + setDirty(); + } + energyOutputs.put(freq, outputPairs); + } + + public void removeEnergyOutputs(int freq, List parts) { + List> outputPairs = energyOutputs.computeIfAbsent(freq, + (f) -> new ArrayList<>()); + boolean changed = false; + for (IMultiPart part : parts) { + if (part instanceof MetaMachine machine) { + ServerLevel level = (ServerLevel) machine.getLevel(); + assert level != null; + ResourceLocation dimension = level.dimension().location(); + BlockPos pos = machine.getPos(); + Pair pair = new Pair<>(dimension, pos); + if (outputPairs.remove(pair)) { + changed = true; + } + } + } + if (changed) { + setDirty(); + } + energyOutputs.put(freq, outputPairs); + } + + public void saveDataToCache() { + if (isDirty()) { + serverLevel.getDataStorage().save(); + setDirty(false); + } + } + + public EnergyContainerList getWirelessEnergyInputs(int freq) { + List> inputPairs = energyInputs.computeIfAbsent(freq, + (f) -> new ArrayList<>()); + List energyContainerList = new ArrayList<>(); + for (Pair pair : inputPairs) { + ServerLevel dimension = serverLevel.getServer() + .getLevel(ResourceKey.create(Registries.DIMENSION, pair.getFirst())); + if (dimension != null) { + MetaMachine machine = MetaMachine.getMachine(dimension, pair.getSecond()); + if (machine instanceof EnergyHatchPartMachine hatch) { + energyContainerList.add(hatch.energyContainer); + } + if (machine instanceof LaserHatchPartMachine hatch) { + // unfortunately the laser hatch's buffer is private, so I have to do this instead + for (var handler : hatch.getRecipeHandlers()) { + if (handler.getCapability() == EURecipeCapability.CAP && + handler instanceof IEnergyContainer container) { + energyContainerList.add(container); + } + } + } + } + } + return new EnergyContainerList(energyContainerList); + } + + public EnergyContainerList getWirelessEnergyOutputs(int freq) { + List> outputPairs = energyOutputs.computeIfAbsent(freq, + (f) -> new ArrayList<>()); + List energyContainerList = new ArrayList<>(); + for (Pair pair : outputPairs) { + ServerLevel dimension = serverLevel.getServer() + .getLevel(ResourceKey.create(Registries.DIMENSION, pair.getFirst())); + if (dimension != null) { + MetaMachine machine = MetaMachine.getMachine(dimension, pair.getSecond()); + + if (machine instanceof EnergyHatchPartMachine hatch) { + energyContainerList.add(hatch.energyContainer); + } + if (machine instanceof LaserHatchPartMachine hatch) { + // unfortunately the laser hatch's buffer is private, so I have to do this instead + for (var handler : hatch.getRecipeHandlers()) { + if (handler.getCapability() == EURecipeCapability.CAP && + handler instanceof IEnergyContainer container) { + energyContainerList.add(container); + } + } + } + } + } + return new EnergyContainerList(energyContainerList); + } +} diff --git a/src/main/java/net/neganote/gtutilities/utils/EnergyUtils.java b/src/main/java/net/neganote/gtutilities/utils/EnergyUtils.java new file mode 100644 index 0000000..2fee269 --- /dev/null +++ b/src/main/java/net/neganote/gtutilities/utils/EnergyUtils.java @@ -0,0 +1,34 @@ +package net.neganote.gtutilities.utils; + +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.common.machine.multiblock.part.EnergyHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.LaserHatchPartMachine; + +import java.util.ArrayList; +import java.util.List; + +public class EnergyUtils { + + public static EnergyContainerList getEnergyListFromMultiParts(List parts) { + List energyContainerList = new ArrayList<>(); + for (IMultiPart part : parts) { + if (part instanceof EnergyHatchPartMachine hatch) { + energyContainerList.add(hatch.energyContainer); + } + if (part instanceof LaserHatchPartMachine hatch) { + // unfortunately the laser hatch's buffer is private, so I have to do this instead + for (var handler : hatch.getRecipeHandlers()) { + if (handler.getCapability() == EURecipeCapability.CAP && + handler instanceof IEnergyContainer container) { + energyContainerList.add(container); + } + } + } + } + + return new EnergyContainerList(energyContainerList); + } +} diff --git a/src/main/resources/assets/gtmutils/models/render/sphere.blend b/src/main/resources/assets/gtmutils/models/render/sphere.blend new file mode 100644 index 0000000..5e11560 Binary files /dev/null and b/src/main/resources/assets/gtmutils/models/render/sphere.blend differ diff --git a/src/main/resources/assets/gtmutils/models/render/sphere.json b/src/main/resources/assets/gtmutils/models/render/sphere.json new file mode 100644 index 0000000..47afda7 --- /dev/null +++ b/src/main/resources/assets/gtmutils/models/render/sphere.json @@ -0,0 +1,5 @@ +{ + "loader": "forge:obj", + "model": "gtmutils:models/render/sphere.obj", + "automatic_culling": false +} \ No newline at end of file diff --git a/src/main/resources/assets/gtmutils/models/render/sphere.mtl b/src/main/resources/assets/gtmutils/models/render/sphere.mtl new file mode 100644 index 0000000..53a2e8b --- /dev/null +++ b/src/main/resources/assets/gtmutils/models/render/sphere.mtl @@ -0,0 +1,12 @@ +# Blender 4.0.2 MTL File: 'sphere.blend' +# www.blender.org + +newmtl Material.001 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 diff --git a/src/main/resources/assets/gtmutils/models/render/sphere.obj b/src/main/resources/assets/gtmutils/models/render/sphere.obj new file mode 100644 index 0000000..dcbdd28 --- /dev/null +++ b/src/main/resources/assets/gtmutils/models/render/sphere.obj @@ -0,0 +1,2186 @@ +# Blender 4.0.2 +# www.blender.org +mtllib sphere.mtl +o Sphere +v -0.966798 -0.163974 0.163931 +v -0.971115 -0.080505 0.180934 +v -0.971115 -0.180966 0.080505 +v -0.984039 -0.080505 0.080505 +v -0.805068 -0.322067 0.483062 +v -0.816889 -0.241514 0.501072 +v -0.833125 -0.080505 0.525835 +v -0.805811 -0.484236 0.323615 +v -0.820961 -0.386451 0.387380 +v -0.866378 -0.241514 0.402523 +v -0.897596 -0.080505 0.402523 +v -0.817925 -0.502996 0.241514 +v -0.867562 -0.402523 0.241514 +v -0.933308 -0.227192 0.227166 +v -0.950021 -0.080505 0.261438 +v -0.833615 -0.526888 0.080505 +v -0.898236 -0.402523 0.080505 +v -0.950171 -0.261471 0.080505 +v -0.657544 -0.346493 0.657544 +v -0.677771 -0.241514 0.677771 +v -0.696308 -0.080505 0.696308 +v -0.668890 -0.514659 0.515440 +v -0.716887 -0.387950 0.552921 +v -0.758276 -0.241514 0.581577 +v -0.776813 -0.080505 0.606340 +v -0.657233 -0.657041 0.344522 +v -0.716731 -0.553117 0.387738 +v -0.776229 -0.429407 0.430954 +v -0.677997 -0.677522 0.241514 +v -0.758502 -0.583500 0.241514 +v -0.696783 -0.696453 0.080505 +v -0.777288 -0.607393 0.080505 +v -0.483062 -0.322067 0.805068 +v -0.501072 -0.241514 0.816889 +v -0.525835 -0.080505 0.833125 +v -0.515440 -0.514659 0.668890 +v -0.552921 -0.387950 0.716887 +v -0.581577 -0.241514 0.758276 +v -0.606340 -0.080505 0.776813 +v -0.515540 -0.670401 0.515540 +v -0.569160 -0.568329 0.569160 +v -0.622779 -0.453833 0.622779 +v -0.485729 -0.806853 0.325771 +v -0.554304 -0.717391 0.388816 +v -0.622880 -0.621998 0.451861 +v -0.503971 -0.818906 0.241514 +v -0.584476 -0.758027 0.241514 +v -0.526770 -0.833839 0.080505 +v -0.607274 -0.776957 0.080505 +v -0.323615 -0.484236 0.805811 +v -0.387380 -0.386451 0.820961 +v -0.402523 -0.241514 0.866378 +v -0.402523 -0.080505 0.897596 +v -0.344522 -0.657041 0.657233 +v -0.387738 -0.553117 0.716731 +v -0.430955 -0.429407 0.776229 +v -0.325771 -0.806853 0.485729 +v -0.388816 -0.717391 0.554304 +v -0.451861 -0.621998 0.622880 +v -0.388674 -0.823199 0.388674 +v -0.433111 -0.777740 0.433111 +v -0.402523 -0.869880 0.241514 +v -0.402523 -0.899140 0.080505 +v -0.163931 -0.163974 0.966798 +v -0.180934 -0.080505 0.971115 +v -0.241514 -0.502996 0.817925 +v -0.241514 -0.402523 0.867563 +v -0.227166 -0.227192 0.933308 +v -0.261438 -0.080505 0.950021 +v -0.241514 -0.677522 0.677997 +v -0.241514 -0.583501 0.758502 +v -0.241514 -0.818906 0.503972 +v -0.241514 -0.758027 0.584476 +v -0.241514 -0.869880 0.402523 +v -0.167401 -0.967662 0.167401 +v -0.229248 -0.935023 0.229248 +v -0.183583 -0.971782 0.080505 +v -0.264088 -0.950851 0.080505 +v -0.080505 -0.180966 0.971115 +v -0.080505 -0.080505 0.984039 +v -0.080505 -0.526888 0.833615 +v -0.080505 -0.402523 0.898236 +v -0.080505 -0.261471 0.950171 +v -0.080505 -0.696453 0.696783 +v -0.080505 -0.607393 0.777288 +v -0.080505 -0.833839 0.526770 +v -0.080505 -0.776957 0.607275 +v -0.080505 -0.899140 0.402523 +v -0.080505 -0.971782 0.183583 +v -0.080505 -0.950851 0.264088 +v -0.080505 -0.984758 0.080505 +v -0.971115 0.080505 0.180934 +v -0.966798 0.163974 0.163931 +v -0.984039 0.080505 0.080505 +v -0.971115 0.180966 0.080505 +v -0.833125 0.080505 0.525835 +v -0.816889 0.241514 0.501072 +v -0.805068 0.322067 0.483062 +v -0.897596 0.080505 0.402523 +v -0.866378 0.241514 0.402523 +v -0.820961 0.386451 0.387380 +v -0.805811 0.484236 0.323615 +v -0.950021 0.080505 0.261438 +v -0.933308 0.227192 0.227166 +v -0.867562 0.402523 0.241514 +v -0.817925 0.502996 0.241514 +v -0.950171 0.261471 0.080505 +v -0.898236 0.402523 0.080505 +v -0.833615 0.526888 0.080505 +v -0.696308 0.080505 0.696308 +v -0.677771 0.241514 0.677771 +v -0.657544 0.346493 0.657544 +v -0.776813 0.080505 0.606340 +v -0.758276 0.241514 0.581577 +v -0.716887 0.387950 0.552921 +v -0.668890 0.514659 0.515440 +v -0.776229 0.429407 0.430954 +v -0.716731 0.553117 0.387738 +v -0.657233 0.657041 0.344522 +v -0.758502 0.583500 0.241514 +v -0.677997 0.677522 0.241514 +v -0.777288 0.607393 0.080505 +v -0.696783 0.696453 0.080505 +v -0.525835 0.080505 0.833125 +v -0.501072 0.241514 0.816889 +v -0.483062 0.322067 0.805068 +v -0.606340 0.080505 0.776813 +v -0.581577 0.241514 0.758276 +v -0.552921 0.387950 0.716887 +v -0.515440 0.514659 0.668890 +v -0.622779 0.453833 0.622779 +v -0.569160 0.568329 0.569160 +v -0.515540 0.670401 0.515540 +v -0.622880 0.621998 0.451861 +v -0.554304 0.717391 0.388816 +v -0.485729 0.806853 0.325771 +v -0.584476 0.758027 0.241514 +v -0.503971 0.818906 0.241514 +v -0.607274 0.776957 0.080505 +v -0.526770 0.833839 0.080505 +v -0.402523 0.080505 0.897596 +v -0.402523 0.241514 0.866378 +v -0.387380 0.386451 0.820961 +v -0.323615 0.484236 0.805811 +v -0.430955 0.429407 0.776229 +v -0.387738 0.553117 0.716731 +v -0.344522 0.657041 0.657233 +v -0.451861 0.621998 0.622880 +v -0.388816 0.717391 0.554304 +v -0.325771 0.806853 0.485729 +v -0.433111 0.777740 0.433111 +v -0.388674 0.823199 0.388674 +v -0.402523 0.869880 0.241514 +v -0.402523 0.899140 0.080505 +v -0.180934 0.080505 0.971115 +v -0.163931 0.163974 0.966798 +v -0.261438 0.080505 0.950021 +v -0.227166 0.227192 0.933308 +v -0.241514 0.402523 0.867563 +v -0.241514 0.502996 0.817925 +v -0.241514 0.583501 0.758502 +v -0.241514 0.677522 0.677997 +v -0.241514 0.758027 0.584476 +v -0.241514 0.818906 0.503972 +v -0.241514 0.869880 0.402523 +v -0.229248 0.935023 0.229248 +v -0.167401 0.967662 0.167401 +v -0.264088 0.950851 0.080505 +v -0.183583 0.971782 0.080505 +v -0.080505 0.080505 0.984039 +v -0.080505 0.180966 0.971115 +v -0.080505 0.261471 0.950171 +v -0.080505 0.402523 0.898236 +v -0.080505 0.526888 0.833615 +v -0.080505 0.607393 0.777288 +v -0.080505 0.696453 0.696783 +v -0.080505 0.776957 0.607275 +v -0.080505 0.833839 0.526770 +v -0.080505 0.899140 0.402523 +v -0.080505 0.950851 0.264088 +v -0.080505 0.971782 0.183583 +v -0.080505 0.984758 0.080505 +v -0.971115 -0.180966 -0.080505 +v -0.984039 -0.080505 -0.080505 +v -0.966798 -0.163974 -0.163931 +v -0.971115 -0.080505 -0.180934 +v -0.833615 -0.526888 -0.080505 +v -0.898236 -0.402523 -0.080505 +v -0.950171 -0.261471 -0.080505 +v -0.817925 -0.502996 -0.241514 +v -0.867562 -0.402523 -0.241514 +v -0.933308 -0.227192 -0.227166 +v -0.950021 -0.080505 -0.261438 +v -0.805811 -0.484236 -0.323615 +v -0.820961 -0.386451 -0.387380 +v -0.866378 -0.241514 -0.402523 +v -0.897596 -0.080505 -0.402523 +v -0.805068 -0.322067 -0.483062 +v -0.816889 -0.241514 -0.501072 +v -0.833125 -0.080505 -0.525835 +v -0.696783 -0.696453 -0.080505 +v -0.777288 -0.607393 -0.080505 +v -0.677997 -0.677522 -0.241514 +v -0.758502 -0.583500 -0.241514 +v -0.657233 -0.657041 -0.344522 +v -0.716731 -0.553117 -0.387738 +v -0.776229 -0.429407 -0.430954 +v -0.668890 -0.514659 -0.515440 +v -0.716887 -0.387950 -0.552921 +v -0.758276 -0.241514 -0.581577 +v -0.776813 -0.080505 -0.606340 +v -0.657544 -0.346493 -0.657544 +v -0.677771 -0.241514 -0.677771 +v -0.696308 -0.080505 -0.696308 +v -0.526770 -0.833839 -0.080505 +v -0.607274 -0.776957 -0.080505 +v -0.503971 -0.818906 -0.241514 +v -0.584476 -0.758027 -0.241514 +v -0.485729 -0.806853 -0.325771 +v -0.554304 -0.717391 -0.388816 +v -0.622880 -0.621998 -0.451861 +v -0.515540 -0.670401 -0.515540 +v -0.569160 -0.568329 -0.569160 +v -0.622779 -0.453833 -0.622779 +v -0.515440 -0.514659 -0.668890 +v -0.552921 -0.387950 -0.716887 +v -0.581577 -0.241514 -0.758276 +v -0.606340 -0.080505 -0.776813 +v -0.483062 -0.322067 -0.805068 +v -0.501072 -0.241514 -0.816889 +v -0.525835 -0.080505 -0.833125 +v -0.402523 -0.899140 -0.080505 +v -0.402523 -0.869880 -0.241514 +v -0.388674 -0.823199 -0.388674 +v -0.433111 -0.777740 -0.433111 +v -0.325771 -0.806853 -0.485729 +v -0.388816 -0.717391 -0.554304 +v -0.451861 -0.621998 -0.622880 +v -0.344522 -0.657041 -0.657233 +v -0.387738 -0.553117 -0.716731 +v -0.430955 -0.429407 -0.776229 +v -0.323615 -0.484236 -0.805811 +v -0.387380 -0.386451 -0.820961 +v -0.402523 -0.241514 -0.866378 +v -0.402523 -0.080505 -0.897596 +v -0.183583 -0.971782 -0.080505 +v -0.264088 -0.950851 -0.080505 +v -0.167401 -0.967662 -0.167401 +v -0.229248 -0.935023 -0.229248 +v -0.241514 -0.869880 -0.402523 +v -0.241514 -0.818906 -0.503971 +v -0.241514 -0.758027 -0.584476 +v -0.241514 -0.677522 -0.677997 +v -0.241514 -0.583501 -0.758502 +v -0.241514 -0.502996 -0.817925 +v -0.241514 -0.402523 -0.867563 +v -0.227166 -0.227192 -0.933308 +v -0.261438 -0.080505 -0.950021 +v -0.163931 -0.163974 -0.966798 +v -0.180934 -0.080505 -0.971115 +v -0.080505 -0.984758 -0.080505 +v -0.080505 -0.971782 -0.183583 +v -0.080505 -0.950851 -0.264088 +v -0.080505 -0.899140 -0.402523 +v -0.080505 -0.833839 -0.526770 +v -0.080505 -0.776957 -0.607275 +v -0.080505 -0.696453 -0.696783 +v -0.080505 -0.607393 -0.777288 +v -0.080505 -0.526888 -0.833615 +v -0.080505 -0.402523 -0.898236 +v -0.080505 -0.261471 -0.950171 +v -0.080505 -0.180967 -0.971115 +v -0.080505 -0.080505 -0.984040 +v -0.984039 0.080505 -0.080505 +v -0.971115 0.180966 -0.080505 +v -0.971115 0.080505 -0.180934 +v -0.966798 0.163974 -0.163931 +v -0.950171 0.261471 -0.080505 +v -0.898236 0.402523 -0.080505 +v -0.833615 0.526888 -0.080505 +v -0.950021 0.080505 -0.261438 +v -0.933308 0.227192 -0.227166 +v -0.867562 0.402523 -0.241514 +v -0.817925 0.502996 -0.241514 +v -0.897596 0.080505 -0.402523 +v -0.866378 0.241514 -0.402523 +v -0.820961 0.386451 -0.387380 +v -0.805811 0.484236 -0.323615 +v -0.833125 0.080505 -0.525835 +v -0.816889 0.241514 -0.501072 +v -0.805068 0.322067 -0.483062 +v -0.777288 0.607393 -0.080505 +v -0.696783 0.696453 -0.080505 +v -0.758502 0.583500 -0.241514 +v -0.677997 0.677522 -0.241514 +v -0.776229 0.429407 -0.430954 +v -0.716731 0.553117 -0.387738 +v -0.657233 0.657041 -0.344522 +v -0.776813 0.080505 -0.606340 +v -0.758276 0.241514 -0.581577 +v -0.716887 0.387950 -0.552921 +v -0.668890 0.514659 -0.515440 +v -0.696308 0.080505 -0.696308 +v -0.677771 0.241514 -0.677771 +v -0.657544 0.346493 -0.657544 +v -0.607274 0.776957 -0.080505 +v -0.526770 0.833839 -0.080505 +v -0.584476 0.758027 -0.241514 +v -0.503971 0.818906 -0.241514 +v -0.622880 0.621998 -0.451861 +v -0.554304 0.717391 -0.388816 +v -0.485729 0.806853 -0.325771 +v -0.622779 0.453833 -0.622779 +v -0.569160 0.568329 -0.569160 +v -0.515540 0.670401 -0.515540 +v -0.606340 0.080505 -0.776813 +v -0.581577 0.241514 -0.758276 +v -0.552921 0.387950 -0.716887 +v -0.515439 0.514659 -0.668890 +v -0.525835 0.080505 -0.833125 +v -0.501072 0.241514 -0.816889 +v -0.483062 0.322067 -0.805068 +v -0.402523 0.899140 -0.080505 +v -0.402523 0.869880 -0.241514 +v -0.433111 0.777740 -0.433111 +v -0.388674 0.823199 -0.388674 +v -0.451861 0.621998 -0.622880 +v -0.388816 0.717391 -0.554304 +v -0.325771 0.806853 -0.485729 +v -0.430955 0.429407 -0.776229 +v -0.387738 0.553117 -0.716731 +v -0.344522 0.657041 -0.657233 +v -0.402523 0.080505 -0.897596 +v -0.402523 0.241514 -0.866378 +v -0.387380 0.386451 -0.820961 +v -0.323615 0.484236 -0.805811 +v -0.264088 0.950851 -0.080505 +v -0.183583 0.971782 -0.080505 +v -0.229248 0.935023 -0.229248 +v -0.167401 0.967662 -0.167401 +v -0.241514 0.869880 -0.402523 +v -0.241514 0.758027 -0.584476 +v -0.241514 0.818906 -0.503971 +v -0.241514 0.583501 -0.758502 +v -0.241514 0.677522 -0.677997 +v -0.261438 0.080505 -0.950021 +v -0.227166 0.227192 -0.933308 +v -0.241514 0.402523 -0.867563 +v -0.241514 0.502996 -0.817925 +v -0.180934 0.080505 -0.971115 +v -0.163931 0.163974 -0.966798 +v -0.080505 0.984758 -0.080505 +v -0.080505 0.950851 -0.264088 +v -0.080505 0.971782 -0.183583 +v -0.080505 0.899140 -0.402523 +v -0.080505 0.776957 -0.607275 +v -0.080505 0.833839 -0.526770 +v -0.080505 0.607393 -0.777288 +v -0.080505 0.696453 -0.696783 +v -0.080505 0.261471 -0.950171 +v -0.080505 0.402523 -0.898236 +v -0.080505 0.526888 -0.833615 +v -0.080505 0.080505 -0.984040 +v -0.080505 0.180967 -0.971115 +v 0.080505 -0.180966 0.971115 +v 0.080505 -0.080505 0.984039 +v 0.080505 -0.526888 0.833615 +v 0.080505 -0.402523 0.898236 +v 0.080505 -0.261471 0.950171 +v 0.080505 -0.696453 0.696783 +v 0.080505 -0.607393 0.777288 +v 0.080505 -0.833839 0.526770 +v 0.080505 -0.776957 0.607275 +v 0.080505 -0.899140 0.402523 +v 0.080505 -0.971782 0.183583 +v 0.080505 -0.950851 0.264088 +v 0.080505 -0.984758 0.080505 +v 0.163931 -0.163974 0.966798 +v 0.180934 -0.080505 0.971115 +v 0.241514 -0.502996 0.817925 +v 0.241514 -0.402523 0.867563 +v 0.227166 -0.227192 0.933308 +v 0.261439 -0.080505 0.950021 +v 0.241514 -0.677522 0.677997 +v 0.241514 -0.583501 0.758502 +v 0.241514 -0.818906 0.503972 +v 0.241514 -0.758027 0.584476 +v 0.241514 -0.869880 0.402523 +v 0.167401 -0.967662 0.167401 +v 0.229248 -0.935023 0.229248 +v 0.183583 -0.971782 0.080505 +v 0.264088 -0.950851 0.080505 +v 0.323615 -0.484236 0.805811 +v 0.387380 -0.386451 0.820961 +v 0.402523 -0.241514 0.866378 +v 0.402523 -0.080505 0.897596 +v 0.344522 -0.657041 0.657233 +v 0.387738 -0.553117 0.716731 +v 0.430955 -0.429407 0.776229 +v 0.325771 -0.806853 0.485729 +v 0.388816 -0.717391 0.554304 +v 0.451861 -0.621998 0.622880 +v 0.388674 -0.823199 0.388674 +v 0.433111 -0.777740 0.433111 +v 0.402523 -0.869880 0.241514 +v 0.402523 -0.899140 0.080505 +v 0.483062 -0.322067 0.805068 +v 0.501072 -0.241514 0.816889 +v 0.525835 -0.080505 0.833125 +v 0.515440 -0.514659 0.668890 +v 0.552921 -0.387950 0.716887 +v 0.581577 -0.241514 0.758276 +v 0.606340 -0.080505 0.776813 +v 0.515540 -0.670401 0.515540 +v 0.569160 -0.568329 0.569160 +v 0.622779 -0.453833 0.622779 +v 0.485729 -0.806853 0.325771 +v 0.554304 -0.717391 0.388816 +v 0.622880 -0.621998 0.451861 +v 0.503972 -0.818906 0.241514 +v 0.584476 -0.758027 0.241514 +v 0.526770 -0.833839 0.080505 +v 0.607275 -0.776957 0.080505 +v 0.657544 -0.346494 0.657544 +v 0.677771 -0.241514 0.677771 +v 0.696309 -0.080505 0.696309 +v 0.668890 -0.514659 0.515440 +v 0.716887 -0.387950 0.552921 +v 0.758276 -0.241514 0.581577 +v 0.776813 -0.080505 0.606340 +v 0.657233 -0.657041 0.344522 +v 0.716731 -0.553117 0.387738 +v 0.776229 -0.429407 0.430955 +v 0.677997 -0.677522 0.241514 +v 0.758502 -0.583501 0.241514 +v 0.696783 -0.696453 0.080505 +v 0.777288 -0.607393 0.080505 +v 0.805068 -0.322067 0.483062 +v 0.816889 -0.241514 0.501072 +v 0.833125 -0.080505 0.525835 +v 0.805811 -0.484236 0.323615 +v 0.820961 -0.386451 0.387380 +v 0.866378 -0.241514 0.402523 +v 0.897596 -0.080505 0.402523 +v 0.817925 -0.502996 0.241514 +v 0.867563 -0.402523 0.241514 +v 0.933308 -0.227192 0.227166 +v 0.950021 -0.080505 0.261439 +v 0.833615 -0.526888 0.080505 +v 0.898236 -0.402523 0.080505 +v 0.950171 -0.261471 0.080505 +v 0.966798 -0.163974 0.163931 +v 0.971115 -0.080505 0.180934 +v 0.971115 -0.180967 0.080505 +v 0.984040 -0.080505 0.080505 +v 0.080505 0.080505 0.984039 +v 0.080505 0.180966 0.971115 +v 0.080505 0.261471 0.950171 +v 0.080505 0.402523 0.898236 +v 0.080505 0.526888 0.833615 +v 0.080505 0.607393 0.777288 +v 0.080505 0.696453 0.696783 +v 0.080505 0.776957 0.607275 +v 0.080505 0.833839 0.526770 +v 0.080505 0.899140 0.402523 +v 0.080505 0.950851 0.264088 +v 0.080505 0.971782 0.183583 +v 0.080505 0.984758 0.080505 +v 0.180934 0.080505 0.971115 +v 0.163931 0.163974 0.966798 +v 0.261439 0.080505 0.950021 +v 0.227166 0.227192 0.933308 +v 0.241514 0.402523 0.867563 +v 0.241514 0.502996 0.817925 +v 0.241514 0.583501 0.758502 +v 0.241514 0.677522 0.677997 +v 0.241514 0.758027 0.584476 +v 0.241514 0.818906 0.503972 +v 0.241514 0.869880 0.402523 +v 0.229248 0.935023 0.229248 +v 0.167401 0.967662 0.167401 +v 0.264088 0.950851 0.080505 +v 0.183583 0.971782 0.080505 +v 0.402523 0.080505 0.897596 +v 0.402523 0.241514 0.866378 +v 0.387380 0.386451 0.820961 +v 0.323615 0.484236 0.805811 +v 0.430955 0.429407 0.776229 +v 0.387738 0.553117 0.716731 +v 0.344522 0.657041 0.657233 +v 0.451861 0.621998 0.622880 +v 0.388816 0.717391 0.554304 +v 0.325771 0.806853 0.485729 +v 0.433111 0.777740 0.433111 +v 0.388674 0.823199 0.388674 +v 0.402523 0.869880 0.241514 +v 0.402523 0.899140 0.080505 +v 0.525835 0.080505 0.833125 +v 0.501072 0.241514 0.816889 +v 0.483062 0.322067 0.805068 +v 0.606340 0.080505 0.776813 +v 0.581577 0.241514 0.758276 +v 0.552921 0.387950 0.716887 +v 0.515440 0.514659 0.668890 +v 0.622779 0.453833 0.622779 +v 0.569160 0.568329 0.569160 +v 0.515540 0.670401 0.515540 +v 0.622880 0.621998 0.451861 +v 0.554304 0.717391 0.388816 +v 0.485729 0.806853 0.325771 +v 0.584476 0.758027 0.241514 +v 0.503972 0.818906 0.241514 +v 0.607275 0.776957 0.080505 +v 0.526770 0.833839 0.080505 +v 0.696309 0.080505 0.696309 +v 0.677771 0.241514 0.677771 +v 0.657544 0.346494 0.657544 +v 0.776813 0.080505 0.606340 +v 0.758276 0.241514 0.581577 +v 0.716887 0.387950 0.552921 +v 0.668890 0.514659 0.515440 +v 0.776229 0.429407 0.430955 +v 0.716731 0.553117 0.387738 +v 0.657233 0.657041 0.344522 +v 0.758502 0.583501 0.241514 +v 0.677997 0.677522 0.241514 +v 0.777288 0.607393 0.080505 +v 0.696783 0.696453 0.080505 +v 0.833125 0.080505 0.525835 +v 0.816889 0.241514 0.501072 +v 0.805068 0.322067 0.483062 +v 0.897596 0.080505 0.402523 +v 0.866378 0.241514 0.402523 +v 0.820961 0.386451 0.387380 +v 0.805811 0.484236 0.323615 +v 0.950021 0.080505 0.261439 +v 0.933308 0.227192 0.227166 +v 0.867563 0.402523 0.241514 +v 0.817925 0.502996 0.241514 +v 0.950171 0.261471 0.080505 +v 0.898236 0.402523 0.080505 +v 0.833615 0.526888 0.080505 +v 0.971115 0.080505 0.180934 +v 0.966798 0.163974 0.163931 +v 0.984040 0.080505 0.080505 +v 0.971115 0.180967 0.080505 +v 0.080505 -0.984758 -0.080505 +v 0.080505 -0.971782 -0.183583 +v 0.080505 -0.950851 -0.264088 +v 0.080505 -0.899140 -0.402523 +v 0.080505 -0.833839 -0.526770 +v 0.080505 -0.776957 -0.607275 +v 0.080505 -0.696453 -0.696783 +v 0.080505 -0.607393 -0.777288 +v 0.080505 -0.526888 -0.833615 +v 0.080505 -0.402523 -0.898236 +v 0.080505 -0.261471 -0.950171 +v 0.080505 -0.180967 -0.971115 +v 0.080505 -0.080505 -0.984040 +v 0.183583 -0.971782 -0.080505 +v 0.264088 -0.950851 -0.080505 +v 0.167401 -0.967662 -0.167401 +v 0.229248 -0.935023 -0.229248 +v 0.241514 -0.869880 -0.402523 +v 0.241514 -0.818906 -0.503972 +v 0.241514 -0.758027 -0.584476 +v 0.241514 -0.677522 -0.677997 +v 0.241514 -0.583501 -0.758502 +v 0.241514 -0.502996 -0.817925 +v 0.241514 -0.402523 -0.867563 +v 0.227166 -0.227192 -0.933308 +v 0.261439 -0.080505 -0.950021 +v 0.163931 -0.163975 -0.966798 +v 0.180934 -0.080505 -0.971115 +v 0.402523 -0.899140 -0.080505 +v 0.402523 -0.869880 -0.241514 +v 0.388674 -0.823199 -0.388674 +v 0.433111 -0.777740 -0.433111 +v 0.325771 -0.806853 -0.485729 +v 0.388816 -0.717391 -0.554304 +v 0.451861 -0.621998 -0.622880 +v 0.344522 -0.657041 -0.657233 +v 0.387738 -0.553117 -0.716731 +v 0.430955 -0.429407 -0.776229 +v 0.323615 -0.484237 -0.805811 +v 0.387380 -0.386451 -0.820961 +v 0.402523 -0.241514 -0.866378 +v 0.402523 -0.080505 -0.897596 +v 0.526770 -0.833839 -0.080505 +v 0.607275 -0.776957 -0.080505 +v 0.503972 -0.818906 -0.241514 +v 0.584476 -0.758027 -0.241514 +v 0.485729 -0.806853 -0.325771 +v 0.554304 -0.717391 -0.388816 +v 0.622880 -0.621998 -0.451861 +v 0.515540 -0.670401 -0.515540 +v 0.569160 -0.568329 -0.569160 +v 0.622779 -0.453833 -0.622779 +v 0.515440 -0.514659 -0.668890 +v 0.552921 -0.387950 -0.716887 +v 0.581577 -0.241514 -0.758276 +v 0.606340 -0.080505 -0.776813 +v 0.483062 -0.322067 -0.805068 +v 0.501072 -0.241514 -0.816889 +v 0.525835 -0.080505 -0.833125 +v 0.696783 -0.696453 -0.080505 +v 0.777288 -0.607393 -0.080505 +v 0.677997 -0.677522 -0.241514 +v 0.758502 -0.583501 -0.241514 +v 0.657233 -0.657041 -0.344522 +v 0.716731 -0.553117 -0.387738 +v 0.776229 -0.429407 -0.430955 +v 0.668890 -0.514659 -0.515440 +v 0.716887 -0.387950 -0.552921 +v 0.758276 -0.241514 -0.581577 +v 0.776813 -0.080505 -0.606340 +v 0.657544 -0.346494 -0.657544 +v 0.677771 -0.241514 -0.677771 +v 0.696309 -0.080505 -0.696309 +v 0.833615 -0.526888 -0.080505 +v 0.898236 -0.402523 -0.080505 +v 0.950171 -0.261471 -0.080505 +v 0.817925 -0.502996 -0.241514 +v 0.867563 -0.402523 -0.241514 +v 0.933308 -0.227192 -0.227166 +v 0.950021 -0.080505 -0.261439 +v 0.805811 -0.484236 -0.323615 +v 0.820961 -0.386451 -0.387380 +v 0.866378 -0.241514 -0.402523 +v 0.897596 -0.080505 -0.402523 +v 0.805068 -0.322067 -0.483062 +v 0.816889 -0.241514 -0.501072 +v 0.833125 -0.080505 -0.525835 +v 0.971115 -0.180967 -0.080505 +v 0.984040 -0.080505 -0.080505 +v 0.966798 -0.163974 -0.163931 +v 0.971115 -0.080505 -0.180934 +v 0.080505 0.984758 -0.080505 +v 0.080505 0.950851 -0.264088 +v 0.080505 0.971782 -0.183583 +v 0.080505 0.899140 -0.402523 +v 0.080505 0.776957 -0.607275 +v 0.080505 0.833839 -0.526770 +v 0.080505 0.607393 -0.777288 +v 0.080505 0.696453 -0.696783 +v 0.080505 0.261471 -0.950171 +v 0.080505 0.402523 -0.898236 +v 0.080505 0.526888 -0.833615 +v 0.080505 0.080505 -0.984040 +v 0.080505 0.180967 -0.971115 +v 0.264088 0.950851 -0.080505 +v 0.183583 0.971782 -0.080505 +v 0.229248 0.935023 -0.229248 +v 0.167401 0.967662 -0.167401 +v 0.241514 0.869880 -0.402523 +v 0.241514 0.758027 -0.584476 +v 0.241514 0.818906 -0.503972 +v 0.241514 0.583501 -0.758502 +v 0.241514 0.677522 -0.677997 +v 0.261439 0.080505 -0.950021 +v 0.227166 0.227192 -0.933308 +v 0.241514 0.402523 -0.867563 +v 0.241514 0.502996 -0.817925 +v 0.180934 0.080505 -0.971115 +v 0.163931 0.163974 -0.966798 +v 0.402523 0.899140 -0.080505 +v 0.402523 0.869880 -0.241514 +v 0.433111 0.777740 -0.433111 +v 0.388674 0.823199 -0.388674 +v 0.451861 0.621998 -0.622880 +v 0.388816 0.717391 -0.554304 +v 0.325771 0.806853 -0.485729 +v 0.430955 0.429407 -0.776229 +v 0.387738 0.553117 -0.716731 +v 0.344522 0.657041 -0.657233 +v 0.402523 0.080505 -0.897596 +v 0.402523 0.241514 -0.866378 +v 0.387380 0.386451 -0.820961 +v 0.323615 0.484237 -0.805811 +v 0.607275 0.776957 -0.080505 +v 0.526770 0.833839 -0.080505 +v 0.584476 0.758027 -0.241514 +v 0.503972 0.818906 -0.241514 +v 0.622880 0.621998 -0.451861 +v 0.554304 0.717391 -0.388816 +v 0.485729 0.806853 -0.325771 +v 0.622779 0.453833 -0.622779 +v 0.569160 0.568329 -0.569160 +v 0.515540 0.670401 -0.515540 +v 0.606340 0.080505 -0.776813 +v 0.581577 0.241514 -0.758276 +v 0.552921 0.387950 -0.716887 +v 0.515440 0.514659 -0.668890 +v 0.525835 0.080505 -0.833125 +v 0.501072 0.241514 -0.816889 +v 0.483062 0.322067 -0.805068 +v 0.777288 0.607393 -0.080505 +v 0.696783 0.696453 -0.080505 +v 0.758502 0.583501 -0.241514 +v 0.677997 0.677522 -0.241514 +v 0.776229 0.429407 -0.430955 +v 0.716731 0.553117 -0.387738 +v 0.657233 0.657041 -0.344522 +v 0.776813 0.080505 -0.606340 +v 0.758276 0.241514 -0.581577 +v 0.716887 0.387950 -0.552921 +v 0.668890 0.514659 -0.515440 +v 0.696309 0.080505 -0.696309 +v 0.677771 0.241514 -0.677771 +v 0.657544 0.346494 -0.657544 +v 0.950171 0.261471 -0.080505 +v 0.898236 0.402523 -0.080505 +v 0.833615 0.526888 -0.080505 +v 0.950021 0.080505 -0.261439 +v 0.933308 0.227192 -0.227166 +v 0.867563 0.402523 -0.241514 +v 0.817925 0.502996 -0.241514 +v 0.897596 0.080505 -0.402523 +v 0.866378 0.241514 -0.402523 +v 0.820961 0.386451 -0.387380 +v 0.805811 0.484236 -0.323615 +v 0.833125 0.080505 -0.525835 +v 0.816889 0.241514 -0.501072 +v 0.805068 0.322067 -0.483062 +v 0.984040 0.080505 -0.080505 +v 0.971115 0.180967 -0.080505 +v 0.971115 0.080505 -0.180934 +v 0.966798 0.163974 -0.163931 +vn -0.9895 -0.1022 0.1022 +vn -0.8780 -0.2800 0.3883 +vn -0.8775 -0.1640 0.4507 +vn -0.8804 -0.3793 0.2847 +vn -0.8954 -0.3116 0.3182 +vn -0.9228 -0.1816 0.3398 +vn -0.9444 -0.1514 0.2920 +vn -0.8800 -0.4472 0.1599 +vn -0.9246 -0.3357 0.1803 +vn -0.9446 -0.2910 0.1518 +vn -0.7532 -0.2986 0.5861 +vn -0.7450 -0.2974 0.5971 +vn -0.7450 -0.1724 0.6444 +vn -0.8014 -0.1745 0.5720 +vn -0.7454 -0.4717 0.4710 +vn -0.7575 -0.4728 0.4502 +vn -0.7636 -0.4363 0.4761 +vn -0.7439 -0.5933 0.3077 +vn -0.7377 -0.6029 0.3039 +vn -0.7396 -0.6505 0.1728 +vn -0.8000 -0.5751 0.1710 +vn -0.5971 -0.2974 0.7450 +vn -0.5861 -0.2986 0.7532 +vn -0.5720 -0.1745 0.8014 +vn -0.6444 -0.1724 0.7450 +vn -0.5638 -0.4923 0.6631 +vn -0.6631 -0.4923 0.5638 +vn -0.6429 -0.4164 0.6429 +vn -0.5827 -0.6493 0.4887 +vn -0.6481 -0.6381 0.4157 +vn -0.6592 -0.5718 0.4883 +vn -0.6138 -0.7323 0.2950 +vn -0.5995 -0.7409 0.3029 +vn -0.5821 -0.7959 0.1661 +vn -0.6508 -0.7398 0.1710 +vn -0.3883 -0.2800 0.8780 +vn -0.4507 -0.1640 0.8775 +vn -0.4502 -0.4728 0.7575 +vn -0.4710 -0.4717 0.7454 +vn -0.4761 -0.4363 0.7636 +vn -0.4157 -0.6381 0.6481 +vn -0.4887 -0.6493 0.5827 +vn -0.4883 -0.5718 0.6592 +vn -0.4417 -0.7562 0.4827 +vn -0.4827 -0.7562 0.4417 +vn -0.4790 -0.7356 0.4790 +vn -0.3861 -0.8799 0.2769 +vn -0.4526 -0.8785 0.1526 +vn -0.2847 -0.3793 0.8804 +vn -0.3182 -0.3116 0.8954 +vn -0.2920 -0.1514 0.9444 +vn -0.3398 -0.1816 0.9228 +vn -0.3077 -0.5933 0.7439 +vn -0.3039 -0.6029 0.7377 +vn -0.2950 -0.7323 0.6138 +vn -0.3029 -0.7409 0.5995 +vn -0.2769 -0.8799 0.3861 +vn -0.3142 -0.8959 0.3142 +vn -0.2933 -0.9452 0.1435 +vn -0.3398 -0.9245 0.1728 +vn -0.1022 -0.1022 0.9895 +vn -0.1599 -0.4472 0.8800 +vn -0.1803 -0.3357 0.9246 +vn -0.1518 -0.2910 0.9446 +vn -0.1728 -0.6505 0.7396 +vn -0.1710 -0.5751 0.8000 +vn -0.1661 -0.7959 0.5821 +vn -0.1710 -0.7398 0.6508 +vn -0.1526 -0.8785 0.4526 +vn -0.1435 -0.9452 0.2933 +vn -0.1728 -0.9245 0.3398 +vn -0.0974 -0.9905 0.0974 +vn -0.9918 -0.0000 0.1276 +vn -0.9895 0.1022 0.1022 +vn -0.8862 -0.0000 0.4633 +vn -0.8775 0.1640 0.4507 +vn -0.8780 0.2800 0.3883 +vn -0.9374 -0.0000 0.3483 +vn -0.9673 -0.0000 0.2535 +vn -0.9228 0.1816 0.3398 +vn -0.9444 0.1514 0.2920 +vn -0.8954 0.3116 0.3182 +vn -0.8804 0.3793 0.2847 +vn -0.9446 0.2910 0.1518 +vn -0.9246 0.3357 0.1803 +vn -0.8800 0.4472 0.1599 +vn -0.7452 -0.0000 0.6668 +vn -0.8194 -0.0000 0.5732 +vn -0.7450 0.1724 0.6444 +vn -0.8014 0.1745 0.5720 +vn -0.7532 0.2986 0.5861 +vn -0.7450 0.2974 0.5971 +vn -0.7636 0.4363 0.4761 +vn -0.7454 0.4717 0.4710 +vn -0.7575 0.4728 0.4502 +vn -0.7377 0.6029 0.3039 +vn -0.7439 0.5933 0.3077 +vn -0.8000 0.5751 0.1710 +vn -0.7396 0.6505 0.1728 +vn -0.5732 -0.0000 0.8194 +vn -0.6668 -0.0000 0.7452 +vn -0.5720 0.1745 0.8014 +vn -0.6444 0.1724 0.7450 +vn -0.5971 0.2974 0.7450 +vn -0.5861 0.2986 0.7532 +vn -0.6429 0.4164 0.6429 +vn -0.5638 0.4923 0.6631 +vn -0.6631 0.4923 0.5638 +vn -0.6592 0.5718 0.4883 +vn -0.5827 0.6493 0.4887 +vn -0.6481 0.6381 0.4157 +vn -0.5995 0.7409 0.3029 +vn -0.6138 0.7323 0.2950 +vn -0.6508 0.7398 0.1710 +vn -0.5821 0.7959 0.1661 +vn -0.4633 -0.0000 0.8862 +vn -0.4507 0.1640 0.8775 +vn -0.3883 0.2800 0.8780 +vn -0.4761 0.4363 0.7636 +vn -0.4502 0.4728 0.7575 +vn -0.4710 0.4717 0.7454 +vn -0.4883 0.5718 0.6592 +vn -0.4157 0.6381 0.6481 +vn -0.4887 0.6493 0.5827 +vn -0.4790 0.7356 0.4790 +vn -0.4417 0.7562 0.4827 +vn -0.4827 0.7562 0.4417 +vn -0.3861 0.8799 0.2769 +vn -0.4526 0.8785 0.1526 +vn -0.2535 -0.0000 0.9673 +vn -0.3483 -0.0000 0.9374 +vn -0.2920 0.1514 0.9444 +vn -0.3398 0.1816 0.9228 +vn -0.3182 0.3116 0.8954 +vn -0.2847 0.3793 0.8804 +vn -0.3039 0.6029 0.7377 +vn -0.3077 0.5933 0.7439 +vn -0.3029 0.7409 0.5995 +vn -0.2950 0.7323 0.6138 +vn -0.2769 0.8799 0.3861 +vn -0.3142 0.8959 0.3142 +vn -0.3398 0.9245 0.1728 +vn -0.2933 0.9452 0.1435 +vn -0.1276 -0.0000 0.9918 +vn -0.1022 0.1022 0.9895 +vn -0.1518 0.2910 0.9446 +vn -0.1803 0.3357 0.9246 +vn -0.1599 0.4472 0.8800 +vn -0.1710 0.5751 0.8000 +vn -0.1728 0.6505 0.7396 +vn -0.1710 0.7398 0.6508 +vn -0.1661 0.7959 0.5821 +vn -0.1526 0.8785 0.4526 +vn -0.1728 0.9245 0.3398 +vn -0.1435 0.9452 0.2933 +vn -0.0974 0.9905 0.0974 +vn -0.9918 -0.1276 -0.0000 +vn -0.9895 -0.1022 -0.1022 +vn -0.8874 -0.4611 -0.0000 +vn -0.9384 -0.3455 -0.0000 +vn -0.9678 -0.2518 -0.0000 +vn -0.8800 -0.4472 -0.1599 +vn -0.9246 -0.3357 -0.1803 +vn -0.9446 -0.2910 -0.1518 +vn -0.9444 -0.1514 -0.2920 +vn -0.8804 -0.3793 -0.2847 +vn -0.8954 -0.3116 -0.3182 +vn -0.9228 -0.1816 -0.3398 +vn -0.8780 -0.2800 -0.3883 +vn -0.8775 -0.1640 -0.4507 +vn -0.7418 -0.6706 -0.0000 +vn -0.8194 -0.5733 -0.0000 +vn -0.7396 -0.6505 -0.1728 +vn -0.8000 -0.5751 -0.1710 +vn -0.7439 -0.5933 -0.3077 +vn -0.7377 -0.6029 -0.3039 +vn -0.7575 -0.4728 -0.4502 +vn -0.7454 -0.4717 -0.4710 +vn -0.7636 -0.4363 -0.4761 +vn -0.7450 -0.2974 -0.5971 +vn -0.8014 -0.1745 -0.5720 +vn -0.7532 -0.2986 -0.5861 +vn -0.7450 -0.1724 -0.6444 +vn -0.5771 -0.8167 -0.0000 +vn -0.6687 -0.7435 -0.0000 +vn -0.5821 -0.7959 -0.1661 +vn -0.6508 -0.7398 -0.1710 +vn -0.6138 -0.7323 -0.2950 +vn -0.5995 -0.7409 -0.3029 +vn -0.6481 -0.6381 -0.4157 +vn -0.5827 -0.6493 -0.4887 +vn -0.6592 -0.5718 -0.4883 +vn -0.6631 -0.4923 -0.5638 +vn -0.5638 -0.4923 -0.6631 +vn -0.6429 -0.4164 -0.6429 +vn -0.5861 -0.2986 -0.7532 +vn -0.6444 -0.1724 -0.7450 +vn -0.5971 -0.2974 -0.7450 +vn -0.5720 -0.1745 -0.8014 +vn -0.4652 -0.8852 -0.0000 +vn -0.4526 -0.8786 -0.1526 +vn -0.3861 -0.8799 -0.2769 +vn -0.4827 -0.7562 -0.4417 +vn -0.4417 -0.7562 -0.4827 +vn -0.4790 -0.7356 -0.4790 +vn -0.4887 -0.6493 -0.5827 +vn -0.4157 -0.6381 -0.6481 +vn -0.4883 -0.5718 -0.6592 +vn -0.4710 -0.4717 -0.7454 +vn -0.4502 -0.4728 -0.7575 +vn -0.4761 -0.4363 -0.7636 +vn -0.3883 -0.2800 -0.8780 +vn -0.4507 -0.1640 -0.8775 +vn -0.2516 -0.9678 -0.0000 +vn -0.3499 -0.9368 -0.0000 +vn -0.2933 -0.9452 -0.1435 +vn -0.3398 -0.9245 -0.1728 +vn -0.3142 -0.8959 -0.3142 +vn -0.2769 -0.8799 -0.3861 +vn -0.2950 -0.7323 -0.6138 +vn -0.3029 -0.7409 -0.5995 +vn -0.3077 -0.5933 -0.7439 +vn -0.3039 -0.6029 -0.7377 +vn -0.2847 -0.3793 -0.8804 +vn -0.3182 -0.3116 -0.8954 +vn -0.3398 -0.1816 -0.9228 +vn -0.2920 -0.1513 -0.9444 +vn -0.1249 -0.9922 -0.0000 +vn -0.0974 -0.9905 -0.0974 +vn -0.1435 -0.9452 -0.2933 +vn -0.1728 -0.9245 -0.3398 +vn -0.1526 -0.8785 -0.4526 +vn -0.1661 -0.7959 -0.5821 +vn -0.1710 -0.7398 -0.6508 +vn -0.1728 -0.6505 -0.7396 +vn -0.1710 -0.5751 -0.8000 +vn -0.1599 -0.4472 -0.8800 +vn -0.1803 -0.3357 -0.9246 +vn -0.1518 -0.2910 -0.9446 +vn -0.1022 -0.1022 -0.9895 +vn -1.0000 -0.0000 -0.0000 +vn -0.9918 0.1276 -0.0000 +vn -0.9918 -0.0000 -0.1276 +vn -0.9895 0.1022 -0.1022 +vn -0.9678 0.2518 -0.0000 +vn -0.9384 0.3455 -0.0000 +vn -0.8874 0.4611 -0.0000 +vn -0.9673 -0.0000 -0.2535 +vn -0.9444 0.1514 -0.2920 +vn -0.9446 0.2910 -0.1518 +vn -0.9246 0.3357 -0.1803 +vn -0.8800 0.4472 -0.1599 +vn -0.9374 -0.0000 -0.3483 +vn -0.9228 0.1816 -0.3398 +vn -0.8954 0.3116 -0.3182 +vn -0.8804 0.3793 -0.2847 +vn -0.8862 -0.0000 -0.4633 +vn -0.8775 0.1640 -0.4507 +vn -0.8780 0.2800 -0.3883 +vn -0.8194 0.5733 -0.0000 +vn -0.7418 0.6706 -0.0000 +vn -0.8000 0.5751 -0.1710 +vn -0.7396 0.6505 -0.1728 +vn -0.7575 0.4728 -0.4502 +vn -0.7377 0.6029 -0.3039 +vn -0.7439 0.5933 -0.3077 +vn -0.8194 -0.0000 -0.5732 +vn -0.8014 0.1745 -0.5720 +vn -0.7450 0.2974 -0.5971 +vn -0.7636 0.4363 -0.4761 +vn -0.7454 0.4717 -0.4710 +vn -0.7452 -0.0000 -0.6668 +vn -0.7450 0.1724 -0.6444 +vn -0.7532 0.2986 -0.5861 +vn -0.6687 0.7435 -0.0000 +vn -0.5771 0.8167 -0.0000 +vn -0.6508 0.7398 -0.1710 +vn -0.5821 0.7959 -0.1661 +vn -0.6481 0.6381 -0.4157 +vn -0.5995 0.7409 -0.3029 +vn -0.6138 0.7323 -0.2950 +vn -0.6631 0.4923 -0.5638 +vn -0.6592 0.5718 -0.4883 +vn -0.5827 0.6493 -0.4887 +vn -0.6668 -0.0000 -0.7452 +vn -0.6444 0.1724 -0.7450 +vn -0.5861 0.2986 -0.7532 +vn -0.6429 0.4164 -0.6429 +vn -0.5638 0.4923 -0.6631 +vn -0.5732 -0.0000 -0.8194 +vn -0.5720 0.1745 -0.8014 +vn -0.5971 0.2974 -0.7450 +vn -0.4652 0.8852 -0.0000 +vn -0.4526 0.8785 -0.1526 +vn -0.4827 0.7562 -0.4417 +vn -0.3861 0.8799 -0.2769 +vn -0.4887 0.6493 -0.5827 +vn -0.4790 0.7356 -0.4790 +vn -0.4417 0.7562 -0.4827 +vn -0.4710 0.4717 -0.7454 +vn -0.4883 0.5718 -0.6592 +vn -0.4157 0.6381 -0.6481 +vn -0.4633 -0.0000 -0.8862 +vn -0.4507 0.1640 -0.8775 +vn -0.3883 0.2800 -0.8780 +vn -0.4761 0.4363 -0.7636 +vn -0.4502 0.4728 -0.7575 +vn -0.3499 0.9368 -0.0000 +vn -0.2516 0.9678 -0.0000 +vn -0.3398 0.9245 -0.1728 +vn -0.2933 0.9452 -0.1435 +vn -0.3142 0.8959 -0.3142 +vn -0.2950 0.7323 -0.6138 +vn -0.2769 0.8799 -0.3861 +vn -0.3077 0.5933 -0.7439 +vn -0.3029 0.7409 -0.5995 +vn -0.3483 -0.0000 -0.9374 +vn -0.3398 0.1816 -0.9228 +vn -0.3182 0.3116 -0.8954 +vn -0.2847 0.3793 -0.8804 +vn -0.3039 0.6029 -0.7377 +vn -0.2535 -0.0000 -0.9673 +vn -0.2920 0.1513 -0.9444 +vn -0.1249 0.9922 -0.0000 +vn -0.1435 0.9452 -0.2933 +vn -0.0974 0.9905 -0.0974 +vn -0.1728 0.9245 -0.3398 +vn -0.1661 0.7959 -0.5821 +vn -0.1526 0.8785 -0.4526 +vn -0.1728 0.6505 -0.7396 +vn -0.1710 0.7398 -0.6508 +vn -0.1803 0.3357 -0.9246 +vn -0.1599 0.4472 -0.8800 +vn -0.1710 0.5751 -0.8000 +vn -0.1276 -0.0000 -0.9918 +vn -0.1022 0.1022 -0.9895 +vn -0.1518 0.2910 -0.9446 +vn -0.0000 -0.1276 0.9918 +vn -0.0000 -0.4611 0.8874 +vn -0.0000 -0.3455 0.9384 +vn -0.0000 -0.2518 0.9678 +vn -0.0000 -0.6706 0.7418 +vn -0.0000 -0.5733 0.8194 +vn -0.0000 -0.8167 0.5771 +vn -0.0000 -0.7435 0.6687 +vn -0.0000 -0.8852 0.4652 +vn -0.0000 -0.9678 0.2516 +vn -0.0000 -0.9368 0.3499 +vn -0.0000 -0.9922 0.1249 +vn 0.1022 -0.1022 0.9895 +vn 0.1599 -0.4472 0.8800 +vn 0.1803 -0.3357 0.9246 +vn 0.1518 -0.2910 0.9446 +vn 0.2920 -0.1514 0.9444 +vn 0.1728 -0.6505 0.7396 +vn 0.1710 -0.5751 0.8000 +vn 0.1661 -0.7959 0.5821 +vn 0.1710 -0.7398 0.6508 +vn 0.1526 -0.8785 0.4526 +vn 0.1435 -0.9452 0.2933 +vn 0.1728 -0.9245 0.3398 +vn 0.0974 -0.9905 0.0974 +vn 0.2933 -0.9452 0.1435 +vn 0.2847 -0.3793 0.8804 +vn 0.3182 -0.3116 0.8954 +vn 0.3398 -0.1816 0.9228 +vn 0.3077 -0.5933 0.7439 +vn 0.3039 -0.6029 0.7377 +vn 0.4502 -0.4728 0.7575 +vn 0.2950 -0.7323 0.6138 +vn 0.3029 -0.7409 0.5995 +vn 0.4157 -0.6381 0.6481 +vn 0.2769 -0.8799 0.3861 +vn 0.4417 -0.7562 0.4827 +vn 0.3142 -0.8959 0.3142 +vn 0.3398 -0.9245 0.1728 +vn 0.3883 -0.2800 0.8780 +vn 0.4507 -0.1640 0.8775 +vn 0.4710 -0.4717 0.7454 +vn 0.4761 -0.4363 0.7636 +vn 0.5971 -0.2974 0.7450 +vn 0.5720 -0.1745 0.8014 +vn 0.4887 -0.6493 0.5827 +vn 0.4883 -0.5718 0.6592 +vn 0.5638 -0.4923 0.6631 +vn 0.4827 -0.7562 0.4417 +vn 0.4790 -0.7356 0.4790 +vn 0.5827 -0.6493 0.4887 +vn 0.3861 -0.8799 0.2769 +vn 0.6138 -0.7323 0.2950 +vn 0.4526 -0.8785 0.1526 +vn 0.5821 -0.7959 0.1661 +vn 0.5861 -0.2986 0.7532 +vn 0.6444 -0.1724 0.7450 +vn 0.6631 -0.4923 0.5638 +vn 0.6429 -0.4164 0.6429 +vn 0.7532 -0.2986 0.5861 +vn 0.7450 -0.1724 0.6444 +vn 0.6481 -0.6381 0.4157 +vn 0.6592 -0.5718 0.4883 +vn 0.7454 -0.4717 0.4710 +vn 0.5995 -0.7409 0.3029 +vn 0.7439 -0.5933 0.3077 +vn 0.6508 -0.7398 0.1710 +vn 0.7396 -0.6505 0.1728 +vn 0.7450 -0.2974 0.5971 +vn 0.8014 -0.1745 0.5720 +vn 0.7575 -0.4728 0.4502 +vn 0.7636 -0.4363 0.4761 +vn 0.8780 -0.2800 0.3883 +vn 0.8775 -0.1640 0.4507 +vn 0.7377 -0.6029 0.3039 +vn 0.8804 -0.3793 0.2847 +vn 0.8954 -0.3116 0.3182 +vn 0.9228 -0.1816 0.3398 +vn 0.8000 -0.5751 0.1710 +vn 0.8800 -0.4472 0.1599 +vn 0.9246 -0.3357 0.1803 +vn 0.9444 -0.1514 0.2920 +vn 0.9446 -0.2910 0.1518 +vn 0.9895 -0.1022 0.1022 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 0.1276 0.9918 +vn -0.0000 0.2518 0.9678 +vn -0.0000 0.3455 0.9384 +vn -0.0000 0.4611 0.8874 +vn -0.0000 0.5733 0.8194 +vn -0.0000 0.6706 0.7418 +vn -0.0000 0.7435 0.6687 +vn -0.0000 0.8167 0.5771 +vn -0.0000 0.8852 0.4652 +vn -0.0000 0.9368 0.3499 +vn -0.0000 0.9678 0.2516 +vn -0.0000 0.9922 0.1249 +vn 0.1276 -0.0000 0.9918 +vn 0.1022 0.1022 0.9895 +vn 0.2535 -0.0000 0.9673 +vn 0.2920 0.1514 0.9444 +vn 0.1518 0.2910 0.9446 +vn 0.1803 0.3357 0.9246 +vn 0.1599 0.4472 0.8800 +vn 0.1710 0.5751 0.8000 +vn 0.1728 0.6505 0.7396 +vn 0.1710 0.7398 0.6508 +vn 0.1661 0.7959 0.5821 +vn 0.1526 0.8785 0.4526 +vn 0.1728 0.9245 0.3398 +vn 0.1435 0.9452 0.2933 +vn 0.2933 0.9452 0.1435 +vn 0.0974 0.9905 0.0974 +vn 0.3483 -0.0000 0.9374 +vn 0.3398 0.1816 0.9228 +vn 0.3182 0.3116 0.8954 +vn 0.2847 0.3793 0.8804 +vn 0.4502 0.4728 0.7575 +vn 0.3039 0.6029 0.7377 +vn 0.3077 0.5933 0.7439 +vn 0.4157 0.6381 0.6481 +vn 0.3029 0.7409 0.5995 +vn 0.2950 0.7323 0.6138 +vn 0.4417 0.7562 0.4827 +vn 0.2769 0.8799 0.3861 +vn 0.3142 0.8959 0.3142 +vn 0.3398 0.9245 0.1728 +vn 0.4633 -0.0000 0.8862 +vn 0.4507 0.1640 0.8775 +vn 0.3883 0.2800 0.8780 +vn 0.5732 -0.0000 0.8194 +vn 0.5720 0.1745 0.8014 +vn 0.5971 0.2974 0.7450 +vn 0.4761 0.4363 0.7636 +vn 0.4710 0.4717 0.7454 +vn 0.5638 0.4923 0.6631 +vn 0.4883 0.5718 0.6592 +vn 0.4887 0.6493 0.5827 +vn 0.5827 0.6493 0.4887 +vn 0.4790 0.7356 0.4790 +vn 0.4827 0.7562 0.4417 +vn 0.6138 0.7323 0.2950 +vn 0.3861 0.8799 0.2769 +vn 0.5821 0.7959 0.1661 +vn 0.4526 0.8785 0.1526 +vn 0.6668 -0.0000 0.7452 +vn 0.6444 0.1724 0.7450 +vn 0.5861 0.2986 0.7532 +vn 0.7452 -0.0000 0.6668 +vn 0.7450 0.1724 0.6444 +vn 0.7532 0.2986 0.5861 +vn 0.6429 0.4164 0.6429 +vn 0.6631 0.4923 0.5638 +vn 0.7454 0.4717 0.4710 +vn 0.6592 0.5718 0.4883 +vn 0.6481 0.6381 0.4157 +vn 0.7439 0.5933 0.3077 +vn 0.5995 0.7409 0.3029 +vn 0.7396 0.6505 0.1728 +vn 0.6508 0.7398 0.1710 +vn 0.8194 -0.0000 0.5732 +vn 0.8014 0.1745 0.5720 +vn 0.7450 0.2974 0.5971 +vn 0.8862 -0.0000 0.4633 +vn 0.8775 0.1640 0.4507 +vn 0.8780 0.2800 0.3883 +vn 0.7636 0.4363 0.4761 +vn 0.7575 0.4728 0.4502 +vn 0.9374 -0.0000 0.3483 +vn 0.9228 0.1816 0.3398 +vn 0.8954 0.3116 0.3182 +vn 0.8804 0.3793 0.2847 +vn 0.7377 0.6029 0.3039 +vn 0.9246 0.3357 0.1803 +vn 0.8800 0.4472 0.1599 +vn 0.8000 0.5751 0.1710 +vn 0.9673 -0.0000 0.2535 +vn 0.9444 0.1514 0.2920 +vn 0.9918 -0.0000 0.1276 +vn 0.9895 0.1022 0.1022 +vn 0.9446 0.2910 0.1518 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.9922 -0.1249 +vn -0.0000 -0.9678 -0.2516 +vn -0.0000 -0.9368 -0.3499 +vn -0.0000 -0.8852 -0.4652 +vn -0.0000 -0.8167 -0.5771 +vn -0.0000 -0.7435 -0.6687 +vn -0.0000 -0.6706 -0.7418 +vn -0.0000 -0.5733 -0.8194 +vn -0.0000 -0.4611 -0.8874 +vn -0.0000 -0.3455 -0.9384 +vn -0.0000 -0.2518 -0.9678 +vn -0.0000 -0.1276 -0.9918 +vn 0.1249 -0.9922 -0.0000 +vn 0.2516 -0.9678 -0.0000 +vn 0.0974 -0.9905 -0.0974 +vn 0.2933 -0.9452 -0.1435 +vn 0.1435 -0.9452 -0.2933 +vn 0.1728 -0.9245 -0.3398 +vn 0.1526 -0.8785 -0.4526 +vn 0.1661 -0.7959 -0.5821 +vn 0.1710 -0.7398 -0.6508 +vn 0.1728 -0.6505 -0.7396 +vn 0.1710 -0.5751 -0.8000 +vn 0.1599 -0.4472 -0.8800 +vn 0.1803 -0.3357 -0.9246 +vn 0.1518 -0.2910 -0.9446 +vn 0.2920 -0.1514 -0.9444 +vn 0.1022 -0.1022 -0.9895 +vn 0.3499 -0.9368 -0.0000 +vn 0.3398 -0.9245 -0.1728 +vn 0.3142 -0.8959 -0.3142 +vn 0.2769 -0.8799 -0.3861 +vn 0.4417 -0.7562 -0.4827 +vn 0.2950 -0.7323 -0.6138 +vn 0.3029 -0.7409 -0.5995 +vn 0.4157 -0.6381 -0.6481 +vn 0.3077 -0.5933 -0.7439 +vn 0.3039 -0.6029 -0.7377 +vn 0.4502 -0.4728 -0.7575 +vn 0.2847 -0.3793 -0.8804 +vn 0.3182 -0.3116 -0.8954 +vn 0.3398 -0.1816 -0.9228 +vn 0.4652 -0.8852 -0.0000 +vn 0.5771 -0.8167 -0.0000 +vn 0.4526 -0.8785 -0.1526 +vn 0.5821 -0.7959 -0.1661 +vn 0.3861 -0.8799 -0.2769 +vn 0.6138 -0.7323 -0.2950 +vn 0.4827 -0.7562 -0.4417 +vn 0.4790 -0.7356 -0.4790 +vn 0.5827 -0.6493 -0.4887 +vn 0.4887 -0.6493 -0.5827 +vn 0.4883 -0.5718 -0.6592 +vn 0.5638 -0.4923 -0.6631 +vn 0.4710 -0.4717 -0.7454 +vn 0.4761 -0.4363 -0.7636 +vn 0.5971 -0.2974 -0.7450 +vn 0.3883 -0.2800 -0.8780 +vn 0.5720 -0.1745 -0.8014 +vn 0.4507 -0.1640 -0.8775 +vn 0.6687 -0.7435 -0.0000 +vn 0.7418 -0.6706 -0.0000 +vn 0.6508 -0.7398 -0.1710 +vn 0.7396 -0.6505 -0.1728 +vn 0.5995 -0.7409 -0.3029 +vn 0.7439 -0.5933 -0.3077 +vn 0.6481 -0.6381 -0.4157 +vn 0.6592 -0.5718 -0.4883 +vn 0.7454 -0.4717 -0.4710 +vn 0.6631 -0.4923 -0.5638 +vn 0.6429 -0.4164 -0.6429 +vn 0.7532 -0.2986 -0.5861 +vn 0.5861 -0.2986 -0.7532 +vn 0.7450 -0.1724 -0.6444 +vn 0.6444 -0.1724 -0.7450 +vn 0.8194 -0.5733 -0.0000 +vn 0.8874 -0.4611 -0.0000 +vn 0.9384 -0.3455 -0.0000 +vn 0.8000 -0.5751 -0.1710 +vn 0.8800 -0.4472 -0.1599 +vn 0.9246 -0.3357 -0.1803 +vn 0.7377 -0.6029 -0.3039 +vn 0.8804 -0.3793 -0.2847 +vn 0.7575 -0.4728 -0.4502 +vn 0.8954 -0.3116 -0.3182 +vn 0.9228 -0.1816 -0.3398 +vn 0.7636 -0.4363 -0.4761 +vn 0.8780 -0.2800 -0.3883 +vn 0.7450 -0.2974 -0.5971 +vn 0.8775 -0.1640 -0.4507 +vn 0.8014 -0.1745 -0.5720 +vn 0.9678 -0.2518 -0.0000 +vn 0.9918 -0.1276 -0.0000 +vn 0.9446 -0.2910 -0.1518 +vn 0.9895 -0.1022 -0.1022 +vn 0.9444 -0.1514 -0.2920 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 0.9678 -0.2516 +vn -0.0000 0.9922 -0.1249 +vn -0.0000 0.9368 -0.3499 +vn -0.0000 0.8167 -0.5771 +vn -0.0000 0.8852 -0.4652 +vn -0.0000 0.6706 -0.7418 +vn -0.0000 0.7435 -0.6687 +vn -0.0000 0.3455 -0.9384 +vn -0.0000 0.4611 -0.8874 +vn -0.0000 0.5733 -0.8194 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 0.1276 -0.9918 +vn -0.0000 0.2518 -0.9678 +vn 0.2516 0.9678 -0.0000 +vn 0.1249 0.9922 -0.0000 +vn 0.2933 0.9452 -0.1435 +vn 0.1435 0.9452 -0.2933 +vn 0.0974 0.9905 -0.0974 +vn 0.1728 0.9245 -0.3398 +vn 0.1661 0.7959 -0.5821 +vn 0.1526 0.8785 -0.4526 +vn 0.1728 0.6505 -0.7396 +vn 0.1710 0.7398 -0.6508 +vn 0.1803 0.3357 -0.9246 +vn 0.1599 0.4472 -0.8800 +vn 0.1710 0.5751 -0.8000 +vn 0.2535 -0.0000 -0.9673 +vn 0.1276 -0.0000 -0.9918 +vn 0.2920 0.1514 -0.9444 +vn 0.1022 0.1022 -0.9895 +vn 0.1518 0.2910 -0.9446 +vn 0.3499 0.9368 -0.0000 +vn 0.3398 0.9245 -0.1728 +vn 0.3142 0.8959 -0.3142 +vn 0.4417 0.7562 -0.4827 +vn 0.2950 0.7323 -0.6138 +vn 0.2769 0.8799 -0.3861 +vn 0.4157 0.6381 -0.6481 +vn 0.3077 0.5933 -0.7439 +vn 0.3029 0.7409 -0.5995 +vn 0.3483 -0.0000 -0.9374 +vn 0.3398 0.1816 -0.9228 +vn 0.3182 0.3116 -0.8954 +vn 0.4502 0.4728 -0.7575 +vn 0.2847 0.3793 -0.8804 +vn 0.3039 0.6029 -0.7377 +vn 0.5771 0.8167 -0.0000 +vn 0.4652 0.8852 -0.0000 +vn 0.5821 0.7959 -0.1661 +vn 0.4526 0.8785 -0.1526 +vn 0.6138 0.7323 -0.2950 +vn 0.4827 0.7562 -0.4417 +vn 0.3861 0.8799 -0.2769 +vn 0.5827 0.6493 -0.4887 +vn 0.4887 0.6493 -0.5827 +vn 0.4790 0.7356 -0.4790 +vn 0.5638 0.4923 -0.6631 +vn 0.4710 0.4717 -0.7454 +vn 0.4883 0.5718 -0.6592 +vn 0.5732 -0.0000 -0.8194 +vn 0.4633 -0.0000 -0.8862 +vn 0.5720 0.1745 -0.8014 +vn 0.4507 0.1640 -0.8775 +vn 0.5971 0.2974 -0.7450 +vn 0.3883 0.2800 -0.8780 +vn 0.4761 0.4363 -0.7636 +vn 0.7418 0.6706 -0.0000 +vn 0.6687 0.7435 -0.0000 +vn 0.7396 0.6505 -0.1728 +vn 0.6508 0.7398 -0.1710 +vn 0.7439 0.5933 -0.3077 +vn 0.6481 0.6381 -0.4157 +vn 0.5995 0.7409 -0.3029 +vn 0.7454 0.4717 -0.4710 +vn 0.6631 0.4923 -0.5638 +vn 0.6592 0.5718 -0.4883 +vn 0.7452 -0.0000 -0.6668 +vn 0.6668 -0.0000 -0.7452 +vn 0.7450 0.1724 -0.6444 +vn 0.6444 0.1724 -0.7450 +vn 0.7532 0.2986 -0.5861 +vn 0.5861 0.2986 -0.7532 +vn 0.6429 0.4164 -0.6429 +vn 0.9384 0.3455 -0.0000 +vn 0.8874 0.4611 -0.0000 +vn 0.8194 0.5733 -0.0000 +vn 0.9246 0.3357 -0.1803 +vn 0.8800 0.4472 -0.1599 +vn 0.8000 0.5751 -0.1710 +vn 0.9374 -0.0000 -0.3483 +vn 0.9228 0.1816 -0.3398 +vn 0.8954 0.3116 -0.3182 +vn 0.8804 0.3793 -0.2847 +vn 0.7575 0.4728 -0.4502 +vn 0.7377 0.6029 -0.3039 +vn 0.8862 -0.0000 -0.4633 +vn 0.8194 -0.0000 -0.5732 +vn 0.8775 0.1640 -0.4507 +vn 0.8014 0.1745 -0.5720 +vn 0.8780 0.2800 -0.3883 +vn 0.7450 0.2974 -0.5971 +vn 0.7636 0.4363 -0.4761 +vn 1.0000 -0.0000 -0.0000 +vn 0.9918 0.1276 -0.0000 +vn 0.9678 0.2518 -0.0000 +vn 0.9918 -0.0000 -0.1276 +vn 0.9673 -0.0000 -0.2535 +vn 0.9895 0.1022 -0.1022 +vn 0.9444 0.1514 -0.2920 +vn 0.9446 0.2910 -0.1518 +s 0 +usemtl Material.001 +f 4//1 3//1 1//1 2//1 +f 10//2 9//2 5//2 6//2 +f 11//3 10//3 6//3 7//3 +f 13//4 12//4 8//4 9//4 +f 14//5 13//5 9//5 10//5 +f 15//6 14//6 10//6 11//6 +f 15//7 2//7 1//7 14//7 +f 17//8 16//8 12//8 13//8 +f 18//9 17//9 13//9 14//9 +f 3//10 18//10 14//10 1//10 +f 24//11 23//11 19//11 20//11 +f 24//12 6//12 5//12 23//12 +f 25//13 24//13 20//13 21//13 +f 25//14 7//14 6//14 24//14 +f 28//15 27//15 22//15 23//15 +f 28//16 9//16 8//16 27//16 +f 9//17 28//17 23//17 5//17 +f 30//18 29//18 26//18 27//18 +f 12//19 30//19 27//19 8//19 +f 32//20 31//20 29//20 30//20 +f 16//21 32//21 30//21 12//21 +f 38//22 37//22 33//22 34//22 +f 38//23 20//23 19//23 37//23 +f 39//24 38//24 34//24 35//24 +f 39//25 21//25 20//25 38//25 +f 42//26 41//26 36//26 37//26 +f 42//27 23//27 22//27 41//27 +f 23//28 42//28 37//28 19//28 +f 45//29 44//29 40//29 41//29 +f 45//30 27//30 26//30 44//30 +f 27//31 45//31 41//31 22//31 +f 47//32 46//32 43//32 44//32 +f 29//33 47//33 44//33 26//33 +f 49//34 48//34 46//34 47//34 +f 31//35 49//35 47//35 29//35 +f 52//36 34//36 33//36 51//36 +f 53//37 35//37 34//37 52//37 +f 56//38 55//38 50//38 51//38 +f 56//39 37//39 36//39 55//39 +f 37//40 56//40 51//40 33//40 +f 59//41 58//41 54//41 55//41 +f 59//42 41//42 40//42 58//42 +f 41//43 59//43 55//43 36//43 +f 61//44 60//44 57//44 58//44 +f 61//45 44//45 43//45 60//45 +f 44//46 61//46 58//46 40//46 +f 46//47 62//47 60//47 43//47 +f 48//48 63//48 62//48 46//48 +f 67//49 51//49 50//49 66//49 +f 68//50 52//50 51//50 67//50 +f 69//51 68//51 64//51 65//51 +f 69//52 53//52 52//52 68//52 +f 71//53 55//53 54//53 70//53 +f 55//54 71//54 66//54 50//54 +f 73//55 58//55 57//55 72//55 +f 58//56 73//56 70//56 54//56 +f 60//57 74//57 72//57 57//57 +f 62//58 76//58 74//58 60//58 +f 78//59 77//59 75//59 76//59 +f 63//60 78//60 76//60 62//60 +f 80//61 65//61 64//61 79//61 +f 82//62 67//62 66//62 81//62 +f 83//63 68//63 67//63 82//63 +f 68//64 83//64 79//64 64//64 +f 85//65 71//65 70//65 84//65 +f 71//66 85//66 81//66 66//66 +f 87//67 73//67 72//67 86//67 +f 73//68 87//68 84//68 70//68 +f 74//69 88//69 86//69 72//69 +f 90//70 76//70 75//70 89//70 +f 76//71 90//71 88//71 74//71 +f 77//72 91//72 89//72 75//72 +f 94//73 4//73 2//73 92//73 +f 95//74 94//74 92//74 93//74 +f 99//75 11//75 7//75 96//75 +f 100//76 99//76 96//76 97//76 +f 101//77 100//77 97//77 98//77 +f 103//78 15//78 11//78 99//78 +f 103//79 92//79 2//79 15//79 +f 104//80 103//80 99//80 100//80 +f 104//81 93//81 92//81 103//81 +f 105//82 104//82 100//82 101//82 +f 106//83 105//83 101//83 102//83 +f 107//84 95//84 93//84 104//84 +f 108//85 107//85 104//85 105//85 +f 109//86 108//86 105//86 106//86 +f 113//87 25//87 21//87 110//87 +f 113//88 96//88 7//88 25//88 +f 114//89 113//89 110//89 111//89 +f 114//90 97//90 96//90 113//90 +f 115//91 114//91 111//91 112//91 +f 115//92 98//92 97//92 114//92 +f 117//93 101//93 98//93 115//93 +f 118//94 117//94 115//94 116//94 +f 118//95 102//95 101//95 117//95 +f 120//96 106//96 102//96 118//96 +f 121//97 120//97 118//97 119//97 +f 122//98 109//98 106//98 120//98 +f 123//99 122//99 120//99 121//99 +f 127//100 39//100 35//100 124//100 +f 127//101 110//101 21//101 39//101 +f 128//102 127//102 124//102 125//102 +f 128//103 111//103 110//103 127//103 +f 129//104 128//104 125//104 126//104 +f 129//105 112//105 111//105 128//105 +f 131//106 115//106 112//106 129//106 +f 132//107 131//107 129//107 130//107 +f 132//108 116//108 115//108 131//108 +f 134//109 118//109 116//109 132//109 +f 135//110 134//110 132//110 133//110 +f 135//111 119//111 118//111 134//111 +f 137//112 121//112 119//112 135//112 +f 138//113 137//113 135//113 136//113 +f 139//114 123//114 121//114 137//114 +f 140//115 139//115 137//115 138//115 +f 141//116 124//116 35//116 53//116 +f 142//117 125//117 124//117 141//117 +f 143//118 126//118 125//118 142//118 +f 145//119 129//119 126//119 143//119 +f 146//120 145//120 143//120 144//120 +f 146//121 130//121 129//121 145//121 +f 148//122 132//122 130//122 146//122 +f 149//123 148//123 146//123 147//123 +f 149//124 133//124 132//124 148//124 +f 151//125 135//125 133//125 149//125 +f 152//126 151//126 149//126 150//126 +f 152//127 136//127 135//127 151//127 +f 153//128 138//128 136//128 152//128 +f 154//129 140//129 138//129 153//129 +f 157//130 69//130 65//130 155//130 +f 157//131 141//131 53//131 69//131 +f 158//132 157//132 155//132 156//132 +f 158//133 142//133 141//133 157//133 +f 159//134 143//134 142//134 158//134 +f 160//135 144//135 143//135 159//135 +f 161//136 146//136 144//136 160//136 +f 162//137 147//137 146//137 161//137 +f 163//138 149//138 147//138 162//138 +f 164//139 150//139 149//139 163//139 +f 165//140 152//140 150//140 164//140 +f 166//141 153//141 152//141 165//141 +f 168//142 154//142 153//142 166//142 +f 169//143 168//143 166//143 167//143 +f 170//144 155//144 65//144 80//144 +f 171//145 156//145 155//145 170//145 +f 172//146 158//146 156//146 171//146 +f 173//147 159//147 158//147 172//147 +f 174//148 160//148 159//148 173//148 +f 175//149 161//149 160//149 174//149 +f 176//150 162//150 161//150 175//150 +f 177//151 163//151 162//151 176//151 +f 178//152 164//152 163//152 177//152 +f 179//153 165//153 164//153 178//153 +f 180//154 166//154 165//154 179//154 +f 181//155 167//155 166//155 180//155 +f 182//156 169//156 167//156 181//156 +f 184//157 183//157 3//157 4//157 +f 186//158 185//158 183//158 184//158 +f 188//159 187//159 16//159 17//159 +f 189//160 188//160 17//160 18//160 +f 183//161 189//161 18//161 3//161 +f 191//162 190//162 187//162 188//162 +f 192//163 191//163 188//163 189//163 +f 185//164 192//164 189//164 183//164 +f 186//165 193//165 192//165 185//165 +f 195//166 194//166 190//166 191//166 +f 196//167 195//167 191//167 192//167 +f 197//168 196//168 192//168 193//168 +f 199//169 198//169 195//169 196//169 +f 200//170 199//170 196//170 197//170 +f 202//171 201//171 31//171 32//171 +f 187//172 202//172 32//172 16//172 +f 204//173 203//173 201//173 202//173 +f 190//174 204//174 202//174 187//174 +f 206//175 205//175 203//175 204//175 +f 194//176 206//176 204//176 190//176 +f 195//177 207//177 206//177 194//177 +f 209//178 208//178 206//178 207//178 +f 198//179 209//179 207//179 195//179 +f 199//180 210//180 209//180 198//180 +f 200//181 211//181 210//181 199//181 +f 213//182 212//182 209//182 210//182 +f 214//183 213//183 210//183 211//183 +f 216//184 215//184 48//184 49//184 +f 201//185 216//185 49//185 31//185 +f 218//186 217//186 215//186 216//186 +f 203//187 218//187 216//187 201//187 +f 220//188 219//188 217//188 218//188 +f 205//189 220//189 218//189 203//189 +f 206//190 221//190 220//190 205//190 +f 223//191 222//191 220//191 221//191 +f 208//192 223//192 221//192 206//192 +f 209//193 224//193 223//193 208//193 +f 226//194 225//194 223//194 224//194 +f 212//195 226//195 224//195 209//195 +f 213//196 227//196 226//196 212//196 +f 214//197 228//197 227//197 213//197 +f 230//198 229//198 226//198 227//198 +f 231//199 230//199 227//199 228//199 +f 215//200 232//200 63//200 48//200 +f 217//201 233//201 232//201 215//201 +f 219//202 234//202 233//202 217//202 +f 220//203 235//203 234//203 219//203 +f 237//204 236//204 234//204 235//204 +f 222//205 237//205 235//205 220//205 +f 223//206 238//206 237//206 222//206 +f 240//207 239//207 237//207 238//207 +f 225//208 240//208 238//208 223//208 +f 226//209 241//209 240//209 225//209 +f 243//210 242//210 240//210 241//210 +f 229//211 243//211 241//211 226//211 +f 230//212 244//212 243//212 229//212 +f 231//213 245//213 244//213 230//213 +f 247//214 246//214 77//214 78//214 +f 232//215 247//215 78//215 63//215 +f 249//216 248//216 246//216 247//216 +f 233//217 249//217 247//217 232//217 +f 234//218 250//218 249//218 233//218 +f 236//219 251//219 250//219 234//219 +f 237//220 252//220 251//220 236//220 +f 239//221 253//221 252//221 237//221 +f 240//222 254//222 253//222 239//222 +f 242//223 255//223 254//223 240//223 +f 243//224 256//224 255//224 242//224 +f 244//225 257//225 256//225 243//225 +f 245//226 258//226 257//226 244//226 +f 260//227 259//227 257//227 258//227 +f 246//228 261//228 91//228 77//228 +f 248//229 262//229 261//229 246//229 +f 249//230 263//230 262//230 248//230 +f 250//231 264//231 263//231 249//231 +f 251//232 265//232 264//232 250//232 +f 252//233 266//233 265//233 251//233 +f 253//234 267//234 266//234 252//234 +f 254//235 268//235 267//235 253//235 +f 255//236 269//236 268//236 254//236 +f 256//237 270//237 269//237 255//237 +f 257//238 271//238 270//238 256//238 +f 259//239 272//239 271//239 257//239 +f 260//240 273//240 272//240 259//240 +f 274//241 184//241 4//241 94//241 +f 275//242 274//242 94//242 95//242 +f 276//243 186//243 184//243 274//243 +f 277//244 276//244 274//244 275//244 +f 278//245 275//245 95//245 107//245 +f 279//246 278//246 107//246 108//246 +f 280//247 279//247 108//247 109//247 +f 276//248 281//248 193//248 186//248 +f 277//249 282//249 281//249 276//249 +f 282//250 277//250 275//250 278//250 +f 283//251 282//251 278//251 279//251 +f 284//252 283//252 279//252 280//252 +f 285//253 197//253 193//253 281//253 +f 286//254 285//254 281//254 282//254 +f 287//255 286//255 282//255 283//255 +f 288//256 287//256 283//256 284//256 +f 289//257 200//257 197//257 285//257 +f 290//258 289//258 285//258 286//258 +f 291//259 290//259 286//259 287//259 +f 292//260 280//260 109//260 122//260 +f 293//261 292//261 122//261 123//261 +f 294//262 284//262 280//262 292//262 +f 295//263 294//263 292//263 293//263 +f 288//264 297//264 296//264 287//264 +f 297//265 288//265 284//265 294//265 +f 298//266 297//266 294//266 295//266 +f 289//267 299//267 211//267 200//267 +f 290//268 300//268 299//268 289//268 +f 291//269 301//269 300//269 290//269 +f 301//270 291//270 287//270 296//270 +f 302//271 301//271 296//271 297//271 +f 303//272 214//272 211//272 299//272 +f 304//273 303//273 299//273 300//273 +f 305//274 304//274 300//274 301//274 +f 306//275 293//275 123//275 139//275 +f 307//276 306//276 139//276 140//276 +f 308//277 295//277 293//277 306//277 +f 309//278 308//278 306//278 307//278 +f 298//279 311//279 310//279 297//279 +f 311//280 298//280 295//280 308//280 +f 312//281 311//281 308//281 309//281 +f 302//282 314//282 313//282 301//282 +f 314//283 302//283 297//283 310//283 +f 315//284 314//284 310//284 311//284 +f 303//285 316//285 228//285 214//285 +f 304//286 317//286 316//286 303//286 +f 305//287 318//287 317//287 304//287 +f 318//288 305//288 301//288 313//288 +f 319//289 318//289 313//289 314//289 +f 320//290 231//290 228//290 316//290 +f 321//291 320//291 316//291 317//291 +f 322//292 321//292 317//292 318//292 +f 323//293 307//293 140//293 154//293 +f 324//294 309//294 307//294 323//294 +f 312//295 326//295 325//295 311//295 +f 326//296 312//296 309//296 324//296 +f 315//297 328//297 327//297 314//297 +f 328//298 315//298 311//298 325//298 +f 329//299 328//299 325//299 326//299 +f 319//300 331//300 330//300 318//300 +f 331//301 319//301 314//301 327//301 +f 332//302 331//302 327//302 328//302 +f 320//303 333//303 245//303 231//303 +f 321//304 334//304 333//304 320//304 +f 322//305 335//305 334//305 321//305 +f 335//306 322//306 318//306 330//306 +f 336//307 335//307 330//307 331//307 +f 337//308 323//308 154//308 168//308 +f 338//309 337//309 168//309 169//309 +f 339//310 324//310 323//310 337//310 +f 340//311 339//311 337//311 338//311 +f 341//312 326//312 324//312 339//312 +f 329//313 343//313 342//313 328//313 +f 343//314 329//314 326//314 341//314 +f 332//315 345//315 344//315 331//315 +f 345//316 332//316 328//316 342//316 +f 333//317 346//317 258//317 245//317 +f 334//318 347//318 346//318 333//318 +f 335//319 348//319 347//319 334//319 +f 336//320 349//320 348//320 335//320 +f 349//321 336//321 331//321 344//321 +f 350//322 260//322 258//322 346//322 +f 351//323 350//323 346//323 347//323 +f 352//324 338//324 169//324 182//324 +f 340//325 354//325 353//325 339//325 +f 354//326 340//326 338//326 352//326 +f 355//327 341//327 339//327 353//327 +f 343//328 357//328 356//328 342//328 +f 357//329 343//329 341//329 355//329 +f 345//330 359//330 358//330 344//330 +f 359//331 345//331 342//331 356//331 +f 348//332 361//332 360//332 347//332 +f 349//333 362//333 361//333 348//333 +f 362//334 349//334 344//334 358//334 +f 350//335 363//335 273//335 260//335 +f 351//336 364//336 363//336 350//336 +f 364//337 351//337 347//337 360//337 +f 366//338 80//338 79//338 365//338 +f 368//339 82//339 81//339 367//339 +f 369//340 83//340 82//340 368//340 +f 83//341 369//341 365//341 79//341 +f 371//342 85//342 84//342 370//342 +f 85//343 371//343 367//343 81//343 +f 373//344 87//344 86//344 372//344 +f 87//345 373//345 370//345 84//345 +f 88//346 374//346 372//346 86//346 +f 376//347 90//347 89//347 375//347 +f 90//348 376//348 374//348 88//348 +f 91//349 377//349 375//349 89//349 +f 379//350 366//350 365//350 378//350 +f 381//351 368//351 367//351 380//351 +f 382//352 369//352 368//352 381//352 +f 369//353 382//353 378//353 365//353 +f 382//354 383//354 379//354 378//354 +f 385//355 371//355 370//355 384//355 +f 371//356 385//356 380//356 367//356 +f 387//357 373//357 372//357 386//357 +f 373//358 387//358 384//358 370//358 +f 374//359 388//359 386//359 372//359 +f 390//360 376//360 375//360 389//360 +f 376//361 390//361 388//361 374//361 +f 377//362 391//362 389//362 375//362 +f 391//363 392//363 390//363 389//363 +f 394//364 381//364 380//364 393//364 +f 395//365 382//365 381//365 394//365 +f 396//366 383//366 382//366 395//366 +f 398//367 385//367 384//367 397//367 +f 385//368 398//368 393//368 380//368 +f 398//369 399//369 394//369 393//369 +f 401//370 387//370 386//370 400//370 +f 387//371 401//371 397//371 384//371 +f 401//372 402//372 398//372 397//372 +f 388//373 403//373 400//373 386//373 +f 403//374 404//374 401//374 400//374 +f 390//375 405//375 403//375 388//375 +f 392//376 406//376 405//376 390//376 +f 408//377 395//377 394//377 407//377 +f 409//378 396//378 395//378 408//378 +f 411//379 399//379 398//379 410//379 +f 399//380 411//380 407//380 394//380 +f 411//381 412//381 408//381 407//381 +f 412//382 413//382 409//382 408//382 +f 415//383 402//383 401//383 414//383 +f 402//384 415//384 410//384 398//384 +f 415//385 416//385 411//385 410//385 +f 418//386 404//386 403//386 417//386 +f 404//387 418//387 414//387 401//387 +f 418//388 419//388 415//388 414//388 +f 405//389 420//389 417//389 403//389 +f 420//390 421//390 418//390 417//390 +f 406//391 422//391 420//391 405//391 +f 422//392 423//392 421//392 420//392 +f 425//393 412//393 411//393 424//393 +f 426//394 413//394 412//394 425//394 +f 428//395 416//395 415//395 427//395 +f 416//396 428//396 424//396 411//396 +f 428//397 429//397 425//397 424//397 +f 429//398 430//398 426//398 425//398 +f 432//399 419//399 418//399 431//399 +f 419//400 432//400 427//400 415//400 +f 432//401 433//401 428//401 427//401 +f 421//402 434//402 431//402 418//402 +f 434//403 435//403 432//403 431//403 +f 423//404 436//404 434//404 421//404 +f 436//405 437//405 435//405 434//405 +f 439//406 429//406 428//406 438//406 +f 440//407 430//407 429//407 439//407 +f 442//408 433//408 432//408 441//408 +f 433//409 442//409 438//409 428//409 +f 442//410 443//410 439//410 438//410 +f 443//411 444//411 440//411 439//411 +f 435//412 445//412 441//412 432//412 +f 445//413 446//413 442//413 441//413 +f 446//414 447//414 443//414 442//414 +f 447//415 448//415 444//415 443//415 +f 437//416 449//416 445//416 435//416 +f 449//417 450//417 446//417 445//417 +f 450//418 451//418 447//418 446//418 +f 453//419 448//419 447//419 452//419 +f 451//420 454//420 452//420 447//420 +f 454//421 455//421 453//421 452//421 +f 456//422 170//422 80//422 366//422 +f 457//423 171//423 170//423 456//423 +f 458//424 172//424 171//424 457//424 +f 459//425 173//425 172//425 458//425 +f 460//426 174//426 173//426 459//426 +f 461//427 175//427 174//427 460//427 +f 462//428 176//428 175//428 461//428 +f 463//429 177//429 176//429 462//429 +f 464//430 178//430 177//430 463//430 +f 465//431 179//431 178//431 464//431 +f 466//432 180//432 179//432 465//432 +f 467//433 181//433 180//433 466//433 +f 468//434 182//434 181//434 467//434 +f 469//435 456//435 366//435 379//435 +f 470//436 457//436 456//436 469//436 +f 383//437 471//437 469//437 379//437 +f 471//438 472//438 470//438 469//438 +f 472//439 458//439 457//439 470//439 +f 473//440 459//440 458//440 472//440 +f 474//441 460//441 459//441 473//441 +f 475//442 461//442 460//442 474//442 +f 476//443 462//443 461//443 475//443 +f 477//444 463//444 462//444 476//444 +f 478//445 464//445 463//445 477//445 +f 479//446 465//446 464//446 478//446 +f 480//447 466//447 465//447 479//447 +f 481//448 467//448 466//448 480//448 +f 482//449 483//449 481//449 480//449 +f 483//450 468//450 467//450 481//450 +f 484//451 471//451 383//451 396//451 +f 485//452 472//452 471//452 484//452 +f 486//453 473//453 472//453 485//453 +f 487//454 474//454 473//454 486//454 +f 488//455 489//455 487//455 486//455 +f 489//456 475//456 474//456 487//456 +f 490//457 476//457 475//457 489//457 +f 491//458 492//458 490//458 489//458 +f 492//459 477//459 476//459 490//459 +f 493//460 478//460 477//460 492//460 +f 494//461 495//461 493//461 492//461 +f 495//462 479//462 478//462 493//462 +f 496//463 480//463 479//463 495//463 +f 497//464 482//464 480//464 496//464 +f 498//465 484//465 396//465 409//465 +f 499//466 485//466 484//466 498//466 +f 500//467 486//467 485//467 499//467 +f 413//468 501//468 498//468 409//468 +f 501//469 502//469 499//469 498//469 +f 502//470 503//470 500//470 499//470 +f 503//471 488//471 486//471 500//471 +f 504//472 489//472 488//472 503//472 +f 505//473 506//473 504//473 503//473 +f 506//474 491//474 489//474 504//474 +f 507//475 492//475 491//475 506//475 +f 508//476 509//476 507//476 506//476 +f 509//477 494//477 492//477 507//477 +f 510//478 495//478 494//478 509//478 +f 511//479 512//479 510//479 509//479 +f 512//480 496//480 495//480 510//480 +f 513//481 514//481 512//481 511//481 +f 514//482 497//482 496//482 512//482 +f 515//483 501//483 413//483 426//483 +f 516//484 502//484 501//484 515//484 +f 517//485 503//485 502//485 516//485 +f 430//486 518//486 515//486 426//486 +f 518//487 519//487 516//487 515//487 +f 519//488 520//488 517//488 516//488 +f 520//489 505//489 503//489 517//489 +f 521//490 506//490 505//490 520//490 +f 522//491 523//491 521//491 520//491 +f 523//492 508//492 506//492 521//492 +f 524//493 509//493 508//493 523//493 +f 525//494 526//494 524//494 523//494 +f 526//495 511//495 509//495 524//495 +f 527//496 528//496 526//496 525//496 +f 528//497 513//497 511//497 526//497 +f 529//498 518//498 430//498 440//498 +f 530//499 519//499 518//499 529//499 +f 531//500 520//500 519//500 530//500 +f 444//501 532//501 529//501 440//501 +f 532//502 533//502 530//502 529//502 +f 533//503 534//503 531//503 530//503 +f 534//504 522//504 520//504 531//504 +f 535//505 523//505 522//505 534//505 +f 448//506 536//506 532//506 444//506 +f 536//507 537//507 533//507 532//507 +f 537//508 538//508 534//508 533//508 +f 538//509 539//509 535//509 534//509 +f 539//510 525//510 523//510 535//510 +f 540//511 541//511 538//511 537//511 +f 541//512 542//512 539//512 538//512 +f 542//513 527//513 525//513 539//513 +f 543//514 536//514 448//514 453//514 +f 544//515 537//515 536//515 543//515 +f 455//516 545//516 543//516 453//516 +f 545//517 546//517 544//517 543//517 +f 546//518 540//518 537//518 544//518 +f 261//519 547//519 377//519 91//519 +f 262//520 548//520 547//520 261//520 +f 263//521 549//521 548//521 262//521 +f 264//522 550//522 549//522 263//522 +f 265//523 551//523 550//523 264//523 +f 266//524 552//524 551//524 265//524 +f 267//525 553//525 552//525 266//525 +f 268//526 554//526 553//526 267//526 +f 269//527 555//527 554//527 268//527 +f 270//528 556//528 555//528 269//528 +f 271//529 557//529 556//529 270//529 +f 272//530 558//530 557//530 271//530 +f 273//531 559//531 558//531 272//531 +f 547//532 560//532 391//532 377//532 +f 560//533 561//533 392//533 391//533 +f 548//534 562//534 560//534 547//534 +f 562//535 563//535 561//535 560//535 +f 549//536 563//536 562//536 548//536 +f 550//537 564//537 563//537 549//537 +f 551//538 565//538 564//538 550//538 +f 552//539 566//539 565//539 551//539 +f 553//540 567//540 566//540 552//540 +f 554//541 568//541 567//541 553//541 +f 555//542 569//542 568//542 554//542 +f 556//543 570//543 569//543 555//543 +f 557//544 571//544 570//544 556//544 +f 558//545 573//545 571//545 557//545 +f 573//546 574//546 572//546 571//546 +f 559//547 574//547 573//547 558//547 +f 561//548 575//548 406//548 392//548 +f 563//549 576//549 575//549 561//549 +f 564//550 577//550 576//550 563//550 +f 565//551 579//551 577//551 564//551 +f 579//552 580//552 578//552 577//552 +f 566//553 580//553 579//553 565//553 +f 567//554 582//554 580//554 566//554 +f 582//555 583//555 581//555 580//555 +f 568//556 583//556 582//556 567//556 +f 569//557 585//557 583//557 568//557 +f 585//558 586//558 584//558 583//558 +f 570//559 586//559 585//559 569//559 +f 571//560 587//560 586//560 570//560 +f 572//561 588//561 587//561 571//561 +f 575//562 589//562 422//562 406//562 +f 589//563 590//563 423//563 422//563 +f 576//564 591//564 589//564 575//564 +f 591//565 592//565 590//565 589//565 +f 577//566 593//566 591//566 576//566 +f 593//567 594//567 592//567 591//567 +f 578//568 594//568 593//568 577//568 +f 580//569 596//569 594//569 578//569 +f 596//570 597//570 595//570 594//570 +f 581//571 597//571 596//571 580//571 +f 583//572 599//572 597//572 581//572 +f 599//573 600//573 598//573 597//573 +f 584//574 600//574 599//574 583//574 +f 586//575 603//575 600//575 584//575 +f 603//576 604//576 601//576 600//576 +f 587//577 604//577 603//577 586//577 +f 604//578 605//578 602//578 601//578 +f 588//579 605//579 604//579 587//579 +f 590//580 606//580 436//580 423//580 +f 606//581 607//581 437//581 436//581 +f 592//582 608//582 606//582 590//582 +f 608//583 609//583 607//583 606//583 +f 594//584 610//584 608//584 592//584 +f 610//585 611//585 609//585 608//585 +f 595//586 611//586 610//586 594//586 +f 597//587 613//587 611//587 595//587 +f 613//588 614//588 612//588 611//588 +f 598//589 614//589 613//589 597//589 +f 600//590 617//590 614//590 598//590 +f 617//591 618//591 615//591 614//591 +f 601//592 618//592 617//592 600//592 +f 618//593 619//593 616//593 615//593 +f 602//594 619//594 618//594 601//594 +f 607//595 620//595 449//595 437//595 +f 620//596 621//596 450//596 449//596 +f 621//597 622//597 451//597 450//597 +f 609//598 623//598 620//598 607//598 +f 623//599 624//599 621//599 620//599 +f 624//600 625//600 622//600 621//600 +f 611//601 627//601 623//601 609//601 +f 627//602 628//602 624//602 623//602 +f 612//603 628//603 627//603 611//603 +f 628//604 629//604 625//604 624//604 +f 629//605 630//605 626//605 625//605 +f 614//606 631//606 628//606 612//606 +f 631//607 632//607 629//607 628//607 +f 615//608 632//608 631//608 614//608 +f 632//609 633//609 630//609 629//609 +f 616//610 633//610 632//610 615//610 +f 622//611 634//611 454//611 451//611 +f 634//612 635//612 455//612 454//612 +f 625//613 636//613 634//613 622//613 +f 636//614 637//614 635//614 634//614 +f 626//615 637//615 636//615 625//615 +f 638//616 352//616 182//616 468//616 +f 354//617 640//617 639//617 353//617 +f 640//618 354//618 352//618 638//618 +f 641//619 355//619 353//619 639//619 +f 357//620 643//620 642//620 356//620 +f 643//621 357//621 355//621 641//621 +f 359//622 645//622 644//622 358//622 +f 645//623 359//623 356//623 642//623 +f 361//624 647//624 646//624 360//624 +f 362//625 648//625 647//625 361//625 +f 648//626 362//626 358//626 644//626 +f 363//627 649//627 559//627 273//627 +f 364//628 650//628 649//628 363//628 +f 650//629 364//629 360//629 646//629 +f 651//630 652//630 483//630 482//630 +f 652//631 638//631 468//631 483//631 +f 653//632 654//632 652//632 651//632 +f 640//633 654//633 653//633 639//633 +f 654//634 640//634 638//634 652//634 +f 655//635 641//635 639//635 653//635 +f 643//636 657//636 656//636 642//636 +f 657//637 643//637 641//637 655//637 +f 645//638 659//638 658//638 644//638 +f 659//639 645//639 642//639 656//639 +f 647//640 662//640 661//640 646//640 +f 648//641 663//641 662//641 647//641 +f 663//642 648//642 644//642 658//642 +f 574//643 664//643 660//643 572//643 +f 649//644 664//644 574//644 559//644 +f 664//645 665//645 661//645 660//645 +f 650//646 665//646 664//646 649//646 +f 665//647 650//647 646//647 661//647 +f 666//648 651//648 482//648 497//648 +f 667//649 653//649 651//649 666//649 +f 669//650 655//650 653//650 667//650 +f 671//651 672//651 669//651 668//651 +f 657//652 672//652 671//652 656//652 +f 672//653 657//653 655//653 669//653 +f 674//654 675//654 671//654 670//654 +f 659//655 675//655 674//655 658//655 +f 675//656 659//656 656//656 671//656 +f 660//657 676//657 588//657 572//657 +f 661//658 677//658 676//658 660//658 +f 662//659 678//659 677//659 661//659 +f 678//660 679//660 674//660 673//660 +f 663//661 679//661 678//661 662//661 +f 679//662 663//662 658//662 674//662 +f 680//663 681//663 514//663 513//663 +f 681//664 666//664 497//664 514//664 +f 682//665 683//665 681//665 680//665 +f 683//666 667//666 666//666 681//666 +f 685//667 686//667 683//667 682//667 +f 669//668 686//668 685//668 668//668 +f 686//669 669//669 667//669 683//669 +f 688//670 689//670 685//670 684//670 +f 671//671 689//671 688//671 670//671 +f 689//672 671//672 668//672 685//672 +f 692//673 693//673 688//673 687//673 +f 674//674 693//674 692//674 673//674 +f 693//675 674//675 670//675 688//675 +f 605//676 694//676 690//676 602//676 +f 676//677 694//677 605//677 588//677 +f 694//678 695//678 691//678 690//678 +f 677//679 695//679 694//679 676//679 +f 695//680 696//680 692//680 691//680 +f 678//681 696//681 695//681 677//681 +f 696//682 678//682 673//682 692//682 +f 697//683 698//683 528//683 527//683 +f 698//684 680//684 513//684 528//684 +f 699//685 700//685 698//685 697//685 +f 700//686 682//686 680//686 698//686 +f 702//687 703//687 700//687 699//687 +f 685//688 703//688 702//688 684//688 +f 703//689 685//689 682//689 700//689 +f 706//690 707//690 702//690 701//690 +f 688//691 707//691 706//691 687//691 +f 707//692 688//692 684//692 702//692 +f 619//693 708//693 704//693 616//693 +f 690//694 708//694 619//694 602//694 +f 708//695 709//695 705//695 704//695 +f 691//696 709//696 708//696 690//696 +f 709//697 710//697 706//697 705//697 +f 692//698 710//698 709//698 691//698 +f 710//699 692//699 687//699 706//699 +f 711//700 712//700 541//700 540//700 +f 712//701 713//701 542//701 541//701 +f 713//702 697//702 527//702 542//702 +f 715//703 716//703 712//703 711//703 +f 716//704 717//704 713//704 712//704 +f 717//705 699//705 697//705 713//705 +f 630//706 718//706 714//706 626//706 +f 718//707 719//707 715//707 714//707 +f 719//708 720//708 716//708 715//708 +f 720//709 721//709 717//709 716//709 +f 702//710 721//710 720//710 701//710 +f 721//711 702//711 699//711 717//711 +f 633//712 722//712 718//712 630//712 +f 704//713 722//713 633//713 616//713 +f 722//714 723//714 719//714 718//714 +f 705//715 723//715 722//715 704//715 +f 723//716 724//716 720//716 719//716 +f 706//717 724//717 723//717 705//717 +f 724//718 706//718 701//718 720//718 +f 635//719 725//719 545//719 455//719 +f 725//720 726//720 546//720 545//720 +f 726//721 711//721 540//721 546//721 +f 637//722 727//722 725//722 635//722 +f 714//723 727//723 637//723 626//723 +f 727//724 728//724 726//724 725//724 +f 715//725 728//725 727//725 714//725 +f 728//726 715//726 711//726 726//726 diff --git a/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.fsh b/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.fsh new file mode 100644 index 0000000..3c99bdb --- /dev/null +++ b/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.fsh @@ -0,0 +1,9 @@ +#version 150 + +#moj_import + +out vec4 fragColor; + +void main() { + fragColor = vec4(1.0f, 1.0f, 1.0f, 0.5f); +} \ No newline at end of file diff --git a/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.json b/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.json new file mode 100644 index 0000000..6c82349 --- /dev/null +++ b/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.json @@ -0,0 +1,17 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "gtmutils:rendertype_wormhole", + "fragment": "gtmutils:rendertype_wormhole", + "attributes": [], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScrollSpeed", "type": "float", "count": 1, "values": [ 600.0 ] } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.vsh b/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.vsh new file mode 100644 index 0000000..cf45a25 --- /dev/null +++ b/src/main/resources/assets/gtmutils/shaders/core/rendertype_wormhole.vsh @@ -0,0 +1,12 @@ +#version 150 + +#moj_import + +in vec3 Position; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); +} \ No newline at end of file