Анти, поделись пожалуйста кодом connected textures

Помню ты выкладывал на первом форуме, но теперь их найти не возможно.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Я выкладывал, но он был(и есть) невозможно сложным и на Scala. =/
Код:
object ConnectedBlockRender extends ISimpleBlockRenderingHandler with TessellationHelper{

  override def shouldRender3DInInventory(modelId: Int): Boolean = true

  override def getRenderId: Int = -1

  val xyzToForgeMap: Array[Int] = Array(5, 4, 1, 0, 3, 2)

  var x: Double = 0.0
  var y: Double = 0.0
  var z: Double = 0.0

  override def renderInventoryBlock(block: Block, meta: Int, modelId: Int, ctx: RenderBlocks) = {
    val item: RotatedIcon = block.asInstanceOf[ConnectedTexturesBlock].getConnectedIcon(meta).item
    tess.setBrightness(983055)
    tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
    x = -0.5
    y = -0.5
    z = -0.5
    withoutItemLighting(quad((0 until 6).foreach(drawQuad(_, item))))
  }

  val sides: Array[Array[ForgeDirection]] =
    Array(Array(UP, SOUTH, DOWN, NORTH),
          Array(NORTH, EAST, SOUTH, WEST),
          Array(UP, EAST, DOWN, WEST))

  override def renderWorldBlock(iba: IBlockAccess, x: Int, y: Int, z: Int, block: Block, modelId: Int, ctx: RenderBlocks): Boolean = {
    this.x = x
    this.y = y
    this.z = z
    if(ctx.hasOverrideBlockTexture){
      val face: RotatedIcon = new RotatedIcon(ctx.overrideBlockTexture)
      for(i <- 0 until 6)
        drawQuad(i, face)
    }else{
      val b: ConnectedTexturesBlock = block.asInstanceOf[ConnectedTexturesBlock]
      val pos: Position = new Position(x, y, z)
      val texture: ConnectedIcon = b.getConnectedIcon(iba, x, y, z)
      val corners: Boolean = b.cycleCorners
      tess.setBrightness(b.getMixedBrightnessForBlock(iba, x, y, z))
      tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
      for(i <- 0 until 6)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          drawQuad(i, texture.background)
      for(i <- 0 until 6) for(j <- 0 until 4)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))) && !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j))))
          drawQuad(i, texture.side.rotate(j))
      for(i <- 0 until 6) for(j <- 0 until 4){
        val next: Boolean = !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)))
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          if(!b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            if(next)
              drawQuad(i, texture.corner_in.rotate(j))
            else
              drawQuad(i, texture.corner_vert.rotate(j))
          else if(next)
            drawQuad(i, texture.corner_hor.rotate(j))
          else if(corners || !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)).shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            drawQuad(i, texture.corner_out.rotate(j))
      }
    }
    true
  }

  private val quads: Array[((Int, Int, Int), (Int, Int, Int), (Int, Int, Int), (Int, Int, Int), RotatedIcon => RotatedIcon)] =
    Array(((1, 0, 1), (1, 0, 0), (1, 1, 0), (1, 1, 1), i => i),
          ((0, 0, 1), (0, 1, 1), (0, 1, 0), (0, 0, 0), i => i.invert().rotate(3)),
          ((0, 1, 1), (1, 1, 1), (1, 1, 0), (0, 1, 0), i => i.invert()),
          ((1, 0, 1), (0, 0, 1), (0, 0, 0), (1, 0, 0), i => i),
          ((1, 0, 1), (1, 1, 1), (0, 1, 1), (0, 0, 1), i => i.invert().rotate(3)),
          ((1, 0, 0), (0, 0, 0), (0, 1, 0), (1, 1, 0), i => i))

  def drawQuad(side: Int, icon: RotatedIcon) = {
    val quad = quads(side)
    val _icon: RotatedIcon = quad._5(icon)
    vertexUV(x + quad._1._1, y + quad._1._2, z + quad._1._3, _icon.getUV_1.getU, _icon.getUV_1.getV)
    vertexUV(x + quad._2._1, y + quad._2._2, z + quad._2._3, _icon.getUV_2.getU, _icon.getUV_2.getV)
    vertexUV(x + quad._3._1, y + quad._3._2, z + quad._3._3, _icon.getUV_3.getU, _icon.getUV_3.getV)
    vertexUV(x + quad._4._1, y + quad._4._2, z + quad._4._3, _icon.getUV_4.getU, _icon.getUV_4.getV)
  }
}
 
771
5
anti344 написал(а):
Я выкладывал, но он был(и есть) невозможно сложным и на Scala. =/
Код:
object ConnectedBlockRender extends ISimpleBlockRenderingHandler with TessellationHelper{

  override def shouldRender3DInInventory(modelId: Int): Boolean = true

  override def getRenderId: Int = -1

  val xyzToForgeMap: Array[Int] = Array(5, 4, 1, 0, 3, 2)

  var x: Double = 0.0
  var y: Double = 0.0
  var z: Double = 0.0

  override def renderInventoryBlock(block: Block, meta: Int, modelId: Int, ctx: RenderBlocks) = {
    val item: RotatedIcon = block.asInstanceOf[ConnectedTexturesBlock].getConnectedIcon(meta).item
    tess.setBrightness(983055)
    tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
    x = -0.5
    y = -0.5
    z = -0.5
    withoutItemLighting(quad((0 until 6).foreach(drawQuad(_, item))))
  }

