GUIWidget.cpp 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778
  1. #include "GUIWidget.h"
  2. #include "..\utils\InterfaceUtils.h"
  3. #include "BaseGUICursor.h"
  4. //#include "..\..\GMXService\gmx_util.h"
  5. char ALIGN_CENTER[] = "Center";
  6. char ALIGN_LEFT [] = "Left";
  7. char ALIGN_RIGHT [] = "Right";
  8. char ALIGN_TOP [] = "Top";
  9. char ALIGN_BOTTOM[] = "Bottom";
  10. char PLAY_CONTINIOUS [] = "Continious";
  11. char PLAY_ONCE_ON_ACTIVATION[] = "Once on activation";
  12. char PLAY_ONCE_ON_SHOW [] = "Once on show";
  13. char PLAY_ONCE_BY_COMMAND [] = "Once by command";
  14. #include "..\..\..\System\XRender\AdvFont\AdvFont.h"
  15. /*
  16. const int icon_max_count = 16;
  17. static IVBuffer *pVB = NULL;
  18. static IIBuffer *pIB = NULL;
  19. static int refCount = 0;
  20. static IVariable *Texture;
  21. static IBaseTexture *Image;
  22. const dword buffer_size = 1024;
  23. char GUIWidget::buffer[buffer_size*2];
  24. float GUIWidget::font_hk = 0.0f;
  25. */
  26. GUIWidget *GUIWidget::_curText = null; // текущая активная подсказка
  27. ICoreStorageFloat *GUIWidget::_sub = null; // признак показа субтитров
  28. long GUIWidget::_subUsers = 0;
  29. GUIWidget::GUIWidget(void)/* : table(_FL_),
  30. hash (_FL_)*/
  31. {
  32. m_stat = true;
  33. m_statCur = 0;
  34. m_statEnd = 0;
  35. m_statTimeMax = 0.02f;
  36. m_cursor = null;
  37. m_model = null;
  38. m_font = null;
  39. m_restart = false;
  40. m_alpha = 1.0f;
  41. m_lastTime = 0.0f;
  42. m_curTime = 0.0f;
  43. m_shouldPlay = false;
  44. // drawLevel = ML_GUI4;
  45. drawLevel = ML_GUI2;
  46. m_fadeTime = 0.5f;
  47. m_effTime = 0.0f;
  48. effectTime = 0.5f;
  49. effectSize = 2.0f;
  50. m_useAnim = true;
  51. m_time = 0.0f;
  52. m_animSpeed = 3.0f;
  53. m_cutsTime = 0.0f;
  54. effectColor = (dword)-1;
  55. m_hk = 1.0f;
  56. m_parsed = false;
  57. m_needUpdate = false;
  58. // lastImage = null;
  59. m_version = -1;
  60. m_asp = 4.0f/3.0f;
  61. m_fontScale = 1.0f;
  62. /* CreateBuffers();
  63. if( font_hk == 0.0f )
  64. {
  65. IFileService *storage = (IFileService *)api->GetService("FileService");
  66. Assert(storage)
  67. IIniFile *ini = storage->SystemIni();
  68. if( ini )
  69. {
  70. font_hk = ini->GetFloat("Controls","IconMult",1.0f);
  71. }
  72. else
  73. font_hk = 1.0f;
  74. }*/
  75. m_text = null;
  76. //////////////////////
  77. Assert(_subUsers >= 0)
  78. if( _subUsers++ < 1 )
  79. {
  80. Assert(_sub == null)
  81. _sub = api->Storage().GetItemFloat("Options.Subtitles",_FL_);
  82. Assert(_sub)
  83. }
  84. }
  85. GUIWidget::~GUIWidget(void)
  86. {
  87. if( m_text && m_cutsUse )
  88. {
  89. if( _curText == this )
  90. _curText = null;
  91. }
  92. if( m_model )
  93. {
  94. m_model->Release();
  95. m_model = null;
  96. }
  97. if( m_font )
  98. {
  99. m_font->Release();
  100. m_font = null;
  101. }
  102. // if( Mission().ValidatePointer(GetParent(),m_validateHash))
  103. // GetParent()->UnRegister(this);
  104. /* if( !--refCount )
  105. {
  106. if( pIB )
  107. pIB->Release(); pIB = null;
  108. if( pVB )
  109. pVB->Release(); pVB = null;
  110. if( Texture )
  111. Texture->Release();
  112. }*/
  113. if( m_text )
  114. m_text->Release();
  115. /////////////////////
  116. Assert(_subUsers > 0)
  117. if( !--_subUsers )
  118. {
  119. Assert(_sub)
  120. RELEASE(_sub)
  121. }
  122. }
  123. /*
  124. float GUIWidget::SC2UIRC(float t)
  125. {
  126. return m_params.useSafeFrame ? InterfaceUtils::ScreenCoord2UIRectCoord(t) : t;
  127. }
  128. float GUIWidget::SS2UIRS(float size)
  129. {
  130. return m_params.useSafeFrame ? InterfaceUtils::ScreenSize2UIRectSize(size) : size;
  131. }
  132. */
  133. inline float GUIWidget::frac(float f)
  134. {
  135. return f - floor(f);
  136. }
  137. void GUIWidget::RenderBackGround(const Rect &_r/*, float deltaTime*/)
  138. {
  139. if( !EditMode_IsOn() && !m_params.texture[0] )
  140. return;
  141. float tu = frac(m_curFrame*m_params.frameWidth);
  142. float count = 1.0f/m_params.frameWidth;
  143. Rect r = _r;
  144. if( m_effTime > 0.0f )
  145. {
  146. float k = m_effTime/effectTime;
  147. float w = 0.5f*(r.r - r.l);
  148. float h = 0.5f*(r.b - r.t);
  149. r.l -= w*k; r.r += w*k;
  150. r.t -= h*k; r.b += h*k;
  151. }
  152. float width = r.r - r.l;
  153. float height = r.b - r.t;
  154. float tv = m_params.frameHeight*floor(m_curFrame/count);
  155. float al = 1.0f;
  156. if( EditMode_IsOn() && !m_params.texture[0] )
  157. al = 0.5f;
  158. tu += m_params.frameStartU;
  159. tv += m_params.frameStartV;
  160. m_quadRender.DrawQuad(
  161. r.l,r.t,width,height,
  162. // tu,tv,m_params.frameWidth,m_params.frameHeight,10.0f + m_alpha*al*GetAlpha());
  163. tu,tv,m_params.frameWidth,m_params.frameHeight,10.0f + m_alpha*al);
  164. /* if( !m_shouldPlay )
  165. return;
  166. if( m_curTime - m_lastTime >= 1.0f/m_params.fps )
  167. {
  168. m_curFrame++;
  169. if( m_curFrame >= m_params.firstFrame + m_params.framesCount )
  170. {
  171. if( m_params.playMethod != Params::OnceByCommand )
  172. m_curFrame = m_params.firstFrame;
  173. else
  174. m_curFrame--;
  175. if( m_params.playMethod != Params::Continious )
  176. m_shouldPlay = false;
  177. }
  178. m_lastTime = m_curTime;
  179. }*/
  180. /*
  181. // m_curTime += api->GetDeltaTime(); // не стоит использовать движковый DeltaTime
  182. m_curTime += deltaTime;*/
  183. }
  184. void GUIWidget::RenderGeometry(const Rect &r)
  185. {
  186. if( !enableRender )
  187. return;
  188. if( !m_model )
  189. return;
  190. Color c(drawColor); c.a *= m_alpha;
  191. if( c.a < 0.001f )
  192. return;
  193. // Matrix saveView = Render().GetView();
  194. Matrix saveProj = Render().GetProjection();
  195. // Render().SetView (Matrix());
  196. // Render().SetProjection(Matrix());
  197. Matrix proj(true); proj.BuildOrtoProjection(2.0f,2.0f,1.0f,100.0f);
  198. Render().SetProjection(proj);
  199. float width = r.r - r.l;
  200. float height = r.b - r.t;
  201. Vector pos = m_params.position;
  202. pos.x = 2*(pos.x*width /100.0f + r.l/100.0f - 0.5f);
  203. pos.y = 2*(pos.y*height/100.0f - r.t/100.0f + 0.5f - height/100.0f);
  204. pos.z = 5.0f;
  205. Matrix world;
  206. const RENDERVIEWPORT &vp = Render().GetViewport();
  207. float asp = vp.Width/(float)vp.Height;
  208. asp /= InterfaceUtils::AspectRatio(Render());
  209. const float aspect = 1.0f/asp;
  210. float xs = m_params.scale*aspect;
  211. float ys = m_params.scale;
  212. if( m_scale >= 0.0f )
  213. {
  214. xs *= m_scale;
  215. ys *= m_scale;
  216. }
  217. float zs = xs;
  218. world *= Matrix().BuildScale(xs,ys,zs);
  219. world *= Matrix(m_params.orient,pos);
  220. Matrix view = Render().GetView();
  221. view.Inverse();
  222. world *= view;
  223. m_model->SetTransform(world);
  224. // чистим z-буфер под геометрией
  225. Vector vMin(world.MulVertex(m_model->GetBound().vMin));
  226. Vector vMax(world.MulVertex(m_model->GetBound().vMax));
  227. RENDERRECT rect;
  228. rect.x1 = (long)((vMin.x + 1.0f)*0.5f*Render().GetViewport().Width);
  229. rect.x2 = (long)((vMax.x + 1.0f)*0.5f*Render().GetViewport().Width);
  230. rect.y1 = (long)((vMin.y + 1.0f)*0.5f*Render().GetViewport().Height);
  231. rect.y2 = (long)((vMax.y + 1.0f)*0.5f*Render().GetViewport().Height);
  232. Render().Clear(1,&rect,CLEAR_ZBUFFER,0,1.0f,0);
  233. FogParamsSave();
  234. m_model->SetUserColor(c);
  235. m_model->Draw();
  236. FogParamsRestore();
  237. // Render().SetView (saveView);
  238. Render().SetProjection(saveProj);
  239. }
  240. void GUIWidget::RenderText(const Rect &r)
  241. {
  242. if( !m_font )
  243. return;
  244. /* float fh = m_font->GetHeight();
  245. m_font->SetHeight(fh*m_fontScale);
  246. dword cx = Render().GetViewport().Width;
  247. dword cy = Render().GetViewport().Height;
  248. float width = r.r - r.l;
  249. float height = r.b - r.t;
  250. float textX = cx*SC2UIRC((r.l)/100.0f);
  251. float textY = cy*SC2UIRC((r.t)/100.0f);
  252. float outputWidth = cx*SS2UIRS(width /100.0f);
  253. float outputHeight = cy*SS2UIRS(height/100.0f);
  254. float textHeight = m_font->GetHeight()*m_linesCount;
  255. switch( m_params.vertAlign )
  256. {
  257. case Params::Center:
  258. textY += (outputHeight - textHeight)/2;
  259. break;
  260. case Params::Bottom:
  261. textY += (outputHeight - textHeight);
  262. break;
  263. }
  264. dword strBegin = 0;
  265. dword lineNumber = 0;
  266. Vertex *p = (Vertex *)pVB->Lock(0,0,LOCK_DISCARD);
  267. Vertex *q = p + icon_max_count/2*4;
  268. int n = 0;
  269. for( dword i = 0; i < m_params.defaultString.Len(); i++ )
  270. {
  271. if( m_params.defaultString[i] == '\n' )
  272. {
  273. m_params.defaultString[i] = 0;
  274. char *line = (char *)m_params.defaultString.GetBuffer() + strBegin;
  275. float lineWidth = m_font->GetLength(line);
  276. textX = cx*SC2UIRC(r.l/100.0f);
  277. switch( m_params.horizAlign )
  278. {
  279. case Params::Center:
  280. textX += (outputWidth - lineWidth)/2;
  281. break;
  282. case Params::Right:
  283. textX += (outputWidth - lineWidth);
  284. break;
  285. }
  286. Color c = m_params.color;
  287. // c.a *= m_fadeAlpha*GetAlpha();
  288. c.a *= m_alpha;
  289. m_font->SetColor(c);
  290. if( m_effTime > 0.0f && m_parsed )
  291. {
  292. float y = textY + lineNumber*m_font->GetHeight();
  293. if( m_effBeg > 0 )
  294. {
  295. char d = line[m_effBeg];
  296. line[m_effBeg] = 0;
  297. m_font->Print(textX,y,line);
  298. line[m_effBeg] = d;
  299. }
  300. if( m_effBeg + m_effLen < strlen(line))
  301. {
  302. m_font->Print(textX + m_effWidth,y,line + m_effBeg + m_effLen);
  303. }
  304. }
  305. else
  306. {
  307. m_font->Print(textX,textY + lineNumber*m_font->GetHeight(),line);
  308. }
  309. m_strOffX = textX;
  310. m_strOffY = textY + m_font->GetHeight()/2;
  311. if( table )
  312. {
  313. for( int j = 0 ; j < hash[lineNumber] ; j++ )
  314. {
  315. if( n > icon_max_count/2 )
  316. break;
  317. Info &info = table[n++];
  318. float xx = (textX + info.x)/cx;
  319. float yy = (textY + info.y)/cy;
  320. xx = xx*2.0f - 1.0f;
  321. yy = 1.0f - yy*2.0f;
  322. // float sy = info.h/cy*2*m_hk;
  323. float sy = info.h/cy*2;
  324. // float sx = info.w/cx*2*m_hk;
  325. float sx = sy*info.k;
  326. float dx = 0.0f;
  327. float dy = 0.0f;
  328. float ak = 1.0f;
  329. // if( m_useAnim )
  330. if( m_useAnim && info.anim )
  331. // {
  332. // float k = 1.0f + (1.0f - cosf(m_time))*0.5f*0.2f;
  333. // float tx = sx*k;
  334. // float ty = sy*k;
  335. // xx -= (tx - sx)*0.5f;
  336. // yy += (ty - sy)*0.5f;
  337. // sx = tx;
  338. // sy = ty;
  339. // }
  340. {
  341. float k = (1.0f - cosf(m_time))*0.5f*0.1f;
  342. // ak = 1.0f - k*10.0f;
  343. ak = 0.6f - k*10.0f*0.4f;
  344. float tx = sx*(1.0f + k);
  345. float ty = sy*(1.0f + k);
  346. // xx -= (tx - sx)*0.5f + k*sx;
  347. // yy += (ty - sy)*0.5f + k*sy;
  348. dx = (tx - sx)*0.5f + k*sx;
  349. dy = (ty - sy)*0.5f + k*sy;
  350. sx = tx;
  351. sy = ty;
  352. }
  353. ImagePlace &pl = info.p;
  354. float _l = pl.u; float _r = _l + pl.w;
  355. float _t = pl.v; float _b = _t + pl.h;
  356. q[0].p = Vector(xx ,yy - sy,0.0f);
  357. q[1].p = Vector(xx ,yy ,0.0f);
  358. q[2].p = Vector(xx + sx,yy ,0.0f);
  359. q[3].p = Vector(xx + sx,yy - sy,0.0f);
  360. q[0].tu = _l; q[0].tv = _b;
  361. q[1].tu = _l; q[1].tv = _t;
  362. q[2].tu = _r; q[2].tv = _t;
  363. q[3].tu = _r; q[3].tv = _b;
  364. q[0].al = c.a*ak;//m_fadeAlpha;
  365. q[1].al = c.a*ak;//m_fadeAlpha;
  366. q[2].al = c.a*ak;//m_fadeAlpha;
  367. q[3].al = c.a*ak;//m_fadeAlpha;
  368. q += 4;
  369. xx -= dx;
  370. yy += dy;
  371. p[0].p = Vector(xx ,yy - sy,0.0f);
  372. p[1].p = Vector(xx ,yy ,0.0f);
  373. p[2].p = Vector(xx + sx,yy ,0.0f);
  374. p[3].p = Vector(xx + sx,yy - sy,0.0f);
  375. p[0].tu = _l; p[0].tv = _b;
  376. p[1].tu = _l; p[1].tv = _t;
  377. p[2].tu = _r; p[2].tv = _t;
  378. p[3].tu = _r; p[3].tv = _b;
  379. p[0].al = c.a;//m_fadeAlpha;
  380. p[1].al = c.a;//m_fadeAlpha;
  381. p[2].al = c.a;//m_fadeAlpha;
  382. p[3].al = c.a;//m_fadeAlpha;
  383. p += 4;
  384. }
  385. }
  386. m_params.defaultString[i] = '\n';
  387. strBegin = i + 1;
  388. lineNumber++;
  389. }
  390. }
  391. pVB->Unlock();
  392. if( n )
  393. {
  394. Render().SetStreamSource(0,pVB);
  395. Render().SetIndices(pIB,0);
  396. if( Image )
  397. Texture->SetTexture(Image);
  398. Render().DrawIndexedPrimitive(Circular_shadow_id,
  399. PT_TRIANGLELIST,icon_max_count/2*4,n*4,icon_max_count/2*6,n*2);
  400. Render().DrawIndexedPrimitive(Circular_id,
  401. PT_TRIANGLELIST,0,n*4,0,n*2);
  402. }
  403. m_font->SetHeight(fh);*/
  404. if( m_text )
  405. {
  406. m_text->Update(m_time);
  407. m_text->UpdateCutsTime(m_cutsTime);
  408. m_text->SetColor(m_params.color);
  409. m_text->SetAlpha(m_alpha);
  410. // IGUIText::Effect eff;
  411. IAdvFont::Effect eff;
  412. eff.Beg = m_effBeg;
  413. eff.Len = m_effLen; eff.Width = m_effWidth;
  414. m_text->SetScale(m_fontScale);
  415. m_text->SetFakeScale(m_fontScale);
  416. m_text->Draw(true,/*m_font,*/r.l,r.t,true,m_effTime > 0.0f && m_parsed ? &eff : null);
  417. m_text->GetPos(m_strOffX,m_strOffY);
  418. if( !EditMode_IsOn())
  419. {
  420. if( m_cutsUse )
  421. {
  422. if( !m_text->IsTextActive()) // истекло время отображения подсказки
  423. {
  424. if( _curText && _curText == this )
  425. {
  426. _curText = null;
  427. }
  428. Show(false);
  429. }
  430. }
  431. }
  432. }
  433. }
  434. /*
  435. void GUIWidget::Work(float deltaTime, long)
  436. {
  437. // if( m_useAnim )
  438. m_time += deltaTime*20.0f;//*m_animSpeed;
  439. if( EditMode_IsOn())
  440. {
  441. ValidateParent();
  442. }
  443. // if( Controls().GetControlsImage() != lastImage && m_needUpdate )
  444. if( Controls().GetImagesUpdated() != m_updated && m_needUpdate )
  445. UpdateText();
  446. m_alphaOriginal = GetAlpha();
  447. if( GetFadeState() == BaseGUIElement::FadingIn )
  448. {
  449. if( m_fadeAlpha == 0.0f )
  450. m_fadeAlpha = m_alphaOriginal*0.5f;
  451. else
  452. m_fadeAlpha += (deltaTime/m_fadeTime)*m_alphaOriginal*1.5f;
  453. if( m_fadeAlpha > m_alphaOriginal )
  454. {
  455. m_fadeAlpha = m_alphaOriginal; SetFadeState(FadingFinished);
  456. }
  457. }
  458. else
  459. if( GetFadeState() == BaseGUIElement::FadingOut )
  460. {
  461. // m_fadeAlpha -= (deltaTime/m_fadeTime)*m_alphaOriginal*0.7f;
  462. m_fadeAlpha -= (deltaTime/m_fadeTime)*m_alphaOriginal*1.2f;
  463. if( m_fadeAlpha < 0)
  464. {
  465. m_fadeAlpha = 0.0f; SetFadeState(FadingFinished);
  466. // _Show(false);
  467. bool show = nativeShow; _Show(false); nativeShow = show;
  468. }
  469. }
  470. else
  471. {
  472. m_fadeAlpha = m_alphaOriginal;
  473. }
  474. Rect rect; GetRect(rect);
  475. rect.l += m_frameXOffset*m_aspect;
  476. rect.r += m_frameXOffset*m_aspect;
  477. rect.t += m_frameYOffset;
  478. rect.b += m_frameYOffset;
  479. Rect clip; GetParentClipRect(clip);
  480. if( !RectInRect(
  481. clip.l,
  482. clip.t,
  483. clip.r,
  484. clip.b,rect.l,rect.t,rect.r,rect.b))
  485. return;
  486. if( !PointInRect(rect.l,rect.t,clip) ||
  487. !PointInRect(rect.r,rect.b,clip))
  488. SetClipRect(&clip);
  489. // SetAlpha(m_fadeAlpha);
  490. m_alpha = m_fadeAlpha;
  491. // m_alpha = GetAlpha();
  492. // отрисовка картинки
  493. RenderBackGround(rect,deltaTime);
  494. // отрисовка геометрии
  495. RenderGeometry (rect);
  496. // отрисовка текста
  497. RenderText (rect);
  498. if( m_effTime > 0.0f )
  499. {
  500. float k = m_effTime/effectTime;
  501. Color c; c.LerpA(m_params.color,effectColor,k);
  502. m_font->SetHeight(m_params.size*(1.0f + effectSize*k));
  503. m_font->SetColor(c);
  504. char *s = m_params.defaultString.GetDataBuffer() + m_effBeg;
  505. char d = s[m_effLen];
  506. float rx = 0.5f*m_font->GetLength(m_effLen,s);
  507. float ry = 0.5f*m_font->GetHeight();
  508. s[m_effLen] = 0;
  509. m_font->Print(m_strOffX + m_effOffX - rx,m_strOffY - ry,s);
  510. s[m_effLen] = d;
  511. m_font->SetHeight(m_params.size);
  512. m_effTime -= deltaTime;
  513. if( m_effTime < 0.0f )
  514. m_effTime = 0.0f;
  515. }
  516. m_frameXOffset = m_frameYOffset = 0.0f;
  517. SetClipRect(NULL);
  518. }
  519. */
  520. void GUIWidget::Restart()
  521. {
  522. m_restart = true;
  523. ReCreate();
  524. }
  525. void GUIWidget::Work(float deltaTime, long)
  526. {
  527. if( EditMode_IsOn())
  528. {
  529. if( !EditMode_IsVisible())
  530. return;
  531. ValidateParent();
  532. }
  533. Draw();
  534. Update(deltaTime);
  535. }
  536. void GUIWidget::Update(float deltaTime)
  537. {
  538. if( m_stat && m_statCur != m_statEnd && m_text )
  539. {
  540. m_statTime -= deltaTime;
  541. if( m_statTime <= 0.0f )
  542. {
  543. int d = 1;
  544. if( m_statTimeMax < deltaTime )
  545. {
  546. d = int(deltaTime/m_statTimeMax + 0.5f);
  547. }
  548. if( m_statCur < m_statEnd )
  549. {
  550. m_statCur += d;
  551. if( m_statCur > m_statEnd )
  552. m_statCur = m_statEnd;
  553. }
  554. else
  555. {
  556. m_statCur -= d;
  557. if( m_statCur < m_statEnd )
  558. m_statCur = m_statEnd;
  559. }
  560. char buf[32];
  561. sprintf_s(buf,sizeof(buf),"%d",m_statCur);
  562. /////////////////////////////////
  563. // m_params.defaultString = buf;
  564. // m_params.defaultPtr = m_params.defaultString.c_str();
  565. m_initString = buf;
  566. m_initPtr = m_initString.c_str();
  567. m_params.defaultPtr = m_initPtr;
  568. /////////////////////////////////
  569. m_text->Prepare(true,GetWidth()*m_aspect*m_widthAspectKoef,GetHeight(),m_params.defaultPtr,
  570. m_params.horizAlign,m_params.vertAlign,m_params.useSafeFrame,false);
  571. m_statTime = m_statTimeMax;
  572. }
  573. }
  574. // if( m_useAnim )
  575. // m_time += deltaTime*20.0f;//*m_animSpeed;
  576. m_time += deltaTime*m_animSpeed;
  577. m_cutsTime += deltaTime;
  578. // if( Controls().GetControlsImage() != lastImage && m_needUpdate )
  579. // if( Controls().GetImagesUpdated() != m_updated && m_needUpdate )
  580. // UpdateText(true);
  581. // m_alphaOriginal = GetAlpha();
  582. // m_alphaOriginal = 1.0f;
  583. if( GetFadeState() == BaseGUIElement::FadingIn )
  584. {
  585. float t = m_alphaOriginal*0.5f;
  586. if( m_fadeAlpha < t )
  587. m_fadeAlpha = t;
  588. else
  589. m_fadeAlpha += (deltaTime/m_fadeTime)*m_alphaOriginal*1.5f;
  590. if( m_fadeAlpha > m_alphaOriginal )
  591. {
  592. m_fadeAlpha = m_alphaOriginal; SetFadeState(FadingFinished);
  593. }
  594. SetAlpha(m_fadeAlpha);
  595. }
  596. else
  597. if( GetFadeState() == BaseGUIElement::FadingOut )
  598. {
  599. // m_fadeAlpha -= (deltaTime/m_fadeTime)*m_alphaOriginal*0.7f;
  600. m_fadeAlpha -= (deltaTime/m_fadeTime)*m_alphaOriginal*1.2f;
  601. if( m_fadeAlpha < 0)
  602. {
  603. m_fadeAlpha = 0.0f; SetFadeState(FadingFinished);
  604. // _Show(false);
  605. bool show = nativeShow; _Show(false); nativeShow = show;
  606. }
  607. SetAlpha(m_fadeAlpha);
  608. }
  609. else
  610. {
  611. // m_fadeAlpha = m_alphaOriginal;
  612. // m_fadeAlpha = GetAlpha();
  613. }
  614. if( m_effTime > 0.0f )
  615. {
  616. m_effTime -= deltaTime;
  617. if( m_effTime < 0.0f )
  618. m_effTime = 0.0f;
  619. }
  620. if( m_shouldPlay )
  621. {
  622. if( m_curTime - m_lastTime >= 1.0f/m_params.fps )
  623. {
  624. m_curFrame++;
  625. if( m_curFrame >= m_params.firstFrame + m_params.framesCount )
  626. {
  627. if( m_params.playMethod != Params::OnceByCommand )
  628. m_curFrame = m_params.firstFrame;
  629. else
  630. m_curFrame--;
  631. if( m_params.playMethod != Params::Continious )
  632. m_shouldPlay = false;
  633. }
  634. m_lastTime = m_curTime;
  635. }
  636. }
  637. m_curTime += deltaTime;
  638. bool click = Controls().GetControlStateType(m_click) == CST_ACTIVATED;
  639. bool dblcl = Controls().GetControlStateType(m_dblcl) == CST_ACTIVATED;
  640. if( !click && !dblcl )
  641. return;
  642. /* if( EditMode_IsOn())
  643. {
  644. if( !m_cursor || !ValidatePointer(m_cursor,m_cursorHash))
  645. m_cursor = (BaseGUICursor *)FindObject(InterfaceUtils::GetCursorName());
  646. }*/
  647. if( !m_cursor || m_cursor->IsHided())
  648. return;
  649. float x,y; m_cursor->GetPosition(x,y);
  650. x *= 100.0f;
  651. y *= 100.0f;
  652. Rect r; GetParentClipRect(r);
  653. if( !PointInRect(x,y,r))
  654. return;
  655. GetRect(r);
  656. if( !PointInRect(x,y,r))
  657. return;
  658. if( click )
  659. NotifyParent(this,ChildClicked);
  660. if( dblcl )
  661. NotifyParent(this,ChildDblClicked);
  662. }
  663. void GUIWidget::Draw()
  664. {
  665. if( InterfaceUtils::IsHide())
  666. return;
  667. if( m_needUpdate )
  668. {
  669. if( Controls().GetControlsImage() == null ) // render device is lost
  670. {
  671. if( m_text )
  672. m_text->ResetImage();
  673. }
  674. else
  675. {
  676. if( Controls().GetControlsImageVersion() != m_version )
  677. UpdateText(true);
  678. }
  679. }
  680. Rect rect; GetRect(rect);
  681. rect.l += m_frameXOffset*m_aspect;
  682. rect.r += m_frameXOffset*m_aspect;
  683. rect.t += m_frameYOffset;
  684. rect.b += m_frameYOffset;
  685. Rect clip; GetParentClipRect(clip);
  686. if( !RectInRect(
  687. clip.l,
  688. clip.t,
  689. clip.r,
  690. clip.b,rect.l,rect.t,rect.r,rect.b))
  691. return;
  692. if( !PointInRect(rect.l,rect.t,clip) ||
  693. !PointInRect(rect.r,rect.b,clip))
  694. SetClipRect(&clip);
  695. // SetAlpha(m_fadeAlpha);
  696. // m_alpha = m_fadeAlpha;
  697. m_alpha = GetAlpha();
  698. if( !IsShow())
  699. m_alpha = GetNativeAlpha();
  700. // m_alpha = GetAlpha();
  701. // отрисовка картинки
  702. RenderBackGround(rect/*,deltaTime*/);
  703. // отрисовка геометрии
  704. RenderGeometry (rect);
  705. // отрисовка текста
  706. RenderText (rect);
  707. if( m_effTime > 0.0f && m_parsed )
  708. {
  709. float k = m_effTime/effectTime;
  710. Color c; c.LerpA(m_params.color,effectColor,k);
  711. m_font->SetHeight(m_params.size*(1.0f + effectSize*k));
  712. m_font->SetColor(c);
  713. char *s = m_params.defaultString.GetDataBuffer() + m_effBeg;
  714. char d = s[m_effLen];
  715. float rx = 0.5f*m_font->GetLength(m_effLen,s);
  716. float ry = 0.5f*m_font->GetHeight();
  717. s[m_effLen] = 0;
  718. m_font->Print(m_strOffX + m_effOffX - rx,m_strOffY - ry,s);
  719. s[m_effLen] = d;
  720. m_font->SetHeight(m_params.size);
  721. }
  722. m_frameXOffset = m_frameYOffset = 0.0f;
  723. SetClipRect(NULL);
  724. }
  725. void GUIWidget::Draw(float x, float y, float alpha, bool inner)
  726. {
  727. if( InterfaceUtils::IsHide())
  728. return;
  729. // if( Controls().GetControlsImage() != lastImage && m_needUpdate )
  730. if( m_needUpdate )
  731. {
  732. if( Controls().GetControlsImage() == null ) // render device is lost
  733. {
  734. if( m_text )
  735. m_text->ResetImage();
  736. }
  737. else
  738. {
  739. if( Controls().GetControlsImageVersion() != m_version )
  740. UpdateText(true);
  741. }
  742. }
  743. Rect rect; GetRect(rect);
  744. float cx = rect.r - rect.l;
  745. float cy = rect.b - rect.t;
  746. if( inner )
  747. {
  748. Rect clip; GetParentClipRect(clip);
  749. if( !RectInRect(
  750. clip.l,
  751. clip.t,
  752. clip.r,
  753. clip.b,rect.l,rect.t,rect.r,rect.b))
  754. return;
  755. if( !PointInRect(rect.l,rect.t,clip) ||
  756. !PointInRect(rect.r,rect.b,clip))
  757. SetClipRect(&clip);
  758. }
  759. else
  760. {
  761. x = x*100.0f - cx*0.5f;
  762. y = y*100.0f - cy*0.5f;
  763. rect.l = x; rect.r = x + cx;
  764. rect.t = y; rect.b = y + cy;
  765. }
  766. if( EditMode_IsOn() || m_params.texture[0] )
  767. {
  768. m_quadRender.DrawQuad(rect.l,rect.t,cx,cy,0.0f,0.0f,
  769. m_params.frameWidth ,
  770. m_params.frameHeight,10.0f + alpha);
  771. }
  772. float a = m_alpha;
  773. m_alpha = alpha;
  774. float f = m_fadeAlpha;
  775. m_fadeAlpha = alpha;
  776. RenderGeometry(rect);
  777. RenderText (rect);
  778. m_alpha = a;
  779. m_fadeAlpha = f;
  780. if( inner )
  781. SetClipRect(NULL);
  782. }
  783. bool GUIWidget::IsPlayingAnimation()
  784. {
  785. return m_shouldPlay;
  786. }
  787. void GUIWidget::SkipMOPs(MOPReader &reader)
  788. {
  789. if( m_text && m_cutsUse )
  790. {
  791. if( _curText == this )
  792. _curText = null;
  793. }
  794. reader.Bool(); // use safe frame
  795. reader.Float(); // width
  796. reader.Float(); // height
  797. reader.Long(); // draw priority
  798. reader.Bool(); // use fading
  799. reader.Bool(); // use effect
  800. reader.Float(); // effect time
  801. reader.Float(); // effect size
  802. reader.Colors(); // effect color
  803. m_params.stringID = reader.LocString();
  804. m_initPtr = reader.String().c_str();
  805. if( m_params.stringID[0] )
  806. m_initPtr = m_params.stringID;
  807. // m_params.defaultString = m_initPtr;
  808. m_params.defaultPtr = m_initPtr;
  809. reader.String().c_str(); // font name
  810. reader.Float(); // font size
  811. reader.Float(); // font kerning
  812. reader.Colors(); // font color
  813. reader.Enum(); // text hor align
  814. reader.Enum(); // text ver align
  815. //// statistic effect ////
  816. reader.Bool(); // numeric
  817. reader.Float(); // update time
  818. //////////////////////////
  819. reader.String().c_str(); // model name
  820. reader.String().c_str(); // anim name
  821. reader.Position(); // model pos
  822. reader.Angles(); // model ang
  823. reader.Float(); // model scale
  824. //// render params ////
  825. reader.Bool(); // skip fog
  826. reader.Colors(); // draw color
  827. reader.Bool(); // smooth alpha
  828. reader.Bool(); // enable render
  829. reader.Bool(); // dynamic lighting
  830. ///////////////////////
  831. reader.String().c_str(); // texture name
  832. reader.Bool(); // is black&white
  833. m_curFrame = m_params.firstFrame = reader.Long();
  834. reader.Long(); // frames count
  835. reader.Float(); // frame offset
  836. reader.Float(); //
  837. reader.Float(); // frame width
  838. reader.Float(); // frame height
  839. reader.Long(); // fps
  840. reader.Enum(); // play method
  841. /////////////////
  842. reader.Bool(); // cuts use
  843. reader.Float(); // cuts delay
  844. reader.Long(); // cuts priority
  845. reader.Bool(); // cuts debug
  846. /////////////////
  847. m_alphaOriginal = GetNativeAlpha();
  848. if( m_fading )
  849. SetAlpha(0.0f);
  850. SetFadeState(FadingFinished);
  851. reader.Float(); // anim speed
  852. nativeShow = reader.Bool();
  853. MissionObject::Show(false);
  854. m_fade = 0.0f;
  855. m_fadeAlpha = 0.0f;
  856. MissionObject::Activate(true);
  857. }
  858. void GUIWidget::ReadMOPs(MOPReader &reader)
  859. {
  860. if( m_text && m_cutsUse )
  861. {
  862. if( _curText == this )
  863. _curText = null;
  864. }
  865. // m_cursor = (BaseGUICursor *)FindObject(InterfaceUtils::GetCursorName());
  866. m_cursor = null;
  867. // string enumStr;
  868. const char *enumStr;
  869. m_params.useSafeFrame = reader.Bool();
  870. float width = reader.Float();
  871. float height = reader.Float();
  872. // m_initPtr = null;
  873. if( !Restricted(preserveSize))
  874. SizeTo(width,height);
  875. m_natSize.w = width;
  876. m_natSize.h = height;
  877. m_params.drawPriority = reader.Long();
  878. drawShift = 0;
  879. m_fading = reader.Bool();
  880. m_effect = reader.Bool();
  881. // m_effBeg = reader.Long();
  882. // m_effLenNative = reader.Long();
  883. effectTime = reader.Float();
  884. effectSize = reader.Float();
  885. effectColor = reader.Colors();
  886. m_params.stringID = reader.LocString();
  887. m_initPtr = reader.String().c_str();
  888. if( m_params.stringID[0] )
  889. m_initPtr = m_params.stringID;
  890. // m_params.defaultString = m_initPtr;
  891. m_params.defaultPtr = m_initPtr;
  892. m_params.fontName = reader.String().c_str();
  893. m_params.size = reader.Float();
  894. m_params.kerning = reader.Float();
  895. m_hk = Render().GetFullScreenViewPort_2D().Height/1024.0f;
  896. m_params.size *= m_hk;
  897. m_params.color = reader.Colors();
  898. // effectColor = m_params.color*effectColor;
  899. // effectColor.a *= m_params.color.a;
  900. enumStr = reader.Enum().c_str();
  901. if( string::IsEqual(enumStr,ALIGN_CENTER))
  902. m_params.horizAlign = IAdvFont::Center;
  903. else
  904. if( string::IsEqual(enumStr,ALIGN_LEFT))
  905. m_params.horizAlign = IAdvFont::Left;
  906. else
  907. if( string::IsEqual(enumStr,ALIGN_RIGHT))
  908. m_params.horizAlign = IAdvFont::Right;
  909. enumStr = reader.Enum().c_str();
  910. if( string::IsEqual(enumStr,ALIGN_CENTER))
  911. m_params.vertAlign = IAdvFont::Center;
  912. else
  913. if( string::IsEqual(enumStr,ALIGN_TOP))
  914. m_params.vertAlign = IAdvFont::Top;
  915. else
  916. if( string::IsEqual(enumStr,ALIGN_BOTTOM))
  917. m_params.vertAlign = IAdvFont::Bottom;
  918. //// statistic effect ////
  919. m_stat = reader.Bool();
  920. m_statTimeMax = reader.Float();
  921. //////////////////////////
  922. m_params.model = reader.String().c_str();
  923. m_params.anim = reader.String().c_str();
  924. m_params.position = reader.Position();
  925. m_params.orient = reader.Angles();
  926. m_params.scale = reader.Float();
  927. //// render params ////
  928. skipFog = reader.Bool();
  929. drawColor = reader.Colors();
  930. m_smoothAlpha = reader.Bool();
  931. enableRender = reader.Bool();
  932. dynLighting = reader.Bool();
  933. ///////////////////////
  934. const char *t1 = reader.String().c_str();
  935. // const char *t2 = reader.String().c_str();
  936. // if( m_aspect > 1.0f && !m_widthAspect && t2[0] )
  937. // m_params.texture = t2;
  938. // else
  939. m_params.texture = t1;
  940. m_black = reader.Bool();
  941. m_curFrame = m_params.firstFrame = reader.Long();
  942. m_params.framesCount = reader.Long();
  943. m_params.frameStartU = reader.Float();
  944. m_params.frameStartV = reader.Float();
  945. m_params.frameWidth = reader.Float();
  946. m_params.frameHeight = reader.Float();
  947. m_params.fps = reader.Long();
  948. enumStr = reader.Enum().c_str();
  949. if( string::IsEqual(enumStr,PLAY_CONTINIOUS))
  950. m_params.playMethod = Params::Continious;
  951. else
  952. if( string::IsEqual(enumStr,PLAY_ONCE_ON_ACTIVATION))
  953. m_params.playMethod = Params::OnceOnActivate;
  954. else
  955. if( string::IsEqual(enumStr,PLAY_ONCE_ON_SHOW))
  956. m_params.playMethod = Params::OnceOnShow;
  957. else
  958. if( string::IsEqual(enumStr,PLAY_ONCE_BY_COMMAND))
  959. m_params.playMethod = Params::OnceByCommand;
  960. /////////////////
  961. m_cutsUse = reader.Bool();
  962. m_cutsDelay = reader.Float();
  963. m_cutsPriority = reader.Long();
  964. m_cutsDebug = reader.Bool();
  965. /////////////////
  966. // m_alphaOriginal = GetAlpha();
  967. // m_alphaOriginal = 1.0f;
  968. m_alphaOriginal = GetNativeAlpha();
  969. if( m_fading )
  970. SetAlpha(0.0f);
  971. // m_alphaOriginal = GetNativeAlpha();
  972. SetFadeState(FadingFinished);
  973. // m_useAnim = reader.Bool();
  974. m_useAnim = true;
  975. m_animSpeed = reader.Float()*2.0f*PI;
  976. // m_time = 0.0f;
  977. nativeShow = reader.Bool();
  978. // Show(reader.Bool());
  979. bool isChangeWidth = reader.Bool();
  980. m_widthAspectKoef = isChangeWidth ? 1.0f/m_aspect : 1.0f;
  981. m_fade = 0.0f;
  982. m_fadeAlpha = IsShow() ? 1.0f : 0.0f;
  983. // m_za = 0.0f;
  984. if( !Restricted(preserveSize))
  985. SizeTo(width,height);
  986. MissionObject::Activate(true);
  987. }
  988. void _cdecl GUIWidget::InitFunc(float, long)
  989. {
  990. if( m_restart )
  991. {
  992. m_restart = false;
  993. }
  994. else
  995. {
  996. BaseGUIElement *parent = GetParent();
  997. if( BaseGUIElement *newParent = FindParent())
  998. {
  999. newParent->Register(this);
  1000. }
  1001. else
  1002. {
  1003. if( parent )
  1004. parent->UnRegister(this);
  1005. }
  1006. m_initComplete = true;
  1007. }
  1008. DelUpdate(&GUIWidget::InitFunc);
  1009. UpdateText();
  1010. Show(nativeShow);
  1011. }
  1012. void GUIWidget::OnParentNotify(Notification event)
  1013. {
  1014. BaseGUIElement::OnParentNotify(event);
  1015. }
  1016. bool GUIWidget::Create(MOPReader &reader)
  1017. {
  1018. /* Render().GetShaderId("Circular_shadow", Circular_shadow_id);
  1019. Render().GetShaderId("Circular", Circular_id);
  1020. */
  1021. if( m_restart )
  1022. {
  1023. RestartObject(reader);
  1024. }
  1025. else
  1026. {
  1027. EditMode_Update(reader);
  1028. }
  1029. return true;
  1030. }
  1031. bool GUIWidget::RestartObject(MOPReader &reader)
  1032. {
  1033. BaseGUIElement::SkipMOPs(reader);
  1034. SkipMOPs(reader);
  1035. NotifyChildren(ParentChanged);
  1036. // SetUpdate(&GUIWidget::InitFunc,EditMode_IsOn() ? ML_FIRST : ML_FIRST - 1);
  1037. SetUpdate(&GUIWidget::InitFunc,ML_FIRST + 1);
  1038. if( m_initComplete == false )
  1039. {
  1040. m_restart = false;
  1041. }
  1042. UpdateText();
  1043. /* if( m_params.stringID[0] )
  1044. m_params.defaultString = m_params.stringID;
  1045. m_initString = m_params.defaultString;*/
  1046. if( m_params.playMethod == Params::Continious )
  1047. m_shouldPlay = true;
  1048. m_frameXOffset = m_frameYOffset = 0.0f;
  1049. return true;
  1050. }
  1051. bool GUIWidget::EditMode_Update(MOPReader &reader)
  1052. {
  1053. BaseGUIElement::EditMode_Update(reader);
  1054. ReadMOPs(reader);
  1055. // m_asp = m_aspect > 1.0f ? 4.0f/3.0f : 16.0f/9.0f;
  1056. m_asp = m_aspect_native;
  1057. NotifyChildren(ParentChanged);
  1058. // SetUpdate(&GUIWidget::InitFunc,EditMode_IsOn() ? ML_FIRST : ML_FIRST - 1);
  1059. SetUpdate(&GUIWidget::InitFunc,ML_FIRST + 1);
  1060. m_initComplete = false;
  1061. // Для корректной ининциализации RenderAdvFont в функции InitFunc():
  1062. // ML_FIRST - 1 в режиме игры - чтобы сработать до триггеров
  1063. // ML_FIRST в режиме радактора - чтобы у рендера вьюпорт был установлен(?)
  1064. /* if( m_params.stringID[0] )
  1065. m_params.defaultString = m_params.stringID;*/
  1066. m_quadRender.SetTexture(m_params.texture,m_black);
  1067. IGMXScene *oldModel = m_model;
  1068. m_model = Geometry().CreateScene(m_params.model,&Animation(),&Particles(),&Sound(),_FL_);
  1069. if( m_model )
  1070. m_model->SetAnimationFile(m_params.anim);
  1071. // if( m_model )
  1072. // m_model->SetFloatAlphaReference(m_smoothAlpha ? 0.003921f : 0.5f);
  1073. if( m_model )
  1074. {
  1075. m_model->SetDynamicLightState(dynLighting);
  1076. if( m_smoothAlpha )
  1077. m_model->SetFloatAlphaReference(0.003921f);
  1078. }
  1079. if( oldModel )
  1080. {
  1081. oldModel->Release();
  1082. oldModel = null;
  1083. }
  1084. IFont *oldFont = m_font;
  1085. if( m_params.fontName[0] )
  1086. {
  1087. m_font = Render().CreateFont(m_params.fontName,m_params.size,-1,"dbgFontAlpha");
  1088. if( m_font )
  1089. {
  1090. m_font->SetColor(m_params.color);
  1091. // float aspect = InterfaceUtils::AspectRatio(Render());
  1092. // m_font->SetHeight(Render().GetViewport().Height/768.0f*m_params.size*SS2UIRS(1.0f)*aspect);
  1093. // m_font->SetHeight(Render().GetViewport().Height/768.0f*m_params.size*SS2UIRS(1.0f));
  1094. }
  1095. if( oldFont )
  1096. {
  1097. oldFont->Release();
  1098. oldFont = null;
  1099. }
  1100. // float aspect = Render().GetViewport().Width/(float)Render().GetViewport().Height;
  1101. if( m_font )
  1102. // m_font->SetHeight(Render().GetViewport().Height/768.0f*m_params.size*aspect);
  1103. // m_font->SetHeight(Render().GetViewport().Height/768.0f*m_params.size);
  1104. m_font->SetHeight(m_params.size);
  1105. // m_initString = m_params.defaultString;
  1106. // Parse (m_params.defaultString);
  1107. // UpdateTable(m_params.defaultString);
  1108. // форматирование строчки, word-wrap
  1109. // /* m_linesCount = InterfaceUtils::WordWrapString(
  1110. // m_params.defaultString,m_font,
  1111. // m_params.width/100.0f*Render().GetViewport().Width);*/
  1112. // m_linesCount = InterfaceUtils::WordWrapString(
  1113. // buffer ,m_font,
  1114. // GetWidth()/100.0f*Render().GetViewport().Width*m_aspect/*/m_hk*/,buffer_size);
  1115. // UpdateHash (m_params.defaultString);
  1116. // m_needUpdate = (m_initString != m_params.defaultString);
  1117. }
  1118. ///////////////////////////
  1119. /* if( !m_text )
  1120. {
  1121. IGUITextManager *tm = (IGUITextManager *)Mission().CreateObject("GUITextManager","GUITextManager");
  1122. Assert(tm)
  1123. m_text = tm->CreateText();
  1124. }*/
  1125. RenderAdvFont *text = (RenderAdvFont *)Render().CreateAdvancedFont(
  1126. m_params.fontName,m_params.size,m_params.color);
  1127. if( m_text )
  1128. m_text->Release();
  1129. m_text = text;
  1130. if( m_text )
  1131. {
  1132. m_text->SetCutsDelay(m_cutsUse,m_cutsDelay);
  1133. m_text->DrawDebug(m_cutsDebug);
  1134. m_text->SetPlayCuts(!EditMode_IsOn());
  1135. // m_text->SetProirity(m_cutsPriority);
  1136. }
  1137. ///////////////////////////
  1138. if( m_params.playMethod == Params::Continious )
  1139. m_shouldPlay = true;
  1140. m_frameXOffset = m_frameYOffset = 0.0f;
  1141. UpdateText();
  1142. return true;
  1143. }
  1144. /*
  1145. void GUIWidget::UpdateTable(string &s)
  1146. {
  1147. if( !m_font )
  1148. return;
  1149. table.DelAll();
  1150. char name[40];
  1151. char *line = (char *)s.GetBuffer();
  1152. char *p = line;
  1153. IBaseTexture *image = Controls().GetControlsImage();
  1154. // Assert(image)
  1155. dword imageW = Image ? Image->GetWidth () : 0;
  1156. dword imageH = Image ? Image->GetHeight() : 0;
  1157. string t;
  1158. while( 1 )
  1159. {
  1160. p = strchr(line,'[');
  1161. if( !p )
  1162. break;
  1163. if( p > line )
  1164. {
  1165. *p = 0;
  1166. t += line;
  1167. *p = '[';
  1168. line = p;
  1169. }
  1170. p++;
  1171. for( int j = 0 ; *p && *p != ']' ; )
  1172. name[j++] = *p++;
  1173. if( !*p )
  1174. break;
  1175. name[j] = 0;
  1176. Info &info = table[table.Add()];
  1177. info.p = Controls().GetControlImagePlace(name);
  1178. info.w = imageW*info.p.w;
  1179. info.h = imageH*info.p.h;
  1180. int n = (int)ceilf(info.w/m_font->GetLength("#"));
  1181. while( n-- )
  1182. t += '#';
  1183. p++; line = p;
  1184. }
  1185. t += line;
  1186. s = t;
  1187. }
  1188. *//*
  1189. void GUIWidget::UpdateTable(string &s)
  1190. {
  1191. if( !m_font )
  1192. return;
  1193. float fh = m_font->GetHeight()*font_hk;
  1194. table.DelAll();
  1195. char name[40];
  1196. char *line = (char *)s.GetBuffer();
  1197. char *p = line;
  1198. // IBaseTexture *image = Controls().GetControlsImage();
  1199. // Assert(image)
  1200. // dword imageW = image->GetWidth ();
  1201. // dword imageH = image->GetHeight();
  1202. // Assert(Image)
  1203. Image = Controls().GetControlsImage();
  1204. // lastImage = Image;
  1205. m_updated = Controls().GetImagesUpdated();
  1206. dword imageW = Image ? Image->GetWidth () : 0;
  1207. dword imageH = Image ? Image->GetHeight() : 0;
  1208. dword cx = Render().GetViewport().Width;
  1209. dword cy = Render().GetViewport().Height;
  1210. // string t;
  1211. buffer[0] = 0;
  1212. while( 1 )
  1213. {
  1214. p = strchr(line,'[');
  1215. if( !p )
  1216. break;
  1217. if( p > line )
  1218. {
  1219. *p = 0;
  1220. // t += line;
  1221. strcat_s(buffer,buffer_size,line);
  1222. *p = '[';
  1223. line = p;
  1224. }
  1225. p++;
  1226. if( *p == '[' )
  1227. {
  1228. strcat_s(buffer,buffer_size,"[");
  1229. line = p = p + 1;
  1230. continue;
  1231. }
  1232. bool anim = false;
  1233. if( *p == '#' )
  1234. {
  1235. anim = true; p++;
  1236. }
  1237. for( int j = 0 ; *p && *p != ']' ; )
  1238. name[j++] = *p++;
  1239. if( !*p )
  1240. break;
  1241. name[j] = 0;
  1242. Info &info = table[table.Add()];
  1243. info.p = Controls().GetControlImagePlace(name);
  1244. if( info.p.h )
  1245. {
  1246. info.anim = anim;
  1247. info.w = imageW*info.p.w;//*0.4f;
  1248. info.h = imageH*info.p.h;//*0.4f;
  1249. info.w *= fh/info.h;
  1250. info.h = fh;
  1251. info.k = info.w/info.h/m_asp;
  1252. int n;
  1253. float width = m_font->GetLength("`");
  1254. if( fabs(width) < 1e-30f ) // символ не найден
  1255. n = info.w ? 1 : 0;
  1256. else
  1257. {
  1258. // n = info.w ? (int)ceilf(info.w*m_hk/width) : 0;
  1259. // float sx = info.h/cy*m_hk*info.k;
  1260. float sx = info.h/cy*info.k;
  1261. n = info.w ? (int)ceilf(sx*cx/width) : 0;
  1262. }
  1263. while( n-- > 0 )
  1264. // t += '@';
  1265. strcat_s(buffer,buffer_size,"`");
  1266. }
  1267. else
  1268. {
  1269. info.w = 0.0f;
  1270. info.h = 0.0f;
  1271. info.k = 0.0f;
  1272. // strcat_s(buffer,buffer_size,"[");
  1273. strcat_s(buffer,buffer_size,name);
  1274. // strcat_s(buffer,buffer_size,"]");
  1275. }
  1276. p++; line = p;
  1277. }
  1278. // t += line;
  1279. strcat_s(buffer,buffer_size,line);
  1280. // s = t;
  1281. // s = buffer;
  1282. }
  1283. float round(float x)
  1284. {
  1285. float f = floorf(x);
  1286. if( x - f > 0.5f )
  1287. return f + 1.0f;
  1288. else
  1289. return f;
  1290. }*/
  1291. /*
  1292. void GUIWidget::UpdateHash (string &s)
  1293. {
  1294. if( !m_font )
  1295. return;
  1296. hash.DelAll();
  1297. dword i = 0; dword j = 0;
  1298. dword n = 0;
  1299. dword t = 0;
  1300. dword d = 0;
  1301. string z;
  1302. hash.Add();
  1303. hash[d] = 0;
  1304. while( 1 )
  1305. {
  1306. while( s[i] != '#' && s[i] != '\n' )
  1307. z += s[i++], j++;
  1308. if( s[i] == '\n' )
  1309. {
  1310. z += s[i], j++;
  1311. if( i >= s.Len() - 1 )
  1312. break;
  1313. else
  1314. {
  1315. i++; n = j; d++;
  1316. hash.Add();
  1317. hash[d] = 0; continue;
  1318. }
  1319. }
  1320. hash[d]++;
  1321. Info &info = table[t++];
  1322. info.x = m_font->GetLength(j - n,z.c_str() + n);
  1323. info.y = m_font->GetHeight()*d;
  1324. info.y += (m_font->GetHeight() - info.h)*0.5f;
  1325. while( s[i] == '#' )
  1326. i++;
  1327. int n = (int)round(info.w/m_font->GetLength(" "));
  1328. while( n-- )
  1329. z += ' ', j++;
  1330. if( s[i] == '\n' )
  1331. {
  1332. z += s[i], j++;
  1333. if( i >= s.Len() - 1 )
  1334. break;
  1335. else
  1336. {
  1337. i++; n = j; d++;
  1338. hash.Add();
  1339. hash[d] = 0; continue;
  1340. }
  1341. }
  1342. }
  1343. s = z;
  1344. }
  1345. *//*
  1346. void GUIWidget::UpdateHash (string &s)
  1347. {
  1348. if( !m_font )
  1349. return;
  1350. dword cx = Render().GetViewport().Width;
  1351. dword cy = Render().GetViewport().Height;
  1352. // float aspect = InterfaceUtils::AspectRatio(Render());
  1353. hash.DelAll();
  1354. dword i = 0; // текущая позиция в исходной строке
  1355. dword j = 0; // текущая позиция в строке результата
  1356. dword n = 0; // индекс первого символа в строке
  1357. dword t = 0; // индекс в таблице
  1358. dword d = 0; // номер текущей строки
  1359. // string z;
  1360. // buffer[0] = 0;
  1361. hash.Add();
  1362. hash[d] = 0;
  1363. char *dst = buffer + buffer_size;
  1364. while( 1 )
  1365. {
  1366. // while( s [i] != '`' && s [i] != '\n' )
  1367. while( buffer[i] != '`' && buffer[i] != '\n' )
  1368. // dst[j++] = s [i++];
  1369. dst[j++] = buffer[i++];
  1370. // if( s [i] == '\n' )
  1371. if( buffer[i] == '\n' )
  1372. {
  1373. // dst[j++] = s [i];
  1374. dst[j++] = buffer[i];
  1375. // if( i >= s.Len() - 1 )
  1376. if( !buffer[i + 1] )
  1377. break;
  1378. else
  1379. {
  1380. i++; n = j; d++;
  1381. hash.Add();
  1382. hash[d] = 0; continue;
  1383. }
  1384. }
  1385. hash[d]++;
  1386. Info &info = table[t++];
  1387. info.x = m_font->GetLength(j - n,dst + n);
  1388. info.y = m_font->GetHeight()*d;
  1389. // info.y += (m_font->GetHeight() - info.h*m_hk)*0.5f;
  1390. info.y += (m_font->GetHeight() - info.h)*0.5f;
  1391. // while( s [i] == '`' )
  1392. while( buffer[i] == '`' )
  1393. i++;
  1394. int n;
  1395. float width = m_font->GetLength(" ");
  1396. if( width == 0.0f ) // символ не найден
  1397. // n = 1;
  1398. n = 0;
  1399. else
  1400. {
  1401. // n = (int)round(info.w*m_hk/width);
  1402. // float sx = info.h/cy*m_hk*info.k;
  1403. float sx = info.h/cy*info.k;
  1404. n = (int)round(sx*cx/width);
  1405. // n = (int)ceilf(sx*cx/width);
  1406. }
  1407. while( n-- )
  1408. dst[j++] = ' ';
  1409. // if( s [i] == '\n' )
  1410. if( buffer[i] == '\n' )
  1411. {
  1412. // dst[j++] = s [i];
  1413. dst[j++] = buffer[i];
  1414. // if( i >= s.Len() - 1 )
  1415. if( !buffer[i + 1] )
  1416. break;
  1417. else
  1418. {
  1419. i++; n = j; d++;
  1420. hash.Add();
  1421. hash[d] = 0; continue;
  1422. }
  1423. }
  1424. }
  1425. dst[j] = 0;
  1426. // s = z;
  1427. s = dst;
  1428. }*/
  1429. void GUIWidget::Parse(string &s)
  1430. {
  1431. m_parsed = false;
  1432. dword len = s.Len();
  1433. if( len && m_font )
  1434. {
  1435. for( dword i = 0 ; i < len ; i++ )
  1436. if( s[i] == '`' )
  1437. break;
  1438. if( i < len - 1 )
  1439. {
  1440. m_effBeg = i;
  1441. s.Delete(i,1); len--;
  1442. if( s[i] == '`' )
  1443. {
  1444. s.Delete(i,1); return;
  1445. }
  1446. i++;
  1447. while( i < len && s[i] != '`' ) i++;
  1448. if( i < len )
  1449. {
  1450. m_effLen = i - m_effBeg;
  1451. s.Delete(i,1);
  1452. }
  1453. else
  1454. m_effLen = len - m_effBeg;
  1455. }
  1456. else
  1457. {
  1458. if( i < len )
  1459. s.Delete(i,1);
  1460. return;
  1461. }
  1462. const char *t = s.GetBuffer();
  1463. float width = m_font->GetLength(m_effLen,t + m_effBeg);
  1464. m_effOffX = m_font->GetLength(m_effBeg,t)
  1465. + width*0.5f;
  1466. // m_effWidth = m_font->GetLength(m_effBeg ,t) + width;
  1467. m_effWidth = m_font->GetLength(m_effBeg + m_effLen,t);
  1468. m_parsed = true;
  1469. }
  1470. }
  1471. void GUIWidget::Show(bool isShow)
  1472. {
  1473. /* if( !EditMode_IsOn())
  1474. {
  1475. if( isShow && m_stat )
  1476. {
  1477. if( IsShow())
  1478. {
  1479. m_statCur = m_statEnd - 1;
  1480. m_statTime = 0.0f;
  1481. }
  1482. else
  1483. {
  1484. m_statCur = 0;
  1485. m_statEnd = atoi(m_initPtr);
  1486. m_statTime = m_statTimeMax;
  1487. if( m_statCur < m_statEnd )
  1488. {
  1489. m_params.defaultString = "0";
  1490. m_params.defaultPtr = m_params.defaultString.c_str();
  1491. m_text->Prepare(true,GetWidth()*m_aspect*m_widthAspectKoef,GetHeight(),m_params.defaultPtr,
  1492. m_params.horizAlign,m_params.vertAlign,m_params.useSafeFrame,false);
  1493. }
  1494. }
  1495. }
  1496. }*/
  1497. if( !EditMode_IsOn())
  1498. {
  1499. if( isShow )
  1500. {
  1501. if( m_text && m_cutsUse )
  1502. {
  1503. isShow = _sub ? fabsf(_sub->Get(1.0f)) > 0.1f : true;
  1504. if( isShow )
  1505. {
  1506. //// обработка приоритетов ////
  1507. if( _curText )
  1508. {
  1509. if( _curText != this )
  1510. {
  1511. if( _curText->GetPriority() < m_cutsPriority )
  1512. {
  1513. _curText->Show(false);
  1514. _curText = this;
  1515. }
  1516. else
  1517. isShow = false;
  1518. }
  1519. }
  1520. else
  1521. {
  1522. _curText = this;
  1523. }
  1524. ///////////////////////////////
  1525. if( isShow )
  1526. {
  1527. m_cutsTime = 0.0f;
  1528. m_text->UpdateCutsTime(m_cutsTime);
  1529. }
  1530. }
  1531. }
  1532. }
  1533. else
  1534. {
  1535. if( m_text && m_cutsUse )
  1536. {
  1537. if( _curText == this )
  1538. _curText = null;
  1539. }
  1540. }
  1541. }
  1542. if( !m_fading || Restricted(-1))
  1543. {
  1544. SetFadeState(FadingFinished); m_fadeAlpha = GetAlpha();
  1545. if( m_fadeAlpha == 0.0f )
  1546. {
  1547. SetAlpha(m_fadeAlpha = m_alphaOriginal);
  1548. }
  1549. _Show(isShow);
  1550. return;
  1551. }
  1552. if( IsShow())
  1553. {
  1554. if( !isShow )
  1555. {
  1556. if( GetFadeState() == FadingFinished )
  1557. {
  1558. m_fadeAlpha = GetAlpha();
  1559. m_alphaOriginal = GetNativeAlpha();
  1560. }
  1561. SetFadeState(FadingOut); nativeShow = isShow;
  1562. // m_alphaOriginal = GetNativeAlpha();
  1563. if( GetNativeAlpha() == 0.0f )
  1564. {
  1565. bool show = nativeShow; _Show(false); nativeShow = show;
  1566. }
  1567. return;
  1568. }
  1569. else
  1570. {
  1571. SetFadeState(FadingIn);
  1572. if( EditMode_IsOn())
  1573. _Show(isShow,false);
  1574. return;
  1575. }
  1576. }
  1577. else
  1578. {
  1579. if( isShow )
  1580. {
  1581. SetFadeState(FadingIn); m_fadeAlpha = 0.0f;
  1582. // SetAlpha(m_fadeAlpha = 0.01f);
  1583. /* if( GetNativeAlpha() == 0.0f )
  1584. SetAlpha(m_fadeAlpha = 0.01f);*/
  1585. float alpha = GetNativeAlpha();
  1586. if( alpha != 0.0f )
  1587. m_alphaOriginal = alpha;
  1588. if( m_alphaOriginal == 0.0f )
  1589. {
  1590. SetFadeState(FadingFinished);
  1591. }
  1592. else
  1593. SetAlpha(m_fadeAlpha = 0.01f);
  1594. }
  1595. }
  1596. _Show(isShow);
  1597. }
  1598. void GUIWidget::_Show(bool isShow, bool animate)
  1599. {
  1600. BaseGUIElement::Show(isShow);
  1601. if( m_fading && !IsShow() && GetFadeState() == FadingIn )
  1602. {
  1603. SetAlpha(0.0f);
  1604. SetFadeState(FadingFinished);
  1605. }
  1606. if( animate && IsShow() && m_params.playMethod == Params::OnceOnShow )
  1607. {
  1608. m_shouldPlay = true;
  1609. LogicDebug("Animation started");
  1610. }
  1611. BaseGUIElement *parent = GetParent();
  1612. long level = drawLevel;
  1613. /* if( parent )
  1614. level = parent->GetDrawLevel() + 100;*/
  1615. // DelUpdate((MOF_UPDATE)&GUIWidget::Work);
  1616. if( EditMode_IsOn())
  1617. DelUpdate((MOF_UPDATE)&GUIWidget::Work);
  1618. if( IsShow())
  1619. {
  1620. if( GetAlpha() > 0.0f || GetFadeState() == FadingIn )
  1621. {
  1622. SetUpdate((MOF_UPDATE)&GUIWidget::Work,level + m_params.drawPriority + drawShift);
  1623. // api->Trace("WIDGET %s on",GetObjectID().c_str());
  1624. }
  1625. }
  1626. else
  1627. {
  1628. DelUpdate((MOF_UPDATE)&GUIWidget::Work);
  1629. // api->Trace("WIDGET %s off",GetObjectID().c_str());
  1630. }
  1631. }
  1632. void GUIWidget::Activate(bool isActive)
  1633. {
  1634. BaseGUIElement::Activate(isActive);
  1635. if( m_stat && IsShow())
  1636. {
  1637. if( m_statCur != m_statEnd )
  1638. {
  1639. m_statCur = m_statEnd - 1;
  1640. m_statTime = 0.0f;
  1641. }
  1642. return;
  1643. }
  1644. if( isActive && m_params.playMethod == Params::OnceOnActivate )
  1645. {
  1646. m_shouldPlay = true;
  1647. LogicDebug("Animation started");
  1648. }
  1649. }
  1650. void GUIWidget::Command(const char *id, dword numParams, const char **params)
  1651. {
  1652. /* if( string::IsEqual(id,"UseAnim_1"))
  1653. {
  1654. m_useAnim = true;
  1655. }
  1656. else
  1657. if( string::IsEqual(id,"UseAnim_0"))
  1658. {
  1659. m_useAnim = false;
  1660. }
  1661. else*/
  1662. if( string::IsEqual(id,"SetString"))
  1663. {
  1664. if( numParams < 1 )
  1665. {
  1666. LogicDebugError("Command GUIWidget::<SetString> error. Too few arguments");
  1667. return;
  1668. }
  1669. // LogicDebug("Command <SetString>: \"%s\"",params[0] ? params[0] : "");
  1670. const char *new_value = params[0];
  1671. if( m_stat )
  1672. {
  1673. if( IsShow() && IsActive())
  1674. {
  1675. m_statCur = atoi(m_params.defaultPtr);
  1676. m_statEnd = atoi(params[0]);
  1677. m_statTime = m_statTimeMax;
  1678. if( string::IsEmpty(m_params.defaultPtr))
  1679. {
  1680. new_value = "0";
  1681. }
  1682. else
  1683. return;
  1684. }
  1685. else
  1686. {
  1687. m_statCur = m_statEnd = atoi(params[0]);
  1688. }
  1689. }
  1690. // if( m_params.defaultString != new_value )
  1691. if(!string::IsEqual(m_initPtr,new_value))
  1692. {
  1693. m_initString = new_value;
  1694. m_initPtr = m_initString.c_str();
  1695. m_params.defaultPtr = m_initPtr;
  1696. ///////
  1697. int version = Controls().GetControlsImageVersion();
  1698. if( version != m_version )
  1699. {
  1700. if( m_text )
  1701. m_text->ResetImage();
  1702. m_version = version;
  1703. }
  1704. ///////
  1705. // Parse(m_params.defaultString);
  1706. if( strchr(m_initPtr,'`'))
  1707. {
  1708. m_params.defaultString = m_initPtr;
  1709. Parse(m_params.defaultString);
  1710. m_params.defaultPtr = m_params.defaultString.c_str();
  1711. }
  1712. else
  1713. {
  1714. m_params.defaultPtr = m_initPtr; m_parsed = false;
  1715. }
  1716. /* UpdateTable(m_params.defaultString);
  1717. // m_linesCount = InterfaceUtils::WordWrapString(
  1718. // m_params.defaultString,m_font,
  1719. // m_params.width*Render().GetViewport().Width/100.0f);
  1720. m_linesCount = InterfaceUtils::WordWrapString(
  1721. buffer ,m_font,
  1722. // GetWidth()/100.0f*Render().GetViewport().Width*m_aspect/m_hk,buffer_size);
  1723. GetWidth()/100.0f*Render().GetViewport().Width*m_aspect ,buffer_size);
  1724. UpdateHash (m_params.defaultString);
  1725. m_needUpdate = (m_initString != m_params.defaultString);*/
  1726. m_needUpdate = m_text ?
  1727. m_text->Prepare(true,/*m_font,*/GetWidth()*m_aspect*m_widthAspectKoef,GetHeight(),/*m_initString*/
  1728. /*m_params.defaultString*/m_params.defaultPtr,
  1729. m_params.horizAlign,m_params.vertAlign,m_params.useSafeFrame,m_parsed) :
  1730. false;
  1731. }
  1732. }
  1733. else
  1734. if( string::IsEqual(id,"Play"))
  1735. {
  1736. if( IsShow() && m_params.playMethod == Params::OnceByCommand && !m_shouldPlay )
  1737. m_shouldPlay = true;
  1738. }
  1739. else
  1740. if( string::IsEqual(id,"Reset"))
  1741. {
  1742. m_curFrame = m_params.firstFrame;
  1743. }
  1744. else
  1745. if( string::IsEqual(id,"PlayEffect"))
  1746. {
  1747. /* if( m_effect && m_font )
  1748. {
  1749. dword len = m_params.defaultString.Len();
  1750. if( m_effBeg < len )
  1751. {
  1752. m_effLen = m_effLenNative;
  1753. if( m_effLen > len )
  1754. m_effLen = len;
  1755. if( m_effLen + m_effBeg > len )
  1756. m_effLen = len - m_effBeg;
  1757. if( m_effLen )
  1758. {
  1759. const char *s = m_params.defaultString.GetBuffer();
  1760. float width = m_font->GetLength(m_effLen,s + m_effBeg);
  1761. m_effOffX = m_font->GetLength(m_effBeg,s)
  1762. + width*0.5f;
  1763. m_effWidth = m_font->GetLength(m_effBeg,s) + width;
  1764. m_parsed = true;
  1765. }
  1766. }
  1767. }*/
  1768. if( m_effect && effectTime > 0.0f /*&& m_parsed*/ )
  1769. {
  1770. // if( m_effTime <= 0.0f )
  1771. m_effTime = effectTime;
  1772. }
  1773. }
  1774. else
  1775. if( string::IsEqual(id,"SetColor"))
  1776. {
  1777. if( numParams < 1 )
  1778. {
  1779. LogicDebugError("Command GUIWidget::<SetColor> error. Too few arguments");
  1780. return;
  1781. }
  1782. if( params[0] )
  1783. {
  1784. dword color;
  1785. if( sscanf_s(params[0],"%x",&color) == 1 )
  1786. {
  1787. m_params.color = Color(color);
  1788. }
  1789. else
  1790. {
  1791. LogicDebugError("Command GUIWidget::<SetColor> error. Invalid color value");
  1792. }
  1793. }
  1794. }
  1795. else
  1796. if( string::IsEqual(id,"Goto"))
  1797. {
  1798. if( numParams < 1 )
  1799. {
  1800. LogicDebugError("Command GUIWidget::<Goto> error. Too few arguments");
  1801. return;
  1802. }
  1803. if( params[0] )
  1804. {
  1805. if( m_model )
  1806. {
  1807. IAnimation *ani = m_model->GetAnimation();
  1808. if( ani )
  1809. {
  1810. ani->Goto(params[0],0.0f);
  1811. LogicDebug("Goto animation node [%s]",params[0]);
  1812. }
  1813. else
  1814. {
  1815. LogicDebugError("No active animation");
  1816. }
  1817. }
  1818. }
  1819. }
  1820. else
  1821. {
  1822. BaseGUIElement::Command(id,numParams,params);
  1823. }
  1824. }
  1825. void GUIWidget::UpdateText(bool resetImage)
  1826. {
  1827. // if( !m_initPtr )
  1828. // return;
  1829. if( m_text /*&& resetImage*/ )
  1830. {
  1831. m_text->ResetImage();
  1832. }
  1833. /*
  1834. // m_params.defaultString = m_initString;
  1835. m_params.defaultString = m_initPtr;
  1836. Parse (m_params.defaultString);*/
  1837. if( strchr(m_initPtr,'`'))
  1838. {
  1839. m_params.defaultString = m_initPtr;
  1840. Parse(m_params.defaultString);
  1841. m_params.defaultPtr = m_params.defaultString.c_str();
  1842. }
  1843. else
  1844. {
  1845. m_params.defaultPtr = m_initPtr; m_parsed = false;
  1846. }
  1847. /* UpdateTable(m_params.defaultString);
  1848. // m_linesCount = InterfaceUtils::WordWrapString(
  1849. // m_params.defaultString,m_font,
  1850. // m_params.width*Render().GetViewport().Width/100.0f);
  1851. m_linesCount = InterfaceUtils::WordWrapString(
  1852. buffer ,m_font,
  1853. // GetWidth()/100.0f*Render().GetViewport().Width*m_aspect/m_hk,buffer_size);
  1854. GetWidth()/100.0f*Render().GetViewport().Width*m_aspect ,buffer_size);
  1855. UpdateHash (m_params.defaultString);
  1856. m_needUpdate = (m_initString != m_params.defaultString);*/
  1857. if (m_text)
  1858. {
  1859. m_text->SetKerning(m_params.kerning);
  1860. }
  1861. m_needUpdate = m_text ?
  1862. m_text->Prepare(true,/*m_font,*/GetWidth()*m_aspect*m_widthAspectKoef,GetHeight(),/*m_initString*/
  1863. /*m_params.defaultString*/m_params.defaultPtr,
  1864. m_params.horizAlign,m_params.vertAlign,m_params.useSafeFrame,m_parsed) :
  1865. false;
  1866. m_version = Controls().GetControlsImageVersion();
  1867. /////////////////////////////////////////////////
  1868. if( m_stat )
  1869. {
  1870. m_statCur = m_statEnd = atoi(m_params.defaultPtr);
  1871. }
  1872. }
  1873. /*
  1874. void GUIWidget::CreateBuffers()
  1875. {
  1876. if( !refCount++ )
  1877. {
  1878. IRender *render = (IRender *)api->GetService("DX9Render");
  1879. // IControls *controls = (IControls *)api->GetService("Controls");
  1880. if( pVB )
  1881. pVB->Release();
  1882. if( pIB )
  1883. pIB->Release();
  1884. pVB = render->CreateVertexBuffer(
  1885. sizeof(Vertex)*icon_max_count*4,
  1886. sizeof(Vertex),
  1887. _FL_,USAGE_WRITEONLY|USAGE_DYNAMIC,POOL_DEFAULT);
  1888. Assert(pVB)
  1889. pIB = render->CreateIndexBuffer(
  1890. sizeof(WORD) *icon_max_count*6,
  1891. _FL_,USAGE_WRITEONLY|USAGE_DYNAMIC);
  1892. Assert(pIB)
  1893. WORD *p = (WORD*)pIB->Lock();
  1894. Assert(p)
  1895. for( long i = 0 ; i < icon_max_count ; i++ )
  1896. {
  1897. p[i*6 + 0] = WORD(i*4 + 0);
  1898. p[i*6 + 1] = WORD(i*4 + 1);
  1899. p[i*6 + 2] = WORD(i*4 + 2);
  1900. p[i*6 + 3] = WORD(i*4 + 0);
  1901. p[i*6 + 4] = WORD(i*4 + 2);
  1902. p[i*6 + 5] = WORD(i*4 + 3);
  1903. }
  1904. pIB->Unlock();
  1905. Texture = render->GetTechniqueGlobalVariable("CircularTexture",_FL_);
  1906. // Image = controls->GetControlsImage();
  1907. }
  1908. }*/
  1909. static char GUIDescription[] =
  1910. "GUI Graphical element.\n\n"
  1911. " Use it to setup graphic representation of any GUI item\n"
  1912. " NOTE: all sizes-positions are relative (not pixel sizes-positions)\n\n"
  1913. "Commands:\n\n"
  1914. " SetString <string> - set new default string\n\n"
  1915. " SetColor <color> - set text color\n\n"
  1916. " Play - play animation\n\n"
  1917. " Reset - reset animation\n\n"
  1918. " Goto <node name> - go to animation node\n\n"
  1919. " PlayEffect - play string effect";
  1920. MOP_BEGINLISTCG(GUIWidget, "GUI Widget", '1.00', 1000, GUIDescription, "Interface")
  1921. // MOP_GROUPBEG("Wide screen layout")
  1922. // MOP_BOOL("Use shift aspect", false)
  1923. // MOP_BOOL("Use width aspect", true)
  1924. MOP_ENUMBEG("Layout")
  1925. MOP_ENUMELEMENT("Left")
  1926. MOP_ENUMELEMENT("Center")
  1927. MOP_ENUMELEMENT("Right")
  1928. MOP_ENUMEND
  1929. MOP_ENUM("Layout", "Layout")
  1930. // MOP_GROUPEND()
  1931. MOP_FLOAT("X position", 0.0f)
  1932. MOP_FLOAT("Y position", 0.0f)
  1933. MOP_FLOATEX("Alpha", 1.0f, 0.0f, 1.0f)
  1934. MOP_STRING("Parent id", "")
  1935. MOP_BOOL("Use safe frame", true)
  1936. MOP_FLOAT("Width" , 25.0f)
  1937. MOP_FLOAT("Height", 25.0f)
  1938. MOP_LONG("Draw priority", 0)
  1939. MOP_BOOLC("Use fading", true , "Плавное появление/исчезновение")
  1940. MOP_BOOLC("Use effect", false, "Показывать спецэффект при изменении строки")
  1941. MOP_GROUPBEG("Effect")
  1942. // MOP_LONGC("Effect start", 0, "Первый символ для спецэффекта")
  1943. // MOP_LONGC("Effect count",-1, "Количество символов")
  1944. MOP_FLOAT("Effect time", 0.5f)
  1945. MOP_FLOAT("Effect size", 2.0f)
  1946. MOP_COLOR("Effect color", (dword)-1)
  1947. MOP_GROUPEND()
  1948. MOP_GROUPBEG("Text")
  1949. MOP_LOCSTRING("String id")
  1950. MOP_STRING("Default string", "")
  1951. MOP_STRING("Font name", "DemoFont")
  1952. MOP_FLOAT ("Font size", 40)
  1953. MOP_FLOAT ("Font kerning", 0)
  1954. MOP_COLOR("Font color", Color(1,1,1,1))
  1955. MOP_ENUMBEG("HAlignment")
  1956. MOP_ENUMELEMENT(ALIGN_CENTER)
  1957. MOP_ENUMELEMENT(ALIGN_LEFT)
  1958. MOP_ENUMELEMENT(ALIGN_RIGHT)
  1959. MOP_ENUMEND
  1960. MOP_ENUM("HAlignment", "Horizontal alignment")
  1961. MOP_ENUMBEG("VAlignment")
  1962. MOP_ENUMELEMENT(ALIGN_CENTER)
  1963. MOP_ENUMELEMENT(ALIGN_TOP)
  1964. MOP_ENUMELEMENT(ALIGN_BOTTOM)
  1965. MOP_ENUMEND
  1966. MOP_ENUM("VAlignment", "Vertical alignment")
  1967. MOP_BOOLC("Numeric", false, "Play statistic effect")
  1968. MOP_FLOATEX("Update time", 0.02f, 0.0f, 0.5f)
  1969. MOP_GROUPEND()
  1970. MOP_GROUPBEG("Geometry")
  1971. MOP_STRING("Model", "")
  1972. MOP_STRING("Animation", "")
  1973. MOP_POSITION("Position", Vector(0,0,5));
  1974. MOP_ANGLES ("Angles" , Vector(0.0f));
  1975. MOP_FLOAT("Scale", 1.0f)
  1976. MOP_GROUPBEG("Render params")
  1977. MOP_BOOLC("Disable fog", false, "Fog don't affect to this geometry")
  1978. MOP_COLOR("Color", Color(0.0f, 0.0f, 0.0f, 1.0f))
  1979. MOP_BOOLC("Smooth alpha", false, "Disable alpha test (Make smooth alpha)")
  1980. MOP_BOOLC("Render", true, "Enable primary render")
  1981. MOP_BOOL("Dynamic lighting", false)
  1982. MOP_GROUPEND()
  1983. MOP_GROUPEND()
  1984. MOP_GROUPBEG("Picture")
  1985. MOP_STRING("Texture" , "")
  1986. // MOP_STRING("Texture (16:9)", "")
  1987. MOP_BOOL("Black",false)
  1988. MOP_LONG("First anim frame", 0)
  1989. MOP_LONGEX("Anim frames count", 1, 1, 65536)
  1990. MOP_FLOATEX("Anim frame start x", 0.0f, 0.0f, 1.0f)
  1991. MOP_FLOATEX("Anim frames start y", 0.0f, 0.0f, 1.0f)
  1992. MOP_FLOATEX("Anim frame width", 1.0f, 0.0f, 1.0f)
  1993. MOP_FLOATEX("Anim frames height", 1.0f, 0.0f, 1.0f)
  1994. MOP_LONG("Anim speed (FPS)", 10)
  1995. MOP_ENUMBEG("Play Method")
  1996. MOP_ENUMELEMENT(PLAY_CONTINIOUS)
  1997. MOP_ENUMELEMENT(PLAY_ONCE_ON_ACTIVATION)
  1998. MOP_ENUMELEMENT(PLAY_ONCE_ON_SHOW)
  1999. MOP_ENUMELEMENT(PLAY_ONCE_BY_COMMAND)
  2000. MOP_ENUMEND
  2001. MOP_ENUM("Play Method", "Play Method")
  2002. MOP_GROUPEND()
  2003. MOP_GROUPBEG("Subtitles")
  2004. MOP_BOOL("Use", false)
  2005. MOP_FLOAT("Total time", 0.0f)
  2006. MOP_LONG("Priority", 0)
  2007. MOP_BOOL("Debug", false)
  2008. MOP_GROUPEND()
  2009. // MOP_BOOLC("Anim", false, "Анимировать динамические подсказки")
  2010. MOP_FLOATEXC("Anim speed", 3.0f, 0.0f, 10.0f, "Скорость анимации подсказок")
  2011. MOP_BOOL("Visible", true)
  2012. MOP_BOOL("Aspect width", false)
  2013. MOP_ENDLIST(GUIWidget)