?? interpolator.cpp
字號:
{
Node.Time = DataStream.ReadDWord();
switch(Type)
{
case INTERPOLATOR_TYPE_SCALAR:
{
Node.Vector.x = DataStream.ReadFloat();
break;
}
case INTERPOLATOR_TYPE_SCALAR_INT:
{
Node.Vector.x = static_cast<FLOAT>(DataStream.ReadDWord());
break;
}
case INTERPOLATOR_TYPE_VECTOR2:
{
Node.Vector.x = DataStream.ReadFloat();
Node.Vector.y = DataStream.ReadFloat();
break;
}
case INTERPOLATOR_TYPE_VECTOR3:
{
if(ReverseXZ)
{
Node.Vector.z = DataStream.ReadFloat();
Node.Vector.y = DataStream.ReadFloat();
Node.Vector.x = DataStream.ReadFloat();
}
else
{
Node.Vector.x = DataStream.ReadFloat();
Node.Vector.y = DataStream.ReadFloat();
Node.Vector.z = DataStream.ReadFloat();
}
break;
}
case INTERPOLATOR_TYPE_VECTOR4:
{
Node.Vector.x = DataStream.ReadFloat();
Node.Vector.y = DataStream.ReadFloat();
Node.Vector.z = DataStream.ReadFloat();
Node.Vector.w = DataStream.ReadFloat();
break;
}
}
switch(InterpolationType)
{
case INTERPOLATION_TYPE_HERMITE:
case INTERPOLATION_TYPE_BEZIER:
{
switch(Type)
{
case INTERPOLATOR_TYPE_SCALAR:
{
Node.InTan.x = DataStream.ReadFloat();
Node.OutTan.x = DataStream.ReadFloat();
break;
}
case INTERPOLATOR_TYPE_SCALAR_INT:
{
Node.InTan.x = static_cast<FLOAT>(DataStream.ReadDWord());
Node.OutTan.x = static_cast<FLOAT>(DataStream.ReadDWord());
break;
}
case INTERPOLATOR_TYPE_VECTOR2:
{
Node.InTan.x = DataStream.ReadFloat();
Node.InTan.y = DataStream.ReadFloat();
Node.OutTan.x = DataStream.ReadFloat();
Node.OutTan.y = DataStream.ReadFloat();
break;
}
case INTERPOLATOR_TYPE_VECTOR3:
{
if(ReverseXZ)
{
Node.InTan.z = DataStream.ReadFloat();
Node.InTan.y = DataStream.ReadFloat();
Node.InTan.x = DataStream.ReadFloat();
Node.OutTan.z = DataStream.ReadFloat();
Node.OutTan.y = DataStream.ReadFloat();
Node.OutTan.x = DataStream.ReadFloat();
}
else
{
Node.InTan.x = DataStream.ReadFloat();
Node.InTan.y = DataStream.ReadFloat();
Node.InTan.z = DataStream.ReadFloat();
Node.OutTan.x = DataStream.ReadFloat();
Node.OutTan.y = DataStream.ReadFloat();
Node.OutTan.z = DataStream.ReadFloat();
}
break;
}
case INTERPOLATOR_TYPE_VECTOR4:
{
Node.InTan.x = DataStream.ReadFloat();
Node.InTan.y = DataStream.ReadFloat();
Node.InTan.z = DataStream.ReadFloat();
Node.InTan.w = DataStream.ReadFloat();
Node.OutTan.x = DataStream.ReadFloat();
Node.OutTan.y = DataStream.ReadFloat();
Node.OutTan.z = DataStream.ReadFloat();
Node.OutTan.w = DataStream.ReadFloat();
break;
}
}
break;
}
}
NodeList.push_back(Node);
}
Static = FALSE;
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Saves the interpolator
//+-----------------------------------------------------------------------------
BOOL INTERPOLATOR::Save(TOKEN_OUT_STREAM& TokenStream, INT BaseTab)
{
INT NodeListSize;
std::list<INTERPOLATOR_NODE>::iterator i;
if(Static)
{
TokenStream.WriteTab(BaseTab);
TokenStream.WriteWord("static ");
TokenStream.WriteWord(Name);
TokenStream.WriteWord(" ");
switch(Type)
{
case INTERPOLATOR_TYPE_SCALAR:
{
TokenStream.WriteFloat(StaticVector.x);
break;
}
case INTERPOLATOR_TYPE_SCALAR_INT:
{
TokenStream.WriteInt(static_cast<INT>(StaticVector.x));
break;
}
case INTERPOLATOR_TYPE_VECTOR2:
{
TokenStream.WriteVector2(StaticVector);
break;
}
case INTERPOLATOR_TYPE_VECTOR3:
{
TokenStream.WriteVector3(StaticVector);
break;
}
case INTERPOLATOR_TYPE_VECTOR4:
{
TokenStream.WriteVector4(StaticVector);
break;
}
}
TokenStream.WriteLine(",");
return TRUE;
}
NodeListSize = static_cast<INT>(NodeList.size());
if(NodeListSize <= 0) return TRUE;
TokenStream.WriteTab(BaseTab);
TokenStream.WriteWord(Name);
TokenStream.WriteWord(" ");
TokenStream.WriteInt(NodeListSize);
TokenStream.WriteLine(" {");
TokenStream.WriteTab(BaseTab + 1);
switch(InterpolationType)
{
case INTERPOLATION_TYPE_NONE:
{
TokenStream.WriteLine("DontInterp,");
break;
}
case INTERPOLATION_TYPE_LINEAR:
{
TokenStream.WriteLine("Linear,");
break;
}
case INTERPOLATION_TYPE_HERMITE:
{
TokenStream.WriteLine("Hermite,");
break;
}
case INTERPOLATION_TYPE_BEZIER:
{
TokenStream.WriteLine("Bezier,");
break;
}
}
if(GlobalSequenceId != INVALID_INDEX)
{
TokenStream.WriteTab(BaseTab + 1);
TokenStream.WriteWord("GlobalSeqId ");
TokenStream.WriteInt(GlobalSequenceId);
TokenStream.WriteLine(",");
}
i = NodeList.begin();
while(i != NodeList.end())
{
TokenStream.WriteTab(BaseTab + 1);
TokenStream.WriteInt(i->Time);
TokenStream.WriteWord(": ");
switch(Type)
{
case INTERPOLATOR_TYPE_SCALAR:
{
TokenStream.WriteFloat(i->Vector.x);
TokenStream.WriteLine(",");
if(InterpolationType == INTERPOLATION_TYPE_NONE) break;
if(InterpolationType == INTERPOLATION_TYPE_LINEAR) break;
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("InTan ");
TokenStream.WriteFloat(i->InTan.x);
TokenStream.WriteLine(",");
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("OutTan ");
TokenStream.WriteFloat(i->OutTan.x);
TokenStream.WriteLine(",");
break;
}
case INTERPOLATOR_TYPE_SCALAR_INT:
{
TokenStream.WriteInt(static_cast<INT>(i->Vector.x));
TokenStream.WriteLine(",");
if(InterpolationType == INTERPOLATION_TYPE_NONE) break;
if(InterpolationType == INTERPOLATION_TYPE_LINEAR) break;
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("InTan ");
TokenStream.WriteInt(static_cast<INT>(i->InTan.x));
TokenStream.WriteLine(",");
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("OutTan ");
TokenStream.WriteInt(static_cast<INT>(i->OutTan.x));
TokenStream.WriteLine(",");
break;
}
case INTERPOLATOR_TYPE_VECTOR2:
{
TokenStream.WriteVector2(i->Vector);
TokenStream.WriteLine(",");
if(InterpolationType == INTERPOLATION_TYPE_NONE) break;
if(InterpolationType == INTERPOLATION_TYPE_LINEAR) break;
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("InTan ");
TokenStream.WriteVector2(i->InTan);
TokenStream.WriteLine(",");
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("OutTan ");
TokenStream.WriteVector2(i->OutTan);
TokenStream.WriteLine(",");
break;
}
case INTERPOLATOR_TYPE_VECTOR3:
{
TokenStream.WriteVector3(i->Vector);
TokenStream.WriteLine(",");
if(InterpolationType == INTERPOLATION_TYPE_NONE) break;
if(InterpolationType == INTERPOLATION_TYPE_LINEAR) break;
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("InTan ");
TokenStream.WriteVector3(i->InTan);
TokenStream.WriteLine(",");
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("OutTan ");
TokenStream.WriteVector3(i->OutTan);
TokenStream.WriteLine(",");
break;
}
case INTERPOLATOR_TYPE_VECTOR4:
{
TokenStream.WriteVector4(i->Vector);
TokenStream.WriteLine(",");
if(InterpolationType == INTERPOLATION_TYPE_NONE) break;
if(InterpolationType == INTERPOLATION_TYPE_LINEAR) break;
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("InTan ");
TokenStream.WriteVector4(i->InTan);
TokenStream.WriteLine(",");
TokenStream.WriteTab(BaseTab + 2);
TokenStream.WriteWord("OutTan ");
TokenStream.WriteVector4(i->OutTan);
TokenStream.WriteLine(",");
break;
}
}
i++;
}
TokenStream.WriteTab(BaseTab);
TokenStream.WriteLine("}");
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Loads an interpolator
//+-----------------------------------------------------------------------------
BOOL INTERPOLATOR::Load(TOKEN_IN_STREAM& TokenStream)
{
INT i;
INT NrOfNodes;
INTERPOLATOR_NODE Node;
std::string Token;
std::stringstream Stream;
NodeList.clear();
NrOfNodes = TokenStream.ReadInt();
if(!TokenStream.ExpectChar('{')) return FALSE;
Token = TokenStream.ReadWord();
if(Token == "DontInterp,")
{
InterpolationType = INTERPOLATION_TYPE_NONE;
}
else if(Token == "Linear,")
{
InterpolationType = INTERPOLATION_TYPE_LINEAR;
}
else if(Token == "Hermite,")
{
InterpolationType = INTERPOLATION_TYPE_HERMITE;
}
else if(Token == "Bezier,")
{
InterpolationType = INTERPOLATION_TYPE_BEZIER;
}
else
{
Error.SetMessage("Unable to load \"" + TokenStream.GetFileName() + "\", unknown interpolation mode \"" + Token + "\"!");
return FALSE;
}
for(i = 0; i < NrOfNodes; i++)
{
Token = TokenStream.ReadWord();
if(Token == "GlobalSeqId")
{
GlobalSequenceId = TokenStream.ReadInt();
if(!TokenStream.ExpectChar(',')) return FALSE;
NrOfNodes++;
continue;
}
Stream.clear();
Stream.str(Token);
Node.Time = 0;
Stream >> Node.Time;
switch(Type)
{
case INTERPOLATOR_TYPE_SCALAR:
case INTERPOLATOR_TYPE_SCALAR_INT:
{
Node.Vector.x = TokenStream.ReadFloat();
Node.Vector.y = 0.0f;
Node.Vector.z = 0.0f;
Node.Vector.w = 0.0f;
if(!TokenStream.ExpectChar(',')) return FALSE;
if(InterpolationType == INTERPOLATION_TYPE_NONE) break;
if(InterpolationType == INTERPOLATION_TYPE_LINEAR) break;
if(!TokenStream.ExpectWord("InTan")) return FALSE;
Node.InTan.x = TokenStream.ReadFloat();
Node.InTan.y = 0.0f;
Node.InTan.z = 0.0f;
Node.InTan.w = 0.0f;
if(!TokenStream.ExpectChar(',')) return FALSE;
if(!TokenStream.ExpectWord("OutTan")) return FALSE;
Node.OutTan.x = TokenStream.ReadFloat();
Node.OutTan.y = 0.0f;
Node.OutTan.z = 0.0f;
Node.OutTan.w = 0.0f;
if(!TokenStream.ExpectChar(',')) return FALSE;
break;
}
case INTERPOLATOR_TYPE_VECTOR2:
{
if(!TokenStream.ReadVector2(Node.Vector)) return FALSE;
if(!TokenStream.ExpectChar(',')) return FALSE;
if(InterpolationType == INTERPOLATION_TYPE_NONE) break;
if(InterpolationType == INTERPOLATION_TYPE_LINEAR) break;
if(!TokenStream.ExpectWord("InTan")) return FALSE;
if(!TokenStream.ReadVector2(Node.InTan)) return FALSE;
if(!TokenStream.ExpectChar(',')) return FALSE;
if(!TokenStream.ExpectWord("OutTan")) return FALSE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -