material_resource.vala 3.4 KB

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