diff --git a/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp b/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp index ed02a27cc43..ca11ed68c54 100644 --- a/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp +++ b/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp @@ -310,11 +310,18 @@ bool buildNavMeshData(const int nverts, const float* verts, { memcpy(dtris+3*2*i, tris+3*dtrisToTrisMap[i], sizeof(unsigned short)*3); } - //create new recast data corresponded to dtris + //create new recast data corresponded to dtris and renumber for continious indices + int prevPolyIdx=-1, curPolyIdx, newPolyIdx=0; dtrisToPolysMap = new int[ndtris]; for (int i=0; iobject; + scene_select_base(scene, base); + copy_v3_v3(obedit->loc, co); + copy_v3_v3(obedit->rot, rot); + } + ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); em = BKE_mesh_get_editmesh(((Mesh *)obedit->data)); + if (!createob) + { + //clear + if(em->verts.first) free_vertlist(em, &em->verts); + if(em->edges.first) free_edgelist(em, &em->edges); + if(em->faces.first) free_facelist(em, &em->faces); + if(em->selected.first) BLI_freelistN(&(em->selected)); + } + //create verts for polygon mesh for(i = 0; i < pmesh->nverts; i++) { v = &pmesh->verts[3*i]; @@ -392,13 +417,20 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD ED_object_exit_editmode(C, EM_FREEDATA); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); - obedit->gameflag &= ~OB_COLLISION; - obedit->gameflag |= OB_NAVMESH; - obedit->body_type = OB_BODY_TYPE_NAVMESH; - rename_id((ID *)obedit, "Navmesh"); + if (createob) + { + obedit->gameflag &= ~OB_COLLISION; + obedit->gameflag |= OB_NAVMESH; + obedit->body_type = OB_BODY_TYPE_NAVMESH; + rename_id((ID *)obedit, "Navmesh"); + } + + ModifierData *md= modifiers_findByType(obedit, eModifierType_NavMesh); + if (!md) + { + ED_object_modifier_add(NULL, scene, obedit, NULL, eModifierType_NavMesh); + } - ED_object_modifier_add(NULL, scene, obedit, NULL, eModifierType_NavMesh); - //ModifierData *md= modifiers_findByType(ob, eModifierType_NavMesh); return obedit; } @@ -411,15 +443,22 @@ static int create_navmesh_exec(bContext *C, wmOperator *op) rcPolyMesh* pmesh; rcPolyMeshDetail* dmesh; LinkNode* obs = NULL; + Base* navmeshBase = NULL; CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { - BLI_linklist_append(&obs, (void*)base->object); + if (base->object->body_type==OB_BODY_TYPE_NAVMESH) + { + if (!navmeshBase || base==CTX_data_active_base(C)) + navmeshBase = base; + } + else + BLI_linklist_append(&obs, (void*)base->object); } CTX_DATA_END; createVertsTrisData(C, obs, nverts, verts, ntris, tris); BLI_linklist_free(obs, NULL); buildNavMesh(scene->gm.recastData, nverts, verts, ntris, tris, pmesh, dmesh); - createRepresentation(C, pmesh, dmesh); + createRepresentation(C, pmesh, dmesh, navmeshBase); return OPERATOR_FINISHED; } @@ -520,7 +559,6 @@ static int findFreeNavPolyIndex(EditMesh* em) qsort(indices, numfaces, sizeof(int), compare); //search first free index int freeIdx = 1; - int maxIdx = indices[numfaces-1]; for (int i=0; igetNumVerts(dm); - int maxEdges = dm->getNumEdges(dm); int maxFaces = dm->getNumFaces(dm); result = CDDM_copy(dm); @@ -209,9 +206,39 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der { DerivedMesh *result = NULL; NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_PROP_INT)>0; + if (ob->body_type!=OB_BODY_TYPE_NAVMESH || !hasRecastData ) + { + //convert to nav mesh object: + //1)set physics type + ob->gameflag &= ~OB_COLLISION; + ob->gameflag |= OB_NAVMESH; + ob->body_type = OB_BODY_TYPE_NAVMESH; + //2)add and init recast data layer + if (!hasRecastData) + { + int numFaces = derivedData->getNumFaces(derivedData); + CustomData_add_layer_named(&derivedData->faceData, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData"); + int* recastData = (int*)CustomData_get_layer(&derivedData->faceData, CD_PROP_INT); + for (int i=0; ibody_type==OB_BODY_TYPE_NAVMESH) - result = createNavMeshForVisualization(nmmd, derivedData); + Mesh* obmesh = (Mesh *)ob->data; + if (obmesh) + { + CustomData_add_layer_named(&obmesh->fdata, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData"); + int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_PROP_INT); + for (int i=0; iNodeGetWorldPosition(); const MT_Point3& targpos = m_target->NodeGetWorldPosition(); MT_Vector3 vectotarg = targpos - mypos; + MT_Vector3 vectotarg2d = vectotarg; + vectotarg2d.z() = 0; MT_Vector3 steervec = MT_Vector3(0, 0, 0); bool apply_steerforce = false; bool terminate = true; switch (m_mode) { case KX_STEERING_SEEK: - if (vectotarg.length2()>m_distance*m_distance) + if (vectotarg2d.length2()>m_distance*m_distance) { terminate = false; steervec = vectotarg; @@ -188,7 +190,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) } break; case KX_STEERING_FLEE: - if (vectotarg.length2()