//---------------------------------------------------------------------------- // EgalTech 2020-2020 //---------------------------------------------------------------------------- // File : EXE_CDeObjClosedSurfTm.cpp Data : 09.01.20 Versione : 2.2a2 // Contenuto : Funzioni per verificare collisioni tra // Objects e Closed SurftriMesh. // // // Modifiche : 09.01.20 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "EXE.h" #include "EXE_Macro.h" #include "EXE_Const.h" #include "AuxTools.h" #include "GeoTools.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGkCDeBoxClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeRectPrismoidClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeCylClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeConeFrustumClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h" #include "/EgtDev/Include/EGkCDeClosedSurfTmClosedSurfTm.h" #include "/EgtDev/Include/EGkVolZmap.h" #include "/EgtDev/Include/EGkSurfLocal.h" #include "/EgtDev/Include/EGkStringUtils3d.h" using namespace std ; //---------------------------------------------------------------------------- static int MyCDeBoxClosedSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, int nSurfTmId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero la superficie TriMesh const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nSurfTmId)) ; if ( pStm == nullptr) return -1 ; // recupero il riferimento della superficie Frame3d frSurf ; if ( ! pGeomDB->GetGlobFrame( nSurfTmId, frSurf)) return -1 ; // porto in locale alla superficie il riferimento del box (il vettore è già in questo stesso riferimento) Frame3d frBoxL = GetFrameLocal( pGeomDB, frBox, nRefType, frSurf) ; // verifico la collisione return ( CDeBoxClosedSurfTm( frBoxL, vtDiag, dSafeDist, *pStm) ? 1 : 0) ; } //---------------------------------------------------------------------------- static int MyCDeBoxVolZmap( const Frame3d& frBox, const Vector3d& vtDiag, int nZmapId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero lo Zmap const IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nZmapId)) ; if ( pVZM == nullptr) return -1 ; // recupero il riferimento locale Frame3d frLoc ; if ( ! pGeomDB->GetGlobFrame( nZmapId, frLoc)) return -1 ; // porto in locale il riferimento (il vettore è già in locale a questo stesso riferimento) Frame3d frBoxL = GetFrameLocal( pGeomDB, frBox, nRefType, frLoc) ; // verifico la collisione return ( pVZM->AvoidBox( frBoxL, vtDiag, dSafeDist, false) ? 0 : 1) ; } //---------------------------------------------------------------------------- int ExeCDeBoxSolid( const Frame3d& frBox, const Vector3d& vtDiag, int nSolidId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; int nRes = -1 ; if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == SRF_TRIMESH) nRes = MyCDeBoxClosedSurfTm( frBox, vtDiag, nSolidId, dSafeDist, nRefType) ; else if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == VOL_ZMAP) nRes = MyCDeBoxVolZmap( frBox, vtDiag, nSolidId, dSafeDist, nRefType) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCDeBoxSolid({{" + ToString( frBox.Orig()) + "},{" + ToString( frBox.VersX()) + "},{" + ToString( frBox.VersY()) + "},{" + ToString( frBox.VersZ()) + "}},{" + ToString( vtDiag) + "}," + IdToString( nSolidId) + "," + ToString( dSafeDist) + "," + RefTypeToString( nRefType) + ")" + " -- Res=" + ToString( nRes) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return nRes ; } //---------------------------------------------------------------------------- static int MyCDeRectPrismoidClosedSurfTm( const Frame3d& frPrismoid, double dBaseLenX, double dBaseLenY, double dTopLenX, double dTopLenY, double dHeight, int nSurfTmId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero la superficie TriMesh const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nSurfTmId)) ; if ( pStm == nullptr) return -1 ; // recupero il riferimento della superficie Frame3d frSurf ; if ( ! pGeomDB->GetGlobFrame( nSurfTmId, frSurf)) return -1 ; // porto in locale alla superficie il riferimento del prismoide rettangolare Frame3d frPrismoidL = GetFrameLocal( pGeomDB, frPrismoid, nRefType, frSurf) ; // verifico la collisione return ( CDeRectPrismoidClosedSurfTm( frPrismoidL, dBaseLenX, dBaseLenY, dTopLenX, dTopLenY, dHeight, dSafeDist, *pStm) ? 1 : 0) ; } //---------------------------------------------------------------------------- static int MyCDeRectPrismoidVolZmap( const Frame3d& frPrismoid, double dBaseLenX, double dBaseLenY, double dTopLenX, double dTopLenY, double dHeight, int nZmapId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero lo Zmap const IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nZmapId)) ; if ( pVZM == nullptr) return -1 ; // recupero il riferimento locale Frame3d frLoc ; if ( ! pGeomDB->GetGlobFrame( nZmapId, frLoc)) return -1 ; // porto in locale il riferimento (il vettore è già in locale a questo stesso riferimento) Frame3d frPrismoidL = GetFrameLocal( pGeomDB, frPrismoid, nRefType, frLoc) ; // verifico la collisione return ( pVZM->AvoidRectPrismoid( frPrismoidL, dBaseLenX, dBaseLenY, dTopLenX, dTopLenY, dHeight, dSafeDist, false) ? 0 : 1) ; } //---------------------------------------------------------------------------- int ExeCDeRectPrismoidSolid( const Frame3d& frPrismoid, double dBaseLenX, double dBaseLenY, double dTopLenX, double dTopLenY, double dHeight, int nSolidId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; int nRes = -1 ; if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == SRF_TRIMESH) nRes = MyCDeRectPrismoidClosedSurfTm( frPrismoid, dBaseLenX, dBaseLenY, dTopLenX, dTopLenY, dHeight, nSolidId, dSafeDist, nRefType) ; else if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == VOL_ZMAP) nRes = MyCDeRectPrismoidVolZmap( frPrismoid, dBaseLenX, dBaseLenY, dTopLenX, dTopLenY, dHeight, nSolidId, dSafeDist, nRefType) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCDeRectPrismoidSolid({{" + ToString( frPrismoid.Orig()) + "},{" + ToString( frPrismoid.VersX()) + "},{" + ToString( frPrismoid.VersY()) + "},{" + ToString( frPrismoid.VersZ()) + "}}," + ToString( dBaseLenX) + "," + ToString( dBaseLenY) + "," + ToString( dTopLenX) + "," + ToString( dTopLenY) + "," + ToString( dHeight) + "," + IdToString( nSolidId) + "," + ToString( dSafeDist) + "," + RefTypeToString( nRefType) + ")" + " -- Res=" + ToString( nRes) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return nRes ; } //---------------------------------------------------------------------------- static int MyCDeCylClosedSurfTm( const Frame3d& frCyl, double dR, double dH, int nSurfTmId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero la superficie TriMesh const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nSurfTmId)) ; if ( pStm == nullptr) return -1 ; // recupero il riferimento della superficie Frame3d frSurf ; if ( ! pGeomDB->GetGlobFrame( nSurfTmId, frSurf)) return -1 ; // porto in locale alla superficie il riferimento del cilindro Frame3d frCylL = GetFrameLocal( pGeomDB, frCyl, nRefType, frSurf) ; // verifico la collisione return ( CDeCylClosedSurfTm( frCylL, dR, dH, dSafeDist, *pStm) ? 1 : 0) ; } //---------------------------------------------------------------------------- static int MyCDeCylVolZmap( const Frame3d& frCyl, double dR, double dH, int nZmapId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero lo Zmap const IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nZmapId)) ; if ( pVZM == nullptr) return -1 ; // recupero il riferimento locale Frame3d frLoc ; if ( ! pGeomDB->GetGlobFrame( nZmapId, frLoc)) return -1 ; // porto in locale il riferimento Frame3d frCylL = GetFrameLocal( pGeomDB, frCyl, nRefType, frLoc) ; // verifico la collisione return ( pVZM->AvoidCylinder( frCylL, dR, dH, dSafeDist, false) ? 0 : 1) ; } //---------------------------------------------------------------------------- int ExeCDeCylSolid( const Frame3d& frCyl, double dR, double dH, int nSolidId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; int nRes = -1 ; if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == SRF_TRIMESH) nRes = MyCDeCylClosedSurfTm( frCyl, dR, dH, nSolidId, dSafeDist, nRefType) ; else if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == VOL_ZMAP) nRes = MyCDeCylVolZmap( frCyl, dR, dH, nSolidId, dSafeDist, nRefType) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCDeCylSolid({{" + ToString( frCyl.Orig()) + "},{" + ToString( frCyl.VersX()) + "},{" + ToString( frCyl.VersY()) + "},{" + ToString( frCyl.VersZ()) + "}}," + ToString( dR) + "," + ToString( dH) + "," + IdToString( nSolidId) + "," + ToString( dSafeDist) + "," + RefTypeToString( nRefType) + ")" + " -- Res=" + ToString( nRes) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return nRes ; } //---------------------------------------------------------------------------- static int MyCDeConeClosedSurfTm( const Frame3d& frCone, double dR1, double dR2, double dH, int nSurfTmId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero la superficie TriMesh const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nSurfTmId)) ; if ( pStm == nullptr) return -1 ; // recupero il riferimento della superficie Frame3d frSurf ; if ( ! pGeomDB->GetGlobFrame( nSurfTmId, frSurf)) return -1 ; // porto in locale alla superficie il riferimento del cilindro Frame3d frConeL = GetFrameLocal( pGeomDB, frCone, nRefType, frSurf) ; // verifico la collisione return ( CDeConeFrustumClosedSurfTm( frConeL, dR1, dR2, dH, dSafeDist, *pStm) ? 1 : 0) ; } //---------------------------------------------------------------------------- static int MyCDeConeVolZmap( const Frame3d& frCone, double dR1, double dR2, double dH, int nZmapId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero lo Zmap const IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nZmapId)) ; if ( pVZM == nullptr) return -1 ; // recupero il riferimento locale Frame3d frLoc ; if ( ! pGeomDB->GetGlobFrame( nZmapId, frLoc)) return -1 ; // porto in locale il riferimento Frame3d frConeL = GetFrameLocal( pGeomDB, frCone, nRefType, frLoc) ; // verifico la collisione return ( pVZM->AvoidConeFrustum( frConeL, dR1, dR2, dH, dSafeDist, false) ? 0 : 1) ; } //---------------------------------------------------------------------------- int ExeCDeConeSolid( const Frame3d& frCone, double dR1, double dR2, double dH, int nSolidId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; int nRes = -1 ; if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == SRF_TRIMESH) nRes = MyCDeConeClosedSurfTm( frCone, dR1, dR2, dH, nSolidId, dSafeDist, nRefType) ; else if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == VOL_ZMAP) nRes = MyCDeConeVolZmap( frCone, dR1, dR2, dH, nSolidId, dSafeDist, nRefType) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCDeConeSolid({{" + ToString( frCone.Orig()) + "},{" + ToString( frCone.VersX()) + "},{" + ToString( frCone.VersY()) + "},{" + ToString( frCone.VersZ()) + "}}," + ToString( dR1) + "," + ToString( dR2) + "," + ToString( dH) + "," + IdToString( nSolidId) + "," + ToString( dSafeDist) + "," + RefTypeToString( nRefType) + ")" + " -- Res=" + ToString( nRes) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return nRes ; } //---------------------------------------------------------------------------- static int MyCDeSpheClosedSurfTm( const Point3d& ptCen, double dR, int nSurfTmId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero la superficie TriMesh const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nSurfTmId)) ; if ( pStm == nullptr) return -1 ; // recupero il riferimento della superficie Frame3d frSurf ; if ( ! pGeomDB->GetGlobFrame( nSurfTmId, frSurf)) return -1 ; // porto in locale alla superficie il centro della sfera Point3d ptCenL = GetPointLocal( pGeomDB, ptCen, nRefType, frSurf) ; // verifico la collisione return ( CDeSpheClosedSurfTm( ptCenL, dR, dSafeDist, *pStm) ? 1 : 0) ; } //---------------------------------------------------------------------------- static int MyCDeSpheVolZmap( const Point3d& ptCen, double dRad, int nZmapId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero lo Zmap const IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nZmapId)) ; if ( pVZM == nullptr) return -1 ; // recupero il riferimento locale Frame3d frLoc ; if ( ! pGeomDB->GetGlobFrame( nZmapId, frLoc)) return -1 ; // porto in locale il centro della sfera Point3d ptCenL = GetPointLocal( pGeomDB, ptCen, nRefType, frLoc) ; // verifico la collisione return ( pVZM->AvoidSphere( ptCenL, dRad, dSafeDist, false) ? 0 : 1) ; } //---------------------------------------------------------------------------- int ExeCDeSpheSolid( const Point3d& ptCen, double dR, int nSolidId, double dSafeDist, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; int nRes = -1 ; if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == SRF_TRIMESH) nRes = MyCDeSpheClosedSurfTm( ptCen, dR, nSolidId, dSafeDist, nRefType) ; else if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolidId) == VOL_ZMAP) nRes = MyCDeSpheVolZmap( ptCen, dR, nSolidId, dSafeDist, nRefType) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCDeSpheSolid({" + ToString( ptCen) + "}," + ToString( dR) + "," + IdToString( nSolidId) + "," + ToString( dSafeDist) + "," + RefTypeToString( nRefType) + ")" + " -- Res=" + ToString( nRes) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return nRes ; } //---------------------------------------------------------------------------- static int MyCDeClosedSurfTmClosedSurfTm( int nSurfTm1Id, int nSurfTm2Id, double dSafeDist) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero il riferimento della seconda superficie Frame3d frSurf2 ; if ( ! pGeomDB->GetGlobFrame( nSurfTm2Id, frSurf2)) return -1 ; // recupero la prima superficie in locale alla seconda SurfLocal Surf1Loc( pGeomDB, nSurfTm1Id, frSurf2) ; const ISurfTriMesh* pStm1 = GetSurfTriMesh( Surf1Loc) ; if ( pStm1 == nullptr) return -1 ; // recupero la seconda superficie TriMesh const ISurfTriMesh* pStm2 = GetSurfTriMesh( pGeomDB->GetGeoObj( nSurfTm2Id)) ; if ( pStm2 == nullptr) return -1 ; // verifico la collisione return ( CDeClosedSurfTmClosedSurfTm( *pStm1, *pStm2, dSafeDist) ? 1 : 0) ; } //---------------------------------------------------------------------------- static int MyCDeClosedSurfTmVolZmap( int nSurfTmId, int nZmapId, double dSafeDist) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, -1) // recupero il riferimento dello Zmap Frame3d frZmap ; if ( ! pGeomDB->GetGlobFrame( nZmapId, frZmap)) return -1 ; // recupero la superficie in locale allo Zmap SurfLocal SurfLoc( pGeomDB, nSurfTmId, frZmap) ; const ISurfTriMesh* pStm = GetSurfTriMesh( SurfLoc) ; if ( pStm == nullptr) return -1 ; // recupero lo Zmap const IVolZmap* pVZM = GetVolZmap( pGeomDB->GetGeoObj( nZmapId)) ; if ( pVZM == nullptr) return -1 ; // verifico la collisione return ( pVZM->AvoidSurfTm( *pStm, dSafeDist, false) ? 0 : 1) ; } //---------------------------------------------------------------------------- int ExeCDeSolidSolid( int nSolid1Id, int nSolid2Id, double dSafeDist) { IGeomDB* pGeomDB = GetCurrGeomDB() ; int nRes = -1 ; if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolid1Id) == SRF_TRIMESH && pGeomDB->GetGeoType( nSolid2Id) == SRF_TRIMESH) nRes = MyCDeClosedSurfTmClosedSurfTm( nSolid1Id, nSolid2Id, dSafeDist) ; else if ( pGeomDB != nullptr && pGeomDB->GetGeoType( nSolid1Id) == SRF_TRIMESH && pGeomDB->GetGeoType( nSolid2Id) == VOL_ZMAP) nRes = MyCDeClosedSurfTmVolZmap( nSolid1Id, nSolid2Id, dSafeDist) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtCDeSolidSolid({" + IdToString( nSolid1Id) + "," + IdToString( nSolid2Id) + "," + ToString( dSafeDist) + ")" + " -- Res=" + ToString( nRes) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultato return nRes ; }