Advertisement
expired6978

BodyMorphInterface.h

Aug 10th, 2015
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.15 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include "interfaces/IPluginInterface.h"
  4. #include "interfaces/IHashType.h"
  5.  
  6. #include "skse/GameTypes.h"
  7. #include "skse/GameThreads.h"
  8. #include "skse/NiTypes.h"
  9.  
  10. #include <string>
  11. #include <set>
  12. #include <vector>
  13. #include <unordered_map>
  14. #include <functional>
  15. #include <memory>
  16. #include <ctime>
  17.  
  18. class TESObjectREFR;
  19. struct SKSESerializationInterface;
  20. class BSResourceNiBinaryStream;
  21. class NiAVObject;
  22. class TESObjectARMO;
  23. class TESObjectARMA;
  24. class NiExtraData;
  25. class TESNPC;
  26.  
  27. #define MORPH_MOD_DIRECTORY "actors\\character\\BodyGenData\\"
  28.  
  29. class BodyMorph
  30. {
  31. public:
  32.     bool operator<(const BodyMorph & rhs) const { return m_name < rhs.m_name; }
  33.     bool operator==(const BodyMorph & rhs) const    { return m_name == rhs.m_name; }
  34.  
  35.     BSFixedString   m_name;
  36.     float           m_value;
  37.  
  38.     void Save(SKSESerializationInterface * intfc, UInt32 kVersion);
  39.     bool Load(SKSESerializationInterface * intfc, UInt32 kVersion);
  40. };
  41.  
  42. class BodyMorphSet : public std::set<BodyMorph>
  43. {
  44. public:
  45.     // Serialization
  46.     void Save(SKSESerializationInterface * intfc, UInt32 kVersion);
  47.     bool Load(SKSESerializationInterface * intfc, UInt32 kVersion);
  48. };
  49.  
  50. class ActorMorphs : public SafeDataHolder<std::unordered_map<UInt64, BodyMorphSet>>
  51. {
  52. public:
  53.     typedef std::unordered_map<UInt64, BodyMorphSet>    MorphMap;
  54.  
  55.     // Serialization
  56.     void Save(SKSESerializationInterface * intfc, UInt32 kVersion);
  57.     bool Load(SKSESerializationInterface * intfc, UInt32 kVersion);
  58. };
  59.  
  60. class TriShapeVertexDelta
  61. {
  62. public:
  63.     UInt16      index;
  64.     NiPoint3    diff;
  65. };
  66.  
  67. class TriShapePackedVertexDelta
  68. {
  69. public:
  70.     UInt16  index;
  71.     SInt16  x;
  72.     SInt16  y;
  73.     SInt16  z;
  74. };
  75.  
  76. class TriShapeVertexData
  77. {
  78. public:
  79.     virtual void ApplyMorph(UInt16 vertCount, NiPoint3 * vertices, float factor) = 0;
  80. };
  81. typedef std::shared_ptr<TriShapeVertexData> TriShapeVertexDataPtr;
  82.  
  83. class TriShapeFullVertexData : public TriShapeVertexData
  84. {
  85. public:
  86.     virtual void ApplyMorph(UInt16 vertCount, NiPoint3 * vertices, float factor);
  87.  
  88.     std::vector<TriShapeVertexDelta> m_vertexDeltas;
  89. };
  90. typedef std::shared_ptr<TriShapeFullVertexData> TriShapeFullVertexDataPtr;
  91.  
  92. class TriShapePackedVertexData : public TriShapeVertexData
  93. {
  94. public:
  95.     virtual void ApplyMorph(UInt16 vertCount, NiPoint3 * vertices, float factor);
  96.  
  97.     float                                   m_multiplier;
  98.     std::vector<TriShapePackedVertexDelta>  m_vertexDeltas;
  99. };
  100. typedef std::shared_ptr<TriShapePackedVertexData> TriShapePackedVertexDataPtr;
  101.  
  102.  
  103. class BodyMorphMap : public std::unordered_map<BSFixedString, TriShapeVertexDataPtr>
  104. {
  105. public:
  106.     void ApplyMorphs(TESObjectREFR * refr, UInt16 vertexCount, NiPoint3* targetGeometry, NiPoint3 * storageGeometry);
  107.     bool HasMorphs(TESObjectREFR * refr);
  108. };
  109.  
  110. class TriShapeMap : public std::unordered_map<BSFixedString, BodyMorphMap>
  111. {
  112. public:
  113.     TriShapeMap()
  114.     {
  115.         memoryUsage = sizeof(TriShapeMap);
  116.         accessed = 0;
  117.     }
  118.  
  119.     void ApplyMorphs(TESObjectREFR * refr, NiAVObject * rootNode, bool erase = false);
  120.  
  121.     UInt32 memoryUsage;
  122.     std::time_t accessed;
  123. };
  124.  
  125.  
  126. class MorphCache : public SafeDataHolder<std::unordered_map<BSFixedString, TriShapeMap>>
  127. {
  128.     friend class BodyMorphInterface;
  129.  
  130. public:
  131.     MorphCache()
  132.     {
  133.         totalMemory = sizeof(MorphCache);
  134.         memoryLimit = totalMemory;
  135.     }
  136.  
  137.     typedef std::unordered_map<BSFixedString, TriShapeMap>  FileMap;
  138.  
  139.     BSFixedString CreateTRIPath(const char * relativePath);
  140.     bool CacheFile(const char * modelPath);
  141.  
  142.     void ApplyMorphs(TESObjectREFR * refr, NiAVObject * rootNode, bool erase = false);
  143.     void UpdateMorphs(TESObjectREFR * refr);
  144.  
  145.     void Shrink();
  146.  
  147. private:
  148.     UInt32 memoryLimit;
  149.     UInt32 totalMemory;
  150. };
  151.  
  152. class NIOVTaskUpdateModelWeight : public TaskDelegate
  153. {
  154. public:
  155.     virtual void Run();
  156.     virtual void Dispose();
  157.  
  158.     NIOVTaskUpdateModelWeight(Actor * actor);
  159.    
  160. private:
  161.     UInt32  m_formId;
  162. };
  163.  
  164. class BodyGenMorphData
  165. {
  166. public:
  167.     BSFixedString   name;
  168.     float           lower;
  169.     float           upper;
  170. };
  171.  
  172. class BodyGenMorphSelector : public std::vector<BodyGenMorphData>
  173. {
  174. public:
  175.     void Evaluate(std::function<void(BSFixedString, float)> eval);
  176. };
  177.  
  178. class BodyGenMorphs : public std::vector<BodyGenMorphSelector>
  179. {
  180. public:
  181.     void Evaluate(std::function<void(BSFixedString, float)> eval);
  182. };
  183.  
  184. class BodyGenTemplate : public std::vector<BodyGenMorphs>
  185. {
  186. public:
  187.     void Evaluate(std::function<void(BSFixedString, float)> eval);
  188. };
  189. typedef std::shared_ptr<BodyGenTemplate> BodyGenTemplatePtr;
  190.  
  191.  
  192. typedef std::unordered_map<BSFixedString, BodyGenTemplatePtr> BodyGenTemplates;
  193.  
  194. class BodyTemplateList : public std::vector<BodyGenTemplatePtr>
  195. {
  196. public:
  197.     void Evaluate(std::function<void(BSFixedString, float)> eval);
  198. };
  199.  
  200. class BodyGenDataTemplates : public std::vector<BodyTemplateList>
  201. {
  202. public:
  203.     void Evaluate(std::function<void(BSFixedString, float)> eval);
  204. };
  205.  
  206. typedef std::unordered_map<TESNPC*, BodyGenDataTemplates> BodyGenData;
  207.  
  208. class BodyMorphInterface : public IPluginInterface
  209. {
  210. public:
  211.     enum
  212.     {
  213.         kCurrentPluginVersion = 2
  214.     };
  215.     virtual UInt32 GetVersion();
  216.  
  217.     // Serialization
  218.     virtual void Save(SKSESerializationInterface * intfc, UInt32 kVersion);
  219.     virtual bool Load(SKSESerializationInterface * intfc, UInt32 kVersion);
  220.     virtual void Revert();
  221.  
  222.     virtual void SetMorph(TESObjectREFR * actor, BSFixedString morphName, float relative);
  223.     virtual float GetMorph(TESObjectREFR * actor, BSFixedString morphName);
  224.     virtual void ClearMorph(TESObjectREFR * actor, BSFixedString morphName);
  225.  
  226.     virtual void VisitMorphs(TESObjectREFR * actor, std::function<void(BSFixedString name, float value)> functor);
  227.     virtual void ClearMorphs(TESObjectREFR * actor);
  228.  
  229.     virtual void ApplyVertexDiff(TESObjectREFR * refr, NiAVObject * rootNode, bool erase = false);
  230.     virtual void ApplyBodyMorphs(TESObjectREFR * refr);
  231.     virtual void UpdateModelWeight(TESObjectREFR * refr, bool immediate = false);
  232.  
  233.     virtual void SetCacheLimit(UInt32 limit);
  234.     virtual bool HasMorphs(TESObjectREFR * actor);
  235.  
  236.     virtual bool ReadBodyMorphs(BSFixedString filePath);
  237.     virtual bool ReadBodyMorphTemplates(BSFixedString filePath);
  238.     virtual void EvaluateBodyMorphs(TESObjectREFR * actor);
  239.  
  240. private:
  241.     ActorMorphs actorMorphs;
  242.     MorphCache  morphCache;
  243.     BodyGenTemplates bodyGenTemplates;
  244.     BodyGenData bodyGenData;
  245. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement