Ссылку можно? Нагуглить не смог ниче лучше minecraft by example, но там слишком топорный примерПо ним есть документация, можешь почитать.
UnpackedBakedQuad.Builder
и идеально работающий на 1.10.2(создает куб) на 1.12.2 выдает вот такую хрень:object Cube{
def apply(x: Float, y: Float, z: Float, w: Float, h: Float, d: Float,textureAtlasSprite: TextureAtlasSprite,color:(Float,Float,Float)=(1,1,1)): Cube =
new Cube(x, y, z, w, h, d,0,0,0,1,1,1,textureAtlasSprite,color)
}
case class Cube(
x:Float,y:Float,z:Float
,w:Float,h:Float,d:Float
,cx:Float,cy:Float,cz:Float
,scaleX:Float,scaleY:Float,scaleZ:Float,
textureAtlasSprite: TextureAtlasSprite,color:(Float,Float,Float)) {
private def putVertex(builder: UnpackedBakedQuad.Builder, normal: Vector3, x: Double, y: Double, z: Double, u: Float, v: Float, sprite: TextureAtlasSprite, color:(Float,Float,Float)): Unit = {
import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumUsage._
for (
e <-0 until format.getElementCount
) {
format.getElement(e).getUsage match {
case POSITION =>
builder.put(e, x.toFloat, y.toFloat, z.toFloat, 1.0f)
case COLOR =>
builder.put(e, color._1,color._2,color._3, 1.0f)
case UV =>
if (format.getElement(e).getIndex == 0) {
val u1 = sprite.getInterpolatedU(u)
val v1 = sprite.getInterpolatedV(v)
builder.put(e, u1, v1, 0f, 1f)
}
case NORMAL =>
builder.put(e, normal.x.toFloat, normal.y.toFloat, normal.z.toFloat, 0f)
case _ =>
builder.put(e)
}
}
}
val format: VertexFormat = net.minecraft.client.renderer.vertex.DefaultVertexFormats.ITEM
def extendedVectorScale(v1: Vector3) = new Vector3(v1.x*scaleX,v1.y*scaleY,v1.z*scaleZ)
private def createQuad1(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3, sprite: TextureAtlasSprite, color:(Float,Float,Float)=color) = {
val center:Vector3=(cx*scaleX,cy*scaleY,cz*scaleZ)
createQuad(extendedVectorScale(v1).add(center),extendedVectorScale(v2).add(center),extendedVectorScale(v3).add(center),extendedVectorScale(v4).add(center),sprite,color)
}
private def createQuad(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3, sprite: TextureAtlasSprite,color:(Float,Float,Float)=color) = {
val normal = v1.subtract(v2).crossProduct(v3.subtract(v2)).normalize()
val builder = new UnpackedBakedQuad.Builder(format)
builder.setTexture(sprite)
putVertex(builder, normal, v1.x, v1.y, v1.z, 0, 0, sprite,color)
putVertex(builder, normal, v2.x, v2.y, v2.z, 0, 16, sprite,color)
putVertex(builder, normal, v3.x, v3.y, v3.z, 16, 16, sprite,color)
putVertex(builder, normal, v4.x, v4.y, v4.z, 16, 0, sprite,color)
builder.build
}
def scale(sx:Float,sy:Float,sz:Float): Cube = copy(scaleX=scaleX*sx,scaleY=scaleY*sy,scaleZ=scaleZ*sz)
def scale(s:Float): Cube = copy(scaleX=scaleX*s,scaleY=scaleY*s,scaleZ=scaleZ*s)
def move(cx1:Float,cy1:Float,cz1:Float): Cube = copy(cx=cx+cx1,cy=cy+cy1,cz=cz+cz1)
private val texture = textureAtlasSprite//Minecraft.getMinecraft.getTextureMapBlocks.getAtlasSprite(new ResourceLocation(advancedAuromancyModId+":items/wand_rod_silverwood").toString)
def toQuads: List[BakedQuad] =
List(
createQuad1((x, y, z), (x, y+h, z), (x+w, y+h, z), (x+w, y, z),texture),
createQuad1((x, y, z), (x+w, y, z), (x+w, y, z+d), (x, y, z+d),texture),
createQuad1((x, y+h, z),(x, y, z), (x, y, z+d), (x, y+h, z+d),texture),
createQuad1((x+w, y, z+d),(x+w, y+h, z+d), (x, y+h, z+d), (x, y, z+d),texture),
createQuad1((x+w, y+h, z+d), (x+w, y+h, z), (x, y+h, z), (x, y+h, z+d),texture),
createQuad1((x+w, y+h, z+d), (x+w, y, z+d), (x+w, y, z),(x+w, y+h, z),texture)
)
import scala.collection.JavaConverters._
def toQuads1: java.util.List[BakedQuad] = toQuads.asJava
implicit private def tuple2Vec[F:Numeric](t:(F ,F ,F )): Vector3 = {
import Numeric.Implicits._
new Vector3(t._1.toDouble,t._2.toDouble,t._3.toDouble)
}
}
Scala:object Cube{ def apply(x: Float, y: Float, z: Float, w: Float, h: Float, d: Float,textureAtlasSprite: TextureAtlasSprite,color:(Float,Float,Float)=(1,1,1)): Cube = new Cube(x, y, z, w, h, d,0,0,0,1,1,1,textureAtlasSprite,color) } case class Cube( x:Float,y:Float,z:Float ,w:Float,h:Float,d:Float ,cx:Float,cy:Float,cz:Float ,scaleX:Float,scaleY:Float,scaleZ:Float, textureAtlasSprite: TextureAtlasSprite,color:(Float,Float,Float)) { private def putVertex(builder: UnpackedBakedQuad.Builder, normal: Vector3, x: Double, y: Double, z: Double, u: Float, v: Float, sprite: TextureAtlasSprite, color:(Float,Float,Float)): Unit = { import net.minecraft.client.renderer.vertex.VertexFormatElement.EnumUsage._ for ( e <-0 until format.getElementCount ) { format.getElement(e).getUsage match { case POSITION => builder.put(e, x.toFloat, y.toFloat, z.toFloat, 1.0f) case COLOR => builder.put(e, color._1,color._2,color._3, 1.0f) case UV => if (format.getElement(e).getIndex == 0) { val u1 = sprite.getInterpolatedU(u) val v1 = sprite.getInterpolatedV(v) builder.put(e, u1, v1, 0f, 1f) } case NORMAL => builder.put(e, normal.x.toFloat, normal.y.toFloat, normal.z.toFloat, 0f) case _ => builder.put(e) } } } val format: VertexFormat = net.minecraft.client.renderer.vertex.DefaultVertexFormats.ITEM def extendedVectorScale(v1: Vector3) = new Vector3(v1.x*scaleX,v1.y*scaleY,v1.z*scaleZ) private def createQuad1(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3, sprite: TextureAtlasSprite, color:(Float,Float,Float)=color) = { val center:Vector3=(cx*scaleX,cy*scaleY,cz*scaleZ) createQuad(extendedVectorScale(v1).add(center),extendedVectorScale(v2).add(center),extendedVectorScale(v3).add(center),extendedVectorScale(v4).add(center),sprite,color) } private def createQuad(v1: Vector3, v2: Vector3, v3: Vector3, v4: Vector3, sprite: TextureAtlasSprite,color:(Float,Float,Float)=color) = { val normal = v1.subtract(v2).crossProduct(v3.subtract(v2)).normalize() val builder = new UnpackedBakedQuad.Builder(format) builder.setTexture(sprite) putVertex(builder, normal, v1.x, v1.y, v1.z, 0, 0, sprite,color) putVertex(builder, normal, v2.x, v2.y, v2.z, 0, 16, sprite,color) putVertex(builder, normal, v3.x, v3.y, v3.z, 16, 16, sprite,color) putVertex(builder, normal, v4.x, v4.y, v4.z, 16, 0, sprite,color) builder.build } def scale(sx:Float,sy:Float,sz:Float): Cube = copy(scaleX=scaleX*sx,scaleY=scaleY*sy,scaleZ=scaleZ*sz) def scale(s:Float): Cube = copy(scaleX=scaleX*s,scaleY=scaleY*s,scaleZ=scaleZ*s) def move(cx1:Float,cy1:Float,cz1:Float): Cube = copy(cx=cx+cx1,cy=cy+cy1,cz=cz+cz1) private val texture = textureAtlasSprite//Minecraft.getMinecraft.getTextureMapBlocks.getAtlasSprite(new ResourceLocation(advancedAuromancyModId+":items/wand_rod_silverwood").toString) def toQuads: List[BakedQuad] = List( createQuad1((x, y, z), (x, y+h, z), (x+w, y+h, z), (x+w, y, z),texture), createQuad1((x, y, z), (x+w, y, z), (x+w, y, z+d), (x, y, z+d),texture), createQuad1((x, y+h, z),(x, y, z), (x, y, z+d), (x, y+h, z+d),texture), createQuad1((x+w, y, z+d),(x+w, y+h, z+d), (x, y+h, z+d), (x, y, z+d),texture), createQuad1((x+w, y+h, z+d), (x+w, y+h, z), (x, y+h, z), (x, y+h, z+d),texture), createQuad1((x+w, y+h, z+d), (x+w, y, z+d), (x+w, y, z),(x+w, y+h, z),texture) ) import scala.collection.JavaConverters._ def toQuads1: java.util.List[BakedQuad] = toQuads.asJava implicit private def tuple2Vec[F:Numeric](t:(F ,F ,F )): Vector3 = { import Numeric.Implicits._ new Vector3(t._1.toDouble,t._2.toDouble,t._3.toDouble) } }
@Override
public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
ModelBaker baker = ModelBaker.INSTANCE;
baker.begin(state, format);
baker.setTexture(bakedTextureGetter.apply(AdvancedModelLoader.location));
baker.putTexturedCube(0,0.25f,0, 0.25f);
baker.setTexture(bakedTextureGetter.apply(AdvancedModelLoader.location2));
baker.putTexturedCube(0,-0.25f,0, 0.25f);
return new BlockBakedModel(baker.bake(), bakedTextureGetter.apply(AdvancedModelLoader.location));
}