texture_resource.vala 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Copyright (c) 2012-2025 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. namespace Crown
  6. {
  7. public enum TextureFormat
  8. {
  9. BC1,
  10. BC2,
  11. BC3,
  12. BC4,
  13. BC5,
  14. PTC14,
  15. RGB8,
  16. RGBA8,
  17. COUNT;
  18. public string to_key()
  19. {
  20. switch (this) {
  21. case BC1:
  22. return "BC1";
  23. case BC2:
  24. return "BC2";
  25. case BC3:
  26. return "BC3";
  27. case BC4:
  28. return "BC4";
  29. case BC5:
  30. return "BC5";
  31. case PTC14:
  32. return "PTC14";
  33. case RGB8:
  34. return "RGB8";
  35. case RGBA8:
  36. return "RGBA8";
  37. default:
  38. return "BC1";
  39. }
  40. }
  41. }
  42. public struct TextureResource
  43. {
  44. public Database _db;
  45. public Guid _id;
  46. public TextureResource(Database db
  47. , Guid id
  48. , string source_image
  49. , TextureFormat output_format
  50. , bool generate_mips
  51. , bool is_normal_map
  52. )
  53. {
  54. _db = db;
  55. _id = id;
  56. _db.create(_id, OBJECT_TYPE_TEXTURE);
  57. _db.set_property_string(_id, "source", source_image);
  58. for (int tp = 0; tp < TargetPlatform.COUNT; ++tp) {
  59. string platform = ((TargetPlatform)tp).to_key();
  60. _db.set_property_string(_id, "output." + platform + ".format", output_format.to_key());
  61. _db.set_property_bool(_id, "output." + platform + ".generate_mips", generate_mips);
  62. _db.set_property_bool(_id, "output." + platform + ".normal_map", is_normal_map);
  63. _db.set_property_double(_id, "output." + platform + ".mip_skip_smallest", 0);
  64. }
  65. }
  66. public TextureResource.color_map(Database db, Guid texture_id, string source_image)
  67. {
  68. this(db, texture_id, source_image, TextureFormat.BC1, true, false);
  69. }
  70. public TextureResource.normal_map(Database db, Guid texture_id, string source_image)
  71. {
  72. this(db, texture_id, source_image, TextureFormat.BC5, true, true);
  73. }
  74. public TextureResource.font_atlas(Database db, Guid texture_id, string source_image)
  75. {
  76. this(db, texture_id, source_image, TextureFormat.BC3, false, false);
  77. }
  78. public TextureResource.sprite(Database db, Guid texture_id, string source_image)
  79. {
  80. this(db, texture_id, source_image, TextureFormat.RGBA8, false, false);
  81. }
  82. public int save(Project project, string resource_name)
  83. {
  84. return _db.save(project.absolute_path(resource_name) + "." + OBJECT_TYPE_TEXTURE, _id);
  85. }
  86. public static void import(Import import_result, Database database, string destination_dir, SList<string> filenames)
  87. {
  88. Project project = database._project;
  89. foreach (unowned string filename_i in filenames) {
  90. GLib.File file_src = File.new_for_path(filename_i);
  91. GLib.File file_dst = File.new_for_path(Path.build_filename(destination_dir, file_src.get_basename()));
  92. string resource_filename = project.resource_filename(file_dst.get_path());
  93. string resource_path = ResourceId.normalize(resource_filename);
  94. string resource_name = ResourceId.name(resource_path);
  95. try {
  96. file_src.copy(file_dst, FileCopyFlags.OVERWRITE);
  97. } catch (Error e) {
  98. loge(e.message);
  99. import_result(ImportResult.ERROR);
  100. return;
  101. }
  102. Database db = new Database(project);
  103. var texture_resource = TextureResource.color_map(db, Guid.new_guid(), resource_path);
  104. texture_resource.save(project, resource_name);
  105. }
  106. import_result(ImportResult.SUCCESS);
  107. }
  108. }
  109. } /* namespace Crown */