deargui-vpl/ref/virtools/Samples/Behaviors/ParticlesSystem/ParticleSystems.cpp

173 lines
7.6 KiB
C++

//
// ParticlesSystem.cpp : Defines the initialization routines for the DLL.
//
#include "CKAll.h"
#include "behaviors src/ParticleGuids.h"
#include "behaviors src/GeneralParticleSystem.h"
#ifdef CK_LIB
#define RegisterBehaviorDeclarations Register_Particles_BehaviorDeclarations
#define InitInstance _Particles_InitInstance
#define ExitInstance _Particles_ExitInstance
#define CKGetPluginInfoCount CKGet_Particles_PluginInfoCount
#define CKGetPluginInfo CKGet_Particles_PluginInfo
#define g_PluginInfo g_Particles_PluginInfo
#else
#define RegisterBehaviorDeclarations RegisterBehaviorDeclarations
#define InitInstance InitInstance
#define ExitInstance ExitInstance
#define CKGetPluginInfoCount CKGetPluginInfoCount
#define CKGetPluginInfo CKGetPluginInfo
#define g_PluginInfo g_PluginInfo
#endif
/**********************************************************************************/
/**********************************************************************************/
CKERROR InitInstance(CKContext* context)
{
// Manager
ParticleManager* manager = new ParticleManager(context);
// WARNING : deletion ????
CKParameterManager* pm = context->GetParameterManager();
// we register all the enums related to the particle system
pm->RegisterNewEnum(CKPGUID_RENDERMODES,"Particle Rendering","Point=1,Line=2,Sprite=3,Object=4,Orientable Sprite=5,Radial Sprite=6,Fast Sprite=7,Comet=8,PointSprite=9,FixedPointSprite=10");// ,Blurred=7");
// Loop mode
pm->RegisterNewEnum(CKPGUID_LOOPMODE,"Loop Mode","No Loop=0,Loop=1,To and Fro=2");
// Evolution Flags
pm->RegisterNewFlags(CKPGUID_EVOLUTIONS,"Evolutions","Size=1,Color=2,Texture=4");
// Variance Flags
pm->RegisterNewFlags(CKPGUID_VARIANCES,"Variances","Speed=1,Angular Speed=2,Lifespan=4,Emission=8,Initial Size=16,Ending Size=32,Bounce=64,Weight=128,Surface=256,Initial Color=512,Ending Color=1024,Initial Texture=2048,Texture Speed=4096");
// Interactors Managing Flags
pm->RegisterNewFlags(CKPGUID_INTERACTORS,"Particle Interactors Managing","Gravity=1,Global Wind=2,Local Wind=4,Magnet=8,Vortex=16,Disruption Box=32,Atmosphere=64,Mutation Box=128,Tunnel=256,Projector=512");
// Deflectors Managing Flags
pm->RegisterNewFlags(CKPGUID_DEFLECTORS,"Particle Deflectors Managing","Plane=1,Infinite Plane=2,Cylinder=4,Sphere=8,Box=16,Object=32,Outputs Impacts=64,Die On Impact=128");
#ifdef __GNUC__
CKGUID ckflt = CKPGUID_FLOAT;
CKGUID ckclr = CKPGUID_COLOR;
CKGUID ckprt = CKPGUID_PERCENTAGE;
CKGUID ckbl = CKPGUID_BOOL;
// Interactors Structure
pm->RegisterNewStructure(CKPGUID_PARTICLEMUTATION,"Mutation Elements","Size,SizeSpeed,Color,ColorSpeed",&ckflt,&ckflt,&ckclr,&ckflt);
pm->RegisterNewStructure(CKPGUID_PARTICLETUNNEL,"Tunnel Values","Velocity,Radius,Attraction Shape,Attraction Speed,Attraction Direction",&ckflt,&ckflt,&ckflt,&ckflt,&ckflt);
// Deflectors Structure
pm->RegisterNewStructure(CKPGUID_PDEFLECTORS,"Deflectors","Response,Friction,Density",&ckflt,&ckflt,&ckprt);
pm->RegisterNewStructure(CKPGUID_PODEFLECTORS,"Deflectors","Response,Friction,Density,Smoothed Normal",&ckflt,&ckflt,&ckprt,&ckbl);
#else
pm->RegisterNewStructure(CKPGUID_PARTICLEMUTATION,"Mutation Elements","Size,SizeSpeed,Color,ColorSpeed",CKPGUID_FLOAT,CKPGUID_FLOAT,CKPGUID_COLOR,CKPGUID_FLOAT);
pm->RegisterNewStructure(CKPGUID_PARTICLETUNNEL,"Tunnel Values","Velocity,Radius,Attraction Shape,Attraction Speed,Attraction Direction",CKPGUID_FLOAT,CKPGUID_FLOAT,CKPGUID_FLOAT,CKPGUID_FLOAT,CKPGUID_FLOAT);
// Deflectors Structure
pm->RegisterNewStructure(CKPGUID_PDEFLECTORS,"Deflectors","Response,Friction,Density",CKPGUID_FLOAT,CKPGUID_FLOAT,CKPGUID_PERCENTAGE);
pm->RegisterNewStructure(CKPGUID_PODEFLECTORS,"Deflectors","Response,Friction,Density,Smoothed Normal",CKPGUID_FLOAT,CKPGUID_FLOAT,CKPGUID_PERCENTAGE,CKPGUID_BOOL);
#endif
// We hide the parameters (structures and flags)
CKParameterTypeDesc* param_type;
param_type=pm->GetParameterTypeDescription(CKPGUID_RENDERMODES);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_EVOLUTIONS);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_VARIANCES);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_INTERACTORS);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_DEFLECTORS);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_PARTICLEMUTATION);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_PARTICLETUNNEL);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_PDEFLECTORS);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
param_type=pm->GetParameterTypeDescription(CKPGUID_PODEFLECTORS);
if (param_type) param_type->dwFlags|=CKPARAMETERTYPE_HIDDEN;
return CK_OK;
}
CKERROR ExitInstance(CKContext* context)
{
// Manager
ParticleManager* man = (ParticleManager*)context->GetManagerByGuid(PARTICLE_MANAGER_GUID);
delete man;
CKParameterManager* pm = context->GetParameterManager();
pm->UnRegisterParameterType(CKPGUID_RENDERMODES);
pm->UnRegisterParameterType(CKPGUID_LOOPMODE);
pm->UnRegisterParameterType(CKPGUID_EVOLUTIONS);
pm->UnRegisterParameterType(CKPGUID_VARIANCES);
pm->UnRegisterParameterType(CKPGUID_INTERACTORS);
pm->UnRegisterParameterType(CKPGUID_DEFLECTORS);
pm->UnRegisterParameterType(CKPGUID_PARTICLEMUTATION);
pm->UnRegisterParameterType(CKPGUID_PARTICLETUNNEL);
pm->UnRegisterParameterType(CKPGUID_PDEFLECTORS);
pm->UnRegisterParameterType(CKPGUID_PODEFLECTORS);
return CK_OK;
}
#define PARTICLES_BEHAVIOR CKGUID(0x5e7b2d90,0x40cc0ab4)
CKPluginInfo g_PluginInfo[2];
PLUGIN_EXPORT int CKGetPluginInfoCount() { return 2; }
PLUGIN_EXPORT CKPluginInfo* CKGetPluginInfo(int Index)
{
g_PluginInfo[0].m_Author = "Virtools";
g_PluginInfo[0].m_Description = "Particle Systems Building Blocks";
g_PluginInfo[0].m_Extension = "";
g_PluginInfo[0].m_Type = CKPLUGIN_BEHAVIOR_DLL;
g_PluginInfo[0].m_Version = 0x000001;
g_PluginInfo[0].m_InitInstanceFct = NULL;
g_PluginInfo[0].m_ExitInstanceFct = NULL;
g_PluginInfo[0].m_GUID = PARTICLES_BEHAVIOR;
g_PluginInfo[0].m_Summary = "Particle Systems Building Blocks";
g_PluginInfo[1].m_Author = "Virtools";
g_PluginInfo[1].m_Description = "Particle Systems Manager";
g_PluginInfo[1].m_Extension = "";
g_PluginInfo[1].m_Type = CKPLUGIN_MANAGER_DLL;
g_PluginInfo[1].m_Version = 0x000001;
g_PluginInfo[1].m_InitInstanceFct = InitInstance;
g_PluginInfo[1].m_ExitInstanceFct = ExitInstance;
g_PluginInfo[1].m_GUID = PARTICLE_MANAGER_GUID;
g_PluginInfo[1].m_Summary = ParticleManager::Name;
return &g_PluginInfo[Index];
}
PLUGIN_EXPORT void RegisterBehaviorDeclarations(XObjectDeclarationArray *reg);
void RegisterBehaviorDeclarations(XObjectDeclarationArray *reg)
{
RegisterBehavior(reg, FillBehaviorPointParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorLinearParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorPlanarParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorCubicParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorDiscParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorObjectParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorCurveParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorCylindricalParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorSphericalParticleSystemDecl);
RegisterBehavior(reg, FillBehaviorClothSystemDecl);
}