Fusion360-Addons/usr/Src/Core/pMisc.cpp
2021-10-31 19:39:29 +01:00

280 lines
5.7 KiB
C++

#include <StdAfx.h>
#include "NxShape.h"
#include "Nxp.h"
#include "pMisc.h"
#include "PhysicManager.h"
#include "vtPhysXAll.h"
namespace vtAgeia
{
CK3dEntity *getEntityFromShape(NxShape* shape)
{
if ( !shape)
return NULL;
pSubMeshInfo *sInfo = (pSubMeshInfo*)shape->userData;
if (sInfo)
{
CK3dEntity *ent = (CK3dEntity*)CKGetObject(ctx(),sInfo->entID);
return ent;
}
return NULL;
}
bool isChildOf(CK3dEntity*parent,CK3dEntity*test)
{
CK3dEntity* subEntity = NULL;
while (subEntity= parent->HierarchyParser(subEntity) )
{
if (subEntity == test)
{
return true;
}
}
return false;
}
CK3dEntity* findSimilarInSourceObject(CK3dEntity *parentOriginal,CK3dEntity* partentCopied,CK3dEntity *copiedObject,CK3dEntity*prev)
{
if (!parentOriginal || !copiedObject )
return NULL;
if (parentOriginal->GetChildrenCount() < 1)
return NULL;
if ( prev && prev!=copiedObject && isChildOf(parentOriginal,prev) && !isChildOf(partentCopied,prev) )
return prev;
CK3dEntity *orginalObject= (CK3dEntity*)ctx()->GetObjectByNameAndClass(copiedObject->GetName(),CKCID_3DOBJECT,prev);
if (orginalObject)
{
//----------------------------------------------------------------
//
// tests
//
if ( orginalObject==copiedObject )
findSimilarInSourceObject(parentOriginal,partentCopied,copiedObject,orginalObject);
if ( !isChildOf(parentOriginal,orginalObject))
findSimilarInSourceObject(parentOriginal,partentCopied,copiedObject,orginalObject);
if( isChildOf(partentCopied,orginalObject) )
findSimilarInSourceObject(parentOriginal,partentCopied,copiedObject,orginalObject);
return orginalObject;
}
return NULL;
}
bool calculateOffsets(CK3dEntity*source,CK3dEntity*target,VxQuaternion &quat,VxVector& pos)
{
if (!source && !target)
return false;
CK3dEntity* child = NULL;
bool isChild = false;
while (child = source->HierarchyParser(child) )
{
if (child == target )
{
isChild = true;
}
}
VxQuaternion refQuad2;
target->GetQuaternion(&refQuad2,source);
VxVector relPos;
target->GetPosition(&relPos,source);
pos = relPos;
quat = refQuad2;
return true;
}
int getNbOfPhysicObjects(CK3dEntity *parentObject,int flags/* =0 */)
{
#ifdef _DEBUG
assert(parentObject);
#endif // _DEBUG
int result = 0;
//----------------------------------------------------------------
//
// parse hierarchy
//
CK3dEntity* subEntity = NULL;
while (subEntity= parentObject->HierarchyParser(subEntity) )
{
pRigidBody *body = GetPMan()->getBody(subEntity);
if (body)
result++;
}
return result;
}
int getHullTypeFromShape(NxShape *shape)
{
int result = - 1;
if (!shape)
{
return result;
}
int nxType = shape->getType();
switch (nxType)
{
case NX_SHAPE_PLANE:
return HT_Plane;
case NX_SHAPE_BOX:
return HT_Box;
case NX_SHAPE_SPHERE:
return HT_Sphere;
case NX_SHAPE_CONVEX:
return HT_ConvexMesh;
case NX_SHAPE_CAPSULE:
return HT_Capsule;
case NX_SHAPE_MESH:
return HT_Mesh;
}
return -1;
}
int getEnumIndex(CKParameterManager* pm,CKGUID parGuide,XString enumValue)
{
int pType = pm->ParameterGuidToType(parGuide);
CKEnumStruct *enumStruct = pm->GetEnumDescByType(pType);
if ( enumStruct )
{
for (int i = 0 ; i < enumStruct->GetNumEnums() ; i ++ )
{
if( !strcmp(enumStruct->GetEnumDescription(i),enumValue.Str()) )
return i;
}
}
return 0;
}
XString getEnumDescription(CKParameterManager* pm,CKGUID parGuide)
{
XString result;
int pType = pm->ParameterGuidToType(parGuide);
CKEnumStruct *enumStruct = pm->GetEnumDescByType(pType);
if ( enumStruct )
{
for (int i = 0 ; i < enumStruct->GetNumEnums() ; i ++ )
{
result << enumStruct->GetEnumDescription(i);
result << "=";
result << enumStruct->GetEnumValue(i);
if (i < enumStruct->GetNumEnums() -1 )
{
result << ",";
}
}
}
return result;
}
XString getEnumDescription(CKParameterManager* pm,CKGUID parGuide,int parameterSubIndex)
{
XString result="None";
int pType = pm->ParameterGuidToType(parGuide);
CKEnumStruct *enumStruct = pm->GetEnumDescByType(pType);
if ( enumStruct )
{
for (int i = 0 ; i < enumStruct->GetNumEnums() ; i ++ )
{
if(i == parameterSubIndex)
{
result = enumStruct->GetEnumDescription(i);
}
}
}
return result;
}
//************************************
// Method: BoxGetZero
// FullName: vtAgeia::BoxGetZero
// Access: public
// Returns: VxVector
// Qualifier:
// Parameter: vt3DObject ent
//************************************
VxVector BoxGetZero(CK3dEntity* ent)
{
VxVector box_s= VxVector(1,1,1);
if (ent)
{
VxMatrix mat = ent->GetWorldMatrix();
VxVector g;
//Vx3DMatrixToEulerAngles(mat,&g.x,&g.y,&g.z);
//SetEulerDirection(ent,VxVector(0,0,0));
CKMesh *mesh = ent->GetCurrentMesh();
if (mesh!=NULL)
{
box_s = mesh->GetLocalBox().GetSize();
}
//SetEulerDirection(ent,g);
}
return box_s;
}
//************************************
// Method: SetEulerDirection
// FullName: vtAgeia::SetEulerDirection
// Access: public
// Returns: void
// Qualifier:
// Parameter: CK3dEntity* ent
// Parameter: VxVector direction
//************************************
void SetEulerDirection(CK3dEntity* ent,VxVector direction)
{
VxVector dir,up,right;
VxMatrix mat;
Vx3DMatrixFromEulerAngles(mat,direction.x,direction.y,direction.z);
dir=(VxVector)mat[2];
up=(VxVector)mat[1];
right=(VxVector)mat[0];
ent->SetOrientation(&dir,&up,&right,NULL,FALSE);
}
}