| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- #include "GUICharacter.h"
- #include "../utils/InterfaceUtils.h"
- static char ALIGN_CENTER[] = "Center";
- static char ALIGN_LEFT [] = "Left";
- static char ALIGN_RIGHT [] = "Right";
- static char ALIGN_TOP [] = "Top";
- static char ALIGN_BOTTOM[] = "Bottom";
- static char PLAY_CONTINIOUS [] = "Continious";
- static char PLAY_ONCE_ON_ACTIVATION[] = "Once on activation";
- static char PLAY_ONCE_ON_SHOW [] = "Once on show";
- static char PLAY_ONCE_BY_COMMAND [] = "Once by command";
- GUICharacter::GUICharacter(void)
- {
- m_asp = 4.0f/3.0f;
- m_restart = false;
- }
- GUICharacter::~GUICharacter(void)
- {
- }
- float GUICharacter::SC2UIRC(float t)
- {
- return m_params.useSafeFrame ? InterfaceUtils::ScreenCoord2UIRectCoord(t) : t;
- }
- float GUICharacter::SS2UIRS(float size)
- {
- return m_params.useSafeFrame ? InterfaceUtils::ScreenSize2UIRectSize(size) : size;
- }
- inline float frac(float f)
- {
- return f - floor(f);
- }
- static float round(float x)
- {
- float f = floorf(x);
- if( x - f > 0.5f )
- return f + 1.0f;
- else
- return f;
- }
- void GUICharacter::Begin(float deltaTime, long)
- {
- if( EditMode_IsOn())
- {
- if( !EditMode_IsVisible())
- return;
- ValidateParent();
- }
- Rect r; GetRect(r);
- float cx = r.r - r.l;
- float cy = r.b - r.t;
- if( m_debug || EditMode_IsSelect())
- m_quad.DrawQuad(r.l,r.t,cx,cy,0.0f,0.0f,1.0f,1.0f,10.0f + 0.5f);
- m_view = Render().GetView();
- m_proj = Render().GetProjection();
- m_vp = Render().GetViewport();
- dword sw = m_vp.Width;
- dword sh = m_vp.Height;
- r.l *= 0.01f; r.r *= 0.01f;
- r.t *= 0.01f; r.b *= 0.01f;
- cx *= 0.01f;
- cy *= 0.01f;
- float ww = cx*sw;
- float wh = cy*sh;
- RENDERVIEWPORT vp = {
- m_vp.X + (dword)round(r.l*sw),
- m_vp.Y + (dword)round(r.t*sh),(dword)round(ww) + 1,(dword)round(wh) + 1,0.0f,1.0f};
- Render().SetViewport(vp);
- Matrix view(m_ang,m_pos);
- Matrix proj;
- Render().SetView(view);
- if( m_persp )
- {
- float k = InterfaceUtils::AspectRatio(Render());
- proj.BuildProjection(m_fov,ww/k,wh,0.1f,10.0f);
- }
- // api->Trace("%f %f",m_aspect,m_aspect_native);
- Render().SetProjection(proj);
- }
- void GUICharacter::End (float deltaTime, long)
- {
- Render().SetView (m_view);
- Render().SetProjection(m_proj);
- Render().SetViewport(m_vp);
- }
- void GUICharacter::ReadMOPs(MOPReader &reader)
- {
- string enumStr;
- m_params.useSafeFrame = reader.Bool();
- float width = reader.Float();
- float height = reader.Float();
- if( !Restricted(preserveSize))
- SizeTo(width,height);
- // m_persp = reader.Bool();
- m_persp = true;
- m_debug = reader.Bool();
- m_fov = reader.Float()/180.0f*PI;
- m_ang = reader.Angles();
- m_pos = reader.Position();
- nativeShow = reader.Bool();
- // Show(reader.Bool());
- MissionObject::Activate(true);
- }
- void _cdecl GUICharacter::InitFunc(float, long)
- {
- DelUpdate(&GUICharacter::InitFunc);
- if( m_restart )
- {
- m_restart = false;
- }
- else
- {
- BaseGUIElement *parent = GetParent();
- if( BaseGUIElement *newParent = FindParent())
- {
- newParent->Register(this);
- }
- else
- {
- if( parent )
- parent->UnRegister(this);
- }
- }
- Show(nativeShow);
- }
- void GUICharacter::OnParentNotify(Notification event)
- {
- BaseGUIElement::OnParentNotify(event);
- }
- void GUICharacter::Restart()
- {
- m_restart = true;
- ReCreate();
- }
- bool GUICharacter::Create (MOPReader &reader)
- {
- if( !m_restart )
- {
- Render().GetShaderId("Circular_shadow", Circular_shadow_id);
- Render().GetShaderId("Circular", Circular_id);
- }
- EditMode_Update(reader);
- return true;
- }
- bool GUICharacter::EditMode_Update(MOPReader &reader)
- {
- BaseGUIElement::EditMode_Update(reader);
- ReadMOPs(reader);
- // m_asp = m_aspect > 1.0f ? 4.0f/3.0f : 16.0f/9.0f;
- m_asp = m_aspect_native;
- NotifyChildren(ParentChanged);
- // SetUpdate(&GUICharacter::InitFunc,ML_FIRST);
- SetUpdate(&GUICharacter::InitFunc,ML_FIRST + 2);
- return true;
- }
- void GUICharacter::Show(bool isShow)
- {
- BaseGUIElement::Show(isShow);
- if( EditMode_IsOn())
- {
- DelDrawUpdate();
- }
- if( IsShow())
- {
- SetDrawUpdate();
- }
- else
- {
- DelDrawUpdate();
- }
- }
- void GUICharacter::Activate(bool isActive)
- {
- BaseGUIElement::Activate(isActive);
- }
- static char GUIDescription[] =
- "GUI Character wrapper\n\n"
- " Use to place character into GUI layout\n"
- " NOTE: all sizes-positions are relative (not pixel sizes-positions)\n\n"
- "Commands:\n\n"
- " none";
- MOP_BEGINLISTCG(GUICharacter, "GUI Character", '1.00', 1000, GUIDescription, "Interface")
- // MOP_GROUPBEG("Wide screen layout")
- // MOP_BOOL("Use shift aspect", false)
- // MOP_BOOL("Use width aspect", true)
- MOP_ENUMBEG("Layout")
- MOP_ENUMELEMENT("Left")
- MOP_ENUMELEMENT("Center")
- MOP_ENUMELEMENT("Right")
- MOP_ENUMEND
- MOP_ENUM("Layout", "Layout")
- // MOP_GROUPEND()
- MOP_FLOAT("X position", 0.0f)
- MOP_FLOAT("Y position", 0.0f)
- MOP_FLOATEX("Alpha", 1.0f, 0.0f, 1.0f)
- MOP_STRING("Parent id", "")
- MOP_BOOL("Use safe frame", true)
- MOP_FLOAT("Width" , 25.0f)
- MOP_FLOAT("Height", 25.0f)
- // MOP_BOOL("Perspective", true)
- MOP_BOOL("Debug draw", false)
- MOP_FLOATEX("FOV", 45.0f, 20.0f, 70.0f)
- MOP_ANGLES("Ang", Vector(0.0f,0.0f,0.0f))
- MOP_POSITION("Pos", Vector(0.0f,0.0f,0.5f))
- MOP_BOOL("Visible", true)
- MOP_ENDLIST(GUICharacter)
|