Serious-Engine/Sources/Entities/ModelHolder.es
2016-04-08 00:11:36 +02:00

177 lines
6.3 KiB
C++

203
%{
#include "Entities/StdH/StdH.h"
%}
class CModelHolder : CEntity {
name "ModelHolder";
thumbnail "";
features "HasName", "HasDescription";
properties:
1 CTFileName m_fnModel "Model" 'M' =CTFILENAME("Models\\Editor\\Axis.mdl"),
2 CTFileName m_fnTexture "Texture" 'T' =CTFILENAME("Models\\Editor\\Vector.tex"),
3 FLOAT m_fStretchAll "StretchAll" 'S' = 1.0f,
4 FLOAT m_fStretchX "StretchX" 'X' = 1.0f,
5 FLOAT m_fStretchY "StretchY" 'Y' = 1.0f,
6 FLOAT m_fStretchZ "StretchZ" 'Z' = 1.0f,
7 CTString m_strName "Name" 'N' ="",
12 CTString m_strDescription = "",
8 BOOL m_bColliding "Colliding" 'C' = FALSE, // set if model is not immatierial
9 ANIMATION m_iModelAnimation "Model animation" 'A' = 0,
10 ANIMATION m_iTextureAnimation "Texture animation" = 0,
11 BOOL m_bClusterShadows "Cluster shadows" = FALSE, // set if model uses cluster shadows
13 BOOL m_bBackground "Background" = FALSE, // set if model is rendered in background
// parameters for custom shading of a model (overrides automatic shading calculation)
14 BOOL m_bCustomShading "Custom shading" 'H' = FALSE,
15 ANGLE3D m_aShadingDirection "Light direction" = ANGLE3D( AngleDeg(45.0f),AngleDeg(45.0f),AngleDeg(45.0f)),
16 COLOR m_colLight "Light color" = C_WHITE,
17 COLOR m_colAmbient "Ambient color" = C_BLACK,
18 CTFileName m_fnmLightAnimation "Light animation file" = CTString(""),
19 ANIMATION m_iLightAnimation "Light animation" = 0,
20 CAnimObject m_aoLightAnimation,
{
CTFileName m_fnOldModel; // used for remembering last selected model (not saved at all)
}
components:
functions:
/* Get anim data for given animation property - return NULL for none. */
CAnimData *GetAnimData(SLONG slPropertyOffset)
{
if (slPropertyOffset==offsetof(CModelHolder, m_iModelAnimation)) {
return GetModelObject()->GetData();
} else if (slPropertyOffset==offsetof(CModelHolder, m_iTextureAnimation)) {
return GetModelObject()->mo_toTexture.GetData();
} else if (slPropertyOffset==offsetof(CModelHolder, m_iLightAnimation)) {
return m_aoLightAnimation.GetData();
} else {
return CEntity::GetAnimData(slPropertyOffset);
}
};
/* Adjust model shading parameters if needed. */
BOOL AdjustShadingParameters(FLOAT3D &vLightDirection, COLOR &colLight, COLOR &colAmbient)
{
if (m_bCustomShading) {
// if there is color animation
if (m_aoLightAnimation.GetData()!=NULL) {
// get lerping info
SLONG colFrame0, colFrame1; FLOAT fRatio;
m_aoLightAnimation.GetFrame( colFrame0, colFrame1, fRatio);
UBYTE ubAnimR0, ubAnimG0, ubAnimB0;
UBYTE ubAnimR1, ubAnimG1, ubAnimB1;
ColorToRGB( colFrame0, ubAnimR0, ubAnimG0, ubAnimB0);
ColorToRGB( colFrame1, ubAnimR1, ubAnimG1, ubAnimB1);
// calculate current animation color
FLOAT fAnimR = NormByteToFloat( Lerp( ubAnimR0, ubAnimR1, fRatio));
FLOAT fAnimG = NormByteToFloat( Lerp( ubAnimG0, ubAnimG1, fRatio));
FLOAT fAnimB = NormByteToFloat( Lerp( ubAnimB0, ubAnimB1, fRatio));
// decompose constant colors
UBYTE ubLightR, ubLightG, ubLightB;
UBYTE ubAmbientR, ubAmbientG, ubAmbientB;
ColorToRGB( m_colLight, ubLightR, ubLightG, ubLightB);
ColorToRGB( m_colAmbient, ubAmbientR, ubAmbientG, ubAmbientB);
colLight = RGBToColor( ubLightR *fAnimR, ubLightG *fAnimG, ubLightB *fAnimB);
colAmbient = RGBToColor( ubAmbientR*fAnimR, ubAmbientG*fAnimG, ubAmbientB*fAnimB);
// if there is no color animation
} else {
colLight = m_colLight;
colAmbient = m_colAmbient;
}
AnglesToDirectionVector(m_aShadingDirection, vLightDirection);
vLightDirection = -vLightDirection;
}
return TRUE;
};
/* Init model holder*/
void InitModelHolder(void) {
// stretch factors must not have extreme values
if (m_fStretchX < 0.01f) { m_fStretchX = 0.01f; }
if (m_fStretchY < 0.01f) { m_fStretchY = 0.01f; }
if (m_fStretchZ < 0.01f) { m_fStretchZ = 0.01f; }
if (m_fStretchAll< 0.01f) { m_fStretchAll = 0.01f; }
if (m_fStretchX >100.0f) { m_fStretchX = 100.0f; }
if (m_fStretchY >100.0f) { m_fStretchY = 100.0f; }
if (m_fStretchZ >100.0f) { m_fStretchZ = 100.0f; }
if (m_fStretchAll>100.0f) { m_fStretchAll = 100.0f; }
// if initialized for the first time
if (m_fnOldModel=="") {
// just remember the model filename
m_fnOldModel = m_fnModel;
// if re-initialized
} else {
// if the model filename has changed
if (m_fnOldModel != m_fnModel) {
// set texture filename to same as the model filename with texture extension
m_fnTexture = m_fnModel.FileDir()+m_fnModel.FileName()+CTString(".tex");
// remember the model filename
m_fnOldModel = m_fnModel;
}
}
InitAsModel();
if (m_bColliding) {
SetPhysicsFlags(EPF_MODEL_FIXED);
SetCollisionFlags(ECF_MODEL_HOLDER);
} else {
SetPhysicsFlags(EPF_MODEL_IMMATERIAL);
SetCollisionFlags(ECF_IMMATERIAL);
}
if (m_bClusterShadows) {
SetFlags(GetFlags()|ENF_CLUSTERSHADOWS);
} else {
SetFlags(GetFlags()&~ENF_CLUSTERSHADOWS);
}
if (m_bBackground) {
SetFlags(GetFlags()|ENF_BACKGROUND);
} else {
SetFlags(GetFlags()&~ENF_BACKGROUND);
}
// set model stretch -- MUST BE DONE BEFORE SETTING MODEL!
GetModelObject()->mo_Stretch = FLOAT3D(
m_fStretchAll*m_fStretchX,
m_fStretchAll*m_fStretchY,
m_fStretchAll*m_fStretchZ);
// set appearance
SetModel(m_fnModel);
SetModelMainTexture(m_fnTexture);
GetModelObject()->PlayAnim(m_iModelAnimation, AOF_LOOPING);
GetModelObject()->mo_toTexture.PlayAnim(m_iTextureAnimation, AOF_LOOPING);
try {
m_aoLightAnimation.SetData_t(m_fnmLightAnimation);
} catch (char *strError) {
WarningMessage(TRANS("Cannot load '%s': %s"), (const char*)(CTString&)m_fnmLightAnimation,(const char*) strError);
m_fnmLightAnimation = "";
}
if (m_aoLightAnimation.GetData()!=NULL) {
m_aoLightAnimation.PlayAnim(m_iLightAnimation, AOF_LOOPING);
}
m_strDescription.PrintF("%s,%s", (const char*)m_fnModel.FileName(), (const char*)m_fnTexture.FileName());
return;
};
procedures:
Main()
{
InitModelHolder();
return;
}
};