public MeshData GenMealMesh(CookingRecipe forRecipe, ItemStack[] contentStacks, Vec3f foodTranslate = null) { MealTextureSource source = new MealTextureSource(capi, mealtextureSourceBlock); if (forRecipe != null) { MeshData foodMesh = GenFoodMixMesh(contentStacks, forRecipe, foodTranslate); if (foodMesh != null) { return(foodMesh); } } if (contentStacks != null && contentStacks.Length > 0) { bool rotten = ContentsRotten(contentStacks); if (rotten) { Shape contentShape = capi.Assets.TryGet("shapes/block/food/meal/rot.json").ToObject <Shape>(); MeshData contentMesh; capi.Tesselator.TesselateShape("rotcontents", contentShape, out contentMesh, source); if (foodTranslate != null) { contentMesh.Translate(foodTranslate); } return(contentMesh); } else { JsonObject obj = contentStacks[0]?.ItemAttributes?["inContainerTexture"]; if (obj != null && obj.Exists) { source.ForStack = contentStacks[0]; CompositeShape cshape = contentStacks[0]?.ItemAttributes?["inBowlShape"].AsObject <CompositeShape>(new CompositeShape() { Base = new AssetLocation("shapes/block/food/meal/pickled.json") }); Shape contentShape = capi.Assets.TryGet(cshape.Base.WithPathAppendixOnce(".json").WithPathPrefixOnce("shapes/")).ToObject <Shape>(); MeshData contentMesh; capi.Tesselator.TesselateShape("picklednmealcontents", contentShape, out contentMesh, source); return(contentMesh); } } } return(null); }
public MeshData CreateMealMesh(CompositeShape cShape, CookingRecipe forRecipe, ItemStack[] contentStacks, Vec3f foodTranslate = null) { MealTextureSource source = new MealTextureSource(capi, textureSourceBlock); Shape shape = capi.Assets.TryGet("shapes/" + cShape.Base.Path + ".json").ToObject <Shape>(); MeshData containerMesh; capi.Tesselator.TesselateShape("meal", shape, out containerMesh, source, new Vec3f(cShape.rotateX, cShape.rotateY, cShape.rotateZ)); if (forRecipe != null) { MeshData foodMesh = GenFoodMixMesh(contentStacks, forRecipe, foodTranslate); containerMesh.AddMeshData(foodMesh); } return(containerMesh); }
public MeshData CreateMealMesh(CompositeShape cShape, CookingRecipe forRecipe, ItemStack[] contentStacks, Vec3f foodTranslate = null) { MealTextureSource source = new MealTextureSource(capi, textureSourceBlock); Shape shape = capi.Assets.TryGet("shapes/" + cShape.Base.Path + ".json").ToObject <Shape>(); MeshData containerMesh; capi.Tesselator.TesselateShape("meal", shape, out containerMesh, source, new Vec3f(cShape.rotateX, cShape.rotateY, cShape.rotateZ)); if (forRecipe != null) { MeshData foodMesh = GenFoodMixMesh(contentStacks, forRecipe, foodTranslate); containerMesh.AddMeshData(foodMesh); } if (contentStacks != null && contentStacks.Length > 0) { bool rotten = ContentsRotten(contentStacks); if (rotten) { Shape contentShape = capi.Assets.TryGet("shapes/block/meal/rot.json").ToObject <Shape>(); MeshData contentMesh; capi.Tesselator.TesselateShape("rotcontents", contentShape, out contentMesh, source); containerMesh.AddMeshData(contentMesh); } else { JsonObject obj = contentStacks[0]?.ItemAttributes?["inContainerTexture"]; if (obj != null && obj.Exists) { source.ForStack = contentStacks[0]; Shape contentShape = capi.Assets.TryGet("shapes/block/meal/pickled.json").ToObject <Shape>(); MeshData contentMesh; capi.Tesselator.TesselateShape("picklednmealcontents", contentShape, out contentMesh, source); containerMesh.AddMeshData(contentMesh); } } } return(containerMesh); }
public MeshData GenFoodMixMesh(ItemStack[] contentStacks, CookingRecipe recipe, Vec3f foodTranslate) { MeshData mergedmesh = null; MealTextureSource texSource = new MealTextureSource(capi, textureSourceBlock); Shape shape = capi.Assets.TryGet("shapes/" + recipe.Shape.Base.Path + ".json").ToObject <Shape>(); Dictionary <CookingRecipeIngredient, int> usedIngredQuantities = new Dictionary <CookingRecipeIngredient, int>(); for (int i = 0; i < contentStacks.Length; i++) { texSource.ForStack = contentStacks[i]; CookingRecipeIngredient ingred = recipe.GetIngrendientFor( contentStacks[i], usedIngredQuantities.Where(val => val.Key.MaxQuantity <= val.Value).Select(val => val.Key).ToArray() ); if (ingred == null) { ingred = recipe.GetIngrendientFor(contentStacks[i]); } else { int cnt = 0; usedIngredQuantities.TryGetValue(ingred, out cnt); cnt++; usedIngredQuantities[ingred] = cnt; } if (ingred == null) { continue; } MeshData meshpart; string[] selectiveElements = null; CookingRecipeStack recipestack = ingred.GetMatchingStack(contentStacks[i]); if (recipestack.ShapeElement != null) { selectiveElements = new string[] { recipestack.ShapeElement } } ; texSource.customTextureMapping = recipestack.TextureMapping; capi.Tesselator.TesselateShape( "mealpart", shape, out meshpart, texSource, new Vec3f(recipe.Shape.rotateX, recipe.Shape.rotateY, recipe.Shape.rotateZ), 0, 0, null, selectiveElements ); if (mergedmesh == null) { mergedmesh = meshpart; } else { mergedmesh.AddMeshData(meshpart); } } if (foodTranslate != null) { mergedmesh.Translate(foodTranslate); } return(mergedmesh); }
public MeshData GenFoodMixMesh(ItemStack[] contentStacks, CookingRecipe recipe, Vec3f foodTranslate) { MeshData mergedmesh = null; MealTextureSource texSource = new MealTextureSource(capi, mealtextureSourceBlock); var shapePath = recipe.Shape.Base.Clone().WithPathPrefixOnce("shapes/").WithPathAppendixOnce(".json"); bool rotten = ContentsRotten(contentStacks); if (rotten) { shapePath = new AssetLocation("shapes/block/food/meal/rot.json"); } Shape shape = capi.Assets.TryGet(shapePath).ToObject <Shape>(); Dictionary <CookingRecipeIngredient, int> usedIngredQuantities = new Dictionary <CookingRecipeIngredient, int>(); if (rotten) { capi.Tesselator.TesselateShape( "mealpart", shape, out mergedmesh, texSource, new Vec3f(recipe.Shape.rotateX, recipe.Shape.rotateY, recipe.Shape.rotateZ) ); } else { HashSet <string> drawnMeshes = new HashSet <string>(); for (int i = 0; i < contentStacks.Length; i++) { texSource.ForStack = contentStacks[i]; CookingRecipeIngredient ingred = recipe.GetIngrendientFor( contentStacks[i], usedIngredQuantities.Where(val => val.Key.MaxQuantity <= val.Value).Select(val => val.Key).ToArray() ); if (ingred == null) { ingred = recipe.GetIngrendientFor(contentStacks[i]); } else { int cnt = 0; usedIngredQuantities.TryGetValue(ingred, out cnt); cnt++; usedIngredQuantities[ingred] = cnt; } if (ingred == null) { continue; } MeshData meshpart; string[] selectiveElements = null; CookingRecipeStack recipestack = ingred.GetMatchingStack(contentStacks[i]); if (recipestack.ShapeElement != null) { selectiveElements = new string[] { recipestack.ShapeElement } } ; texSource.customTextureMapping = recipestack.TextureMapping; if (drawnMeshes.Contains(recipestack.ShapeElement + recipestack.TextureMapping)) { continue; } drawnMeshes.Add(recipestack.ShapeElement + recipestack.TextureMapping); capi.Tesselator.TesselateShape( "mealpart", shape, out meshpart, texSource, new Vec3f(recipe.Shape.rotateX, recipe.Shape.rotateY, recipe.Shape.rotateZ), 0, 0, 0, null, selectiveElements ); if (mergedmesh == null) { mergedmesh = meshpart; } else { mergedmesh.AddMeshData(meshpart); } } } if (foodTranslate != null && mergedmesh != null) { mergedmesh.Translate(foodTranslate); } return(mergedmesh); }