GUICharacter.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #include "GUICharacter.h"
  2. #include "../utils/InterfaceUtils.h"
  3. static char ALIGN_CENTER[] = "Center";
  4. static char ALIGN_LEFT [] = "Left";
  5. static char ALIGN_RIGHT [] = "Right";
  6. static char ALIGN_TOP [] = "Top";
  7. static char ALIGN_BOTTOM[] = "Bottom";
  8. static char PLAY_CONTINIOUS [] = "Continious";
  9. static char PLAY_ONCE_ON_ACTIVATION[] = "Once on activation";
  10. static char PLAY_ONCE_ON_SHOW [] = "Once on show";
  11. static char PLAY_ONCE_BY_COMMAND [] = "Once by command";
  12. GUICharacter::GUICharacter(void)
  13. {
  14. m_asp = 4.0f/3.0f;
  15. m_restart = false;
  16. }
  17. GUICharacter::~GUICharacter(void)
  18. {
  19. }
  20. float GUICharacter::SC2UIRC(float t)
  21. {
  22. return m_params.useSafeFrame ? InterfaceUtils::ScreenCoord2UIRectCoord(t) : t;
  23. }
  24. float GUICharacter::SS2UIRS(float size)
  25. {
  26. return m_params.useSafeFrame ? InterfaceUtils::ScreenSize2UIRectSize(size) : size;
  27. }
  28. inline float frac(float f)
  29. {
  30. return f - floor(f);
  31. }
  32. static float round(float x)
  33. {
  34. float f = floorf(x);
  35. if( x - f > 0.5f )
  36. return f + 1.0f;
  37. else
  38. return f;
  39. }
  40. void GUICharacter::Begin(float deltaTime, long)
  41. {
  42. if( EditMode_IsOn())
  43. {
  44. if( !EditMode_IsVisible())
  45. return;
  46. ValidateParent();
  47. }
  48. Rect r; GetRect(r);
  49. float cx = r.r - r.l;
  50. float cy = r.b - r.t;
  51. if( m_debug || EditMode_IsSelect())
  52. m_quad.DrawQuad(r.l,r.t,cx,cy,0.0f,0.0f,1.0f,1.0f,10.0f + 0.5f);
  53. m_view = Render().GetView();
  54. m_proj = Render().GetProjection();
  55. m_vp = Render().GetViewport();
  56. dword sw = m_vp.Width;
  57. dword sh = m_vp.Height;
  58. r.l *= 0.01f; r.r *= 0.01f;
  59. r.t *= 0.01f; r.b *= 0.01f;
  60. cx *= 0.01f;
  61. cy *= 0.01f;
  62. float ww = cx*sw;
  63. float wh = cy*sh;
  64. RENDERVIEWPORT vp = {
  65. m_vp.X + (dword)round(r.l*sw),
  66. m_vp.Y + (dword)round(r.t*sh),(dword)round(ww) + 1,(dword)round(wh) + 1,0.0f,1.0f};
  67. Render().SetViewport(vp);
  68. Matrix view(m_ang,m_pos);
  69. Matrix proj;
  70. Render().SetView(view);
  71. if( m_persp )
  72. {
  73. float k = InterfaceUtils::AspectRatio(Render());
  74. proj.BuildProjection(m_fov,ww/k,wh,0.1f,10.0f);
  75. }
  76. // api->Trace("%f %f",m_aspect,m_aspect_native);
  77. Render().SetProjection(proj);
  78. }
  79. void GUICharacter::End (float deltaTime, long)
  80. {
  81. Render().SetView (m_view);
  82. Render().SetProjection(m_proj);
  83. Render().SetViewport(m_vp);
  84. }
  85. void GUICharacter::ReadMOPs(MOPReader &reader)
  86. {
  87. string enumStr;
  88. m_params.useSafeFrame = reader.Bool();
  89. float width = reader.Float();
  90. float height = reader.Float();
  91. if( !Restricted(preserveSize))
  92. SizeTo(width,height);
  93. // m_persp = reader.Bool();
  94. m_persp = true;
  95. m_debug = reader.Bool();
  96. m_fov = reader.Float()/180.0f*PI;
  97. m_ang = reader.Angles();
  98. m_pos = reader.Position();
  99. nativeShow = reader.Bool();
  100. // Show(reader.Bool());
  101. MissionObject::Activate(true);
  102. }
  103. void _cdecl GUICharacter::InitFunc(float, long)
  104. {
  105. DelUpdate(&GUICharacter::InitFunc);
  106. if( m_restart )
  107. {
  108. m_restart = false;
  109. }
  110. else
  111. {
  112. BaseGUIElement *parent = GetParent();
  113. if( BaseGUIElement *newParent = FindParent())
  114. {
  115. newParent->Register(this);
  116. }
  117. else
  118. {
  119. if( parent )
  120. parent->UnRegister(this);
  121. }
  122. }
  123. Show(nativeShow);
  124. }
  125. void GUICharacter::OnParentNotify(Notification event)
  126. {
  127. BaseGUIElement::OnParentNotify(event);
  128. }
  129. void GUICharacter::Restart()
  130. {
  131. m_restart = true;
  132. ReCreate();
  133. }
  134. bool GUICharacter::Create (MOPReader &reader)
  135. {
  136. if( !m_restart )
  137. {
  138. Render().GetShaderId("Circular_shadow", Circular_shadow_id);
  139. Render().GetShaderId("Circular", Circular_id);
  140. }
  141. EditMode_Update(reader);
  142. return true;
  143. }
  144. bool GUICharacter::EditMode_Update(MOPReader &reader)
  145. {
  146. BaseGUIElement::EditMode_Update(reader);
  147. ReadMOPs(reader);
  148. // m_asp = m_aspect > 1.0f ? 4.0f/3.0f : 16.0f/9.0f;
  149. m_asp = m_aspect_native;
  150. NotifyChildren(ParentChanged);
  151. // SetUpdate(&GUICharacter::InitFunc,ML_FIRST);
  152. SetUpdate(&GUICharacter::InitFunc,ML_FIRST + 2);
  153. return true;
  154. }
  155. void GUICharacter::Show(bool isShow)
  156. {
  157. BaseGUIElement::Show(isShow);
  158. if( EditMode_IsOn())
  159. {
  160. DelDrawUpdate();
  161. }
  162. if( IsShow())
  163. {
  164. SetDrawUpdate();
  165. }
  166. else
  167. {
  168. DelDrawUpdate();
  169. }
  170. }
  171. void GUICharacter::Activate(bool isActive)
  172. {
  173. BaseGUIElement::Activate(isActive);
  174. }
  175. static char GUIDescription[] =
  176. "GUI Character wrapper\n\n"
  177. " Use to place character into GUI layout\n"
  178. " NOTE: all sizes-positions are relative (not pixel sizes-positions)\n\n"
  179. "Commands:\n\n"
  180. " none";
  181. MOP_BEGINLISTCG(GUICharacter, "GUI Character", '1.00', 1000, GUIDescription, "Interface")
  182. // MOP_GROUPBEG("Wide screen layout")
  183. // MOP_BOOL("Use shift aspect", false)
  184. // MOP_BOOL("Use width aspect", true)
  185. MOP_ENUMBEG("Layout")
  186. MOP_ENUMELEMENT("Left")
  187. MOP_ENUMELEMENT("Center")
  188. MOP_ENUMELEMENT("Right")
  189. MOP_ENUMEND
  190. MOP_ENUM("Layout", "Layout")
  191. // MOP_GROUPEND()
  192. MOP_FLOAT("X position", 0.0f)
  193. MOP_FLOAT("Y position", 0.0f)
  194. MOP_FLOATEX("Alpha", 1.0f, 0.0f, 1.0f)
  195. MOP_STRING("Parent id", "")
  196. MOP_BOOL("Use safe frame", true)
  197. MOP_FLOAT("Width" , 25.0f)
  198. MOP_FLOAT("Height", 25.0f)
  199. // MOP_BOOL("Perspective", true)
  200. MOP_BOOL("Debug draw", false)
  201. MOP_FLOATEX("FOV", 45.0f, 20.0f, 70.0f)
  202. MOP_ANGLES("Ang", Vector(0.0f,0.0f,0.0f))
  203. MOP_POSITION("Pos", Vector(0.0f,0.0f,0.5f))
  204. MOP_BOOL("Visible", true)
  205. MOP_ENDLIST(GUICharacter)