[1.12.2] IBakedModel

7,166
329
1,544
Кто-нить занимается создание своих baked model кодом на 1.12.2?
 
По ним есть документация, можешь почитать.
~~
Сначала нужно зарегистрировать свой ICustomModelLoader, там уже настроить какие модели будет принимать твой лоадер(в методе accepts), в loadModel вернуть IModel, и уже в этой модельке в методе bake вернуть IBakedModel.
 
Видел это. Там ничего нет по части создания BakedQuad, а это самое главное
 
Ага, вот только код, основанный на UnpackedBakedQuad.Builder и идеально работающий на 1.10.2(создает куб) на 1.12.2 выдает вот такую хрень:
1527422103403.png

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)
  }

}
 
Последнее редактирование:
Нет, я свое писал. Ну почти, идею юза UnpackedBakedQuad взял у кого-то с майнкрафтфорума
 
Код же скинул
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)
  }

}
 
Да, это точная копия майновского кода.
 
putVertex? Его как раз скопипастил
 
По делу че-нить посоветуешь?
 
Нет, я вообще не понимаю как куб сделать.
 
Аззаза как. Запилите гайдик пожалуйста кто нибуд, как делать модели как в 1.7, без создания овердохерищ джосонов.
Без блокстейтов, моделей в джосон и прочего.
Я вам за это в реализме тотем поставлю.
 
Сделаю. Я уже пилю класс-обертку для этого.
 
1527788829888.png
Java:
@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));
}
 
Ждем подробный гайд-ресурс)
 
Назад
Сверху