[1.12.2] IBakedModel

7,099
324
1,510
Кто-нить занимается создание своих baked model кодом на 1.12.2?
 
По ним есть документация, можешь почитать.
~~
Сначала нужно зарегистрировать свой ICustomModelLoader, там уже настроить какие модели будет принимать твой лоадер(в методе accepts), в loadModel вернуть IModel, и уже в этой модельке в методе bake вернуть IBakedModel.
 
7,099
324
1,510
7,099
324
1,510
Видел это. Там ничего нет по части создания BakedQuad, а это самое главное
 
7,099
324
1,510
Ага, вот только код, основанный на 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)
  }

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

}
 
Да, это точная копия майновского кода.
 
7,099
324
1,510
putVertex? Его как раз скопипастил
 
7,099
324
1,510
По делу че-нить посоветуешь?
 
Нет, я вообще не понимаю как куб сделать.
 
5,018
47
783
Аззаза как. Запилите гайдик пожалуйста кто нибуд, как делать модели как в 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));
}
 
5,018
47
783
Ждем подробный гайд-ресурс)
 
Сверху