選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

82 行
2.4 KiB

  1. use std::iter::Iterator;
  2. use glc::{
  3. error::Error as GlcError,
  4. shader::{Program, Shader, Type},
  5. texture::{Data, FilterMag, FilterMin, Target, Texture, Wrap},
  6. };
  7. use space_crush_common::misc::Vfs;
  8. use specs::World;
  9. use crate::Error;
  10. /* WorldHelper */
  11. pub trait WorldHelper {
  12. fn load_program<I>(&self, iter: I) -> Result<Program, Error>
  13. where
  14. I: IntoIterator<Item = (Type, &'static str)>;
  15. fn load_texture(&self, path: &str) -> Result<Texture, Error>;
  16. }
  17. impl WorldHelper for World {
  18. fn load_program<I>(&self, iter: I) -> Result<Program, Error>
  19. where
  20. I: IntoIterator<Item = (Type, &'static str)>,
  21. {
  22. let vfs = self.fetch::<Vfs>();
  23. Program::from_shaders_result(iter.into_iter().map(|(t, p)| {
  24. let path = vfs.join(p)?;
  25. let mut file = path.open_file()?;
  26. let path = path.parent().unwrap();
  27. let shader = Shader::from_reader(t, &mut file, |include| {
  28. let p = if include.starts_with('.') {
  29. path.join(include)
  30. } else {
  31. vfs.join(include)
  32. };
  33. let p = match p {
  34. Ok(p) => p,
  35. Err(err) => return Err(GlcError::ShaderInclude(format!("{}", err))),
  36. };
  37. let mut r = match p.open_file() {
  38. Ok(r) => r,
  39. Err(err) => return Err(GlcError::ShaderInclude(format!("{}", err))),
  40. };
  41. let mut code = String::default();
  42. if let Err(err) = r.read_to_string(&mut code) {
  43. return Err(GlcError::ShaderInclude(format!("{}", err)));
  44. }
  45. Ok(code)
  46. })?;
  47. Ok(shader)
  48. }))
  49. }
  50. fn load_texture(&self, path: &str) -> Result<Texture, Error> {
  51. let vfs = self.fetch::<Vfs>();
  52. let mut file = vfs.join(path)?.open_file()?;
  53. let mut data = Data::from_reader(&mut file)?;
  54. data.convert_to(data.format().info().format_gl_support)?;
  55. let mut texture = Texture::new(Target::Texture2D)?;
  56. texture.upload(&data, true)?;
  57. texture.set_filter(FilterMin::LinearMipmapLinear, FilterMag::Linear)?;
  58. texture.set_wrap(
  59. Wrap::ClampToBorder,
  60. Wrap::ClampToBorder,
  61. Wrap::ClampToBorder,
  62. )?;
  63. Ok(texture)
  64. }
  65. }