Files
SellyCloudSDK_demo/Example/SubModules/FUBeautyComponent/FUBeautyComponent/ViewModel/FUBeautyShapeViewModel.m
2026-03-26 12:05:37 +08:00

198 lines
7.2 KiB
Objective-C

//
// FUBeautyShapeViewModel.m
// FUBeautyComponent
//
// Created by 项林平 on 2022/7/27.
//
#import "FUBeautyShapeViewModel.h"
#import "FUBeautyDefine.h"
#import <FURenderKit/FURenderKit.h>
@interface FUBeautyShapeViewModel ()
@property (nonatomic, copy) NSArray<FUBeautyShapeModel *> *beautyShapes;
@end
@implementation FUBeautyShapeViewModel
#pragma mark - Initializer
- (instancetype)init {
self = [super init];
if (self) {
if ([[NSUserDefaults standardUserDefaults] objectForKey:FUPersistentBeautyShapeKey]) {
// 获取本地美肤数据
self.beautyShapes = [self localShapes];
} else {
// 获取默认美肤数据
self.beautyShapes = [self defaultShapes];
}
self.selectedIndex = -1;
self.performanceLevel = [FURenderKit devicePerformanceLevel];
}
return self;
}
#pragma mark - Instance methods
- (void)saveShapesPersistently {
if (self.beautyShapes.count == 0) {
return;
}
NSMutableArray *shapes = [[NSMutableArray alloc] init];
for (FUBeautyShapeModel *model in self.beautyShapes) {
NSDictionary *dictionary = [model dictionaryWithValuesForKeys:@[@"name", @"type", @"currentValue", @"defaultValue", @"defaultValueInMiddle", @"differentiateDevicePerformance"]];
[shapes addObject:dictionary];
}
[[NSUserDefaults standardUserDefaults] setObject:shapes forKey:FUPersistentBeautyShapeKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (void)setShapeValue:(double)value {
if (self.selectedIndex < 0 || self.selectedIndex >= self.beautyShapes.count) {
return;
}
FUBeautyShapeModel *model = self.beautyShapes[self.selectedIndex];
model.currentValue = value;
[self setValue:model.currentValue forType:model.type];
}
- (void)setAllShapeValues {
for (FUBeautyShapeModel *shape in self.beautyShapes) {
[self setValue:shape.currentValue forType:shape.type];
}
}
- (void)recoverAllShapeValuesToDefault {
for (FUBeautyShapeModel *shape in self.beautyShapes) {
shape.currentValue = shape.defaultValue;
[self setValue:shape.currentValue forType:shape.type];
}
}
#pragma mark - Private methods
- (void)setValue:(double)value forType:(FUBeautyShape)type {
switch (type) {
case FUBeautyShapeCheekThinning:
[FURenderKit shareRenderKit].beauty.cheekThinning = value;
break;
case FUBeautyShapeCheekV:
[FURenderKit shareRenderKit].beauty.cheekV = value;
break;
case FUBeautyShapeCheekNarrow:
[FURenderKit shareRenderKit].beauty.cheekNarrow = value;
break;
case FUBeautyShapeCheekShort:
[FURenderKit shareRenderKit].beauty.cheekShort = value;
break;
case FUBeautyShapeCheekSmall:
[FURenderKit shareRenderKit].beauty.cheekSmall = value;
break;
case FUBeautyShapeCheekbones:
[FURenderKit shareRenderKit].beauty.intensityCheekbones = value;
break;
case FUBeautyShapeLowerJaw:
[FURenderKit shareRenderKit].beauty.intensityLowerJaw = value;
break;
case FUBeautyShapeEyeEnlarging:
[FURenderKit shareRenderKit].beauty.eyeEnlarging = value;
break;
case FUBeautyShapeEyeCircle:
[FURenderKit shareRenderKit].beauty.intensityEyeCircle = value;
break;
case FUBeautyShapeChin:
[FURenderKit shareRenderKit].beauty.intensityChin = value;
break;
case FUBeautyShapeForehead:
[FURenderKit shareRenderKit].beauty.intensityForehead = value;
break;
case FUBeautyShapeNose:
[FURenderKit shareRenderKit].beauty.intensityNose = value;
break;
case FUBeautyShapeMouth:
[FURenderKit shareRenderKit].beauty.intensityMouth = value;
break;
case FUBeautyShapeLipThick:
[FURenderKit shareRenderKit].beauty.intensityLipThick = value;
break;
case FUBeautyShapeEyeHeight:
[FURenderKit shareRenderKit].beauty.intensityEyeHeight = value;
break;
case FUBeautyShapeCanthus:
[FURenderKit shareRenderKit].beauty.intensityCanthus = value;
break;
case FUBeautyShapeEyeLid:
[FURenderKit shareRenderKit].beauty.intensityEyeLid = value;
break;
case FUBeautyShapeEyeSpace:
[FURenderKit shareRenderKit].beauty.intensityEyeSpace = value;
break;
case FUBeautyShapeEyeRotate:
[FURenderKit shareRenderKit].beauty.intensityEyeRotate = value;
break;
case FUBeautyShapeLongNose:
[FURenderKit shareRenderKit].beauty.intensityLongNose = value;
break;
case FUBeautyShapePhiltrum:
[FURenderKit shareRenderKit].beauty.intensityPhiltrum = value;
break;
case FUBeautyShapeSmile:
[FURenderKit shareRenderKit].beauty.intensitySmile = value;
break;
case FUBeautyShapeBrowHeight:
[FURenderKit shareRenderKit].beauty.intensityBrowHeight = value;
break;
case FUBeautyShapeBrowSpace:
[FURenderKit shareRenderKit].beauty.intensityBrowSpace = value;
break;
case FUBeautyShapeBrowThick:
[FURenderKit shareRenderKit].beauty.intensityBrowThick = value;
break;
}
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(saveShapesPersistently) withObject:nil afterDelay:2];
}
- (NSArray<FUBeautyShapeModel *> *)localShapes {
NSArray *shapes = [[NSUserDefaults standardUserDefaults] objectForKey:FUPersistentBeautyShapeKey];
NSMutableArray *mutableShapes = [[NSMutableArray alloc] init];
for (NSDictionary *shape in shapes) {
FUBeautyShapeModel *model = [[FUBeautyShapeModel alloc] init];
[model setValuesForKeysWithDictionary:shape];
[mutableShapes addObject:model];
}
return [mutableShapes copy];
}
- (NSArray<FUBeautyShapeModel *> *)defaultShapes {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSString *shapePath = [bundle pathForResource:@"beauty_shape" ofType:@"json"];
NSArray<NSDictionary *> *shapeData = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:shapePath] options:NSJSONReadingMutableContainers error:nil];
NSMutableArray *shapes = [[NSMutableArray alloc] init];
for (NSDictionary *dictionary in shapeData) {
FUBeautyShapeModel *model = [[FUBeautyShapeModel alloc] init];
[model setValuesForKeysWithDictionary:dictionary];
[shapes addObject:model];
}
return [shapes copy];
}
#pragma mark - Getters
- (BOOL)isDefaultValue {
for (FUBeautyShapeModel *shape in self.beautyShapes) {
int currentIntValue = shape.defaultValueInMiddle ? (int)(shape.currentValue * 100 - 50) : (int)(shape.currentValue * 100);
int defaultIntValue = shape.defaultValueInMiddle ? (int)(shape.defaultValue * 100 - 50) : (int)(shape.defaultValue * 100);
if (currentIntValue != defaultIntValue) {
return NO;
}
}
return YES;
}
@end