FUBeautyShapeViewModel.m 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //
  2. // FUBeautyShapeViewModel.m
  3. // FUBeautyComponent
  4. //
  5. // Created by 项林平 on 2022/7/27.
  6. //
  7. #import "FUBeautyShapeViewModel.h"
  8. #import "FUBeautyDefine.h"
  9. #import <FURenderKit/FURenderKit.h>
  10. @interface FUBeautyShapeViewModel ()
  11. @property (nonatomic, copy) NSArray<FUBeautyShapeModel *> *beautyShapes;
  12. @end
  13. @implementation FUBeautyShapeViewModel
  14. #pragma mark - Initializer
  15. - (instancetype)init {
  16. self = [super init];
  17. if (self) {
  18. if ([[NSUserDefaults standardUserDefaults] objectForKey:FUPersistentBeautyShapeKey]) {
  19. // 获取本地美肤数据
  20. self.beautyShapes = [self localShapes];
  21. } else {
  22. // 获取默认美肤数据
  23. self.beautyShapes = [self defaultShapes];
  24. }
  25. self.selectedIndex = -1;
  26. self.performanceLevel = [FURenderKit devicePerformanceLevel];
  27. }
  28. return self;
  29. }
  30. #pragma mark - Instance methods
  31. - (void)saveShapesPersistently {
  32. if (self.beautyShapes.count == 0) {
  33. return;
  34. }
  35. NSMutableArray *shapes = [[NSMutableArray alloc] init];
  36. for (FUBeautyShapeModel *model in self.beautyShapes) {
  37. NSDictionary *dictionary = [model dictionaryWithValuesForKeys:@[@"name", @"type", @"currentValue", @"defaultValue", @"defaultValueInMiddle", @"differentiateDevicePerformance"]];
  38. [shapes addObject:dictionary];
  39. }
  40. [[NSUserDefaults standardUserDefaults] setObject:shapes forKey:FUPersistentBeautyShapeKey];
  41. [[NSUserDefaults standardUserDefaults] synchronize];
  42. }
  43. - (void)setShapeValue:(double)value {
  44. if (self.selectedIndex < 0 || self.selectedIndex >= self.beautyShapes.count) {
  45. return;
  46. }
  47. FUBeautyShapeModel *model = self.beautyShapes[self.selectedIndex];
  48. model.currentValue = value;
  49. [self setValue:model.currentValue forType:model.type];
  50. }
  51. - (void)setAllShapeValues {
  52. for (FUBeautyShapeModel *shape in self.beautyShapes) {
  53. [self setValue:shape.currentValue forType:shape.type];
  54. }
  55. }
  56. - (void)recoverAllShapeValuesToDefault {
  57. for (FUBeautyShapeModel *shape in self.beautyShapes) {
  58. shape.currentValue = shape.defaultValue;
  59. [self setValue:shape.currentValue forType:shape.type];
  60. }
  61. }
  62. #pragma mark - Private methods
  63. - (void)setValue:(double)value forType:(FUBeautyShape)type {
  64. switch (type) {
  65. case FUBeautyShapeCheekThinning:
  66. [FURenderKit shareRenderKit].beauty.cheekThinning = value;
  67. break;
  68. case FUBeautyShapeCheekV:
  69. [FURenderKit shareRenderKit].beauty.cheekV = value;
  70. break;
  71. case FUBeautyShapeCheekNarrow:
  72. [FURenderKit shareRenderKit].beauty.cheekNarrow = value;
  73. break;
  74. case FUBeautyShapeCheekShort:
  75. [FURenderKit shareRenderKit].beauty.cheekShort = value;
  76. break;
  77. case FUBeautyShapeCheekSmall:
  78. [FURenderKit shareRenderKit].beauty.cheekSmall = value;
  79. break;
  80. case FUBeautyShapeCheekbones:
  81. [FURenderKit shareRenderKit].beauty.intensityCheekbones = value;
  82. break;
  83. case FUBeautyShapeLowerJaw:
  84. [FURenderKit shareRenderKit].beauty.intensityLowerJaw = value;
  85. break;
  86. case FUBeautyShapeEyeEnlarging:
  87. [FURenderKit shareRenderKit].beauty.eyeEnlarging = value;
  88. break;
  89. case FUBeautyShapeEyeCircle:
  90. [FURenderKit shareRenderKit].beauty.intensityEyeCircle = value;
  91. break;
  92. case FUBeautyShapeChin:
  93. [FURenderKit shareRenderKit].beauty.intensityChin = value;
  94. break;
  95. case FUBeautyShapeForehead:
  96. [FURenderKit shareRenderKit].beauty.intensityForehead = value;
  97. break;
  98. case FUBeautyShapeNose:
  99. [FURenderKit shareRenderKit].beauty.intensityNose = value;
  100. break;
  101. case FUBeautyShapeMouth:
  102. [FURenderKit shareRenderKit].beauty.intensityMouth = value;
  103. break;
  104. case FUBeautyShapeLipThick:
  105. [FURenderKit shareRenderKit].beauty.intensityLipThick = value;
  106. break;
  107. case FUBeautyShapeEyeHeight:
  108. [FURenderKit shareRenderKit].beauty.intensityEyeHeight = value;
  109. break;
  110. case FUBeautyShapeCanthus:
  111. [FURenderKit shareRenderKit].beauty.intensityCanthus = value;
  112. break;
  113. case FUBeautyShapeEyeLid:
  114. [FURenderKit shareRenderKit].beauty.intensityEyeLid = value;
  115. break;
  116. case FUBeautyShapeEyeSpace:
  117. [FURenderKit shareRenderKit].beauty.intensityEyeSpace = value;
  118. break;
  119. case FUBeautyShapeEyeRotate:
  120. [FURenderKit shareRenderKit].beauty.intensityEyeRotate = value;
  121. break;
  122. case FUBeautyShapeLongNose:
  123. [FURenderKit shareRenderKit].beauty.intensityLongNose = value;
  124. break;
  125. case FUBeautyShapePhiltrum:
  126. [FURenderKit shareRenderKit].beauty.intensityPhiltrum = value;
  127. break;
  128. case FUBeautyShapeSmile:
  129. [FURenderKit shareRenderKit].beauty.intensitySmile = value;
  130. break;
  131. case FUBeautyShapeBrowHeight:
  132. [FURenderKit shareRenderKit].beauty.intensityBrowHeight = value;
  133. break;
  134. case FUBeautyShapeBrowSpace:
  135. [FURenderKit shareRenderKit].beauty.intensityBrowSpace = value;
  136. break;
  137. case FUBeautyShapeBrowThick:
  138. [FURenderKit shareRenderKit].beauty.intensityBrowThick = value;
  139. break;
  140. }
  141. }
  142. - (NSArray<FUBeautyShapeModel *> *)localShapes {
  143. NSArray *shapes = [[NSUserDefaults standardUserDefaults] objectForKey:FUPersistentBeautyShapeKey];
  144. NSMutableArray *mutableShapes = [[NSMutableArray alloc] init];
  145. for (NSDictionary *shape in shapes) {
  146. FUBeautyShapeModel *model = [[FUBeautyShapeModel alloc] init];
  147. [model setValuesForKeysWithDictionary:shape];
  148. [mutableShapes addObject:model];
  149. }
  150. return [mutableShapes copy];
  151. }
  152. - (NSArray<FUBeautyShapeModel *> *)defaultShapes {
  153. NSBundle *bundle = [NSBundle bundleForClass:[self class]];
  154. NSString *shapePath = [bundle pathForResource:@"beauty_shape" ofType:@"json"];
  155. NSArray<NSDictionary *> *shapeData = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:shapePath] options:NSJSONReadingMutableContainers error:nil];
  156. NSMutableArray *shapes = [[NSMutableArray alloc] init];
  157. for (NSDictionary *dictionary in shapeData) {
  158. FUBeautyShapeModel *model = [[FUBeautyShapeModel alloc] init];
  159. [model setValuesForKeysWithDictionary:dictionary];
  160. [shapes addObject:model];
  161. }
  162. return [shapes copy];
  163. }
  164. #pragma mark - Getters
  165. - (BOOL)isDefaultValue {
  166. for (FUBeautyShapeModel *shape in self.beautyShapes) {
  167. int currentIntValue = shape.defaultValueInMiddle ? (int)(shape.currentValue * 100 - 50) : (int)(shape.currentValue * 100);
  168. int defaultIntValue = shape.defaultValueInMiddle ? (int)(shape.defaultValue * 100 - 50) : (int)(shape.defaultValue * 100);
  169. if (currentIntValue != defaultIntValue) {
  170. return NO;
  171. }
  172. }
  173. return YES;
  174. }
  175. @end