  val sides: Array[Array[ForgeDirection]] =
    Array(Array(UP, SOUTH, DOWN, NORTH),
          Array(NORTH, EAST, SOUTH, WEST),
          Array(UP, EAST, DOWN, WEST))

  override def renderWorldBlock(iba: IBlockAccess, x: Int, y: Int, z: Int, block: Block, modelId: Int, ctx: RenderBlocks): Boolean = {
    this.x = x
    this.y = y
    this.z = z
    if(ctx.hasOverrideBlockTexture){
      val face: RotatedIcon = new RotatedIcon(ctx.overrideBlockTexture)
      for(i <- 0 until 6)
        drawQuad(i, face)
    }else{
      val b: ConnectedTexturesBlock = block.asInstanceOf[ConnectedTexturesBlock]
      val pos: Position = new Position(x, y, z)
      val texture: ConnectedIcon = b.getConnectedIcon(iba, x, y, z)
      val corners: Boolean = b.cycleCorners
      tess.setBrightness(b.getMixedBrightnessForBlock(iba, x, y, z))
      tess.setColorOpaque_F(1.0F, 1.0F, 1.0F)
      for(i <- 0 until 6)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          drawQuad(i, texture.background)
      for(i <- 0 until 6) for(j <- 0 until 4)
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))) && !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j))))
          drawQuad(i, texture.side.rotate(j))
      for(i <- 0 until 6) for(j <- 0 until 4){
        val next: Boolean = !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)))
        if(!b.canConnectTo(iba, pos.copy.shift(xyzToForgeMap(i))))
          if(!b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            if(next)
              drawQuad(i, texture.corner_in.rotate(j))
            else
              drawQuad(i, texture.corner_vert.rotate(j))
          else if(next)
            drawQuad(i, texture.corner_hor.rotate(j))
          else if(corners || !b.canConnectTo(iba, pos.copy.shift(sides(i / 2)(j)).shift(sides(i / 2)(if(j == 0) 3 else j - 1))))
            drawQuad(i, texture.corner_out.rotate(j))
      }
    }
    true
  }

  private val quads: Array[((Int, Int, Int), (Int, Int, Int), (Int, Int, Int), (Int, Int, Int), RotatedIcon => RotatedIcon)] =
    Array(((1, 0, 1), (1, 0, 0), (1, 1, 0), (1, 1, 1), i => i),
          ((0, 0, 1), (0, 1, 1), (0, 1, 0), (0, 0, 0), i => i.invert().rotate(3)),
          ((0, 1, 1), (1, 1, 1), (1, 1, 0), (0, 1, 0), i => i.invert()),
          ((1, 0, 1), (0, 0, 1), (0, 0, 0), (1, 0, 0), i => i),
          ((1, 0, 1), (1, 1, 1), (0, 1, 1), (0, 0, 1), i => i.invert().rotate(3)),
          ((1, 0, 0), (0, 0, 0), (0, 1, 0), (1, 1, 0), i => i))

  def drawQuad(side: Int, icon: RotatedIcon) = {
    val quad = quads(side)
    val _icon: RotatedIcon = quad._5(icon)
    vertexUV(x + quad._1._1, y + quad._1._2, z + quad._1._3, _icon.getUV_1.getU, _icon.getUV_1.getV)
    vertexUV(x + quad._2._1, y + quad._2._2, z + quad._2._3, _icon.getUV_2.getU, _icon.getUV_2.getV)
    vertexUV(x + quad._3._1, y + quad._3._2, z + quad._3._3, _icon.getUV_3.getU, _icon.getUV_3.getV)
    vertexUV(x + quad._4._1, y + quad._4._2, z + quad._4._3, _icon.getUV_4.getU, _icon.getUV_4.getV)
  }
}
Перепиши на java, пожалуйста)
 
Спасибо, я и сам на java перепишу, ну по крайней мере попробую.

А можешь объяснить принцип работы?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
quads - Массив пятерных кортежей, заполненных тройными кортежами координат(4 коорды на полигон же) и одной функцией преобразования иконки.
Циклим через него, если в стороне этой стороны нету блока, к которому можно присоединиться, то отрисовать иконку не-коннекта на той стороне с таким-то разворотом.
Тоже самое с углами, только с "заглядыванием вперед", то-бишь следующая стороны в цикле достается и используется для проверки - нужен там уголок, или нет, и если да - нарисовать уголок аналогичным способом.

Как ни странно, объяснил как оно и есть.
 
905
5
Попытался написать сам и без рендерера/тайла. Логично уперся в то, что все блоки одного вида в Майне - один объект. :D
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
То, что превращает saveMatrix{код} в GL11.glPushMatrix(); код; GL11.glPopMatrix(); и так далее.
 
А можно еще код самого блока(ConnectedTexturesBlock)? А то там много каких-то функций.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А что, по названию ничего не понятно, да?
Просто пару функций, типа "можно ли присоединиться к такому-то блоку" и "оставлять ли уголки".
ConnectedIcon - просто класс, который достает все иконки, названия которых ты видел. А RotadedIcon - твоё домашнее задание, сам переведи.
 
Сверху