Merge pull request #1335 from MellowArpeggiation/spotlight

Industrial lighting
This commit is contained in:
HbmMods 2024-02-12 08:03:31 +01:00 committed by GitHub
commit d9a6788299
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 1814 additions and 9 deletions

View File

@ -58,4 +58,10 @@ public class BlockEnums {
GREEN,
STEEL
}
public static enum LightType {
INCANDESCENT,
FLUORESCENT,
HALOGEN
}
}

View File

@ -335,6 +335,14 @@ public class ModBlocks {
public static Block lantern;
public static Block lantern_behemoth;
public static Block spotlight_incandescent;
public static Block spotlight_incandescent_off;
public static Block spotlight_fluoro;
public static Block spotlight_fluoro_off;
public static Block spotlight_halogen;
public static Block spotlight_halogen_off;
public static Block spotlight_beam;
public static Block reinforced_stone;
public static Block concrete_smooth;
public static Block concrete_colored;
@ -1559,6 +1567,14 @@ public class ModBlocks {
lamp_demon = new DemonLamp().setBlockName("lamp_demon").setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setLightLevel(1F).setHardness(3.0F).setBlockTextureName(RefStrings.MODID + ":lamp_demon");
lantern = new BlockLantern().setBlockName("lantern").setStepSound(Block.soundTypeMetal).setCreativeTab(MainRegistry.blockTab).setLightLevel(1F).setHardness(3.0F).setBlockTextureName(RefStrings.MODID + ":block_steel");
lantern_behemoth = new BlockLanternBehemoth().setBlockName("lantern_behemoth").setStepSound(Block.soundTypeMetal).setCreativeTab(null).setHardness(3.0F).setBlockTextureName(RefStrings.MODID + ":block_rust");
spotlight_incandescent = new Spotlight(Material.iron, 2, LightType.INCANDESCENT, true).setBlockName("spotlight_incandescent").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":cage_lamp");
spotlight_incandescent_off = new Spotlight(Material.iron, 2, LightType.INCANDESCENT, false).setBlockName("spotlight_incandescent_off").setBlockTextureName(RefStrings.MODID + ":cage_lamp_off");
spotlight_fluoro = new SpotlightModular(Material.iron, 8, LightType.FLUORESCENT, true).setBlockName("spotlight_fluoro").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":fluorescent_lamp");
spotlight_fluoro_off = new SpotlightModular(Material.iron, 8, LightType.FLUORESCENT, false).setBlockName("spotlight_fluoro_off").setBlockTextureName(RefStrings.MODID + ":fluorescent_lamp_off");
spotlight_halogen = new Spotlight(Material.iron, 32, LightType.HALOGEN, true).setBlockName("spotlight_halogen").setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":flood_lamp");
spotlight_halogen_off = new Spotlight(Material.iron, 32, LightType.HALOGEN, false).setBlockName("spotlight_halogen_off").setBlockTextureName(RefStrings.MODID + ":flood_lamp_off");
spotlight_beam = new SpotlightBeam().setBlockName("spotlight_beam");
reinforced_stone = new BlockGeneric(Material.rock).setBlockName("reinforced_stone").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_stone");
concrete_smooth = new BlockRadResistant(Material.rock).setBlockName("concrete_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(140.0F).setBlockTextureName(RefStrings.MODID + ":concrete");
@ -2739,6 +2755,13 @@ public class ModBlocks {
GameRegistry.registerBlock(lamp_demon, lamp_demon.getUnlocalizedName());
GameRegistry.registerBlock(lantern, lantern.getUnlocalizedName());
GameRegistry.registerBlock(lantern_behemoth, lantern_behemoth.getUnlocalizedName());
GameRegistry.registerBlock(spotlight_incandescent, spotlight_incandescent.getUnlocalizedName());
GameRegistry.registerBlock(spotlight_incandescent_off, spotlight_incandescent_off.getUnlocalizedName());
GameRegistry.registerBlock(spotlight_fluoro, spotlight_fluoro.getUnlocalizedName());
GameRegistry.registerBlock(spotlight_fluoro_off, spotlight_fluoro_off.getUnlocalizedName());
GameRegistry.registerBlock(spotlight_halogen, spotlight_halogen.getUnlocalizedName());
GameRegistry.registerBlock(spotlight_halogen_off, spotlight_halogen_off.getUnlocalizedName());
GameRegistry.registerBlock(spotlight_beam, spotlight_beam.getUnlocalizedName());
//Reinforced Blocks
GameRegistry.registerBlock(asphalt, ItemBlockBlastInfo.class, asphalt.getUnlocalizedName());

View File

@ -77,7 +77,7 @@ public class ReinforcedLamp extends Block {
return new ItemStack(getOff());
}
private Block getOff() {
protected Block getOff() {
if(this == ModBlocks.reinforced_lamp_on)
return ModBlocks.reinforced_lamp_off;
@ -89,7 +89,7 @@ public class ReinforcedLamp extends Block {
return this;
}
private Block getOn() {
protected Block getOn() {
if(this == ModBlocks.reinforced_lamp_off)
return ModBlocks.reinforced_lamp_on;

View File

@ -0,0 +1,315 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.ModBlocks;
import java.util.Random;
import com.hbm.blocks.BlockEnums.LightType;
import com.hbm.main.ResourceManager;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockSlab;
import net.minecraft.block.material.Material;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.obj.WavefrontObject;
import net.minecraftforge.common.util.ForgeDirection;
public class Spotlight extends Block {
// I'd be extending the ReinforcedLamp class if it wasn't for the inverted behaviour of these specific lights
// I want these blocks to be eminently useful, so removing the need for redstone by default is desired,
// these act more like redstone torches, in that applying a signal turns them off
public boolean isOn;
public int beamLength;
public LightType type;
public Spotlight(Material mat, int beamLength, LightType type, boolean isOn) {
super(mat);
this.beamLength = beamLength;
this.type = type;
this.isOn = isOn;
if (isOn) setLightLevel(1.0F);
}
public static int renderID = RenderingRegistry.getNextAvailableRenderId();
@Override
public int getRenderType() {
return renderID;
}
public WavefrontObject getModel() {
switch (type) {
case FLUORESCENT: return (WavefrontObject) ResourceManager.fluorescent_lamp;
case HALOGEN: return (WavefrontObject) ResourceManager.flood_lamp;
default: return (WavefrontObject) ResourceManager.cage_lamp;
}
}
public String getPartName(int connectionCount) {
switch (type) {
case HALOGEN: return "FloodLamp";
default: return "CageLamp";
}
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) {
return null;
}
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {
ForgeDirection dir = getDirection(world, x, y, z);
float[] bounds = swizzleBounds(dir);
float[] offset = new float[] { 0.5F - dir.offsetX * (0.5F - bounds[0]), 0.5F - dir.offsetY * (0.5F - bounds[1]), 0.5F - dir.offsetZ * (0.5F - bounds[2]) };
setBlockBounds(offset[0] - bounds[0], offset[1] - bounds[1], offset[2] - bounds[2], offset[0] + bounds[0], offset[1] + bounds[1], offset[2] + bounds[2]);
}
private float[] swizzleBounds(ForgeDirection dir) {
float[] bounds = getBounds();
switch (dir) {
case EAST:
case WEST:
return new float[] { bounds[2], bounds[1], bounds[0] };
case UP:
case DOWN:
return new float[] { bounds[1], bounds[2], bounds[0] };
default:
return bounds;
}
}
// Returns an xyz (half-)size for a given object type
private float[] getBounds() {
switch (type) {
case FLUORESCENT: return new float[] {0.5F, 0.5F, 0.1F};
case HALOGEN: return new float[] {0.35F, 0.25F, 0.2F};
default: return new float[] {0.25F, 0.2F, 0.15F};
}
}
@Override
public int onBlockPlaced(World world, int x, int y, int z, int side, float hx, float hy, float hz, int initData) {
return side << 1;
}
@Override
public void onBlockAdded(World world, int x, int y, int z) {
if (world.isRemote) return;
if (updatePower(world, x, y, z)) return;
updateBeam(world, x, y, z);
}
private boolean updatePower(World world, int x, int y, int z) {
boolean isPowered = world.isBlockIndirectlyGettingPowered(x, y, z);
if (isOn && isPowered) {
world.scheduleBlockUpdate(x, y, z, this, 4);
return true;
} else if (!isOn && !isPowered) {
world.setBlock(x, y, z, getOn(), world.getBlockMetadata(x, y, z), 2);
return true;
}
return false;
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int metadata) {
ForgeDirection dir = getDirection(metadata);
super.breakBlock(world, x, y, z, block, metadata);
if (world.isRemote) return;
unpropagateBeam(world, x, y, z, dir);
}
@Override
public void updateTick(World world, int x, int y, int z, Random p_149674_5_) {
if (world.isRemote) return;
if (isOn && world.isBlockIndirectlyGettingPowered(x, y, z)) {
world.setBlock(x, y, z, getOff(), world.getBlockMetadata(x, y, z), 2);
}
}
// Repropagate the beam if we've become unblocked
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block neighborBlock) {
if (world.isRemote) return;
if (neighborBlock instanceof SpotlightBeam) return;
ForgeDirection dir = getDirection(world, x, y, z);
if (!canPlace(world, x, y, z, dir)) {
dropBlockAsItem(world, x, y, z, 0, 0);
world.setBlockToAir(x, y, z);
return;
}
if (updatePower(world, x, y, z)) return;
updateBeam(world, x, y, z);
}
@Override
public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side) {
if(!super.canPlaceBlockOnSide(world, x, y, z, side)) return false;
ForgeDirection dir = ForgeDirection.getOrientation(side);
return canPlace(world, x, y, z, dir);
}
// BlockSlab doesn't actually properly return isSideSolid,
// probably because MOJANK thought this would only ever be used for torches,
// which can't be placed on ceilings...
private boolean canPlace(World world, int x, int y, int z, ForgeDirection dir) {
x -= dir.offsetX;
y -= dir.offsetY;
z -= dir.offsetZ;
Block block = world.getBlock(x, y, z);
if (block instanceof BlockSlab) {
int meta = world.getBlockMetadata(x, y, z);
return dir == ((meta & 8) == 8 ? ForgeDirection.UP : ForgeDirection.DOWN) || block.func_149730_j();
}
return block.isSideSolid(world, x, y, z, dir);
}
private void updateBeam(World world, int x, int y, int z) {
if (!isOn) return;
ForgeDirection dir = getDirection(world, x, y, z);
propagateBeam(world, x, y, z, dir, beamLength);
}
public ForgeDirection getDirection(IBlockAccess world, int x, int y, int z) {
int metadata = world.getBlockMetadata(x, y, z);
return getDirection(metadata);
}
public ForgeDirection getDirection(int metadata) {
return ForgeDirection.getOrientation(metadata >> 1);
}
@Override
public Item getItemDropped(int i, Random r, int j) {
return Item.getItemFromBlock(getOn());
}
@Override
@SideOnly(Side.CLIENT)
public Item getItem(World world, int x, int y, int z) {
return Item.getItemFromBlock(getOn());
}
@Override
protected ItemStack createStackedBlock(int e) {
return new ItemStack(getOn());
}
// Recursively add beam blocks, updating any that already exist with new incoming light directions
public static void propagateBeam(World world, int x, int y, int z, ForgeDirection dir, int distance) {
distance--;
if (distance <= 0) return;
x += dir.offsetX;
y += dir.offsetY;
z += dir.offsetZ;
Block block = world.getBlock(x, y, z);
if (!block.isAir(world, x, y, z)) return;
if (!(block instanceof SpotlightBeam)) {
world.setBlock(x, y, z, ModBlocks.spotlight_beam);
}
// If we encounter an existing beam, add a new INCOMING direction to the metadata
SpotlightBeam.setDirection(world, x, y, z, dir, true);
propagateBeam(world, x, y, z, dir, distance);
}
// Recursively delete beam blocks, if they aren't still illuminated from a different direction
public static void unpropagateBeam(World world, int x, int y, int z, ForgeDirection dir) {
x += dir.offsetX;
y += dir.offsetY;
z += dir.offsetZ;
Block block = world.getBlock(x, y, z);
if (!(block instanceof SpotlightBeam)) return;
// Remove the metadata associated with this direction
// If all directions are set to zero, delete the beam
if (SpotlightBeam.setDirection(world, x, y, z, dir, false) == 0) {
world.setBlockToAir(x, y, z);
}
unpropagateBeam(world, x, y, z, dir);
}
// Travels back through a beam to the source, and if found, repropagates the beam
public static void backPropagate(World world, int x, int y, int z, ForgeDirection dir) {
x -= dir.offsetX;
y -= dir.offsetY;
z -= dir.offsetZ;
Block block = world.getBlock(x, y, z);
if (block instanceof Spotlight) {
Spotlight spot = (Spotlight) block;
propagateBeam(world, x, y, z, dir, spot.beamLength);
} else if (!(block instanceof SpotlightBeam)) {
return;
}
backPropagate(world, x, y, z, dir);
}
protected Block getOff() {
if(this == ModBlocks.spotlight_incandescent)
return ModBlocks.spotlight_incandescent_off;
if(this == ModBlocks.spotlight_fluoro)
return ModBlocks.spotlight_fluoro_off;
if(this == ModBlocks.spotlight_halogen)
return ModBlocks.spotlight_halogen_off;
return this;
}
protected Block getOn() {
if(this == ModBlocks.spotlight_incandescent_off)
return ModBlocks.spotlight_incandescent;
if(this == ModBlocks.spotlight_fluoro_off)
return ModBlocks.spotlight_fluoro;
if(this == ModBlocks.spotlight_halogen_off)
return ModBlocks.spotlight_halogen;
return this;
}
}

View File

@ -0,0 +1,135 @@
package com.hbm.blocks.machine;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.hbm.tileentity.TileEntityData;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class SpotlightBeam extends BlockContainer {
public SpotlightBeam() {
super(Material.air);
setLightLevel(1.0F);
setLightOpacity(0);
setHardness(-1);
setResistance(1_000_000);
setBlockBounds(0, 0, 0, 0, 0, 0);
}
// If a block is placed onto the beam, handle the new cutoff
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int metadata) {
if (!world.isRemote) {
for (ForgeDirection dir : getDirections(world, x, y, z)) {
Spotlight.unpropagateBeam(world, x, y, z, dir);
}
}
super.breakBlock(world, x, y, z, block, metadata);
}
// If a block in the beam path is removed, repropagate beam
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block neighborBlock) {
if (world.isRemote) return;
if (neighborBlock instanceof SpotlightBeam) return;
for (ForgeDirection dir : getDirections(world, x, y, z)) {
Spotlight.backPropagate(world, x, y, z, dir);
}
}
// Directions are stored as a set of 6 bits:
// 000000 -> no incoming light directions are set, will be removed
// 010000 -> UP bit set, at least one direction is providing light
// 111111 -> ALL directions illuminated, all incoming lights need to be disabled to turn off the beam
public static List<ForgeDirection> getDirections(World world, int x, int y, int z) {
TileEntityData te = (TileEntityData) world.getTileEntity(x, y, z);
return getDirections(te.metadata);
}
public static List<ForgeDirection> getDirections(int metadata) {
List<ForgeDirection> directions = new ArrayList<ForgeDirection>(6);
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if ((metadata & dir.flag) == dir.flag) directions.add(dir);
}
return directions;
}
// Returns the final metadata, so the caller can optionally remove the block
public static int setDirection(World world, int x, int y, int z, ForgeDirection dir, boolean state) {
TileEntityData te = (TileEntityData) world.getTileEntity(x, y, z);
int transformedMetadata = applyDirection(te.metadata, dir, state);
te.metadata = transformedMetadata;
return transformedMetadata;
}
// Sets the metadata bit for a given direction
public static int applyDirection(int metadata, ForgeDirection direction, boolean state) {
if (state) {
return metadata | direction.flag;
} else {
return metadata & ~direction.flag;
}
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityData();
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean isAir(IBlockAccess world, int x, int y, int z) {
return true;
}
@Override
public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
return true;
}
@Override
public boolean isLeaves(IBlockAccess world, int x, int y, int z) {
// This was taken from GregsLighting (cargo cult behaviour)
// This is a bit screwy, but it's needed so that trees are not prevented from growing
// near a floodlight beam.
return true;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public int quantityDropped(Random par1Random) {
return 0;
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) {
return null;
}
@Override
public int getRenderType() {
return -1;
}
}

View File

@ -0,0 +1,25 @@
package com.hbm.blocks.machine;
import com.hbm.blocks.BlockEnums.LightType;
import net.minecraft.block.material.Material;
import net.minecraft.world.IBlockAccess;
public class SpotlightModular extends Spotlight {
public SpotlightModular(Material mat, int beamLength, LightType type, boolean isOn) {
super(mat, beamLength, type, isOn);
}
@Override
public String getPartName(int connectionCount) {
if (connectionCount == 0) return "FluoroSingle";
if (connectionCount == 1) return "FluoroCap";
return "FluoroMid";
}
public boolean canConnectTo(IBlockAccess world, int x, int y, int z) {
return world.getBlock(x, y, z) == this;
}
}

View File

@ -846,6 +846,7 @@ public class ClientProxy extends ServerProxy {
RenderingRegistry.registerBlockHandler(new RenderSplitter());
RenderingRegistry.registerBlockHandler(new RenderCapacitor());
RenderingRegistry.registerBlockHandler(new RenderPedestal());
RenderingRegistry.registerBlockHandler(new RenderLight());
RenderingRegistry.registerBlockHandler(new RenderFoundryBasin());
RenderingRegistry.registerBlockHandler(new RenderFoundryMold());

View File

@ -462,6 +462,9 @@ public class CraftingManager {
addRecipeAuto(new ItemStack(ModBlocks.lamp_tritium_green_off, 1), new Object[] { "GPG", "1T2", "GPG", 'G', KEY_ANYGLASS, 'P', P_RED.dust(), 'T', ModItems.cell_tritium, '1', "dustSulfur", '2', CU.dust() });
addRecipeAuto(new ItemStack(ModBlocks.lamp_tritium_blue_off, 1), new Object[] { "GPG", "1T2", "GPG", 'G', KEY_ANYGLASS, 'P',P_RED.dust(), 'T', ModItems.cell_tritium, '1', AL.dust(), '2', ST.dust() });
addRecipeAuto(new ItemStack(ModBlocks.lantern, 1), new Object[] { "PGP", " S ", " S ", 'P', KEY_ANYPANE, 'G', Items.glowstone_dust, 'S', ModBlocks.steel_beam });
addRecipeAuto(new ItemStack(ModBlocks.spotlight_incandescent, 8), new Object[] { " G ", " T ", " I ", 'G', KEY_ANYPANE, 'T', ModItems.wire_tungsten, 'I', Items.iron_ingot });
addRecipeAuto(new ItemStack(ModBlocks.spotlight_fluoro, 8), new Object[] { " G ", " M ", " A ", 'G', KEY_ANYPANE, 'M', ModItems.ingot_mercury, 'A', ModItems.plate_aluminium });
addRecipeAuto(new ItemStack(ModBlocks.spotlight_halogen, 8), new Object[] { " G ", " B ", " S ", 'G', KEY_ANYPANE, 'B', ModItems.powder_bromine, 'S', ModItems.plate_steel });
addRecipeAuto(new ItemStack(ModBlocks.barbed_wire, 16), new Object[] { "AIA", "I I", "AIA", 'A', ModItems.wire_aluminium, 'I', IRON.ingot() });
addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_fire, 8), new Object[] { "BBB", "BIB", "BBB", 'B', ModBlocks.barbed_wire, 'I', P_RED.dust() });

View File

@ -130,6 +130,11 @@ public class NEIConfig implements IConfigureNEI {
API.hideItem(new ItemStack(ModBlocks.pink_slab));
API.hideItem(new ItemStack(ModBlocks.pink_double_slab));
API.hideItem(new ItemStack(ModBlocks.pink_stairs));
API.hideItem(new ItemStack(ModBlocks.spotlight_incandescent_off));
API.hideItem(new ItemStack(ModBlocks.spotlight_fluoro_off));
API.hideItem(new ItemStack(ModBlocks.spotlight_halogen_off));
API.hideItem(new ItemStack(ModBlocks.spotlight_beam));
API.registerHighlightIdentifier(ModBlocks.ore_random, new IHighlightHandler() {

View File

@ -353,8 +353,11 @@ public class ResourceManager {
public static WavefrontObjDisplayList silo_hatch = new WavefrontObjDisplayList(new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/silo_hatch.obj")));
//Lantern
//Lights
public static final IModelCustom lantern = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/lantern.obj"));
public static final IModelCustom cage_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/cage_lamp.obj"));
public static final IModelCustom fluorescent_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/fluorescent_lamp.obj"));
public static final IModelCustom flood_lamp = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/lights/flood_lamp.obj"));
//Tesla Coil
public static final IModelCustom tesla = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/tesla.obj"));

View File

@ -0,0 +1,118 @@
package com.hbm.render.block;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.machine.Spotlight;
import com.hbm.blocks.machine.SpotlightModular;
import com.hbm.render.util.ObjUtil;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
public class RenderLight implements ISimpleBlockRenderingHandler {
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
if (!(block instanceof Spotlight)) return;
Spotlight spot = (Spotlight) block;
GL11.glPushMatrix();
Tessellator tessellator = Tessellator.instance;
IIcon iicon = block.getIcon(0, 0);
tessellator.setColorOpaque_F(1, 1, 1);
if(renderer.hasOverrideBlockTexture()) {
iicon = renderer.overrideBlockTexture;
}
GL11.glRotated(-90, 0, 1, 0);
GL11.glScaled(1.5D, 1.5D, 1.5D);
tessellator.startDrawingQuads();
ObjUtil.renderPartWithIcon(spot.getModel(), spot.getPartName(0), iicon, tessellator, 0, false);
tessellator.draw();
GL11.glPopMatrix();
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
if (!(block instanceof Spotlight)) return true;
Spotlight spot = (Spotlight) block;
Tessellator tessellator = Tessellator.instance;
ForgeDirection dir = spot.getDirection(world, x, y, z);
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tessellator.setColorOpaque_F(1, 1, 1);
float ox = 0.5F - dir.offsetX * 0.5F, oy = 0.5F - dir.offsetY * 0.5F, oz = 0.5F - dir.offsetZ * 0.5F;
float rot = ObjUtil.getYaw(dir);
float pitch = ObjUtil.getPitch(dir);
float roll = 0;
int connectionCount = 0;
if (spot instanceof SpotlightModular) {
ForgeDirection connectionDirection = null;
SpotlightModular modular = (SpotlightModular) spot;
// Searching through only adjacent blocks is simple, iterate through all directions ignoring the root and its opposite
// Once we have found any valid connection, we'll only connect in that one axis
for (ForgeDirection availableDir : ForgeDirection.VALID_DIRECTIONS) {
if (availableDir == dir || availableDir == dir.getOpposite()) continue;
if (modular.canConnectTo(world, x + availableDir.offsetX, y + availableDir.offsetY, z + availableDir.offsetZ)) {
connectionCount++;
connectionDirection = availableDir;
break;
}
}
if (connectionDirection != null) {
// Check if we're sandwiched between two lights
if (modular.canConnectTo(world, x - connectionDirection.offsetX, y - connectionDirection.offsetY, z - connectionDirection.offsetZ)) {
connectionCount++;
}
roll = getRotation(connectionDirection, dir);
}
}
tessellator.addTranslation(x + ox, y + oy, z + oz);
ObjUtil.renderPartWithIcon(spot.getModel(), spot.getPartName(connectionCount), block.getIcon(0, 0), tessellator, rot, pitch, roll, false);
tessellator.addTranslation(-x - ox, -y - oy, -z - oz);
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return Spotlight.renderID;
}
// This is very ad-hoc, which isn't ideal
private float getRotation(ForgeDirection dir, ForgeDirection axis) {
float flipX = axis == ForgeDirection.DOWN || axis == ForgeDirection.NORTH || axis == ForgeDirection.WEST ? -0.5F : 0.5F;
float addX = axis == ForgeDirection.NORTH || axis == ForgeDirection.SOUTH ? -0.5F : 0;
boolean flipNS = axis == ForgeDirection.WEST;
switch (dir) {
case NORTH: return flipNS ? (float)Math.PI : 0;
case SOUTH: return !flipNS ? (float)Math.PI : 0;
case EAST: return (float)Math.PI * (flipX + addX);
case WEST: return (float)Math.PI * (-flipX + addX);
case UP: return (float)Math.PI * -0.5F;
case DOWN: return (float)Math.PI * 0.5F;
default: return 0;
}
}
}

View File

@ -8,14 +8,19 @@ import net.minecraftforge.client.model.obj.GroupObject;
import net.minecraftforge.client.model.obj.TextureCoordinate;
import net.minecraftforge.client.model.obj.Vertex;
import net.minecraftforge.client.model.obj.WavefrontObject;
import net.minecraftforge.common.util.ForgeDirection;
public class ObjUtil {
public static void renderWithIcon(WavefrontObject model, IIcon icon, Tessellator tes, float rot, boolean shadow) {
renderWithIcon(model, icon, tes, rot, 0, shadow);
renderWithIcon(model, icon, tes, rot, 0, 0, shadow);
}
public static void renderWithIcon(WavefrontObject model, IIcon icon, Tessellator tes, float rot, float pitch, boolean shadow) {
renderWithIcon(model, icon, tes, rot, pitch, 0, shadow);
}
public static void renderWithIcon(WavefrontObject model, IIcon icon, Tessellator tes, float rot, float pitch, float roll, boolean shadow) {
for(GroupObject go : model.groupObjects) {
for(Face f : go.faces) {
@ -41,6 +46,7 @@ public class ObjUtil {
Vertex v = f.vertices[i];
Vec3 vec = Vec3.createVectorHelper(v.x, v.y, v.z);
vec.rotateAroundX(roll);
vec.rotateAroundZ(pitch);
vec.rotateAroundY(rot);
@ -61,10 +67,14 @@ public class ObjUtil {
}
public static void renderPartWithIcon(WavefrontObject model, String name, IIcon icon, Tessellator tes, float rot, boolean shadow) {
renderPartWithIcon(model, name, icon, tes, rot, 0, shadow);
renderPartWithIcon(model, name, icon, tes, rot, 0, 0, shadow);
}
public static void renderPartWithIcon(WavefrontObject model, String name, IIcon icon, Tessellator tes, float rot, float pitch, boolean shadow) {
renderPartWithIcon(model, name, icon, tes, rot, pitch, 0, shadow);
}
public static void renderPartWithIcon(WavefrontObject model, String name, IIcon icon, Tessellator tes, float rot, float pitch, float roll, boolean shadow) {
GroupObject go = null;
@ -108,6 +118,7 @@ public class ObjUtil {
Vertex v = f.vertices[i];
Vec3 vec = Vec3.createVectorHelper(v.x, v.y, v.z);
vec.rotateAroundX(roll);
vec.rotateAroundZ(pitch);
vec.rotateAroundY(rot);
@ -148,4 +159,20 @@ public class ObjUtil {
public static void clearColor() {
hasColor = false;
}
// Both methods assume model is facing towards +X (EAST)
// Why not +Z (NORTH)? Pitch doesn't rotate as you would expect in that case using the (current) draw methods
public static float getPitch(ForgeDirection dir) {
if (dir == ForgeDirection.UP) return (float)Math.PI * -0.5F;
if (dir == ForgeDirection.DOWN) return (float)Math.PI * 0.5F;
return 0;
}
public static float getYaw(ForgeDirection dir) {
if (dir == ForgeDirection.NORTH) return (float)Math.PI * 0.5f;;
if (dir == ForgeDirection.SOUTH) return (float)Math.PI * -0.5f;
if (dir == ForgeDirection.WEST) return (float)Math.PI;
return 0;
}
}

View File

@ -0,0 +1,26 @@
package com.hbm.tileentity;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
// A whole ass TE just for 2 extra bits
// My kingdom for 2 fucking flags
// Use this TE if you need more bits, that's it. Blame Mojang
public class TileEntityData extends TileEntity {
public int metadata;
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
metadata = nbt.getInteger("meta");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setInteger("meta", metadata);
}
}

View File

@ -246,7 +246,10 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn
DoorDecl doorType = getDoorType();
if(this.state == 0 && state == 3){ // Door transitioning to open
if(audio != null) audio.stopSound();
if(audio != null) {
audio.stopSound();
audio.setKeepAlive(0);
}
if(doorType.getOpenSoundLoop() != null){
audio = MainRegistry.proxy.getLoopedSound(doorType.getOpenSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F);
@ -266,7 +269,10 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn
}
if(this.state == 1 && state == 2){ // Door transitioning to closed
if(audio != null) audio.stopSound();
if(audio != null) {
audio.stopSound();
audio.setKeepAlive(0);
}
if(doorType.getCloseSoundLoop() != null){
audio = MainRegistry.proxy.getLoopedSound(doorType.getCloseSoundLoop(), xCoord, yCoord, zCoord, doorType.getSoundVolume(), 10F, 1F);
@ -288,10 +294,12 @@ public class TileEntityDoorGeneric extends TileEntityLockableBase implements IAn
if(state == 1 || state == 0){ // Door finished any transition
if(audio != null){
audio.stopSound();
audio.setKeepAlive(0);
audio = null;
}
if(audio2 != null){
audio2.stopSound();
audio.setKeepAlive(0);
audio2 = null;
}
}

View File

@ -45,8 +45,8 @@ import net.minecraft.tileentity.TileEntity;
public class TileMappings {
public static HashMap<Class<? extends TileEntity>, String[]> map = new HashMap();
public static List<Class<? extends IConfigurableMachine>> configurables = new ArrayList();
public static HashMap<Class<? extends TileEntity>, String[]> map = new HashMap<Class<? extends TileEntity>, String[]>();
public static List<Class<? extends IConfigurableMachine>> configurables = new ArrayList<Class<? extends IConfigurableMachine>>();
public static void writeMappings() {
put(TileEntityTestBombAdvanced.class, "tilentity_testbombadvanced");
@ -224,6 +224,8 @@ public class TileMappings {
put(TileEntityBlockPWR.class, "tileentity_block_pwr");
put(TileEntityPWRController.class, "tileentity_pwr_controller");
put(TileEntityData.class, "tileentity_data");
putNetwork();
putBombs();

View File

@ -5072,6 +5072,9 @@ tile.lamp_tritium_green_off.name=Green Tritium Lamp
tile.lamp_tritium_green_on.name=Green Tritium Lamp
tile.lantern.name=Lantern
tile.lantern_behemoth.name=Old Lantern
tile.spotlight_incandescent.name=Cage Lamp
tile.spotlight_fluoro.name=Fluorescent Light
tile.spotlight_halogen.name=Halogen Floodlight
tile.launch_pad.name=Missile Launch Pad
tile.launch_table.name=Large Launch Pad
tile.leaves_layer.name=Fallen Leaves

View File

@ -0,0 +1,571 @@
# Blender 4.0.1
# www.blender.org
o CageLamp
v 0.174699 0.050284 -0.170405
v 0.174699 0.037785 -0.170405
v 0.187198 0.050284 -0.175448
v 0.187198 0.037785 -0.175448
v -0.002109 0.145255 -0.201498
v -0.002109 0.101109 -0.243600
v -0.002109 -0.103152 -0.243600
v -0.002109 -0.145255 -0.201498
v 0.056171 0.061436 -0.200955
v 0.056171 0.094421 -0.170760
v 0.056171 -0.093758 -0.171142
v 0.056171 -0.063790 -0.201110
v -0.002109 0.103152 0.243600
v -0.002109 0.145255 0.201498
v -0.002109 -0.145255 0.201498
v -0.002109 -0.103152 0.243600
v 0.056171 0.094258 0.170780
v 0.056171 0.064290 0.200748
v 0.056171 -0.063790 0.200748
v 0.056171 -0.093758 0.170780
v 0.009739 0.097808 -0.169350
v 0.009739 0.063030 -0.204128
v 0.174699 0.050284 0.170405
v 0.009739 -0.063030 -0.204128
v 0.009739 -0.097808 -0.169350
v 0.174699 0.037785 0.170405
v 0.125944 0.063030 -0.204128
v 0.124890 0.095332 -0.169350
v 0.169823 0.063030 -0.169350
v 0.125944 -0.097808 -0.169350
v 0.125944 -0.063030 -0.204128
v 0.169823 -0.063030 -0.169350
v 0.009739 0.063030 0.204128
v 0.009739 0.097808 0.169350
v 0.187198 0.050284 0.175448
v 0.009739 -0.097808 0.169350
v 0.009739 -0.063030 0.204128
v 0.187198 0.037785 0.175448
v 0.125944 0.063030 0.204128
v 0.169823 0.063030 0.169350
v 0.125944 0.097808 0.169350
v 0.169823 -0.063030 0.169350
v 0.125944 -0.063030 0.204128
v 0.125944 -0.097808 0.169350
v 0.137281 0.037785 -0.222204
v 0.131756 0.037785 -0.209752
v 0.131756 0.050284 -0.209752
v 0.131756 0.050284 0.209752
v 0.131756 0.037785 0.209752
v 0.137281 0.037785 0.222204
v 0.137281 0.050284 0.222204
v 0.137281 0.050284 -0.222204
v 0.053429 0.037785 -0.229540
v 0.052340 0.037785 -0.217088
v 0.052340 0.050284 -0.217088
v 0.052340 0.050284 0.217088
v 0.052340 0.037785 0.217088
v 0.053429 0.037785 0.229540
v 0.053429 0.050284 0.229540
v 0.053429 0.050284 -0.229540
v 0.174699 -0.037801 -0.170405
v 0.174699 -0.050300 -0.170405
v 0.187198 -0.037801 -0.175448
v 0.187198 -0.050300 -0.175448
v 0.174699 -0.037801 0.170405
v 0.174699 -0.050300 0.170405
v 0.187198 -0.037801 0.175448
v 0.187198 -0.050300 0.175448
v 0.137281 -0.050300 -0.222204
v 0.131756 -0.050300 -0.209752
v 0.131756 -0.037801 -0.209752
v 0.131756 -0.037801 0.209752
v 0.131756 -0.050300 0.209752
v 0.137281 -0.050300 0.222204
v 0.137281 -0.037801 0.222204
v 0.137281 -0.037801 -0.222204
v 0.053429 -0.050300 -0.229540
v 0.052340 -0.050300 -0.217088
v 0.052340 -0.037801 -0.217088
v 0.052340 -0.037801 0.217088
v 0.052340 -0.050300 0.217088
v 0.053429 -0.050300 0.229540
v 0.053429 -0.037801 0.229540
v 0.053429 -0.037801 -0.229540
v 0.056203 -0.116057 -0.126340
v 0.056203 0.116108 -0.126340
v 0.056203 0.116108 -0.113840
v 0.055114 0.106003 -0.113840
v 0.055114 0.106003 -0.126340
v 0.055114 -0.105546 -0.126340
v 0.055114 -0.105546 -0.113840
v 0.056203 -0.116057 -0.113840
v 0.140055 -0.109785 -0.126340
v 0.140055 0.111267 -0.126340
v 0.140055 0.111267 -0.113840
v 0.136242 0.100805 -0.113840
v 0.136242 0.100805 -0.126340
v 0.137912 -0.099557 -0.126340
v 0.137912 -0.099557 -0.113840
v 0.140055 -0.109785 -0.113840
v 0.189972 0.072795 -0.113840
v 0.189972 0.072795 -0.126340
v 0.177473 0.064705 -0.113840
v 0.177473 0.064705 -0.126340
v 0.189972 -0.069577 -0.113840
v 0.189972 -0.069577 -0.126340
v 0.177473 -0.063223 -0.113840
v 0.177473 -0.063223 -0.126340
v 0.177473 -0.063223 0.113750
v 0.177473 -0.063223 0.126250
v 0.189972 -0.069577 0.113750
v 0.189972 -0.069577 0.126250
v 0.177473 0.064705 0.113750
v 0.177473 0.064705 0.126250
v 0.189972 0.072795 0.113750
v 0.189972 0.072795 0.126250
v 0.140055 -0.109785 0.126250
v 0.137912 -0.099557 0.126250
v 0.137912 -0.099557 0.113750
v 0.136242 0.100805 0.113750
v 0.136242 0.100805 0.126250
v 0.140055 0.111267 0.126250
v 0.140055 0.111267 0.113750
v 0.140055 -0.109785 0.113750
v 0.056203 -0.116057 0.126250
v 0.055114 -0.105546 0.126250
v 0.055114 -0.105546 0.113750
v 0.055114 0.106003 0.113750
v 0.055114 0.106003 0.126250
v 0.056203 0.116108 0.126250
v 0.056203 0.116108 0.113750
v 0.056203 -0.116057 0.113750
v 0.177473 -0.063223 -0.006231
v 0.177473 -0.063223 0.006268
v 0.189972 -0.069577 -0.006231
v 0.189972 -0.069577 0.006268
v 0.177473 0.064705 -0.006231
v 0.177473 0.064705 0.006268
v 0.189972 0.072795 -0.006231
v 0.189972 0.072795 0.006268
v 0.140055 -0.109785 0.006268
v 0.137912 -0.099557 0.006268
v 0.137912 -0.099557 -0.006231
v 0.136242 0.100805 -0.006231
v 0.136242 0.100805 0.006268
v 0.140055 0.111267 0.006268
v 0.140055 0.111267 -0.006231
v 0.140055 -0.109785 -0.006231
v 0.056203 -0.116057 0.006268
v 0.055114 -0.105546 0.006268
v 0.055114 -0.105546 -0.006231
v 0.055114 0.106003 -0.006231
v 0.055114 0.106003 0.006268
v 0.056203 0.116108 0.006268
v 0.056203 0.116108 -0.006231
v 0.056203 -0.116057 -0.006231
v 0.056171 -0.145255 0.201498
v 0.056171 -0.103152 0.243600
v 0.056171 0.145255 -0.201498
v 0.056171 0.099913 -0.243600
v 0.056171 0.103152 0.243600
v 0.056171 0.145255 0.201498
v 0.056171 -0.103152 -0.243600
v 0.056171 -0.145255 -0.201498
v -0.002109 0.145255 0.000000
v 0.056171 0.145255 0.000000
v 0.056171 0.094339 0.000010
v -0.002109 -0.145255 0.000000
v 0.056171 -0.145255 0.000000
v 0.056171 -0.093758 -0.000181
vn -0.0000 -1.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -0.0000 -0.7071 0.7071
vn -0.0000 0.6902 -0.7237
vn -0.0000 0.7071 0.7071
vn -0.0000 -0.7071 -0.7071
vn 1.0000 -0.0000 -0.0000
vn 0.4700 0.6538 -0.5930
vn 0.4889 -0.6168 -0.6168
vn -1.0000 -0.0000 -0.0000
vn 0.4889 0.6168 0.6168
vn 0.4889 -0.6168 0.6168
vn 0.6212 -0.0000 0.7837
vn 0.0152 0.7070 -0.7070
vn 0.5837 0.8120 -0.0000
vn 0.6212 -0.7837 -0.0000
vn 0.6212 -0.0000 -0.7837
vn 0.0215 0.9998 -0.0000
vn 0.0872 -0.0000 -0.9962
vn 0.6836 -0.0000 0.7298
vn 0.6836 -0.0000 -0.7298
vn -0.6756 -0.0000 0.7373
vn -0.6756 -0.0000 -0.7373
vn 0.0872 -0.0000 0.9962
vn -0.0920 -0.0000 0.9958
vn -0.0920 -0.0000 -0.9958
vn -0.0639 -0.9980 -0.0000
vn -0.0721 0.9974 -0.0000
vn 0.0576 0.9983 -0.0000
vn -0.6587 -0.7524 -0.0000
vn -0.6764 0.7365 -0.0000
vn 0.6273 -0.7788 -0.0000
vn 0.6105 0.7921 -0.0000
vn 0.0746 -0.9972 -0.0000
vn 0.0140 0.6804 -0.7327
vn -0.0000 0.7327 -0.6805
vn 0.6211 0.7837 -0.0077
vn -0.0000 1.0000 -0.0073
vt 0.250000 0.625000
vt 0.375000 0.562500
vt 0.375000 0.625000
vt 0.187500 0.562500
vt 0.062500 0.625000
vt 0.062500 0.562500
vt 0.187500 0.625000
vt 0.000286 0.562500
vt 0.000000 0.625000
vt 0.000000 0.562500
vt 0.250000 0.562500
vt 1.000000 0.250000
vt 0.812500 0.750000
vt 1.000000 0.750000
vt 0.000000 0.687500
vt 0.500000 0.750000
vt 0.000000 0.750000
vt 0.750000 0.812500
vt 0.562500 1.000000
vt 0.562500 0.812500
vt 0.750000 0.250000
vt 0.562500 0.750000
vt 0.562500 0.250000
vt 0.750000 0.000000
vt 0.562500 0.187500
vt 0.562500 0.000000
vt 0.500000 0.687500
vt 0.750000 0.937500
vt 0.812500 0.937500
vt 0.812500 1.000000
vt 0.875000 0.937500
vt 0.500000 0.625000
vt 0.000000 0.750000
vt 0.250000 0.687500
vt 0.250000 0.750000
vt 0.875000 0.812500
vt 0.875000 0.750000
vt 0.937500 0.812500
vt 0.937500 1.000000
vt 0.937500 0.937500
vt 1.000000 0.937500
vt 0.750000 0.750000
vt 0.812500 0.250000
vt 0.937500 0.750000
vt 0.500000 0.250000
vt 0.500000 0.812500
vt 0.000000 0.812500
vt 0.750000 0.187500
vt 0.250000 0.812500
vt 0.000000 0.687500
vt 0.250000 0.937500
vt 0.500000 1.000000
vt 0.250000 1.000000
vt 0.500000 0.875000
vt 0.250000 0.875000
vt 0.000000 1.000000
vt 0.000000 0.937500
vt 0.500000 0.937500
vt 0.000000 0.875000
vt 0.291985 0.089153
vt 0.415266 0.073249
vt 0.343988 0.001971
vt 0.293149 0.410977
vt 0.416463 0.420276
vt 0.345186 0.497037
vt 0.291985 0.407455
vt 0.415266 0.422512
vt 0.342719 0.356721
vt 0.293796 0.092400
vt 0.416463 0.076496
vt 0.344530 0.143134
vt 0.344267 0.355136
vt 0.004061 0.497037
vt 0.004044 0.410840
vt 0.002863 0.001971
vt 0.002557 0.089153
vt 0.342719 0.139887
vt 0.002863 0.493790
vt 0.343988 0.493790
vt 0.500000 0.562500
vt 0.004061 0.005218
vt 0.345186 0.005218
vt 0.750000 1.000000
vt 0.875000 1.000000
vt -0.000000 0.687500
vt 0.002880 0.407592
vt 0.004367 0.092400
s 0
f 8/1/1 169/2/1 168/3/1
f 161/4/2 16/5/2 158/6/2
f 14/1/3 166/2/3 165/3/3
f 7/7/4 160/6/4 163/4/4
f 157/8/5 16/5/5 15/9/5
f 159/10/6 6/5/6 5/9/6
f 14/1/7 161/4/7 162/11/7
f 8/1/8 163/4/8 164/11/8
f 25/12/1 44/13/1 36/14/1
f 1/15/3 35/16/3 3/17/3
f 39/18/2 37/19/2 43/20/2
f 29/21/9 42/22/9 32/23/9
f 22/24/4 31/25/4 24/26/4
f 2/17/1 38/27/1 26/16/1
f 27/28/10 28/29/10 29/30/10
f 30/29/11 31/31/11 32/30/11
f 23/27/12 2/9/12 26/32/12
f 1/33/3 52/34/3 47/35/3
f 39/36/13 40/37/13 41/38/13
f 42/39/14 43/40/14 44/41/14
f 40/42/15 43/20/15 42/22/15
f 28/29/16 22/42/16 21/13/16
f 28/43/17 40/42/17 29/21/17
f 44/41/5 37/44/5 36/14/5
f 26/17/1 50/34/1 49/35/1
f 30/45/18 42/22/18 44/16/18
f 3/17/9 38/46/9 4/47/9
f 34/39/7 39/36/7 41/38/7
f 32/23/19 27/48/19 29/21/19
f 25/13/8 31/31/8 30/29/8
f 34/14/20 28/43/20 21/12/20
f 45/49/21 60/17/21 52/35/21
f 47/35/3 60/27/3 55/16/3
f 35/17/22 50/49/22 38/47/22
f 4/46/23 52/35/23 3/16/23
f 1/27/24 46/1/24 2/32/24
f 2/16/1 45/34/1 4/27/1
f 26/9/25 48/34/25 23/15/25
f 23/16/3 51/34/3 35/27/3
f 51/35/26 58/46/26 50/49/26
f 47/34/27 54/9/27 46/1/27
f 48/35/3 59/50/3 51/34/3
f 49/35/1 58/27/1 57/16/1
f 49/1/28 56/27/28 48/34/28
f 46/35/1 53/15/1 45/34/1
f 61/15/3 67/16/3 63/17/3
f 62/17/1 68/27/1 66/16/1
f 65/27/12 62/9/12 66/32/12
f 61/33/3 76/34/3 71/35/3
f 66/27/1 74/35/1 73/34/1
f 63/17/9 68/46/9 64/47/9
f 69/49/21 84/17/21 76/35/21
f 71/35/3 84/27/3 79/16/3
f 67/17/22 74/49/22 68/47/22
f 64/46/23 76/35/23 63/16/23
f 61/27/24 70/1/24 62/32/24
f 62/50/1 69/35/1 64/17/1
f 66/9/25 72/34/25 65/15/25
f 65/16/3 75/34/3 67/27/3
f 75/35/26 82/46/26 74/49/26
f 71/34/27 78/9/27 70/1/27
f 72/35/3 83/50/3 75/34/3
f 73/34/1 82/33/1 81/50/1
f 73/1/28 80/27/28 72/34/28
f 70/34/1 77/16/1 69/35/1
f 99/51/2 92/52/2 100/53/2
f 96/49/29 89/54/29 97/55/29
f 96/51/2 87/56/2 88/57/2
f 97/53/4 86/57/4 94/51/4
f 98/49/30 91/54/30 99/55/30
f 94/55/31 87/58/31 95/51/31
f 102/58/4 97/53/4 94/51/4
f 103/47/32 97/55/32 104/59/32
f 105/56/2 99/51/2 100/53/2
f 108/47/33 99/55/33 107/59/33
f 105/59/34 93/51/34 106/57/34
f 101/57/35 94/55/35 95/51/35
f 98/53/4 85/58/4 90/52/4
f 100/55/36 85/58/36 93/51/36
f 106/58/9 101/59/9 105/54/9
f 101/52/2 96/51/2 103/58/2
f 106/57/4 98/53/4 108/56/4
f 104/47/12 107/54/12 103/59/12
f 103/57/2 105/52/2 101/56/2
f 104/56/4 106/58/4 108/52/4
f 113/56/4 111/58/4 109/52/4
f 114/57/2 112/52/2 116/56/2
f 113/47/12 110/54/12 114/59/12
f 111/57/4 119/53/4 109/56/4
f 116/52/2 121/51/2 114/58/2
f 112/54/9 115/57/9 116/59/9
f 117/55/36 132/58/36 124/51/36
f 119/53/4 132/58/4 127/52/4
f 116/57/35 123/55/35 122/51/35
f 112/59/34 124/51/34 111/57/34
f 109/47/33 118/55/33 110/59/33
f 112/56/2 118/51/2 117/53/2
f 114/47/32 120/55/32 113/59/32
f 115/58/4 120/53/4 123/51/4
f 123/55/31 130/58/31 122/51/31
f 119/49/30 126/54/30 118/55/30
f 120/53/4 131/57/4 123/51/4
f 121/51/2 130/56/2 129/57/2
f 120/55/29 129/46/29 128/54/29
f 118/51/2 125/52/2 117/53/2
f 137/56/4 135/58/4 133/52/4
f 138/57/2 136/52/2 140/56/2
f 137/47/12 134/54/12 138/59/12
f 135/57/4 143/53/4 133/56/4
f 140/52/2 145/51/2 138/58/2
f 136/54/9 139/57/9 140/59/9
f 141/55/36 156/58/36 148/51/36
f 143/53/4 156/58/4 151/52/4
f 140/57/35 147/55/35 146/51/35
f 136/59/34 148/51/34 135/57/34
f 133/47/33 142/55/33 134/59/33
f 136/56/2 142/51/2 141/53/2
f 138/47/32 144/55/32 137/59/32
f 139/58/4 144/53/4 147/51/4
f 147/55/31 154/58/31 146/51/31
f 143/49/30 150/54/30 142/55/30
f 144/53/4 155/57/4 147/51/4
f 145/51/2 154/56/2 153/57/2
f 144/55/29 153/46/29 152/54/29
f 142/51/2 149/52/2 141/53/2
f 20/60/9 158/61/9 157/62/9
f 10/63/9 160/64/9 159/65/9
f 17/66/9 161/67/9 18/68/9
f 11/69/9 163/70/9 12/71/9
f 12/71/9 160/64/9 9/72/9
f 10/63/9 166/73/9 167/74/9
f 20/60/9 169/75/9 170/76/9
f 19/77/9 161/67/9 158/61/9
f 17/66/9 166/78/9 162/79/9
f 165/3/3 159/80/3 5/32/3
f 11/69/9 169/81/9 164/82/9
f 168/3/1 157/80/1 15/32/1
f 8/1/1 164/11/1 169/2/1
f 161/4/2 13/7/2 16/5/2
f 14/1/3 162/11/3 166/2/3
f 7/7/4 6/5/4 160/6/4
f 157/8/5 158/6/5 16/5/5
f 159/10/37 160/6/37 6/5/37
f 14/1/7 13/7/7 161/4/7
f 8/1/8 7/7/8 163/4/8
f 25/12/1 30/43/1 44/13/1
f 1/15/3 23/27/3 35/16/3
f 39/18/2 33/83/2 37/19/2
f 29/21/9 40/42/9 42/22/9
f 22/24/4 27/48/4 31/25/4
f 2/17/1 4/15/1 38/27/1
f 23/27/12 1/15/12 2/9/12
f 1/33/3 3/50/3 52/34/3
f 40/42/15 39/18/15 43/20/15
f 28/29/38 27/28/38 22/42/38
f 28/43/39 41/13/39 40/42/39
f 44/41/5 43/40/5 37/44/5
f 26/17/1 38/15/1 50/34/1
f 30/45/18 32/23/18 42/22/18
f 3/17/9 35/16/9 38/46/9
f 34/39/7 33/84/7 39/36/7
f 32/23/19 31/25/19 27/48/19
f 25/13/8 24/37/8 31/31/8
f 34/14/40 41/13/40 28/43/40
f 45/49/21 53/47/21 60/17/21
f 47/35/3 52/34/3 60/27/3
f 35/17/22 51/35/22 50/49/22
f 4/46/23 45/49/23 52/35/23
f 1/27/24 47/34/24 46/1/24
f 2/16/1 46/35/1 45/34/1
f 26/9/25 49/1/25 48/34/25
f 23/16/3 48/35/3 51/34/3
f 51/35/26 59/16/26 58/46/26
f 47/34/27 55/15/27 54/9/27
f 48/35/3 56/33/3 59/50/3
f 49/35/1 50/34/1 58/27/1
f 49/1/28 57/32/28 56/27/28
f 46/35/1 54/17/1 53/15/1
f 61/15/3 65/27/3 67/16/3
f 62/17/1 64/15/1 68/27/1
f 65/27/12 61/15/12 62/9/12
f 61/33/3 63/85/3 76/34/3
f 66/27/1 68/16/1 74/35/1
f 63/17/9 67/16/9 68/46/9
f 69/49/21 77/47/21 84/17/21
f 71/35/3 76/34/3 84/27/3
f 67/17/22 75/35/22 74/49/22
f 64/46/23 69/49/23 76/35/23
f 61/27/24 71/34/24 70/1/24
f 62/50/1 70/34/1 69/35/1
f 66/9/25 73/1/25 72/34/25
f 65/16/3 72/35/3 75/34/3
f 75/35/26 83/16/26 82/46/26
f 71/34/27 79/15/27 78/9/27
f 72/35/3 80/33/3 83/50/3
f 73/34/1 74/35/1 82/33/1
f 73/1/28 81/32/28 80/27/28
f 70/34/1 78/27/1 77/16/1
f 99/51/2 91/58/2 92/52/2
f 96/49/29 88/46/29 89/54/29
f 96/51/2 95/53/2 87/56/2
f 97/53/4 89/56/4 86/57/4
f 98/49/30 90/46/30 91/54/30
f 94/55/31 86/54/31 87/58/31
f 102/58/4 104/52/4 97/53/4
f 103/47/32 96/49/32 97/55/32
f 105/56/2 107/57/2 99/51/2
f 108/47/33 98/49/33 99/55/33
f 105/59/34 100/55/34 93/51/34
f 101/57/35 102/59/35 94/55/35
f 98/53/4 93/51/4 85/58/4
f 100/55/36 92/54/36 85/58/36
f 106/58/9 102/57/9 101/59/9
f 101/52/2 95/53/2 96/51/2
f 106/57/4 93/51/4 98/53/4
f 104/47/12 108/46/12 107/54/12
f 103/57/2 107/58/2 105/52/2
f 104/56/4 102/57/4 106/58/4
f 113/56/4 115/57/4 111/58/4
f 114/57/2 110/58/2 112/52/2
f 113/47/12 109/46/12 110/54/12
f 111/57/4 124/51/4 119/53/4
f 116/52/2 122/53/2 121/51/2
f 112/54/9 111/58/9 115/57/9
f 117/55/36 125/54/36 132/58/36
f 119/53/4 124/51/4 132/58/4
f 116/57/35 115/59/35 123/55/35
f 112/59/34 117/55/34 124/51/34
f 109/47/33 119/49/33 118/55/33
f 112/56/2 110/57/2 118/51/2
f 114/47/32 121/49/32 120/55/32
f 115/58/4 113/52/4 120/53/4
f 123/55/31 131/54/31 130/58/31
f 119/49/30 127/46/30 126/54/30
f 120/53/4 128/56/4 131/57/4
f 121/51/2 122/53/2 130/56/2
f 120/55/29 121/49/29 129/46/29
f 118/51/2 126/58/2 125/52/2
f 137/56/4 139/57/4 135/58/4
f 138/57/2 134/58/2 136/52/2
f 137/47/12 133/46/12 134/54/12
f 135/57/4 148/51/4 143/53/4
f 140/52/2 146/53/2 145/51/2
f 136/54/9 135/58/9 139/57/9
f 141/55/36 149/54/36 156/58/36
f 143/53/4 148/51/4 156/58/4
f 140/57/35 139/59/35 147/55/35
f 136/59/34 141/55/34 148/51/34
f 133/47/33 143/49/33 142/55/33
f 136/56/2 134/57/2 142/51/2
f 138/47/32 145/49/32 144/55/32
f 139/58/4 137/52/4 144/53/4
f 147/55/31 155/54/31 154/58/31
f 143/49/30 151/46/30 150/54/30
f 144/53/4 152/56/4 155/57/4
f 145/51/2 146/53/2 154/56/2
f 144/55/29 145/49/29 153/46/29
f 142/51/2 150/58/2 149/52/2
f 20/60/9 19/77/9 158/61/9
f 10/63/9 9/72/9 160/64/9
f 17/66/9 162/79/9 161/67/9
f 11/69/9 164/82/9 163/70/9
f 12/71/9 163/70/9 160/64/9
f 10/63/9 159/65/9 166/73/9
f 20/60/9 157/62/9 169/75/9
f 19/77/9 18/68/9 161/67/9
f 17/66/9 167/86/9 166/78/9
f 165/3/3 166/2/3 159/80/3
f 11/69/9 170/87/9 169/81/9
f 168/3/1 169/2/1 157/80/1

View File

@ -0,0 +1,228 @@
# Blender 4.0.1
# www.blender.org
o FloodLamp
v 0.015049 -0.086498 0.155863
v 0.015049 0.086498 0.155863
v 0.015049 -0.086498 -0.155863
v 0.015049 0.086498 -0.155863
v 0.306240 -0.185247 0.273848
v 0.306240 0.185247 0.273848
v 0.306240 -0.185247 -0.273848
v 0.306240 0.185247 -0.273848
v 0.306240 0.228156 -0.325088
v 0.306240 -0.228156 -0.325088
v 0.306240 -0.228156 0.325088
v 0.306240 0.228156 0.325088
v 0.183352 0.115790 -0.171171
v 0.183352 -0.115790 -0.171171
v 0.183352 -0.115790 0.171171
v 0.183352 0.115790 0.171171
v 0.183138 0.057253 -0.202014
v 0.183138 0.057253 0.202014
v 0.183138 -0.057253 -0.202014
v 0.183138 -0.057253 0.202014
v 0.214999 -0.040484 -0.202014
v 0.214999 -0.040484 0.202014
v 0.228196 0.000000 -0.202014
v 0.228196 0.000000 0.202014
v 0.214999 0.040484 -0.202014
v 0.214999 0.040484 0.202014
v -0.001481 -0.036719 0.241790
v -0.001481 0.036719 0.241790
v -0.001481 -0.036719 -0.241790
v -0.001481 0.036719 -0.241790
v 0.005048 -0.036719 0.237296
v 0.005048 0.036719 0.237296
v 0.005048 -0.036719 -0.237296
v 0.005048 0.036719 -0.237296
v 0.150804 -0.036719 0.259541
v 0.150804 0.036719 0.259541
v 0.150804 0.036719 -0.259541
v 0.150804 -0.036719 -0.259541
v 0.150804 -0.036719 -0.253185
v 0.150804 0.036719 -0.253185
v 0.150804 0.036719 0.253185
v 0.150804 -0.036719 0.253185
v 0.071925 -0.135739 -0.228998
v 0.071925 0.135739 -0.228998
v 0.071925 -0.135739 0.228998
v 0.071925 0.135739 0.228998
v 0.256780 0.219497 -0.320654
v 0.256780 -0.219497 0.320654
v 0.256780 -0.219497 -0.320654
v 0.256780 0.219497 0.320654
vn -1.0000 -0.0000 -0.0000
vn -0.0893 -0.0000 -0.9960
vn 0.4920 -0.8706 -0.0000
vn -0.7894 -0.0000 0.6139
vn -0.1724 -0.9850 -0.0000
vn -0.6545 0.7560 -0.0000
vn 1.0000 -0.0000 -0.0000
vn 0.6412 -0.0000 0.7674
vn 0.6412 -0.0000 -0.7674
vn 0.4920 0.8706 -0.0000
vn 0.4658 -0.8849 -0.0000
vn 0.9508 -0.3099 -0.0000
vn 0.9508 0.3099 -0.0000
vn 0.4658 0.8849 -0.0000
vn -0.0000 -1.0000 -0.0000
vn 0.1084 -0.0000 0.9941
vn -0.0000 1.0000 -0.0000
vn 0.1084 -0.0000 -0.9941
vn -0.1158 -0.0000 -0.9933
vn -0.1158 -0.0000 0.9933
vn -0.4127 0.9109 -0.0000
vn -0.6545 -0.7560 -0.0000
vn -0.4442 -0.0000 0.8959
vn -0.7894 -0.0000 -0.6139
vn -0.0893 -0.0000 0.9960
vn -0.1724 0.9850 -0.0000
vn -0.4127 -0.9109 -0.0000
vn -0.4442 -0.0000 -0.8959
vt 0.750000 0.312500
vt 0.937500 0.000000
vt 0.937500 0.312500
vt 0.433577 0.606066
vt 0.390675 0.995211
vt 0.433577 0.987684
vt 0.319041 0.068172
vt 0.433066 0.416342
vt 0.319041 0.496674
vt 0.592516 0.678877
vt 0.640575 0.872068
vt 0.592516 0.914873
vt 0.954474 0.992052
vt 0.393131 0.950474
vt 0.950619 0.950474
vt 0.536383 0.742486
vt 0.870944 0.796340
vt 0.472806 0.796340
vt 0.520556 0.519306
vt 0.125992 0.563849
vt 0.166945 0.519306
vt 0.520555 0.043194
vt 0.561508 0.563849
vt 0.125992 -0.001349
vt 0.166945 0.043194
vt 0.166945 0.045709
vt 0.561508 0.001166
vt 0.520555 0.045709
vt 0.062500 1.000000
vt 0.312500 0.687500
vt 0.312500 1.000000
vt 0.999676 0.773340
vt 0.890949 0.511648
vt 0.999676 0.451269
vt 1.000000 0.773310
vt 0.891273 0.511618
vt 1.000000 0.451239
vt 0.320607 0.064998
vt 0.433145 0.419320
vt 0.320607 0.493499
vt 0.000000 0.437500
vt 0.062500 0.437500
vt 0.000000 1.000000
vt 0.937500 0.437500
vt 1.000000 0.000000
vt 1.000000 0.437500
vt 1.000000 0.125000
vt 0.937500 0.125000
vt 0.950619 0.956002
vt 0.393131 0.956002
vt 0.807367 0.757948
vt 0.472806 0.801131
vt 0.536383 0.757948
vt 0.640575 0.721682
vt 0.390675 0.598539
vt 0.390675 0.995211
vt 0.954474 0.995950
vt 0.389276 0.995950
vt 0.870944 0.801131
vt 0.750000 0.000000
vt 0.390675 0.598539
vt 0.433066 0.148504
vt 0.389276 0.992052
vt 0.807367 0.742486
vt 0.561508 -0.001349
vt 0.125992 0.001166
vt 0.062500 0.687500
vt 0.890949 0.712961
vt 0.891273 0.712931
vt 0.433145 0.151481
s 0
f 2/1/1 3/2/1 1/3/1
f 47/4/2 10/5/2 49/6/2
f 6/7/3 13/8/3 8/9/3
f 46/10/4 1/11/4 45/12/4
f 10/13/5 48/14/5 49/15/5
f 4/16/6 46/17/6 44/18/6
f 7/19/7 9/20/7 8/21/7
f 5/22/7 10/23/7 7/19/7
f 8/21/7 12/24/7 6/25/7
f 6/26/7 11/27/7 5/28/7
f 13/29/7 15/30/7 14/31/7
f 8/32/8 14/33/8 7/34/8
f 5/35/9 16/36/9 6/37/9
f 7/38/10 15/39/10 5/40/10
f 21/41/11 20/29/11 19/42/11
f 23/41/12 22/29/12 21/42/12
f 25/29/13 24/41/13 23/43/13
f 17/29/14 26/41/14 25/43/14
f 28/44/1 29/45/1 27/46/1
f 33/2/15 38/47/15 39/48/15
f 34/44/7 31/45/7 33/46/7
f 33/45/16 40/48/16 34/2/16
f 33/44/15 27/45/15 29/46/15
f 30/45/17 32/44/17 34/2/17
f 32/2/17 36/47/17 41/48/17
f 32/48/18 42/45/18 31/47/18
f 34/45/17 37/48/17 30/2/17
f 30/48/19 38/45/19 29/47/19
f 27/45/20 36/48/20 28/2/20
f 31/45/15 35/48/15 27/2/15
f 44/18/21 50/49/21 47/50/21
f 3/51/22 45/52/22 1/53/22
f 50/4/23 45/12/23 48/6/23
f 4/54/24 43/12/24 3/11/24
f 12/55/25 48/6/25 11/56/25
f 47/50/26 12/57/26 9/58/26
f 49/15/27 45/52/27 43/59/27
f 44/10/28 49/6/28 43/12/28
f 2/1/1 4/60/1 3/2/1
f 47/4/2 9/61/2 10/5/2
f 6/7/3 16/62/3 13/8/3
f 46/10/4 2/54/4 1/11/4
f 10/13/5 11/63/5 48/14/5
f 4/16/6 2/64/6 46/17/6
f 7/19/7 10/23/7 9/20/7
f 5/22/7 11/65/7 10/23/7
f 8/21/7 9/20/7 12/24/7
f 6/26/7 12/66/7 11/27/7
f 13/29/7 16/67/7 15/30/7
f 8/32/8 13/68/8 14/33/8
f 5/35/9 15/69/9 16/36/9
f 7/38/10 14/70/10 15/39/10
f 21/41/11 22/43/11 20/29/11
f 23/41/12 24/43/12 22/29/12
f 25/29/13 26/42/13 24/41/13
f 17/29/14 18/42/14 26/41/14
f 28/44/1 30/2/1 29/45/1
f 33/2/15 29/45/15 38/47/15
f 34/44/7 32/2/7 31/45/7
f 33/45/16 39/47/16 40/48/16
f 33/44/15 31/2/15 27/45/15
f 30/45/17 28/46/17 32/44/17
f 32/2/17 28/45/17 36/47/17
f 32/48/18 41/2/18 42/45/18
f 34/45/17 40/47/17 37/48/17
f 30/48/19 37/2/19 38/45/19
f 27/45/20 35/47/20 36/48/20
f 31/45/15 42/47/15 35/48/15
f 44/18/21 46/17/21 50/49/21
f 3/51/22 43/59/22 45/52/22
f 50/4/23 46/10/23 45/12/23
f 4/54/24 44/10/24 43/12/24
f 12/55/25 50/4/25 48/6/25
f 47/50/26 50/49/26 12/57/26
f 49/15/27 48/14/27 45/52/27
f 44/10/28 47/4/28 49/6/28

View File

@ -0,0 +1,306 @@
# Blender 4.0.1
# www.blender.org
o FluoroCap
v -0.002210 -0.289110 0.300000
v -0.002210 0.289110 0.300000
v -0.002210 -0.289110 -0.500000
v -0.002210 0.289110 -0.500000
v 0.147790 -0.315000 0.300000
v 0.147790 0.315000 0.300000
v 0.147790 -0.315000 -0.500000
v 0.147790 0.315000 -0.500000
v 0.072790 -0.315000 -0.500000
v 0.072790 0.315000 -0.500000
v 0.072790 -0.315000 0.300000
v 0.072790 0.315000 0.300000
v -0.002210 0.289110 0.350000
v -0.002210 -0.289110 0.350000
v 0.147790 -0.315000 0.350000
v 0.147790 0.315000 0.350000
v 0.072790 0.315000 0.350000
v 0.072790 -0.315000 0.350000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.3263 0.9453 -0.0000
vn -0.0000 1.0000 -0.0000
vn -0.3263 -0.9453 -0.0000
vn -0.0000 -0.0000 1.0000
vt 0.125000 0.937500
vt 0.625000 0.875000
vt 0.625000 0.937500
vt 0.125000 0.687500
vt 0.625000 0.125000
vt 0.625000 0.687500
vt 0.687500 0.125000
vt 0.687500 0.687500
vt 0.000000 0.687500
vt 0.062500 0.125000
vt 0.062500 0.687500
vt 0.125000 0.125000
vt 0.750000 0.125000
vt 0.750000 0.687500
vt 0.125000 1.000000
vt 0.625000 1.000000
vt 0.125000 0.062500
vt 0.625000 0.000000
vt 0.625000 0.062500
vt 1.000000 0.375000
vt 0.937500 0.437500
vt 0.937500 0.375000
vt 1.000000 0.437500
vt 0.937500 1.000000
vt 1.000000 0.500000
vt 1.000000 1.000000
vt 0.937500 0.500000
vt 0.125000 0.875000
vt 0.000000 0.125000
vt 0.125000 0.000000
s 0
f 10/1/1 7/2/1 9/3/1
f 8/4/2 5/5/2 7/6/2
f 7/6/3 11/7/3 9/8/3
f 4/9/4 12/10/4 10/11/4
f 10/11/5 6/12/5 8/4/5
f 9/8/6 1/13/6 3/14/6
f 4/15/1 9/3/1 3/16/1
f 17/17/7 14/18/7 18/19/7
f 13/20/4 12/21/4 2/22/4
f 18/21/6 1/20/6 11/23/6
f 16/12/7 18/19/7 15/5/7
f 16/24/2 5/25/2 6/26/2
f 17/21/5 6/25/5 12/23/5
f 15/27/3 11/23/3 5/25/3
f 10/1/1 8/28/1 7/2/1
f 8/4/2 6/12/2 5/5/2
f 7/6/3 5/5/3 11/7/3
f 4/9/4 2/29/4 12/10/4
f 10/11/5 12/10/5 6/12/5
f 9/8/6 11/7/6 1/13/6
f 4/15/1 10/1/1 9/3/1
f 17/17/7 13/30/7 14/18/7
f 13/20/4 17/23/4 12/21/4
f 18/21/6 14/22/6 1/20/6
f 16/12/7 17/17/7 18/19/7
f 16/24/2 15/27/2 5/25/2
f 17/21/5 16/27/5 6/25/5
f 15/27/3 18/21/3 11/23/3
o FluoroMid
v -0.002210 -0.289110 0.500000
v -0.002210 0.289110 0.500000
v -0.002210 -0.289110 -0.500000
v -0.002210 0.289110 -0.500000
v 0.147790 -0.315000 0.500000
v 0.147790 0.315000 0.500000
v 0.147790 -0.315000 -0.500000
v 0.147790 0.315000 -0.500000
v 0.072790 -0.315000 -0.500000
v 0.072790 0.315000 -0.500000
v 0.072790 -0.315000 0.500000
v 0.072790 0.315000 0.500000
v -0.002210 -0.289110 0.000000
v -0.002210 0.289110 0.000000
v 0.147790 -0.315000 0.000000
v 0.147790 0.315000 0.000000
v 0.072790 0.315000 0.000000
v 0.072790 -0.315000 0.000000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.3263 0.9453 -0.0000
vn -0.0000 1.0000 -0.0000
vn -0.3263 -0.9453 -0.0000
vt 0.125000 0.937500
vt 0.625000 0.875000
vt 0.625000 0.937500
vt 0.125000 0.687500
vt 0.625000 0.312500
vt 0.625000 0.687500
vt 0.125000 0.062500
vt 0.625000 0.000000
vt 0.625000 0.062500
vt 0.625000 0.500000
vt 0.687500 0.125000
vt 0.687500 0.500000
vt 0.000000 0.500000
vt 0.062500 0.125000
vt 0.062500 0.500000
vt 0.125000 0.125000
vt 0.125000 0.500000
vt 0.750000 0.125000
vt 0.750000 0.500000
vt 0.625000 0.125000
vt 0.125000 1.000000
vt 0.625000 1.000000
vt 0.687500 0.875000
vt 0.750000 0.875000
vt 0.062500 0.875000
vt 0.125000 0.875000
vt -0.000000 0.875000
vt 0.125000 0.312500
vt 0.125000 0.000000
vt 0.000000 0.125000
s 0
f 28/31/8 25/32/8 27/33/8
f 34/34/9 23/35/9 33/36/9
f 30/37/10 19/38/10 29/39/10
f 33/40/11 29/41/11 36/42/11
f 32/43/12 30/44/12 35/45/12
f 35/45/13 24/46/13 34/47/13
f 36/42/14 19/48/14 31/49/14
f 24/46/10 29/39/10 23/50/10
f 22/51/8 27/33/8 21/52/8
f 27/53/14 31/49/14 21/54/14
f 28/55/13 34/47/13 26/56/13
f 22/57/12 35/45/12 28/55/12
f 25/32/11 36/42/11 27/53/11
f 26/34/9 33/35/9 25/36/9
f 28/31/8 26/56/8 25/32/8
f 34/34/9 24/58/9 23/35/9
f 30/37/10 20/59/10 19/38/10
f 33/40/11 23/50/11 29/41/11
f 32/43/12 20/60/12 30/44/12
f 35/45/13 30/44/13 24/46/13
f 36/42/14 29/41/14 19/48/14
f 24/46/10 30/37/10 29/39/10
f 22/51/8 28/31/8 27/33/8
f 27/53/14 36/42/14 31/49/14
f 28/55/13 35/45/13 34/47/13
f 22/57/12 32/43/12 35/45/12
f 25/32/11 33/40/11 36/42/11
f 26/34/9 34/58/9 33/35/9
o FluoroSingle
v -0.002210 -0.289110 0.300000
v -0.002210 0.289110 0.300000
v -0.002210 -0.289110 -0.300000
v -0.002210 0.289110 -0.300000
v 0.147790 -0.315000 0.300000
v 0.147790 0.315000 0.300000
v 0.147790 -0.315000 -0.300000
v 0.147790 0.315000 -0.300000
v 0.072790 -0.315000 -0.300000
v 0.072790 0.315000 -0.300000
v 0.072790 -0.315000 0.300000
v 0.072790 0.315000 0.300000
v 0.072790 -0.315000 -0.350000
v 0.072790 0.315000 -0.350000
v 0.147790 0.315000 -0.350000
v 0.147790 -0.315000 -0.350000
v 0.072790 -0.315000 0.350000
v 0.072790 0.315000 0.350000
v -0.002210 0.289110 0.350000
v -0.002210 -0.289110 0.350000
v 0.147790 -0.315000 0.350000
v 0.147790 0.315000 0.350000
v -0.002210 -0.289110 -0.350000
v -0.002210 0.289110 -0.350000
v -0.002210 -0.289110 0.000000
v -0.002210 0.289110 0.000000
v 0.147790 -0.315000 0.000000
v 0.147790 0.315000 0.000000
v 0.072790 0.315000 0.000000
v 0.072790 -0.315000 0.000000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.3263 0.9453 -0.0000
vn -0.0000 1.0000 -0.0000
vn -0.3263 -0.9453 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -0.0000 -0.0000 1.0000
vt 0.125000 0.375000
vt 0.625000 0.125000
vt 0.625000 0.375000
vt 0.625000 0.625000
vt 0.687500 0.375000
vt 0.687500 0.625000
vt 0.000000 0.625000
vt 0.062500 0.375000
vt 0.062500 0.625000
vt 0.125000 0.375000
vt 0.125000 0.625000
vt 0.750000 0.375000
vt 0.750000 0.625000
vt 0.125000 0.937500
vt 0.625000 0.875000
vt 0.625000 0.937500
vt 0.937500 0.437500
vt 1.000000 0.500000
vt 1.000000 0.437500
vt 0.937500 0.562500
vt 1.000000 1.000000
vt 1.000000 0.562500
vt 1.000000 0.500000
vt 0.937500 0.500000
vt 0.125000 0.062500
vt 0.625000 -0.000000
vt 0.625000 0.062500
vt 1.000000 0.500000
vt 0.125000 0.125000
vt 0.625000 0.125000
vt 0.937500 1.000000
vt 0.937500 0.562500
vt 0.125000 1.000000
vt 0.625000 1.000000
vt 1.000000 0.562500
vt 1.000000 0.562500
vt 0.687500 0.875000
vt 0.750000 0.875000
vt 0.062500 0.875000
vt 0.125000 0.875000
vt 0.000000 0.875000
vt 0.125000 0.875000
vt 0.625000 0.875000
vt 0.125000 0.125000
vt 0.625000 0.375000
vt 0.000000 0.375000
vt 0.125000 -0.000000
s 0
f 64/61/15 41/62/15 63/63/15
f 63/64/16 47/65/16 66/66/16
f 62/67/17 48/68/17 65/69/17
f 65/69/18 42/70/18 64/71/18
f 66/66/19 37/72/19 61/73/19
f 50/74/20 52/75/20 49/76/20
f 51/77/18 46/78/18 44/79/18
f 52/80/15 44/81/15 43/82/15
f 49/83/16 43/77/16 45/84/16
f 54/85/21 56/86/21 53/87/21
f 55/79/17 48/84/17 38/77/17
f 53/88/19 37/77/19 47/84/19
f 58/89/21 53/87/21 57/90/21
f 58/91/15 41/82/15 42/81/15
f 54/78/18 42/92/18 48/84/18
f 57/82/16 47/84/16 41/92/16
f 60/93/20 49/76/20 59/94/20
f 50/84/17 40/95/17 46/78/17
f 59/96/19 45/84/19 39/92/19
f 45/97/19 61/73/19 39/98/19
f 46/99/18 64/71/18 44/100/18
f 40/101/17 65/69/17 46/99/17
f 43/75/16 66/66/16 45/97/16
f 44/102/15 63/64/15 43/103/15
f 64/61/15 42/104/15 41/62/15
f 63/64/16 41/105/16 47/65/16
f 62/67/17 38/106/17 48/68/17
f 65/69/18 48/68/18 42/70/18
f 66/66/19 47/65/19 37/72/19
f 50/74/20 51/100/20 52/75/20
f 51/77/18 50/84/18 46/78/18
f 52/80/15 51/91/15 44/81/15
f 49/83/16 52/79/16 43/77/16
f 54/85/21 55/107/21 56/86/21
f 55/79/17 54/78/17 48/84/17
f 53/88/19 56/79/19 37/77/19
f 58/89/21 54/85/21 53/87/21
f 58/91/15 57/80/15 41/82/15
f 54/78/18 58/95/18 42/92/18
f 57/82/16 53/88/16 47/84/16
f 60/93/20 50/74/20 49/76/20
f 50/84/17 60/92/17 40/95/17
f 59/96/19 49/83/19 45/84/19
f 45/97/19 66/66/19 61/73/19
f 46/99/18 65/69/18 64/71/18
f 40/101/17 62/67/17 65/69/17
f 43/75/16 63/64/16 66/66/16
f 44/102/15 64/71/15 63/64/15

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1011 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB