state_machine_resource.vala 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Copyright (c) 2012-2026 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. namespace Crown
  6. {
  7. public struct NodeAnimation
  8. {
  9. public Database _db;
  10. public Guid _id;
  11. public NodeAnimation(Database db
  12. , Guid id
  13. , string name
  14. , string weight
  15. )
  16. {
  17. _db = db;
  18. _id = id;
  19. _db.create(_id, OBJECT_TYPE_NODE_ANIMATION);
  20. _db.set_resource(_id, "name", name);
  21. _db.set_string(_id, "weight", weight);
  22. }
  23. }
  24. public struct StateMachineNode
  25. {
  26. public Database _db;
  27. public Guid _id;
  28. public StateMachineNode(Database db, Guid id)
  29. {
  30. _db = db;
  31. _id = id;
  32. _db.create(_id, OBJECT_TYPE_STATE_MACHINE_NODE);
  33. _db.set_bool(_id, "loop", true);
  34. _db.set_string(_id, "speed", "1");
  35. _db.create_empty_set(_id, "animations");
  36. _db.create_empty_set(_id, "transitions");
  37. }
  38. public void add_animation(NodeAnimation anim)
  39. {
  40. _db.add_to_set(_id, "animations", anim._id);
  41. }
  42. }
  43. public struct StateMachineResource
  44. {
  45. public Database _db;
  46. public Guid _id;
  47. public StateMachineResource(Database db
  48. , Guid id
  49. , string animation_type
  50. , string? initial_animation_name
  51. , string? skeleton_name
  52. )
  53. {
  54. _db = db;
  55. _id = id;
  56. Guid initial_state_id = Guid.new_guid();
  57. StateMachineNode initial_state = StateMachineNode(db, initial_state_id);
  58. if (initial_animation_name != null) {
  59. NodeAnimation na = NodeAnimation(db, Guid.new_guid(), initial_animation_name, "1");
  60. initial_state.add_animation(na);
  61. }
  62. _db.create(_id, OBJECT_TYPE_STATE_MACHINE);
  63. add_node(initial_state);
  64. _db.set_reference(_id, "initial_state", initial_state._id);
  65. _db.create_empty_set(_id, "variables");
  66. _db.set_string(_id, "animation_type", animation_type);
  67. if (skeleton_name != null)
  68. _db.set_resource(_id, "skeleton_name", skeleton_name);
  69. }
  70. public StateMachineResource.mesh(Database db, Guid id, string skeleton_name)
  71. {
  72. this(db, id, OBJECT_TYPE_MESH_ANIMATION, null, skeleton_name);
  73. }
  74. public StateMachineResource.sprite(Database db, Guid id, string? initial_animation_name)
  75. {
  76. this(db, id, OBJECT_TYPE_SPRITE_ANIMATION, initial_animation_name, null);
  77. }
  78. public void add_node(StateMachineNode node)
  79. {
  80. _db.add_to_set(_id, "states", node._id);
  81. }
  82. public int save(Project project, string resource_name)
  83. {
  84. return _db.save(project.absolute_path(resource_name) + "." + OBJECT_TYPE_STATE_MACHINE, _id);
  85. }
  86. }
  87. } /* namespace Crown */