ImageIO

Версия Minecraft
0.1+
1,111
47
420
Крч есть у меня такой вот код:
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)). Вопрос собсвенна пачему?
 
1,111
47
420
Такой себе код. Два опшна это, конечно, странно
Да и я тут не вижу метода toGLTexture
Ну эмм. Скажи как по-другому. toGLTexture это я с неявными классами игрался. Да и не доходит до него.
 
1,111
47
420
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 отказываться я не буду ибо не крута =)
 
808
3
124
Режим вброса говна на вентилятор 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'ами? Это моветон.
 
1,111
47
420
Патамушта мне нравится. Ацтань. На самом деле я мог это сделать и через if nonEmpty и получилась бы так же коротко, но мне через match захотелось. И зато в Scala нет NPE. Можно с увереностью утверждать что метод вернет именно объект, а не null.
1) А нафиг мне IOException'ы ловить? Если такая проблема и будет пусть уж лучше крашнет.
2) Да забыл спасиба
3) Да такого я не думал. Надо б сделать.
4) Вполне ожидаемое ибо она есть.
5) Дай ссылку о чем ты. Я ж не шибко шарю ._. Кстати у меня там не GLTexture а обычный Int.
 
808
3
124
5) Дай ссылку о чем ты.
Какую ссылку, банальный здравый смысл же. val вместо def логично использовать только когда обращение к нему быстрое, выполняется за константное время и не имеет сайдэффектов. Загрузить в опенглы текстурку - это долго, линейно зависит от размера текстуры и имеет сайдэффект (собсна загруженная в гл текстурка).
 

CumingSoon

Местный стендапер
1,634
12
269
Режим вброса говна на вентилятор 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'ами? Это моветон.
Да твой код ещё можно проще сделать. Я не понимаю, почему ТС запихнул в матчинг ещё один. Код сворачивается ооочень легко
 
808
3
124
Да твой код ещё можно проще сделать. Я не понимаю, почему ТС запихнул в матчинг ещё один. Код сворачивается ооочень легко
Я просто переписал оригинальный код (насколько понял чо там написано) на джаву, получилось короче, лол
 
1,111
47
420
Какую ссылку, банальный здравый смысл же. val вместо def логично использовать только когда обращение к нему быстрое, выполняется за константное время и не имеет сайдэффектов. Загрузить в опенглы текстурку - это долго, линейно зависит от размера текстуры и имеет сайдэффект (собсна загруженная в гл текстурка).
Чаго ты несешь? val это просто константа, а def это функция. Это я тупой или ты окотлинился?
 
1,111
47
420
Да твой код ещё можно проще сделать. Я не понимаю, почему ТС запихнул в матчинг ещё один. Код сворачивается ооочень легко
Да нормальный у меня код, фигли вы доколебались?
 

CumingSoon

Местный стендапер
1,634
12
269
Я тоже не понял вброс про val/def. Первый создаёт константу (а у нас константа, ибо если нужно будет передать число, то оно скопируется). Второй же при каждом вызове будет заново получать число. Зачем?
 

CumingSoon

Местный стендапер
1,634
12
269
Да такой себе код. Скоро дойдет до маразма, что вместо аккумулирования в число, будешь делать список и суммировать его. Option хорошо, но if не зря не убрали.
 
Последнее редактирование:
808
3
124
Чаго ты несешь? val это просто константа, а def это функция. Это я тупой или ты окотлинился?
Не бывает implicit констант, это в любом случае функция по факту. Просто можно сделать вид что это константа, и написать implicit val вместо def, но тогда оно и вести себя должно как константа: быстро, за константное время, без сайдэффектов. У тебя же выглядит как константа, а ведет себя как функция. Ну или я абсолютно не понял что у тебя делает toGLTexture, можешь код сюда закинуть
 
808
3
124
То же самое на котлине, примерно такая же длина кода, лишено всех перечисленных мной проблем, генерирует 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
}
 
Сверху