@@ -43,19 +43,26 @@ std::recursive_mutex morph_task_mutex;
4343std::recursive_mutex qupdatenormalmap_lock;
4444std::recursive_mutex loading_game_mutex;
4545std::recursive_mutex custom_main_task_pool_lock;
46+ std::uint64_t qupdatenormalmap_recursion=0 ;
4647std::queue<std::function<void ()>> custom_main_task_pool;
4748auto original_process_task = (void (*)(void * main, void * arg2, void * arg3, void * arg4)) nullptr ;
4849auto qupdatenormalmap = (void (*)(void * arg1, RE ::Actor* actor, int armor_slot_bit)) nullptr ;
4950auto original_setskin = (void (*)(RE ::TESActorBase* actorbase, RE ::TESObjectARMO* skin)) nullptr ;
5051static void setskin_hook (RE ::TESActorBase* actorbase, RE ::TESObjectARMO* skin) {
5152 if (original_setskin && qupdatenormalmap) {
5253 original_setskin (actorbase, skin);
53- std::lock_guard l (qupdatenormalmap_lock);
54+
5455 auto actor_forms = RE::TESDataHandler::GetSingleton ()->GetFormArray <RE ::Actor>();
5556 for (auto * actor: actor_forms) {
5657 if (actor && actor->GetActorBase () == actorbase) {
57- qupdatenormalmap (nullptr , actor, 0xffffffff );
58- logger::info (" calling QUpdateNormalMap" );
58+ std::lock_guard l (qupdatenormalmap_lock);
59+ if (qupdatenormalmap_recursion == 0 ) {
60+ logger::info (" calling QUpdateNormalMap" );
61+ qupdatenormalmap_recursion = 1 ;
62+ qupdatenormalmap (nullptr , actor, 0xffffffff );
63+
64+ qupdatenormalmap_recursion = 0 ;
65+ }
5966 }
6067 }
6168 }
@@ -400,8 +407,14 @@ namespace plugin {
400407 if (qupdatenormalmap) {
401408 if (auto actor = reference->As <RE ::Actor>()) {
402409 std::lock_guard l (qupdatenormalmap_lock);
403- qupdatenormalmap (nullptr , actor, 0xFFFFFFFF );
404- logger::info (" calling QUpdateNormalMap" );
410+ if (qupdatenormalmap_recursion == 0 ) {
411+ logger::info (" calling QUpdateNormalMap" );
412+ qupdatenormalmap_recursion = 1 ;
413+ qupdatenormalmap (nullptr , actor, 0xffffffff );
414+
415+ qupdatenormalmap_recursion = 0 ;
416+ }
417+
405418 }
406419 }
407420 } else {
@@ -2320,7 +2333,7 @@ namespace plugin {
23202333 if (auto func = func_ptr->func ) {
23212334 if (func->GetName () == RE::BSFixedString (" QUpdateNormalmap" ) && func->GetIsNative ()) {
23222335 qupdatenormalmap = (void (*)(void * arg1, RE ::Actor* actor, int armor_slot_bit)) *
2323- (uint64_t *) ((uint64_t ) func.get () + 0x50 );
2336+ (uint64_t *) ((( uint64_t ) func.get () ) + 0x50 );
23242337 logger::info (" found QUpdateNormalMap" );
23252338 }
23262339 }
@@ -2341,7 +2354,7 @@ namespace plugin {
23412354 if (auto func = func_ptr->func ) {
23422355 if (func->GetName () == RE::BSFixedString (" SetSkin" ) && func->GetIsNative ()) {
23432356 original_setskin = (void (*)(RE ::TESActorBase* actorbase, RE ::TESObjectARMO* skin)) *
2344- (uint64_t *) ((uint64_t ) func.get () + 0x50 );
2357+ (uint64_t *) ((( uint64_t ) func.get () ) + 0x50 );
23452358 logger::info (" found SetSkin" );
23462359 }
23472360 }
0 commit comments