Keyframe.cpp 106 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142
  1. /* Keyframovy animacni modul - slohnuto z:
  2. Splines & Quaternions (splines.txt)
  3. -----------------------------------
  4. by
  5. Jochen Wilhelmy
  6. a.k.a.
  7. digisnap
  8. digisnap@cs.tu-berlin.de
  9. 06.08.1997
  10. */
  11. #include <alloca.h>
  12. #include "Berusky_universal.h"
  13. #include "3d_all.h"
  14. #define DELTA_INTERVAL 0.01f
  15. #define LIB3DS_EPSILON (1e-8)
  16. #define MAX_SIM_RADKU 2000
  17. /******************************************************************************
  18. Debug-rozhrani
  19. ******************************************************************************
  20. */
  21. void dbg_print_matrix(GLMATRIX * m)
  22. {
  23. #define PRESNOST2 "%f %f %f %f"
  24. dbgprintf(PRESNOST2, m->_11, m->_21, m->_31, m->_41);
  25. dbgprintf(PRESNOST2, m->_12, m->_22, m->_32, m->_42);
  26. dbgprintf(PRESNOST2, m->_13, m->_23, m->_33, m->_43);
  27. dbgprintf(PRESNOST2, m->_14, m->_24, m->_34, m->_44);
  28. }
  29. void kprintf_matrix(GLMATRIX * m)
  30. {
  31. #define PRESNOST2 "%f %f %f %f"
  32. kprintf(TRUE, PRESNOST2, m->_11, m->_21, m->_31, m->_41);
  33. kprintf(TRUE, PRESNOST2, m->_12, m->_22, m->_32, m->_42);
  34. kprintf(TRUE, PRESNOST2, m->_13, m->_23, m->_33, m->_43);
  35. kprintf(TRUE, PRESNOST2, m->_14, m->_24, m->_34, m->_44);
  36. }
  37. void kprint_matrix(GLMATRIX * m)
  38. {
  39. #define PRESNOST3 "%.2f %.2f %.2f %.2f"
  40. kprintf(TRUE, PRESNOST3, m->_11, m->_21, m->_31, m->_41);
  41. kprintf(TRUE, PRESNOST3, m->_12, m->_22, m->_32, m->_42);
  42. kprintf(TRUE, PRESNOST3, m->_13, m->_23, m->_33, m->_43);
  43. kprintf(TRUE, PRESNOST3, m->_14, m->_24, m->_34, m->_44);
  44. }
  45. void dbg_print_track_uhel(TRACK_INFO * p_track)
  46. {
  47. word i;
  48. dbgprintf("Uhlovy track....");
  49. for (i = 0; i < p_track->rot_keys; i++) {
  50. dbgprintf("U: %d Uhel %f Osa [x = %f][y = %f][z = %f]", i,
  51. p_track->p_rot[i].angle * 180.0f / PI, p_track->p_rot[i].x,
  52. p_track->p_rot[i].y, p_track->p_rot[i].z);
  53. }
  54. }
  55. void dbg_print_track_quaternion(TRACK_INFO * p_track)
  56. {
  57. QUAT qa;
  58. word i;
  59. dbgprintf("Quat track....");
  60. for (i = 0; i < p_track->rot_keys; i++) {
  61. key_rotkey_to_quat(p_track->p_rot + i, &qa);
  62. dbgprintf("A: %d Absolutne [x = %f][y = %f][z = %f][w = %f]", i, qa.x,
  63. qa.y, qa.z, qa.w);
  64. }
  65. }
  66. void dbg_print_track_abs(TRACK_INFO * p_track)
  67. {
  68. QUAT qa;
  69. word i;
  70. dbgprintf("Absolutni track...");
  71. for (i = 0; i < p_track->rot_keys; i++) {
  72. qa = p_track->p_at[i];
  73. dbgprintf("%d Absolutne [x = %f][y = %f][z = %f][w = %f]", i, qa.x, qa.y,
  74. qa.z, qa.w);
  75. }
  76. }
  77. void dbg_print_track_abs_uhel(TRACK_INFO * p_track)
  78. {
  79. QUAT qa;
  80. word i;
  81. dbgprintf("Absolutni uhlovy track...");
  82. for (i = 0; i < p_track->rot_keys; i++) {
  83. quat_to_quat_angle(p_track->p_at + i, &qa);
  84. dbgprintf("U: %d Uhel %f Osa [x = %f][y = %f][z = %f]", i,
  85. qa.w * 180.0f / PI, qa.x, qa.y, qa.z);
  86. }
  87. }
  88. /*------------------------------------------------------------
  89. Modifikonvane universalni fce.
  90. ------------------------------------------------------------
  91. */
  92. /* Pokud je frame klicem -> vrati jeho cislo, jinak K_CHYBA
  93. */
  94. int key_je_frame_klic(KEY_POINT_BRS * p_list, int klicu, dword frame)
  95. {
  96. int l, p, s;
  97. dword time = frame * SIM_KONSTI;
  98. l = 0;
  99. p = klicu;
  100. if (!klicu || !p_list || time < p_list->time
  101. || time > p_list[klicu - 1].time)
  102. return (K_CHYBA);
  103. if (time == p_list->time)
  104. return (0);
  105. if (time == p_list[klicu - 1].time)
  106. return (klicu - 1);
  107. while (l != p) {
  108. // while(l < p) {
  109. s = l + ((p - l) >> 1);
  110. if (p_list[s].time == time)
  111. return (s);
  112. else {
  113. if (time > p_list[s].time) {
  114. if (time < p_list[s + 1].time)
  115. return (K_CHYBA);
  116. else
  117. l = s;
  118. }
  119. else
  120. p = s;
  121. }
  122. }
  123. return (K_CHYBA);
  124. }
  125. int key_je_time_klic(KEY_POINT_BRS * p_list, int klicu, dword time)
  126. {
  127. int l, p, s;
  128. l = 0;
  129. p = klicu;
  130. if (!klicu || !p_list || time < p_list->time
  131. || time > p_list[klicu - 1].time)
  132. return (K_CHYBA);
  133. if (time == p_list->time)
  134. return (0);
  135. if (time == p_list[klicu - 1].time)
  136. return (klicu - 1);
  137. while (l != p) {
  138. // while(l < p) {
  139. s = l + ((p - l) >> 1);
  140. if (p_list[s].time == time)
  141. return (s);
  142. else {
  143. if (time > p_list[s].time) {
  144. if (time < p_list[s + 1].time)
  145. return (K_CHYBA);
  146. else
  147. l = s;
  148. }
  149. else
  150. p = s;
  151. }
  152. }
  153. return (K_CHYBA);
  154. }
  155. // najde tento frame nebo nejblizsi levy klic
  156. inline static int key_najdi_klice(KEY_POINT_BRS * p_list, int klicu,
  157. dword time)
  158. {
  159. int l, p, s;
  160. l = 0;
  161. p = klicu;
  162. while (l != p) {
  163. s = l + ((p - l) >> 1);
  164. if (p_list[s].time == time)
  165. return (s);
  166. else {
  167. if (time > p_list[s].time) {
  168. if (time < p_list[s + 1].time)
  169. return (s);
  170. else
  171. l = s;
  172. }
  173. else
  174. p = s;
  175. }
  176. }
  177. return (K_CHYBA);
  178. }
  179. /*
  180. ----------------------
  181. Interpolace floatu
  182. ----------------------
  183. */
  184. /* spocita tangentu k pozicnimu klici
  185. trida = 1 -> trida a
  186. = -1 -> trida b
  187. */
  188. float key_tangent_float(float *p_body, KEY_POINT_BRS * p_keys, int kn,
  189. int keynum, int trida, int loop, float *p_tn)
  190. {
  191. float bias, continuity, tension;
  192. float t1, g1, g3;
  193. assert(kn < keynum);
  194. bias = p_keys[kn].bias;
  195. continuity = p_keys[kn].continuity;
  196. tension = p_keys[kn].tension;
  197. if (!kn) {
  198. if (keynum == 2) {
  199. *p_tn = (p_body[1] - p_body[0]) * (1.0f - tension);
  200. return (*p_tn);
  201. }
  202. else {
  203. if (loop) { // prvni klic
  204. g1 = (p_body[0] - p_body[keynum - 1]) * (1.0f + bias);
  205. g3 = (p_body[1] - p_body[0]) * (1.0f - bias) - g1;
  206. *p_tn =
  207. (g1 + g3 * (0.5f + trida * 0.5f * continuity)) * (1.0f - tension);
  208. }
  209. else {
  210. key_tangent_float(p_body, p_keys, 1, keynum, TRIDA_A, loop, &t1);
  211. *p_tn =
  212. ((p_body[kn + 1] - p_body[kn]) * 1.5f - t1 * 0.5f) * (1.0f -
  213. tension);
  214. }
  215. return (*p_tn);
  216. }
  217. }
  218. else if (kn == (keynum - 1)) { // konec - p(n-1), p(n)
  219. if (keynum == 2) {
  220. *p_tn = (p_body[kn] - p_body[kn - 1]) * (1.0f - tension);
  221. return (*p_tn);
  222. }
  223. else {
  224. if (loop) { // posledni klic
  225. g1 = (p_body[kn] - p_body[kn - 1]) * (1.0f + bias);
  226. g3 = (p_body[0] - p_body[kn]) * (1.0f - bias) - g1;
  227. *p_tn =
  228. (g1 + g3 * (0.5f + trida * 0.5f * continuity)) * (1.0f - tension);
  229. }
  230. else {
  231. key_tangent_float(p_body, p_keys, kn - 1, keynum, TRIDA_B, loop, &t1);
  232. *p_tn =
  233. ((p_body[kn] - p_body[kn - 1]) * 1.5f - t1 * 0.5f) * (1.0f -
  234. tension);
  235. }
  236. return (*p_tn);
  237. }
  238. }
  239. else { // stredni bod - mam p(n-1), p(n), p(n+1)
  240. g1 = (p_body[kn] - p_body[kn - 1]) * (1.0f + bias);
  241. g3 = (p_body[kn + 1] - p_body[kn]) * (1.0f - bias) - g1;
  242. *p_tn = (g1 + g3 * (0.5f + trida * 0.5f * continuity)) * (1.0f - tension);
  243. return (*p_tn);
  244. }
  245. }
  246. /* Prepocita kn, kn1, vraci t
  247. vraci:
  248. 0 - pouzit vse (kn,kn1,time)
  249. 1 - pouzit kn
  250. 2 - pouzit kn1
  251. */
  252. #define KN_ALL 0 //pouzit 2 klice + cas
  253. #define KN_KN 1 //pouzit klic 1
  254. // Volat pouze pokud keynum > 1 !!!
  255. inline int key_track_prepocet_knt(KEY_POINT_BRS * p_keys, int keynum,
  256. int time, int endtime, int loop, int *p_kn, int *p_kn1, float *p_time)
  257. {
  258. int start, stop, k1;
  259. int dop, intrv;
  260. int t1, t2;
  261. k1 = keynum - 1;
  262. start = p_keys[0].time;
  263. stop = p_keys[k1].time;
  264. if (time > 2 * endtime) {
  265. time = endtime + time % endtime;
  266. }
  267. assert(time < 2 * endtime);
  268. if (time < start) {
  269. if (loop) {
  270. *p_kn = k1;
  271. *p_kn1 = 0;
  272. dop = endtime - stop;
  273. intrv = dop + start;
  274. *p_time =
  275. (intrv >
  276. DELTA_INTERVAL) ? (float) (time + dop) / (float) intrv : 0.0f;
  277. return (KN_ALL);
  278. }
  279. else {
  280. *p_kn = 0;
  281. return (KN_KN);
  282. }
  283. }
  284. else if (time >= stop) {
  285. if (loop) {
  286. *p_kn = k1;
  287. *p_kn1 = 0; // presah do dalsiho intervalu
  288. intrv = (endtime - stop) + start;
  289. *p_time =
  290. (intrv >
  291. DELTA_INTERVAL) ? (float) (time - stop) / (float) intrv : 0.0f;
  292. return (KN_ALL);
  293. }
  294. else {
  295. *p_kn = k1;
  296. return (KN_KN);
  297. }
  298. }
  299. else {
  300. if (keynum == 2) {
  301. *p_kn = 0;
  302. *p_kn1 = 1;
  303. t1 = p_keys[0].time;
  304. t2 = p_keys[1].time;
  305. }
  306. else {
  307. *p_kn = key_najdi_klice(p_keys, keynum, time);
  308. *p_kn1 = (*p_kn) + 1;
  309. t1 = p_keys[*p_kn].time;
  310. t2 = p_keys[*p_kn1].time;
  311. }
  312. *p_time = (float) (time - t1) / (float) (t2 - t1);
  313. return (KN_ALL);
  314. }
  315. }
  316. float key_track_interpolace_float(float *p_vysl, float *p_body,
  317. KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
  318. {
  319. float pt0, pt1;
  320. float t, t2, t3;
  321. int ret;
  322. int kn, kn1;
  323. if (keynum > 1) {
  324. ret =
  325. key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
  326. &t);
  327. if (ret == KN_ALL) {
  328. t2 = t * t;
  329. t3 = t2 * t;
  330. key_tangent_float(p_body, p_keys, kn, keynum, TRIDA_B, loop, &pt0);
  331. key_tangent_float(p_body, p_keys, kn1, keynum, TRIDA_A, loop, &pt1);
  332. return ((*p_vysl =
  333. p_body[kn] * (2 * t3 - 3 * t2 + 1) + pt0 * (t3 - 2 * t2 + t)
  334. + p_body[kn1] * (-2 * t3 + 3 * t2) + pt1 * (t3 - t2)));
  335. }
  336. else {
  337. return (*p_vysl = p_body[kn]);
  338. }
  339. }
  340. else {
  341. if (keynum) {
  342. return (*p_vysl = *p_body);
  343. }
  344. else
  345. return (FLT_MAX);
  346. }
  347. }
  348. float key_track_interpolace_float_linear(float *p_vysl, float *p_body,
  349. KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
  350. {
  351. float t, t2;
  352. int kn, kn1, ret;
  353. if (keynum > 1) {
  354. ret =
  355. key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
  356. &t);
  357. if (ret == KN_ALL) {
  358. t2 = 1.0f - t;
  359. return (*p_vysl = p_body[kn] * t2 + p_body[kn1] * t);
  360. }
  361. else {
  362. return (*p_vysl = p_body[kn]);
  363. }
  364. }
  365. else {
  366. if (keynum) {
  367. return (*p_vysl = *p_body);
  368. }
  369. else
  370. return (FLT_MAX);
  371. }
  372. }
  373. /*
  374. ----------------------
  375. Interpolace bodu
  376. ----------------------
  377. */
  378. /* spocita tangentu k pozicnimu klici
  379. trida = 1 -> trida a
  380. = -1 -> trida b
  381. */
  382. BOD *key_tangent_bod(BOD * p_body, KEY_POINT_BRS * p_keys, int kn, int keynum,
  383. int trida, int loop, BOD * p_tn)
  384. {
  385. int kn_1 = kn - 1, // key k(n-1)
  386. kn1 = kn + 1; // key k(n+1)
  387. float bias, continuity, tension, tmp, tmp2;
  388. BOD *p_p0, *p_p1, *p_p2, t1, g1, g2, g3;
  389. bias = p_keys[kn].bias;
  390. continuity = p_keys[kn].continuity;
  391. tension = p_keys[kn].tension;
  392. if (!kn) {
  393. //kn = 0, zacatek - mam p(n), p(n+1)
  394. p_p1 = p_body + kn;
  395. p_p2 = p_body + kn1;
  396. if (keynum == 2) {
  397. //track ma jen 2 klice
  398. //b0 = (p1-p0)*(1-T)
  399. tmp = 1.0f - tension;
  400. p_tn->x = (p_p2->x - p_p1->x) * tmp;
  401. p_tn->y = (p_p2->y - p_p1->y) * tmp;
  402. p_tn->z = (p_p2->z - p_p1->z) * tmp;
  403. return (p_tn);
  404. }
  405. else { // zacatecni tangenta
  406. if (loop) {
  407. p_p0 = p_body + keynum - 1;
  408. }
  409. else {
  410. // trak ma vice klicu
  411. key_tangent_bod(p_body, p_keys, 1, keynum, TRIDA_A, loop, &t1);
  412. // b0 = ((p1 - p0)*1.5 - a1*0.5)*(1-T)
  413. tmp = 1.0f - tension;
  414. p_tn->x = ((p_p2->x - p_p1->x) * 1.5f - t1.x * 0.5f) * tmp;
  415. p_tn->y = ((p_p2->y - p_p1->y) * 1.5f - t1.y * 0.5f) * tmp;
  416. p_tn->z = ((p_p2->z - p_p1->z) * 1.5f - t1.z * 0.5f) * tmp;
  417. return (p_tn);
  418. }
  419. }
  420. }
  421. else if (kn == (keynum - 1)) { // konec - p(n-1), p(n)
  422. p_p0 = p_body + kn_1;
  423. p_p1 = p_body + kn;
  424. if (keynum == 2) {
  425. //track ma jen 2 klice
  426. //a1 = (p1-p0)*(1-T)
  427. tmp = 1.0f - tension;
  428. p_tn->x = (p_p1->x - p_p0->x) * tmp;
  429. p_tn->y = (p_p1->y - p_p0->y) * tmp;
  430. p_tn->z = (p_p1->z - p_p0->z) * tmp;
  431. return (p_tn);
  432. }
  433. else {
  434. if (loop) { // koncova tangenta
  435. p_p2 = p_body;
  436. }
  437. else {
  438. // bez opakovani
  439. key_tangent_bod(p_body, p_keys, kn_1, keynum, TRIDA_B, loop, &t1);
  440. // an = ((pn - p(n-1))*1.5 - b(n-1)*0.5)*(1-T)
  441. tmp = 1.0f - tension;
  442. p_tn->x = ((p_p1->x - p_p0->x) * 1.5f - t1.x * 0.5f) * tmp;
  443. p_tn->y = ((p_p1->y - p_p0->y) * 1.5f - t1.y * 0.5f) * tmp;
  444. p_tn->z = ((p_p1->z - p_p0->z) * 1.5f - t1.z * 0.5f) * tmp;
  445. return (p_tn);
  446. }
  447. }
  448. }
  449. else { // stredni bod - mam p(n-1), p(n), p(n+1)
  450. p_p0 = p_body + kn_1;
  451. p_p1 = p_body + kn;
  452. p_p2 = p_body + kn1;
  453. }
  454. // g1 = (pn - p(n-1))*(1+B)
  455. tmp = 1.0f + bias;
  456. g1.x = (p_p1->x - p_p0->x) * tmp;
  457. g1.y = (p_p1->y - p_p0->y) * tmp;
  458. g1.z = (p_p1->z - p_p0->z) * tmp;
  459. // g2 = (p(n+1) - pn)*(1-B)
  460. tmp = 1.0f - bias;
  461. g2.x = (p_p2->x - p_p1->x) * tmp;
  462. g2.y = (p_p2->y - p_p1->y) * tmp;
  463. g2.z = (p_p2->z - p_p1->z) * tmp;
  464. // g3 = g2 - g1,
  465. vektor_sub(&g2, &g1, &g3);
  466. /*
  467. tangent case a: an = (g1 + g3*(0.5 + 0.5*C))*(1-T),
  468. tangent case b: bn = (g1 + g3*(0.5 - 0.5*C))*(1-T).
  469. */
  470. tmp = 1.0f - tension;
  471. tmp2 = 0.5f + trida * 0.5f * continuity;
  472. p_tn->x = (g1.x + g3.x * tmp2) * tmp;
  473. p_tn->y = (g1.y + g3.y * tmp2) * tmp;
  474. p_tn->z = (g1.z + g3.z * tmp2) * tmp;
  475. return (p_tn);
  476. }
  477. BOD *key_track_interpolace_bod(BOD * p_vysl, BOD * p_body,
  478. KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
  479. {
  480. BOD *p0, *p1, pt0, pt1;
  481. float F1, F2, F3, F4;
  482. float t, t2, t3;
  483. int kn, kn1;
  484. int ret;
  485. if (keynum > 1) {
  486. ret =
  487. key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
  488. &t);
  489. if (ret == KN_ALL) {
  490. t2 = t * t;
  491. t3 = t2 * t;
  492. key_tangent_bod(p_body, p_keys, kn, keynum, TRIDA_B, loop, &pt0);
  493. key_tangent_bod(p_body, p_keys, kn1, keynum, TRIDA_A, loop, &pt1);
  494. p0 = p_body + kn;
  495. p1 = p_body + kn1;
  496. F1 = 2 * t3 - 3 * t2 + 1;
  497. F2 = t3 - 2 * t2 + t;
  498. F3 = -2 * t3 + 3 * t2;
  499. F4 = t3 - t2;
  500. p_vysl->x = p0->x * F1 + pt0.x * F2 + p1->x * F3 + pt1.x * F4;
  501. p_vysl->y = p0->y * F1 + pt0.y * F2 + p1->y * F3 + pt1.y * F4;
  502. p_vysl->z = p0->z * F1 + pt0.z * F2 + p1->z * F3 + pt1.z * F4;
  503. }
  504. else {
  505. *p_vysl = p_body[kn];
  506. }
  507. }
  508. else {
  509. if (keynum) {
  510. *p_vysl = *p_body;
  511. }
  512. }
  513. return (p_vysl);
  514. }
  515. BOD *key_track_interpolace_bod_linear(BOD * p_vysl, BOD * p_body,
  516. KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
  517. {
  518. BOD *p_p0, *p_p1;
  519. float t, t2;
  520. int kn, kn1;
  521. int ret;
  522. if (keynum > 1) {
  523. ret =
  524. key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
  525. &t);
  526. if (ret == KN_ALL) {
  527. t2 = 1.0f - t;
  528. p_p0 = p_body + kn;
  529. p_p1 = p_body + kn1;
  530. p_vysl->x = p_p0->x * t2 + p_p1->x * t;
  531. p_vysl->y = p_p0->y * t2 + p_p1->y * t;
  532. p_vysl->z = p_p0->z * t2 + p_p1->z * t;
  533. }
  534. else {
  535. *p_vysl = p_body[kn];
  536. }
  537. }
  538. else {
  539. if (keynum) {
  540. *p_vysl = *p_body;
  541. }
  542. }
  543. return (p_vysl);
  544. }
  545. /*
  546. ---------------------------
  547. Interpolace ctyr-bodu
  548. ---------------------------
  549. */
  550. /* spocita tangentu k pozicnimu klici
  551. trida = 1 -> trida a
  552. = -1 -> trida b
  553. */
  554. WBOD *key_tangent_wbod(WBOD * p_body, KEY_POINT_BRS * p_keys, int kn,
  555. int keynum, int trida, int loop, WBOD * p_tn)
  556. {
  557. int kn_1 = kn - 1, // key k(n-1)
  558. kn1 = kn + 1; // key k(n+1)
  559. float bias, continuity, tension, tn1, bp1;
  560. WBOD *p_p0, *p_p1, *p_p2, t1, g1, g2, g3;
  561. bias = p_keys[kn].bias;
  562. continuity = p_keys[kn].continuity;
  563. tension = p_keys[kn].tension;
  564. if (!kn) {
  565. //kn = 0, zacatek - mam p(n), p(n+1)
  566. p_p1 = p_body + kn;
  567. p_p2 = p_body + kn1;
  568. if (keynum == 2) {
  569. //track ma jen 2 klice
  570. //b0 = (p1-p0)*(1-T)
  571. tn1 = (1.0f - tension);
  572. p_tn->x = (p_p2->x - p_p1->x) * tn1;
  573. p_tn->y = (p_p2->y - p_p1->y) * tn1;
  574. p_tn->z = (p_p2->z - p_p1->z) * tn1;
  575. p_tn->w = (p_p2->w - p_p1->w) * tn1;
  576. return (p_tn);
  577. }
  578. else {
  579. if (loop) {
  580. p_p0 = p_body + keynum - 1;
  581. }
  582. else {
  583. // trak ma vice klicu
  584. key_tangent_wbod(p_body, p_keys, 1, keynum, TRIDA_A, loop, &t1);
  585. tn1 = (1.0f - tension);
  586. // b0 = ((p1 - p0)*1.5 - a1*0.5)*(1-T)
  587. p_tn->x = ((p_p2->x - p_p1->x) * 1.5f - t1.x * 0.5f) * tn1;
  588. p_tn->y = ((p_p2->y - p_p1->y) * 1.5f - t1.y * 0.5f) * tn1;
  589. p_tn->z = ((p_p2->z - p_p1->z) * 1.5f - t1.z * 0.5f) * tn1;
  590. p_tn->w = ((p_p2->w - p_p1->w) * 1.5f - t1.w * 0.5f) * tn1;
  591. return (p_tn);
  592. }
  593. }
  594. }
  595. else if (kn == (keynum - 1)) { // konec - p(n-1), p(n)
  596. p_p0 = p_body + kn_1;
  597. p_p1 = p_body + kn;
  598. if (keynum == 2) {
  599. //track ma jen 2 klice
  600. //a1 = (p1-p0)*(1-T)
  601. tn1 = (1.0f - tension);
  602. p_tn->x = (p_p1->x - p_p0->x) * tn1;
  603. p_tn->y = (p_p1->y - p_p0->y) * tn1;
  604. p_tn->z = (p_p1->z - p_p0->z) * tn1;
  605. p_tn->w = (p_p1->w - p_p0->w) * tn1;
  606. return (p_tn);
  607. }
  608. else {
  609. if (loop) {
  610. p_p2 = p_body;
  611. }
  612. else {
  613. // bez opakovani
  614. key_tangent_wbod(p_body, p_keys, kn_1, keynum, TRIDA_B, loop, &t1);
  615. // an = ((pn - p(n-1))*1.5 - b(n-1)*0.5)*(1-T)
  616. tn1 = (1.0f - tension);
  617. p_tn->x = ((p_p1->x - p_p0->x) * 1.5f - t1.x * 0.5f) * tn1;
  618. p_tn->y = ((p_p1->y - p_p0->y) * 1.5f - t1.y * 0.5f) * tn1;
  619. p_tn->z = ((p_p1->z - p_p0->z) * 1.5f - t1.z * 0.5f) * tn1;
  620. p_tn->w = ((p_p1->w - p_p0->w) * 1.5f - t1.w * 0.5f) * tn1;
  621. return (p_tn);
  622. }
  623. }
  624. }
  625. else { // stredni bod - mam p(n-1), p(n), p(n+1)
  626. p_p0 = p_body + kn_1;
  627. p_p1 = p_body + kn;
  628. p_p2 = p_body + kn1;
  629. }
  630. bp1 = 1.0f + bias;
  631. // g1 = (pn - p(n-1))*(1+B)
  632. g1.x = (p_p1->x - p_p0->x) * bp1;
  633. g1.y = (p_p1->y - p_p0->y) * bp1;
  634. g1.z = (p_p1->z - p_p0->z) * bp1;
  635. g1.w = (p_p1->w - p_p0->w) * bp1;
  636. // g2 = (p(n+1) - pn)*(1-B)
  637. g2.x = (p_p2->x - p_p1->x) * bp1;
  638. g2.y = (p_p2->y - p_p1->y) * bp1;
  639. g2.z = (p_p2->z - p_p1->z) * bp1;
  640. g2.w = (p_p2->w - p_p1->w) * bp1;
  641. // g3 = g2 - g1,
  642. wvektor_sub(&g2, &g1, &g3);
  643. /*
  644. tangent case a: an = (g1 + g3*(0.5 + 0.5*C))*(1-T),
  645. tangent case b: bn = (g1 + g3*(0.5 - 0.5*C))*(1-T).
  646. */
  647. tn1 = (1.0f - tension);
  648. bp1 = (0.5f + trida * 0.5f * continuity);
  649. p_tn->x = (g1.x + g3.x * bp1) * tn1;
  650. p_tn->y = (g1.y + g3.y * bp1) * tn1;
  651. p_tn->z = (g1.z + g3.z * bp1) * tn1;
  652. p_tn->w = (g1.w + g3.w * bp1) * tn1;
  653. return (p_tn);
  654. }
  655. WBOD *key_track_interpolace_wbod(WBOD * p_vysl, WBOD * p_body,
  656. KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
  657. {
  658. WBOD *p0, *p1, pt0, pt1;
  659. float F1, F2, F3, F4;
  660. float t, t2, t3;
  661. int kn, kn1;
  662. int ret;
  663. if (keynum > 1) {
  664. ret =
  665. key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
  666. &t);
  667. if (ret == KN_ALL) {
  668. t2 = t * t;
  669. t3 = t2 * t;
  670. key_tangent_wbod(p_body, p_keys, kn, keynum, TRIDA_B, loop, &pt0);
  671. key_tangent_wbod(p_body, p_keys, kn1, keynum, TRIDA_A, loop, &pt1);
  672. p0 = p_body + kn;
  673. p1 = p_body + kn1;
  674. F1 = 2 * t3 - 3 * t2 + 1;
  675. F2 = t3 - 2 * t2 + t;
  676. F3 = -2 * t3 + 3 * t2;
  677. F4 = t3 - t2;
  678. p_vysl->x = p0->x * F1 + pt0.x * F2 + p1->x * F3 + pt1.x * F4;
  679. p_vysl->y = p0->y * F1 + pt0.y * F2 + p1->y * F3 + pt1.y * F4;
  680. p_vysl->z = p0->z * F1 + pt0.z * F2 + p1->z * F3 + pt1.z * F4;
  681. p_vysl->w = p0->w * F1 + pt0.w * F2 + p1->w * F3 + pt1.w * F4;
  682. }
  683. else {
  684. *p_vysl = p_body[kn];
  685. }
  686. }
  687. else {
  688. if (keynum) {
  689. *p_vysl = *p_body;
  690. }
  691. }
  692. return (p_vysl);
  693. }
  694. WBOD *key_track_interpolace_wbod_linear(WBOD * p_vysl, WBOD * p_body,
  695. KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
  696. {
  697. WBOD *p_p0, *p_p1;
  698. float t, t2;
  699. int kn, kn1;
  700. int ret;
  701. if (keynum > 1) {
  702. ret =
  703. key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
  704. &t);
  705. if (ret == KN_ALL) {
  706. t2 = 1.0f - t;
  707. p_p0 = p_body + kn;
  708. p_p1 = p_body + kn1;
  709. p_vysl->x = p_p0->x * t2 + p_p1->x * t;
  710. p_vysl->y = p_p0->y * t2 + p_p1->y * t;
  711. p_vysl->z = p_p0->z * t2 + p_p1->z * t;
  712. p_vysl->w = p_p0->w * t2 + p_p1->w * t;
  713. }
  714. else {
  715. *p_vysl = p_body[kn];
  716. }
  717. }
  718. else {
  719. if (keynum) {
  720. *p_vysl = *p_body;
  721. }
  722. }
  723. return (p_vysl);
  724. }
  725. /*
  726. ---------------------------
  727. Interpolace Quaternionu
  728. ---------------------------
  729. */
  730. QUAT *key_tangent_quat(QUAT * p_at, KEY_POINT_BRS * p_rkeys, int kn,
  731. int keynum, int trida, int loop, QUAT * p_q)
  732. {
  733. int kn_1 = kn - 1, // key k(n-1)
  734. kn1 = kn + 1; // key k(n+1)
  735. float bias, continuity, tension;
  736. QUAT q0, /*q1, */ q2, g1, g2, g3;
  737. bias = p_rkeys[kn].bias;
  738. continuity = p_rkeys[kn].continuity;
  739. tension = p_rkeys[kn].tension;
  740. if (!kn) {
  741. //kn = 0, zacatek - mam p(n), p(n+1)
  742. if (keynum == 2) { //track ma jen 2 klice
  743. return (slerp(p_at + kn, p_at + kn1, (1.0f - tension) / 3.0f, p_q));
  744. }
  745. else { // prvni body (-1,0,1)
  746. if (loop) {
  747. return (slerp(p_at + kn, slerp(slerp(p_at + kn, p_at + keynum - 1,
  748. -(1 + bias) / 3.0f, &g1), slerp(p_at + kn, p_at + kn1,
  749. (1 - bias) / 3.0f, &g2), 0.5f + trida * 0.5f * continuity,
  750. &g3), trida * (tension - 1.0f), p_q));
  751. }
  752. else {
  753. key_tangent_quat(p_at, p_rkeys, kn1, keynum, TRIDA_B, loop, &q2);
  754. return (slerp(p_at + kn, &q2, (1.0f - tension) * 0.5f, p_q));
  755. }
  756. }
  757. }
  758. else if (kn == (int) keynum - 1) { // konec - p(n-1), p(n)
  759. if (keynum == 2) { //track ma jen 2 klice
  760. return (slerp(p_at + kn, p_at + kn_1, (1.0f - tension) / 3.0f, p_q));
  761. }
  762. else { // posledni body bez opakovani
  763. if (loop) { // posledni (-2,-1,0)
  764. return (slerp(p_at + kn, slerp(slerp(p_at + kn, p_at + kn_1,
  765. -(1 + bias) / 3.0f, &g1), slerp(p_at + kn, p_at,
  766. (1 - bias) / 3.0f, &g2), 0.5f + trida * 0.5f * continuity,
  767. &g3), trida * (tension - 1.0f), p_q));
  768. }
  769. else {
  770. key_tangent_quat(p_at, p_rkeys, kn_1, keynum, TRIDA_A, loop, &q0);
  771. return (slerp(p_at + kn, &q0, (1.0f - tension) * 0.5f, p_q));
  772. }
  773. }
  774. }
  775. else { // stredni bod - mam q(n-1), q(n), q(n+1)
  776. return (slerp(p_at + kn, slerp(slerp(p_at + kn, p_at + kn_1,
  777. -(1 + bias) / 3.0f, &g1), slerp(p_at + kn, p_at + kn1,
  778. (1 - bias) / 3.0f, &g2), 0.5f + trida * 0.5f * continuity, &g3),
  779. trida * (tension - 1.0f), p_q));
  780. }
  781. }
  782. QUAT *key_track_interpolace_quat(QUAT * p_quat, QUAT * p_at,
  783. KEY_POINT_BRS * p_rkeys, int time, int endtime, int keynum, int loop)
  784. {
  785. QUAT q0, q1, q2;
  786. QUAT qn, qn1;
  787. QUAT bn, an;
  788. int kn, kn1;
  789. float t;
  790. int ret;
  791. if (keynum > 1) {
  792. ret =
  793. key_track_prepocet_knt(p_rkeys, keynum, time, endtime, loop, &kn, &kn1,
  794. &t);
  795. if (ret == KN_ALL) {
  796. assert(0.0f <= t && t <= 1.0f);
  797. key_tangent_quat(p_at, p_rkeys, kn, keynum, TRIDA_B, loop, &bn);
  798. key_tangent_quat(p_at, p_rkeys, kn1, keynum, TRIDA_A, loop, &an);
  799. qn = p_at[kn];
  800. qn1 = p_at[kn1];
  801. slerp(&qn, &bn, t, &q0);
  802. slerp(&bn, &an, t, &q1);
  803. slerp(&an, &qn1, t, &q2);
  804. slerp(&q0, &q1, t, &qn);
  805. slerp(&q1, &q2, t, &qn1);
  806. return (slerp(&qn, &qn1, t, p_quat));
  807. }
  808. else {
  809. *p_quat = p_at[kn];
  810. return (p_quat);
  811. }
  812. }
  813. else {
  814. if (keynum) {
  815. *p_quat = *p_at;
  816. return (p_quat);
  817. }
  818. else
  819. return (NULL);
  820. }
  821. }
  822. QUAT *key_track_interpolace_quat_linear(QUAT * p_quat, QUAT * p_at,
  823. KEY_POINT_BRS * p_rkeys, int time, int endtime, int keynum, int loop)
  824. {
  825. int kn, kn1;
  826. float t;
  827. int ret;
  828. if (keynum > 1) {
  829. ret =
  830. key_track_prepocet_knt(p_rkeys, keynum, time, endtime, loop, &kn, &kn1,
  831. &t);
  832. if (ret == KN_ALL) {
  833. assert(0.0f <= t && t <= 1.0f);
  834. return (slerp(p_at + kn, p_at + kn1, t, p_quat));
  835. }
  836. else {
  837. *p_quat = p_at[kn];
  838. return (p_quat);
  839. }
  840. }
  841. else {
  842. if (keynum) {
  843. *p_quat = *p_at;
  844. return (p_quat);
  845. }
  846. else
  847. return (NULL);
  848. }
  849. }
  850. /* Pole hodnot o velikosti size_of_hodnota*keynum, p_keys*size_of_hodnota
  851. najdu frame a vlozim to tam
  852. */
  853. int key_track_klic_vloz(byte ** p_hodnoty, KEY_POINT_BRS ** p_skeys,
  854. int keynum, int size_of_hodnota, byte * p_new_hodnota,
  855. KEY_POINT_BRS * p_new_keys)
  856. {
  857. KEY_POINT_BRS *p_nkeys;
  858. byte *p_nhod;
  859. KEY_POINT_BRS *p_keys = *p_skeys;
  860. byte *p_hod = *p_hodnoty;
  861. int i, j;
  862. dword new_time = p_new_keys->time;
  863. p_nhod = (byte *) mmalloc(size_of_hodnota * (keynum + 1));
  864. p_nkeys = (KEY_POINT_BRS *) mmalloc(sizeof(p_nkeys[0]) * (keynum + 1));
  865. // Vlozit pred nulovym framem
  866. if (keynum && new_time < p_keys[0].time) {
  867. p_nkeys[0] = *p_new_keys;
  868. memcpy(p_nhod, p_new_hodnota, size_of_hodnota);
  869. memcpy(p_nkeys + 1, p_keys, sizeof(p_nkeys[0]) * keynum);
  870. memcpy(p_nhod + size_of_hodnota, p_hod, size_of_hodnota * keynum);
  871. // Vlozit za nulovym framem
  872. }
  873. else if (!keynum || p_keys[keynum - 1].time < new_time) {
  874. memcpy(p_nkeys, p_keys, sizeof(p_nkeys[0]) * keynum);
  875. memcpy(p_nhod, p_hod, size_of_hodnota * keynum);
  876. p_nkeys[keynum] = *p_new_keys;
  877. memcpy(p_nhod + keynum * size_of_hodnota, p_new_hodnota, size_of_hodnota);
  878. }
  879. else {
  880. // kopie vseho bez noveho framu
  881. for (i = 0, j = 0; i < keynum; i++, j++) {
  882. if (p_keys[i].time <= new_time && new_time < p_keys[i + 1].time) {
  883. p_nkeys[j] = p_keys[i];
  884. memcpy(p_nhod + j * size_of_hodnota, p_hod + i * size_of_hodnota,
  885. size_of_hodnota);
  886. j++;
  887. p_nkeys[j] = *p_new_keys;
  888. memcpy(p_nhod + j * size_of_hodnota, p_new_hodnota, size_of_hodnota);
  889. }
  890. else {
  891. p_nkeys[j] = p_keys[i];
  892. memcpy(p_nhod + j * size_of_hodnota, p_hod + i * size_of_hodnota,
  893. size_of_hodnota);
  894. }
  895. }
  896. }
  897. free(p_keys);
  898. free(p_hod);
  899. *p_hodnoty = p_nhod;
  900. *p_skeys = p_nkeys;
  901. return (keynum + 1);
  902. }
  903. // Automaticke vlozeni klice do seznamu
  904. int key_track_klic_vloz_auto(byte ** p_hodnoty, KEY_POINT_BRS ** p_skeys,
  905. int keynum, int size_of_hodnota, byte * p_new_hodnota,
  906. KEY_POINT_BRS * p_new_keys)
  907. {
  908. int klic;
  909. if ((klic =
  910. key_je_frame_klic(*p_skeys, keynum, p_new_keys->time)) == K_CHYBA) {
  911. return (key_track_klic_vloz(p_hodnoty, p_skeys, keynum, size_of_hodnota,
  912. p_new_hodnota, p_new_keys));
  913. }
  914. else {
  915. memcpy((*p_skeys) + klic, p_new_keys, sizeof(p_new_keys[0]));
  916. memcpy((*p_hodnoty) + klic * size_of_hodnota, p_new_hodnota,
  917. size_of_hodnota);
  918. return (keynum);
  919. }
  920. }
  921. int key_track_klic_smaz(byte ** p_hodnoty, KEY_POINT_BRS ** p_skeys,
  922. int *p_keynum, int size_of_hodnota, dword del_time)
  923. {
  924. KEY_POINT_BRS *p_nkeys;
  925. byte *p_nhod;
  926. KEY_POINT_BRS *p_keys = *p_skeys;
  927. byte *p_hod = *p_hodnoty;
  928. int i, j, keynum = *p_keynum;
  929. if (keynum == 1) {
  930. null_free((void **) p_hodnoty);
  931. null_free((void **) p_skeys);
  932. return ((*p_keynum = 0));
  933. }
  934. else {
  935. p_nhod = (byte *) mmalloc(size_of_hodnota * (keynum - 1));
  936. p_nkeys = (KEY_POINT_BRS *) mmalloc(sizeof(p_nkeys[0]) * (keynum - 1));
  937. if (p_keys[keynum - 1].time == del_time) {
  938. memcpy(p_nkeys, p_keys, sizeof(p_nkeys[0]) * (keynum - 1));
  939. memcpy(p_nhod, p_hod, size_of_hodnota * (keynum - 1));
  940. }
  941. else {
  942. // kopie vseho bez noveho framu
  943. for (i = 0, j = 0; i < keynum; i++, j++) {
  944. if (p_keys[i].time != del_time) {
  945. p_nkeys[j] = p_keys[i];
  946. memcpy(p_nhod + j * size_of_hodnota, p_hod + i * size_of_hodnota,
  947. size_of_hodnota);
  948. }
  949. else {
  950. j--;
  951. }
  952. }
  953. }
  954. free(p_keys);
  955. free(p_hod);
  956. *p_hodnoty = p_nhod;
  957. *p_skeys = p_nkeys;
  958. return ((*p_keynum)--);
  959. }
  960. }
  961. /*****************************************************************************
  962. Key-frame animace
  963. *****************************************************************************
  964. */
  965. void key_pivot_sub(EDIT_OBJEKT * p_obj, BOD * p_pivot)
  966. {
  967. int v;
  968. for (v = 0; v < p_obj->vertexnum; v++) {
  969. p_obj->p_vertex[v].x -= p_pivot->x;
  970. p_obj->p_vertex[v].y -= p_pivot->y;
  971. p_obj->p_vertex[v].z -= p_pivot->z;
  972. }
  973. }
  974. void key_tri_to_matrix_zero(GLMATRIX * p_m, HIERARCHY_TRACK_INFO * p_track)
  975. {
  976. if (p_track) {
  977. init_matrix(p_m);
  978. if (p_track->rot_keys)
  979. quat_to_matrix(p_m, p_track->p_at);
  980. if (p_track->scs_keys) {
  981. scale_matrix(p_m, p_track->p_scale[0].x,
  982. p_track->p_scale[0].y, p_track->p_scale[0].z);
  983. }
  984. if (p_track->pos_keys) {
  985. p_m->_41 = p_track->p_pos[0].x;
  986. p_m->_42 = p_track->p_pos[0].y;
  987. p_m->_43 = p_track->p_pos[0].z;
  988. }
  989. }
  990. }
  991. static int key_konec_prochazeni;
  992. /* Rekurzivne prida tri do tri-stromu
  993. */
  994. static void key_tri_node_pridej(HIERARCHY_TRACK_INFO * p_tri,
  995. HIERARCHY_TRACK_INFO * p_child)
  996. {
  997. int i;
  998. if (key_konec_prochazeni)
  999. return;
  1000. if (p_tri->objnum == p_child->parentnum) {
  1001. key_tri_child_pridej(p_tri, p_child);
  1002. key_konec_prochazeni = TRUE;
  1003. }
  1004. else {
  1005. for (i = 0; i < p_tri->childnum && !key_konec_prochazeni; i++) {
  1006. key_tri_node_pridej(p_tri->p_child[i], p_child);
  1007. }
  1008. }
  1009. }
  1010. /* rekurzivne prida tri node do rootu
  1011. */
  1012. static void key_root_node_pridej(HIERARCHY_ROOT * p_root,
  1013. HIERARCHY_TRACK_INFO * p_child)
  1014. {
  1015. int i;
  1016. if (p_child->parentnum == ROOT_NODE) {
  1017. key_root_child_pridej(p_root, p_child);
  1018. key_konec_prochazeni = TRUE;
  1019. }
  1020. else {
  1021. for (i = 0; i < p_root->childnum && !key_konec_prochazeni; i++)
  1022. key_tri_node_pridej(p_root->p_child[i], p_child);
  1023. }
  1024. }
  1025. /* vyrobi root animacni strom
  1026. */
  1027. HIERARCHY_ROOT *key_root_vyrob_indir(EDIT_KONTEJNER * p_kont,
  1028. HIERARCHY_ROOT * p_root)
  1029. {
  1030. HIERARCHY_TRACK_INFO *p_tri;
  1031. TRACK_INFO *p_track;
  1032. EDIT_OBJEKT *p_obj;
  1033. //int objnum = p_kont->objektu;
  1034. int o;
  1035. // nastaveni zakladnich veci
  1036. for (o = 0; o < p_kont->max_objektu; o++) {
  1037. if (p_kont->p_obj[o] && p_kont->p_obj[o]->p_track)
  1038. break;
  1039. }
  1040. if (o >= p_kont->max_objektu) {
  1041. //assert(0);
  1042. return (NULL);
  1043. }
  1044. p_track = p_kont->p_obj[o]->p_track;
  1045. p_root->framenum = p_track->framenum;
  1046. p_root->delka = (float) p_root->framenum / (float) FRAMU_PER_SEC;
  1047. // kopie vsech tracku + provazani objektu se scenou
  1048. for (o = 0; o < p_kont->max_objektu; o++) {
  1049. p_obj = p_kont->p_obj[o];
  1050. if (p_obj && (p_track = p_obj->p_track)) { // pokud tento objekt ma track
  1051. p_tri = key_track_to_tri(p_obj->p_track);
  1052. p_tri->p_obj = p_obj;
  1053. key_zrus_track(&p_obj->p_track);
  1054. key_konec_prochazeni = FALSE;
  1055. key_root_node_pridej(p_root, p_tri);
  1056. assert(key_konec_prochazeni);
  1057. }
  1058. }
  1059. return (p_root);
  1060. }
  1061. static float key_najdi_otcovy_scaly(HIERARCHY_TRACK_INFO * p_track)
  1062. {
  1063. if (p_track->p_otec == NULL)
  1064. return ((p_track->scs_keys) ? p_track->p_scale[0].x : 1.0f);
  1065. else
  1066. return ((p_track->scs_keys) ? p_track->p_scale[0].x *
  1067. key_najdi_otcovy_scaly(p_track->
  1068. p_otec) : key_najdi_otcovy_scaly(p_track->p_otec));
  1069. }
  1070. static void key_tri_to_local(HIERARCHY_TRACK_INFO * p_track)
  1071. {
  1072. EDIT_OBJEKT *p_obj;
  1073. GLMATRIX m;
  1074. int i;
  1075. p_obj = (EDIT_OBJEKT *) p_track->p_obj;
  1076. if (key_najdi_otcovy_scaly(p_track) < 0.0f)
  1077. scale_matrix(&p_obj->m, -1.0f, 1.0f, 1.0f);
  1078. // proval to matici a jedeme
  1079. transformuj_objekt_matici(p_obj, invert_matrix(&p_obj->m, &m));
  1080. if (p_track->childnum == 1) {
  1081. key_tri_to_local(p_track->p_child[0]);
  1082. }
  1083. else {
  1084. for (i = 0; i < p_track->childnum; i++) {
  1085. key_tri_to_local(p_track->p_child[i]);
  1086. }
  1087. }
  1088. }
  1089. /*
  1090. static void key_tri_to_local(HIERARCHY_TRACK_INFO *p_track)
  1091. {
  1092. EDIT_OBJEKT *p_obj;
  1093. int i;
  1094. p_obj = (EDIT_OBJEKT *)p_track->p_obj;
  1095. if(key_najdi_otcovy_scaly(p_track) < 0.0f) {
  1096. //scale_matrix(&p_obj->local_matrix,-1.0f,1.0f,1.0f);
  1097. }
  1098. if(p_track->childnum == 1) {
  1099. key_tri_to_local(p_track->p_child[0]);
  1100. } else {
  1101. for(i = 0; i < p_track->childnum; i++) {
  1102. key_tri_to_local(p_track->p_child[i]);
  1103. }
  1104. }
  1105. }
  1106. */
  1107. static void key_tri_to_world(HIERARCHY_TRACK_INFO * p_track)
  1108. {
  1109. EDIT_OBJEKT *p_obj, *p_otec;
  1110. int i;
  1111. p_obj = (EDIT_OBJEKT *) p_track->p_obj;
  1112. key_tri_to_matrix_zero(&p_obj->m, p_track);
  1113. if (p_track->p_otec) {
  1114. p_otec = (EDIT_OBJEKT *) p_track->p_otec->p_obj;
  1115. mat_mult(&p_obj->m, &p_otec->m, &p_obj->m);
  1116. }
  1117. pivotuj_matrix_tam(&p_track->pivot, &p_obj->m);
  1118. if (p_track->childnum == 1) {
  1119. key_tri_to_world(p_track->p_child[0]);
  1120. }
  1121. else {
  1122. for (i = 0; i < p_track->childnum; i++) {
  1123. key_tri_to_world(p_track->p_child[i]);
  1124. }
  1125. }
  1126. }
  1127. /*
  1128. static void key_tri_to_world(HIERARCHY_TRACK_INFO *p_track)
  1129. {
  1130. EDIT_OBJEKT *p_obj,*p_otec;
  1131. int i;
  1132. p_obj = (EDIT_OBJEKT *)p_track->p_obj;
  1133. //key_tri_to_matrix_zero(&p_obj->m, p_track);
  1134. if(p_track->p_otec) {
  1135. p_otec = (EDIT_OBJEKT *)p_track->p_otec->p_obj;
  1136. mat_mult(&p_obj->m,&p_otec->m,&p_obj->m);
  1137. }
  1138. // pivotuj_matrix_tam(&p_track->pivot,&p_obj->m);
  1139. if(p_track->childnum == 1) {
  1140. key_tri_to_world(p_track->p_child[0]);
  1141. } else {
  1142. for(i = 0; i < p_track->childnum; i++) {
  1143. key_tri_to_world(p_track->p_child[i]);
  1144. }
  1145. }
  1146. }
  1147. */
  1148. /* Prevede root do nulove vychozi pozice
  1149. */
  1150. void key_root_to_zero(HIERARCHY_ROOT * p_root)
  1151. {
  1152. int i;
  1153. for (i = 0; i < p_root->childnum; i++) {
  1154. key_tri_to_local(p_root->p_child[i]);
  1155. key_tri_to_world(p_root->p_child[i]);
  1156. }
  1157. }
  1158. /* rekurzivni animace stromu/objektu -
  1159. predavat i horni matici -> jako horni matice 0 je word-matrix !
  1160. */
  1161. void key_tri_to_matrix(HIERARCHY_TRACK_INFO * p_track, int time,
  1162. GLMATRIX * p_otec, int loop)
  1163. {
  1164. EDIT_OBJEKT *p_obj;
  1165. GLMATRIX m;
  1166. QUAT q;
  1167. BOD p;
  1168. int i;
  1169. // spocitej hierarchii
  1170. p_obj = (EDIT_OBJEKT *) p_track->p_obj;
  1171. // spocitej pozici + ostatni veci
  1172. init_matrix(&m);
  1173. if (p_track->p_pos) {
  1174. key_track_interpolace_bod(&p, p_track->p_pos, p_track->p_pkeys, time,
  1175. p_track->endtime, p_track->pos_keys, loop);
  1176. m._41 = p.x;
  1177. m._42 = p.y;
  1178. m._43 = p.z;
  1179. }
  1180. if (p_track->p_at) {
  1181. key_track_interpolace_quat(&q, p_track->p_at, p_track->p_rkeys, time,
  1182. p_track->endtime, p_track->rot_keys, loop);
  1183. quat_to_matrix(&m, &q);
  1184. }
  1185. if (p_track->p_scale) {
  1186. key_track_interpolace_bod(&p, p_track->p_scale, p_track->p_skeys, time,
  1187. p_track->endtime, p_track->scs_keys, loop);
  1188. m._11 *= p.x;
  1189. m._21 *= p.x;
  1190. m._31 *= p.x;
  1191. m._12 *= p.y;
  1192. m._22 *= p.y;
  1193. m._32 *= p.y;
  1194. m._13 *= p.z;
  1195. m._23 *= p.z;
  1196. m._33 *= p.z;
  1197. }
  1198. if (p_track->p_at) {
  1199. pivotuj_matrix_tam(&p_track->pivot, &m);
  1200. }
  1201. // spocitej hierarchii
  1202. p_obj = (EDIT_OBJEKT *) p_track->p_obj;
  1203. mat_mult(&m, p_otec, &p_obj->m); // aktualni*otec => vysledek
  1204. if (p_track->childnum == 1) {
  1205. key_tri_to_matrix(p_track->p_child[0], time, &p_obj->m, loop);
  1206. }
  1207. else {
  1208. for (i = 0; i < p_track->childnum; i++) {
  1209. key_tri_to_matrix(p_track->p_child[i], time, &p_obj->m, loop);
  1210. }
  1211. }
  1212. }
  1213. /*
  1214. void key_tri_to_matrix(HIERARCHY_TRACK_INFO *p_track, int time, GLMATRIX *p_otec, int loop)
  1215. {
  1216. EDIT_OBJEKT *p_obj;
  1217. GLMATRIX m;
  1218. QUAT q;
  1219. BOD p;
  1220. int i;
  1221. // spocitej hierarchii
  1222. p_obj = (EDIT_OBJEKT *)p_track->p_obj;
  1223. // spocitej pozici + ostatni veci
  1224. init_matrix(&m);
  1225. if(p_track->p_pos) {
  1226. key_track_interpolace_bod(&p,p_track->p_pos,p_track->p_pkeys,time,p_track->endtime,p_track->pos_keys,loop);
  1227. m._41 = p.x;
  1228. m._42 = p.y;
  1229. m._43 = p.z;
  1230. }
  1231. if(p_track->p_at) {
  1232. key_track_interpolace_quat(&q,p_track->p_at,p_track->p_rkeys,time,p_track->endtime,p_track->rot_keys,loop);
  1233. quat_to_matrix(&m,&q);
  1234. }
  1235. if(p_track->p_scale) {
  1236. key_track_interpolace_bod(&p,p_track->p_scale,p_track->p_skeys,time,p_track->endtime,p_track->scs_keys,loop);
  1237. scale_matrix(&m,p.x,p.y,p.z);
  1238. }
  1239. // spocitej hierarchii
  1240. p_obj = (EDIT_OBJEKT *)p_track->p_obj;
  1241. mat_mult(&m,p_otec,&m); // aktualni*otec => vysledek
  1242. p_obj->m = m;
  1243. pivotuj_matrix_tam(&p_track->pivot,&p_obj->m);
  1244. mat_mult(&p_obj->local_matrix,&p_obj->m,&p_obj->m);
  1245. if(p_track->childnum == 1) {
  1246. key_tri_to_matrix(p_track->p_child[0], time, &m, loop);
  1247. } else {
  1248. for(i = 0; i < p_track->childnum; i++) {
  1249. key_tri_to_matrix(p_track->p_child[i], time, &m, loop);
  1250. }
  1251. }
  1252. }
  1253. */
  1254. void key_root_to_matrix(HIERARCHY_ROOT * p_root, int time, GLMATRIX * p_otec)
  1255. {
  1256. GLMATRIX m;
  1257. int i;
  1258. if (!p_otec) {
  1259. p_otec = init_matrix(&m);
  1260. }
  1261. for (i = 0; i < p_root->childnum; i++)
  1262. key_tri_to_matrix(p_root->p_child[i], time, p_otec,
  1263. p_root->flag & GK_LOOP);
  1264. }
  1265. // track veci
  1266. TRACK_INFO *key_track_vyrob(int poskey, int rotkey, int scalekey)
  1267. {
  1268. TRACK_INFO *p_track;
  1269. p_track = (TRACK_INFO *) mmalloc(sizeof(TRACK_INFO));
  1270. // pozicni klice
  1271. p_track->pos_keys = poskey;
  1272. p_track->p_pkeys =
  1273. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_pkeys[0]) * poskey);
  1274. p_track->p_pos = (BOD *) mmalloc(sizeof(BOD) * poskey);
  1275. // rotacni klice
  1276. p_track->rot_keys = rotkey;
  1277. p_track->p_rkeys =
  1278. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_rkeys[0]) * rotkey);
  1279. p_track->p_rot = (ROTKEY *) mmalloc(sizeof(ROTKEY) * rotkey);
  1280. p_track->p_at = (QUAT *) mmalloc(sizeof(p_track->p_at[0]) * rotkey);
  1281. // scalovaci klice
  1282. p_track->scs_keys = scalekey;
  1283. p_track->p_skeys =
  1284. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_skeys[0]) * scalekey);
  1285. p_track->p_scale = (BOD *) mmalloc(sizeof(BOD) * scalekey);
  1286. return (p_track);
  1287. }
  1288. HIERARCHY_TRACK_INFO *key_tri_vyrob_indir(HIERARCHY_TRACK_INFO * p_hir,
  1289. int poskey, int rotkey, int scalekey)
  1290. {
  1291. memset(p_hir, 0, sizeof(p_hir[0]));
  1292. // pozicni klice
  1293. if ((p_hir->pos_keys = poskey)) {
  1294. p_hir->p_pkeys =
  1295. (KEY_POINT_BRS *) mmalloc(sizeof(p_hir->p_pkeys[0]) * poskey);
  1296. p_hir->p_pos = (BOD *) mmalloc(sizeof(BOD) * poskey);
  1297. }
  1298. // rotacni klice
  1299. if ((p_hir->rot_keys = rotkey)) {
  1300. p_hir->p_rkeys =
  1301. (KEY_POINT_BRS *) mmalloc(sizeof(p_hir->p_rkeys[0]) * rotkey);
  1302. p_hir->p_at = (QUAT *) mmalloc(sizeof(p_hir->p_at[0]) * rotkey);
  1303. }
  1304. // scalovaci klice
  1305. if ((p_hir->scs_keys = scalekey)) {
  1306. p_hir->p_scale = (BOD *) mmalloc(sizeof(BOD) * scalekey);
  1307. p_hir->p_skeys =
  1308. (KEY_POINT_BRS *) mmalloc(sizeof(p_hir->p_skeys[0]) * scalekey);
  1309. }
  1310. return (p_hir);
  1311. }
  1312. HIERARCHY_TRACK_INFO *key_tri_vyrob(int poskey, int rotkey, int scalekey)
  1313. {
  1314. HIERARCHY_TRACK_INFO *p_hir;
  1315. p_hir = (HIERARCHY_TRACK_INFO *) mmalloc(sizeof(HIERARCHY_TRACK_INFO));
  1316. key_tri_vyrob_indir(p_hir, poskey, rotkey, scalekey);
  1317. return (p_hir);
  1318. }
  1319. HIERARCHY_TRACK_INFO *key_tri_vyrob_un_indir(void)
  1320. {
  1321. HIERARCHY_TRACK_INFO *p_hir;
  1322. p_hir = (HIERARCHY_TRACK_INFO *) mmalloc(sizeof(HIERARCHY_TRACK_INFO));
  1323. return (p_hir);
  1324. }
  1325. // kopie tracku
  1326. HIERARCHY_TRACK_INFO *key_track_to_tri(TRACK_INFO * p_track)
  1327. {
  1328. HIERARCHY_TRACK_INFO *p_tri = key_tri_vyrob(p_track->pos_keys,
  1329. p_track->rot_keys, p_track->scs_keys);
  1330. p_tri->objnum = p_track->objekt;
  1331. p_tri->parentnum = p_track->parent;
  1332. p_tri->pivot = p_track->pivot;
  1333. p_tri->endtime = calc_endtime(p_track->framenum);
  1334. if (p_track->pos_keys) {
  1335. memcpy(p_tri->p_pkeys, p_track->p_pkeys,
  1336. sizeof(p_track->p_pkeys[0]) * p_track->pos_keys);
  1337. memcpy(p_tri->p_pos, p_track->p_pos,
  1338. sizeof(p_track->p_pos[0]) * p_track->pos_keys);
  1339. }
  1340. if (p_track->rot_keys) {
  1341. memcpy(p_tri->p_rkeys, p_track->p_rkeys,
  1342. sizeof(p_track->p_rkeys[0]) * p_track->rot_keys);
  1343. memcpy(p_tri->p_at, p_track->p_at,
  1344. sizeof(p_track->p_at[0]) * p_track->rot_keys);
  1345. }
  1346. if (p_track->scs_keys) {
  1347. memcpy(p_tri->p_skeys, p_track->p_skeys,
  1348. sizeof(p_track->p_skeys[0]) * p_track->scs_keys);
  1349. memcpy(p_tri->p_scale, p_track->p_scale,
  1350. sizeof(p_track->p_scale[0]) * p_track->scs_keys);
  1351. }
  1352. return (p_tri);
  1353. }
  1354. void key_zrus_track(TRACK_INFO ** p_track)
  1355. {
  1356. TRACK_INFO *p_tri = *p_track;
  1357. null_free((void **) &p_tri->p_pkeys);
  1358. null_free((void **) &p_tri->p_pos);
  1359. null_free((void **) &p_tri->p_rkeys);
  1360. null_free((void **) &p_tri->p_rot);
  1361. null_free((void **) &p_tri->p_at);
  1362. null_free((void **) &p_tri->p_skeys);
  1363. null_free((void **) &p_tri->p_scale);
  1364. null_free((void **) &p_tri);
  1365. *p_track = NULL;
  1366. }
  1367. // prida child do track_node
  1368. void key_tri_child_pridej(HIERARCHY_TRACK_INFO * p_root,
  1369. HIERARCHY_TRACK_INFO * p_child)
  1370. {
  1371. p_root->childnum += 1;
  1372. p_root->p_child =
  1373. (HIERARCHY_TRACK_INFO **) realloc(p_root->p_child,
  1374. sizeof(p_root->p_child[0]) * p_root->childnum);
  1375. p_root->p_child[p_root->childnum - 1] = p_child;
  1376. p_child->p_otec = p_root;
  1377. }
  1378. // prida child do root_node
  1379. void key_root_child_pridej(HIERARCHY_ROOT * p_root,
  1380. HIERARCHY_TRACK_INFO * p_child)
  1381. {
  1382. p_root->childnum += 1;
  1383. p_root->p_child =
  1384. (HIERARCHY_TRACK_INFO **) realloc(p_root->p_child,
  1385. sizeof(p_root->p_child[0]) * p_root->childnum);
  1386. p_root->p_child[p_root->childnum - 1] = p_child;
  1387. p_child->p_otec = NULL;
  1388. }
  1389. void key_tri_calc_absolutne(TRACK_INFO * p_track, QUAT * p_puvodni)
  1390. {
  1391. QUAT q(0, 0, 0, 1);
  1392. word i;
  1393. if (p_track->rot_keys) {
  1394. if (!p_track->p_at) {
  1395. p_track->p_at =
  1396. (QUAT *) mmalloc(sizeof(p_track->p_at[0]) * p_track->rot_keys);
  1397. }
  1398. key_rotkey_to_quat(p_track->p_rot, p_track->p_at);
  1399. for (i = 1; i < p_track->rot_keys; i++) {
  1400. quat_mult(key_rotkey_to_quat(p_track->p_rot + i, &q),
  1401. p_track->p_at + (i - 1), p_track->p_at + i);
  1402. }
  1403. }
  1404. }
  1405. void key_sim_calc_absolutne(SIMPLE_TRACK_INFO * p_sim)
  1406. {
  1407. QUAT q(0, 0, 0, 1), qz;
  1408. int i, il;
  1409. if (p_sim->p_at) {
  1410. for (i = 0; i < p_sim->keynum; i++) {
  1411. if (p_sim->p_at[i].x != FLT_MAX)
  1412. break;
  1413. }
  1414. angle_to_quat(&qz, (BOD *) (&p_sim->p_at[i].x), p_sim->p_at[i].w);
  1415. p_sim->p_at[i] = qz;
  1416. il = i;
  1417. for (i++; i < p_sim->keynum; i++) {
  1418. if (p_sim->p_at[i].x != FLT_MAX) {
  1419. angle_to_quat(&qz, (BOD *) & (p_sim->p_at[i].x), p_sim->p_at[i].w);
  1420. quat_mult(&qz, p_sim->p_at + il, p_sim->p_at + i);
  1421. il = i;
  1422. }
  1423. }
  1424. }
  1425. }
  1426. /*
  1427. 0. Key_frame prevest na matice
  1428. 1. Vynasobit word matrix
  1429. 2. Prevest zpet
  1430. BOD *p_pos, QUAT *p_q, BOD *p_scs
  1431. */
  1432. // cilovy kontejner - kopie tracku
  1433. static void key_tri_to_tri_indir(EDIT_KONTEJNER * p_kont,
  1434. HIERARCHY_TRACK_INFO * p_cil,
  1435. HIERARCHY_TRACK_INFO * p_src, HIERARCHY_TRACK_INFO * p_otec)
  1436. {
  1437. int i;
  1438. p_cil->childnum = p_src->childnum;
  1439. p_cil->endtime = p_src->endtime;
  1440. p_cil->objnum = p_src->objnum;
  1441. p_cil->parentnum = p_src->parentnum;
  1442. p_cil->pivot = p_src->pivot;
  1443. p_cil->p_obj = p_kont->p_obj[p_src->objnum];
  1444. p_cil->p_otec = p_otec;
  1445. p_cil->p_m = &p_kont->p_obj[p_src->objnum]->m;
  1446. if (p_cil->pos_keys) {
  1447. memcpy(p_cil->p_pkeys, p_src->p_pkeys,
  1448. sizeof(p_src->p_pkeys[0]) * p_cil->pos_keys);
  1449. memcpy(p_cil->p_pos, p_src->p_pos,
  1450. sizeof(p_src->p_pos[0]) * p_cil->pos_keys);
  1451. }
  1452. if (p_cil->scs_keys) {
  1453. memcpy(p_cil->p_scale, p_src->p_scale,
  1454. sizeof(p_src->p_scale[0]) * p_cil->scs_keys);
  1455. }
  1456. if (p_cil->rot_keys) {
  1457. memcpy(p_cil->p_rkeys, p_src->p_rkeys,
  1458. sizeof(p_src->p_rkeys[0]) * p_cil->rot_keys);
  1459. memcpy(p_cil->p_at, p_src->p_at,
  1460. sizeof(p_src->p_at[0]) * p_cil->rot_keys);
  1461. }
  1462. p_cil->p_child =
  1463. (HIERARCHY_TRACK_INFO **) mmalloc(sizeof(p_cil->p_child[0]) *
  1464. p_src->childnum);
  1465. for (i = 0; i < p_src->childnum; i++) {
  1466. p_cil->p_child[i] =
  1467. key_tri_vyrob(p_src->p_child[i]->pos_keys, p_src->p_child[i]->rot_keys,
  1468. p_src->p_child[i]->scs_keys);
  1469. key_tri_to_tri_indir(p_kont, p_cil->p_child[i], p_src->p_child[i], p_cil);
  1470. }
  1471. }
  1472. void key_root_to_root_indir(EDIT_KONTEJNER * p_kont, HIERARCHY_ROOT * p_cil,
  1473. HIERARCHY_ROOT * p_src)
  1474. {
  1475. int i;
  1476. *p_cil = *p_src;
  1477. p_cil->p_child =
  1478. (HIERARCHY_TRACK_INFO **) mmalloc(sizeof(p_cil->p_child[0]) *
  1479. p_src->childnum);
  1480. for (i = 0; i < p_src->childnum; i++) {
  1481. p_cil->p_child[i] =
  1482. key_tri_vyrob(p_src->p_child[i]->pos_keys, p_src->p_child[i]->rot_keys,
  1483. p_src->p_child[i]->scs_keys);
  1484. key_tri_to_tri_indir(p_kont, p_cil->p_child[i], p_src->p_child[i], NULL);
  1485. }
  1486. }
  1487. /* kopie sim-animaci
  1488. */
  1489. /*
  1490. typedef struct _SIMPLE_TRACK_INFO {
  1491. int Objekt_ID; // id objektu ke kteremu animace patri
  1492. dword flag;
  1493. int keynum; // pocet klicu
  1494. BOD *p_pos; // Mesh position keys
  1495. BOD *p_scale; // Mesh scaling keys
  1496. QUAT *p_at; // Absolutni traky
  1497. BOD pivot; // pivot point animace -> kopiruje se do objektu
  1498. BOD pivot3ds; // pivot 3ds animace
  1499. GLMATRIX *p_m; // kam to hazet
  1500. int childnum; // pocet svistich traku
  1501. struct _SIMPLE_TRACK_INFO *p_child; // svisti traky
  1502. struct _SIMPLE_TRACK_INFO *p_otec; // otcovy traky
  1503. } SIMPLE_TRACK_INFO;
  1504. */
  1505. // Kopie sim-animaci
  1506. void key_sim_root_to_sim_root_indir(EDIT_KONTEJNER * p_kont,
  1507. HIERARCHY_SIM * p_cil, HIERARCHY_SIM * p_src)
  1508. {
  1509. int i;
  1510. *p_cil = *p_src;
  1511. p_cil->p_child =
  1512. (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_cil->p_child[0]) *
  1513. p_src->childnum);
  1514. for (i = 0; i < p_src->childnum; i++) {
  1515. key_sim_to_sim_indir(p_cil->p_child + i, p_src->p_child + i);
  1516. }
  1517. key_sim_dopln_matrix_kont(p_kont, p_cil);
  1518. }
  1519. static void key_sim_dopln_matrix_kont_rec(EDIT_KONTEJNER * p_kont,
  1520. SIMPLE_TRACK_INFO * p_sim)
  1521. {
  1522. EDIT_OBJEKT *p_obj;
  1523. int i;
  1524. p_obj = lo_najdi_objekt_kont_poiter_ID(p_kont, p_sim->Objekt_ID);
  1525. if (p_obj) {
  1526. p_sim->p_m = &p_obj->m;
  1527. p_sim->p_object_norm = &p_obj->float_scale;
  1528. }
  1529. else {
  1530. p_sim->p_m = NULL;
  1531. p_sim->p_object_norm = NULL;
  1532. }
  1533. for (i = 0; i < p_sim->childnum; i++) {
  1534. key_sim_dopln_matrix_kont_rec(p_kont, p_sim->p_child + i);
  1535. }
  1536. }
  1537. // Doplni matice
  1538. void key_sim_dopln_matrix_kont(EDIT_KONTEJNER * p_kont, HIERARCHY_SIM * p_src)
  1539. {
  1540. int i;
  1541. for (i = 0; i < p_src->childnum; i++) {
  1542. key_sim_dopln_matrix_kont_rec(p_kont, p_src->p_child + i);
  1543. }
  1544. }
  1545. static void key_sim_dopln_matrix_mesh_rec(GAME_MESH_OLD * p_mesh,
  1546. SIMPLE_TRACK_INFO * p_sim)
  1547. {
  1548. int i;
  1549. for (i = 0; i < p_mesh->objektu; i++) {
  1550. if (p_mesh->p_Objekt_ID[i] == p_sim->Objekt_ID) {
  1551. p_sim->p_m = p_mesh->p_key + i;
  1552. p_sim->p_obb_local = p_mesh->p_obb_local + i;
  1553. p_sim->p_obb_world = p_mesh->p_obb_world + i;
  1554. p_sim->p_object_norm =
  1555. p_mesh->p_normal_scale ? p_mesh->p_normal_scale + i : NULL;
  1556. for (i = 0; i < p_sim->childnum; i++) {
  1557. key_sim_dopln_matrix_mesh_rec(p_mesh, p_sim->p_child + i);
  1558. }
  1559. return;
  1560. }
  1561. }
  1562. // fuck-ati
  1563. }
  1564. void key_sim_dopln_matrix_mesh(GAME_MESH_OLD * p_mesh,
  1565. SIMPLE_TRACK_INFO * p_sim)
  1566. {
  1567. int i;
  1568. for (i = 0; i < p_sim->childnum; i++) {
  1569. key_sim_dopln_matrix_mesh_rec(p_mesh, p_sim->p_child + i);
  1570. }
  1571. }
  1572. /*
  1573. typedef struct _HIERARCHY_SIM {
  1574. float delka; // delka casu animace (fps)
  1575. byte stav; // 0 = stop, 1 = run
  1576. int flag; // flagy animace (GL_LOOP,GL_REMOVE)
  1577. dword time; // aktualni cas animace
  1578. dword time_start; // aktualni start
  1579. dword time_stop; // aktualni stop
  1580. dword time_delka; // aktualni delka animace
  1581. dword start;
  1582. dword stop;
  1583. int keynum; // pocet klicu
  1584. char jmeno[MAX_JMENO]; // jmeno animace
  1585. int childnum; // pocet detskych traku
  1586. SIMPLE_TRACK_INFO *p_child;
  1587. } HIERARCHY_SIM;
  1588. */
  1589. /* Rekurzivni extra-interpolator
  1590. */
  1591. static void key_root_to_sim_indir_rec(EDIT_KONTEJNER * p_kont,
  1592. SIMPLE_TRACK_INFO * p_sim, HIERARCHY_TRACK_INFO * p_root, int loop,
  1593. int float_scale)
  1594. {
  1595. /* Kopie puvodnich traku
  1596. */
  1597. key_tri_to_sim_indir(p_root, p_sim, loop, float_scale);
  1598. p_sim->p_m = &p_kont->p_obj[p_root->objnum]->m;
  1599. p_sim->Objekt_ID = p_kont->p_obj[p_root->objnum]->Objekt_ID;
  1600. p_sim->pivot = p_root->pivot_sim;
  1601. /* Vytvoreni stromu
  1602. */
  1603. if (p_root->childnum) {
  1604. int i;
  1605. p_sim->childnum = p_root->childnum;
  1606. p_sim->p_child =
  1607. (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_sim->p_child[0]) *
  1608. p_root->childnum);
  1609. for (i = 0; i < p_sim->childnum; i++) {
  1610. p_sim->p_child[i].p_otec = p_sim;
  1611. key_root_to_sim_indir_rec(p_kont, p_sim->p_child + i,
  1612. p_root->p_child[i], loop, float_scale);
  1613. }
  1614. }
  1615. }
  1616. /* Prevod root - stromu do simple animacniho stromu
  1617. */
  1618. void key_root_to_sim_indir(EDIT_KONTEJNER * p_kont, HIERARCHY_SIM * p_sim,
  1619. HIERARCHY_ROOT * p_root, int float_scale)
  1620. {
  1621. int i;
  1622. if (!p_root->childnum)
  1623. return;
  1624. strcpy(p_sim->jmeno, p_root->jmeno);
  1625. p_sim->childnum = p_root->childnum;
  1626. p_sim->keynum = p_root->framenum;
  1627. p_sim->p_child =
  1628. (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_sim->p_child[0]) *
  1629. p_root->childnum);
  1630. for (i = 0; i < p_sim->childnum; i++) {
  1631. key_root_to_sim_indir_rec(p_kont, p_sim->p_child + i, p_root->p_child[i],
  1632. p_root->flag & GK_LOOP, float_scale);
  1633. }
  1634. key_sim_dopln_matrix_kont(p_kont, p_sim);
  1635. }
  1636. /* Reanimuje kontejner word-matrix - vkladat akt_animace
  1637. */
  1638. void key_kontejner_reanimuj(EDIT_KONTEJNER * p_kont, HIERARCHY_ROOT * p_root)
  1639. {
  1640. if (p_kont->kflag & KONT_KEYFRAME && p_root->framenum) {
  1641. key_root_to_matrix(p_root, 0, kont_world_matrix(p_kont));
  1642. }
  1643. }
  1644. void key_kontejner_sim_reanimuj(EDIT_KONTEJNER * p_kont)
  1645. {
  1646. if (p_kont->kflag & KONT_KEYFRAME
  1647. && p_kont->sim[p_kont->akt_animace].keynum) {
  1648. key_sim_root_to_matrix(p_kont, p_kont->sim + p_kont->akt_animace, 0,
  1649. kont_world_matrix(p_kont));
  1650. }
  1651. }
  1652. void key_kontejner_sim_reanimuj_pivoty(EDIT_KONTEJNER * p_kont)
  1653. {
  1654. HIERARCHY_SIM *p_sim;
  1655. GLMATRIX m;
  1656. int i;
  1657. init_matrix(&m);
  1658. if (p_kont->kflag & KONT_KEYFRAME) {
  1659. p_sim = p_kont->sim + p_kont->akt_animace;
  1660. if (p_sim->keynum) {
  1661. for (i = 0; i < p_sim->childnum; i++) {
  1662. key_sim_animuj_strom_pivoty(p_sim->p_child + i, 0, &m);
  1663. }
  1664. }
  1665. }
  1666. }
  1667. void key_kontejner_retransformuj(EDIT_KONTEJNER * p_kont_top)
  1668. {
  1669. EDIT_KONTEJNER *p_kont = p_kont_top;
  1670. EDIT_OBJEKT *p_obj;
  1671. int o;
  1672. while (p_kont) {
  1673. if (p_kont->kflag & KONT_KEYFRAME) {
  1674. for (o = 0; o < MAX_KONT_OBJEKTU; o++) {
  1675. p_obj = p_kont->p_obj[o];
  1676. if (p_obj) {
  1677. transformuj_objekt_matici(p_obj, &p_obj->m);
  1678. init_matrix(&p_obj->m);
  1679. }
  1680. }
  1681. }
  1682. p_kont = p_kont->p_next;
  1683. }
  1684. }
  1685. void key_mesh_reanimuj(GAME_MESH_OLD * p_mesh, int time, GLMATRIX * p_top)
  1686. {
  1687. SIMPLE_TRACK_INFO *p_sim = p_mesh->p_sim_aktivni;
  1688. int i;
  1689. assert(p_mesh->p_data->kflag & KONT_KEYFRAME);
  1690. for (i = 0; i < p_sim->childnum; i++) {
  1691. key_sim_animuj_strom(p_sim->p_child + i, time, p_top);
  1692. }
  1693. // Transformace obalky meshe
  1694. obb_transformuj(&p_mesh->obb_local, p_top, &p_mesh->obb_world);
  1695. key_mesh_recalc_normal_anim(p_mesh);
  1696. }
  1697. /****************************************************************************
  1698. Simple-track animace
  1699. ****************************************************************************
  1700. */
  1701. /* kopie sim->sim
  1702. */
  1703. void key_sim_to_sim_indir(SIMPLE_TRACK_INFO * p_dest,
  1704. SIMPLE_TRACK_INFO * p_src)
  1705. {
  1706. int i;
  1707. *p_dest = *p_src;
  1708. // kopie pozicnich klicu
  1709. if (p_src->p_pos) {
  1710. p_dest->p_pos =
  1711. (BOD *) kopiruj_pole(p_src->p_pos,
  1712. sizeof(p_src->p_pos[0]) * p_src->keynum);
  1713. }
  1714. // kopie rotacnich klicu
  1715. if (p_src->p_at) {
  1716. p_dest->p_at =
  1717. (QUAT *) kopiruj_pole(p_src->p_at,
  1718. sizeof(p_src->p_at[0]) * p_src->keynum);
  1719. }
  1720. // kopie scale klicu
  1721. if (p_src->p_scale) {
  1722. p_dest->p_scale =
  1723. (BOD *) kopiruj_pole(p_src->p_scale,
  1724. sizeof(p_src->p_scale[0]) * p_src->keynum);
  1725. }
  1726. // Kopie zero-matic
  1727. if (p_src->p_all_matrix) {
  1728. p_dest->p_all_matrix =
  1729. (GLMATRIX *) kopiruj_pole(p_src->p_all_matrix,
  1730. sizeof(p_src->p_all_matrix[0]));
  1731. }
  1732. if (p_dest->childnum) {
  1733. p_dest->p_child =
  1734. (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_dest->p_child[0]) *
  1735. p_dest->childnum);
  1736. for (i = 0; i < p_dest->childnum; i++) {
  1737. key_sim_to_sim_indir(p_dest->p_child + i, p_src->p_child + i);
  1738. }
  1739. }
  1740. }
  1741. /* Rekurzivne animuje animacni strom
  1742. */
  1743. void key_sim_animuj_strom(SIMPLE_TRACK_INFO * p_sim, int time,
  1744. GLMATRIX * p_otec)
  1745. {
  1746. OBB_OLD *p_src, *p_dest;
  1747. GLMATRIX m, *p_top = p_otec;
  1748. int i;
  1749. // animuj hierarchii
  1750. if (p_sim->p_m) {
  1751. p_top =
  1752. mat_mult_dir(key_sim_to_matrix(p_sim, time, &m), p_otec, p_sim->p_m);
  1753. p_src = p_sim->p_obb_local;
  1754. p_dest = p_sim->p_obb_world;
  1755. if (p_src && p_dest) {
  1756. obb_transformuj(p_src, p_top, p_dest);
  1757. }
  1758. }
  1759. // rozmazni i decka
  1760. for (i = 0; i < p_sim->childnum; i++) {
  1761. key_sim_animuj_strom(p_sim->p_child + i, time, p_top);
  1762. }
  1763. }
  1764. void key_sim_animuj_strom_pivoty(SIMPLE_TRACK_INFO * p_sim, int time,
  1765. GLMATRIX * p_otec)
  1766. {
  1767. GLMATRIX m, m1, *p_top = p_otec;
  1768. int i;
  1769. // animuj hierarchii
  1770. if (p_sim->p_at || p_sim->p_pos || p_sim->p_scale) {
  1771. p_top = mat_mult(key_sim_to_matrix(p_sim, time, &m), p_otec, &m1);
  1772. }
  1773. else {
  1774. p_top = p_otec;
  1775. }
  1776. // Transformuje akt. pivot
  1777. invert_matrix_copy(p_top, &m);
  1778. transformuj_bod_bod_matici(&p_sim->pivot, &m);
  1779. // rozmazni i decka
  1780. for (i = 0; i < p_sim->childnum; i++) {
  1781. key_sim_animuj_strom_pivoty(p_sim->p_child + i, time, p_top);
  1782. }
  1783. }
  1784. /*------------------------------------------------------------------
  1785. Simple animace
  1786. ------------------------------------------------------------------
  1787. */
  1788. /* Prevede tri do simple tracku
  1789. */
  1790. SIMPLE_TRACK_INFO *key_tri_to_sim_indir(HIERARCHY_TRACK_INFO * p_track,
  1791. SIMPLE_TRACK_INFO * p_sim, int loop, int float_scale)
  1792. {
  1793. int i, endtime;
  1794. // prevedu hlavni track
  1795. memset(p_sim, 0, sizeof(SIMPLE_TRACK_INFO));
  1796. p_sim->keynum = calc_keynum(p_track->endtime);
  1797. endtime = p_track->endtime;
  1798. /* Kopie pozicnich klicu
  1799. */
  1800. if (p_track->p_pos) {
  1801. p_sim->p_pos = (BOD *) mmalloc(sizeof(p_sim->p_pos[0]) * p_sim->keynum);
  1802. for (i = 0; i < p_sim->keynum; i++)
  1803. key_track_interpolace_bod(p_sim->p_pos + i, p_track->p_pos,
  1804. p_track->p_pkeys, i * SIM_KONSTI, endtime, p_track->pos_keys, loop);
  1805. }
  1806. /* Kopie rotacnich klicu
  1807. */
  1808. if (p_track->p_at) {
  1809. p_sim->p_at = (QUAT *) mmalloc(sizeof(p_sim->p_at[0]) * p_sim->keynum);
  1810. p_sim->pivot3ds = p_track->pivot;
  1811. key_track_quat_zkontroluj(p_track->p_at, p_track->rot_keys);
  1812. for (i = 0; i < p_sim->keynum; i++)
  1813. key_track_interpolace_quat(p_sim->p_at + i, p_track->p_at,
  1814. p_track->p_rkeys, i * SIM_KONSTI, endtime, p_track->rot_keys, loop);
  1815. }
  1816. /* Kopie scale klicu
  1817. */
  1818. if (p_track->p_scale) {
  1819. if (float_scale) {
  1820. BOD s;
  1821. p_sim->p_norm =
  1822. (float *) mmalloc(sizeof(p_sim->p_norm[0]) * p_sim->keynum);
  1823. for (i = 0; i < p_sim->keynum; i++) {
  1824. key_track_interpolace_bod(&s, p_track->p_scale, p_track->p_skeys,
  1825. i * SIM_KONSTI, endtime, p_track->scs_keys, loop);
  1826. p_sim->p_norm[i] = s.x;
  1827. }
  1828. }
  1829. else {
  1830. p_sim->p_scale =
  1831. (BOD *) mmalloc(sizeof(p_sim->p_scale[0]) * p_sim->keynum);
  1832. for (i = 0; i < p_sim->keynum; i++)
  1833. key_track_interpolace_bod(p_sim->p_scale + i, p_track->p_scale,
  1834. p_track->p_skeys, i * SIM_KONSTI, endtime, p_track->scs_keys, loop);
  1835. }
  1836. }
  1837. return (p_sim);
  1838. }
  1839. /* Prevede tri linearne do simple tracku
  1840. */
  1841. SIMPLE_TRACK_INFO *key_tri_to_sim_indir_lin(HIERARCHY_TRACK_INFO * p_track,
  1842. SIMPLE_TRACK_INFO * p_sim, int loop)
  1843. {
  1844. int i, keynum, endtime;
  1845. // prevedu hlavni track
  1846. memset(p_sim, 0, sizeof(SIMPLE_TRACK_INFO));
  1847. keynum = p_sim->keynum = calc_keynum(p_track->endtime);
  1848. keynum--;
  1849. endtime = p_track->endtime;
  1850. /* Kopie pozicnich klicu
  1851. */
  1852. if (p_track->p_pos) {
  1853. p_sim->p_pos = (BOD *) mmalloc(sizeof(p_sim->p_pos[0]) * p_sim->keynum);
  1854. for (i = 0; i < p_sim->keynum; i++)
  1855. key_track_interpolace_bod_linear(p_sim->p_pos + i, p_track->p_pos,
  1856. p_track->p_pkeys, i * SIM_KONSTI, endtime, p_track->pos_keys, loop);
  1857. }
  1858. /* Kopie rotacnich klicu
  1859. */
  1860. if (p_track->p_at) {
  1861. p_sim->p_at = (QUAT *) mmalloc(sizeof(p_sim->p_at[0]) * p_sim->keynum);
  1862. p_sim->pivot3ds = p_track->pivot;
  1863. key_track_quat_zkontroluj(p_track->p_at, p_track->rot_keys);
  1864. for (i = 0; i < p_sim->keynum; i++)
  1865. key_track_interpolace_quat_linear(p_sim->p_at + i, p_track->p_at,
  1866. p_track->p_rkeys, i * SIM_KONSTI, endtime, p_track->rot_keys, loop);
  1867. }
  1868. /* Kopie scale klicu
  1869. */
  1870. if (p_track->p_scale) {
  1871. p_sim->p_scale =
  1872. (BOD *) mmalloc(sizeof(p_sim->p_scale[0]) * p_sim->keynum);
  1873. for (i = 0; i < p_sim->keynum; i++)
  1874. key_track_interpolace_bod_linear(p_sim->p_scale + i, p_track->p_scale,
  1875. p_track->p_skeys, i * SIM_KONSTI, endtime, p_track->scs_keys, loop);
  1876. }
  1877. return (p_sim);
  1878. }
  1879. void key_sim_zrus_vnitrek(SIMPLE_TRACK_INFO * p_sim)
  1880. {
  1881. null_free((void **) &p_sim->p_pos);
  1882. null_free((void **) &p_sim->p_at);
  1883. null_free((void **) &p_sim->p_scale);
  1884. null_free((void **) &p_sim->p_all_matrix);
  1885. }
  1886. // Zrusi animacni strom sim animaci
  1887. void key_sim_zrus(SIMPLE_TRACK_INFO * p_sim)
  1888. {
  1889. int i;
  1890. if (p_sim->p_child) {
  1891. for (i = 0; i < p_sim->childnum; i++) {
  1892. key_sim_zrus(p_sim->p_child + i);
  1893. }
  1894. free(p_sim->p_child);
  1895. }
  1896. key_sim_zrus_vnitrek(p_sim);
  1897. }
  1898. void key_sim_root_zrus(HIERARCHY_SIM * p_sim)
  1899. {
  1900. int i;
  1901. if (p_sim->p_child) {
  1902. for (i = 0; i < p_sim->childnum; i++) {
  1903. key_sim_zrus(p_sim->p_child + i);
  1904. }
  1905. free(p_sim->p_child);
  1906. }
  1907. memset(p_sim, 0, sizeof(p_sim[0]));
  1908. }
  1909. // ulozi simple animaci jako text-file
  1910. /*
  1911. C 20 // (pocet framu zacinajici od 0)
  1912. V 0 0 0 // pivot point
  1913. F 0 // Pro kazdy frame jeho cislo
  1914. P 0 2 3 // relativni posun x,y,z
  1915. R 0 0 0 0 // relativni rotace x,y,z + uhel
  1916. S 0 0 0 // relativni scale x y z
  1917. T 0 // tension
  1918. O 0 // continuity
  1919. B 0 // bias
  1920. L 0 0 0 // tension/continuity/bias
  1921. */
  1922. void key_sim_uloz(SIMPLE_TRACK_INFO * p_sim, char *p_file, char *p_dir)
  1923. {
  1924. BOD b;
  1925. float uhel;
  1926. FILE *f;
  1927. int i;
  1928. int loop = p_sim->flag & GK_LOOP;
  1929. chdir((p_dir));
  1930. if (!(f = fopen(p_file, "w"))) {
  1931. ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
  1932. __LINE__, p_file, p_dir);
  1933. return;
  1934. }
  1935. fprintf(f, "C %d\n", p_sim->keynum);
  1936. if (loop)
  1937. fputs("N\n", f);
  1938. fprintf(f, "M %f %f %f", p_sim->pivot3ds.x, p_sim->pivot3ds.y,
  1939. p_sim->pivot3ds.z);
  1940. fprintf(f, "O %f %f %f", p_sim->pivot.x, p_sim->pivot.y, p_sim->pivot.z);
  1941. for (i = 0; i < p_sim->keynum; i++) {
  1942. fprintf(f, "F %d\n", i);
  1943. fprintf(f, "P %f %f %f\n", p_sim->p_pos[i].x, p_sim->p_pos[i].y,
  1944. p_sim->p_pos[i].z);
  1945. quat_to_angle(p_sim->p_at + i, &b, &uhel);
  1946. uhel = (uhel / PI) * 180.0f;
  1947. fprintf(f, "R %f %f %f %f\n", b.x, b.y, b.z, uhel);
  1948. fprintf(f, "S %f %f %f\n", p_sim->p_scale[i].x, p_sim->p_scale[i].y,
  1949. p_sim->p_scale[i].z);
  1950. }
  1951. fclose(f);
  1952. }
  1953. // load sim z text-file
  1954. int key_sim_nahraj(APAK_HANDLE * pHandle, SIMPLE_TRACK_INFO * p_sim,
  1955. char *p_file, char *p_dir, int linear)
  1956. {
  1957. HIERARCHY_TRACK_INFO track; // load jako hierarchie -> prevedu do simple tracku
  1958. KEY_POINT_BRS *p_spline = NULL;
  1959. char line[1000], *p_pom;
  1960. KFILE *f;
  1961. int p, r, s, fr, loop = 0;
  1962. BOD pivot(0.0f, 0.0f, 0.0f);
  1963. BOD osa;
  1964. float uhel;
  1965. char **p_line;
  1966. int l, lmax;
  1967. chdir((p_dir));
  1968. if (!(f = kopen(pHandle, p_file, "r"))) {
  1969. kprintf(TRUE, "File %s Line %d Chyba otevreni souboru '%s' v %s",
  1970. __FILE__, __LINE__, p_file, (p_dir));
  1971. return (FALSE);
  1972. }
  1973. else {
  1974. kprintf(TRUE, "Nahravam animaci z %s...", p_file);
  1975. }
  1976. p_line = (char **) mmalloc(sizeof(p_line[0]) * MAX_SIM_RADKU);
  1977. l = 0;
  1978. while (kgets(line, 999, f)) {
  1979. assert(l < MAX_SIM_RADKU);
  1980. if (line[0] && line[0] != '\n' && line[0] != ';') {
  1981. p_line[l] =
  1982. (char *) kopiruj_pole(line, sizeof(char) * (strlen(line) + 1));
  1983. l++;
  1984. }
  1985. }
  1986. kclose(f);
  1987. lmax = l;
  1988. p = r = s = 0;
  1989. for (l = 0; l < lmax; l++) {
  1990. p_pom = p_line[l];
  1991. switch (toupper(p_pom[0])) {
  1992. case 'P': // posun
  1993. p++;
  1994. break;
  1995. case 'R': // rotace
  1996. r++;
  1997. break;
  1998. case 'S': // scale
  1999. s++;
  2000. break;
  2001. default:
  2002. break;
  2003. }
  2004. }
  2005. key_tri_vyrob_indir(&track, p, r, s);
  2006. p = r = s = fr = 0;
  2007. for (l = 0; l < lmax; l++) {
  2008. p_pom = p_line[l];
  2009. switch (toupper(p_pom[0])) {
  2010. case 'F': // frame
  2011. sscanf(p_pom + 1, "%d", &fr);
  2012. break;
  2013. case 'P': // posun
  2014. track.p_pkeys[p].time = fr * SIM_KONSTI;
  2015. p_spline = track.p_pkeys + p;
  2016. sscanf(p_pom + 1, "%f %f %f", &track.p_pos[p].x, &track.p_pos[p].y,
  2017. &track.p_pos[p].z);
  2018. p++;
  2019. break;
  2020. case 'R': // rotace
  2021. track.p_rkeys[r].time = fr * SIM_KONSTI;
  2022. p_spline = track.p_rkeys + r;
  2023. sscanf(p_pom + 1, "%f %f %f %f", &osa.x, &osa.y, &osa.z, &uhel);
  2024. /* Korekce zaporneho uhlu
  2025. */
  2026. if (uhel < 0.0f) {
  2027. uhel = -uhel;
  2028. osa.x = -osa.x;
  2029. osa.y = -osa.y;
  2030. osa.z = -osa.z;
  2031. }
  2032. uhel = DEG2RAD(uhel);
  2033. angle_to_quat(track.p_at + r, &osa, uhel);
  2034. r++;
  2035. break;
  2036. case 'S': // scale
  2037. track.p_skeys[s].time = fr * SIM_KONSTI;
  2038. p_spline = track.p_skeys + s;
  2039. sscanf(p_pom + 1, "%f %f %f", &track.p_scale[s].x,
  2040. &track.p_scale[s].y, &track.p_scale[s].z);
  2041. s++;
  2042. break;
  2043. case 'L':
  2044. if (p_spline) {
  2045. sscanf(p_pom + 1, "%f %f %f", &p_spline->tension,
  2046. &p_spline->continuity, &p_spline->bias);
  2047. }
  2048. break;
  2049. case 'T':
  2050. if (p_spline) {
  2051. sscanf(p_pom + 1, "%f", &p_spline->tension);
  2052. }
  2053. break;
  2054. case 'O':
  2055. if (p_spline) {
  2056. sscanf(p_pom + 1, "%f", &p_spline->continuity);
  2057. }
  2058. break;
  2059. case 'B':
  2060. if (p_spline) {
  2061. sscanf(p_pom + 1, "%f", &p_spline->bias);
  2062. }
  2063. break;
  2064. case 'C': // celkem framu
  2065. sscanf(p_pom + 1, "%d", &track.endtime);
  2066. track.endtime = calc_endtime(track.endtime);
  2067. break;
  2068. case 'N': // loop animace
  2069. loop = TRUE;
  2070. break;
  2071. case 'V': // pivot
  2072. sscanf(p_pom + 1, "%f %f %f", &pivot.x, &pivot.y, &pivot.z);
  2073. break;
  2074. case 'M': // 3ds pivot
  2075. sscanf(p_pom + 1, "%f %f %f", &track.pivot.x, &track.pivot.y,
  2076. &track.pivot.z);
  2077. break;
  2078. case 'Q':
  2079. linear = TRUE;
  2080. break;
  2081. case 'W':
  2082. linear = FALSE;
  2083. break;
  2084. default:
  2085. break;
  2086. }
  2087. }
  2088. for (l = 0; l < lmax; l++) {
  2089. free(p_line[l]);
  2090. }
  2091. free(p_line);
  2092. if (linear) {
  2093. key_tri_to_sim_indir_lin(&track, p_sim, loop);
  2094. }
  2095. else {
  2096. key_tri_to_sim_indir(&track, p_sim, loop, FALSE);
  2097. }
  2098. zrus_tri_vnitrek(&track);
  2099. p_sim->pivot = pivot; // dokopiruj standartni pivot
  2100. return (TRUE);
  2101. }
  2102. // rozsirene sim-animace load
  2103. int key_sim_nahraj_extended(EDIT_KONTEJNER * p_kont, int cislo_anim,
  2104. char *p_file, char *p_dir)
  2105. {
  2106. HIERARCHY_TRACK_INFO **p_track_list;
  2107. HIERARCHY_TRACK_INFO *p_track;
  2108. HIERARCHY_ROOT root;
  2109. int akt_track;
  2110. KEY_POINT_BRS *p_spline = NULL;
  2111. char pom[1000];
  2112. char pom1[1000];
  2113. FILE *f;
  2114. int p, r, s, fr, loop = 0, framu;
  2115. BOD pivot(0.0f, 0.0f, 0.0f);
  2116. BOD osa;
  2117. float uhel;
  2118. int i, objektu = 0, stop, ob, end, float_scale = FALSE;
  2119. chdir((p_dir));
  2120. if (!(f = fopen(p_file, "r"))) {
  2121. ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
  2122. __LINE__, p_file, (p_dir));
  2123. return (FALSE);
  2124. }
  2125. kprintf(TRUE, "Nahravam animaci z %s...", p_file);
  2126. while (fgets(pom, 999, f)) {
  2127. fgets_korekce(pom);
  2128. if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
  2129. switch (toupper(pom[0])) {
  2130. case 'C': // celkem framu
  2131. sscanf(pom + 1, "%d", &framu);
  2132. break;
  2133. case 'X':
  2134. switch (toupper(pom[1])) {
  2135. case 'O': // vlastnik
  2136. objektu++;
  2137. break;
  2138. case 'P': // otec
  2139. break;
  2140. }
  2141. break;
  2142. default:
  2143. break;
  2144. }
  2145. }
  2146. }
  2147. if (!objektu)
  2148. objektu = 1;
  2149. p_track_list =
  2150. (HIERARCHY_TRACK_INFO **) alloca(sizeof(p_track_list[0]) * objektu);
  2151. akt_track = 0;
  2152. stop = 0;
  2153. do {
  2154. p_track = p_track_list[akt_track++] =
  2155. (HIERARCHY_TRACK_INFO *) alloca(sizeof(p_track[0]));
  2156. memset(p_track, 0, sizeof(p_track[0]));
  2157. /* reset pivot-pointu
  2158. */
  2159. pivot.x = pivot.y = pivot.z = FLT_MAX;
  2160. /* Nactu jmena objektu
  2161. */
  2162. fseek(f, stop, SEEK_SET);
  2163. while (fgets(pom, 999, f)) {
  2164. fgets_korekce(pom);
  2165. if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
  2166. if (toupper(pom[0]) == 'X' && toupper(pom[1]) == 'O') {
  2167. strcpy(p_track->jmeno, cti_za_znak(pom + 2, ' '));
  2168. continue;
  2169. }
  2170. if (toupper(pom[0]) == 'X' && toupper(pom[1]) == 'P') {
  2171. strcpy(p_track->jmeno_otec, cti_za_znak(pom + 2, ' '));
  2172. continue;
  2173. }
  2174. if (toupper(pom[0]) == 'V') {
  2175. sscanf(pom + 1, "%f %f %f", &pivot.x, &pivot.y, &pivot.z);
  2176. break;
  2177. }
  2178. if (toupper(pom[0]) == 'F') {
  2179. sscanf(pom + 1, "%d", &fr);
  2180. break;
  2181. }
  2182. }
  2183. }
  2184. /* Nactu pozici za jmenama objektu
  2185. */
  2186. stop = ftell(f);
  2187. /* Nactu pocty klicu
  2188. */
  2189. p = r = s = 0;
  2190. while (fgets(pom, 999, f)) {
  2191. fgets_korekce(pom);
  2192. if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
  2193. if (toupper(pom[0]) == 'X') {
  2194. break;
  2195. }
  2196. if (toupper(pom[0]) == 'P') {
  2197. p++;
  2198. continue;
  2199. }
  2200. if (toupper(pom[0]) == 'R') {
  2201. r++;
  2202. continue;
  2203. }
  2204. if (toupper(pom[0]) == 'S' || toupper(pom[0]) == 'U') {
  2205. s++;
  2206. continue;
  2207. }
  2208. }
  2209. }
  2210. /* Vyrobim animaci podle poctu klicu
  2211. */
  2212. strcpy(pom, p_track->jmeno);
  2213. strcpy(pom1, p_track->jmeno_otec);
  2214. key_tri_vyrob_indir(p_track, p, r, s);
  2215. strcpy(p_track->jmeno, pom);
  2216. strcpy(p_track->jmeno_otec, pom1);
  2217. p = r = s = 0;
  2218. // fame zbylo zposledniho klice
  2219. /* Vratim se za prvni frame a ctu klice
  2220. */
  2221. fseek(f, stop, SEEK_SET);
  2222. while ((end = (int) fgets(pom, 999, f))) {
  2223. fgets_korekce(pom);
  2224. if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
  2225. /* Test - je dalsi objekt?
  2226. */
  2227. if (toupper(pom[0]) != 'X')
  2228. stop = ftell(f);
  2229. else
  2230. break;
  2231. /* neni - cti klice animace
  2232. */
  2233. switch (toupper(pom[0])) {
  2234. case 'F': // frame
  2235. sscanf(pom + 1, "%d", &fr);
  2236. break;
  2237. case 'P': // posun
  2238. p_track->p_pkeys[p].time = fr * SIM_KONSTI;
  2239. p_spline = p_track->p_pkeys + p;
  2240. sscanf(pom + 1, "%f %f %f", &p_track->p_pos[p].x,
  2241. &p_track->p_pos[p].y, &p_track->p_pos[p].z);
  2242. p++;
  2243. break;
  2244. case 'R': // rotace
  2245. p_track->p_rkeys[r].time = fr * SIM_KONSTI;
  2246. p_spline = p_track->p_rkeys + r;
  2247. sscanf(pom + 1, "%f %f %f %f", &osa.x, &osa.y, &osa.z, &uhel);
  2248. /* Korekce zaporneho uhlu
  2249. */
  2250. if (uhel < 0.0f) {
  2251. uhel = -uhel;
  2252. osa.x = -osa.x;
  2253. osa.y = -osa.y;
  2254. osa.z = -osa.z;
  2255. }
  2256. uhel = DEG2RAD(uhel);
  2257. angle_to_quat(p_track->p_at + r, &osa, uhel);
  2258. r++;
  2259. break;
  2260. case 'S': // scale
  2261. p_track->p_skeys[s].time = fr * SIM_KONSTI;
  2262. p_spline = p_track->p_skeys + s;
  2263. sscanf(pom + 1, "%f %f %f", &p_track->p_scale[s].x,
  2264. &p_track->p_scale[s].y, &p_track->p_scale[s].z);
  2265. s++;
  2266. break;
  2267. case 'U': // scale
  2268. p_track->p_skeys[s].time = fr * SIM_KONSTI;
  2269. p_spline = p_track->p_skeys + s;
  2270. sscanf(pom + 1, "%f", &p_track->p_scale[s].x);
  2271. p_track->p_scale[s].y = p_track->p_scale[s].z = 0.0f;
  2272. float_scale = TRUE;
  2273. s++;
  2274. break;
  2275. case 'L':
  2276. if (p_spline) {
  2277. sscanf(pom + 1, "%f %f %f", &p_spline->tension,
  2278. &p_spline->continuity, &p_spline->bias);
  2279. }
  2280. break;
  2281. case 'T':
  2282. if (p_spline) {
  2283. sscanf(pom + 1, "%f", &p_spline->tension);
  2284. }
  2285. break;
  2286. case 'O':
  2287. if (p_spline) {
  2288. sscanf(pom + 1, "%f", &p_spline->continuity);
  2289. }
  2290. break;
  2291. case 'B':
  2292. if (p_spline) {
  2293. sscanf(pom + 1, "%f", &p_spline->bias);
  2294. }
  2295. break;
  2296. case 'N': // loop animace
  2297. loop = TRUE;
  2298. break;
  2299. case 'V': // pivot
  2300. sscanf(pom + 1, "%f %f %f", &pivot.x, &pivot.y, &pivot.z);
  2301. break;
  2302. case 'M': // 3ds pivot
  2303. sscanf(pom + 1, "%f %f %f", &p_track->pivot.x, &p_track->pivot.y,
  2304. &p_track->pivot.z);
  2305. break;
  2306. default:
  2307. break;
  2308. }
  2309. }
  2310. }
  2311. p_track->pivot_sim = pivot;
  2312. } while (end);
  2313. fclose(f);
  2314. assert(akt_track == objektu);
  2315. /* Navazani animace na kontejner
  2316. */
  2317. memset(&root, 0, sizeof(root));
  2318. for (i = 0; i < objektu; i++) {
  2319. p_track = p_track_list[i];
  2320. ob = p_track->objnum = lo_najdi_objekt_kont(p_kont, p_track->jmeno);
  2321. if (ob == K_CHYBA) {
  2322. kprintf(TRUE, "!!!! Nenalezen objekt '%s' v kontejneru '%s'",
  2323. p_track->jmeno, p_kont->jmeno);
  2324. continue;
  2325. }
  2326. else {
  2327. kprintf(TRUE, "Objekt %s OK", p_track->jmeno);
  2328. }
  2329. p_track->p_obj = p_kont->p_obj[ob];
  2330. if (p_track->pivot_sim.x != FLT_MAX &&
  2331. p_track->pivot_sim.y != FLT_MAX && p_track->pivot_sim.z != FLT_MAX) {
  2332. p_kont->p_obj[ob]->pivot = p_track->pivot_sim;
  2333. }
  2334. p_track->parentnum = lo_najdi_objekt_kont(p_kont, p_track->jmeno_otec);
  2335. if (p_track->parentnum == K_CHYBA)
  2336. p_track->parentnum = ROOT_NODE;
  2337. key_konec_prochazeni = FALSE;
  2338. key_root_node_pridej(&root, p_track);
  2339. p_track->endtime = calc_endtime(framu);
  2340. }
  2341. root.framenum = framu;
  2342. kprintf(TRUE, "Framu animace %d", framu);
  2343. if (loop) {
  2344. kprintf(TRUE, "Loop animace");
  2345. root.flag |= GK_LOOP;
  2346. }
  2347. /* Prevod do sim-animaci
  2348. */
  2349. key_root_to_sim_indir(p_kont, p_kont->sim + cislo_anim, &root, float_scale);
  2350. p_kont->kflag |=
  2351. (float_scale) ? KONT_NORMAL_ANIM | KONT_KEYFRAME : KONT_KEYFRAME;
  2352. p_kont->kflag &= ~KONT_STATIC;
  2353. return (TRUE);
  2354. }
  2355. // aplikuje siple track do matrice
  2356. GLMATRIX *key_sim_to_matrix(SIMPLE_TRACK_INFO * p_sim, int time,
  2357. GLMATRIX * p_m)
  2358. {
  2359. float frame, t, t1;
  2360. BOD *p1, *p2;
  2361. QUAT q;
  2362. int kn, lasttime;
  2363. if (p_sim->p_all_matrix) {
  2364. *p_m = *p_sim->p_all_matrix;
  2365. }
  2366. else {
  2367. init_matrix(p_m);
  2368. lasttime = (p_sim->keynum - 1) * SIM_KONSTI;
  2369. if (time < lasttime) {
  2370. t = (float) time / SIM_KONST;
  2371. frame = (float) floor((float) t);
  2372. t -= frame;
  2373. kn = ftoi(frame);
  2374. t1 = 1.0f - t;
  2375. if (p_sim->p_pos) {
  2376. p1 = p_sim->p_pos + kn;
  2377. p2 = p_sim->p_pos + kn + 1;
  2378. p_m->_41 = p1->x * t1 + p2->x * t;
  2379. p_m->_42 = p1->y * t1 + p2->y * t;
  2380. p_m->_43 = p1->z * t1 + p2->z * t;
  2381. }
  2382. if (p_sim->p_at) {
  2383. quat_to_matrix(p_m, slerp(p_sim->p_at + kn, p_sim->p_at + kn + 1, t,
  2384. &q));
  2385. }
  2386. if (p_sim->p_scale) {
  2387. p1 = p_sim->p_scale + kn;
  2388. p2 = p_sim->p_scale + kn + 1;
  2389. scale_matrix(p_m, p1->x * t1 + p2->x * t, p1->y * t1 + p2->y * t,
  2390. p1->z * t1 + p2->z * t);
  2391. }
  2392. if (p_sim->p_norm) {
  2393. *p_sim->p_object_norm =
  2394. p_sim->p_norm[kn] * t1 + p_sim->p_norm[kn + 1] * t;
  2395. }
  2396. }
  2397. else {
  2398. kn = p_sim->keynum - 1;
  2399. if (p_sim->p_pos) {
  2400. p1 = (BOD *) & p_m->_41;
  2401. *p1 = p_sim->p_pos[kn];
  2402. }
  2403. if (p_sim->p_at) {
  2404. quat_to_matrix(p_m, p_sim->p_at + kn);
  2405. }
  2406. if (p_sim->p_scale) {
  2407. p1 = p_sim->p_scale + kn;
  2408. scale_matrix(p_m, p1->x, p1->y, p1->z);
  2409. }
  2410. if (p_sim->p_norm) {
  2411. *p_sim->p_object_norm = p_sim->p_norm[kn];
  2412. }
  2413. }
  2414. pivotuj_matrix_tam(&p_sim->pivot3ds, p_m);
  2415. pivotuj_matrix(p_m, &p_sim->pivot);
  2416. }
  2417. return (p_m);
  2418. }
  2419. void key_sim_root_to_matrix(EDIT_KONTEJNER * p_kont, HIERARCHY_SIM * p_sim,
  2420. int time, GLMATRIX * p_m)
  2421. {
  2422. int i;
  2423. for (i = 0; i < p_sim->childnum; i++) {
  2424. key_sim_animuj_strom(p_sim->p_child + i, time, p_m);
  2425. }
  2426. if (p_kont->kflag & KONT_NORMAL_ANIM) {
  2427. key_kontejner_recalc_normal_anim(p_kont);
  2428. }
  2429. }
  2430. void key_kontejner_recalc_normal_anim(EDIT_KONTEJNER * p_kont)
  2431. {
  2432. EDIT_OBJEKT *p_obj;
  2433. OBJ_VERTEX *p_vertex;
  2434. BOD n;
  2435. float last, akt, num, i;
  2436. // pokud se last=aktualni - nic nedelam
  2437. int o;
  2438. for (o = 0; o < p_kont->objektu; o++) {
  2439. if ((p_obj = p_kont->p_obj[o])) {
  2440. if ((last = p_obj->float_scale_last) == (akt = p_obj->float_scale))
  2441. continue;
  2442. p_vertex = p_obj->p_vertex;
  2443. num = p_obj->vertexnum;
  2444. for (i = 0; i < num; i++, p_vertex++) {
  2445. vektor_add((BOD *) & p_vertex->x,
  2446. vektor_mult_skalar((BOD *) & p_vertex->nx, -akt, &n),
  2447. (BOD *) & p_vertex->px);
  2448. }
  2449. p_obj->float_scale_last = akt;
  2450. }
  2451. }
  2452. }
  2453. /*
  2454. typedef struct _SIMPLE_TRACK_INFO {
  2455. int Objekt_ID; // id objektu ke kteremu animace patri
  2456. dword flag;
  2457. int keynum; // pocet klicu
  2458. BOD *p_pos; // Mesh position keys
  2459. BOD *p_scale; // Mesh scaling keys
  2460. QUAT *p_at; // Absolutni traky
  2461. BOD pivot; // pivot point animace -> kopiruje se do objektu
  2462. BOD pivot3ds; // pivot 3ds animace
  2463. GLMATRIX *p_m; // kam to hazet
  2464. int childnum; // pocet svistich traku
  2465. struct _SIMPLE_TRACK_INFO *p_child; // svisti traky
  2466. struct _SIMPLE_TRACK_INFO *p_otec; // otcovy traky
  2467. } SIMPLE_TRACK_INFO;
  2468. typedef struct _HIERARCHY_SIM {
  2469. float delka; // delka casu animace (fps)
  2470. char stav; // 0 = stop, 1 = run
  2471. int flag; // flagy animace (GL_LOOP,GL_REMOVE)
  2472. dword time; // aktualni cas animace
  2473. dword time_start; // aktualni start
  2474. dword time_stop; // aktualni stop
  2475. dword time_delka; // aktualni delka animace
  2476. dword start;
  2477. dword stop;
  2478. int keynum; // pocet klicu
  2479. char jmeno[MAX_JMENO]; // jmeno animace
  2480. int childnum; // pocet detskych traku
  2481. SIMPLE_TRACK_INFO *p_child;
  2482. } HIERARCHY_SIM;
  2483. */
  2484. void key_sim_root_to_sim_indir(HIERARCHY_SIM * p_root,
  2485. SIMPLE_TRACK_INFO * p_sim)
  2486. {
  2487. memset(p_sim, 0, sizeof(SIMPLE_TRACK_INFO));
  2488. p_sim->flag = p_root->flag;
  2489. p_sim->keynum = p_root->keynum;
  2490. p_sim->childnum = p_root->childnum;
  2491. p_sim->p_child = p_root->p_child;
  2492. p_sim->Objekt_ID = K_CHYBA;
  2493. memset(p_root, 0, sizeof(p_root[0]));
  2494. }
  2495. // aplikuje sim do matice a bodu
  2496. GLMATRIX *key_sim_to_matrix_param(SIMPLE_TRACK_INFO * p_sim, int time,
  2497. GLMATRIX * p_m, BOD * p_pos, QUAT * p_quat, BOD * p_scale)
  2498. {
  2499. float frame, t, t1;
  2500. BOD *p1, *p2;
  2501. int kn;
  2502. int lasttime;
  2503. init_matrix(p_m);
  2504. lasttime = (p_sim->keynum - 1) * SIM_KONSTI;
  2505. if (time < lasttime) {
  2506. t = (float) time / SIM_KONST;
  2507. frame = (float) floor((float) t);
  2508. t -= frame;
  2509. kn = ftoi(frame);
  2510. t1 = 1.0f - t;
  2511. if (p_sim->p_pos) {
  2512. p1 = p_sim->p_pos + kn;
  2513. p2 = p_sim->p_pos + kn + 1;
  2514. p_pos->x = p_m->_41 = p1->x * t1 + p2->x * t;
  2515. p_pos->y = p_m->_42 = p1->y * t1 + p2->y * t;
  2516. p_pos->z = p_m->_43 = p1->z * t1 + p2->z * t;
  2517. }
  2518. else {
  2519. vektor_set(p_pos, 0);
  2520. }
  2521. if (p_sim->p_at) {
  2522. quat_to_matrix(p_m, slerp(p_sim->p_at + kn, p_sim->p_at + kn + 1, t,
  2523. p_quat));
  2524. }
  2525. else {
  2526. quat_set_zero(p_quat);
  2527. }
  2528. if (p_sim->p_scale) {
  2529. p1 = p_sim->p_scale + kn;
  2530. p2 = p_sim->p_scale + kn + 1;
  2531. p_scale->x = p1->x * t1 + p2->x * t;
  2532. p_scale->y = p1->y * t1 + p2->y * t;
  2533. p_scale->z = p1->z * t1 + p2->z * t;
  2534. scale_matrix(p_m, p_scale->x, p_scale->y, p_scale->z);
  2535. }
  2536. else {
  2537. vektor_set(p_scale, 1);
  2538. }
  2539. }
  2540. else {
  2541. kn = p_sim->keynum - 1;
  2542. if (p_sim->p_pos) {
  2543. p1 = (BOD *) & p_m->_41;
  2544. *p_pos = *p1 = p_sim->p_pos[kn];
  2545. }
  2546. else {
  2547. vektor_set(p_pos, 0);
  2548. }
  2549. if (p_sim->p_at) {
  2550. *p_quat = p_sim->p_at[kn];
  2551. quat_to_matrix(p_m, p_quat);
  2552. }
  2553. else {
  2554. quat_set_zero(p_quat);
  2555. }
  2556. if (p_sim->p_scale) {
  2557. p1 = p_sim->p_scale + kn;
  2558. *p_scale = *p1;
  2559. scale_matrix(p_m, p1->x, p1->y, p1->z);
  2560. }
  2561. else {
  2562. vektor_set(p_scale, 1);
  2563. }
  2564. }
  2565. return (p_m);
  2566. }
  2567. /* Prevede animaci kamery do kamery
  2568. */
  2569. void key_kan_to_kamera(KAMERA * p_kam, KAMERA_TRACK_INFO * p_track, int time)
  2570. {
  2571. GLMATRIX m;
  2572. int loop = p_track->flag & GK_LOOP;
  2573. key_track_interpolace_bod(&p_kam->p, p_track->p_pos, p_track->p_pkeys, time,
  2574. p_track->endtime, p_track->pos_keys, loop);
  2575. key_track_interpolace_bod(&p_kam->t, p_track->p_trg, p_track->p_tkeys, time,
  2576. p_track->endtime, p_track->trg_keys, loop);
  2577. key_track_interpolace_float(&p_kam->roll, p_track->p_roll,
  2578. p_track->p_rlkeys, time, p_track->endtime, p_track->roll_keys, loop);
  2579. key_track_interpolace_float(&p_kam->fov, p_track->p_fov, p_track->p_fkeys,
  2580. time, p_track->endtime, p_track->fov_keys, loop);
  2581. calc_camera_3ds(&m, &p_kam->p_objekt->m, &p_kam->p, &p_kam->t, p_kam->roll);
  2582. }
  2583. /* Vyrobi animaci kamery
  2584. */
  2585. int key_kamera_vyrob_indir(KAMERA_TRACK_INFO * p_track, int pos_keys,
  2586. int trg_keys, int roll_keys, int fov_keys, int quat_keys)
  2587. {
  2588. memset(p_track, 0, sizeof(*p_track));
  2589. if ((p_track->pos_keys = pos_keys)) {
  2590. p_track->p_pkeys =
  2591. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_pkeys[0]) * pos_keys);
  2592. p_track->p_pos = (BOD *) mmalloc(sizeof(p_track->p_pos[0]) * pos_keys);
  2593. }
  2594. if ((p_track->trg_keys = trg_keys)) {
  2595. p_track->p_tkeys =
  2596. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_tkeys[0]) * trg_keys);
  2597. p_track->p_trg = (BOD *) mmalloc(sizeof(p_track->p_trg[0]) * trg_keys);
  2598. }
  2599. if ((p_track->roll_keys = roll_keys)) {
  2600. p_track->p_rlkeys =
  2601. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_rlkeys[0]) * roll_keys);
  2602. p_track->p_roll =
  2603. (float *) mmalloc(sizeof(p_track->p_roll[0]) * roll_keys);
  2604. }
  2605. if ((p_track->fov_keys = fov_keys)) {
  2606. p_track->p_fkeys =
  2607. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_fkeys[0]) * fov_keys);
  2608. p_track->p_fov = (float *) mmalloc(sizeof(p_track->p_fov[0]) * fov_keys);
  2609. }
  2610. if ((p_track->quat_keys = quat_keys)) {
  2611. p_track->p_qkeys =
  2612. (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_qkeys[0]) * quat_keys);
  2613. p_track->p_quat =
  2614. (QUAT *) mmalloc(sizeof(p_track->p_quat[0]) * quat_keys);
  2615. }
  2616. return (TRUE);
  2617. }
  2618. /* Zrusi animaci kamery
  2619. */
  2620. void key_kamera_zrus_indir(KAMERA_TRACK_INFO * p_track)
  2621. {
  2622. if (p_track->fov_keys) {
  2623. null_free((void **) &p_track->p_fkeys);
  2624. null_free((void **) &p_track->p_fov);
  2625. }
  2626. if (p_track->pos_keys) {
  2627. null_free((void **) &p_track->p_pkeys);
  2628. null_free((void **) &p_track->p_pos);
  2629. }
  2630. if (p_track->roll_keys) {
  2631. null_free((void **) &p_track->p_rlkeys);
  2632. null_free((void **) &p_track->p_roll);
  2633. }
  2634. if (p_track->trg_keys) {
  2635. null_free((void **) &p_track->p_tkeys);
  2636. null_free((void **) &p_track->p_trg);
  2637. }
  2638. if (p_track->quat_keys) {
  2639. null_free((void **) &p_track->p_qkeys);
  2640. null_free((void **) &p_track->p_quat);
  2641. }
  2642. memset(p_track, 0, sizeof(*p_track));
  2643. }
  2644. /* Ulozi kameru
  2645. */
  2646. int key_kamera_uloz(KAMERA_TRACK_INFO * p_track, char *p_jmeno_kamery,
  2647. char *p_jmeno_anim, char *p_file, char *p_dir)
  2648. {
  2649. FILE *f;
  2650. int i, keynum;
  2651. int p, t, r, fv;
  2652. chdir((p_dir));
  2653. if (!(f = fopen(p_file, "w"))) {
  2654. ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
  2655. __LINE__, p_file, (p_dir));
  2656. return (FALSE);
  2657. }
  2658. keynum = calc_keynum(p_track->endtime);
  2659. fprintf(f, "C %d\n", keynum);
  2660. fprintf(f, "J %s\n", p_jmeno_kamery); // jmeno kamery
  2661. fprintf(f, "A %s\n", p_jmeno_anim); // jmeno animace
  2662. for (i = 0; i < keynum; i++) {
  2663. p = key_je_frame_klic(p_track->p_pkeys, p_track->pos_keys, i);
  2664. t = key_je_frame_klic(p_track->p_tkeys, p_track->trg_keys, i);
  2665. r = key_je_frame_klic(p_track->p_rlkeys, p_track->roll_keys, i);
  2666. fv = key_je_frame_klic(p_track->p_fkeys, p_track->fov_keys, i);
  2667. if (p != K_CHYBA || t != K_CHYBA || r != K_CHYBA || fv != K_CHYBA) {
  2668. fprintf(f, "F %d\n", i);
  2669. /* uloz pozici
  2670. */
  2671. if (p != K_CHYBA) {
  2672. fprintf(f, "P %f %f %f\n", p_track->p_pos[p].x, p_track->p_pos[p].y,
  2673. p_track->p_pos[p].z);
  2674. fprintf(f, "L %f %f %f\n", p_track->p_pkeys[p].tension,
  2675. p_track->p_pkeys[p].continuity, p_track->p_pkeys[p].bias);
  2676. }
  2677. /* uloz cil
  2678. */
  2679. if (t != K_CHYBA) {
  2680. fprintf(f, "D %f %f %f\n", p_track->p_trg[t].x, p_track->p_trg[t].y,
  2681. p_track->p_trg[t].z);
  2682. fprintf(f, "L %f %f %f\n", p_track->p_tkeys[t].tension,
  2683. p_track->p_tkeys[t].continuity, p_track->p_tkeys[t].bias);
  2684. }
  2685. /* uloz roll
  2686. */
  2687. if (r != K_CHYBA) {
  2688. fprintf(f, "D %f\n", RAD2DEG(p_track->p_roll[r]));
  2689. fprintf(f, "L %f %f %f\n", p_track->p_rlkeys[r].tension,
  2690. p_track->p_rlkeys[r].continuity, p_track->p_rlkeys[r].bias);
  2691. }
  2692. /* uloz fov
  2693. */
  2694. if (fv != K_CHYBA) {
  2695. fprintf(f, "V %f\n", RAD2DEG(p_track->p_fov[fv]));
  2696. fprintf(f, "L %f %f %f\n", p_track->p_fkeys[fv].tension,
  2697. p_track->p_fkeys[fv].continuity, p_track->p_fkeys[fv].bias);
  2698. }
  2699. }
  2700. }
  2701. fclose(f);
  2702. return (TRUE);
  2703. }
  2704. /* Nahraje kameru
  2705. */
  2706. int key_kamera_nahraj(KAMERA_TRACK_INFO * p_track, char *p_jmeno_kamery,
  2707. char *p_jmeno_anim, APAK_HANDLE * pHandle, char *p_file, char *p_dir)
  2708. {
  2709. KEY_POINT_BRS *p_spline = NULL;
  2710. char line[1000];
  2711. char *p_pom;
  2712. int p, t, r, fv, fr;
  2713. float uhel;
  2714. KFILE *f;
  2715. char **p_line;
  2716. int l, lmax;
  2717. chdir((p_dir));
  2718. if (!(f = kopen(pHandle, p_file, "r"))) {
  2719. kprintf(TRUE, "File %s Line %d Chyba otevreni souboru '%s' v %s",
  2720. __FILE__, __LINE__, p_file, (p_dir));
  2721. return (FALSE);
  2722. }
  2723. p_line = (char **) mmalloc(sizeof(p_line[0]) * MAX_SIM_RADKU);
  2724. l = 0;
  2725. while (kgets(line, 999, f)) {
  2726. assert(l < MAX_SIM_RADKU);
  2727. if (line[0] && line[0] != '\n' && line[0] != ';') {
  2728. p_line[l] =
  2729. (char *) kopiruj_pole(line, sizeof(char) * (strlen(line) + 1));
  2730. l++;
  2731. }
  2732. }
  2733. kclose(f);
  2734. lmax = l;
  2735. p = t = r = fv = 0;
  2736. for (l = 0; l < lmax; l++) {
  2737. p_pom = p_line[l];
  2738. switch (toupper(p_pom[0])) {
  2739. case 'P': // posun
  2740. p++;
  2741. break;
  2742. case 'D': // rotace
  2743. t++;
  2744. break;
  2745. case 'R': // roll
  2746. r++;
  2747. break;
  2748. case 'V': // fov
  2749. fv++;
  2750. break;
  2751. default:
  2752. break;
  2753. }
  2754. }
  2755. key_kamera_vyrob_indir(p_track, p, t, r, fv, 0);
  2756. p = r = t = fr = fv = 0;
  2757. for (l = 0; l < lmax; l++) {
  2758. p_pom = p_line[l];
  2759. switch (toupper(p_pom[0])) {
  2760. case 'F': // frame
  2761. sscanf(p_pom + 1, "%d", &fr);
  2762. break;
  2763. case 'P': // posun
  2764. p_spline = p_track->p_pkeys + p; // nastaveni aktivniho splajnu
  2765. p_track->p_pkeys[p].time = fr * SIM_KONSTI;
  2766. sscanf(p_pom + 1, "%f %f %f", &p_track->p_pos[p].x,
  2767. &p_track->p_pos[p].y, &p_track->p_pos[p].z);
  2768. p++;
  2769. break;
  2770. case 'D': // target
  2771. p_track->p_tkeys[t].time = fr * SIM_KONSTI;
  2772. p_spline = p_track->p_tkeys + t; // nastaveni aktivniho splajnu
  2773. sscanf(p_pom + 1, "%f %f %f", &p_track->p_trg[t].x,
  2774. &p_track->p_trg[t].y, &p_track->p_trg[t].z);
  2775. t++;
  2776. break;
  2777. case 'R': // roll
  2778. p_track->p_rlkeys[r].time = fr * SIM_KONSTI;
  2779. p_spline = p_track->p_rlkeys + r;
  2780. sscanf(p_pom + 1, "%f", &uhel);
  2781. p_track->p_roll[r] = DEG2RAD(uhel);
  2782. r++;
  2783. break;
  2784. case 'V': // roll
  2785. p_track->p_fkeys[fv].time = fr * SIM_KONSTI;
  2786. p_spline = p_track->p_fkeys + fv;
  2787. sscanf(p_pom + 1, "%f", &uhel);
  2788. p_track->p_fov[fv] = DEG2RAD(uhel);
  2789. fv++;
  2790. break;
  2791. case 'L':
  2792. if (p_spline) {
  2793. sscanf(p_pom + 1, "%f %f %f", &p_spline->tension,
  2794. &p_spline->continuity, &p_spline->bias);
  2795. }
  2796. break;
  2797. case 'T':
  2798. if (p_spline) {
  2799. sscanf(p_pom + 1, "%f", &p_spline->tension);
  2800. }
  2801. break;
  2802. case 'O':
  2803. if (p_spline) {
  2804. sscanf(p_pom + 1, "%f", &p_spline->continuity);
  2805. }
  2806. break;
  2807. case 'B':
  2808. if (p_spline) {
  2809. sscanf(p_pom + 1, "%f", &p_spline->bias);
  2810. }
  2811. break;
  2812. case 'C': // celkem framu
  2813. sscanf(p_pom + 1, "%d", &p_track->endtime);
  2814. p_track->endtime = calc_endtime(p_track->endtime);
  2815. break;
  2816. case 'J': // jmeno kamery
  2817. strcpy(p_jmeno_kamery, p_pom + 2);
  2818. break;
  2819. case 'A': // jmeno animace
  2820. strcpy(p_track->jmeno, p_pom + 2);
  2821. break;
  2822. }
  2823. }
  2824. zamen_koncovku_znak(p_jmeno_kamery, '\n', NULL);
  2825. zamen_koncovku_znak(p_track->jmeno, '\n', NULL);
  2826. return (TRUE);
  2827. }
  2828. int key_kamera_track_cti(KAMERA_TRACK_INFO * p_track, BOD * p_p, BOD * p_t,
  2829. float *p_roll, float *p_fov)
  2830. {
  2831. if (p_track->pos_keys) {
  2832. *p_p = p_track->p_pos[0];
  2833. }
  2834. else {
  2835. p_p->x = 0.0f;
  2836. p_p->y = 0.0f;
  2837. p_p->z = 0.0f;
  2838. }
  2839. if (p_track->trg_keys) {
  2840. *p_t = p_track->p_trg[0];
  2841. }
  2842. else {
  2843. p_t->x = 0.0f;
  2844. p_t->y = 0.0f;
  2845. p_t->z = 0.0f;
  2846. }
  2847. if (p_track->roll_keys) {
  2848. *p_roll = p_track->p_roll[0];
  2849. }
  2850. else {
  2851. *p_roll = 0.0f;
  2852. }
  2853. if (p_track->fov_keys) {
  2854. *p_fov = p_track->p_fov[0];
  2855. }
  2856. else {
  2857. *p_fov = DEG2RAD(45.0f);
  2858. }
  2859. return (TRUE);
  2860. }
  2861. /*
  2862. Animace t1-t2 materialu
  2863. */
  2864. ANIM_TEXT *key_vyrob_material_animace(int poskey, int rotkey, int scalekey,
  2865. int pivotkey)
  2866. {
  2867. ANIM_TEXT *p_mat = (ANIM_TEXT *) mmalloc(sizeof(p_mat[0]));
  2868. if (p_mat->pos_keys = poskey) {
  2869. p_mat->p_pos = (BOD *) mmalloc(sizeof(BOD) * poskey);
  2870. p_mat->p_pkeys =
  2871. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_pkeys[0]) * poskey);
  2872. }
  2873. if (p_mat->piv_keys = pivotkey) {
  2874. p_mat->p_piv = (BOD *) mmalloc(sizeof(BOD) * pivotkey);
  2875. p_mat->p_vkeys =
  2876. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_vkeys[0]) * pivotkey);
  2877. }
  2878. if (p_mat->rot_keys = rotkey) {
  2879. p_mat->p_rot = (float *) mmalloc(sizeof(p_mat->p_rot[0]) * rotkey);
  2880. p_mat->p_rkeys =
  2881. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_rkeys[0]) * rotkey);
  2882. }
  2883. if (p_mat->scs_keys = scalekey) {
  2884. p_mat->p_scale = (BOD *) mmalloc(sizeof(BOD) * scalekey);
  2885. p_mat->p_skeys =
  2886. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_skeys[0]) * scalekey);
  2887. }
  2888. return (p_mat);
  2889. }
  2890. ANIM_TEXT *key_kopiruj_material_animace(ANIM_TEXT * p_src)
  2891. {
  2892. ANIM_TEXT *p_mat = (ANIM_TEXT *) mmalloc(sizeof(p_mat[0]));
  2893. int poskey = p_src->pos_keys;
  2894. int pivkey = p_src->piv_keys;
  2895. int rotkey = p_src->rot_keys;
  2896. int scalekey = p_src->scs_keys;
  2897. if (p_mat->pos_keys = poskey) {
  2898. p_mat->p_pos = (BOD *) mmalloc(sizeof(p_mat->p_pos[0]) * poskey);
  2899. p_mat->p_pkeys =
  2900. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_pkeys[0]) * poskey);
  2901. memcpy(p_mat->p_pos, p_src->p_pos, sizeof(BOD) * poskey);
  2902. memcpy(p_mat->p_pkeys, p_src->p_pkeys,
  2903. sizeof(p_mat->p_pkeys[0]) * poskey);
  2904. }
  2905. if (p_mat->piv_keys = pivkey) {
  2906. p_mat->p_piv = (BOD *) mmalloc(sizeof(p_mat->p_piv[0]) * pivkey);
  2907. p_mat->p_vkeys =
  2908. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_vkeys[0]) * pivkey);
  2909. memcpy(p_mat->p_piv, p_src->p_piv, sizeof(BOD) * pivkey);
  2910. memcpy(p_mat->p_vkeys, p_src->p_vkeys,
  2911. sizeof(p_mat->p_vkeys[0]) * pivkey);
  2912. }
  2913. if (p_mat->rot_keys = rotkey) {
  2914. p_mat->p_rot = (float *) mmalloc(sizeof(p_mat->p_rot[0]) * rotkey);
  2915. p_mat->p_rkeys =
  2916. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_rkeys[0]) * rotkey);
  2917. memcpy(p_mat->p_rot, p_src->p_rot, sizeof(p_mat->p_rot[0]) * rotkey);
  2918. memcpy(p_mat->p_rkeys, p_src->p_rkeys,
  2919. sizeof(p_mat->p_rkeys[0]) * rotkey);
  2920. }
  2921. if (p_mat->scs_keys = scalekey) {
  2922. p_mat->p_scale = (BOD *) mmalloc(sizeof(p_mat->p_scale[0]) * scalekey);
  2923. p_mat->p_skeys =
  2924. (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_skeys[0]) * scalekey);
  2925. memcpy(p_mat->p_scale, p_src->p_scale,
  2926. sizeof(p_src->p_scale[0]) * scalekey);
  2927. memcpy(p_mat->p_skeys, p_src->p_skeys,
  2928. sizeof(p_mat->p_skeys[0]) * scalekey);
  2929. }
  2930. return (p_mat);
  2931. }
  2932. void key_zrus_material_animace(ANIM_TEXT ** p_mat)
  2933. {
  2934. null_free((void **) &(*p_mat)->p_pos);
  2935. null_free((void **) &(*p_mat)->p_piv);
  2936. null_free((void **) &(*p_mat)->p_rot);
  2937. null_free((void **) &(*p_mat)->p_scale);
  2938. null_free((void **) &(*p_mat));
  2939. }
  2940. /*
  2941. Animace text-koordinatu materialu
  2942. */
  2943. void key_sim_to_text_matrix(ANIM_TEXT * p_text, int time, GLMATRIX * p_ttext)
  2944. {
  2945. BOD *p;
  2946. init_matrix(p_ttext);
  2947. if (p_text->p_piv) {
  2948. key_track_interpolace_bod_linear(&p_text->pivot, p_text->p_piv,
  2949. p_text->p_vkeys, time, p_text->endtime, p_text->piv_keys, FALSE);
  2950. }
  2951. if (p_text->p_pos) {
  2952. key_track_interpolace_bod_linear(&p_text->pos, p_text->p_pos,
  2953. p_text->p_pkeys, time, p_text->endtime, p_text->pos_keys, FALSE);
  2954. p_ttext->_41 = p_text->pos.x;
  2955. p_ttext->_42 = p_text->pos.y;
  2956. }
  2957. if (p_text->p_rot) {
  2958. key_track_interpolace_float_linear(&p_text->rot, p_text->p_rot,
  2959. p_text->p_rkeys, time, p_text->endtime, p_text->rot_keys, FALSE);
  2960. float_to_matrix(p_ttext, p_text->rot,
  2961. p_text->p_piv ? &p_text->pivot : NULL);
  2962. }
  2963. if (p_text->p_scale) {
  2964. p = &p_text->scs;
  2965. key_track_interpolace_bod_linear(p, p_text->p_scale, p_text->p_skeys,
  2966. time, p_text->endtime, p_text->scs_keys, FALSE);
  2967. p_ttext->_11 *= p->x;
  2968. p_ttext->_21 *= p->x;
  2969. p_ttext->_12 *= p->y;
  2970. p_ttext->_22 *= p->y;
  2971. }
  2972. }
  2973. void key_mat_to_text_matrix(GLMATRIX * p_ttext, BOD * p_pos, float uhel,
  2974. BOD * p_scale, BOD * p_pivot)
  2975. {
  2976. init_matrix(p_ttext);
  2977. if (p_pos) {
  2978. p_ttext->_41 = p_pos->x;
  2979. p_ttext->_42 = p_pos->y;
  2980. }
  2981. if (uhel != 0.0f)
  2982. float_to_matrix(p_ttext, uhel, p_pivot);
  2983. if (p_scale) {
  2984. p_ttext->_11 *= p_scale->x;
  2985. p_ttext->_21 *= p_scale->x;
  2986. p_ttext->_12 *= p_scale->y;
  2987. p_ttext->_22 *= p_scale->y;
  2988. }
  2989. }
  2990. // load text animace z text-file
  2991. ANIM_TEXT *key_text_nahraj(char *p_file, char *p_dir)
  2992. {
  2993. ANIM_TEXT *p_track;
  2994. KEY_POINT_BRS *p_spline = NULL;
  2995. char pom[1000];
  2996. FILE *f;
  2997. int p, r, s, v, fr;
  2998. float uhel;
  2999. chdir((p_dir));
  3000. if (!(f = fopen(p_file, "r"))) {
  3001. ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
  3002. __LINE__, p_file, (p_dir));
  3003. return (FALSE);
  3004. }
  3005. p = r = s = v = 0;
  3006. while (fgets(pom, 999, f)) {
  3007. if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
  3008. switch (toupper(pom[0])) {
  3009. case 'P': // posun
  3010. p++;
  3011. break;
  3012. case 'R': // rotace
  3013. r++;
  3014. break;
  3015. case 'S': // scale
  3016. s++;
  3017. break;
  3018. case 'V': // pivot
  3019. v++;
  3020. break;
  3021. case 'F': // frame
  3022. case 'C': // celkem framu
  3023. case 'L': // spline-hodnoty
  3024. break;
  3025. }
  3026. }
  3027. }
  3028. fseek(f, 0, SEEK_SET);
  3029. p_track = key_vyrob_material_animace(p, r, s, v);
  3030. p = r = s = v = fr = 0;
  3031. while (fgets(pom, 999, f)) {
  3032. if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
  3033. switch (toupper(pom[0])) {
  3034. case 'F': // frame
  3035. sscanf(pom + 1, "%d", &fr);
  3036. break;
  3037. case 'P': // posun
  3038. p_track->p_pkeys[p].time = fr * SIM_KONSTI;
  3039. p_spline = p_track->p_pkeys + p;
  3040. sscanf(pom + 1, "%f %f %f", &p_track->p_pos[p].x,
  3041. &p_track->p_pos[p].y);
  3042. p++;
  3043. break;
  3044. case 'V': // pivot
  3045. p_track->p_vkeys[v].time = fr * SIM_KONSTI;
  3046. p_spline = p_track->p_vkeys + v;
  3047. sscanf(pom + 1, "%f %f %f", &p_track->p_piv[v].x,
  3048. &p_track->p_piv[v].y);
  3049. v++;
  3050. break;
  3051. case 'R': // rotace
  3052. p_track->p_rkeys[r].time = fr * SIM_KONSTI;
  3053. p_spline = p_track->p_rkeys + r;
  3054. sscanf(pom + 1, "%f", &uhel);
  3055. p_track->p_rot[r] = DEG2RAD(uhel);
  3056. r++;
  3057. break;
  3058. case 'S': // scale
  3059. p_track->p_skeys[s].time = fr * SIM_KONSTI;
  3060. p_spline = p_track->p_skeys + s;
  3061. sscanf(pom + 1, "%f %f %f", &p_track->p_scale[s].x,
  3062. &p_track->p_scale[s].y);
  3063. s++;
  3064. break;
  3065. case 'L':
  3066. if (p_spline) {
  3067. sscanf(pom + 1, "%f %f %f", &p_spline->tension,
  3068. &p_spline->continuity, &p_spline->bias);
  3069. }
  3070. break;
  3071. case 'T':
  3072. if (p_spline) {
  3073. sscanf(pom + 1, "%f", &p_spline->tension);
  3074. }
  3075. break;
  3076. case 'O':
  3077. if (p_spline) {
  3078. sscanf(pom + 1, "%f", &p_spline->continuity);
  3079. }
  3080. break;
  3081. case 'B':
  3082. if (p_spline) {
  3083. sscanf(pom + 1, "%f", &p_spline->bias);
  3084. }
  3085. break;
  3086. case 'C': // celkem framu
  3087. sscanf(pom + 1, "%d", &p_track->endtime);
  3088. p_track->endtime = calc_endtime(p_track->endtime);
  3089. break;
  3090. }
  3091. }
  3092. }
  3093. fclose(f);
  3094. return (p_track);
  3095. }
  3096. int key_text_uloz(ANIM_TEXT * p_track, char *p_file, char *p_dir)
  3097. {
  3098. FILE *f;
  3099. int i, p, r, s, v, frame;
  3100. int keynum;
  3101. dword time;
  3102. chdir((p_dir));
  3103. if (!(f = fopen(p_file, "w"))) {
  3104. ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
  3105. __LINE__, p_file, (p_dir));
  3106. return (FALSE);
  3107. }
  3108. frame = p = r = s = v = 0;
  3109. keynum = calc_keynum(p_track->endtime);
  3110. fprintf(f, "C %d\n", keynum);
  3111. for (i = 0; i < keynum; i++) {
  3112. frame = 0;
  3113. time = i * SIM_KONSTI;
  3114. if (p < p_track->pos_keys && p_track->p_pkeys &&
  3115. p_track->p_pkeys[p].time == time) {
  3116. fprintf(f, "F %d\n", i);
  3117. frame++;
  3118. fprintf(f, "P %f %f\n", p_track->p_pos[p].x, p_track->p_pos[p].y);
  3119. p++;
  3120. }
  3121. if (v < p_track->piv_keys && p_track->p_vkeys &&
  3122. p_track->p_vkeys[v].time == time) {
  3123. if (!frame) {
  3124. fprintf(f, "F %d\n", i);
  3125. frame++;
  3126. }
  3127. fprintf(f, "V %f %f\n", p_track->p_piv[v].x, p_track->p_piv[v].y);
  3128. v++;
  3129. }
  3130. if (r < p_track->rot_keys && p_track->p_rkeys &&
  3131. p_track->p_rkeys[r].time == time) {
  3132. if (!frame) {
  3133. fprintf(f, "F %d\n", i);
  3134. frame++;
  3135. }
  3136. fprintf(f, "R %f\n", RAD2DEG(p_track->p_rot[r]));
  3137. r++;
  3138. }
  3139. if (s < p_track->scs_keys && p_track->p_skeys &&
  3140. p_track->p_skeys[s].time == time) {
  3141. if (!frame) {
  3142. fprintf(f, "F %d\n", i);
  3143. frame++;
  3144. }
  3145. fprintf(f, "S %f %f\n", p_track->p_scale[s].x, p_track->p_scale[s].y);
  3146. s++;
  3147. }
  3148. }
  3149. fclose(f);
  3150. return (TRUE);
  3151. }
  3152. void key_sim_root_vloz_pivoty_do_animace_rec(EDIT_KONTEJNER * p_kont,
  3153. SIMPLE_TRACK_INFO * p_sim)
  3154. {
  3155. int i, o = lo_najdi_objekt_kont_ID(p_kont, p_sim->Objekt_ID);
  3156. if (o != K_CHYBA) {
  3157. p_sim->pivot = p_kont->p_obj[o]->pivot;
  3158. }
  3159. for (i = 0; i < p_sim->childnum; i++) {
  3160. key_sim_root_vloz_pivoty_do_animace_rec(p_kont, p_sim->p_child + i);
  3161. }
  3162. }
  3163. void key_sim_root_vloz_pivoty_do_animace(EDIT_KONTEJNER * p_kont,
  3164. HIERARCHY_SIM * p_root)
  3165. {
  3166. int i;
  3167. for (i = 0; i < p_root->childnum; i++) {
  3168. key_sim_root_vloz_pivoty_do_animace_rec(p_kont, p_root->p_child + i);
  3169. }
  3170. }
  3171. void key_sim_root_vloz_pivoty_do_animace_kont(EDIT_KONTEJNER * p_kont)
  3172. {
  3173. int i;
  3174. for (i = 0; i < KONT_MAX_ANIM; i++) {
  3175. if (p_kont->sim[i].keynum)
  3176. key_sim_root_vloz_pivoty_do_animace(p_kont, p_kont->sim + i);
  3177. }
  3178. }
  3179. /* Transformuje lokalni OBB meshe do globalni OBB
  3180. Pri posunu celeho objektu
  3181. */
  3182. void key_mesh_transformuj_obalky(GAME_MESH_OLD * p_mesh, GLMATRIX * p_mat)
  3183. {
  3184. OBB_OLD *p_src = p_mesh->p_obb_local;
  3185. OBB_OLD *p_dst = p_mesh->p_obb_world;
  3186. int i;
  3187. for (i = 0; i < p_mesh->objektu; i++) {
  3188. obb_transformuj(p_src + i, p_mat, p_dst + i);
  3189. }
  3190. obb_transformuj(&p_mesh->obb_local, p_mat, &p_mesh->obb_world);
  3191. }
  3192. /* Spocita pozuze obalku kontejneru - pri key-animaci kdy se obalky
  3193. updatuji automaticky
  3194. */
  3195. /*
  3196. void key_mesh_calc_global_obalku(GAME_MESH_OLD *p_mesh)
  3197. {
  3198. obb_slep_aabb(&p_mesh->obb_world, p_mesh->p_obb_world, p_mesh->objektu);
  3199. }
  3200. */
  3201. void key_kont_updatuj_flagy(EDIT_KONTEJNER * p_kont)
  3202. {
  3203. int i, anum = 0;
  3204. for (i = 0; i < KONT_MAX_ANIM; i++) {
  3205. if (p_kont->sim[i].keynum)
  3206. anum++;
  3207. }
  3208. if (!anum) {
  3209. p_kont->kflag &= ~(KONT_KEYFRAME | KONT_NORMAL_ANIM);
  3210. }
  3211. }
  3212. JOINT_KEYS *key_kost_spline_vyrob(JOINT * p_joint)
  3213. {
  3214. if (p_joint) {
  3215. if (!p_joint->p_keys) {
  3216. p_joint->p_keys = (JOINT_KEYS *) mmalloc(sizeof(p_joint->p_keys[0]));
  3217. }
  3218. return (p_joint->p_keys);
  3219. }
  3220. else {
  3221. return (NULL);
  3222. }
  3223. }
  3224. void key_kosti_updatuj_vertexy_rec(EDIT_OBJEKT * p_obj, JOINT * p_joint)
  3225. {
  3226. int i, v;
  3227. for (i = 0; i < p_joint->vertexnum; i++) {
  3228. v = p_joint->p_vertexlist[i];
  3229. if (v >= p_obj->vertexnum) {
  3230. assert(v < p_obj->vertexnum);
  3231. p_joint->p_vertexlist[i] = 0;
  3232. }
  3233. transformuj_bod_matici_bod((BOD *) (p_obj->p_vertex + v), &p_joint->m,
  3234. p_obj->p_vertex_kosti + v);
  3235. }
  3236. // proved rekurzivni animace
  3237. if (p_joint->p_next)
  3238. key_kosti_updatuj_vertexy_rec(p_obj, p_joint->p_next);
  3239. if (p_joint->p_child)
  3240. key_kosti_updatuj_vertexy_rec(p_obj, p_joint->p_child);
  3241. }
  3242. void key_kosti_updatuj_vertexy(EDIT_OBJEKT * p_obj, JOINT_ANIMACE * p_animace)
  3243. {
  3244. if (p_animace && p_animace->p_child) {
  3245. if (!p_obj->p_vertex_kosti) {
  3246. int i;
  3247. p_obj->p_vertex_kosti =
  3248. (BOD *) mmalloc(sizeof(p_obj->p_vertex_kosti[0]) * p_obj->vertexnum);
  3249. for (i = 0; i < p_obj->vertexnum; i++) {
  3250. mujbod2bod(p_obj->p_vertex_kosti + i, p_obj->p_vertex + i);
  3251. }
  3252. }
  3253. key_kosti_updatuj_vertexy_rec(p_obj, p_animace->p_child);
  3254. }
  3255. }
  3256. void key_kosti_interpoluj_rec(JOINT * p_joint, int framenum, int loop)
  3257. {
  3258. JOINT_KEYS *p_key = p_joint->p_keys;
  3259. int keynum = framenum;
  3260. int endtime = calc_endtime(framenum);
  3261. int i;
  3262. init_matrix(&p_joint->m);
  3263. if (p_joint->p_pos) {
  3264. free(p_joint->p_pos);
  3265. p_joint->p_pos = NULL;
  3266. p_joint->pos_keys = 0;
  3267. }
  3268. if (p_joint->p_rot) {
  3269. free(p_joint->p_rot);
  3270. p_joint->p_rot = NULL;
  3271. p_joint->rot_keys = 0;
  3272. }
  3273. if (p_joint->p_scs) {
  3274. free(p_joint->p_scs);
  3275. p_joint->p_scs = NULL;
  3276. p_joint->scs_keys = 0;
  3277. }
  3278. if (p_key) {
  3279. if (p_key->p_pos) {
  3280. p_joint->p_pos = (BOD *) mmalloc(sizeof(p_joint->p_pos[0]) * keynum);
  3281. p_joint->pos_keys = keynum;
  3282. for (i = 0; i < keynum; i++)
  3283. key_track_interpolace_bod(p_joint->p_pos + i, p_key->p_pos,
  3284. p_key->p_pkeys, i * SIM_KONSTI, endtime, p_key->pos_keys, loop);
  3285. }
  3286. if (p_key->p_rot) {
  3287. p_joint->p_rot = (QUAT *) mmalloc(sizeof(p_joint->p_rot[0]) * keynum);
  3288. p_joint->rot_keys = keynum;
  3289. for (i = 0; i < keynum; i++) {
  3290. key_track_interpolace_quat(p_joint->p_rot + i, p_key->p_rot,
  3291. p_key->p_rkeys, i * SIM_KONSTI, endtime, p_key->rot_keys, loop);
  3292. }
  3293. }
  3294. if (p_key->p_scale) {
  3295. p_joint->p_scs = (BOD *) mmalloc(sizeof(p_joint->p_scs[0]) * keynum);
  3296. p_joint->scs_keys = keynum;
  3297. for (i = 0; i < keynum; i++)
  3298. key_track_interpolace_bod(p_joint->p_scs + i, p_key->p_scale,
  3299. p_key->p_skeys, i * SIM_KONSTI, endtime, p_key->scs_keys, loop);
  3300. }
  3301. }
  3302. // proved rekurzivni animace
  3303. if (p_joint->p_next)
  3304. key_kosti_interpoluj_rec(p_joint->p_next, framenum, loop);
  3305. if (p_joint->p_child)
  3306. key_kosti_interpoluj_rec(p_joint->p_child, framenum, loop);
  3307. }
  3308. // prepocita animace z klicu do linearni animace
  3309. void key_kosti_interpoluj(JOINT_ANIMACE * p_animace)
  3310. {
  3311. if (p_animace) {
  3312. key_kosti_interpoluj_rec(p_animace->p_child, p_animace->framenum, TRUE);
  3313. }
  3314. }
  3315. void key_kosti_animuj_rec(JOINT * p_joint, GLMATRIX * p_top, int time,
  3316. int keynum)
  3317. {
  3318. float frame, t, t1;
  3319. BOD *p1, *p2, pv;
  3320. int kn, lasttime;
  3321. GLMATRIX *p_m = &p_joint->m;
  3322. init_matrix(p_m);
  3323. lasttime = (keynum - 1) * SIM_KONSTI;
  3324. if (time < lasttime) {
  3325. t = (float) time / SIM_KONST;
  3326. frame = (float) floor((float) t);
  3327. t -= frame;
  3328. kn = ftoi(frame);
  3329. t1 = 1.0f - t;
  3330. if (p_joint->p_pos) {
  3331. p1 = p_joint->p_pos + kn;
  3332. p2 = p_joint->p_pos + kn + 1;
  3333. p_joint->p.x = p_m->_41 = p1->x * t1 + p2->x * t;
  3334. p_joint->p.y = p_m->_42 = p1->y * t1 + p2->y * t;
  3335. p_joint->p.z = p_m->_43 = p1->z * t1 + p2->z * t;
  3336. }
  3337. if (p_joint->p_rot) {
  3338. quat_to_matrix(p_m, slerp(p_joint->p_rot + kn, p_joint->p_rot + kn + 1,
  3339. t, &p_joint->r));
  3340. }
  3341. if (p_joint->p_scs) {
  3342. p1 = p_joint->p_scs + kn;
  3343. p2 = p_joint->p_scs + kn + 1;
  3344. p_joint->s.x = p1->x * t1 + p2->x * t;
  3345. p_joint->s.y = p1->y * t1 + p2->y * t;
  3346. p_joint->s.z = p1->z * t1 + p2->z * t;
  3347. scale_matrix(p_m, p_joint->s.x, p_joint->s.y, p_joint->s.z);
  3348. }
  3349. }
  3350. else {
  3351. kn = keynum - 1;
  3352. if (p_joint->p_pos) {
  3353. p1 = (BOD *) & p_m->_41;
  3354. p_joint->p = *p1 = p_joint->p_pos[kn];
  3355. }
  3356. if (p_joint->p_rot) {
  3357. p_joint->r = p_joint->p_rot[kn];
  3358. quat_to_matrix(p_m, p_joint->p_rot + kn);
  3359. }
  3360. if (p_joint->p_scs) {
  3361. p_joint->s = p_joint->p_scs[kn];
  3362. p1 = &p_joint->s;
  3363. scale_matrix(p_m, p1->x, p1->y, p1->z);
  3364. }
  3365. }
  3366. if (p_top) {
  3367. transformuj_bod_matici_bod(&p_joint->pivot, p_top, &pv);
  3368. pivotuj_matrix(p_m, &pv);
  3369. }
  3370. else {
  3371. pivotuj_matrix(p_m, &p_joint->pivot);
  3372. }
  3373. if (p_top) {
  3374. mat_mult(p_top, p_m, p_m);
  3375. }
  3376. if (p_joint->p_next)
  3377. key_kosti_animuj_rec(p_joint->p_next, p_m, time, keynum);
  3378. if (p_joint->p_child)
  3379. key_kosti_animuj_rec(p_joint->p_child, p_m, time, keynum);
  3380. }
  3381. void key_kosti_animuj(JOINT_ANIMACE * p_animace)
  3382. {
  3383. if (p_animace) {
  3384. key_kosti_animuj_rec(p_animace->p_child, NULL, p_animace->time,
  3385. p_animace->framenum);
  3386. }
  3387. }
  3388. #define MAX_TIME 0xfffffffe
  3389. #define NO_TIME 0xffffffff
  3390. void key_kosti_serad_klice(byte * p_hodnoty, KEY_POINT_BRS * p_skeys,
  3391. int keynum, int size_of_hodnota)
  3392. {
  3393. KEY_POINT_BRS *p_nkeys =
  3394. (KEY_POINT_BRS *) mmalloc(sizeof(p_nkeys[0]) * keynum);
  3395. byte *p_nhod = (byte *) mmalloc(sizeof(byte) * size_of_hodnota * keynum);
  3396. dword min_time, min_klic;
  3397. int i, new_akt = 0;
  3398. while (1) {
  3399. min_time = MAX_TIME;
  3400. for (i = 0; i < keynum; i++) {
  3401. if (p_skeys[i].time <= min_time) {
  3402. min_time = p_skeys[i].time;
  3403. min_klic = i;
  3404. }
  3405. }
  3406. if (min_time == MAX_TIME)
  3407. break;
  3408. p_nkeys[new_akt] = p_skeys[min_klic];
  3409. memcpy(p_nhod + new_akt * size_of_hodnota,
  3410. p_hodnoty + min_klic * size_of_hodnota, sizeof(byte) * size_of_hodnota);
  3411. new_akt++;
  3412. p_skeys[min_klic].time = NO_TIME;
  3413. }
  3414. memcpy(p_hodnoty, p_nhod, sizeof(byte) * size_of_hodnota * keynum);
  3415. memcpy(p_skeys, p_nkeys, sizeof(p_nkeys[0]) * keynum);
  3416. free(p_nkeys);
  3417. free(p_nhod);
  3418. }
  3419. /*
  3420. Streamovy animace vertexu
  3421. */
  3422. void key_kosti_stream_animuj_rec(JOINT_ANIMACE * p_anim, JOINT * p_joint,
  3423. GLMATRIX * p_top, int time, int keynum)
  3424. {
  3425. float frame, t, t1, x1, y1, z1, x2, y2, z2;
  3426. BOD *p1, *p2, pv;
  3427. BOD *ps1in, *ps1out;
  3428. BOD *ps2in, *ps2out;
  3429. BOD *pv1, *pv2, *pv3, *pv4;
  3430. int kn, lasttime, num, *p_ind, i, v;
  3431. GLMATRIX *p_m;
  3432. while (p_joint) {
  3433. p_m = init_matrix(&p_joint->m);
  3434. lasttime = (keynum - 1) * SIM_KONSTI;
  3435. if (time < lasttime) {
  3436. t = ((float) time) / SIM_KONST;
  3437. frame = (float) floor((float) t);
  3438. t -= frame;
  3439. kn = ftoi(frame);
  3440. t1 = 1.0f - t;
  3441. if (p_joint->p_pos) {
  3442. p1 = p_joint->p_pos + kn;
  3443. p2 = p_joint->p_pos + kn + 1;
  3444. p_m->_41 = p1->x * t1 + p2->x * t;
  3445. p_m->_42 = p1->y * t1 + p2->y * t;
  3446. p_m->_43 = p1->z * t1 + p2->z * t;
  3447. }
  3448. if (p_joint->p_rot) {
  3449. quat_to_matrix(p_m, slerp(p_joint->p_rot + kn,
  3450. p_joint->p_rot + kn + 1, t, &p_joint->r));
  3451. }
  3452. if (p_joint->p_scs) {
  3453. p1 = p_joint->p_scs + kn;
  3454. p2 = p_joint->p_scs + kn + 1;
  3455. scale_matrix(p_m, p1->x * t1 + p2->x * t, p1->y * t1 + p2->y * t,
  3456. p1->z * t1 + p2->z * t);
  3457. }
  3458. }
  3459. else {
  3460. kn = keynum - 1;
  3461. if (p_joint->p_pos) {
  3462. p1 = (BOD *) & p_m->_41;
  3463. *p1 = p_joint->p_pos[kn];
  3464. }
  3465. if (p_joint->p_rot) {
  3466. quat_to_matrix(p_m, p_joint->p_rot + kn);
  3467. }
  3468. if (p_joint->p_scs) {
  3469. p1 = p_joint->p_scs + kn;
  3470. scale_matrix(p_m, p1->x, p1->y, p1->z);
  3471. }
  3472. }
  3473. if (p_top) {
  3474. transformuj_bod_matici_bod(&p_joint->pivot, p_top, &pv);
  3475. pivotuj_matrix(p_m, &pv);
  3476. }
  3477. else {
  3478. pivotuj_matrix(p_m, &p_joint->pivot);
  3479. }
  3480. if (p_top) {
  3481. mat_mult(p_top, p_m, p_m);
  3482. }
  3483. ps1in = p_anim->p_pos_in;
  3484. ps1out = p_anim->p_pos_out;
  3485. ps2in = p_anim->p_norm_in;
  3486. ps2out = p_anim->p_norm_out;
  3487. num = p_joint->vertexnum;
  3488. p_ind = p_joint->p_vertexlist;
  3489. if (ps1in && ps1out) {
  3490. num = p_joint->vertexnum;
  3491. p_ind = p_joint->p_vertexlist;
  3492. for (i = 0; i < num; i++) {
  3493. v = *p_ind++;
  3494. pv1 = ps1in + v;
  3495. pv2 = ps1out + v;
  3496. pv3 = ps2in + v;
  3497. pv4 = ps2out + v;
  3498. x1 = pv1->x;
  3499. y1 = pv1->y;
  3500. z1 = pv1->z;
  3501. x2 = pv3->x;
  3502. y2 = pv3->y;
  3503. z2 = pv3->z;
  3504. pv2->x = p_m->_11 * x1 + p_m->_21 * y1 + p_m->_31 * z1 + p_m->_41;
  3505. pv4->x = p_m->_11 * x2 + p_m->_21 * y2 + p_m->_31 * z2;
  3506. pv2->y = p_m->_12 * x1 + p_m->_22 * y1 + p_m->_32 * z1 + p_m->_42;
  3507. pv4->y = p_m->_12 * x2 + p_m->_22 * y2 + p_m->_32 * z2;
  3508. pv2->z = p_m->_13 * x1 + p_m->_23 * y1 + p_m->_33 * z1 + p_m->_43;
  3509. pv4->z = p_m->_13 * x2 + p_m->_23 * y2 + p_m->_33 * z2;
  3510. }
  3511. }
  3512. if (p_joint->p_next)
  3513. key_kosti_stream_animuj_rec(p_anim, p_joint->p_next, p_m, time, keynum);
  3514. p_top = p_m;
  3515. p_joint = p_joint->p_child;
  3516. }
  3517. }
  3518. JOINT_KEYS *key_joint_kopiruj_spline(JOINT_KEYS * p_src)
  3519. {
  3520. if (p_src) {
  3521. JOINT_KEYS *p_new = (JOINT_KEYS *) kopiruj_pole(p_src, sizeof(p_src[0]));
  3522. p_new->p_pkeys =
  3523. (KEY_POINT_BRS *) kopiruj_pole(p_new->p_pkeys,
  3524. sizeof(p_new->p_pkeys[0]) * p_new->pos_keys);
  3525. p_new->p_pos =
  3526. (BOD *) kopiruj_pole(p_new->p_pos,
  3527. sizeof(p_new->p_pos[0]) * p_new->pos_keys);
  3528. p_new->p_rkeys =
  3529. (KEY_POINT_BRS *) kopiruj_pole(p_new->p_rkeys,
  3530. sizeof(p_new->p_rkeys[0]) * p_new->rot_keys);
  3531. p_new->p_rot =
  3532. (QUAT *) kopiruj_pole(p_new->p_rot,
  3533. sizeof(p_new->p_rot[0]) * p_new->rot_keys);
  3534. p_new->p_skeys =
  3535. (KEY_POINT_BRS *) kopiruj_pole(p_new->p_skeys,
  3536. sizeof(p_new->p_skeys[0]) * p_new->scs_keys);
  3537. p_new->p_scale =
  3538. (BOD *) kopiruj_pole(p_new->p_scale,
  3539. sizeof(p_new->p_scale[0]) * p_new->scs_keys);
  3540. return (p_new);
  3541. }
  3542. else {
  3543. return (NULL);
  3544. }
  3545. }
  3546. JOINT *key_joint_kopiruj(JOINT * p_src)
  3547. {
  3548. JOINT *p_new = (JOINT *) kopiruj_pole(p_src, sizeof(p_src[0]));
  3549. p_new->p_vertexlist =
  3550. (int *) kopiruj_pole(p_src->p_vertexlist,
  3551. sizeof(p_new->p_vertexlist[0]) * p_new->vertexnum);
  3552. p_new->p_pos =
  3553. (BOD *) kopiruj_pole(p_src->p_pos,
  3554. sizeof(p_new->p_pos[0]) * p_new->pos_keys);
  3555. p_new->p_rot =
  3556. (QUAT *) kopiruj_pole(p_src->p_rot,
  3557. sizeof(p_new->p_rot[0]) * p_new->rot_keys);
  3558. p_new->p_scs =
  3559. (BOD *) kopiruj_pole(p_src->p_scs,
  3560. sizeof(p_new->p_scs[0]) * p_new->scs_keys);
  3561. p_new->p_keys = key_joint_kopiruj_spline(p_src->p_keys);
  3562. return (p_new);
  3563. }
  3564. JOINT *key_joint_vyrob(void)
  3565. {
  3566. JOINT *p_src = (JOINT *) mmalloc(sizeof(p_src[0]));
  3567. p_src->r.w = 1;
  3568. p_src->s.x = p_src->s.y = p_src->s.z = 1.0f;
  3569. init_matrix(&p_src->m);
  3570. return (p_src);
  3571. }
  3572. JOINT *key_kosti_kopiruj_rec(JOINT * p_src)
  3573. {
  3574. JOINT *p_new = key_joint_kopiruj(p_src);
  3575. if (p_src->p_next)
  3576. p_new->p_next = key_kosti_kopiruj_rec(p_src->p_next);
  3577. if (p_src->p_child)
  3578. p_new->p_child = key_kosti_kopiruj_rec(p_src->p_child);
  3579. return (p_new);
  3580. }
  3581. /* Skopiruje animace kosti
  3582. */
  3583. JOINT_ANIMACE *key_kosti_kopiruj(JOINT_ANIMACE * p_src)
  3584. {
  3585. JOINT_ANIMACE *p_new = (JOINT_ANIMACE *) mmalloc(sizeof(p_src[0]));
  3586. memcpy(p_new, p_src, sizeof(p_src[0]));
  3587. p_new->p_child = key_kosti_kopiruj_rec(p_new->p_child);
  3588. return (p_new);
  3589. }
  3590. JOINT_ANIMACE *key_kosti_kopiruj_animace(JOINT_ANIMACE * p_prvni)
  3591. {
  3592. JOINT_ANIMACE *p_tmp;
  3593. JOINT_ANIMACE *p_frs = NULL;
  3594. while (p_prvni) {
  3595. if (!p_frs) {
  3596. p_frs = p_tmp = key_kosti_kopiruj(p_prvni);
  3597. }
  3598. else {
  3599. p_tmp->p_next = key_kosti_kopiruj(p_prvni);
  3600. }
  3601. p_prvni = p_prvni->p_next;
  3602. }
  3603. return (p_frs);
  3604. }