Ticket #4191: AIWorker-update-rewrite.patch
File AIWorker-update-rewrite.patch, 6.1 KB (added by , 8 years ago) |
---|
-
source/simulation2/components/CCmpAIManager.cpp
512 512 513 513 return true; 514 514 } 515 void StartComputation(const shared_ptr<ScriptInterface::StructuredClone>& gameState, 516 const Grid<NavcellData>& passabilityMap, const GridUpdateInformation& dirtinessInformations, 517 const Grid<u8>& territoryMap, bool territoryMapDirty, 515 516 void UpdateGameState(const shared_ptr<ScriptInterface::StructuredClone>& gameState) 517 { 518 ENSURE(m_CommandsComputed); 519 m_GameState = gameState; 520 } 521 522 void UpdatePathfinder(const Grid<NavcellData>& passabilityMap, bool globallyDirty, const Grid<u8>& dirtinessGrid, 518 523 const std::map<std::string, pass_class_t>& nonPathfindingPassClassMasks, const std::map<std::string, pass_class_t>& pathfindingPassClassMasks) 519 524 { 520 525 ENSURE(m_CommandsComputed); 526 bool dimensionChange = m_PassabilityMap.m_W != passabilityMap.m_W || m_PassabilityMap.m_H != passabilityMap.m_H; 521 527 522 m_GameState = gameState; 528 m_PassabilityMap = passabilityMap; 529 if (globallyDirty) 530 m_LongPathfinder.Reload(&m_PassabilityMap, nonPathfindingPassClassMasks, pathfindingPassClassMasks); 531 else 532 m_LongPathfinder.Update(&m_PassabilityMap, dirtinessGrid); 533 523 534 JSContext* cx = m_ScriptInterface->GetContext(); 535 if (dimensionChange) 536 ScriptInterface::ToJSVal(cx, &m_PassabilityMapVal, m_PassabilityMap); 537 else 538 { 539 // Avoid a useless memory reallocation followed by a garbage collection. 540 JSAutoRequest rq(cx); 524 541 525 if (dirtinessInformations.dirty) 542 JS::RootedObject mapObj(cx, &m_PassabilityMapVal.toObject()); 543 JS::RootedValue mapData(cx); 544 ENSURE(JS_GetProperty(cx, mapObj, "data", &mapData)); 545 JS::RootedObject dataObj(cx, &mapData.toObject()); 546 547 u32 length = 0; 548 ENSURE(JS_GetArrayLength(cx, dataObj, &length)); 549 u32 nbytes = (u32)(length * sizeof(NavcellData)); 550 551 JS::AutoCheckCannotGC nogc; 552 memcpy((void*)JS_GetUint16ArrayData(dataObj, nogc), m_PassabilityMap.m_Data, nbytes); 553 } 554 } 555 556 void UpdateTerritoryMap(const Grid<u8>& territoryMap) 557 { 558 ENSURE(m_CommandsComputed); 559 bool dimensionChange = m_TerritoryMap.m_W != territoryMap.m_W || m_TerritoryMap.m_H != territoryMap.m_H; 560 561 m_TerritoryMap = territoryMap; 562 563 JSContext* cx = m_ScriptInterface->GetContext(); 564 if (dimensionChange) 565 ScriptInterface::ToJSVal(cx, &m_TerritoryMapVal, m_TerritoryMap); 566 else 526 567 { 527 m_PassabilityMap = passabilityMap; 528 if (dirtinessInformations.globallyDirty) 529 m_LongPathfinder.Reload(&m_PassabilityMap, nonPathfindingPassClassMasks, pathfindingPassClassMasks); 530 else 531 m_LongPathfinder.Update(&m_PassabilityMap, dirtinessInformations.dirtinessGrid); 532 ScriptInterface::ToJSVal(cx, &m_PassabilityMapVal, m_PassabilityMap); 533 } 568 // Avoid a useless memory reallocation followed by a garbage collection. 569 JSAutoRequest rq(cx); 534 570 535 if (territoryMapDirty) 536 { 537 m_TerritoryMap = territoryMap; 538 ScriptInterface::ToJSVal(cx, &m_TerritoryMapVal, m_TerritoryMap); 571 JS::RootedObject mapObj(cx, &m_TerritoryMapVal.toObject()); 572 JS::RootedValue mapData(cx); 573 ENSURE(JS_GetProperty(cx, mapObj, "data", &mapData)); 574 JS::RootedObject dataObj(cx, &mapData.toObject()); 575 576 u32 length = 0; 577 ENSURE(JS_GetArrayLength(cx, dataObj, &length)); 578 u32 nbytes = (u32)(length * sizeof(u8)); 579 580 JS::AutoCheckCannotGC nogc; 581 memcpy((void*)JS_GetUint8ArrayData(dataObj, nogc), m_TerritoryMap.m_Data, nbytes); 539 582 } 583 } 540 584 585 void StartComputation() 586 { 541 587 m_CommandsComputed = false; 542 588 } 543 589 … … 1058 1104 cmpAIInterface->GetFullRepresentation(&state, false); 1059 1105 else 1060 1106 cmpAIInterface->GetRepresentation(&state); 1107 LoadPathfinderClasses(state); // add the pathfinding classes to it 1061 1108 1062 // Get the passability data 1063 Grid<NavcellData> dummyGrid; 1064 const Grid<NavcellData>* passabilityMap = &dummyGrid; 1109 // Update the game state 1110 m_Worker.UpdateGameState(scriptInterface.WriteStructuredClone(state)); 1111 1112 // Update the pathfinding data 1065 1113 CmpPtr<ICmpPathfinder> cmpPathfinder(GetSystemEntity()); 1066 1114 if (cmpPathfinder) 1067 passabilityMap = &cmpPathfinder->GetPassabilityGrid(); 1115 { 1116 GridUpdateInformation dirtinessInformations = cmpPathfinder->GetDirtinessData(); 1068 1117 1069 GridUpdateInformation dirtinessInformations = cmpPathfinder->GetDirtinessData(); 1118 if (dirtinessInformations.dirty) 1119 { 1120 const Grid<NavcellData>& passabilityMap = cmpPathfinder->GetPassabilityGrid(); 1070 1121 1071 // Get the territory data 1122 std::map<std::string, pass_class_t> nonPathfindingPassClassMasks, pathfindingPassClassMasks; 1123 cmpPathfinder->GetPassabilityClasses(nonPathfindingPassClassMasks, pathfindingPassClassMasks); 1124 1125 m_Worker.UpdatePathfinder(passabilityMap, dirtinessInformations.globallyDirty, dirtinessInformations.dirtinessGrid, 1126 nonPathfindingPassClassMasks, pathfindingPassClassMasks); 1127 } 1128 } 1129 1130 // Update the territory data 1072 1131 // Since getting the territory grid can trigger a recalculation, we check NeedUpdate first 1073 bool territoryMapDirty = false;1074 Grid<u8> dummyGrid2;1075 const Grid<u8>* territoryMap = &dummyGrid2;1076 1132 CmpPtr<ICmpTerritoryManager> cmpTerritoryManager(GetSystemEntity()); 1077 1133 if (cmpTerritoryManager && cmpTerritoryManager->NeedUpdate(&m_TerritoriesDirtyID)) 1078 1134 { 1079 territoryMap = &cmpTerritoryManager->GetTerritoryGrid();1080 territoryMapDirty = true;1135 const Grid<u8>& territoryMap = cmpTerritoryManager->GetTerritoryGrid(); 1136 m_Worker.UpdateTerritoryMap(territoryMap); 1081 1137 } 1082 1138 1083 LoadPathfinderClasses(state); 1084 std::map<std::string, pass_class_t> nonPathfindingPassClassMasks, pathfindingPassClassMasks; 1085 if (cmpPathfinder) 1086 cmpPathfinder->GetPassabilityClasses(nonPathfindingPassClassMasks, pathfindingPassClassMasks); 1139 m_Worker.StartComputation(); 1087 1140 1088 m_Worker.StartComputation(scriptInterface.WriteStructuredClone(state),1089 *passabilityMap, dirtinessInformations,1090 *territoryMap, territoryMapDirty,1091 nonPathfindingPassClassMasks, pathfindingPassClassMasks);1092 1093 1141 m_JustDeserialized = false; 1094 1142 } 1095 1143