deargui-vpl/ref/virtools/Samples/Behaviors/Collision/CollisionBehaviors.cpp

238 lines
8.0 KiB
C++

//
// CollisionBehaviors.cpp : Defines the initialization routines for the DLL.
//
#include "CKAll.h"
#ifdef CK_LIB
#define RegisterBehaviorDeclarations Register_Collisions_BehaviorDeclarations
#define InitInstance _Collisions_InitInstance
#define ExitInstance _Collisions_ExitInstance
#define CKGetPluginInfoCount CKGet_Collisions_PluginInfoCount
#define CKGetPluginInfo CKGet_Collisions_PluginInfo
#define g_PluginInfo g_Collisions_PluginInfo
#else
#define RegisterBehaviorDeclarations RegisterBehaviorDeclarations
#define InitInstance InitInstance
#define ExitInstance ExitInstance
#define CKGetPluginInfoCount CKGetPluginInfoCount
#define CKGetPluginInfo CKGetPluginInfo
#define g_PluginInfo g_PluginInfo
#endif
#ifdef macintosh
#include "Managers/FloorManager.h"
#include "Managers/CollisionManager.h"
#else
#include "Managers\FloorManager.h"
#include "Managers\CollisionManager.h"
#endif
#define COLLISION_BEHAVIOR CKGUID(0x7ee30a69,0x6c475c56)
#define IMPACTFLAGS CKGUID(0x507f4ca4,0x548e153c)
#define OBJECTEXTENTS CKGUID(0x193e0d51,0x54625c8a)
CKPluginInfo g_PluginInfo;
// {secret}
char* CollisionManagerName = "Collision Manager";
// {secret}
char* FloorManagerName = "Floor Manager";
CKERROR CreateCollisionManager(CKContext* context)
{
// we register all the enums related to collision manager
CKParameterManager* pm = context->GetParameterManager();
pm->RegisterNewEnum(CKPGUID_OBSTACLEPRECISION,"Geometry Precision","BoundingBox=1,Faces=2");
pm->RegisterNewEnum(CKPGUID_OBSTACLEPRECISIONBEH,"Geometry Precision (Behavioral)","Automatic=0,BoundingBox=1,Faces=2");
#ifdef __GNUC__
CKGUID ckob = CKPGUID_OBSTACLEPRECISION;
CKGUID cbbl = CKPGUID_BOOL;
pm->RegisterNewStructure(CKPGUID_OBSTACLE,"Obstacle","Obstacle Type,Use Hierarchy?",&ckob,&cbbl);
#else
pm->RegisterNewStructure(CKPGUID_OBSTACLE,"Obstacle","Obstacle Type,Use Hierarchy?",CKPGUID_OBSTACLEPRECISION,CKPGUID_BOOL);
#endif
CKParameterTypeDesc* param_type;
param_type = pm->GetParameterTypeDescription(CKPGUID_OBSTACLEPRECISION);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
new CollisionManager(context);
return CK_OK;
}
CKERROR RemoveCollisionManager(CKContext* context)
{
CKParameterManager* pm = context->GetParameterManager();
pm->UnRegisterParameterType(CKPGUID_OBSTACLEPRECISION);
pm->UnRegisterParameterType(CKPGUID_OBSTACLEPRECISIONBEH);
pm->UnRegisterParameterType(CKPGUID_OBSTACLE);
CollisionManager* man=(CollisionManager*)context->GetManagerByGuid(COLLISION_MANAGER_GUID);
delete man;
return CK_OK;
}
CKERROR CreateFloorManager(CKContext* context)
{
new FloorManager(context);
return CK_OK;
}
CKERROR RemoveFloorManager(CKContext* context)
{
FloorManager* man=(FloorManager*)context->GetManagerByGuid(FLOOR_MANAGER_GUID);
delete man;
return CK_OK;
}
extern char* Network3dName;
CKERROR InitInstance(CKContext* context)
{
CKParameterManager* pm = context->GetParameterManager();
pm->RegisterNewFlags(IMPACTFLAGS,"Impact Data","Touched Obstacle=1,Touched Sub Obstacle=2,Touched Face=4,Touching Face=8,Touched Vertex=16,Touching Vertex=32,Impact World Matrix=64,Impact Point=128,Impact Normal=256,Object Part=512");
pm->RegisterNewEnum(OBJECTEXTENTS,"Object Extents","Point=1,BoundingBox=2");
// We hide the parameters (structures and flags)
CKParameterTypeDesc* param_type;
param_type = pm->GetParameterTypeDescription(IMPACTFLAGS);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type = pm->GetParameterTypeDescription(OBJECTEXTENTS);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
CKAttributeManager* attman = context->GetAttributeManager();
int att = attman->RegisterNewAttributeType(Network3dName,CKPGUID_VOIDBUF,CKCID_GROUP,(CK_ATTRIBUT_FLAGS)(CK_ATTRIBUT_SYSTEM|CK_ATTRIBUT_HIDDEN));
return CK_OK;
}
CKERROR ExitInstance(CKContext* context)
{
CKParameterManager* pm = context->GetParameterManager();
pm->UnRegisterParameterType(IMPACTFLAGS);
pm->UnRegisterParameterType(OBJECTEXTENTS);
CKAttributeManager* attman = context->GetAttributeManager();
attman->UnRegisterAttribute(Network3dName);
return CK_OK;
}
PLUGIN_EXPORT int CKGetPluginInfoCount()
{
return 3;
}
PLUGIN_EXPORT CKPluginInfo* CKGetPluginInfo(int Index)
{
switch (Index) {
case 0:
g_PluginInfo.m_Author="Virtools";
g_PluginInfo.m_Description="Collision Manager";
g_PluginInfo.m_Extension="";
g_PluginInfo.m_Type=CKPLUGIN_MANAGER_DLL;
g_PluginInfo.m_Version=0x000001;
g_PluginInfo.m_InitInstanceFct=CreateCollisionManager;
g_PluginInfo.m_ExitInstanceFct=RemoveCollisionManager;
g_PluginInfo.m_GUID=COLLISION_MANAGER_GUID;
g_PluginInfo.m_Summary=CollisionManagerName;
break;
case 1:
g_PluginInfo.m_Author="Virtools";
g_PluginInfo.m_Description="Floor Manager";
g_PluginInfo.m_Extension="";
g_PluginInfo.m_Type=CKPLUGIN_MANAGER_DLL;
g_PluginInfo.m_Version=0x000001;
g_PluginInfo.m_InitInstanceFct=CreateFloorManager;
g_PluginInfo.m_ExitInstanceFct=RemoveFloorManager;
g_PluginInfo.m_GUID=FLOOR_MANAGER_GUID;
g_PluginInfo.m_Summary=FloorManagerName;
break;
case 2:
g_PluginInfo.m_Author = "Virtools";
g_PluginInfo.m_Description = "Collision Building Blocks";
g_PluginInfo.m_Extension = "";
g_PluginInfo.m_Type = CKPLUGIN_BEHAVIOR_DLL;
g_PluginInfo.m_Version = 0x000001;
g_PluginInfo.m_InitInstanceFct = InitInstance;
g_PluginInfo.m_ExitInstanceFct = ExitInstance;
g_PluginInfo.m_GUID = COLLISION_BEHAVIOR;
g_PluginInfo.m_Summary = "Collision Building Blocks";
break;
}
return &g_PluginInfo;
}
/**********************************************************************************/
/**********************************************************************************/
PLUGIN_EXPORT void RegisterBehaviorDeclarations(XObjectDeclarationArray *reg);
void RegisterBehaviorDeclarations(XObjectDeclarationArray* reg)
{
//////////////////////////////
// COLLISIONS
// Collisions/Obstacle
RegisterBehavior(reg, FillBehaviorAddObstacleDecl);
RegisterBehavior(reg, FillBehaviorDeclareObstaclesDecl);
// Collisions/Character
RegisterBehavior(reg, FillBehaviorCharacterPreventFromCollisionDecl);
// Collisions/3D Entity
RegisterBehavior(reg, FillBehaviorDetectCollisionDecl);
RegisterBehavior(reg, FillBehaviorMultiDetectCollisionDecl);
RegisterBehavior(reg, FillBehaviorObjectBallSliderDecl);
RegisterBehavior(reg, FillBehaviorSimpleManageCollisionDecl);
RegisterBehavior(reg, FillBehaviorTestBBYOverlappingDecl);
// Collisions/Influence
RegisterBehavior(reg, FillBehaviorAvoidingObstacles2Decl);
RegisterBehavior(reg, FillBehaviorHomingMissileDecl);
// Collisions/Intersection
RegisterBehavior(reg, FillBehaviorBoundingSphereIntersectionDecl);
RegisterBehavior(reg, FillBehaviorBoxBoxIntersectionDecl);
RegisterBehavior(reg, FillBehaviorBoxFaceIntersectionDecl);
RegisterBehavior(reg, FillBehaviorFaceFaceIntersectionDecl);
RegisterBehavior(reg, FillBehaviorFrustumObjectIntersectionDecl);
//////////////////////////
// FLOORS
// Characters/Constraint
RegisterBehavior(reg, FillBehaviorCharacterKeepOnFloorDecl);
RegisterBehavior(reg, FillBehaviorCharacterKeepOnFloorV2Decl);
RegisterBehavior(reg, FillBehaviorCharacterKeepOnFloorLimitsDecl);
// 3D Transfo/Constraint
RegisterBehavior(reg, FillBehaviorObjectKeepOnFloorDecl);
RegisterBehavior(reg, FillBehaviorObjectKeepOnFloorV2Decl);
// Collisions/Floors
RegisterBehavior(reg, FillBehaviorDeclareFloorsDecl);
RegisterBehavior(reg, FillBehaviorFloorManagerSetupDecl);
RegisterBehavior(reg, FillBehaviorGetNearestFloorsDecl);
RegisterBehavior(reg, FillBehaviorFloorSliderDecl);
////////////////////////////
// NODAL PATH
RegisterBehavior(reg, FillBehaviorActivateLinkDecl);
RegisterBehavior(reg, FillBehaviorActivateNodeDecl);
RegisterBehavior(reg, FillBehaviorCreateNetwork3dDecl);
RegisterBehavior(reg, FillBehaviorEntityFindPathDecl);
RegisterBehavior(reg, FillBehaviorFindCurvedPathDecl);
RegisterBehavior(reg, FillBehaviorFindPathDecl);
RegisterBehavior(reg, FillBehaviorGoToNodeDecl);
RegisterBehavior(reg, FillBehaviorUpdateNodalPathDecl);
}