material_resource.vala 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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 struct MaterialResource
  8. {
  9. public Database _db;
  10. public Guid _id;
  11. public MaterialResource(Database db, Guid id, string shader)
  12. {
  13. _db = db;
  14. _id = id;
  15. _db.create(_id, OBJECT_TYPE_MATERIAL);
  16. _db.set_property_string(_id, "shader", shader);
  17. }
  18. public MaterialResource.mesh(Database db
  19. , Guid material_id
  20. , string? albedo_map = null
  21. , string? normal_map = null
  22. , string? metallic_map = null
  23. , string? roughness_map = null
  24. , string? ao_map = null
  25. , Vector3 albedo = VECTOR3_ONE
  26. , double metallic = 0.0
  27. , double roughness = 1.0
  28. )
  29. {
  30. this(db, material_id, "mesh");
  31. set_vector3("u_albedo", albedo);
  32. set_float("u_metallic", metallic);
  33. set_float("u_roughness", roughness);
  34. if (albedo_map != null) set_texture("u_albedo_map", albedo_map);
  35. if (normal_map != null) set_texture("u_normal_map", normal_map);
  36. if (metallic_map != null) set_texture("u_metallic_map", metallic_map);
  37. if (roughness_map != null) set_texture("u_roughness_map", roughness_map);
  38. if (ao_map != null) set_texture("u_ao_map", ao_map);
  39. set_float("u_use_albedo_map", (double)(albedo_map != null));
  40. set_float("u_use_normal_map", (double)(normal_map != null));
  41. set_float("u_use_metallic_map", (double)(metallic_map != null));
  42. set_float("u_use_roughness_map", (double)(roughness_map != null));
  43. set_float("u_use_ao_map", (double)(ao_map != null));
  44. }
  45. public MaterialResource.sprite(Database db
  46. , Guid material_id
  47. , string albedo_map
  48. , Quaternion color = Quaternion(1.0, 1.0, 1.0, 1.0)
  49. )
  50. {
  51. this(db, material_id, "sprite");
  52. set_texture("u_albedo_map", albedo_map);
  53. set_vector4("u_color", color);
  54. }
  55. public MaterialResource.gui(Database db, Guid material_id, string? albedo_map)
  56. {
  57. // FIXME: add defines list to ctor?
  58. string shader = "gui";
  59. if (albedo_map != null)
  60. shader += "+DIFFUSE_MAP";
  61. this(db, material_id, shader);
  62. if (albedo_map != null)
  63. set_texture("u_albedo_map", albedo_map);
  64. }
  65. public void set_float(string uniform_name, double value)
  66. {
  67. _db.set_property_string(_id
  68. , "uniforms.%s.type".printf(uniform_name)
  69. , "float"
  70. );
  71. _db.set_property_double(_id
  72. , "uniforms.%s.value".printf(uniform_name)
  73. , value
  74. );
  75. }
  76. public void set_vector2(string uniform_name, Vector2 value)
  77. {
  78. _db.set_property_string(_id
  79. , "uniforms.%s.type".printf(uniform_name)
  80. , "vector2"
  81. );
  82. _db.set_property_vector3(_id
  83. , "uniforms.%s.value".printf(uniform_name)
  84. , Vector3(value.x, value.y, 0.0)
  85. );
  86. }
  87. public void set_vector3(string uniform_name, Vector3 value)
  88. {
  89. _db.set_property_string(_id
  90. , "uniforms.%s.type".printf(uniform_name)
  91. , "vector3"
  92. );
  93. _db.set_property_vector3(_id
  94. , "uniforms.%s.value".printf(uniform_name)
  95. , value
  96. );
  97. }
  98. public void set_vector4(string uniform_name, Quaternion value)
  99. {
  100. _db.set_property_string(_id
  101. , "uniforms.%s.type".printf(uniform_name)
  102. , "vector4"
  103. );
  104. _db.set_property_quaternion(_id
  105. , "uniforms.%s.value".printf(uniform_name)
  106. , value
  107. );
  108. }
  109. public void set_texture(string sampler_name, string texture_name)
  110. {
  111. _db.set_property_string(_id, "textures.%s".printf(sampler_name), texture_name);
  112. }
  113. public int save(Project project, string resource_name)
  114. {
  115. return _db.save(project.absolute_path(resource_name) + "." + OBJECT_TYPE_MATERIAL, _id);
  116. }
  117. }
  118. } /* namespace Crown */