123
This commit is contained in:
644
CrySystem/ScriptObjectParticle.cpp
Normal file
644
CrySystem/ScriptObjectParticle.cpp
Normal file
@@ -0,0 +1,644 @@
|
||||
// Scale the direction vsector based on fDirVecScale
|
||||
// v3SysDir *= fDirVecScale;// ScriptObjectParticle.cpp: implementation of the CScriptObjectParticle class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "ScriptObjectParticle.h"
|
||||
#include "ScriptObjectVector.h"
|
||||
#include <ISystem.h>
|
||||
#include <I3DEngine.h>
|
||||
#include <IEntitySystem.h>
|
||||
#include <CryParticleSpawnInfo.h>
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
_DECLARE_SCRIPTABLEEX(CScriptObjectParticle)
|
||||
|
||||
CScriptObjectParticle::CScriptObjectParticle()
|
||||
{
|
||||
}
|
||||
|
||||
CScriptObjectParticle::~CScriptObjectParticle()
|
||||
{
|
||||
}
|
||||
|
||||
void CScriptObjectParticle::Init(IScriptSystem *pScriptSystem, ISystem *pSystem)
|
||||
{
|
||||
m_pSystem=pSystem;
|
||||
m_p3DEngine =m_pSystem->GetI3DEngine();
|
||||
InitGlobal(pScriptSystem,"Particle",this);
|
||||
|
||||
}
|
||||
|
||||
void CScriptObjectParticle::InitializeTemplate(IScriptSystem *pSS)
|
||||
{
|
||||
_ScriptableEx<CScriptObjectParticle>::InitializeTemplate(pSS);
|
||||
REG_FUNC(CScriptObjectParticle,CreateParticle);
|
||||
REG_FUNC(CScriptObjectParticle,CreateParticleLine);
|
||||
REG_FUNC(CScriptObjectParticle,SpawnEffect);
|
||||
REG_FUNC(CScriptObjectParticle,CreateDecal);
|
||||
REG_FUNC(CScriptObjectParticle,Attach);
|
||||
REG_FUNC(CScriptObjectParticle,Detach);
|
||||
|
||||
pSS->SetGlobalValue("CRYPARTICLE_ONE_TIME_SPAWN",CryParticleSpawnInfo::FLAGS_ONE_TIME_SPAWN);
|
||||
pSS->SetGlobalValue("CRYPARTICLE_RAIN_MODE",CryParticleSpawnInfo::FLAGS_RAIN_MODE);
|
||||
|
||||
}
|
||||
|
||||
/*!create a particle source
|
||||
@param v3Pos a table with the x,y,z fileds specifing the origin of the particle source
|
||||
@param v3SysDir a table with the x,y,z fileds specifing the direction of the particle source(in degrees)
|
||||
@param pObj a table specifing the particle parameters
|
||||
particle={
|
||||
focus
|
||||
start_color
|
||||
end_color
|
||||
speed
|
||||
rotation
|
||||
count
|
||||
size
|
||||
size_speed
|
||||
gravity
|
||||
lifetime
|
||||
fadeintime
|
||||
frames
|
||||
tid
|
||||
particle_type
|
||||
tail_length
|
||||
physics
|
||||
draw_las
|
||||
color_based_blending
|
||||
blend_type
|
||||
bouncyness
|
||||
init_angles
|
||||
dir_vec_scale
|
||||
stat_obj_entity_id
|
||||
stat_obj_slot
|
||||
stat_obj_count
|
||||
//for child process
|
||||
ChildProcess={
|
||||
//all parameters as a normal particle source
|
||||
}
|
||||
ChildSpawnPeriod
|
||||
}
|
||||
*/
|
||||
int CScriptObjectParticle::CreateParticle(IFunctionHandler *pH)
|
||||
{
|
||||
CHECK_PARAMETERS(3);
|
||||
_SmartScriptObject pObj(m_pScriptSystem,true);
|
||||
_SmartScriptObject pChildObj(m_pScriptSystem,true);
|
||||
CScriptObjectVector oVec(m_pScriptSystem,true);
|
||||
Vec3 v3Pos,v3SysDir,v3Offset(0,0,0);
|
||||
static ParticleParams sParam;
|
||||
|
||||
if(!pH->GetParam(1,*oVec))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> parameter 1 not specified or nil(pos)" );
|
||||
v3Pos=oVec.Get();
|
||||
if(!pH->GetParam(2,*oVec))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> parameter 2 not specified or nil(normal)" );
|
||||
v3SysDir=oVec.Get();
|
||||
if(!pH->GetParam(3,*pObj))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> parameter 3 not specified or nil(perticle struct)" );
|
||||
|
||||
|
||||
ReadParticleTable(*pObj, sParam);
|
||||
sParam.vPosition = v3Pos;
|
||||
sParam.vDirection = v3SysDir;
|
||||
pObj->BeginSetGetChain();
|
||||
if ((sParam).fChildSpawnPeriod && pObj->GetValueChain("ChildProcess", *pChildObj))
|
||||
{
|
||||
ParticleParams sChildParams;
|
||||
ReadParticleTable(*pChildObj, sChildParams);
|
||||
sParam.pChild = &sChildParams;
|
||||
if(!pObj->GetValueChain( "ChildSpawnPeriod",sParam.fChildSpawnPeriod ))
|
||||
sParam.fChildSpawnPeriod=0;
|
||||
}
|
||||
else
|
||||
sParam.pChild = NULL;
|
||||
|
||||
|
||||
//STATIC OBJECT BASED PARTICLES////////////////////////////////////////////////////
|
||||
|
||||
sParam.pStatObj = NULL;
|
||||
INT_PTR nValue=0;
|
||||
int nCookie=0;
|
||||
if(pObj->GetUDValueChain("geometry",nValue,nCookie) && (nCookie==USER_DATA_OBJECT))
|
||||
{
|
||||
sParam.pStatObj=(IStatObj *)nValue;
|
||||
}
|
||||
sParam.vPosition = v3Pos;
|
||||
m_p3DEngine->SpawnParticles(sParam);
|
||||
|
||||
pObj->EndSetGetChain();
|
||||
|
||||
return pH->EndFunction();
|
||||
}
|
||||
/*!create a decal
|
||||
@param v3Pos a table with the x,y,z fileds specifing the origin of the particle source
|
||||
@param v3SysDir a table with the x,y,z fileds specifing the direction of the particle source(in degrees)
|
||||
@param size the size of the decal
|
||||
@param tid the texture
|
||||
@param fAngle rotation in degrees[optional]
|
||||
*/
|
||||
int CScriptObjectParticle::CreateDecal(IFunctionHandler *pH)
|
||||
{
|
||||
|
||||
if (pH->GetParamCount() < 5)
|
||||
{
|
||||
m_pScriptSystem->RaiseError("CreateDecal: Need at least 5 params");
|
||||
return pH->EndFunction();;
|
||||
}
|
||||
|
||||
//CHECK_PARAMETERS(5);
|
||||
CScriptObjectVector oVec(m_pScriptSystem,true);
|
||||
|
||||
CryEngineDecalInfo Decal;
|
||||
int nCookie=0;
|
||||
USER_DATA nUD=0;
|
||||
IStatObj *obj=NULL;
|
||||
pH->GetParam(1,*oVec);
|
||||
Decal.vPos=oVec.Get();
|
||||
pH->GetParam(2,*oVec);
|
||||
Decal.vNormal=oVec.Get();
|
||||
pH->GetParam(3,Decal.fSize);
|
||||
pH->GetParam(4,Decal.fLifeTime);
|
||||
pH->GetParamUDVal(5,Decal.nTid,nCookie);
|
||||
if(pH->GetParamCount()>=6)
|
||||
{
|
||||
if(pH->GetParamUDVal(6,nUD,nCookie))
|
||||
{
|
||||
if(nCookie==USER_DATA_OBJECT)
|
||||
{
|
||||
obj=(IStatObj *)nUD;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(pH->GetParamCount()>=7)
|
||||
{
|
||||
pH->GetParam(7, Decal.fAngle);
|
||||
}
|
||||
|
||||
if(pH->GetParamCount()>=8)
|
||||
{
|
||||
pH->GetParam(8,*oVec);
|
||||
Decal.vHitDirection = oVec.Get();
|
||||
}
|
||||
|
||||
int ownerID = 0;
|
||||
if(pH->GetParamCount()>=9)
|
||||
{
|
||||
pH->GetParam(9, ownerID);
|
||||
}
|
||||
IEntity* owner=m_pSystem->GetIEntitySystem()->GetEntity( ownerID );
|
||||
|
||||
if(pH->GetParamCount()>=10)
|
||||
{
|
||||
pH->GetParam(10, Decal.nPartID);
|
||||
}
|
||||
|
||||
Decal.pDecalOwner = owner;
|
||||
Decal.pStatObj = obj;
|
||||
|
||||
// get IEntityRender of static object decal owner
|
||||
if(pH->GetParamCount()>=11)
|
||||
{
|
||||
ULONG_PTR ptr = 0;
|
||||
int nCookie;
|
||||
if (!pH->GetParamUDVal(11, ptr, nCookie))
|
||||
ptr = 0;
|
||||
if (nCookie != USER_DATA_POINTER)
|
||||
ptr = 0;
|
||||
Decal.pDecalOwner = (IEntityRender*)ptr;
|
||||
}
|
||||
|
||||
m_p3DEngine->CreateDecal(Decal);
|
||||
|
||||
return pH->EndFunction();
|
||||
}
|
||||
|
||||
int CScriptObjectParticle::CreateParticleLine(IFunctionHandler *pH)
|
||||
{
|
||||
CHECK_PARAMETERS(4);
|
||||
_SmartScriptObject pObj(m_pScriptSystem,true);
|
||||
CScriptObjectVector oVec(m_pScriptSystem,true);
|
||||
CScriptObjectColor oCol(m_pScriptSystem,true);
|
||||
Vec3 v3Pos,v3SysDir,v3Offset(0,0,0), vSpaceLoopBoxSize(0,0,0);
|
||||
|
||||
float fDensity;
|
||||
|
||||
pH->GetParam(1,*oVec);
|
||||
v3Pos=oVec.Get();
|
||||
pH->GetParam(2,*oVec);
|
||||
v3SysDir=oVec.Get();
|
||||
pH->GetParam(3,*pObj);
|
||||
pH->GetParam(4,fDensity);
|
||||
|
||||
float focus = 0;
|
||||
Vec3 col;
|
||||
Vec3 vcol(0,0,0);//dummy
|
||||
|
||||
float speed = 0;
|
||||
int count = 0;
|
||||
|
||||
float size = 1;
|
||||
float size_speed = 0;
|
||||
|
||||
float gravity = 0;
|
||||
float lifetime = 0;
|
||||
|
||||
int tid = 0;
|
||||
int frames = 0;
|
||||
|
||||
int color_based_blending = 0;
|
||||
|
||||
int iParticleType = 0;
|
||||
|
||||
float fTailLength = 0.0f;
|
||||
|
||||
int bRealPhys = 0;
|
||||
|
||||
if(!pObj->GetValue( "color",*oCol ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> color field not specified" );
|
||||
vcol = oCol.Get();
|
||||
if(!pObj->GetValue( "focus",focus ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> focus field not specified" );
|
||||
if(!pObj->GetValue( "speed",speed ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> speed field not specified" );
|
||||
if(!pObj->GetValue( "count",count ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> count field not specified" );
|
||||
if(!pObj->GetValue( "size" ,size ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> size field not specified" );
|
||||
|
||||
pObj->GetValue( "size_speed",size_speed ) ;
|
||||
|
||||
if(!pObj->GetValue( "gravity",gravity ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> gravity field not specified" );
|
||||
if(!pObj->GetValue( "lifetime",lifetime )){
|
||||
//m_pScriptSystem->RaiseError( "<CreateParticles> lifetime field not specified" );
|
||||
lifetime=0;
|
||||
}
|
||||
pObj->GetValue( "frames",frames );
|
||||
|
||||
if(!pObj->GetValue( "color_based_blending",color_based_blending ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> color_based_blending field not specified" );
|
||||
|
||||
int nCookie=0;
|
||||
pObj->GetValue( "tid",tid );
|
||||
|
||||
if(!pObj->GetValue( "particle_type", iParticleType ))
|
||||
iParticleType = PART_FLAG_BILLBOARD;
|
||||
if(!pObj->GetValue( "tail_length", fTailLength))
|
||||
fTailLength = 0.0f;
|
||||
if(!pObj->GetValue( "physics", bRealPhys ))
|
||||
bRealPhys = 0;
|
||||
if(pObj->GetValue("offset",*oVec))
|
||||
v3Offset=oVec.Get();
|
||||
if(pObj->GetValue("space_box",*oVec))
|
||||
vSpaceLoopBoxSize=oVec.Get();
|
||||
|
||||
|
||||
float fBouncenes;
|
||||
if(!pObj->GetValue( "bouncyness", fBouncenes))
|
||||
fBouncenes = 0.5f;
|
||||
|
||||
color_based_blending = (color_based_blending == 3) ? 1 : 0;
|
||||
|
||||
col = vcol;
|
||||
Vec3 currentpos;
|
||||
v3SysDir-=v3Pos;
|
||||
float finc = 1.f / (v3SysDir.Length() / fDensity) ;
|
||||
float t = 0;
|
||||
while (t<1.0f)
|
||||
{
|
||||
|
||||
currentpos = (v3Pos + t*v3SysDir)+v3Offset;
|
||||
t+=finc;
|
||||
|
||||
ParticleParams Params;
|
||||
Params.vPosition = currentpos;
|
||||
Params.vDirection = Vec3(0,0,1);
|
||||
Params.fFocus = focus;
|
||||
Params.vColorStart = col;
|
||||
Params.vColorEnd = col;
|
||||
Params.fSpeed = speed;
|
||||
Params.nCount = count;
|
||||
Params.fSize = size;
|
||||
Params.fSizeSpeed = size_speed;
|
||||
Params.vGravity = Vec3 (0,0,-gravity);
|
||||
Params.fLifeTime = lifetime;
|
||||
Params.nTexId = tid;
|
||||
Params.nTexAnimFramesCount = frames;
|
||||
Params.eBlendType = color_based_blending>0 ? ParticleBlendType_ColorBased : ParticleBlendType_AlphaBased;
|
||||
Params.nParticleFlags = iParticleType;
|
||||
Params.bRealPhysics = 0;
|
||||
Params.pChild = NULL;
|
||||
Params.fChildSpawnPeriod = 0;
|
||||
Params.fTailLenght = fTailLength;
|
||||
Params.bRealPhysics = bRealPhys != 0;
|
||||
Params.fBouncenes = fBouncenes;
|
||||
Params.vSpaceLoopBoxSize = vSpaceLoopBoxSize;
|
||||
|
||||
m_p3DEngine->SpawnParticles(Params);
|
||||
}
|
||||
|
||||
return pH->EndFunction();
|
||||
}
|
||||
|
||||
|
||||
bool CScriptObjectParticle::ReadParticleTable(IScriptObject *pITable, ParticleParams &sParamOut)
|
||||
{
|
||||
CScriptObjectColor oCol(m_pScriptSystem,true);
|
||||
Vec3 v3Pos,v3Offset(0,0,0);
|
||||
CScriptObjectVector oVec(m_pScriptSystem,true);
|
||||
|
||||
//default params
|
||||
float focus = 0;
|
||||
Vec3 vStartColor(1,1,1);
|
||||
Vec3 vEndColor(1,1,1);
|
||||
Vec3 vRotation(0,0,0);
|
||||
Vec3 vGravity(0,0,0);
|
||||
float speed = 0;
|
||||
int count = 1;
|
||||
float size = 0.05f;
|
||||
float size_speed = 0;
|
||||
float gravity = 0;
|
||||
float lifetime = 0;
|
||||
float fadeintime = 0;
|
||||
INT_PTR tid = 0;
|
||||
int frames = 0;
|
||||
int draw_last = 0;
|
||||
int blendType = ParticleBlendType_AlphaBased;
|
||||
int color_based_blending = 0;
|
||||
int iParticleType = 0;
|
||||
float fTailLength = 0.0f;
|
||||
int bRealPhys = 0;
|
||||
float fDirVecScale = 1.0f;
|
||||
int nEntityID=0;
|
||||
if(!pITable->BeginSetGetChain())
|
||||
return false;
|
||||
//FOCUS////////////////////////////////////
|
||||
if(!pITable->GetValueChain( "focus",focus ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> focus field not specified" );
|
||||
//START COLOR////////////////////////////////
|
||||
if (pITable->GetValueChain( "start_color",oCol ))
|
||||
vStartColor = oCol.Get();
|
||||
//END COLOR////////////////////////////////
|
||||
if (pITable->GetValueChain( "end_color",oCol ))
|
||||
vEndColor = oCol.Get();
|
||||
//SPEED////////////////////////////////
|
||||
if(!pITable->GetValueChain( "speed",speed ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> speed field not specified" );
|
||||
//ROTATION////////////////////////////////
|
||||
if (pITable->GetValueChain( "rotation",oVec ))
|
||||
vRotation = oVec.Get();
|
||||
//COUNT////////////////////////////////
|
||||
if(!pITable->GetValueChain( "count",count ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> count field not specified" );
|
||||
//SIZE////////////////////////////////
|
||||
if(!pITable->GetValueChain( "size" ,size ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> size field not specified" );
|
||||
//SIZE SPEED////////////////////////////////
|
||||
if(!pITable->GetValueChain( "size_speed",size_speed ))
|
||||
size_speed=0;
|
||||
//GRAVITY////////////////////////////////
|
||||
if (pITable->GetValueChain( "gravity",oVec ))
|
||||
vGravity = oVec.Get();
|
||||
//LIFETIME////////////////////////////////
|
||||
if(!pITable->GetValueChain( "lifetime",lifetime ))
|
||||
m_pScriptSystem->RaiseError( "<CreateParticles> lifetime field not specified" );
|
||||
//FADEINTIME////////////////////////////////
|
||||
if(!pITable->GetValueChain( "fadeintime",fadeintime ))
|
||||
fadeintime=0;//m_pScriptSystem->RaiseError( "<CreateParticles> fadeintime field not specified" );
|
||||
//FRAMES////////////////////////////////
|
||||
if(!pITable->GetValueChain( "frames",frames ))
|
||||
frames=0;
|
||||
//TID////////////////////////////////
|
||||
int nCookie=0;
|
||||
if(!pITable->GetUDValueChain( "tid",tid,nCookie))
|
||||
tid=0;
|
||||
//PARTICLE TYPE////////////////////////////////
|
||||
if(!pITable->GetValueChain( "particle_type", iParticleType ))
|
||||
iParticleType = PART_FLAG_BILLBOARD;
|
||||
//TAIL LENGHT////////////////////////////////
|
||||
if(!pITable->GetValueChain( "tail_length", fTailLength))
|
||||
fTailLength = 0.0f;
|
||||
//PHYSICS////////////////////////////////
|
||||
if(!pITable->GetValueChain( "physics", bRealPhys ))
|
||||
bRealPhys = 0;
|
||||
//DRAW LAST////////////////////////////////
|
||||
if(!pITable->GetValueChain( "draw_last",draw_last ))
|
||||
draw_last=0;
|
||||
//COLOR BASED BLENDING (legacy)////////////////////////////////
|
||||
if (pITable->GetValueChain( "color_based_blending",color_based_blending ))
|
||||
{
|
||||
// This for backward compatability.
|
||||
if (color_based_blending == 3)
|
||||
blendType = ParticleBlendType_ColorBased;
|
||||
}
|
||||
//BLEND TYPE////////////////////////////////
|
||||
// Read particles blending type.
|
||||
pITable->GetValueChain( "blend_type",blendType );
|
||||
//BOUNCENES/////////////////////////////////
|
||||
float fBouncenes;
|
||||
if(!pITable->GetValueChain( "bouncyness", fBouncenes))
|
||||
fBouncenes = 0.5f;
|
||||
//INIT ANGLE/////////////////////////////////
|
||||
Vec3 vAngles(0,0,0);
|
||||
if (pITable->GetValue( "init_angles",oVec ))
|
||||
vAngles = oVec.Get();
|
||||
//bounding box size/////////////////////////////////
|
||||
Vec3 vSpaceLoopBoxSize(0,0,0);
|
||||
if (pITable->GetValue("space_box",*oVec))
|
||||
vSpaceLoopBoxSize=oVec.Get();
|
||||
|
||||
pITable->GetValueChain( "dir_vec_scale", fDirVecScale );
|
||||
|
||||
// turbulence
|
||||
float fTurbulenceSize=0;
|
||||
pITable->GetValueChain( "turbulence_size", fTurbulenceSize);
|
||||
float fTurbulenceSpeed=0;
|
||||
pITable->GetValueChain( "turbulence_speed", fTurbulenceSpeed);
|
||||
int nLinearSizeSpeed=0;
|
||||
pITable->GetValueChain( "bLinearSizeSpeed", nLinearSizeSpeed);
|
||||
|
||||
sParamOut.fPosRandomOffset=0;
|
||||
pITable->GetValueChain( "fPosRandomOffset", sParamOut.fPosRandomOffset);
|
||||
|
||||
float fChildSpawnPeriod=0;
|
||||
pITable->GetValueChain( "ChildSpawnPeriod", fChildSpawnPeriod);
|
||||
|
||||
float fAirResistance=0;
|
||||
pITable->GetValueChain( "AirResistance", fAirResistance);
|
||||
|
||||
// after this line GetValueChain will crash
|
||||
pITable->EndSetGetChain();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
sParamOut.fFocus = focus;
|
||||
sParamOut.vColorStart = vStartColor;
|
||||
sParamOut.vColorEnd = vEndColor;
|
||||
sParamOut.fSpeed = speed;
|
||||
sParamOut.fSpeed.variation = 0.25f;
|
||||
sParamOut.nCount = count;
|
||||
sParamOut.fSize = size;
|
||||
sParamOut.fSizeSpeed = size_speed;
|
||||
sParamOut.vGravity = vGravity;
|
||||
sParamOut.fLifeTime = lifetime;
|
||||
sParamOut.fFadeInTime = fadeintime;
|
||||
|
||||
sParamOut.nTexId = tid;
|
||||
sParamOut.nTexAnimFramesCount = frames;
|
||||
sParamOut.eBlendType = (ParticleBlendType)blendType;
|
||||
|
||||
sParamOut.nParticleFlags = iParticleType;
|
||||
|
||||
if(nLinearSizeSpeed)
|
||||
sParamOut.nParticleFlags |= PART_FLAG_SIZE_LINEAR;
|
||||
|
||||
sParamOut.bRealPhysics = bRealPhys != 0;
|
||||
sParamOut.pChild = NULL;
|
||||
sParamOut.fChildSpawnPeriod = fChildSpawnPeriod;
|
||||
sParamOut.fTailLenght = fTailLength;
|
||||
|
||||
sParamOut.nDrawLast = !draw_last;
|
||||
|
||||
sParamOut.vRotation = vRotation;
|
||||
|
||||
sParamOut.fBouncenes = fBouncenes;
|
||||
|
||||
sParamOut.vInitAngles = vAngles;
|
||||
|
||||
// Scale the direction vsector based on fDirVecScale
|
||||
sParamOut.vDirection *= fDirVecScale;
|
||||
|
||||
sParamOut.fTurbulenceSize=fTurbulenceSize;
|
||||
sParamOut.fTurbulenceSpeed=fTurbulenceSpeed;
|
||||
sParamOut.vSpaceLoopBoxSize = vSpaceLoopBoxSize;
|
||||
|
||||
sParamOut.fAirResistance = fAirResistance;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int CScriptObjectParticle::Attach(IFunctionHandler * pH)
|
||||
{
|
||||
_SmartScriptObject pObj(m_pScriptSystem,true);
|
||||
_SmartScriptObject pChildObj(m_pScriptSystem,true);
|
||||
CScriptObjectVector oVec(m_pScriptSystem,true);
|
||||
Vec3 v3Pos,v3SysDir,v3Offset(0,0,0);
|
||||
int nID,nFlags=0;
|
||||
float fSpawnRate = 0;
|
||||
const char *szBoneName;
|
||||
ParticleParams sParam;
|
||||
CryParticleSpawnInfo cpsi;
|
||||
|
||||
if(!pH->GetParam(1,nID))
|
||||
m_pScriptSystem->RaiseError( "<Particle::Attach> parameter 1 not specified or nil (entity id to attach to)" );
|
||||
if(!pH->GetParam(2,*pObj))
|
||||
m_pScriptSystem->RaiseError( "<Particle::Attach> parameter 2 not specified or nil(particle stuct)" );
|
||||
if(!pH->GetParam(3,fSpawnRate))
|
||||
m_pScriptSystem->RaiseError( "<Particle::Attach> spawn rate not specified" );
|
||||
|
||||
|
||||
IEntity *pEntity = m_pSystem->GetIEntitySystem()->GetEntity(nID);
|
||||
if (!pEntity)
|
||||
{
|
||||
m_pScriptSystem->RaiseError( "<Particle::Attach> specified entity ID does not exist)" );
|
||||
return pH->EndFunctionNull();
|
||||
}
|
||||
|
||||
cpsi.fSpawnRate = fSpawnRate;
|
||||
|
||||
ICryCharInstance *pInstance = pEntity->GetCharInterface()->GetCharacter(0);
|
||||
|
||||
if (pH->GetParam(4,szBoneName))
|
||||
{
|
||||
if (pInstance)
|
||||
{
|
||||
cpsi.nBone = pInstance->GetModel()->GetBoneByName(szBoneName);
|
||||
}
|
||||
|
||||
cpsi.nFlags |= CryParticleSpawnInfo::FLAGS_SPAWN_FROM_BONE;
|
||||
|
||||
if(pH->GetParam(5,*oVec))
|
||||
cpsi.vBonePos = oVec.Get();
|
||||
else
|
||||
cpsi.vBonePos.Set(0,0,0);
|
||||
|
||||
if (pH->GetParam(6,nFlags))
|
||||
cpsi.nFlags = nFlags;
|
||||
}
|
||||
|
||||
ReadParticleTable(*pObj, sParam);
|
||||
/*sParam.vPosition = v3Pos;
|
||||
sParam.vDirection = v3SysDir;
|
||||
*/
|
||||
/* pObj->BeginSetGetChain();
|
||||
if ((sParam).fChildSpawnPeriod && pObj->GetValueChain("ChildProcess", *pChildObj))
|
||||
{
|
||||
ParticleParams sChildParams;
|
||||
ReadParticleTable(*pChildObj, sChildParams);
|
||||
sParam.pChild = &sChildParams;
|
||||
if(!pObj->GetValueChain( "ChildSpawnPeriod",sParam.fChildSpawnPeriod ))
|
||||
sParam.fChildSpawnPeriod=0;
|
||||
}
|
||||
else
|
||||
sParam.pChild = NULL;
|
||||
*/
|
||||
return pH->EndFunction(pInstance->AddParticleEmitter(sParam,cpsi));
|
||||
}
|
||||
|
||||
int CScriptObjectParticle::Detach(IFunctionHandler * pH)
|
||||
{
|
||||
CHECK_PARAMETERS(2);
|
||||
int nID,nHandle;
|
||||
|
||||
pH->GetParam(1,nID);
|
||||
pH->GetParam(2,nHandle);
|
||||
|
||||
IEntity *pEntity = m_pSystem->GetIEntitySystem()->GetEntity(nID);
|
||||
if (!pEntity)
|
||||
{
|
||||
m_pScriptSystem->RaiseError( "<Particle::Detach> specified entity ID does not exist)" );
|
||||
return pH->EndFunction();
|
||||
}
|
||||
|
||||
ICryCharInstance *pInstance = pEntity->GetCharInterface()->GetCharacter(0);
|
||||
|
||||
pInstance->RemoveParticleEmitter(nHandle);
|
||||
|
||||
return pH->EndFunction();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
int CScriptObjectParticle::SpawnEffect(IFunctionHandler *pH)
|
||||
{
|
||||
CScriptObjectVector oVec(m_pScriptSystem,true);
|
||||
Vec3 pos,dir;
|
||||
const char *sEffectName = 0;
|
||||
float fScale = 1.0f;
|
||||
|
||||
if(!pH->GetParam(1,*oVec))
|
||||
m_pScriptSystem->RaiseError( "<SpawnEffect> parameter 1 not specified or nil(pos)" );
|
||||
pos = oVec.Get();
|
||||
if(!pH->GetParam(2,*oVec))
|
||||
m_pScriptSystem->RaiseError( "<SpawnEffect> parameter 2 not specified or nil(normal)" );
|
||||
dir = oVec.Get();
|
||||
if(!pH->GetParam(3,sEffectName))
|
||||
m_pScriptSystem->RaiseError( "<SpawnEffect> parameter 3 not specified or nil(Effect Name)" );
|
||||
// Optional argument for scale.
|
||||
// pH->GetParam(4,fScale);
|
||||
if(pH->GetParamCount()>3)
|
||||
pH->GetParam(4,fScale);
|
||||
|
||||
if (sEffectName)
|
||||
{
|
||||
IParticleEffect *pEffect = m_p3DEngine->FindParticleEffect( sEffectName );
|
||||
if (pEffect)
|
||||
pEffect->Spawn( pos,dir,fScale );
|
||||
}
|
||||
|
||||
return pH->EndFunction();
|
||||
}
|
||||
Reference in New Issue
Block a user