12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142 |
- /* Keyframovy animacni modul - slohnuto z:
- Splines & Quaternions (splines.txt)
- -----------------------------------
- by
- Jochen Wilhelmy
- a.k.a.
- digisnap
- digisnap@cs.tu-berlin.de
- 06.08.1997
- */
- #include <alloca.h>
- #include "Berusky_universal.h"
- #include "3d_all.h"
- #define DELTA_INTERVAL 0.01f
- #define LIB3DS_EPSILON (1e-8)
- #define MAX_SIM_RADKU 2000
- /******************************************************************************
- Debug-rozhrani
- ******************************************************************************
- */
- void dbg_print_matrix(GLMATRIX * m)
- {
- #define PRESNOST2 "%f %f %f %f"
- dbgprintf(PRESNOST2, m->_11, m->_21, m->_31, m->_41);
- dbgprintf(PRESNOST2, m->_12, m->_22, m->_32, m->_42);
- dbgprintf(PRESNOST2, m->_13, m->_23, m->_33, m->_43);
- dbgprintf(PRESNOST2, m->_14, m->_24, m->_34, m->_44);
- }
- void kprintf_matrix(GLMATRIX * m)
- {
- #define PRESNOST2 "%f %f %f %f"
- kprintf(TRUE, PRESNOST2, m->_11, m->_21, m->_31, m->_41);
- kprintf(TRUE, PRESNOST2, m->_12, m->_22, m->_32, m->_42);
- kprintf(TRUE, PRESNOST2, m->_13, m->_23, m->_33, m->_43);
- kprintf(TRUE, PRESNOST2, m->_14, m->_24, m->_34, m->_44);
- }
- void kprint_matrix(GLMATRIX * m)
- {
- #define PRESNOST3 "%.2f %.2f %.2f %.2f"
- kprintf(TRUE, PRESNOST3, m->_11, m->_21, m->_31, m->_41);
- kprintf(TRUE, PRESNOST3, m->_12, m->_22, m->_32, m->_42);
- kprintf(TRUE, PRESNOST3, m->_13, m->_23, m->_33, m->_43);
- kprintf(TRUE, PRESNOST3, m->_14, m->_24, m->_34, m->_44);
- }
- void dbg_print_track_uhel(TRACK_INFO * p_track)
- {
- word i;
- dbgprintf("Uhlovy track....");
- for (i = 0; i < p_track->rot_keys; i++) {
- dbgprintf("U: %d Uhel %f Osa [x = %f][y = %f][z = %f]", i,
- p_track->p_rot[i].angle * 180.0f / PI, p_track->p_rot[i].x,
- p_track->p_rot[i].y, p_track->p_rot[i].z);
- }
- }
- void dbg_print_track_quaternion(TRACK_INFO * p_track)
- {
- QUAT qa;
- word i;
- dbgprintf("Quat track....");
- for (i = 0; i < p_track->rot_keys; i++) {
- key_rotkey_to_quat(p_track->p_rot + i, &qa);
- dbgprintf("A: %d Absolutne [x = %f][y = %f][z = %f][w = %f]", i, qa.x,
- qa.y, qa.z, qa.w);
- }
- }
- void dbg_print_track_abs(TRACK_INFO * p_track)
- {
- QUAT qa;
- word i;
- dbgprintf("Absolutni track...");
- for (i = 0; i < p_track->rot_keys; i++) {
- qa = p_track->p_at[i];
- dbgprintf("%d Absolutne [x = %f][y = %f][z = %f][w = %f]", i, qa.x, qa.y,
- qa.z, qa.w);
- }
- }
- void dbg_print_track_abs_uhel(TRACK_INFO * p_track)
- {
- QUAT qa;
- word i;
- dbgprintf("Absolutni uhlovy track...");
- for (i = 0; i < p_track->rot_keys; i++) {
- quat_to_quat_angle(p_track->p_at + i, &qa);
- dbgprintf("U: %d Uhel %f Osa [x = %f][y = %f][z = %f]", i,
- qa.w * 180.0f / PI, qa.x, qa.y, qa.z);
- }
- }
- /*------------------------------------------------------------
- Modifikonvane universalni fce.
- ------------------------------------------------------------
- */
- /* Pokud je frame klicem -> vrati jeho cislo, jinak K_CHYBA
- */
- int key_je_frame_klic(KEY_POINT_BRS * p_list, int klicu, dword frame)
- {
- int l, p, s;
- dword time = frame * SIM_KONSTI;
- l = 0;
- p = klicu;
- if (!klicu || !p_list || time < p_list->time
- || time > p_list[klicu - 1].time)
- return (K_CHYBA);
- if (time == p_list->time)
- return (0);
- if (time == p_list[klicu - 1].time)
- return (klicu - 1);
- while (l != p) {
- // while(l < p) {
- s = l + ((p - l) >> 1);
- if (p_list[s].time == time)
- return (s);
- else {
- if (time > p_list[s].time) {
- if (time < p_list[s + 1].time)
- return (K_CHYBA);
- else
- l = s;
- }
- else
- p = s;
- }
- }
- return (K_CHYBA);
- }
- int key_je_time_klic(KEY_POINT_BRS * p_list, int klicu, dword time)
- {
- int l, p, s;
- l = 0;
- p = klicu;
- if (!klicu || !p_list || time < p_list->time
- || time > p_list[klicu - 1].time)
- return (K_CHYBA);
- if (time == p_list->time)
- return (0);
- if (time == p_list[klicu - 1].time)
- return (klicu - 1);
- while (l != p) {
- // while(l < p) {
- s = l + ((p - l) >> 1);
- if (p_list[s].time == time)
- return (s);
- else {
- if (time > p_list[s].time) {
- if (time < p_list[s + 1].time)
- return (K_CHYBA);
- else
- l = s;
- }
- else
- p = s;
- }
- }
- return (K_CHYBA);
- }
- // najde tento frame nebo nejblizsi levy klic
- inline static int key_najdi_klice(KEY_POINT_BRS * p_list, int klicu,
- dword time)
- {
- int l, p, s;
- l = 0;
- p = klicu;
- while (l != p) {
- s = l + ((p - l) >> 1);
- if (p_list[s].time == time)
- return (s);
- else {
- if (time > p_list[s].time) {
- if (time < p_list[s + 1].time)
- return (s);
- else
- l = s;
- }
- else
- p = s;
- }
- }
- return (K_CHYBA);
- }
- /*
- ----------------------
- Interpolace floatu
- ----------------------
- */
- /* spocita tangentu k pozicnimu klici
- trida = 1 -> trida a
- = -1 -> trida b
- */
- float key_tangent_float(float *p_body, KEY_POINT_BRS * p_keys, int kn,
- int keynum, int trida, int loop, float *p_tn)
- {
- float bias, continuity, tension;
- float t1, g1, g3;
- assert(kn < keynum);
- bias = p_keys[kn].bias;
- continuity = p_keys[kn].continuity;
- tension = p_keys[kn].tension;
- if (!kn) {
- if (keynum == 2) {
- *p_tn = (p_body[1] - p_body[0]) * (1.0f - tension);
- return (*p_tn);
- }
- else {
- if (loop) { // prvni klic
- g1 = (p_body[0] - p_body[keynum - 1]) * (1.0f + bias);
- g3 = (p_body[1] - p_body[0]) * (1.0f - bias) - g1;
- *p_tn =
- (g1 + g3 * (0.5f + trida * 0.5f * continuity)) * (1.0f - tension);
- }
- else {
- key_tangent_float(p_body, p_keys, 1, keynum, TRIDA_A, loop, &t1);
- *p_tn =
- ((p_body[kn + 1] - p_body[kn]) * 1.5f - t1 * 0.5f) * (1.0f -
- tension);
- }
- return (*p_tn);
- }
- }
- else if (kn == (keynum - 1)) { // konec - p(n-1), p(n)
- if (keynum == 2) {
- *p_tn = (p_body[kn] - p_body[kn - 1]) * (1.0f - tension);
- return (*p_tn);
- }
- else {
- if (loop) { // posledni klic
- g1 = (p_body[kn] - p_body[kn - 1]) * (1.0f + bias);
- g3 = (p_body[0] - p_body[kn]) * (1.0f - bias) - g1;
- *p_tn =
- (g1 + g3 * (0.5f + trida * 0.5f * continuity)) * (1.0f - tension);
- }
- else {
- key_tangent_float(p_body, p_keys, kn - 1, keynum, TRIDA_B, loop, &t1);
- *p_tn =
- ((p_body[kn] - p_body[kn - 1]) * 1.5f - t1 * 0.5f) * (1.0f -
- tension);
- }
- return (*p_tn);
- }
- }
- else { // stredni bod - mam p(n-1), p(n), p(n+1)
- g1 = (p_body[kn] - p_body[kn - 1]) * (1.0f + bias);
- g3 = (p_body[kn + 1] - p_body[kn]) * (1.0f - bias) - g1;
- *p_tn = (g1 + g3 * (0.5f + trida * 0.5f * continuity)) * (1.0f - tension);
- return (*p_tn);
- }
- }
- /* Prepocita kn, kn1, vraci t
- vraci:
- 0 - pouzit vse (kn,kn1,time)
- 1 - pouzit kn
- 2 - pouzit kn1
- */
- #define KN_ALL 0 //pouzit 2 klice + cas
- #define KN_KN 1 //pouzit klic 1
- // Volat pouze pokud keynum > 1 !!!
- inline int key_track_prepocet_knt(KEY_POINT_BRS * p_keys, int keynum,
- int time, int endtime, int loop, int *p_kn, int *p_kn1, float *p_time)
- {
- int start, stop, k1;
- int dop, intrv;
- int t1, t2;
- k1 = keynum - 1;
- start = p_keys[0].time;
- stop = p_keys[k1].time;
- if (time > 2 * endtime) {
- time = endtime + time % endtime;
- }
- assert(time < 2 * endtime);
- if (time < start) {
- if (loop) {
- *p_kn = k1;
- *p_kn1 = 0;
- dop = endtime - stop;
- intrv = dop + start;
- *p_time =
- (intrv >
- DELTA_INTERVAL) ? (float) (time + dop) / (float) intrv : 0.0f;
- return (KN_ALL);
- }
- else {
- *p_kn = 0;
- return (KN_KN);
- }
- }
- else if (time >= stop) {
- if (loop) {
- *p_kn = k1;
- *p_kn1 = 0; // presah do dalsiho intervalu
- intrv = (endtime - stop) + start;
- *p_time =
- (intrv >
- DELTA_INTERVAL) ? (float) (time - stop) / (float) intrv : 0.0f;
- return (KN_ALL);
- }
- else {
- *p_kn = k1;
- return (KN_KN);
- }
- }
- else {
- if (keynum == 2) {
- *p_kn = 0;
- *p_kn1 = 1;
- t1 = p_keys[0].time;
- t2 = p_keys[1].time;
- }
- else {
- *p_kn = key_najdi_klice(p_keys, keynum, time);
- *p_kn1 = (*p_kn) + 1;
- t1 = p_keys[*p_kn].time;
- t2 = p_keys[*p_kn1].time;
- }
- *p_time = (float) (time - t1) / (float) (t2 - t1);
- return (KN_ALL);
- }
- }
- float key_track_interpolace_float(float *p_vysl, float *p_body,
- KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
- {
- float pt0, pt1;
- float t, t2, t3;
- int ret;
- int kn, kn1;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- t2 = t * t;
- t3 = t2 * t;
- key_tangent_float(p_body, p_keys, kn, keynum, TRIDA_B, loop, &pt0);
- key_tangent_float(p_body, p_keys, kn1, keynum, TRIDA_A, loop, &pt1);
- return ((*p_vysl =
- p_body[kn] * (2 * t3 - 3 * t2 + 1) + pt0 * (t3 - 2 * t2 + t)
- + p_body[kn1] * (-2 * t3 + 3 * t2) + pt1 * (t3 - t2)));
- }
- else {
- return (*p_vysl = p_body[kn]);
- }
- }
- else {
- if (keynum) {
- return (*p_vysl = *p_body);
- }
- else
- return (FLT_MAX);
- }
- }
- float key_track_interpolace_float_linear(float *p_vysl, float *p_body,
- KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
- {
- float t, t2;
- int kn, kn1, ret;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- t2 = 1.0f - t;
- return (*p_vysl = p_body[kn] * t2 + p_body[kn1] * t);
- }
- else {
- return (*p_vysl = p_body[kn]);
- }
- }
- else {
- if (keynum) {
- return (*p_vysl = *p_body);
- }
- else
- return (FLT_MAX);
- }
- }
- /*
- ----------------------
- Interpolace bodu
- ----------------------
- */
- /* spocita tangentu k pozicnimu klici
- trida = 1 -> trida a
- = -1 -> trida b
- */
- BOD *key_tangent_bod(BOD * p_body, KEY_POINT_BRS * p_keys, int kn, int keynum,
- int trida, int loop, BOD * p_tn)
- {
- int kn_1 = kn - 1, // key k(n-1)
- kn1 = kn + 1; // key k(n+1)
- float bias, continuity, tension, tmp, tmp2;
- BOD *p_p0, *p_p1, *p_p2, t1, g1, g2, g3;
- bias = p_keys[kn].bias;
- continuity = p_keys[kn].continuity;
- tension = p_keys[kn].tension;
- if (!kn) {
- //kn = 0, zacatek - mam p(n), p(n+1)
- p_p1 = p_body + kn;
- p_p2 = p_body + kn1;
- if (keynum == 2) {
- //track ma jen 2 klice
- //b0 = (p1-p0)*(1-T)
- tmp = 1.0f - tension;
- p_tn->x = (p_p2->x - p_p1->x) * tmp;
- p_tn->y = (p_p2->y - p_p1->y) * tmp;
- p_tn->z = (p_p2->z - p_p1->z) * tmp;
- return (p_tn);
- }
- else { // zacatecni tangenta
- if (loop) {
- p_p0 = p_body + keynum - 1;
- }
- else {
- // trak ma vice klicu
- key_tangent_bod(p_body, p_keys, 1, keynum, TRIDA_A, loop, &t1);
- // b0 = ((p1 - p0)*1.5 - a1*0.5)*(1-T)
- tmp = 1.0f - tension;
- p_tn->x = ((p_p2->x - p_p1->x) * 1.5f - t1.x * 0.5f) * tmp;
- p_tn->y = ((p_p2->y - p_p1->y) * 1.5f - t1.y * 0.5f) * tmp;
- p_tn->z = ((p_p2->z - p_p1->z) * 1.5f - t1.z * 0.5f) * tmp;
- return (p_tn);
- }
- }
- }
- else if (kn == (keynum - 1)) { // konec - p(n-1), p(n)
- p_p0 = p_body + kn_1;
- p_p1 = p_body + kn;
- if (keynum == 2) {
- //track ma jen 2 klice
- //a1 = (p1-p0)*(1-T)
- tmp = 1.0f - tension;
- p_tn->x = (p_p1->x - p_p0->x) * tmp;
- p_tn->y = (p_p1->y - p_p0->y) * tmp;
- p_tn->z = (p_p1->z - p_p0->z) * tmp;
- return (p_tn);
- }
- else {
- if (loop) { // koncova tangenta
- p_p2 = p_body;
- }
- else {
- // bez opakovani
- key_tangent_bod(p_body, p_keys, kn_1, keynum, TRIDA_B, loop, &t1);
- // an = ((pn - p(n-1))*1.5 - b(n-1)*0.5)*(1-T)
- tmp = 1.0f - tension;
- p_tn->x = ((p_p1->x - p_p0->x) * 1.5f - t1.x * 0.5f) * tmp;
- p_tn->y = ((p_p1->y - p_p0->y) * 1.5f - t1.y * 0.5f) * tmp;
- p_tn->z = ((p_p1->z - p_p0->z) * 1.5f - t1.z * 0.5f) * tmp;
- return (p_tn);
- }
- }
- }
- else { // stredni bod - mam p(n-1), p(n), p(n+1)
- p_p0 = p_body + kn_1;
- p_p1 = p_body + kn;
- p_p2 = p_body + kn1;
- }
- // g1 = (pn - p(n-1))*(1+B)
- tmp = 1.0f + bias;
- g1.x = (p_p1->x - p_p0->x) * tmp;
- g1.y = (p_p1->y - p_p0->y) * tmp;
- g1.z = (p_p1->z - p_p0->z) * tmp;
- // g2 = (p(n+1) - pn)*(1-B)
- tmp = 1.0f - bias;
- g2.x = (p_p2->x - p_p1->x) * tmp;
- g2.y = (p_p2->y - p_p1->y) * tmp;
- g2.z = (p_p2->z - p_p1->z) * tmp;
- // g3 = g2 - g1,
- vektor_sub(&g2, &g1, &g3);
- /*
- tangent case a: an = (g1 + g3*(0.5 + 0.5*C))*(1-T),
- tangent case b: bn = (g1 + g3*(0.5 - 0.5*C))*(1-T).
- */
- tmp = 1.0f - tension;
- tmp2 = 0.5f + trida * 0.5f * continuity;
- p_tn->x = (g1.x + g3.x * tmp2) * tmp;
- p_tn->y = (g1.y + g3.y * tmp2) * tmp;
- p_tn->z = (g1.z + g3.z * tmp2) * tmp;
- return (p_tn);
- }
- BOD *key_track_interpolace_bod(BOD * p_vysl, BOD * p_body,
- KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
- {
- BOD *p0, *p1, pt0, pt1;
- float F1, F2, F3, F4;
- float t, t2, t3;
- int kn, kn1;
- int ret;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- t2 = t * t;
- t3 = t2 * t;
- key_tangent_bod(p_body, p_keys, kn, keynum, TRIDA_B, loop, &pt0);
- key_tangent_bod(p_body, p_keys, kn1, keynum, TRIDA_A, loop, &pt1);
- p0 = p_body + kn;
- p1 = p_body + kn1;
- F1 = 2 * t3 - 3 * t2 + 1;
- F2 = t3 - 2 * t2 + t;
- F3 = -2 * t3 + 3 * t2;
- F4 = t3 - t2;
- p_vysl->x = p0->x * F1 + pt0.x * F2 + p1->x * F3 + pt1.x * F4;
- p_vysl->y = p0->y * F1 + pt0.y * F2 + p1->y * F3 + pt1.y * F4;
- p_vysl->z = p0->z * F1 + pt0.z * F2 + p1->z * F3 + pt1.z * F4;
- }
- else {
- *p_vysl = p_body[kn];
- }
- }
- else {
- if (keynum) {
- *p_vysl = *p_body;
- }
- }
- return (p_vysl);
- }
- BOD *key_track_interpolace_bod_linear(BOD * p_vysl, BOD * p_body,
- KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
- {
- BOD *p_p0, *p_p1;
- float t, t2;
- int kn, kn1;
- int ret;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- t2 = 1.0f - t;
- p_p0 = p_body + kn;
- p_p1 = p_body + kn1;
- p_vysl->x = p_p0->x * t2 + p_p1->x * t;
- p_vysl->y = p_p0->y * t2 + p_p1->y * t;
- p_vysl->z = p_p0->z * t2 + p_p1->z * t;
- }
- else {
- *p_vysl = p_body[kn];
- }
- }
- else {
- if (keynum) {
- *p_vysl = *p_body;
- }
- }
- return (p_vysl);
- }
- /*
- ---------------------------
- Interpolace ctyr-bodu
- ---------------------------
- */
- /* spocita tangentu k pozicnimu klici
- trida = 1 -> trida a
- = -1 -> trida b
- */
- WBOD *key_tangent_wbod(WBOD * p_body, KEY_POINT_BRS * p_keys, int kn,
- int keynum, int trida, int loop, WBOD * p_tn)
- {
- int kn_1 = kn - 1, // key k(n-1)
- kn1 = kn + 1; // key k(n+1)
- float bias, continuity, tension, tn1, bp1;
- WBOD *p_p0, *p_p1, *p_p2, t1, g1, g2, g3;
- bias = p_keys[kn].bias;
- continuity = p_keys[kn].continuity;
- tension = p_keys[kn].tension;
- if (!kn) {
- //kn = 0, zacatek - mam p(n), p(n+1)
- p_p1 = p_body + kn;
- p_p2 = p_body + kn1;
- if (keynum == 2) {
- //track ma jen 2 klice
- //b0 = (p1-p0)*(1-T)
- tn1 = (1.0f - tension);
- p_tn->x = (p_p2->x - p_p1->x) * tn1;
- p_tn->y = (p_p2->y - p_p1->y) * tn1;
- p_tn->z = (p_p2->z - p_p1->z) * tn1;
- p_tn->w = (p_p2->w - p_p1->w) * tn1;
- return (p_tn);
- }
- else {
- if (loop) {
- p_p0 = p_body + keynum - 1;
- }
- else {
- // trak ma vice klicu
- key_tangent_wbod(p_body, p_keys, 1, keynum, TRIDA_A, loop, &t1);
- tn1 = (1.0f - tension);
- // b0 = ((p1 - p0)*1.5 - a1*0.5)*(1-T)
- p_tn->x = ((p_p2->x - p_p1->x) * 1.5f - t1.x * 0.5f) * tn1;
- p_tn->y = ((p_p2->y - p_p1->y) * 1.5f - t1.y * 0.5f) * tn1;
- p_tn->z = ((p_p2->z - p_p1->z) * 1.5f - t1.z * 0.5f) * tn1;
- p_tn->w = ((p_p2->w - p_p1->w) * 1.5f - t1.w * 0.5f) * tn1;
- return (p_tn);
- }
- }
- }
- else if (kn == (keynum - 1)) { // konec - p(n-1), p(n)
- p_p0 = p_body + kn_1;
- p_p1 = p_body + kn;
- if (keynum == 2) {
- //track ma jen 2 klice
- //a1 = (p1-p0)*(1-T)
- tn1 = (1.0f - tension);
- p_tn->x = (p_p1->x - p_p0->x) * tn1;
- p_tn->y = (p_p1->y - p_p0->y) * tn1;
- p_tn->z = (p_p1->z - p_p0->z) * tn1;
- p_tn->w = (p_p1->w - p_p0->w) * tn1;
- return (p_tn);
- }
- else {
- if (loop) {
- p_p2 = p_body;
- }
- else {
- // bez opakovani
- key_tangent_wbod(p_body, p_keys, kn_1, keynum, TRIDA_B, loop, &t1);
- // an = ((pn - p(n-1))*1.5 - b(n-1)*0.5)*(1-T)
- tn1 = (1.0f - tension);
- p_tn->x = ((p_p1->x - p_p0->x) * 1.5f - t1.x * 0.5f) * tn1;
- p_tn->y = ((p_p1->y - p_p0->y) * 1.5f - t1.y * 0.5f) * tn1;
- p_tn->z = ((p_p1->z - p_p0->z) * 1.5f - t1.z * 0.5f) * tn1;
- p_tn->w = ((p_p1->w - p_p0->w) * 1.5f - t1.w * 0.5f) * tn1;
- return (p_tn);
- }
- }
- }
- else { // stredni bod - mam p(n-1), p(n), p(n+1)
- p_p0 = p_body + kn_1;
- p_p1 = p_body + kn;
- p_p2 = p_body + kn1;
- }
- bp1 = 1.0f + bias;
- // g1 = (pn - p(n-1))*(1+B)
- g1.x = (p_p1->x - p_p0->x) * bp1;
- g1.y = (p_p1->y - p_p0->y) * bp1;
- g1.z = (p_p1->z - p_p0->z) * bp1;
- g1.w = (p_p1->w - p_p0->w) * bp1;
- // g2 = (p(n+1) - pn)*(1-B)
- g2.x = (p_p2->x - p_p1->x) * bp1;
- g2.y = (p_p2->y - p_p1->y) * bp1;
- g2.z = (p_p2->z - p_p1->z) * bp1;
- g2.w = (p_p2->w - p_p1->w) * bp1;
- // g3 = g2 - g1,
- wvektor_sub(&g2, &g1, &g3);
- /*
- tangent case a: an = (g1 + g3*(0.5 + 0.5*C))*(1-T),
- tangent case b: bn = (g1 + g3*(0.5 - 0.5*C))*(1-T).
- */
- tn1 = (1.0f - tension);
- bp1 = (0.5f + trida * 0.5f * continuity);
- p_tn->x = (g1.x + g3.x * bp1) * tn1;
- p_tn->y = (g1.y + g3.y * bp1) * tn1;
- p_tn->z = (g1.z + g3.z * bp1) * tn1;
- p_tn->w = (g1.w + g3.w * bp1) * tn1;
- return (p_tn);
- }
- WBOD *key_track_interpolace_wbod(WBOD * p_vysl, WBOD * p_body,
- KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
- {
- WBOD *p0, *p1, pt0, pt1;
- float F1, F2, F3, F4;
- float t, t2, t3;
- int kn, kn1;
- int ret;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- t2 = t * t;
- t3 = t2 * t;
- key_tangent_wbod(p_body, p_keys, kn, keynum, TRIDA_B, loop, &pt0);
- key_tangent_wbod(p_body, p_keys, kn1, keynum, TRIDA_A, loop, &pt1);
- p0 = p_body + kn;
- p1 = p_body + kn1;
- F1 = 2 * t3 - 3 * t2 + 1;
- F2 = t3 - 2 * t2 + t;
- F3 = -2 * t3 + 3 * t2;
- F4 = t3 - t2;
- p_vysl->x = p0->x * F1 + pt0.x * F2 + p1->x * F3 + pt1.x * F4;
- p_vysl->y = p0->y * F1 + pt0.y * F2 + p1->y * F3 + pt1.y * F4;
- p_vysl->z = p0->z * F1 + pt0.z * F2 + p1->z * F3 + pt1.z * F4;
- p_vysl->w = p0->w * F1 + pt0.w * F2 + p1->w * F3 + pt1.w * F4;
- }
- else {
- *p_vysl = p_body[kn];
- }
- }
- else {
- if (keynum) {
- *p_vysl = *p_body;
- }
- }
- return (p_vysl);
- }
- WBOD *key_track_interpolace_wbod_linear(WBOD * p_vysl, WBOD * p_body,
- KEY_POINT_BRS * p_keys, int time, int endtime, int keynum, int loop)
- {
- WBOD *p_p0, *p_p1;
- float t, t2;
- int kn, kn1;
- int ret;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_keys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- t2 = 1.0f - t;
- p_p0 = p_body + kn;
- p_p1 = p_body + kn1;
- p_vysl->x = p_p0->x * t2 + p_p1->x * t;
- p_vysl->y = p_p0->y * t2 + p_p1->y * t;
- p_vysl->z = p_p0->z * t2 + p_p1->z * t;
- p_vysl->w = p_p0->w * t2 + p_p1->w * t;
- }
- else {
- *p_vysl = p_body[kn];
- }
- }
- else {
- if (keynum) {
- *p_vysl = *p_body;
- }
- }
- return (p_vysl);
- }
- /*
- ---------------------------
- Interpolace Quaternionu
- ---------------------------
- */
- QUAT *key_tangent_quat(QUAT * p_at, KEY_POINT_BRS * p_rkeys, int kn,
- int keynum, int trida, int loop, QUAT * p_q)
- {
- int kn_1 = kn - 1, // key k(n-1)
- kn1 = kn + 1; // key k(n+1)
- float bias, continuity, tension;
- QUAT q0, /*q1, */ q2, g1, g2, g3;
- bias = p_rkeys[kn].bias;
- continuity = p_rkeys[kn].continuity;
- tension = p_rkeys[kn].tension;
- if (!kn) {
- //kn = 0, zacatek - mam p(n), p(n+1)
- if (keynum == 2) { //track ma jen 2 klice
- return (slerp(p_at + kn, p_at + kn1, (1.0f - tension) / 3.0f, p_q));
- }
- else { // prvni body (-1,0,1)
- if (loop) {
- return (slerp(p_at + kn, slerp(slerp(p_at + kn, p_at + keynum - 1,
- -(1 + bias) / 3.0f, &g1), slerp(p_at + kn, p_at + kn1,
- (1 - bias) / 3.0f, &g2), 0.5f + trida * 0.5f * continuity,
- &g3), trida * (tension - 1.0f), p_q));
- }
- else {
- key_tangent_quat(p_at, p_rkeys, kn1, keynum, TRIDA_B, loop, &q2);
- return (slerp(p_at + kn, &q2, (1.0f - tension) * 0.5f, p_q));
- }
- }
- }
- else if (kn == (int) keynum - 1) { // konec - p(n-1), p(n)
- if (keynum == 2) { //track ma jen 2 klice
- return (slerp(p_at + kn, p_at + kn_1, (1.0f - tension) / 3.0f, p_q));
- }
- else { // posledni body bez opakovani
- if (loop) { // posledni (-2,-1,0)
- return (slerp(p_at + kn, slerp(slerp(p_at + kn, p_at + kn_1,
- -(1 + bias) / 3.0f, &g1), slerp(p_at + kn, p_at,
- (1 - bias) / 3.0f, &g2), 0.5f + trida * 0.5f * continuity,
- &g3), trida * (tension - 1.0f), p_q));
- }
- else {
- key_tangent_quat(p_at, p_rkeys, kn_1, keynum, TRIDA_A, loop, &q0);
- return (slerp(p_at + kn, &q0, (1.0f - tension) * 0.5f, p_q));
- }
- }
- }
- else { // stredni bod - mam q(n-1), q(n), q(n+1)
- return (slerp(p_at + kn, slerp(slerp(p_at + kn, p_at + kn_1,
- -(1 + bias) / 3.0f, &g1), slerp(p_at + kn, p_at + kn1,
- (1 - bias) / 3.0f, &g2), 0.5f + trida * 0.5f * continuity, &g3),
- trida * (tension - 1.0f), p_q));
- }
- }
- QUAT *key_track_interpolace_quat(QUAT * p_quat, QUAT * p_at,
- KEY_POINT_BRS * p_rkeys, int time, int endtime, int keynum, int loop)
- {
- QUAT q0, q1, q2;
- QUAT qn, qn1;
- QUAT bn, an;
- int kn, kn1;
- float t;
- int ret;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_rkeys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- assert(0.0f <= t && t <= 1.0f);
- key_tangent_quat(p_at, p_rkeys, kn, keynum, TRIDA_B, loop, &bn);
- key_tangent_quat(p_at, p_rkeys, kn1, keynum, TRIDA_A, loop, &an);
- qn = p_at[kn];
- qn1 = p_at[kn1];
- slerp(&qn, &bn, t, &q0);
- slerp(&bn, &an, t, &q1);
- slerp(&an, &qn1, t, &q2);
- slerp(&q0, &q1, t, &qn);
- slerp(&q1, &q2, t, &qn1);
- return (slerp(&qn, &qn1, t, p_quat));
- }
- else {
- *p_quat = p_at[kn];
- return (p_quat);
- }
- }
- else {
- if (keynum) {
- *p_quat = *p_at;
- return (p_quat);
- }
- else
- return (NULL);
- }
- }
- QUAT *key_track_interpolace_quat_linear(QUAT * p_quat, QUAT * p_at,
- KEY_POINT_BRS * p_rkeys, int time, int endtime, int keynum, int loop)
- {
- int kn, kn1;
- float t;
- int ret;
- if (keynum > 1) {
- ret =
- key_track_prepocet_knt(p_rkeys, keynum, time, endtime, loop, &kn, &kn1,
- &t);
- if (ret == KN_ALL) {
- assert(0.0f <= t && t <= 1.0f);
- return (slerp(p_at + kn, p_at + kn1, t, p_quat));
- }
- else {
- *p_quat = p_at[kn];
- return (p_quat);
- }
- }
- else {
- if (keynum) {
- *p_quat = *p_at;
- return (p_quat);
- }
- else
- return (NULL);
- }
- }
- /* Pole hodnot o velikosti size_of_hodnota*keynum, p_keys*size_of_hodnota
- najdu frame a vlozim to tam
- */
- int key_track_klic_vloz(byte ** p_hodnoty, KEY_POINT_BRS ** p_skeys,
- int keynum, int size_of_hodnota, byte * p_new_hodnota,
- KEY_POINT_BRS * p_new_keys)
- {
- KEY_POINT_BRS *p_nkeys;
- byte *p_nhod;
- KEY_POINT_BRS *p_keys = *p_skeys;
- byte *p_hod = *p_hodnoty;
- int i, j;
- dword new_time = p_new_keys->time;
- p_nhod = (byte *) mmalloc(size_of_hodnota * (keynum + 1));
- p_nkeys = (KEY_POINT_BRS *) mmalloc(sizeof(p_nkeys[0]) * (keynum + 1));
- // Vlozit pred nulovym framem
- if (keynum && new_time < p_keys[0].time) {
- p_nkeys[0] = *p_new_keys;
- memcpy(p_nhod, p_new_hodnota, size_of_hodnota);
- memcpy(p_nkeys + 1, p_keys, sizeof(p_nkeys[0]) * keynum);
- memcpy(p_nhod + size_of_hodnota, p_hod, size_of_hodnota * keynum);
- // Vlozit za nulovym framem
- }
- else if (!keynum || p_keys[keynum - 1].time < new_time) {
- memcpy(p_nkeys, p_keys, sizeof(p_nkeys[0]) * keynum);
- memcpy(p_nhod, p_hod, size_of_hodnota * keynum);
- p_nkeys[keynum] = *p_new_keys;
- memcpy(p_nhod + keynum * size_of_hodnota, p_new_hodnota, size_of_hodnota);
- }
- else {
- // kopie vseho bez noveho framu
- for (i = 0, j = 0; i < keynum; i++, j++) {
- if (p_keys[i].time <= new_time && new_time < p_keys[i + 1].time) {
- p_nkeys[j] = p_keys[i];
- memcpy(p_nhod + j * size_of_hodnota, p_hod + i * size_of_hodnota,
- size_of_hodnota);
- j++;
- p_nkeys[j] = *p_new_keys;
- memcpy(p_nhod + j * size_of_hodnota, p_new_hodnota, size_of_hodnota);
- }
- else {
- p_nkeys[j] = p_keys[i];
- memcpy(p_nhod + j * size_of_hodnota, p_hod + i * size_of_hodnota,
- size_of_hodnota);
- }
- }
- }
- free(p_keys);
- free(p_hod);
- *p_hodnoty = p_nhod;
- *p_skeys = p_nkeys;
- return (keynum + 1);
- }
- // Automaticke vlozeni klice do seznamu
- int key_track_klic_vloz_auto(byte ** p_hodnoty, KEY_POINT_BRS ** p_skeys,
- int keynum, int size_of_hodnota, byte * p_new_hodnota,
- KEY_POINT_BRS * p_new_keys)
- {
- int klic;
- if ((klic =
- key_je_frame_klic(*p_skeys, keynum, p_new_keys->time)) == K_CHYBA) {
- return (key_track_klic_vloz(p_hodnoty, p_skeys, keynum, size_of_hodnota,
- p_new_hodnota, p_new_keys));
- }
- else {
- memcpy((*p_skeys) + klic, p_new_keys, sizeof(p_new_keys[0]));
- memcpy((*p_hodnoty) + klic * size_of_hodnota, p_new_hodnota,
- size_of_hodnota);
- return (keynum);
- }
- }
- int key_track_klic_smaz(byte ** p_hodnoty, KEY_POINT_BRS ** p_skeys,
- int *p_keynum, int size_of_hodnota, dword del_time)
- {
- KEY_POINT_BRS *p_nkeys;
- byte *p_nhod;
- KEY_POINT_BRS *p_keys = *p_skeys;
- byte *p_hod = *p_hodnoty;
- int i, j, keynum = *p_keynum;
- if (keynum == 1) {
- null_free((void **) p_hodnoty);
- null_free((void **) p_skeys);
- return ((*p_keynum = 0));
- }
- else {
- p_nhod = (byte *) mmalloc(size_of_hodnota * (keynum - 1));
- p_nkeys = (KEY_POINT_BRS *) mmalloc(sizeof(p_nkeys[0]) * (keynum - 1));
- if (p_keys[keynum - 1].time == del_time) {
- memcpy(p_nkeys, p_keys, sizeof(p_nkeys[0]) * (keynum - 1));
- memcpy(p_nhod, p_hod, size_of_hodnota * (keynum - 1));
- }
- else {
- // kopie vseho bez noveho framu
- for (i = 0, j = 0; i < keynum; i++, j++) {
- if (p_keys[i].time != del_time) {
- p_nkeys[j] = p_keys[i];
- memcpy(p_nhod + j * size_of_hodnota, p_hod + i * size_of_hodnota,
- size_of_hodnota);
- }
- else {
- j--;
- }
- }
- }
- free(p_keys);
- free(p_hod);
- *p_hodnoty = p_nhod;
- *p_skeys = p_nkeys;
- return ((*p_keynum)--);
- }
- }
- /*****************************************************************************
- Key-frame animace
- *****************************************************************************
- */
- void key_pivot_sub(EDIT_OBJEKT * p_obj, BOD * p_pivot)
- {
- int v;
- for (v = 0; v < p_obj->vertexnum; v++) {
- p_obj->p_vertex[v].x -= p_pivot->x;
- p_obj->p_vertex[v].y -= p_pivot->y;
- p_obj->p_vertex[v].z -= p_pivot->z;
- }
- }
- void key_tri_to_matrix_zero(GLMATRIX * p_m, HIERARCHY_TRACK_INFO * p_track)
- {
- if (p_track) {
- init_matrix(p_m);
- if (p_track->rot_keys)
- quat_to_matrix(p_m, p_track->p_at);
- if (p_track->scs_keys) {
- scale_matrix(p_m, p_track->p_scale[0].x,
- p_track->p_scale[0].y, p_track->p_scale[0].z);
- }
- if (p_track->pos_keys) {
- p_m->_41 = p_track->p_pos[0].x;
- p_m->_42 = p_track->p_pos[0].y;
- p_m->_43 = p_track->p_pos[0].z;
- }
- }
- }
- static int key_konec_prochazeni;
- /* Rekurzivne prida tri do tri-stromu
- */
- static void key_tri_node_pridej(HIERARCHY_TRACK_INFO * p_tri,
- HIERARCHY_TRACK_INFO * p_child)
- {
- int i;
- if (key_konec_prochazeni)
- return;
- if (p_tri->objnum == p_child->parentnum) {
- key_tri_child_pridej(p_tri, p_child);
- key_konec_prochazeni = TRUE;
- }
- else {
- for (i = 0; i < p_tri->childnum && !key_konec_prochazeni; i++) {
- key_tri_node_pridej(p_tri->p_child[i], p_child);
- }
- }
- }
- /* rekurzivne prida tri node do rootu
- */
- static void key_root_node_pridej(HIERARCHY_ROOT * p_root,
- HIERARCHY_TRACK_INFO * p_child)
- {
- int i;
- if (p_child->parentnum == ROOT_NODE) {
- key_root_child_pridej(p_root, p_child);
- key_konec_prochazeni = TRUE;
- }
- else {
- for (i = 0; i < p_root->childnum && !key_konec_prochazeni; i++)
- key_tri_node_pridej(p_root->p_child[i], p_child);
- }
- }
- /* vyrobi root animacni strom
- */
- HIERARCHY_ROOT *key_root_vyrob_indir(EDIT_KONTEJNER * p_kont,
- HIERARCHY_ROOT * p_root)
- {
- HIERARCHY_TRACK_INFO *p_tri;
- TRACK_INFO *p_track;
- EDIT_OBJEKT *p_obj;
- //int objnum = p_kont->objektu;
- int o;
- // nastaveni zakladnich veci
- for (o = 0; o < p_kont->max_objektu; o++) {
- if (p_kont->p_obj[o] && p_kont->p_obj[o]->p_track)
- break;
- }
- if (o >= p_kont->max_objektu) {
- //assert(0);
- return (NULL);
- }
- p_track = p_kont->p_obj[o]->p_track;
- p_root->framenum = p_track->framenum;
- p_root->delka = (float) p_root->framenum / (float) FRAMU_PER_SEC;
- // kopie vsech tracku + provazani objektu se scenou
- for (o = 0; o < p_kont->max_objektu; o++) {
- p_obj = p_kont->p_obj[o];
- if (p_obj && (p_track = p_obj->p_track)) { // pokud tento objekt ma track
- p_tri = key_track_to_tri(p_obj->p_track);
- p_tri->p_obj = p_obj;
- key_zrus_track(&p_obj->p_track);
- key_konec_prochazeni = FALSE;
- key_root_node_pridej(p_root, p_tri);
- assert(key_konec_prochazeni);
- }
- }
- return (p_root);
- }
- static float key_najdi_otcovy_scaly(HIERARCHY_TRACK_INFO * p_track)
- {
- if (p_track->p_otec == NULL)
- return ((p_track->scs_keys) ? p_track->p_scale[0].x : 1.0f);
- else
- return ((p_track->scs_keys) ? p_track->p_scale[0].x *
- key_najdi_otcovy_scaly(p_track->
- p_otec) : key_najdi_otcovy_scaly(p_track->p_otec));
- }
- static void key_tri_to_local(HIERARCHY_TRACK_INFO * p_track)
- {
- EDIT_OBJEKT *p_obj;
- GLMATRIX m;
- int i;
- p_obj = (EDIT_OBJEKT *) p_track->p_obj;
- if (key_najdi_otcovy_scaly(p_track) < 0.0f)
- scale_matrix(&p_obj->m, -1.0f, 1.0f, 1.0f);
- // proval to matici a jedeme
- transformuj_objekt_matici(p_obj, invert_matrix(&p_obj->m, &m));
- if (p_track->childnum == 1) {
- key_tri_to_local(p_track->p_child[0]);
- }
- else {
- for (i = 0; i < p_track->childnum; i++) {
- key_tri_to_local(p_track->p_child[i]);
- }
- }
- }
- /*
- static void key_tri_to_local(HIERARCHY_TRACK_INFO *p_track)
- {
- EDIT_OBJEKT *p_obj;
- int i;
-
- p_obj = (EDIT_OBJEKT *)p_track->p_obj;
-
- if(key_najdi_otcovy_scaly(p_track) < 0.0f) {
- //scale_matrix(&p_obj->local_matrix,-1.0f,1.0f,1.0f);
- }
- if(p_track->childnum == 1) {
- key_tri_to_local(p_track->p_child[0]);
- } else {
- for(i = 0; i < p_track->childnum; i++) {
- key_tri_to_local(p_track->p_child[i]);
- }
- }
- }
- */
- static void key_tri_to_world(HIERARCHY_TRACK_INFO * p_track)
- {
- EDIT_OBJEKT *p_obj, *p_otec;
- int i;
- p_obj = (EDIT_OBJEKT *) p_track->p_obj;
- key_tri_to_matrix_zero(&p_obj->m, p_track);
- if (p_track->p_otec) {
- p_otec = (EDIT_OBJEKT *) p_track->p_otec->p_obj;
- mat_mult(&p_obj->m, &p_otec->m, &p_obj->m);
- }
- pivotuj_matrix_tam(&p_track->pivot, &p_obj->m);
- if (p_track->childnum == 1) {
- key_tri_to_world(p_track->p_child[0]);
- }
- else {
- for (i = 0; i < p_track->childnum; i++) {
- key_tri_to_world(p_track->p_child[i]);
- }
- }
- }
- /*
- static void key_tri_to_world(HIERARCHY_TRACK_INFO *p_track)
- {
- EDIT_OBJEKT *p_obj,*p_otec;
- int i;
-
- p_obj = (EDIT_OBJEKT *)p_track->p_obj;
- //key_tri_to_matrix_zero(&p_obj->m, p_track);
-
- if(p_track->p_otec) {
- p_otec = (EDIT_OBJEKT *)p_track->p_otec->p_obj;
- mat_mult(&p_obj->m,&p_otec->m,&p_obj->m);
- }
- // pivotuj_matrix_tam(&p_track->pivot,&p_obj->m);
- if(p_track->childnum == 1) {
- key_tri_to_world(p_track->p_child[0]);
- } else {
- for(i = 0; i < p_track->childnum; i++) {
- key_tri_to_world(p_track->p_child[i]);
- }
- }
- }
- */
- /* Prevede root do nulove vychozi pozice
- */
- void key_root_to_zero(HIERARCHY_ROOT * p_root)
- {
- int i;
- for (i = 0; i < p_root->childnum; i++) {
- key_tri_to_local(p_root->p_child[i]);
- key_tri_to_world(p_root->p_child[i]);
- }
- }
- /* rekurzivni animace stromu/objektu -
- predavat i horni matici -> jako horni matice 0 je word-matrix !
- */
- void key_tri_to_matrix(HIERARCHY_TRACK_INFO * p_track, int time,
- GLMATRIX * p_otec, int loop)
- {
- EDIT_OBJEKT *p_obj;
- GLMATRIX m;
- QUAT q;
- BOD p;
- int i;
- // spocitej hierarchii
- p_obj = (EDIT_OBJEKT *) p_track->p_obj;
- // spocitej pozici + ostatni veci
- init_matrix(&m);
- if (p_track->p_pos) {
- key_track_interpolace_bod(&p, p_track->p_pos, p_track->p_pkeys, time,
- p_track->endtime, p_track->pos_keys, loop);
- m._41 = p.x;
- m._42 = p.y;
- m._43 = p.z;
- }
- if (p_track->p_at) {
- key_track_interpolace_quat(&q, p_track->p_at, p_track->p_rkeys, time,
- p_track->endtime, p_track->rot_keys, loop);
- quat_to_matrix(&m, &q);
- }
- if (p_track->p_scale) {
- key_track_interpolace_bod(&p, p_track->p_scale, p_track->p_skeys, time,
- p_track->endtime, p_track->scs_keys, loop);
- m._11 *= p.x;
- m._21 *= p.x;
- m._31 *= p.x;
- m._12 *= p.y;
- m._22 *= p.y;
- m._32 *= p.y;
- m._13 *= p.z;
- m._23 *= p.z;
- m._33 *= p.z;
- }
- if (p_track->p_at) {
- pivotuj_matrix_tam(&p_track->pivot, &m);
- }
- // spocitej hierarchii
- p_obj = (EDIT_OBJEKT *) p_track->p_obj;
- mat_mult(&m, p_otec, &p_obj->m); // aktualni*otec => vysledek
- if (p_track->childnum == 1) {
- key_tri_to_matrix(p_track->p_child[0], time, &p_obj->m, loop);
- }
- else {
- for (i = 0; i < p_track->childnum; i++) {
- key_tri_to_matrix(p_track->p_child[i], time, &p_obj->m, loop);
- }
- }
- }
- /*
- void key_tri_to_matrix(HIERARCHY_TRACK_INFO *p_track, int time, GLMATRIX *p_otec, int loop)
- {
- EDIT_OBJEKT *p_obj;
- GLMATRIX m;
- QUAT q;
- BOD p;
- int i;
- // spocitej hierarchii
- p_obj = (EDIT_OBJEKT *)p_track->p_obj;
- // spocitej pozici + ostatni veci
- init_matrix(&m);
- if(p_track->p_pos) {
- key_track_interpolace_bod(&p,p_track->p_pos,p_track->p_pkeys,time,p_track->endtime,p_track->pos_keys,loop);
- m._41 = p.x;
- m._42 = p.y;
- m._43 = p.z;
- }
- if(p_track->p_at) {
- key_track_interpolace_quat(&q,p_track->p_at,p_track->p_rkeys,time,p_track->endtime,p_track->rot_keys,loop);
- quat_to_matrix(&m,&q);
- }
- if(p_track->p_scale) {
- key_track_interpolace_bod(&p,p_track->p_scale,p_track->p_skeys,time,p_track->endtime,p_track->scs_keys,loop);
- scale_matrix(&m,p.x,p.y,p.z);
- }
- // spocitej hierarchii
- p_obj = (EDIT_OBJEKT *)p_track->p_obj;
- mat_mult(&m,p_otec,&m); // aktualni*otec => vysledek
- p_obj->m = m;
- pivotuj_matrix_tam(&p_track->pivot,&p_obj->m);
-
- mat_mult(&p_obj->local_matrix,&p_obj->m,&p_obj->m);
-
- if(p_track->childnum == 1) {
- key_tri_to_matrix(p_track->p_child[0], time, &m, loop);
- } else {
- for(i = 0; i < p_track->childnum; i++) {
- key_tri_to_matrix(p_track->p_child[i], time, &m, loop);
- }
- }
- }
- */
- void key_root_to_matrix(HIERARCHY_ROOT * p_root, int time, GLMATRIX * p_otec)
- {
- GLMATRIX m;
- int i;
- if (!p_otec) {
- p_otec = init_matrix(&m);
- }
- for (i = 0; i < p_root->childnum; i++)
- key_tri_to_matrix(p_root->p_child[i], time, p_otec,
- p_root->flag & GK_LOOP);
- }
- // track veci
- TRACK_INFO *key_track_vyrob(int poskey, int rotkey, int scalekey)
- {
- TRACK_INFO *p_track;
- p_track = (TRACK_INFO *) mmalloc(sizeof(TRACK_INFO));
- // pozicni klice
- p_track->pos_keys = poskey;
- p_track->p_pkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_pkeys[0]) * poskey);
- p_track->p_pos = (BOD *) mmalloc(sizeof(BOD) * poskey);
- // rotacni klice
- p_track->rot_keys = rotkey;
- p_track->p_rkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_rkeys[0]) * rotkey);
- p_track->p_rot = (ROTKEY *) mmalloc(sizeof(ROTKEY) * rotkey);
- p_track->p_at = (QUAT *) mmalloc(sizeof(p_track->p_at[0]) * rotkey);
- // scalovaci klice
- p_track->scs_keys = scalekey;
- p_track->p_skeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_skeys[0]) * scalekey);
- p_track->p_scale = (BOD *) mmalloc(sizeof(BOD) * scalekey);
- return (p_track);
- }
- HIERARCHY_TRACK_INFO *key_tri_vyrob_indir(HIERARCHY_TRACK_INFO * p_hir,
- int poskey, int rotkey, int scalekey)
- {
- memset(p_hir, 0, sizeof(p_hir[0]));
- // pozicni klice
- if ((p_hir->pos_keys = poskey)) {
- p_hir->p_pkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_hir->p_pkeys[0]) * poskey);
- p_hir->p_pos = (BOD *) mmalloc(sizeof(BOD) * poskey);
- }
- // rotacni klice
- if ((p_hir->rot_keys = rotkey)) {
- p_hir->p_rkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_hir->p_rkeys[0]) * rotkey);
- p_hir->p_at = (QUAT *) mmalloc(sizeof(p_hir->p_at[0]) * rotkey);
- }
- // scalovaci klice
- if ((p_hir->scs_keys = scalekey)) {
- p_hir->p_scale = (BOD *) mmalloc(sizeof(BOD) * scalekey);
- p_hir->p_skeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_hir->p_skeys[0]) * scalekey);
- }
- return (p_hir);
- }
- HIERARCHY_TRACK_INFO *key_tri_vyrob(int poskey, int rotkey, int scalekey)
- {
- HIERARCHY_TRACK_INFO *p_hir;
- p_hir = (HIERARCHY_TRACK_INFO *) mmalloc(sizeof(HIERARCHY_TRACK_INFO));
- key_tri_vyrob_indir(p_hir, poskey, rotkey, scalekey);
- return (p_hir);
- }
- HIERARCHY_TRACK_INFO *key_tri_vyrob_un_indir(void)
- {
- HIERARCHY_TRACK_INFO *p_hir;
- p_hir = (HIERARCHY_TRACK_INFO *) mmalloc(sizeof(HIERARCHY_TRACK_INFO));
- return (p_hir);
- }
- // kopie tracku
- HIERARCHY_TRACK_INFO *key_track_to_tri(TRACK_INFO * p_track)
- {
- HIERARCHY_TRACK_INFO *p_tri = key_tri_vyrob(p_track->pos_keys,
- p_track->rot_keys, p_track->scs_keys);
- p_tri->objnum = p_track->objekt;
- p_tri->parentnum = p_track->parent;
- p_tri->pivot = p_track->pivot;
- p_tri->endtime = calc_endtime(p_track->framenum);
- if (p_track->pos_keys) {
- memcpy(p_tri->p_pkeys, p_track->p_pkeys,
- sizeof(p_track->p_pkeys[0]) * p_track->pos_keys);
- memcpy(p_tri->p_pos, p_track->p_pos,
- sizeof(p_track->p_pos[0]) * p_track->pos_keys);
- }
- if (p_track->rot_keys) {
- memcpy(p_tri->p_rkeys, p_track->p_rkeys,
- sizeof(p_track->p_rkeys[0]) * p_track->rot_keys);
- memcpy(p_tri->p_at, p_track->p_at,
- sizeof(p_track->p_at[0]) * p_track->rot_keys);
- }
- if (p_track->scs_keys) {
- memcpy(p_tri->p_skeys, p_track->p_skeys,
- sizeof(p_track->p_skeys[0]) * p_track->scs_keys);
- memcpy(p_tri->p_scale, p_track->p_scale,
- sizeof(p_track->p_scale[0]) * p_track->scs_keys);
- }
- return (p_tri);
- }
- void key_zrus_track(TRACK_INFO ** p_track)
- {
- TRACK_INFO *p_tri = *p_track;
- null_free((void **) &p_tri->p_pkeys);
- null_free((void **) &p_tri->p_pos);
- null_free((void **) &p_tri->p_rkeys);
- null_free((void **) &p_tri->p_rot);
- null_free((void **) &p_tri->p_at);
- null_free((void **) &p_tri->p_skeys);
- null_free((void **) &p_tri->p_scale);
- null_free((void **) &p_tri);
- *p_track = NULL;
- }
- // prida child do track_node
- void key_tri_child_pridej(HIERARCHY_TRACK_INFO * p_root,
- HIERARCHY_TRACK_INFO * p_child)
- {
- p_root->childnum += 1;
- p_root->p_child =
- (HIERARCHY_TRACK_INFO **) realloc(p_root->p_child,
- sizeof(p_root->p_child[0]) * p_root->childnum);
- p_root->p_child[p_root->childnum - 1] = p_child;
- p_child->p_otec = p_root;
- }
- // prida child do root_node
- void key_root_child_pridej(HIERARCHY_ROOT * p_root,
- HIERARCHY_TRACK_INFO * p_child)
- {
- p_root->childnum += 1;
- p_root->p_child =
- (HIERARCHY_TRACK_INFO **) realloc(p_root->p_child,
- sizeof(p_root->p_child[0]) * p_root->childnum);
- p_root->p_child[p_root->childnum - 1] = p_child;
- p_child->p_otec = NULL;
- }
- void key_tri_calc_absolutne(TRACK_INFO * p_track, QUAT * p_puvodni)
- {
- QUAT q(0, 0, 0, 1);
- word i;
- if (p_track->rot_keys) {
- if (!p_track->p_at) {
- p_track->p_at =
- (QUAT *) mmalloc(sizeof(p_track->p_at[0]) * p_track->rot_keys);
- }
- key_rotkey_to_quat(p_track->p_rot, p_track->p_at);
- for (i = 1; i < p_track->rot_keys; i++) {
- quat_mult(key_rotkey_to_quat(p_track->p_rot + i, &q),
- p_track->p_at + (i - 1), p_track->p_at + i);
- }
- }
- }
- void key_sim_calc_absolutne(SIMPLE_TRACK_INFO * p_sim)
- {
- QUAT q(0, 0, 0, 1), qz;
- int i, il;
- if (p_sim->p_at) {
- for (i = 0; i < p_sim->keynum; i++) {
- if (p_sim->p_at[i].x != FLT_MAX)
- break;
- }
- angle_to_quat(&qz, (BOD *) (&p_sim->p_at[i].x), p_sim->p_at[i].w);
- p_sim->p_at[i] = qz;
- il = i;
- for (i++; i < p_sim->keynum; i++) {
- if (p_sim->p_at[i].x != FLT_MAX) {
- angle_to_quat(&qz, (BOD *) & (p_sim->p_at[i].x), p_sim->p_at[i].w);
- quat_mult(&qz, p_sim->p_at + il, p_sim->p_at + i);
- il = i;
- }
- }
- }
- }
- /*
- 0. Key_frame prevest na matice
- 1. Vynasobit word matrix
- 2. Prevest zpet
-
- BOD *p_pos, QUAT *p_q, BOD *p_scs
- */
- // cilovy kontejner - kopie tracku
- static void key_tri_to_tri_indir(EDIT_KONTEJNER * p_kont,
- HIERARCHY_TRACK_INFO * p_cil,
- HIERARCHY_TRACK_INFO * p_src, HIERARCHY_TRACK_INFO * p_otec)
- {
- int i;
- p_cil->childnum = p_src->childnum;
- p_cil->endtime = p_src->endtime;
- p_cil->objnum = p_src->objnum;
- p_cil->parentnum = p_src->parentnum;
- p_cil->pivot = p_src->pivot;
- p_cil->p_obj = p_kont->p_obj[p_src->objnum];
- p_cil->p_otec = p_otec;
- p_cil->p_m = &p_kont->p_obj[p_src->objnum]->m;
- if (p_cil->pos_keys) {
- memcpy(p_cil->p_pkeys, p_src->p_pkeys,
- sizeof(p_src->p_pkeys[0]) * p_cil->pos_keys);
- memcpy(p_cil->p_pos, p_src->p_pos,
- sizeof(p_src->p_pos[0]) * p_cil->pos_keys);
- }
- if (p_cil->scs_keys) {
- memcpy(p_cil->p_scale, p_src->p_scale,
- sizeof(p_src->p_scale[0]) * p_cil->scs_keys);
- }
- if (p_cil->rot_keys) {
- memcpy(p_cil->p_rkeys, p_src->p_rkeys,
- sizeof(p_src->p_rkeys[0]) * p_cil->rot_keys);
- memcpy(p_cil->p_at, p_src->p_at,
- sizeof(p_src->p_at[0]) * p_cil->rot_keys);
- }
- p_cil->p_child =
- (HIERARCHY_TRACK_INFO **) mmalloc(sizeof(p_cil->p_child[0]) *
- p_src->childnum);
- for (i = 0; i < p_src->childnum; i++) {
- p_cil->p_child[i] =
- key_tri_vyrob(p_src->p_child[i]->pos_keys, p_src->p_child[i]->rot_keys,
- p_src->p_child[i]->scs_keys);
- key_tri_to_tri_indir(p_kont, p_cil->p_child[i], p_src->p_child[i], p_cil);
- }
- }
- void key_root_to_root_indir(EDIT_KONTEJNER * p_kont, HIERARCHY_ROOT * p_cil,
- HIERARCHY_ROOT * p_src)
- {
- int i;
- *p_cil = *p_src;
- p_cil->p_child =
- (HIERARCHY_TRACK_INFO **) mmalloc(sizeof(p_cil->p_child[0]) *
- p_src->childnum);
- for (i = 0; i < p_src->childnum; i++) {
- p_cil->p_child[i] =
- key_tri_vyrob(p_src->p_child[i]->pos_keys, p_src->p_child[i]->rot_keys,
- p_src->p_child[i]->scs_keys);
- key_tri_to_tri_indir(p_kont, p_cil->p_child[i], p_src->p_child[i], NULL);
- }
- }
- /* kopie sim-animaci
- */
- /*
- typedef struct _SIMPLE_TRACK_INFO {
-
- int Objekt_ID; // id objektu ke kteremu animace patri
- dword flag;
-
- int keynum; // pocet klicu
- BOD *p_pos; // Mesh position keys
- BOD *p_scale; // Mesh scaling keys
- QUAT *p_at; // Absolutni traky
- BOD pivot; // pivot point animace -> kopiruje se do objektu
- BOD pivot3ds; // pivot 3ds animace
- GLMATRIX *p_m; // kam to hazet
-
- int childnum; // pocet svistich traku
- struct _SIMPLE_TRACK_INFO *p_child; // svisti traky
- struct _SIMPLE_TRACK_INFO *p_otec; // otcovy traky
-
- } SIMPLE_TRACK_INFO;
- */
- // Kopie sim-animaci
- void key_sim_root_to_sim_root_indir(EDIT_KONTEJNER * p_kont,
- HIERARCHY_SIM * p_cil, HIERARCHY_SIM * p_src)
- {
- int i;
- *p_cil = *p_src;
- p_cil->p_child =
- (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_cil->p_child[0]) *
- p_src->childnum);
- for (i = 0; i < p_src->childnum; i++) {
- key_sim_to_sim_indir(p_cil->p_child + i, p_src->p_child + i);
- }
- key_sim_dopln_matrix_kont(p_kont, p_cil);
- }
- static void key_sim_dopln_matrix_kont_rec(EDIT_KONTEJNER * p_kont,
- SIMPLE_TRACK_INFO * p_sim)
- {
- EDIT_OBJEKT *p_obj;
- int i;
- p_obj = lo_najdi_objekt_kont_poiter_ID(p_kont, p_sim->Objekt_ID);
- if (p_obj) {
- p_sim->p_m = &p_obj->m;
- p_sim->p_object_norm = &p_obj->float_scale;
- }
- else {
- p_sim->p_m = NULL;
- p_sim->p_object_norm = NULL;
- }
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_dopln_matrix_kont_rec(p_kont, p_sim->p_child + i);
- }
- }
- // Doplni matice
- void key_sim_dopln_matrix_kont(EDIT_KONTEJNER * p_kont, HIERARCHY_SIM * p_src)
- {
- int i;
- for (i = 0; i < p_src->childnum; i++) {
- key_sim_dopln_matrix_kont_rec(p_kont, p_src->p_child + i);
- }
- }
- static void key_sim_dopln_matrix_mesh_rec(GAME_MESH_OLD * p_mesh,
- SIMPLE_TRACK_INFO * p_sim)
- {
- int i;
- for (i = 0; i < p_mesh->objektu; i++) {
- if (p_mesh->p_Objekt_ID[i] == p_sim->Objekt_ID) {
- p_sim->p_m = p_mesh->p_key + i;
- p_sim->p_obb_local = p_mesh->p_obb_local + i;
- p_sim->p_obb_world = p_mesh->p_obb_world + i;
- p_sim->p_object_norm =
- p_mesh->p_normal_scale ? p_mesh->p_normal_scale + i : NULL;
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_dopln_matrix_mesh_rec(p_mesh, p_sim->p_child + i);
- }
- return;
- }
- }
- // fuck-ati
- }
- void key_sim_dopln_matrix_mesh(GAME_MESH_OLD * p_mesh,
- SIMPLE_TRACK_INFO * p_sim)
- {
- int i;
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_dopln_matrix_mesh_rec(p_mesh, p_sim->p_child + i);
- }
- }
- /*
- typedef struct _HIERARCHY_SIM {
-
- float delka; // delka casu animace (fps)
- byte stav; // 0 = stop, 1 = run
-
- int flag; // flagy animace (GL_LOOP,GL_REMOVE)
- dword time; // aktualni cas animace
- dword time_start; // aktualni start
- dword time_stop; // aktualni stop
- dword time_delka; // aktualni delka animace
-
- dword start;
- dword stop;
-
- int keynum; // pocet klicu
- char jmeno[MAX_JMENO]; // jmeno animace
- int childnum; // pocet detskych traku
- SIMPLE_TRACK_INFO *p_child;
- } HIERARCHY_SIM;
- */
- /* Rekurzivni extra-interpolator
- */
- static void key_root_to_sim_indir_rec(EDIT_KONTEJNER * p_kont,
- SIMPLE_TRACK_INFO * p_sim, HIERARCHY_TRACK_INFO * p_root, int loop,
- int float_scale)
- {
- /* Kopie puvodnich traku
- */
- key_tri_to_sim_indir(p_root, p_sim, loop, float_scale);
- p_sim->p_m = &p_kont->p_obj[p_root->objnum]->m;
- p_sim->Objekt_ID = p_kont->p_obj[p_root->objnum]->Objekt_ID;
- p_sim->pivot = p_root->pivot_sim;
- /* Vytvoreni stromu
- */
- if (p_root->childnum) {
- int i;
- p_sim->childnum = p_root->childnum;
- p_sim->p_child =
- (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_sim->p_child[0]) *
- p_root->childnum);
- for (i = 0; i < p_sim->childnum; i++) {
- p_sim->p_child[i].p_otec = p_sim;
- key_root_to_sim_indir_rec(p_kont, p_sim->p_child + i,
- p_root->p_child[i], loop, float_scale);
- }
- }
- }
- /* Prevod root - stromu do simple animacniho stromu
- */
- void key_root_to_sim_indir(EDIT_KONTEJNER * p_kont, HIERARCHY_SIM * p_sim,
- HIERARCHY_ROOT * p_root, int float_scale)
- {
- int i;
- if (!p_root->childnum)
- return;
- strcpy(p_sim->jmeno, p_root->jmeno);
- p_sim->childnum = p_root->childnum;
- p_sim->keynum = p_root->framenum;
- p_sim->p_child =
- (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_sim->p_child[0]) *
- p_root->childnum);
- for (i = 0; i < p_sim->childnum; i++) {
- key_root_to_sim_indir_rec(p_kont, p_sim->p_child + i, p_root->p_child[i],
- p_root->flag & GK_LOOP, float_scale);
- }
- key_sim_dopln_matrix_kont(p_kont, p_sim);
- }
- /* Reanimuje kontejner word-matrix - vkladat akt_animace
- */
- void key_kontejner_reanimuj(EDIT_KONTEJNER * p_kont, HIERARCHY_ROOT * p_root)
- {
- if (p_kont->kflag & KONT_KEYFRAME && p_root->framenum) {
- key_root_to_matrix(p_root, 0, kont_world_matrix(p_kont));
- }
- }
- void key_kontejner_sim_reanimuj(EDIT_KONTEJNER * p_kont)
- {
- if (p_kont->kflag & KONT_KEYFRAME
- && p_kont->sim[p_kont->akt_animace].keynum) {
- key_sim_root_to_matrix(p_kont, p_kont->sim + p_kont->akt_animace, 0,
- kont_world_matrix(p_kont));
- }
- }
- void key_kontejner_sim_reanimuj_pivoty(EDIT_KONTEJNER * p_kont)
- {
- HIERARCHY_SIM *p_sim;
- GLMATRIX m;
- int i;
- init_matrix(&m);
- if (p_kont->kflag & KONT_KEYFRAME) {
- p_sim = p_kont->sim + p_kont->akt_animace;
- if (p_sim->keynum) {
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_animuj_strom_pivoty(p_sim->p_child + i, 0, &m);
- }
- }
- }
- }
- void key_kontejner_retransformuj(EDIT_KONTEJNER * p_kont_top)
- {
- EDIT_KONTEJNER *p_kont = p_kont_top;
- EDIT_OBJEKT *p_obj;
- int o;
- while (p_kont) {
- if (p_kont->kflag & KONT_KEYFRAME) {
- for (o = 0; o < MAX_KONT_OBJEKTU; o++) {
- p_obj = p_kont->p_obj[o];
- if (p_obj) {
- transformuj_objekt_matici(p_obj, &p_obj->m);
- init_matrix(&p_obj->m);
- }
- }
- }
- p_kont = p_kont->p_next;
- }
- }
- void key_mesh_reanimuj(GAME_MESH_OLD * p_mesh, int time, GLMATRIX * p_top)
- {
- SIMPLE_TRACK_INFO *p_sim = p_mesh->p_sim_aktivni;
- int i;
- assert(p_mesh->p_data->kflag & KONT_KEYFRAME);
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_animuj_strom(p_sim->p_child + i, time, p_top);
- }
- // Transformace obalky meshe
- obb_transformuj(&p_mesh->obb_local, p_top, &p_mesh->obb_world);
- key_mesh_recalc_normal_anim(p_mesh);
- }
- /****************************************************************************
- Simple-track animace
- ****************************************************************************
- */
- /* kopie sim->sim
- */
- void key_sim_to_sim_indir(SIMPLE_TRACK_INFO * p_dest,
- SIMPLE_TRACK_INFO * p_src)
- {
- int i;
- *p_dest = *p_src;
- // kopie pozicnich klicu
- if (p_src->p_pos) {
- p_dest->p_pos =
- (BOD *) kopiruj_pole(p_src->p_pos,
- sizeof(p_src->p_pos[0]) * p_src->keynum);
- }
- // kopie rotacnich klicu
- if (p_src->p_at) {
- p_dest->p_at =
- (QUAT *) kopiruj_pole(p_src->p_at,
- sizeof(p_src->p_at[0]) * p_src->keynum);
- }
- // kopie scale klicu
- if (p_src->p_scale) {
- p_dest->p_scale =
- (BOD *) kopiruj_pole(p_src->p_scale,
- sizeof(p_src->p_scale[0]) * p_src->keynum);
- }
- // Kopie zero-matic
- if (p_src->p_all_matrix) {
- p_dest->p_all_matrix =
- (GLMATRIX *) kopiruj_pole(p_src->p_all_matrix,
- sizeof(p_src->p_all_matrix[0]));
- }
- if (p_dest->childnum) {
- p_dest->p_child =
- (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_dest->p_child[0]) *
- p_dest->childnum);
- for (i = 0; i < p_dest->childnum; i++) {
- key_sim_to_sim_indir(p_dest->p_child + i, p_src->p_child + i);
- }
- }
- }
- /* Rekurzivne animuje animacni strom
- */
- void key_sim_animuj_strom(SIMPLE_TRACK_INFO * p_sim, int time,
- GLMATRIX * p_otec)
- {
- OBB_OLD *p_src, *p_dest;
- GLMATRIX m, *p_top = p_otec;
- int i;
- // animuj hierarchii
- if (p_sim->p_m) {
- p_top =
- mat_mult_dir(key_sim_to_matrix(p_sim, time, &m), p_otec, p_sim->p_m);
- p_src = p_sim->p_obb_local;
- p_dest = p_sim->p_obb_world;
- if (p_src && p_dest) {
- obb_transformuj(p_src, p_top, p_dest);
- }
- }
- // rozmazni i decka
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_animuj_strom(p_sim->p_child + i, time, p_top);
- }
- }
- void key_sim_animuj_strom_pivoty(SIMPLE_TRACK_INFO * p_sim, int time,
- GLMATRIX * p_otec)
- {
- GLMATRIX m, m1, *p_top = p_otec;
- int i;
- // animuj hierarchii
- if (p_sim->p_at || p_sim->p_pos || p_sim->p_scale) {
- p_top = mat_mult(key_sim_to_matrix(p_sim, time, &m), p_otec, &m1);
- }
- else {
- p_top = p_otec;
- }
- // Transformuje akt. pivot
- invert_matrix_copy(p_top, &m);
- transformuj_bod_bod_matici(&p_sim->pivot, &m);
- // rozmazni i decka
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_animuj_strom_pivoty(p_sim->p_child + i, time, p_top);
- }
- }
- /*------------------------------------------------------------------
- Simple animace
- ------------------------------------------------------------------
- */
- /* Prevede tri do simple tracku
- */
- SIMPLE_TRACK_INFO *key_tri_to_sim_indir(HIERARCHY_TRACK_INFO * p_track,
- SIMPLE_TRACK_INFO * p_sim, int loop, int float_scale)
- {
- int i, endtime;
- // prevedu hlavni track
- memset(p_sim, 0, sizeof(SIMPLE_TRACK_INFO));
- p_sim->keynum = calc_keynum(p_track->endtime);
- endtime = p_track->endtime;
- /* Kopie pozicnich klicu
- */
- if (p_track->p_pos) {
- p_sim->p_pos = (BOD *) mmalloc(sizeof(p_sim->p_pos[0]) * p_sim->keynum);
- for (i = 0; i < p_sim->keynum; i++)
- key_track_interpolace_bod(p_sim->p_pos + i, p_track->p_pos,
- p_track->p_pkeys, i * SIM_KONSTI, endtime, p_track->pos_keys, loop);
- }
- /* Kopie rotacnich klicu
- */
- if (p_track->p_at) {
- p_sim->p_at = (QUAT *) mmalloc(sizeof(p_sim->p_at[0]) * p_sim->keynum);
- p_sim->pivot3ds = p_track->pivot;
- key_track_quat_zkontroluj(p_track->p_at, p_track->rot_keys);
- for (i = 0; i < p_sim->keynum; i++)
- key_track_interpolace_quat(p_sim->p_at + i, p_track->p_at,
- p_track->p_rkeys, i * SIM_KONSTI, endtime, p_track->rot_keys, loop);
- }
- /* Kopie scale klicu
- */
- if (p_track->p_scale) {
- if (float_scale) {
- BOD s;
- p_sim->p_norm =
- (float *) mmalloc(sizeof(p_sim->p_norm[0]) * p_sim->keynum);
- for (i = 0; i < p_sim->keynum; i++) {
- key_track_interpolace_bod(&s, p_track->p_scale, p_track->p_skeys,
- i * SIM_KONSTI, endtime, p_track->scs_keys, loop);
- p_sim->p_norm[i] = s.x;
- }
- }
- else {
- p_sim->p_scale =
- (BOD *) mmalloc(sizeof(p_sim->p_scale[0]) * p_sim->keynum);
- for (i = 0; i < p_sim->keynum; i++)
- key_track_interpolace_bod(p_sim->p_scale + i, p_track->p_scale,
- p_track->p_skeys, i * SIM_KONSTI, endtime, p_track->scs_keys, loop);
- }
- }
- return (p_sim);
- }
- /* Prevede tri linearne do simple tracku
- */
- SIMPLE_TRACK_INFO *key_tri_to_sim_indir_lin(HIERARCHY_TRACK_INFO * p_track,
- SIMPLE_TRACK_INFO * p_sim, int loop)
- {
- int i, keynum, endtime;
- // prevedu hlavni track
- memset(p_sim, 0, sizeof(SIMPLE_TRACK_INFO));
- keynum = p_sim->keynum = calc_keynum(p_track->endtime);
- keynum--;
- endtime = p_track->endtime;
- /* Kopie pozicnich klicu
- */
- if (p_track->p_pos) {
- p_sim->p_pos = (BOD *) mmalloc(sizeof(p_sim->p_pos[0]) * p_sim->keynum);
- for (i = 0; i < p_sim->keynum; i++)
- key_track_interpolace_bod_linear(p_sim->p_pos + i, p_track->p_pos,
- p_track->p_pkeys, i * SIM_KONSTI, endtime, p_track->pos_keys, loop);
- }
- /* Kopie rotacnich klicu
- */
- if (p_track->p_at) {
- p_sim->p_at = (QUAT *) mmalloc(sizeof(p_sim->p_at[0]) * p_sim->keynum);
- p_sim->pivot3ds = p_track->pivot;
- key_track_quat_zkontroluj(p_track->p_at, p_track->rot_keys);
- for (i = 0; i < p_sim->keynum; i++)
- key_track_interpolace_quat_linear(p_sim->p_at + i, p_track->p_at,
- p_track->p_rkeys, i * SIM_KONSTI, endtime, p_track->rot_keys, loop);
- }
- /* Kopie scale klicu
- */
- if (p_track->p_scale) {
- p_sim->p_scale =
- (BOD *) mmalloc(sizeof(p_sim->p_scale[0]) * p_sim->keynum);
- for (i = 0; i < p_sim->keynum; i++)
- key_track_interpolace_bod_linear(p_sim->p_scale + i, p_track->p_scale,
- p_track->p_skeys, i * SIM_KONSTI, endtime, p_track->scs_keys, loop);
- }
- return (p_sim);
- }
- void key_sim_zrus_vnitrek(SIMPLE_TRACK_INFO * p_sim)
- {
- null_free((void **) &p_sim->p_pos);
- null_free((void **) &p_sim->p_at);
- null_free((void **) &p_sim->p_scale);
- null_free((void **) &p_sim->p_all_matrix);
- }
- // Zrusi animacni strom sim animaci
- void key_sim_zrus(SIMPLE_TRACK_INFO * p_sim)
- {
- int i;
- if (p_sim->p_child) {
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_zrus(p_sim->p_child + i);
- }
- free(p_sim->p_child);
- }
- key_sim_zrus_vnitrek(p_sim);
- }
- void key_sim_root_zrus(HIERARCHY_SIM * p_sim)
- {
- int i;
- if (p_sim->p_child) {
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_zrus(p_sim->p_child + i);
- }
- free(p_sim->p_child);
- }
- memset(p_sim, 0, sizeof(p_sim[0]));
- }
- // ulozi simple animaci jako text-file
- /*
- C 20 // (pocet framu zacinajici od 0)
- V 0 0 0 // pivot point
- F 0 // Pro kazdy frame jeho cislo
- P 0 2 3 // relativni posun x,y,z
- R 0 0 0 0 // relativni rotace x,y,z + uhel
- S 0 0 0 // relativni scale x y z
- T 0 // tension
- O 0 // continuity
- B 0 // bias
- L 0 0 0 // tension/continuity/bias
- */
- void key_sim_uloz(SIMPLE_TRACK_INFO * p_sim, char *p_file, char *p_dir)
- {
- BOD b;
- float uhel;
- FILE *f;
- int i;
- int loop = p_sim->flag & GK_LOOP;
- chdir((p_dir));
- if (!(f = fopen(p_file, "w"))) {
- ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
- __LINE__, p_file, p_dir);
- return;
- }
- fprintf(f, "C %d\n", p_sim->keynum);
- if (loop)
- fputs("N\n", f);
- fprintf(f, "M %f %f %f", p_sim->pivot3ds.x, p_sim->pivot3ds.y,
- p_sim->pivot3ds.z);
- fprintf(f, "O %f %f %f", p_sim->pivot.x, p_sim->pivot.y, p_sim->pivot.z);
- for (i = 0; i < p_sim->keynum; i++) {
- fprintf(f, "F %d\n", i);
- fprintf(f, "P %f %f %f\n", p_sim->p_pos[i].x, p_sim->p_pos[i].y,
- p_sim->p_pos[i].z);
- quat_to_angle(p_sim->p_at + i, &b, &uhel);
- uhel = (uhel / PI) * 180.0f;
- fprintf(f, "R %f %f %f %f\n", b.x, b.y, b.z, uhel);
- fprintf(f, "S %f %f %f\n", p_sim->p_scale[i].x, p_sim->p_scale[i].y,
- p_sim->p_scale[i].z);
- }
- fclose(f);
- }
- // load sim z text-file
- int key_sim_nahraj(APAK_HANDLE * pHandle, SIMPLE_TRACK_INFO * p_sim,
- char *p_file, char *p_dir, int linear)
- {
- HIERARCHY_TRACK_INFO track; // load jako hierarchie -> prevedu do simple tracku
- KEY_POINT_BRS *p_spline = NULL;
- char line[1000], *p_pom;
- KFILE *f;
- int p, r, s, fr, loop = 0;
- BOD pivot(0.0f, 0.0f, 0.0f);
- BOD osa;
- float uhel;
- char **p_line;
- int l, lmax;
- chdir((p_dir));
- if (!(f = kopen(pHandle, p_file, "r"))) {
- kprintf(TRUE, "File %s Line %d Chyba otevreni souboru '%s' v %s",
- __FILE__, __LINE__, p_file, (p_dir));
- return (FALSE);
- }
- else {
- kprintf(TRUE, "Nahravam animaci z %s...", p_file);
- }
- p_line = (char **) mmalloc(sizeof(p_line[0]) * MAX_SIM_RADKU);
- l = 0;
- while (kgets(line, 999, f)) {
- assert(l < MAX_SIM_RADKU);
- if (line[0] && line[0] != '\n' && line[0] != ';') {
- p_line[l] =
- (char *) kopiruj_pole(line, sizeof(char) * (strlen(line) + 1));
- l++;
- }
- }
- kclose(f);
- lmax = l;
- p = r = s = 0;
- for (l = 0; l < lmax; l++) {
- p_pom = p_line[l];
- switch (toupper(p_pom[0])) {
- case 'P': // posun
- p++;
- break;
- case 'R': // rotace
- r++;
- break;
- case 'S': // scale
- s++;
- break;
- default:
- break;
- }
- }
- key_tri_vyrob_indir(&track, p, r, s);
- p = r = s = fr = 0;
- for (l = 0; l < lmax; l++) {
- p_pom = p_line[l];
- switch (toupper(p_pom[0])) {
- case 'F': // frame
- sscanf(p_pom + 1, "%d", &fr);
- break;
- case 'P': // posun
- track.p_pkeys[p].time = fr * SIM_KONSTI;
- p_spline = track.p_pkeys + p;
- sscanf(p_pom + 1, "%f %f %f", &track.p_pos[p].x, &track.p_pos[p].y,
- &track.p_pos[p].z);
- p++;
- break;
- case 'R': // rotace
- track.p_rkeys[r].time = fr * SIM_KONSTI;
- p_spline = track.p_rkeys + r;
- sscanf(p_pom + 1, "%f %f %f %f", &osa.x, &osa.y, &osa.z, &uhel);
- /* Korekce zaporneho uhlu
- */
- if (uhel < 0.0f) {
- uhel = -uhel;
- osa.x = -osa.x;
- osa.y = -osa.y;
- osa.z = -osa.z;
- }
- uhel = DEG2RAD(uhel);
- angle_to_quat(track.p_at + r, &osa, uhel);
- r++;
- break;
- case 'S': // scale
- track.p_skeys[s].time = fr * SIM_KONSTI;
- p_spline = track.p_skeys + s;
- sscanf(p_pom + 1, "%f %f %f", &track.p_scale[s].x,
- &track.p_scale[s].y, &track.p_scale[s].z);
- s++;
- break;
- case 'L':
- if (p_spline) {
- sscanf(p_pom + 1, "%f %f %f", &p_spline->tension,
- &p_spline->continuity, &p_spline->bias);
- }
- break;
- case 'T':
- if (p_spline) {
- sscanf(p_pom + 1, "%f", &p_spline->tension);
- }
- break;
- case 'O':
- if (p_spline) {
- sscanf(p_pom + 1, "%f", &p_spline->continuity);
- }
- break;
- case 'B':
- if (p_spline) {
- sscanf(p_pom + 1, "%f", &p_spline->bias);
- }
- break;
- case 'C': // celkem framu
- sscanf(p_pom + 1, "%d", &track.endtime);
- track.endtime = calc_endtime(track.endtime);
- break;
- case 'N': // loop animace
- loop = TRUE;
- break;
- case 'V': // pivot
- sscanf(p_pom + 1, "%f %f %f", &pivot.x, &pivot.y, &pivot.z);
- break;
- case 'M': // 3ds pivot
- sscanf(p_pom + 1, "%f %f %f", &track.pivot.x, &track.pivot.y,
- &track.pivot.z);
- break;
- case 'Q':
- linear = TRUE;
- break;
- case 'W':
- linear = FALSE;
- break;
- default:
- break;
- }
- }
- for (l = 0; l < lmax; l++) {
- free(p_line[l]);
- }
- free(p_line);
- if (linear) {
- key_tri_to_sim_indir_lin(&track, p_sim, loop);
- }
- else {
- key_tri_to_sim_indir(&track, p_sim, loop, FALSE);
- }
- zrus_tri_vnitrek(&track);
- p_sim->pivot = pivot; // dokopiruj standartni pivot
- return (TRUE);
- }
- // rozsirene sim-animace load
- int key_sim_nahraj_extended(EDIT_KONTEJNER * p_kont, int cislo_anim,
- char *p_file, char *p_dir)
- {
- HIERARCHY_TRACK_INFO **p_track_list;
- HIERARCHY_TRACK_INFO *p_track;
- HIERARCHY_ROOT root;
- int akt_track;
- KEY_POINT_BRS *p_spline = NULL;
- char pom[1000];
- char pom1[1000];
- FILE *f;
- int p, r, s, fr, loop = 0, framu;
- BOD pivot(0.0f, 0.0f, 0.0f);
- BOD osa;
- float uhel;
- int i, objektu = 0, stop, ob, end, float_scale = FALSE;
- chdir((p_dir));
- if (!(f = fopen(p_file, "r"))) {
- ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
- __LINE__, p_file, (p_dir));
- return (FALSE);
- }
- kprintf(TRUE, "Nahravam animaci z %s...", p_file);
- while (fgets(pom, 999, f)) {
- fgets_korekce(pom);
- if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
- switch (toupper(pom[0])) {
- case 'C': // celkem framu
- sscanf(pom + 1, "%d", &framu);
- break;
- case 'X':
- switch (toupper(pom[1])) {
- case 'O': // vlastnik
- objektu++;
- break;
- case 'P': // otec
- break;
- }
- break;
- default:
- break;
- }
- }
- }
- if (!objektu)
- objektu = 1;
- p_track_list =
- (HIERARCHY_TRACK_INFO **) alloca(sizeof(p_track_list[0]) * objektu);
- akt_track = 0;
- stop = 0;
- do {
- p_track = p_track_list[akt_track++] =
- (HIERARCHY_TRACK_INFO *) alloca(sizeof(p_track[0]));
- memset(p_track, 0, sizeof(p_track[0]));
- /* reset pivot-pointu
- */
- pivot.x = pivot.y = pivot.z = FLT_MAX;
- /* Nactu jmena objektu
- */
- fseek(f, stop, SEEK_SET);
- while (fgets(pom, 999, f)) {
- fgets_korekce(pom);
- if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
- if (toupper(pom[0]) == 'X' && toupper(pom[1]) == 'O') {
- strcpy(p_track->jmeno, cti_za_znak(pom + 2, ' '));
- continue;
- }
- if (toupper(pom[0]) == 'X' && toupper(pom[1]) == 'P') {
- strcpy(p_track->jmeno_otec, cti_za_znak(pom + 2, ' '));
- continue;
- }
- if (toupper(pom[0]) == 'V') {
- sscanf(pom + 1, "%f %f %f", &pivot.x, &pivot.y, &pivot.z);
- break;
- }
- if (toupper(pom[0]) == 'F') {
- sscanf(pom + 1, "%d", &fr);
- break;
- }
- }
- }
- /* Nactu pozici za jmenama objektu
- */
- stop = ftell(f);
- /* Nactu pocty klicu
- */
- p = r = s = 0;
- while (fgets(pom, 999, f)) {
- fgets_korekce(pom);
- if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
- if (toupper(pom[0]) == 'X') {
- break;
- }
- if (toupper(pom[0]) == 'P') {
- p++;
- continue;
- }
- if (toupper(pom[0]) == 'R') {
- r++;
- continue;
- }
- if (toupper(pom[0]) == 'S' || toupper(pom[0]) == 'U') {
- s++;
- continue;
- }
- }
- }
- /* Vyrobim animaci podle poctu klicu
- */
- strcpy(pom, p_track->jmeno);
- strcpy(pom1, p_track->jmeno_otec);
- key_tri_vyrob_indir(p_track, p, r, s);
- strcpy(p_track->jmeno, pom);
- strcpy(p_track->jmeno_otec, pom1);
- p = r = s = 0;
- // fame zbylo zposledniho klice
- /* Vratim se za prvni frame a ctu klice
- */
- fseek(f, stop, SEEK_SET);
- while ((end = (int) fgets(pom, 999, f))) {
- fgets_korekce(pom);
- if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
- /* Test - je dalsi objekt?
- */
- if (toupper(pom[0]) != 'X')
- stop = ftell(f);
- else
- break;
- /* neni - cti klice animace
- */
- switch (toupper(pom[0])) {
- case 'F': // frame
- sscanf(pom + 1, "%d", &fr);
- break;
- case 'P': // posun
- p_track->p_pkeys[p].time = fr * SIM_KONSTI;
- p_spline = p_track->p_pkeys + p;
- sscanf(pom + 1, "%f %f %f", &p_track->p_pos[p].x,
- &p_track->p_pos[p].y, &p_track->p_pos[p].z);
- p++;
- break;
- case 'R': // rotace
- p_track->p_rkeys[r].time = fr * SIM_KONSTI;
- p_spline = p_track->p_rkeys + r;
- sscanf(pom + 1, "%f %f %f %f", &osa.x, &osa.y, &osa.z, &uhel);
- /* Korekce zaporneho uhlu
- */
- if (uhel < 0.0f) {
- uhel = -uhel;
- osa.x = -osa.x;
- osa.y = -osa.y;
- osa.z = -osa.z;
- }
- uhel = DEG2RAD(uhel);
- angle_to_quat(p_track->p_at + r, &osa, uhel);
- r++;
- break;
- case 'S': // scale
- p_track->p_skeys[s].time = fr * SIM_KONSTI;
- p_spline = p_track->p_skeys + s;
- sscanf(pom + 1, "%f %f %f", &p_track->p_scale[s].x,
- &p_track->p_scale[s].y, &p_track->p_scale[s].z);
- s++;
- break;
- case 'U': // scale
- p_track->p_skeys[s].time = fr * SIM_KONSTI;
- p_spline = p_track->p_skeys + s;
- sscanf(pom + 1, "%f", &p_track->p_scale[s].x);
- p_track->p_scale[s].y = p_track->p_scale[s].z = 0.0f;
- float_scale = TRUE;
- s++;
- break;
- case 'L':
- if (p_spline) {
- sscanf(pom + 1, "%f %f %f", &p_spline->tension,
- &p_spline->continuity, &p_spline->bias);
- }
- break;
- case 'T':
- if (p_spline) {
- sscanf(pom + 1, "%f", &p_spline->tension);
- }
- break;
- case 'O':
- if (p_spline) {
- sscanf(pom + 1, "%f", &p_spline->continuity);
- }
- break;
- case 'B':
- if (p_spline) {
- sscanf(pom + 1, "%f", &p_spline->bias);
- }
- break;
- case 'N': // loop animace
- loop = TRUE;
- break;
- case 'V': // pivot
- sscanf(pom + 1, "%f %f %f", &pivot.x, &pivot.y, &pivot.z);
- break;
- case 'M': // 3ds pivot
- sscanf(pom + 1, "%f %f %f", &p_track->pivot.x, &p_track->pivot.y,
- &p_track->pivot.z);
- break;
- default:
- break;
- }
- }
- }
- p_track->pivot_sim = pivot;
- } while (end);
- fclose(f);
- assert(akt_track == objektu);
- /* Navazani animace na kontejner
- */
- memset(&root, 0, sizeof(root));
- for (i = 0; i < objektu; i++) {
- p_track = p_track_list[i];
- ob = p_track->objnum = lo_najdi_objekt_kont(p_kont, p_track->jmeno);
- if (ob == K_CHYBA) {
- kprintf(TRUE, "!!!! Nenalezen objekt '%s' v kontejneru '%s'",
- p_track->jmeno, p_kont->jmeno);
- continue;
- }
- else {
- kprintf(TRUE, "Objekt %s OK", p_track->jmeno);
- }
- p_track->p_obj = p_kont->p_obj[ob];
- if (p_track->pivot_sim.x != FLT_MAX &&
- p_track->pivot_sim.y != FLT_MAX && p_track->pivot_sim.z != FLT_MAX) {
- p_kont->p_obj[ob]->pivot = p_track->pivot_sim;
- }
- p_track->parentnum = lo_najdi_objekt_kont(p_kont, p_track->jmeno_otec);
- if (p_track->parentnum == K_CHYBA)
- p_track->parentnum = ROOT_NODE;
- key_konec_prochazeni = FALSE;
- key_root_node_pridej(&root, p_track);
- p_track->endtime = calc_endtime(framu);
- }
- root.framenum = framu;
- kprintf(TRUE, "Framu animace %d", framu);
- if (loop) {
- kprintf(TRUE, "Loop animace");
- root.flag |= GK_LOOP;
- }
- /* Prevod do sim-animaci
- */
- key_root_to_sim_indir(p_kont, p_kont->sim + cislo_anim, &root, float_scale);
- p_kont->kflag |=
- (float_scale) ? KONT_NORMAL_ANIM | KONT_KEYFRAME : KONT_KEYFRAME;
- p_kont->kflag &= ~KONT_STATIC;
- return (TRUE);
- }
- // aplikuje siple track do matrice
- GLMATRIX *key_sim_to_matrix(SIMPLE_TRACK_INFO * p_sim, int time,
- GLMATRIX * p_m)
- {
- float frame, t, t1;
- BOD *p1, *p2;
- QUAT q;
- int kn, lasttime;
- if (p_sim->p_all_matrix) {
- *p_m = *p_sim->p_all_matrix;
- }
- else {
- init_matrix(p_m);
- lasttime = (p_sim->keynum - 1) * SIM_KONSTI;
- if (time < lasttime) {
- t = (float) time / SIM_KONST;
- frame = (float) floor((float) t);
- t -= frame;
- kn = ftoi(frame);
- t1 = 1.0f - t;
- if (p_sim->p_pos) {
- p1 = p_sim->p_pos + kn;
- p2 = p_sim->p_pos + kn + 1;
- p_m->_41 = p1->x * t1 + p2->x * t;
- p_m->_42 = p1->y * t1 + p2->y * t;
- p_m->_43 = p1->z * t1 + p2->z * t;
- }
- if (p_sim->p_at) {
- quat_to_matrix(p_m, slerp(p_sim->p_at + kn, p_sim->p_at + kn + 1, t,
- &q));
- }
- if (p_sim->p_scale) {
- p1 = p_sim->p_scale + kn;
- p2 = p_sim->p_scale + kn + 1;
- scale_matrix(p_m, p1->x * t1 + p2->x * t, p1->y * t1 + p2->y * t,
- p1->z * t1 + p2->z * t);
- }
- if (p_sim->p_norm) {
- *p_sim->p_object_norm =
- p_sim->p_norm[kn] * t1 + p_sim->p_norm[kn + 1] * t;
- }
- }
- else {
- kn = p_sim->keynum - 1;
- if (p_sim->p_pos) {
- p1 = (BOD *) & p_m->_41;
- *p1 = p_sim->p_pos[kn];
- }
- if (p_sim->p_at) {
- quat_to_matrix(p_m, p_sim->p_at + kn);
- }
- if (p_sim->p_scale) {
- p1 = p_sim->p_scale + kn;
- scale_matrix(p_m, p1->x, p1->y, p1->z);
- }
- if (p_sim->p_norm) {
- *p_sim->p_object_norm = p_sim->p_norm[kn];
- }
- }
- pivotuj_matrix_tam(&p_sim->pivot3ds, p_m);
- pivotuj_matrix(p_m, &p_sim->pivot);
- }
- return (p_m);
- }
- void key_sim_root_to_matrix(EDIT_KONTEJNER * p_kont, HIERARCHY_SIM * p_sim,
- int time, GLMATRIX * p_m)
- {
- int i;
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_animuj_strom(p_sim->p_child + i, time, p_m);
- }
- if (p_kont->kflag & KONT_NORMAL_ANIM) {
- key_kontejner_recalc_normal_anim(p_kont);
- }
- }
- void key_kontejner_recalc_normal_anim(EDIT_KONTEJNER * p_kont)
- {
- EDIT_OBJEKT *p_obj;
- OBJ_VERTEX *p_vertex;
- BOD n;
- float last, akt, num, i;
- // pokud se last=aktualni - nic nedelam
- int o;
- for (o = 0; o < p_kont->objektu; o++) {
- if ((p_obj = p_kont->p_obj[o])) {
- if ((last = p_obj->float_scale_last) == (akt = p_obj->float_scale))
- continue;
- p_vertex = p_obj->p_vertex;
- num = p_obj->vertexnum;
- for (i = 0; i < num; i++, p_vertex++) {
- vektor_add((BOD *) & p_vertex->x,
- vektor_mult_skalar((BOD *) & p_vertex->nx, -akt, &n),
- (BOD *) & p_vertex->px);
- }
- p_obj->float_scale_last = akt;
- }
- }
- }
- /*
- typedef struct _SIMPLE_TRACK_INFO {
-
- int Objekt_ID; // id objektu ke kteremu animace patri
- dword flag;
-
- int keynum; // pocet klicu
- BOD *p_pos; // Mesh position keys
- BOD *p_scale; // Mesh scaling keys
- QUAT *p_at; // Absolutni traky
- BOD pivot; // pivot point animace -> kopiruje se do objektu
- BOD pivot3ds; // pivot 3ds animace
- GLMATRIX *p_m; // kam to hazet
-
- int childnum; // pocet svistich traku
- struct _SIMPLE_TRACK_INFO *p_child; // svisti traky
- struct _SIMPLE_TRACK_INFO *p_otec; // otcovy traky
-
- } SIMPLE_TRACK_INFO;
- typedef struct _HIERARCHY_SIM {
-
- float delka; // delka casu animace (fps)
- char stav; // 0 = stop, 1 = run
-
- int flag; // flagy animace (GL_LOOP,GL_REMOVE)
- dword time; // aktualni cas animace
- dword time_start; // aktualni start
- dword time_stop; // aktualni stop
- dword time_delka; // aktualni delka animace
-
- dword start;
- dword stop;
-
- int keynum; // pocet klicu
- char jmeno[MAX_JMENO]; // jmeno animace
- int childnum; // pocet detskych traku
- SIMPLE_TRACK_INFO *p_child;
- } HIERARCHY_SIM;
- */
- void key_sim_root_to_sim_indir(HIERARCHY_SIM * p_root,
- SIMPLE_TRACK_INFO * p_sim)
- {
- memset(p_sim, 0, sizeof(SIMPLE_TRACK_INFO));
- p_sim->flag = p_root->flag;
- p_sim->keynum = p_root->keynum;
- p_sim->childnum = p_root->childnum;
- p_sim->p_child = p_root->p_child;
- p_sim->Objekt_ID = K_CHYBA;
- memset(p_root, 0, sizeof(p_root[0]));
- }
- // aplikuje sim do matice a bodu
- GLMATRIX *key_sim_to_matrix_param(SIMPLE_TRACK_INFO * p_sim, int time,
- GLMATRIX * p_m, BOD * p_pos, QUAT * p_quat, BOD * p_scale)
- {
- float frame, t, t1;
- BOD *p1, *p2;
- int kn;
- int lasttime;
- init_matrix(p_m);
- lasttime = (p_sim->keynum - 1) * SIM_KONSTI;
- if (time < lasttime) {
- t = (float) time / SIM_KONST;
- frame = (float) floor((float) t);
- t -= frame;
- kn = ftoi(frame);
- t1 = 1.0f - t;
- if (p_sim->p_pos) {
- p1 = p_sim->p_pos + kn;
- p2 = p_sim->p_pos + kn + 1;
- p_pos->x = p_m->_41 = p1->x * t1 + p2->x * t;
- p_pos->y = p_m->_42 = p1->y * t1 + p2->y * t;
- p_pos->z = p_m->_43 = p1->z * t1 + p2->z * t;
- }
- else {
- vektor_set(p_pos, 0);
- }
- if (p_sim->p_at) {
- quat_to_matrix(p_m, slerp(p_sim->p_at + kn, p_sim->p_at + kn + 1, t,
- p_quat));
- }
- else {
- quat_set_zero(p_quat);
- }
- if (p_sim->p_scale) {
- p1 = p_sim->p_scale + kn;
- p2 = p_sim->p_scale + kn + 1;
- p_scale->x = p1->x * t1 + p2->x * t;
- p_scale->y = p1->y * t1 + p2->y * t;
- p_scale->z = p1->z * t1 + p2->z * t;
- scale_matrix(p_m, p_scale->x, p_scale->y, p_scale->z);
- }
- else {
- vektor_set(p_scale, 1);
- }
- }
- else {
- kn = p_sim->keynum - 1;
- if (p_sim->p_pos) {
- p1 = (BOD *) & p_m->_41;
- *p_pos = *p1 = p_sim->p_pos[kn];
- }
- else {
- vektor_set(p_pos, 0);
- }
- if (p_sim->p_at) {
- *p_quat = p_sim->p_at[kn];
- quat_to_matrix(p_m, p_quat);
- }
- else {
- quat_set_zero(p_quat);
- }
- if (p_sim->p_scale) {
- p1 = p_sim->p_scale + kn;
- *p_scale = *p1;
- scale_matrix(p_m, p1->x, p1->y, p1->z);
- }
- else {
- vektor_set(p_scale, 1);
- }
- }
- return (p_m);
- }
- /* Prevede animaci kamery do kamery
- */
- void key_kan_to_kamera(KAMERA * p_kam, KAMERA_TRACK_INFO * p_track, int time)
- {
- GLMATRIX m;
- int loop = p_track->flag & GK_LOOP;
- key_track_interpolace_bod(&p_kam->p, p_track->p_pos, p_track->p_pkeys, time,
- p_track->endtime, p_track->pos_keys, loop);
- key_track_interpolace_bod(&p_kam->t, p_track->p_trg, p_track->p_tkeys, time,
- p_track->endtime, p_track->trg_keys, loop);
- key_track_interpolace_float(&p_kam->roll, p_track->p_roll,
- p_track->p_rlkeys, time, p_track->endtime, p_track->roll_keys, loop);
- key_track_interpolace_float(&p_kam->fov, p_track->p_fov, p_track->p_fkeys,
- time, p_track->endtime, p_track->fov_keys, loop);
- calc_camera_3ds(&m, &p_kam->p_objekt->m, &p_kam->p, &p_kam->t, p_kam->roll);
- }
- /* Vyrobi animaci kamery
- */
- int key_kamera_vyrob_indir(KAMERA_TRACK_INFO * p_track, int pos_keys,
- int trg_keys, int roll_keys, int fov_keys, int quat_keys)
- {
- memset(p_track, 0, sizeof(*p_track));
- if ((p_track->pos_keys = pos_keys)) {
- p_track->p_pkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_pkeys[0]) * pos_keys);
- p_track->p_pos = (BOD *) mmalloc(sizeof(p_track->p_pos[0]) * pos_keys);
- }
- if ((p_track->trg_keys = trg_keys)) {
- p_track->p_tkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_tkeys[0]) * trg_keys);
- p_track->p_trg = (BOD *) mmalloc(sizeof(p_track->p_trg[0]) * trg_keys);
- }
- if ((p_track->roll_keys = roll_keys)) {
- p_track->p_rlkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_rlkeys[0]) * roll_keys);
- p_track->p_roll =
- (float *) mmalloc(sizeof(p_track->p_roll[0]) * roll_keys);
- }
- if ((p_track->fov_keys = fov_keys)) {
- p_track->p_fkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_fkeys[0]) * fov_keys);
- p_track->p_fov = (float *) mmalloc(sizeof(p_track->p_fov[0]) * fov_keys);
- }
- if ((p_track->quat_keys = quat_keys)) {
- p_track->p_qkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_track->p_qkeys[0]) * quat_keys);
- p_track->p_quat =
- (QUAT *) mmalloc(sizeof(p_track->p_quat[0]) * quat_keys);
- }
- return (TRUE);
- }
- /* Zrusi animaci kamery
- */
- void key_kamera_zrus_indir(KAMERA_TRACK_INFO * p_track)
- {
- if (p_track->fov_keys) {
- null_free((void **) &p_track->p_fkeys);
- null_free((void **) &p_track->p_fov);
- }
- if (p_track->pos_keys) {
- null_free((void **) &p_track->p_pkeys);
- null_free((void **) &p_track->p_pos);
- }
- if (p_track->roll_keys) {
- null_free((void **) &p_track->p_rlkeys);
- null_free((void **) &p_track->p_roll);
- }
- if (p_track->trg_keys) {
- null_free((void **) &p_track->p_tkeys);
- null_free((void **) &p_track->p_trg);
- }
- if (p_track->quat_keys) {
- null_free((void **) &p_track->p_qkeys);
- null_free((void **) &p_track->p_quat);
- }
- memset(p_track, 0, sizeof(*p_track));
- }
- /* Ulozi kameru
- */
- int key_kamera_uloz(KAMERA_TRACK_INFO * p_track, char *p_jmeno_kamery,
- char *p_jmeno_anim, char *p_file, char *p_dir)
- {
- FILE *f;
- int i, keynum;
- int p, t, r, fv;
- chdir((p_dir));
- if (!(f = fopen(p_file, "w"))) {
- ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
- __LINE__, p_file, (p_dir));
- return (FALSE);
- }
- keynum = calc_keynum(p_track->endtime);
- fprintf(f, "C %d\n", keynum);
- fprintf(f, "J %s\n", p_jmeno_kamery); // jmeno kamery
- fprintf(f, "A %s\n", p_jmeno_anim); // jmeno animace
- for (i = 0; i < keynum; i++) {
- p = key_je_frame_klic(p_track->p_pkeys, p_track->pos_keys, i);
- t = key_je_frame_klic(p_track->p_tkeys, p_track->trg_keys, i);
- r = key_je_frame_klic(p_track->p_rlkeys, p_track->roll_keys, i);
- fv = key_je_frame_klic(p_track->p_fkeys, p_track->fov_keys, i);
- if (p != K_CHYBA || t != K_CHYBA || r != K_CHYBA || fv != K_CHYBA) {
- fprintf(f, "F %d\n", i);
- /* uloz pozici
- */
- if (p != K_CHYBA) {
- fprintf(f, "P %f %f %f\n", p_track->p_pos[p].x, p_track->p_pos[p].y,
- p_track->p_pos[p].z);
- fprintf(f, "L %f %f %f\n", p_track->p_pkeys[p].tension,
- p_track->p_pkeys[p].continuity, p_track->p_pkeys[p].bias);
- }
- /* uloz cil
- */
- if (t != K_CHYBA) {
- fprintf(f, "D %f %f %f\n", p_track->p_trg[t].x, p_track->p_trg[t].y,
- p_track->p_trg[t].z);
- fprintf(f, "L %f %f %f\n", p_track->p_tkeys[t].tension,
- p_track->p_tkeys[t].continuity, p_track->p_tkeys[t].bias);
- }
- /* uloz roll
- */
- if (r != K_CHYBA) {
- fprintf(f, "D %f\n", RAD2DEG(p_track->p_roll[r]));
- fprintf(f, "L %f %f %f\n", p_track->p_rlkeys[r].tension,
- p_track->p_rlkeys[r].continuity, p_track->p_rlkeys[r].bias);
- }
- /* uloz fov
- */
- if (fv != K_CHYBA) {
- fprintf(f, "V %f\n", RAD2DEG(p_track->p_fov[fv]));
- fprintf(f, "L %f %f %f\n", p_track->p_fkeys[fv].tension,
- p_track->p_fkeys[fv].continuity, p_track->p_fkeys[fv].bias);
- }
- }
- }
- fclose(f);
- return (TRUE);
- }
- /* Nahraje kameru
- */
- int key_kamera_nahraj(KAMERA_TRACK_INFO * p_track, char *p_jmeno_kamery,
- char *p_jmeno_anim, APAK_HANDLE * pHandle, char *p_file, char *p_dir)
- {
- KEY_POINT_BRS *p_spline = NULL;
- char line[1000];
- char *p_pom;
- int p, t, r, fv, fr;
- float uhel;
- KFILE *f;
- char **p_line;
- int l, lmax;
- chdir((p_dir));
- if (!(f = kopen(pHandle, p_file, "r"))) {
- kprintf(TRUE, "File %s Line %d Chyba otevreni souboru '%s' v %s",
- __FILE__, __LINE__, p_file, (p_dir));
- return (FALSE);
- }
- p_line = (char **) mmalloc(sizeof(p_line[0]) * MAX_SIM_RADKU);
- l = 0;
- while (kgets(line, 999, f)) {
- assert(l < MAX_SIM_RADKU);
- if (line[0] && line[0] != '\n' && line[0] != ';') {
- p_line[l] =
- (char *) kopiruj_pole(line, sizeof(char) * (strlen(line) + 1));
- l++;
- }
- }
- kclose(f);
- lmax = l;
- p = t = r = fv = 0;
- for (l = 0; l < lmax; l++) {
- p_pom = p_line[l];
- switch (toupper(p_pom[0])) {
- case 'P': // posun
- p++;
- break;
- case 'D': // rotace
- t++;
- break;
- case 'R': // roll
- r++;
- break;
- case 'V': // fov
- fv++;
- break;
- default:
- break;
- }
- }
- key_kamera_vyrob_indir(p_track, p, t, r, fv, 0);
- p = r = t = fr = fv = 0;
- for (l = 0; l < lmax; l++) {
- p_pom = p_line[l];
- switch (toupper(p_pom[0])) {
- case 'F': // frame
- sscanf(p_pom + 1, "%d", &fr);
- break;
- case 'P': // posun
- p_spline = p_track->p_pkeys + p; // nastaveni aktivniho splajnu
- p_track->p_pkeys[p].time = fr * SIM_KONSTI;
- sscanf(p_pom + 1, "%f %f %f", &p_track->p_pos[p].x,
- &p_track->p_pos[p].y, &p_track->p_pos[p].z);
- p++;
- break;
- case 'D': // target
- p_track->p_tkeys[t].time = fr * SIM_KONSTI;
- p_spline = p_track->p_tkeys + t; // nastaveni aktivniho splajnu
- sscanf(p_pom + 1, "%f %f %f", &p_track->p_trg[t].x,
- &p_track->p_trg[t].y, &p_track->p_trg[t].z);
- t++;
- break;
- case 'R': // roll
- p_track->p_rlkeys[r].time = fr * SIM_KONSTI;
- p_spline = p_track->p_rlkeys + r;
- sscanf(p_pom + 1, "%f", &uhel);
- p_track->p_roll[r] = DEG2RAD(uhel);
- r++;
- break;
- case 'V': // roll
- p_track->p_fkeys[fv].time = fr * SIM_KONSTI;
- p_spline = p_track->p_fkeys + fv;
- sscanf(p_pom + 1, "%f", &uhel);
- p_track->p_fov[fv] = DEG2RAD(uhel);
- fv++;
- break;
- case 'L':
- if (p_spline) {
- sscanf(p_pom + 1, "%f %f %f", &p_spline->tension,
- &p_spline->continuity, &p_spline->bias);
- }
- break;
- case 'T':
- if (p_spline) {
- sscanf(p_pom + 1, "%f", &p_spline->tension);
- }
- break;
- case 'O':
- if (p_spline) {
- sscanf(p_pom + 1, "%f", &p_spline->continuity);
- }
- break;
- case 'B':
- if (p_spline) {
- sscanf(p_pom + 1, "%f", &p_spline->bias);
- }
- break;
- case 'C': // celkem framu
- sscanf(p_pom + 1, "%d", &p_track->endtime);
- p_track->endtime = calc_endtime(p_track->endtime);
- break;
- case 'J': // jmeno kamery
- strcpy(p_jmeno_kamery, p_pom + 2);
- break;
- case 'A': // jmeno animace
- strcpy(p_track->jmeno, p_pom + 2);
- break;
- }
- }
- zamen_koncovku_znak(p_jmeno_kamery, '\n', NULL);
- zamen_koncovku_znak(p_track->jmeno, '\n', NULL);
- return (TRUE);
- }
- int key_kamera_track_cti(KAMERA_TRACK_INFO * p_track, BOD * p_p, BOD * p_t,
- float *p_roll, float *p_fov)
- {
- if (p_track->pos_keys) {
- *p_p = p_track->p_pos[0];
- }
- else {
- p_p->x = 0.0f;
- p_p->y = 0.0f;
- p_p->z = 0.0f;
- }
- if (p_track->trg_keys) {
- *p_t = p_track->p_trg[0];
- }
- else {
- p_t->x = 0.0f;
- p_t->y = 0.0f;
- p_t->z = 0.0f;
- }
- if (p_track->roll_keys) {
- *p_roll = p_track->p_roll[0];
- }
- else {
- *p_roll = 0.0f;
- }
- if (p_track->fov_keys) {
- *p_fov = p_track->p_fov[0];
- }
- else {
- *p_fov = DEG2RAD(45.0f);
- }
- return (TRUE);
- }
- /*
- Animace t1-t2 materialu
- */
- ANIM_TEXT *key_vyrob_material_animace(int poskey, int rotkey, int scalekey,
- int pivotkey)
- {
- ANIM_TEXT *p_mat = (ANIM_TEXT *) mmalloc(sizeof(p_mat[0]));
- if (p_mat->pos_keys = poskey) {
- p_mat->p_pos = (BOD *) mmalloc(sizeof(BOD) * poskey);
- p_mat->p_pkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_pkeys[0]) * poskey);
- }
- if (p_mat->piv_keys = pivotkey) {
- p_mat->p_piv = (BOD *) mmalloc(sizeof(BOD) * pivotkey);
- p_mat->p_vkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_vkeys[0]) * pivotkey);
- }
- if (p_mat->rot_keys = rotkey) {
- p_mat->p_rot = (float *) mmalloc(sizeof(p_mat->p_rot[0]) * rotkey);
- p_mat->p_rkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_rkeys[0]) * rotkey);
- }
- if (p_mat->scs_keys = scalekey) {
- p_mat->p_scale = (BOD *) mmalloc(sizeof(BOD) * scalekey);
- p_mat->p_skeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_skeys[0]) * scalekey);
- }
- return (p_mat);
- }
- ANIM_TEXT *key_kopiruj_material_animace(ANIM_TEXT * p_src)
- {
- ANIM_TEXT *p_mat = (ANIM_TEXT *) mmalloc(sizeof(p_mat[0]));
- int poskey = p_src->pos_keys;
- int pivkey = p_src->piv_keys;
- int rotkey = p_src->rot_keys;
- int scalekey = p_src->scs_keys;
- if (p_mat->pos_keys = poskey) {
- p_mat->p_pos = (BOD *) mmalloc(sizeof(p_mat->p_pos[0]) * poskey);
- p_mat->p_pkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_pkeys[0]) * poskey);
- memcpy(p_mat->p_pos, p_src->p_pos, sizeof(BOD) * poskey);
- memcpy(p_mat->p_pkeys, p_src->p_pkeys,
- sizeof(p_mat->p_pkeys[0]) * poskey);
- }
- if (p_mat->piv_keys = pivkey) {
- p_mat->p_piv = (BOD *) mmalloc(sizeof(p_mat->p_piv[0]) * pivkey);
- p_mat->p_vkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_vkeys[0]) * pivkey);
- memcpy(p_mat->p_piv, p_src->p_piv, sizeof(BOD) * pivkey);
- memcpy(p_mat->p_vkeys, p_src->p_vkeys,
- sizeof(p_mat->p_vkeys[0]) * pivkey);
- }
- if (p_mat->rot_keys = rotkey) {
- p_mat->p_rot = (float *) mmalloc(sizeof(p_mat->p_rot[0]) * rotkey);
- p_mat->p_rkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_rkeys[0]) * rotkey);
- memcpy(p_mat->p_rot, p_src->p_rot, sizeof(p_mat->p_rot[0]) * rotkey);
- memcpy(p_mat->p_rkeys, p_src->p_rkeys,
- sizeof(p_mat->p_rkeys[0]) * rotkey);
- }
- if (p_mat->scs_keys = scalekey) {
- p_mat->p_scale = (BOD *) mmalloc(sizeof(p_mat->p_scale[0]) * scalekey);
- p_mat->p_skeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_mat->p_skeys[0]) * scalekey);
- memcpy(p_mat->p_scale, p_src->p_scale,
- sizeof(p_src->p_scale[0]) * scalekey);
- memcpy(p_mat->p_skeys, p_src->p_skeys,
- sizeof(p_mat->p_skeys[0]) * scalekey);
- }
- return (p_mat);
- }
- void key_zrus_material_animace(ANIM_TEXT ** p_mat)
- {
- null_free((void **) &(*p_mat)->p_pos);
- null_free((void **) &(*p_mat)->p_piv);
- null_free((void **) &(*p_mat)->p_rot);
- null_free((void **) &(*p_mat)->p_scale);
- null_free((void **) &(*p_mat));
- }
- /*
- Animace text-koordinatu materialu
- */
- void key_sim_to_text_matrix(ANIM_TEXT * p_text, int time, GLMATRIX * p_ttext)
- {
- BOD *p;
- init_matrix(p_ttext);
- if (p_text->p_piv) {
- key_track_interpolace_bod_linear(&p_text->pivot, p_text->p_piv,
- p_text->p_vkeys, time, p_text->endtime, p_text->piv_keys, FALSE);
- }
- if (p_text->p_pos) {
- key_track_interpolace_bod_linear(&p_text->pos, p_text->p_pos,
- p_text->p_pkeys, time, p_text->endtime, p_text->pos_keys, FALSE);
- p_ttext->_41 = p_text->pos.x;
- p_ttext->_42 = p_text->pos.y;
- }
- if (p_text->p_rot) {
- key_track_interpolace_float_linear(&p_text->rot, p_text->p_rot,
- p_text->p_rkeys, time, p_text->endtime, p_text->rot_keys, FALSE);
- float_to_matrix(p_ttext, p_text->rot,
- p_text->p_piv ? &p_text->pivot : NULL);
- }
- if (p_text->p_scale) {
- p = &p_text->scs;
- key_track_interpolace_bod_linear(p, p_text->p_scale, p_text->p_skeys,
- time, p_text->endtime, p_text->scs_keys, FALSE);
- p_ttext->_11 *= p->x;
- p_ttext->_21 *= p->x;
- p_ttext->_12 *= p->y;
- p_ttext->_22 *= p->y;
- }
- }
- void key_mat_to_text_matrix(GLMATRIX * p_ttext, BOD * p_pos, float uhel,
- BOD * p_scale, BOD * p_pivot)
- {
- init_matrix(p_ttext);
- if (p_pos) {
- p_ttext->_41 = p_pos->x;
- p_ttext->_42 = p_pos->y;
- }
- if (uhel != 0.0f)
- float_to_matrix(p_ttext, uhel, p_pivot);
- if (p_scale) {
- p_ttext->_11 *= p_scale->x;
- p_ttext->_21 *= p_scale->x;
- p_ttext->_12 *= p_scale->y;
- p_ttext->_22 *= p_scale->y;
- }
- }
- // load text animace z text-file
- ANIM_TEXT *key_text_nahraj(char *p_file, char *p_dir)
- {
- ANIM_TEXT *p_track;
- KEY_POINT_BRS *p_spline = NULL;
- char pom[1000];
- FILE *f;
- int p, r, s, v, fr;
- float uhel;
- chdir((p_dir));
- if (!(f = fopen(p_file, "r"))) {
- ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
- __LINE__, p_file, (p_dir));
- return (FALSE);
- }
- p = r = s = v = 0;
- while (fgets(pom, 999, f)) {
- if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
- switch (toupper(pom[0])) {
- case 'P': // posun
- p++;
- break;
- case 'R': // rotace
- r++;
- break;
- case 'S': // scale
- s++;
- break;
- case 'V': // pivot
- v++;
- break;
- case 'F': // frame
- case 'C': // celkem framu
- case 'L': // spline-hodnoty
- break;
- }
- }
- }
- fseek(f, 0, SEEK_SET);
- p_track = key_vyrob_material_animace(p, r, s, v);
- p = r = s = v = fr = 0;
- while (fgets(pom, 999, f)) {
- if (pom[0] && pom[0] != '\n' && pom[0] != ';') {
- switch (toupper(pom[0])) {
- case 'F': // frame
- sscanf(pom + 1, "%d", &fr);
- break;
- case 'P': // posun
- p_track->p_pkeys[p].time = fr * SIM_KONSTI;
- p_spline = p_track->p_pkeys + p;
- sscanf(pom + 1, "%f %f %f", &p_track->p_pos[p].x,
- &p_track->p_pos[p].y);
- p++;
- break;
- case 'V': // pivot
- p_track->p_vkeys[v].time = fr * SIM_KONSTI;
- p_spline = p_track->p_vkeys + v;
- sscanf(pom + 1, "%f %f %f", &p_track->p_piv[v].x,
- &p_track->p_piv[v].y);
- v++;
- break;
- case 'R': // rotace
- p_track->p_rkeys[r].time = fr * SIM_KONSTI;
- p_spline = p_track->p_rkeys + r;
- sscanf(pom + 1, "%f", &uhel);
- p_track->p_rot[r] = DEG2RAD(uhel);
- r++;
- break;
- case 'S': // scale
- p_track->p_skeys[s].time = fr * SIM_KONSTI;
- p_spline = p_track->p_skeys + s;
- sscanf(pom + 1, "%f %f %f", &p_track->p_scale[s].x,
- &p_track->p_scale[s].y);
- s++;
- break;
- case 'L':
- if (p_spline) {
- sscanf(pom + 1, "%f %f %f", &p_spline->tension,
- &p_spline->continuity, &p_spline->bias);
- }
- break;
- case 'T':
- if (p_spline) {
- sscanf(pom + 1, "%f", &p_spline->tension);
- }
- break;
- case 'O':
- if (p_spline) {
- sscanf(pom + 1, "%f", &p_spline->continuity);
- }
- break;
- case 'B':
- if (p_spline) {
- sscanf(pom + 1, "%f", &p_spline->bias);
- }
- break;
- case 'C': // celkem framu
- sscanf(pom + 1, "%d", &p_track->endtime);
- p_track->endtime = calc_endtime(p_track->endtime);
- break;
- }
- }
- }
- fclose(f);
- return (p_track);
- }
- int key_text_uloz(ANIM_TEXT * p_track, char *p_file, char *p_dir)
- {
- FILE *f;
- int i, p, r, s, v, frame;
- int keynum;
- dword time;
- chdir((p_dir));
- if (!(f = fopen(p_file, "w"))) {
- ddw("File %s Line %d Chyba otevreni souboru '%s' v %s", __FILE__,
- __LINE__, p_file, (p_dir));
- return (FALSE);
- }
- frame = p = r = s = v = 0;
- keynum = calc_keynum(p_track->endtime);
- fprintf(f, "C %d\n", keynum);
- for (i = 0; i < keynum; i++) {
- frame = 0;
- time = i * SIM_KONSTI;
- if (p < p_track->pos_keys && p_track->p_pkeys &&
- p_track->p_pkeys[p].time == time) {
- fprintf(f, "F %d\n", i);
- frame++;
- fprintf(f, "P %f %f\n", p_track->p_pos[p].x, p_track->p_pos[p].y);
- p++;
- }
- if (v < p_track->piv_keys && p_track->p_vkeys &&
- p_track->p_vkeys[v].time == time) {
- if (!frame) {
- fprintf(f, "F %d\n", i);
- frame++;
- }
- fprintf(f, "V %f %f\n", p_track->p_piv[v].x, p_track->p_piv[v].y);
- v++;
- }
- if (r < p_track->rot_keys && p_track->p_rkeys &&
- p_track->p_rkeys[r].time == time) {
- if (!frame) {
- fprintf(f, "F %d\n", i);
- frame++;
- }
- fprintf(f, "R %f\n", RAD2DEG(p_track->p_rot[r]));
- r++;
- }
- if (s < p_track->scs_keys && p_track->p_skeys &&
- p_track->p_skeys[s].time == time) {
- if (!frame) {
- fprintf(f, "F %d\n", i);
- frame++;
- }
- fprintf(f, "S %f %f\n", p_track->p_scale[s].x, p_track->p_scale[s].y);
- s++;
- }
- }
- fclose(f);
- return (TRUE);
- }
- void key_sim_root_vloz_pivoty_do_animace_rec(EDIT_KONTEJNER * p_kont,
- SIMPLE_TRACK_INFO * p_sim)
- {
- int i, o = lo_najdi_objekt_kont_ID(p_kont, p_sim->Objekt_ID);
- if (o != K_CHYBA) {
- p_sim->pivot = p_kont->p_obj[o]->pivot;
- }
- for (i = 0; i < p_sim->childnum; i++) {
- key_sim_root_vloz_pivoty_do_animace_rec(p_kont, p_sim->p_child + i);
- }
- }
- void key_sim_root_vloz_pivoty_do_animace(EDIT_KONTEJNER * p_kont,
- HIERARCHY_SIM * p_root)
- {
- int i;
- for (i = 0; i < p_root->childnum; i++) {
- key_sim_root_vloz_pivoty_do_animace_rec(p_kont, p_root->p_child + i);
- }
- }
- void key_sim_root_vloz_pivoty_do_animace_kont(EDIT_KONTEJNER * p_kont)
- {
- int i;
- for (i = 0; i < KONT_MAX_ANIM; i++) {
- if (p_kont->sim[i].keynum)
- key_sim_root_vloz_pivoty_do_animace(p_kont, p_kont->sim + i);
- }
- }
- /* Transformuje lokalni OBB meshe do globalni OBB
- Pri posunu celeho objektu
- */
- void key_mesh_transformuj_obalky(GAME_MESH_OLD * p_mesh, GLMATRIX * p_mat)
- {
- OBB_OLD *p_src = p_mesh->p_obb_local;
- OBB_OLD *p_dst = p_mesh->p_obb_world;
- int i;
- for (i = 0; i < p_mesh->objektu; i++) {
- obb_transformuj(p_src + i, p_mat, p_dst + i);
- }
- obb_transformuj(&p_mesh->obb_local, p_mat, &p_mesh->obb_world);
- }
- /* Spocita pozuze obalku kontejneru - pri key-animaci kdy se obalky
- updatuji automaticky
- */
- /*
- void key_mesh_calc_global_obalku(GAME_MESH_OLD *p_mesh)
- {
- obb_slep_aabb(&p_mesh->obb_world, p_mesh->p_obb_world, p_mesh->objektu);
- }
- */
- void key_kont_updatuj_flagy(EDIT_KONTEJNER * p_kont)
- {
- int i, anum = 0;
- for (i = 0; i < KONT_MAX_ANIM; i++) {
- if (p_kont->sim[i].keynum)
- anum++;
- }
- if (!anum) {
- p_kont->kflag &= ~(KONT_KEYFRAME | KONT_NORMAL_ANIM);
- }
- }
- JOINT_KEYS *key_kost_spline_vyrob(JOINT * p_joint)
- {
- if (p_joint) {
- if (!p_joint->p_keys) {
- p_joint->p_keys = (JOINT_KEYS *) mmalloc(sizeof(p_joint->p_keys[0]));
- }
- return (p_joint->p_keys);
- }
- else {
- return (NULL);
- }
- }
- void key_kosti_updatuj_vertexy_rec(EDIT_OBJEKT * p_obj, JOINT * p_joint)
- {
- int i, v;
- for (i = 0; i < p_joint->vertexnum; i++) {
- v = p_joint->p_vertexlist[i];
- if (v >= p_obj->vertexnum) {
- assert(v < p_obj->vertexnum);
- p_joint->p_vertexlist[i] = 0;
- }
- transformuj_bod_matici_bod((BOD *) (p_obj->p_vertex + v), &p_joint->m,
- p_obj->p_vertex_kosti + v);
- }
- // proved rekurzivni animace
- if (p_joint->p_next)
- key_kosti_updatuj_vertexy_rec(p_obj, p_joint->p_next);
- if (p_joint->p_child)
- key_kosti_updatuj_vertexy_rec(p_obj, p_joint->p_child);
- }
- void key_kosti_updatuj_vertexy(EDIT_OBJEKT * p_obj, JOINT_ANIMACE * p_animace)
- {
- if (p_animace && p_animace->p_child) {
- if (!p_obj->p_vertex_kosti) {
- int i;
- p_obj->p_vertex_kosti =
- (BOD *) mmalloc(sizeof(p_obj->p_vertex_kosti[0]) * p_obj->vertexnum);
- for (i = 0; i < p_obj->vertexnum; i++) {
- mujbod2bod(p_obj->p_vertex_kosti + i, p_obj->p_vertex + i);
- }
- }
- key_kosti_updatuj_vertexy_rec(p_obj, p_animace->p_child);
- }
- }
- void key_kosti_interpoluj_rec(JOINT * p_joint, int framenum, int loop)
- {
- JOINT_KEYS *p_key = p_joint->p_keys;
- int keynum = framenum;
- int endtime = calc_endtime(framenum);
- int i;
- init_matrix(&p_joint->m);
- if (p_joint->p_pos) {
- free(p_joint->p_pos);
- p_joint->p_pos = NULL;
- p_joint->pos_keys = 0;
- }
- if (p_joint->p_rot) {
- free(p_joint->p_rot);
- p_joint->p_rot = NULL;
- p_joint->rot_keys = 0;
- }
- if (p_joint->p_scs) {
- free(p_joint->p_scs);
- p_joint->p_scs = NULL;
- p_joint->scs_keys = 0;
- }
- if (p_key) {
- if (p_key->p_pos) {
- p_joint->p_pos = (BOD *) mmalloc(sizeof(p_joint->p_pos[0]) * keynum);
- p_joint->pos_keys = keynum;
- for (i = 0; i < keynum; i++)
- key_track_interpolace_bod(p_joint->p_pos + i, p_key->p_pos,
- p_key->p_pkeys, i * SIM_KONSTI, endtime, p_key->pos_keys, loop);
- }
- if (p_key->p_rot) {
- p_joint->p_rot = (QUAT *) mmalloc(sizeof(p_joint->p_rot[0]) * keynum);
- p_joint->rot_keys = keynum;
- for (i = 0; i < keynum; i++) {
- key_track_interpolace_quat(p_joint->p_rot + i, p_key->p_rot,
- p_key->p_rkeys, i * SIM_KONSTI, endtime, p_key->rot_keys, loop);
- }
- }
- if (p_key->p_scale) {
- p_joint->p_scs = (BOD *) mmalloc(sizeof(p_joint->p_scs[0]) * keynum);
- p_joint->scs_keys = keynum;
- for (i = 0; i < keynum; i++)
- key_track_interpolace_bod(p_joint->p_scs + i, p_key->p_scale,
- p_key->p_skeys, i * SIM_KONSTI, endtime, p_key->scs_keys, loop);
- }
- }
- // proved rekurzivni animace
- if (p_joint->p_next)
- key_kosti_interpoluj_rec(p_joint->p_next, framenum, loop);
- if (p_joint->p_child)
- key_kosti_interpoluj_rec(p_joint->p_child, framenum, loop);
- }
- // prepocita animace z klicu do linearni animace
- void key_kosti_interpoluj(JOINT_ANIMACE * p_animace)
- {
- if (p_animace) {
- key_kosti_interpoluj_rec(p_animace->p_child, p_animace->framenum, TRUE);
- }
- }
- void key_kosti_animuj_rec(JOINT * p_joint, GLMATRIX * p_top, int time,
- int keynum)
- {
- float frame, t, t1;
- BOD *p1, *p2, pv;
- int kn, lasttime;
- GLMATRIX *p_m = &p_joint->m;
- init_matrix(p_m);
- lasttime = (keynum - 1) * SIM_KONSTI;
- if (time < lasttime) {
- t = (float) time / SIM_KONST;
- frame = (float) floor((float) t);
- t -= frame;
- kn = ftoi(frame);
- t1 = 1.0f - t;
- if (p_joint->p_pos) {
- p1 = p_joint->p_pos + kn;
- p2 = p_joint->p_pos + kn + 1;
- p_joint->p.x = p_m->_41 = p1->x * t1 + p2->x * t;
- p_joint->p.y = p_m->_42 = p1->y * t1 + p2->y * t;
- p_joint->p.z = p_m->_43 = p1->z * t1 + p2->z * t;
- }
- if (p_joint->p_rot) {
- quat_to_matrix(p_m, slerp(p_joint->p_rot + kn, p_joint->p_rot + kn + 1,
- t, &p_joint->r));
- }
- if (p_joint->p_scs) {
- p1 = p_joint->p_scs + kn;
- p2 = p_joint->p_scs + kn + 1;
- p_joint->s.x = p1->x * t1 + p2->x * t;
- p_joint->s.y = p1->y * t1 + p2->y * t;
- p_joint->s.z = p1->z * t1 + p2->z * t;
- scale_matrix(p_m, p_joint->s.x, p_joint->s.y, p_joint->s.z);
- }
- }
- else {
- kn = keynum - 1;
- if (p_joint->p_pos) {
- p1 = (BOD *) & p_m->_41;
- p_joint->p = *p1 = p_joint->p_pos[kn];
- }
- if (p_joint->p_rot) {
- p_joint->r = p_joint->p_rot[kn];
- quat_to_matrix(p_m, p_joint->p_rot + kn);
- }
- if (p_joint->p_scs) {
- p_joint->s = p_joint->p_scs[kn];
- p1 = &p_joint->s;
- scale_matrix(p_m, p1->x, p1->y, p1->z);
- }
- }
- if (p_top) {
- transformuj_bod_matici_bod(&p_joint->pivot, p_top, &pv);
- pivotuj_matrix(p_m, &pv);
- }
- else {
- pivotuj_matrix(p_m, &p_joint->pivot);
- }
- if (p_top) {
- mat_mult(p_top, p_m, p_m);
- }
- if (p_joint->p_next)
- key_kosti_animuj_rec(p_joint->p_next, p_m, time, keynum);
- if (p_joint->p_child)
- key_kosti_animuj_rec(p_joint->p_child, p_m, time, keynum);
- }
- void key_kosti_animuj(JOINT_ANIMACE * p_animace)
- {
- if (p_animace) {
- key_kosti_animuj_rec(p_animace->p_child, NULL, p_animace->time,
- p_animace->framenum);
- }
- }
- #define MAX_TIME 0xfffffffe
- #define NO_TIME 0xffffffff
- void key_kosti_serad_klice(byte * p_hodnoty, KEY_POINT_BRS * p_skeys,
- int keynum, int size_of_hodnota)
- {
- KEY_POINT_BRS *p_nkeys =
- (KEY_POINT_BRS *) mmalloc(sizeof(p_nkeys[0]) * keynum);
- byte *p_nhod = (byte *) mmalloc(sizeof(byte) * size_of_hodnota * keynum);
- dword min_time, min_klic;
- int i, new_akt = 0;
- while (1) {
- min_time = MAX_TIME;
- for (i = 0; i < keynum; i++) {
- if (p_skeys[i].time <= min_time) {
- min_time = p_skeys[i].time;
- min_klic = i;
- }
- }
- if (min_time == MAX_TIME)
- break;
- p_nkeys[new_akt] = p_skeys[min_klic];
- memcpy(p_nhod + new_akt * size_of_hodnota,
- p_hodnoty + min_klic * size_of_hodnota, sizeof(byte) * size_of_hodnota);
- new_akt++;
- p_skeys[min_klic].time = NO_TIME;
- }
- memcpy(p_hodnoty, p_nhod, sizeof(byte) * size_of_hodnota * keynum);
- memcpy(p_skeys, p_nkeys, sizeof(p_nkeys[0]) * keynum);
- free(p_nkeys);
- free(p_nhod);
- }
- /*
- Streamovy animace vertexu
- */
- void key_kosti_stream_animuj_rec(JOINT_ANIMACE * p_anim, JOINT * p_joint,
- GLMATRIX * p_top, int time, int keynum)
- {
- float frame, t, t1, x1, y1, z1, x2, y2, z2;
- BOD *p1, *p2, pv;
- BOD *ps1in, *ps1out;
- BOD *ps2in, *ps2out;
- BOD *pv1, *pv2, *pv3, *pv4;
- int kn, lasttime, num, *p_ind, i, v;
- GLMATRIX *p_m;
- while (p_joint) {
- p_m = init_matrix(&p_joint->m);
- lasttime = (keynum - 1) * SIM_KONSTI;
- if (time < lasttime) {
- t = ((float) time) / SIM_KONST;
- frame = (float) floor((float) t);
- t -= frame;
- kn = ftoi(frame);
- t1 = 1.0f - t;
- if (p_joint->p_pos) {
- p1 = p_joint->p_pos + kn;
- p2 = p_joint->p_pos + kn + 1;
- p_m->_41 = p1->x * t1 + p2->x * t;
- p_m->_42 = p1->y * t1 + p2->y * t;
- p_m->_43 = p1->z * t1 + p2->z * t;
- }
- if (p_joint->p_rot) {
- quat_to_matrix(p_m, slerp(p_joint->p_rot + kn,
- p_joint->p_rot + kn + 1, t, &p_joint->r));
- }
- if (p_joint->p_scs) {
- p1 = p_joint->p_scs + kn;
- p2 = p_joint->p_scs + kn + 1;
- scale_matrix(p_m, p1->x * t1 + p2->x * t, p1->y * t1 + p2->y * t,
- p1->z * t1 + p2->z * t);
- }
- }
- else {
- kn = keynum - 1;
- if (p_joint->p_pos) {
- p1 = (BOD *) & p_m->_41;
- *p1 = p_joint->p_pos[kn];
- }
- if (p_joint->p_rot) {
- quat_to_matrix(p_m, p_joint->p_rot + kn);
- }
- if (p_joint->p_scs) {
- p1 = p_joint->p_scs + kn;
- scale_matrix(p_m, p1->x, p1->y, p1->z);
- }
- }
- if (p_top) {
- transformuj_bod_matici_bod(&p_joint->pivot, p_top, &pv);
- pivotuj_matrix(p_m, &pv);
- }
- else {
- pivotuj_matrix(p_m, &p_joint->pivot);
- }
- if (p_top) {
- mat_mult(p_top, p_m, p_m);
- }
- ps1in = p_anim->p_pos_in;
- ps1out = p_anim->p_pos_out;
- ps2in = p_anim->p_norm_in;
- ps2out = p_anim->p_norm_out;
- num = p_joint->vertexnum;
- p_ind = p_joint->p_vertexlist;
- if (ps1in && ps1out) {
- num = p_joint->vertexnum;
- p_ind = p_joint->p_vertexlist;
- for (i = 0; i < num; i++) {
- v = *p_ind++;
- pv1 = ps1in + v;
- pv2 = ps1out + v;
- pv3 = ps2in + v;
- pv4 = ps2out + v;
- x1 = pv1->x;
- y1 = pv1->y;
- z1 = pv1->z;
- x2 = pv3->x;
- y2 = pv3->y;
- z2 = pv3->z;
- pv2->x = p_m->_11 * x1 + p_m->_21 * y1 + p_m->_31 * z1 + p_m->_41;
- pv4->x = p_m->_11 * x2 + p_m->_21 * y2 + p_m->_31 * z2;
- pv2->y = p_m->_12 * x1 + p_m->_22 * y1 + p_m->_32 * z1 + p_m->_42;
- pv4->y = p_m->_12 * x2 + p_m->_22 * y2 + p_m->_32 * z2;
- pv2->z = p_m->_13 * x1 + p_m->_23 * y1 + p_m->_33 * z1 + p_m->_43;
- pv4->z = p_m->_13 * x2 + p_m->_23 * y2 + p_m->_33 * z2;
- }
- }
- if (p_joint->p_next)
- key_kosti_stream_animuj_rec(p_anim, p_joint->p_next, p_m, time, keynum);
- p_top = p_m;
- p_joint = p_joint->p_child;
- }
- }
- JOINT_KEYS *key_joint_kopiruj_spline(JOINT_KEYS * p_src)
- {
- if (p_src) {
- JOINT_KEYS *p_new = (JOINT_KEYS *) kopiruj_pole(p_src, sizeof(p_src[0]));
- p_new->p_pkeys =
- (KEY_POINT_BRS *) kopiruj_pole(p_new->p_pkeys,
- sizeof(p_new->p_pkeys[0]) * p_new->pos_keys);
- p_new->p_pos =
- (BOD *) kopiruj_pole(p_new->p_pos,
- sizeof(p_new->p_pos[0]) * p_new->pos_keys);
- p_new->p_rkeys =
- (KEY_POINT_BRS *) kopiruj_pole(p_new->p_rkeys,
- sizeof(p_new->p_rkeys[0]) * p_new->rot_keys);
- p_new->p_rot =
- (QUAT *) kopiruj_pole(p_new->p_rot,
- sizeof(p_new->p_rot[0]) * p_new->rot_keys);
- p_new->p_skeys =
- (KEY_POINT_BRS *) kopiruj_pole(p_new->p_skeys,
- sizeof(p_new->p_skeys[0]) * p_new->scs_keys);
- p_new->p_scale =
- (BOD *) kopiruj_pole(p_new->p_scale,
- sizeof(p_new->p_scale[0]) * p_new->scs_keys);
- return (p_new);
- }
- else {
- return (NULL);
- }
- }
- JOINT *key_joint_kopiruj(JOINT * p_src)
- {
- JOINT *p_new = (JOINT *) kopiruj_pole(p_src, sizeof(p_src[0]));
- p_new->p_vertexlist =
- (int *) kopiruj_pole(p_src->p_vertexlist,
- sizeof(p_new->p_vertexlist[0]) * p_new->vertexnum);
- p_new->p_pos =
- (BOD *) kopiruj_pole(p_src->p_pos,
- sizeof(p_new->p_pos[0]) * p_new->pos_keys);
- p_new->p_rot =
- (QUAT *) kopiruj_pole(p_src->p_rot,
- sizeof(p_new->p_rot[0]) * p_new->rot_keys);
- p_new->p_scs =
- (BOD *) kopiruj_pole(p_src->p_scs,
- sizeof(p_new->p_scs[0]) * p_new->scs_keys);
- p_new->p_keys = key_joint_kopiruj_spline(p_src->p_keys);
- return (p_new);
- }
- JOINT *key_joint_vyrob(void)
- {
- JOINT *p_src = (JOINT *) mmalloc(sizeof(p_src[0]));
- p_src->r.w = 1;
- p_src->s.x = p_src->s.y = p_src->s.z = 1.0f;
- init_matrix(&p_src->m);
- return (p_src);
- }
- JOINT *key_kosti_kopiruj_rec(JOINT * p_src)
- {
- JOINT *p_new = key_joint_kopiruj(p_src);
- if (p_src->p_next)
- p_new->p_next = key_kosti_kopiruj_rec(p_src->p_next);
- if (p_src->p_child)
- p_new->p_child = key_kosti_kopiruj_rec(p_src->p_child);
- return (p_new);
- }
- /* Skopiruje animace kosti
- */
- JOINT_ANIMACE *key_kosti_kopiruj(JOINT_ANIMACE * p_src)
- {
- JOINT_ANIMACE *p_new = (JOINT_ANIMACE *) mmalloc(sizeof(p_src[0]));
- memcpy(p_new, p_src, sizeof(p_src[0]));
- p_new->p_child = key_kosti_kopiruj_rec(p_new->p_child);
- return (p_new);
- }
- JOINT_ANIMACE *key_kosti_kopiruj_animace(JOINT_ANIMACE * p_prvni)
- {
- JOINT_ANIMACE *p_tmp;
- JOINT_ANIMACE *p_frs = NULL;
- while (p_prvni) {
- if (!p_frs) {
- p_frs = p_tmp = key_kosti_kopiruj(p_prvni);
- }
- else {
- p_tmp->p_next = key_kosti_kopiruj(p_prvni);
- }
- p_prvni = p_prvni->p_next;
- }
- return (p_frs);
- }
|