public bool OnTesselation(ITerrainMeshPool mesher, ITesselatorAPI tessThreadTesselator) { ICoreClientAPI capi = api as ICoreClientAPI; Matrixf mat = new Matrixf(); mat.RotateYDeg(block.Shape.rotateY); for (int i = 0; i < 8; i++) { if (inv[i].Empty) { continue; } ItemStack stack = inv[i].Itemstack; BlockCrock crockblock = stack.Collectible as BlockCrock; Vec3f rot = new Vec3f(0, block.Shape.rotateY, 0); MeshData mesh = BlockEntityCrock.GetMesh(tessThreadTesselator, api, crockblock, crockblock.GetContents(api.World, stack), crockblock.GetRecipeCode(api.World, stack), rot); float y = i >= 4 ? 10 / 16f : 2 / 16f; float x = (i % 2 == 0) ? 4 / 16f : 12 / 16f; float z = ((i % 4) >= 2) ? 10 / 16f : 4 / 16f; Vec4f offset = mat.TransformVector(new Vec4f(x - 0.5f, y, z - 0.5f, 0)); mesh.Translate(offset.XYZ); mesher.AddMeshData(mesh); } return(false); }
protected override MeshData genMesh(ItemStack stack, int index) { BlockCrock crockblock = stack.Collectible as BlockCrock; BlockMeal mealblock = stack.Collectible as BlockMeal; MeshData mesh; if (crockblock != null) { Vec3f rot = new Vec3f(0, block.Shape.rotateY, 0); mesh = BlockEntityCrock.GetMesh(capi.Tesselator, Api, crockblock, crockblock.GetContents(Api.World, stack), crockblock.GetRecipeCode(Api.World, stack), rot).Clone(); } else if (mealblock != null) { ICoreClientAPI capi = Api as ICoreClientAPI; MealMeshCache meshCache = capi.ModLoader.GetModSystem <MealMeshCache>(); mesh = meshCache.GenMealInContainerMesh(mealblock, mealblock.GetCookingRecipe(capi.World, stack), mealblock.GetNonEmptyContents(capi.World, stack)); } else { ICoreClientAPI capi = Api as ICoreClientAPI; if (stack.Class == EnumItemClass.Block) { mesh = capi.TesselatorManager.GetDefaultBlockMesh(stack.Block).Clone(); } else { nowTesselatingItem = stack.Item; nowTesselatingShape = capi.TesselatorManager.GetCachedShape(stack.Item.Shape.Base); capi.Tesselator.TesselateItem(stack.Item, out mesh, this); mesh.RenderPasses.Fill((short)EnumChunkRenderPass.BlendNoCull); } } if (stack.Collectible.Attributes?["onDisplayTransform"].Exists == true) { ModelTransform transform = stack.Collectible.Attributes?["onDisplayTransform"].AsObject <ModelTransform>(); transform.EnsureDefaultValues(); mesh.ModelTransform(transform); } if (stack.Class == EnumItemClass.Item && (stack.Item.Shape == null || stack.Item.Shape.VoxelizeTexture)) { mesh.Rotate(new Vec3f(0.5f, 0.5f, 0.5f), GameMath.PIHALF, 0, 0); mesh.Scale(new Vec3f(0.5f, 0.5f, 0.5f), 0.33f, 0.5f, 0.33f); mesh.Translate(0, -7.5f / 16f, 0f); } float x = ((index % 4) >= 2) ? 12 / 16f : 4 / 16f; float y = index >= 4 ? 10 / 16f : 2 / 16f; float z = (index % 2 == 0) ? 4 / 16f : 10 / 16f; Vec4f offset = mat.TransformVector(new Vec4f(x - 0.5f, y, z - 0.5f, 0)); mesh.Translate(offset.XYZ); return(mesh); }