ImageIO

Версия Minecraft
0.1+
1,108
47
425
Крч есть у меня такой вот код:
Scala:
override def bindTexture(resource: Resource): Unit = {
    if (!resource.isTexture) throw new RuntimeException(s"$resource is not a texture")
    textures.get(resource) match {
      case Some(texture) =>
        texture.bindAsTexture()
      case None =>
        getInput(resource) match {
          case Some(input) =>
            val image = ImageIO.read(input)
            val unit = image.toGLTexture
            textures.put(resource, unit)
            unit.bindAsTexture()
          case None =>
            bindTexture(emo)
        }

    }
  }
Да, да тригеритесь на скалу. Суть в том что он должен был бы загрузить картинку из потока, но он тупа даже не входит в метод read (ImageIO.read(input)). Вопрос собсвенна пачему?
 
Такой себе код. Два опшна это, конечно, странно
Да и я тут не вижу метода toGLTexture
Ну эмм. Скажи как по-другому. toGLTexture это я с неявными классами игрался. Да и не доходит до него.
 
Scala:
override def bindTexture(resource: Resource): Unit = {
    if (!resource.isTexture) throw new RuntimeException(s"$resource is not a texture")
    textures.get(resource) match {
      case Some(texture) =>
        texture.bindAsTexture()
      case None =>
        getInput(resource) match {
          case Some(input) =>
            val image = ImageIO.read(input)
            val unit = image.toGLTexture
            textures += ((resource, unit))
            unit.bindAsTexture()
          case None =>
            bindTexture(emo)
        }

    }
  }
Могу еще вот так, но от match отказываться я не буду ибо не крута =)
 
Режим вброса говна на вентилятор activated

А зачем ты на скале пишешь, если на джаве не длиннее, читабельнее и без генерации лишнего мусора?
Java:
@Override public void bindTexture(Resource resource) {
  if (!resource.isTexture()) throw new RuntimeException(resource + " is not a texture");
  GLTexture texture = textures.get(resource);
  if (texture == null) {
    InputStream input = getInput(resource);
    if (input == null) {
      bindTexture(emo);
      return;
    } else {
      texture = toGLTexture(ImageIO.read(input));
      textures.put(resource, texture);
    }
  }
  texture.bindTexture();
}

Кстати, еще несколько вопросов:
  1. Кто будет IOException'ы ловить за тебя?
  2. Кто будет InputStream закрывать за тебя?
  3. Зачем каждый раз когда биндишь отсутствующую текстуру по-новой делать getInput()?
  4. Stack overflow если не найдется и эмо-текстуры - это ожидаемое поведение?
  5. Зачем делать дорогостоящие конверсии (уровня загрузки в опенгл) val'ами? Это моветон.
 
Патамушта мне нравится. Ацтань. На самом деле я мог это сделать и через if nonEmpty и получилась бы так же коротко, но мне через match захотелось. И зато в Scala нет NPE. Можно с увереностью утверждать что метод вернет именно объект, а не null.
1) А нафиг мне IOException'ы ловить? Если такая проблема и будет пусть уж лучше крашнет.
2) Да забыл спасиба
3) Да такого я не думал. Надо б сделать.
4) Вполне ожидаемое ибо она есть.
5) Дай ссылку о чем ты. Я ж не шибко шарю ._. Кстати у меня там не GLTexture а обычный Int.
 
5) Дай ссылку о чем ты.
Какую ссылку, банальный здравый смысл же. val вместо def логично использовать только когда обращение к нему быстрое, выполняется за константное время и не имеет сайдэффектов. Загрузить в опенглы текстурку - это долго, линейно зависит от размера текстуры и имеет сайдэффект (собсна загруженная в гл текстурка).
 
Режим вброса говна на вентилятор activated

А зачем ты на скале пишешь, если на джаве не длиннее, читабельнее и без генерации лишнего мусора?
Java:
@Override public void bindTexture(Resource resource) {
  if (!resource.isTexture()) throw new RuntimeException(resource + " is not a texture");
  GLTexture texture = textures.get(resource);
  if (texture == null) {
    InputStream input = getInput(resource);
    if (input == null) {
      bindTexture(emo);
      return;
    } else {
      texture = toGLTexture(ImageIO.read(input));
      textures.put(resource, texture);
    }
  }
  texture.bindTexture();
}

Кстати, еще несколько вопросов:
  1. Кто будет IOException'ы ловить за тебя?
  2. Кто будет InputStream закрывать за тебя?
  3. Зачем каждый раз когда биндишь отсутствующую текстуру по-новой делать getInput()?
  4. Stack overflow если не найдется и эмо-текстуры - это ожидаемое поведение?
  5. Зачем делать дорогостоящие конверсии (уровня загрузки в опенгл) val'ами? Это моветон.
Да твой код ещё можно проще сделать. Я не понимаю, почему ТС запихнул в матчинг ещё один. Код сворачивается ооочень легко
 
Да твой код ещё можно проще сделать. Я не понимаю, почему ТС запихнул в матчинг ещё один. Код сворачивается ооочень легко
Я просто переписал оригинальный код (насколько понял чо там написано) на джаву, получилось короче, лол
 
Какую ссылку, банальный здравый смысл же. val вместо def логично использовать только когда обращение к нему быстрое, выполняется за константное время и не имеет сайдэффектов. Загрузить в опенглы текстурку - это долго, линейно зависит от размера текстуры и имеет сайдэффект (собсна загруженная в гл текстурка).
Чаго ты несешь? val это просто константа, а def это функция. Это я тупой или ты окотлинился?
 
Да твой код ещё можно проще сделать. Я не понимаю, почему ТС запихнул в матчинг ещё один. Код сворачивается ооочень легко
Да нормальный у меня код, фигли вы доколебались?
 
Я тоже не понял вброс про val/def. Первый создаёт константу (а у нас константа, ибо если нужно будет передать число, то оно скопируется). Второй же при каждом вызове будет заново получать число. Зачем?
 
Да такой себе код. Скоро дойдет до маразма, что вместо аккумулирования в число, будешь делать список и суммировать его. Option хорошо, но if не зря не убрали.
 
Последнее редактирование:
Scala:
private def setMeta(): Unit =
    if (Option[World](worldObj).nonEmpty) {
      worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, {
        if (model.nonEmpty) model.get.harvestLevel & 15
        else 0
      }, 2)
    }
Я и так могу, просто по-приколу сделал через match.
 
Чаго ты несешь? val это просто константа, а def это функция. Это я тупой или ты окотлинился?
Не бывает implicit констант, это в любом случае функция по факту. Просто можно сделать вид что это константа, и написать implicit val вместо def, но тогда оно и вести себя должно как константа: быстро, за константное время, без сайдэффектов. У тебя же выглядит как константа, а ведет себя как функция. Ну или я абсолютно не понял что у тебя делает toGLTexture, можешь код сюда закинуть
 
То же самое на котлине, примерно такая же длина кода, лишено всех перечисленных мной проблем, генерирует 0 мусора при вызове bindTexture для уже загруженной текстуры

Kotlin:
val missingTexture = loadTexture(emo) ?: throw RuntimeException("Missing texture not found")

override fun bindTexture(resource: Resource) {
    textures.getOrPut(resource) {
        loadTexture(resource) ?: missingTexture
    }.bindAsTexture()
}

private fun loadTexture(resource: Resource): Int? {
    if (!resource.isTexture) throw RuntimeException("$resource is not a texture")
    try {
        // будем считать что getInput кинет IOException, если нетути файла
        getInput(resource).use {
           return ImageIO.read(input).loadToGlTexture()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    return null
}
 
Назад
Сверху