191 lines
5.4 KiB
C++
Executable File
191 lines
5.4 KiB
C++
Executable File
//-----------------------------------------------------------------------------
|
|
// Torque Game Engine
|
|
// Copyright (C) GarageGames.com, Inc.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "ts/tsShapeConstruct.h"
|
|
#include "console/consoleTypes.h"
|
|
#include "core/fileStream.h"
|
|
#include "core/bitStream.h"
|
|
|
|
#define TS_IS_RELATIVE_SEQUENCES 0
|
|
|
|
IMPLEMENT_CO_DATABLOCK_V1(TSShapeConstructor);
|
|
|
|
S32 gNumTransforms = 0;
|
|
S32 gRotTransforms = 0;
|
|
S32 gTransTransforms = 0;
|
|
|
|
TSShapeConstructor::TSShapeConstructor()
|
|
{
|
|
mShape = NULL;
|
|
for (S32 i = 0; i<MaxSequences; i++)
|
|
mSequence[i] = NULL;
|
|
}
|
|
|
|
TSShapeConstructor::~TSShapeConstructor()
|
|
{
|
|
}
|
|
|
|
bool TSShapeConstructor::onAdd()
|
|
{
|
|
if(!Parent::onAdd())
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
bool TSShapeConstructor::preload(bool server, char errorBuffer[256])
|
|
{
|
|
if(!Parent::preload(server, errorBuffer))
|
|
return false;
|
|
|
|
bool error = false;
|
|
hShape = ResourceManager->load(mShape);
|
|
if(!bool(hShape))
|
|
return false;
|
|
|
|
if (hShape->getSequencesConstructed())
|
|
return true;
|
|
|
|
// We want to write into the resource:
|
|
TSShape * shape = const_cast<TSShape*>((const TSShape*)hShape);
|
|
|
|
Stream * f;
|
|
for (S32 i=0; i<MaxSequences; i++)
|
|
{
|
|
if (mSequence[i])
|
|
{
|
|
char fileBuf[256];
|
|
dStrcpy(fileBuf, mSequence[i]);
|
|
|
|
// spaces and tabs indicate the end of the file name:
|
|
char * terminate1 = dStrchr(fileBuf,' ');
|
|
char * terminate2 = dStrchr(fileBuf,'\t');
|
|
if (terminate1 && terminate2)
|
|
// select the earliest one:
|
|
*(terminate1<terminate2 ? terminate1 : terminate2) = '\0';
|
|
else if (terminate1 || terminate2)
|
|
// select the non-null one:
|
|
*(terminate1 ? terminate1 : terminate2) = '\0';
|
|
|
|
f = ResourceManager->openStream(fileBuf);
|
|
if (!f || f->getStatus() != Stream::Ok)
|
|
{
|
|
dSprintf(errorBuffer, 256, "Missing sequence %s for %s",mSequence[i],mShape);
|
|
error = true;
|
|
continue;
|
|
}
|
|
if (!shape->importSequences(f) || f->getStatus()!=Stream::Ok)
|
|
{
|
|
ResourceManager->closeStream(f);
|
|
dSprintf(errorBuffer, 256, "Load sequence %s failed for %s",mSequence[i],mShape);
|
|
return false;
|
|
}
|
|
ResourceManager->closeStream(f);
|
|
|
|
// if there was a space or tab in mSequence[i], then a new name was supplied for it
|
|
// change it here...will still be in fileBuf
|
|
if (terminate1 || terminate2)
|
|
{
|
|
// select the latter one:
|
|
char * nameStart = terminate1<terminate2 ? terminate2 : terminate1;
|
|
do
|
|
nameStart++;
|
|
while ( (*nameStart==' ' || *nameStart=='\t') && *nameStart != '\0' );
|
|
// find the name in the shape (but keep the old one there in case used by something else)
|
|
shape->sequences.last().nameIndex = shape->findName(nameStart);
|
|
if (shape->sequences.last().nameIndex == -1)
|
|
{
|
|
shape->sequences.last().nameIndex = shape->names.size();
|
|
shape->names.increment();
|
|
shape->names.last() = StringTable->insert(nameStart,false);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
if(!error)
|
|
hShape->setSequencesConstructed(true);
|
|
return !error;
|
|
}
|
|
|
|
void TSShapeConstructor::packData(BitStream* stream)
|
|
{
|
|
char *subtext;
|
|
|
|
Parent::packData(stream);
|
|
stream->writeString(mShape);
|
|
|
|
S32 count = 0;
|
|
for (S32 b=0; b<MaxSequences; b++)
|
|
if (mSequence[b])
|
|
count++;
|
|
|
|
stream->writeInt(count,NumSequenceBits);
|
|
|
|
for (S32 i=0; i<MaxSequences; i++)
|
|
if (mSequence[i]) {
|
|
if (TS_IS_RELATIVE_SEQUENCES)
|
|
{
|
|
subtext = (char*)dStrrchr(mSequence[i],'/');
|
|
stream->writeString(subtext);
|
|
}
|
|
else
|
|
{
|
|
stream->writeString(mSequence[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
void TSShapeConstructor::unpackData(BitStream* stream)
|
|
{
|
|
S32 strLen,endLen,pathLen;
|
|
char shapePath[90],pathedSeq[90];
|
|
char *subtext;
|
|
|
|
Parent::unpackData(stream);
|
|
mShape = stream->readSTString();
|
|
|
|
if (TS_IS_RELATIVE_SEQUENCES)
|
|
{
|
|
strLen = (int)dStrlen(mShape);
|
|
subtext = (char*)dStrrchr(mShape,'/');
|
|
endLen = (int)dStrlen(subtext);
|
|
pathLen = (strLen - endLen) ;
|
|
dStrncpy(shapePath,mShape,pathLen);
|
|
shapePath[pathLen] = '\0';
|
|
}
|
|
|
|
S32 i = 0, count = stream->readInt(NumSequenceBits);
|
|
for (; i<count; i++) {
|
|
mSequence[i] = stream->readSTString();
|
|
if (TS_IS_RELATIVE_SEQUENCES) {
|
|
dSprintf(pathedSeq,90,"%s%s",shapePath,mSequence[i]);
|
|
mSequence[i] = StringTable->insert(pathedSeq);
|
|
}
|
|
}
|
|
while (i<MaxSequences)
|
|
mSequence[i++] = NULL;
|
|
}
|
|
|
|
void TSShapeConstructor::initPersistFields()
|
|
{
|
|
Parent::initPersistFields();
|
|
addGroup("Media");
|
|
addField("baseShape", TypeFilename, Offset(mShape, TSShapeConstructor));
|
|
endGroup("Media");
|
|
|
|
char buf[30];
|
|
if (MaxSequences) addGroup("Sequences");
|
|
for (S32 i=0; i<MaxSequences; i++)
|
|
{
|
|
dSprintf(buf,sizeof(buf),"sequence%i",i);
|
|
addField(buf, TypeFilename, OffsetNonConst(mSequence[i], TSShapeConstructor));
|
|
}
|
|
if (MaxSequences) endGroup("Sequences");
|
|
}
|
|
|
|
|