ns/releases/valve/source/mod/AvHParticleTemplateClient.cpp

384 lines
12 KiB
C++
Raw Normal View History

#include "AvHParticleTemplateClient.h"
#include "cl_dll/hud.h"
#include "cl_dll/parsemsg.h"
#include "cl_dll/cl_util.h"
#include "cl_dll/parsemsg.h"
#include "cl_dll/demo.h"
#include "common/demo_api.h"
int AvHParticleTemplateListClient::InitializeDemoPlayback(int inSize, unsigned char* inBuffer)
{
// Read one particle template and add it to the list
int theBytesRead = 0;
AvHParticleTemplate theTemplate;
// Read all fields
string theTemplateName;
LoadStringData(theTemplateName, inBuffer, theBytesRead);
theTemplate.SetName(theTemplateName);
uint32 theMaxParticles;
LOAD_DATA(theMaxParticles);
theTemplate.SetMaxParticles(theMaxParticles);
float theParticleSize;
LOAD_DATA(theParticleSize);
theTemplate.SetParticleSize(theParticleSize);
float theParticleSystemLifetime;
LOAD_DATA(theParticleSystemLifetime);
theTemplate.SetParticleSystemLifetime(theParticleSystemLifetime);
float theParticleLifetime;
LOAD_DATA(theParticleLifetime);
theTemplate.SetParticleLifetime(theParticleLifetime);
string theSpriteName;
LoadStringData(theSpriteName, inBuffer, theBytesRead);
theTemplate.SetSprite(theSpriteName);
ShapeType theGenerationShape;
LOAD_DATA(theGenerationShape);
theTemplate.SetGenerationShape(theGenerationShape);
string theGenerationEntityName;
LoadStringData(theGenerationEntityName, inBuffer, theBytesRead);
theTemplate.SetGenerationEntityName(theGenerationEntityName);
string theParticleSystemToGenerate;
LoadStringData(theParticleSystemToGenerate, inBuffer, theBytesRead);
theTemplate.SetParticleSystemToGenerate(theParticleSystemToGenerate);
int theParticleSystemIndexToGenerate;
LOAD_DATA(theParticleSystemIndexToGenerate);
theTemplate.SetParticleSystemIndexToGenerate(theParticleSystemIndexToGenerate);
int theGenerationEntityIndex;
LOAD_DATA(theGenerationEntityIndex);
theTemplate.SetGenerationEntityIndex(theGenerationEntityIndex);
float theGenerationEntityParameter;
LOAD_DATA(theGenerationEntityParameter);
theTemplate.SetGenerationEntityParameter(theGenerationEntityParameter);
ShapeType theStartingVelocityShape;
LOAD_DATA(theStartingVelocityShape);
theTemplate.SetStartingVelocityShape(theStartingVelocityShape);
ParticleParams theGenerationParams;
LOAD_DATA(theGenerationParams);
theTemplate.SetGenerationParams(theGenerationParams);
ParticleParams theStartingVelocityParams;
LOAD_DATA(theStartingVelocityParams);
theTemplate.SetStartingVelocityParams(theStartingVelocityParams);
uint32 theGenerationRate;
LOAD_DATA(theGenerationRate);
theTemplate.SetGenerationRate(theGenerationRate);
int theParticleFlags;
LOAD_DATA(theParticleFlags);
theTemplate.SetFlags(theParticleFlags);
PSVector theGravity;
LOAD_DATA(theGravity);
theTemplate.SetGravity(theGravity);
float theAnimationSpeed;
LOAD_DATA(theAnimationSpeed);
theTemplate.SetAnimationSpeed(theAnimationSpeed);
int theNumSpriteFrames;
LOAD_DATA(theNumSpriteFrames);
theTemplate.SetNumSpriteFrames(theNumSpriteFrames);
float theParticleScaling;
LOAD_DATA(theParticleScaling);
theTemplate.SetParticleScaling(theParticleScaling);
int theRenderMode;
LOAD_DATA(theRenderMode);
theTemplate.SetRenderMode(theRenderMode);
float theMaxAlpha;
LOAD_DATA(theMaxAlpha);
theTemplate.SetMaxAlpha(theMaxAlpha);
// Save the template
this->mTemplateList.push_back(theTemplate);
return theBytesRead;
}
void AvHParticleTemplateListClient::InitializeDemoRecording() const
{
// Loop through all our particle templates, and write out each one
int theNumTemplates = this->GetNumberTemplates();
for(int i = 0; i < theNumTemplates; i++)
{
const AvHParticleTemplate* theTemplate = this->GetTemplateAtIndex(i);
ASSERT(theTemplate);
int theTotalSize = 0;
// Calculate total size needed to store template
string theTemplateName = theTemplate->GetName();
theTotalSize += GetDataSize(theTemplateName);
uint32 theMaxParticles = theTemplate->GetMaxParticles();
theTotalSize += sizeof(theMaxParticles);
float theParticleSize = theTemplate->GetParticleSize();
theTotalSize += sizeof(theParticleSize);
float theParticleSystemLifetime = theTemplate->GetParticleSystemLifetime();
theTotalSize += sizeof(theParticleSystemLifetime);
float theParticleLifetime = theTemplate->GetParticleLifetime();
theTotalSize += sizeof(theParticleLifetime);
string theSpriteName = theTemplate->GetSprite();
theTotalSize += GetDataSize(theSpriteName);
ShapeType theGenerationShape = theTemplate->GetGenerationShape();
theTotalSize += sizeof(theGenerationShape);
string theGenerationEntityName = theTemplate->GetGenerationEntityName();
theTotalSize += GetDataSize(theGenerationEntityName);
string theParticleSystemToGenerate = theTemplate->GetParticleSystemToGenerate();
theTotalSize += GetDataSize(theParticleSystemToGenerate);
int theParticleSystemIndexToGenerate = theTemplate->GetParticleSystemIndexToGenerate();
theTotalSize += sizeof(theParticleSystemIndexToGenerate);
int theGenerationEntityIndex = theTemplate->GetGenerationEntityIndex();
theTotalSize += sizeof(theGenerationEntityIndex);
float theGenerationEntityParam = theTemplate->GetGenerationEntityParameter();
theTotalSize += sizeof(theGenerationEntityParam);
ShapeType theStartingVelocityShape = theTemplate->GetStartingVelocityShape();
theTotalSize += sizeof(theStartingVelocityShape);
ParticleParams theGenerationParams;
theTemplate->GetGenerationParams(theGenerationParams);
theTotalSize += sizeof(theGenerationParams);
ParticleParams theStartingVelocityParams;
theTemplate->GetStartingVelocityParams(theStartingVelocityParams);
theTotalSize += sizeof(theStartingVelocityParams);
uint32 theGenerationRate = theTemplate->GetGenerationRate();
theTotalSize += sizeof(theGenerationRate);
int theParticleFlags = theTemplate->GetFlags();
theTotalSize += sizeof(theParticleFlags);
PSVector theGravity;
theTemplate->GetGravity(theGravity);
theTotalSize += sizeof(theGravity);
float theAnimationSpeed = theTemplate->GetAnimationSpeed();
theTotalSize += sizeof(theAnimationSpeed);
int theNumSpriteFrames = theTemplate->GetNumSpriteFrames();
theTotalSize += sizeof(theNumSpriteFrames);
float theParticleScaling = theTemplate->GetParticleScaling();
theTotalSize += sizeof(theParticleScaling);
int theRenderMode = theTemplate->GetRenderMode();
theTotalSize += sizeof(theRenderMode);
float theMaxAlpha = theTemplate->GetMaxAlpha();
theTotalSize += sizeof(theMaxAlpha);
// New memory
unsigned char* theCharArray = new unsigned char[theTotalSize];
ASSERT(theCharArray);
int theCounter = 0;
// Write out each field
SaveStringData(theCharArray, theTemplateName, theCounter);
SAVE_DATA(theMaxParticles);
SAVE_DATA(theParticleSize);
SAVE_DATA(theParticleSystemLifetime);
SAVE_DATA(theParticleLifetime);
SaveStringData(theCharArray, theSpriteName, theCounter);
SAVE_DATA(theGenerationShape);
SaveStringData(theCharArray, theGenerationEntityName, theCounter);
SaveStringData(theCharArray, theParticleSystemToGenerate, theCounter);
SAVE_DATA(theParticleSystemIndexToGenerate);
SAVE_DATA(theGenerationEntityIndex);
SAVE_DATA(theGenerationEntityParam);
SAVE_DATA(theStartingVelocityShape);
SAVE_DATA(theGenerationParams);
SAVE_DATA(theStartingVelocityParams);
SAVE_DATA(theGenerationRate);
SAVE_DATA(theParticleFlags);
SAVE_DATA(theGravity);
SAVE_DATA(theAnimationSpeed);
SAVE_DATA(theNumSpriteFrames);
SAVE_DATA(theParticleScaling);
SAVE_DATA(theRenderMode);
SAVE_DATA(theMaxAlpha);
// Make sure we wrote exact amount of data we were supposed to
ASSERT(theTotalSize == theCounter);
Demo_WriteBuffer(TYPE_PARTICLES, theTotalSize, theCharArray);
}
}
// Clears out the templates and receives all new ones
int32
AvHParticleTemplateListClient::ReceiveFromNetworkStream()
{
int32 theBytesReceived = 0;
//this->mTemplateList.clear();
// Receive number of templates
//int theNumTemplates = READ_LONG();
//theBytesReceived += 4;
//for(int theLoop = 0; theLoop < theNumTemplates; theLoop++)
//{
// Read each one
AvHParticleTemplate theNewTemplate;
// Read name
char* theName = READ_STRING();
string theStringName = string(theName);
theNewTemplate.SetName(theStringName);
theBytesReceived += theStringName.length();
// Read max particles
uint32 theMaxParticles = READ_LONG();
theNewTemplate.SetMaxParticles(theMaxParticles);
theBytesReceived += 4;
// Read particle size
float theParticleSize = READ_COORD();
theNewTemplate.SetParticleSize(theParticleSize);
theBytesReceived += 4;
// Read sprite name
char* theStr = READ_STRING();
theStringName = theStr;
theNewTemplate.SetSprite(theStringName);
theBytesReceived += theStringName.length();
// Read particle SYSTEM lifetime
float theParticleSystemLifetime = (float)(READ_COORD());
theNewTemplate.SetParticleSystemLifetime(theParticleSystemLifetime);
theBytesReceived += 4;
// Read particle lifetime
float theParticleLifetime = (float)(READ_COORD());
theNewTemplate.SetParticleLifetime(theParticleLifetime);
theBytesReceived += 4;
// Animation speed
float theAnimSpeed = (float)READ_COORD();
theNewTemplate.SetAnimationSpeed(theAnimSpeed);
theBytesReceived += 4;
// Num frames in sprite
int theNumSpriteFrames = READ_BYTE();
theNewTemplate.SetNumSpriteFrames(theNumSpriteFrames);
theBytesReceived++;
// Scale particle over course of its life
float theParticleScaling = (float)READ_COORD();
theNewTemplate.SetParticleScaling(theParticleScaling);
theBytesReceived += 4;
// Render mode
int theRenderMode = READ_BYTE();
theNewTemplate.SetRenderMode(theRenderMode);
theBytesReceived++;
// Read gen rate as long
uint32 theGenRate = READ_LONG();
theNewTemplate.SetGenerationRate(theGenRate);
theBytesReceived += 4;
// Read gen shape
ShapeType theGenerationShape = READ_BYTE();
theNewTemplate.SetGenerationShape(theGenerationShape);
theBytesReceived += 1;
// Read the generation params as 8 longs
uint32 theInnerLoop;
ParticleParams theGenParams;
for(theInnerLoop = 0; theInnerLoop < 8; theInnerLoop++)
{
theGenParams[theInnerLoop] = READ_LONG();
}
theNewTemplate.SetGenerationParams(theGenParams);
theBytesReceived += 32;
// Read generation entity name (if any)
int theGenerationEntityIndex = READ_LONG();
theNewTemplate.SetGenerationEntityIndex(theGenerationEntityIndex);
theBytesReceived += 4;
// Read generation entity param
float theGenerationEntityParam = READ_COORD();
theNewTemplate.SetGenerationEntityParameter(theGenerationEntityParam);
theBytesReceived += 4;
// Read starting velocity shape
ShapeType theStartingVelocityShape = READ_BYTE();
theNewTemplate.SetStartingVelocityShape(theStartingVelocityShape);
theBytesReceived += 1;
// Read the starting velocity params as 8 longs
ParticleParams theVelParams;
for(theInnerLoop = 0; theInnerLoop < 8; theInnerLoop++)
{
theVelParams[theInnerLoop] = READ_LONG();
}
theNewTemplate.SetStartingVelocityParams(theVelParams);
theBytesReceived += 32;
// Read gravity
PSVector theGravity;
for(theInnerLoop = 0; theInnerLoop < 3; theInnerLoop++)
{
theGravity[theInnerLoop] = READ_COORD();
}
theNewTemplate.SetGravity(theGravity);
theBytesReceived += 12;
// Read number initial particles
//int theNumInitialParticles = READ_LONG();
//theNewTemplate.SetInitialParticles(theNumInitialParticles);
//theBytesReceived += 4;
float theMaxAlpha = READ_COORD();
theNewTemplate.SetMaxAlpha(theMaxAlpha);
theBytesReceived += 4;
// Read particle system to generate
int theParticleSystemIndexToGenerate = READ_LONG();
theNewTemplate.SetParticleSystemIndexToGenerate(theParticleSystemIndexToGenerate);
theBytesReceived += 4;
// Read flags
int theFlags = READ_LONG();
theNewTemplate.SetFlags(theFlags);
theBytesReceived += 4;
// Add it on the end
this->mTemplateList.insert(this->mTemplateList.end(), theNewTemplate);
//}
return theBytesReceived;
}