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

148 lines
4.1 KiB
C++

228
%{
#include "Entities/StdH/StdH.h"
#include <Entities/AnimationChanger.h>
%}
class CAnimationHub : CRationalEntity {
name "AnimationHub";
thumbnail "Thumbnails\\AnimationHub.tbn";
features "HasName", "IsTargetable";
properties:
1 CTString m_strName "Name" 'N' = "Animation hub",
2 CTString m_strDescription = "",
3 FLOAT m_tmDelayEach "Delay each" 'D' = 0.0f,
10 CEntityPointer m_penTarget0 "Target0" 'T' COLOR(C_GREEN|0xFF),
11 CEntityPointer m_penTarget1 "Target1" COLOR(C_GREEN|0xFF),
12 CEntityPointer m_penTarget2 "Target2" COLOR(C_GREEN|0xFF),
13 CEntityPointer m_penTarget3 "Target3" COLOR(C_GREEN|0xFF),
14 CEntityPointer m_penTarget4 "Target4" COLOR(C_GREEN|0xFF),
15 CEntityPointer m_penTarget5 "Target5" COLOR(C_GREEN|0xFF),
16 CEntityPointer m_penTarget6 "Target6" COLOR(C_GREEN|0xFF),
17 CEntityPointer m_penTarget7 "Target7" COLOR(C_GREEN|0xFF),
18 CEntityPointer m_penTarget8 "Target8" COLOR(C_GREEN|0xFF),
19 CEntityPointer m_penTarget9 "Target9" COLOR(C_GREEN|0xFF),
20 FLOAT m_tmDelay0 "Delay0" = 0.0f,
21 FLOAT m_tmDelay1 "Delay1" = 0.0f,
22 FLOAT m_tmDelay2 "Delay2" = 0.0f,
23 FLOAT m_tmDelay3 "Delay3" = 0.0f,
24 FLOAT m_tmDelay4 "Delay4" = 0.0f,
25 FLOAT m_tmDelay5 "Delay5" = 0.0f,
26 FLOAT m_tmDelay6 "Delay6" = 0.0f,
27 FLOAT m_tmDelay7 "Delay7" = 0.0f,
28 FLOAT m_tmDelay8 "Delay8" = 0.0f,
29 FLOAT m_tmDelay9 "Delay9" = 0.0f,
100 INDEX m_iModelAnim = 0,
101 BOOL m_bModelLoop = 0,
102 INDEX m_iTextureAnim = 0,
103 BOOL m_bTextureLoop = 0,
104 INDEX m_iLightAnim = 0,
105 BOOL m_bLightLoop = 0,
106 COLOR m_colAmbient = 0,
107 COLOR m_colDiffuse = 0,
110 INDEX m_iCounter = 0,
components:
1 model MODEL_HUB "Models\\Editor\\AnimationHub.mdl",
2 texture TEXTURE_HUB "Models\\Editor\\AnimationHub.tex"
functions:
const CTString &GetDescription(void) const {
((CTString&)m_strDescription).PrintF("-><none>");
if (m_penTarget0!=NULL) {
((CTString&)m_strDescription).PrintF("->%s...",(const char *) m_penTarget0->GetName());
}
return m_strDescription;
}
procedures:
RelayEvents()
{
// for each target
m_iCounter=0;
while(m_iCounter<10) {
// get delay
FLOAT fDelay = m_tmDelayEach + (&m_tmDelay0)[m_iCounter];
// if has delay
if (fDelay>0) {
// wait
autowait(fDelay);
}
// get the target
CEntity *penTarget = (&m_penTarget0)[m_iCounter];
// if no more targets
if (penTarget==NULL) {
// stop
jump WaitChange();
}
// sent event to it
EChangeAnim eca;
eca.iModelAnim = m_iModelAnim ;
eca.bModelLoop = m_bModelLoop ;
eca.iTextureAnim = m_iTextureAnim;
eca.bTextureLoop = m_bTextureLoop;
eca.iLightAnim = m_iLightAnim ;
eca.bLightLoop = m_bLightLoop ;
eca.colAmbient = m_colAmbient ;
eca.colDiffuse = m_colDiffuse ;
penTarget->SendEvent(eca);
m_iCounter++;
}
jump WaitChange();
}
WaitChange()
{
// wait forever
while(TRUE) {
wait() {
on (EChangeAnim eca) : {
m_iModelAnim = eca.iModelAnim ;
m_bModelLoop = eca.bModelLoop ;
m_iTextureAnim = eca.iTextureAnim;
m_bTextureLoop = eca.bTextureLoop;
m_iLightAnim = eca.iLightAnim ;
m_bLightLoop = eca.bLightLoop ;
m_colAmbient = eca.colAmbient ;
m_colDiffuse = eca.colDiffuse ;
jump RelayEvents();
}
}
}
}
Main()
{
InitAsEditorModel();
SetPhysicsFlags(EPF_MODEL_IMMATERIAL);
SetCollisionFlags(ECF_IMMATERIAL);
// set appearance
SetModel(MODEL_HUB);
SetModelMainTexture(TEXTURE_HUB);
// check target types
for (INDEX i=0; i<10; i++) {
CEntityPointer &penTarget = (&m_penTarget0)[i];
if (penTarget!=NULL &&
!IsOfClass(penTarget, "ModelHolder2") &&
!IsOfClass(penTarget, "Light")) {
WarningMessage("All targets must be ModelHolder2 or Light!");
penTarget=NULL;
}
}
jump WaitChange();
}
};