Load.cpp 111 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598
  1. /*
  2. pomocne funkce
  3. */
  4. #include <string.h>
  5. #include <limits.h>
  6. #include "Apak.h"
  7. #include "Berusky_universal.h"
  8. #include "3d_all.h"
  9. #include "strip.h"
  10. int hlasit_kolize = 0;
  11. template < class T > void vyrob_pole(T ** p_dst, int num)
  12. {
  13. if (!(*p_dst = (T *) mmalloc(sizeof(*p_dst[0]) * num)))
  14. chyba("Pamet");
  15. memset(*p_dst, 0, sizeof(*p_dst[0]) * num);
  16. }
  17. template < class T > void vyrob_pole_abs(T ** p_dst, int num)
  18. {
  19. if (!(*p_dst = (T *) mmalloc(sizeof(byte) * num)))
  20. chyba("Pamet");
  21. memset(*p_dst, 0, sizeof(byte) * num);
  22. }
  23. /*
  24. Koncovky
  25. */
  26. /* Zameni koncovku, koncovka je zadana vcetne tecky
  27. */
  28. char *zamen_koncovku(char *p_file, const char *p_koncovka)
  29. {
  30. char *p_pom = p_file, *p_last = NULL;
  31. while ((p_pom = strchr(p_pom, '.'))) {
  32. p_last = p_pom++;
  33. }
  34. if (p_last)
  35. *p_last = 0;
  36. return ((p_koncovka) ? strcat(p_file, p_koncovka) : p_file);
  37. }
  38. /* Zameni koncovku, oddelovaci znak se zadava
  39. */
  40. char *zamen_koncovku_znak(char *p_file, char znak, const char *p_koncovka)
  41. {
  42. char *p_pom = strchr(p_file, znak);
  43. if (p_pom)
  44. *p_pom = 0;
  45. return ((p_koncovka) ? strcat(p_file, p_koncovka) : p_file);
  46. }
  47. /* Vrati koncovku souboru
  48. */
  49. char *cti_koncovku(char *p_file)
  50. {
  51. if (p_file) {
  52. char *p_pom = strchr(p_file, '.');
  53. return (p_pom);
  54. }
  55. else {
  56. return (NULL);
  57. }
  58. }
  59. /* Vrati znak
  60. */
  61. char *cti_za_znak(char *p_string, char znak)
  62. {
  63. char *p_pom = p_string;
  64. while (*p_pom && *p_pom == znak)
  65. p_pom++;
  66. return (p_pom);
  67. }
  68. /* Mlzna kostka
  69. */
  70. MLZNA_KOSTKA *vyrob_mlhokostku(char *p_jmeno)
  71. {
  72. MLZNA_KOSTKA *p_mlha = (MLZNA_KOSTKA *) mmalloc(sizeof(p_mlha[0]));
  73. strcpy(p_mlha->jmeno, p_jmeno);
  74. p_mlha->poly = K_CHYBA;
  75. p_mlha->a = 1.0f;
  76. p_mlha->mod = GL_LINEAR;
  77. p_mlha->max.x = 10.0f;
  78. p_mlha->max.y = 10.0f;
  79. p_mlha->max.z = 10.0f;
  80. return (p_mlha);
  81. }
  82. MLZNA_KOSTKA *kopiruj_mlhokostku(MLZNA_KOSTKA * p_src, char *p_jmeno)
  83. {
  84. MLZNA_KOSTKA *p_mlha = (MLZNA_KOSTKA *) mmalloc(sizeof(p_mlha[0]));
  85. *p_mlha = *p_src;
  86. strcpy(p_mlha->jmeno, p_jmeno);
  87. p_mlha->p_kont = NULL;
  88. p_mlha->p_next = p_src->p_next;
  89. p_src->p_next = p_mlha;
  90. return (p_mlha);
  91. }
  92. void zrus_mlhokostku(MLZNA_KOSTKA ** p_first, MLZNA_KOSTKA * p_maz)
  93. {
  94. MLZNA_KOSTKA *p_tmp, *p_prev;
  95. if (!p_first) {
  96. p_maz->p_kont = NULL;
  97. }
  98. else {
  99. if ((*p_first) == p_maz) {
  100. (*p_first) = p_maz->p_next;
  101. }
  102. else {
  103. p_tmp = (*p_first)->p_next;
  104. p_prev = (*p_first);
  105. while (p_tmp) {
  106. if (p_tmp == p_maz) {
  107. p_prev->p_next = p_maz->p_next;
  108. break;
  109. }
  110. else {
  111. p_prev = p_tmp;
  112. p_tmp = p_tmp->p_next;
  113. }
  114. }
  115. }
  116. free(p_maz);
  117. }
  118. }
  119. MLZNA_KOSTKA *zrus_mlhokostku_all(MLZNA_KOSTKA * p_first)
  120. {
  121. MLZNA_KOSTKA *p_tmp;
  122. while (p_first) {
  123. p_tmp = p_first->p_next;
  124. free(p_first);
  125. p_first = p_tmp;
  126. }
  127. return (NULL);
  128. }
  129. /* **************************************************
  130. Objekty - vyrobeni / zruseni
  131. */
  132. EDIT_OBJEKT *vyrob_objekt(void)
  133. {
  134. EDIT_OBJEKT *p_obj;
  135. p_obj = (EDIT_OBJEKT *) mmalloc(sizeof(EDIT_OBJEKT));
  136. p_obj->kreslit = 1;
  137. p_obj->face_typ = GL_TRIANGLES;
  138. p_obj->line_typ = GL_LINES;
  139. init_matrix(&p_obj->m);
  140. // init_matrix(&p_obj->local_matrix);
  141. return (p_obj);
  142. }
  143. // f = facenum * 3 !!!
  144. EDIT_OBJEKT *vyrob_objekt_komplet(int v, int f)
  145. {
  146. EDIT_OBJEKT *p_obj;
  147. p_obj = (EDIT_OBJEKT *) mmalloc(sizeof(EDIT_OBJEKT));
  148. p_obj->p_vertex = (MUJ_BOD *) mmalloc(sizeof(MUJ_BOD) * v);
  149. if (f) {
  150. if ((p_obj->p_face = (FACE *) mmalloc(sizeof(FACE) * f)) == NULL) {
  151. chyba("pamet");
  152. }
  153. }
  154. p_obj->vertexnum = v;
  155. p_obj->facenum = f;
  156. p_obj->kreslit = 1;
  157. p_obj->face_typ = GL_TRIANGLES;
  158. p_obj->line_typ = GL_LINES;
  159. init_matrix(&p_obj->m);
  160. return (p_obj);
  161. }
  162. void zrus_kosti_key(JOINT_KEYS ** p_key)
  163. {
  164. null_free((void **) &(*p_key)->p_pkeys);
  165. null_free((void **) &(*p_key)->p_pos);
  166. null_free((void **) &(*p_key)->p_rkeys);
  167. null_free((void **) &(*p_key)->p_rot);
  168. null_free((void **) &(*p_key)->p_skeys);
  169. null_free((void **) &(*p_key)->p_scale);
  170. null_free((void **) p_key);
  171. *p_key = NULL;
  172. }
  173. void zrus_kosti_prs_rec(JOINT * p_joint)
  174. {
  175. if (p_joint) {
  176. if (p_joint->p_child)
  177. zrus_kosti_prs_rec(p_joint->p_child);
  178. if (p_joint->p_next)
  179. zrus_kosti_prs_rec(p_joint->p_next);
  180. if (p_joint->p_keys)
  181. zrus_kosti_key(&(p_joint->p_keys));
  182. p_joint->pos_keys = 0;
  183. p_joint->p.x = p_joint->p.y = p_joint->p.z = 0.0f;
  184. null_free((void **) &p_joint->p_pos);
  185. p_joint->rot_keys = 0;
  186. p_joint->r.x = p_joint->r.y = p_joint->r.z = 0.0f;
  187. p_joint->r.w = 1.0f;
  188. null_free((void **) &p_joint->p_rot);
  189. p_joint->scs_keys = 0;
  190. p_joint->s.x = p_joint->s.y = p_joint->s.z = 1.0f;
  191. null_free((void **) &p_joint->p_scs);
  192. }
  193. }
  194. void zrus_kosti_rec(JOINT ** p_joint)
  195. {
  196. if (*p_joint) {
  197. if ((*p_joint)->p_child)
  198. zrus_kosti_rec(&((*p_joint)->p_child));
  199. if ((*p_joint)->p_next)
  200. zrus_kosti_rec(&((*p_joint)->p_next));
  201. if ((*p_joint)->p_keys)
  202. zrus_kosti_key(&((*p_joint)->p_keys));
  203. null_free((void **) &(*p_joint)->p_vertexlist);
  204. null_free((void **) &(*p_joint)->p_pos);
  205. null_free((void **) &(*p_joint)->p_rot);
  206. null_free((void **) &(*p_joint)->p_scs);
  207. null_free((void **) &(*p_joint));
  208. p_joint = NULL;
  209. }
  210. }
  211. void zrus_kosti(EDIT_OBJEKT * p_obj)
  212. {
  213. JOINT_ANIMACE *p_tmp = p_obj->p_joit_animace, *p_next;
  214. while (p_tmp) {
  215. p_next = p_tmp->p_next;
  216. if (p_tmp->p_child)
  217. zrus_kosti_rec(&p_tmp->p_child);
  218. free(p_tmp);
  219. p_tmp = p_next;
  220. }
  221. }
  222. void zrus_objekt(EDIT_OBJEKT ** p_obj)
  223. {
  224. zrus_kosti(*p_obj);
  225. if ((*p_obj)->p_tmp_sim) {
  226. key_sim_zrus_vnitrek((*p_obj)->p_tmp_sim);
  227. null_free((void **) &(*p_obj)->p_tmp_sim);
  228. }
  229. null_free((void **) &(*p_obj)->p_face);
  230. null_free((void **) &(*p_obj)->p_opt);
  231. null_free((void **) &(*p_obj)->p_vertex);
  232. null_free((void **) &(*p_obj)->p_line);
  233. null_free((void **) p_obj);
  234. }
  235. int smaz_divoke_vertexy_objektu_dir(EDIT_OBJEKT * p_obj)
  236. {
  237. OBJ_VERTEX *p_vert = p_obj->p_vertex;
  238. byte *p_div;
  239. word *p_face = p_obj->p_face;
  240. int i, j, vn = p_obj->vertexnum, od, fn = p_obj->facenum;
  241. if (!vn || !fn)
  242. return (TRUE);
  243. if ((p_div = (byte *) mmalloc(sizeof(byte) * vn)) == NULL) {
  244. chyba("pamet");
  245. }
  246. memset(p_div, 1, sizeof(byte) * vn);
  247. for (i = 0; i < fn; i += 3) {
  248. p_div[p_face[i]] = p_div[p_face[i + 1]] = p_div[p_face[i + 2]] = 0;
  249. }
  250. for (i = 0, od = 0; i < vn + od; i++) {
  251. if (p_div[i]) {
  252. smaz_vertex_bez_facu(p_vert, vn, (i - od));
  253. for (j = 0; j < fn; j += 3) {
  254. if (p_face[j] > i - od)
  255. p_face[j]--;
  256. if (p_face[j + 1] > i - od)
  257. p_face[j + 1]--;
  258. if (p_face[j + 2] > i - od)
  259. p_face[j + 2]--;
  260. }
  261. od++;
  262. }
  263. }
  264. free(p_div);
  265. p_obj->vertexnum -= od;
  266. return (od);
  267. }
  268. EDIT_OBJEKT *kopiruj_objekt(EDIT_OBJEKT * p_src)
  269. {
  270. EDIT_OBJEKT *p_cil;
  271. if (!p_src)
  272. return (p_src);
  273. p_cil = (EDIT_OBJEKT *) kopiruj_pole(p_src, sizeof(p_src[0]));
  274. p_cil->p_vertex =
  275. (OBJ_VERTEX *) kopiruj_pole(p_src->p_vertex,
  276. sizeof(OBJ_VERTEX) * p_cil->vertexnum);
  277. p_cil->p_vertex_kosti =
  278. (BOD *) kopiruj_pole(p_src->p_vertex_kosti,
  279. sizeof(p_src->p_vertex_kosti[0]) * p_cil->vertexnum);
  280. p_cil->p_face =
  281. (FACE *) kopiruj_pole(p_src->p_face, sizeof(FACE) * p_cil->facenum);
  282. p_cil->p_opt =
  283. (int *) kopiruj_pole(p_src->p_opt,
  284. sizeof(p_src->p_opt[0]) * p_src->optnum);
  285. p_cil->p_line = NULL;
  286. p_cil->p_joit_animace = key_kosti_kopiruj_animace(p_src->p_joit_animace);
  287. return (p_cil);
  288. }
  289. /* kopiruje
  290. */
  291. void kopiruj_objekt_geometrie(EDIT_OBJEKT * p_src, EDIT_OBJEKT * p_cil)
  292. {
  293. if (!p_src)
  294. return;
  295. free(p_cil->p_vertex);
  296. p_cil->vertexnum = p_src->vertexnum;
  297. p_cil->p_vertex =
  298. (OBJ_VERTEX *) mmalloc(sizeof(OBJ_VERTEX) * p_cil->vertexnum);
  299. // mtest(p_cil->p_vertex);
  300. memcpy(p_cil->p_vertex, p_src->p_vertex,
  301. sizeof(OBJ_VERTEX) * p_cil->vertexnum);
  302. free(p_cil->p_face);
  303. p_cil->facenum = p_src->facenum;
  304. p_cil->p_face = (FACE *) mmalloc(sizeof(FACE) * p_cil->facenum);
  305. // mtest(p_cil->p_face);
  306. memcpy(p_cil->p_face, p_src->p_face, sizeof(FACE) * p_cil->facenum);
  307. }
  308. EDIT_OBJEKT *kopiruj_objekt_indir_vyber(EDIT_OBJEKT * p_src,
  309. EDIT_OBJEKT * p_cil, int flag)
  310. {
  311. int i;
  312. if (!p_src || !p_cil)
  313. return (NULL);
  314. for (i = 0; i < p_cil->vertexnum; i++) {
  315. if (flag & COPY_GEOMETRY) {
  316. p_cil->p_vertex[i].x = p_src->p_vertex[i].x;
  317. p_cil->p_vertex[i].y = p_src->p_vertex[i].y;
  318. p_cil->p_vertex[i].z = p_src->p_vertex[i].z;
  319. }
  320. if (flag & COPY_DIFFUSE) {
  321. p_cil->p_vertex[i].dr = p_src->p_vertex[i].dr;
  322. p_cil->p_vertex[i].dg = p_src->p_vertex[i].dg;
  323. p_cil->p_vertex[i].db = p_src->p_vertex[i].db;
  324. p_cil->p_vertex[i].da = p_src->p_vertex[i].da;
  325. p_cil->p_vertex[i].mdr = p_src->p_vertex[i].mdr;
  326. p_cil->p_vertex[i].mdg = p_src->p_vertex[i].mdg;
  327. p_cil->p_vertex[i].mdb = p_src->p_vertex[i].mdb;
  328. p_cil->p_vertex[i].mda = p_src->p_vertex[i].mda;
  329. }
  330. if (flag & COPY_SPECULAR) {
  331. p_cil->p_vertex[i].sr = p_src->p_vertex[i].sr;
  332. p_cil->p_vertex[i].sg = p_src->p_vertex[i].sg;
  333. p_cil->p_vertex[i].sb = p_src->p_vertex[i].sb;
  334. p_cil->p_vertex[i].msr = p_src->p_vertex[i].msr;
  335. p_cil->p_vertex[i].msg = p_src->p_vertex[i].msg;
  336. p_cil->p_vertex[i].msb = p_src->p_vertex[i].msb;
  337. }
  338. if (flag & COPY_MAP1) {
  339. p_cil->p_vertex[i].tu1 = p_src->p_vertex[i].tu1;
  340. p_cil->p_vertex[i].tv1 = p_src->p_vertex[i].tv1;
  341. }
  342. if (flag & COPY_MAP2) {
  343. p_cil->p_vertex[i].tu2 = p_src->p_vertex[i].tu2;
  344. p_cil->p_vertex[i].tv2 = p_src->p_vertex[i].tv2;
  345. }
  346. }
  347. if (flag & COPY_MATERIAL) {
  348. p_cil->material = p_src->material;
  349. }
  350. return (p_cil);
  351. }
  352. EDIT_OBJEKT *slep_objekty(EDIT_OBJEKT * p_obj1, EDIT_OBJEKT * p_obj2)
  353. {
  354. EDIT_OBJEKT *p_obj = vyrob_objekt();
  355. int i;
  356. int f1, f2;
  357. if (strlen(p_obj1->jmeno) + strlen(p_obj2->jmeno) + 1 >= MAX_JMENO) {
  358. strcpy(p_obj->jmeno, p_obj1->jmeno);
  359. }
  360. else {
  361. sprintf(p_obj->jmeno, "%s_%s", p_obj1->jmeno, p_obj2->jmeno);
  362. }
  363. assert(strlen(p_obj->jmeno) < MAX_JMENO);
  364. p_obj->vertexnum = p_obj1->vertexnum + p_obj2->vertexnum;
  365. if ((p_obj->p_vertex =
  366. (OBJ_VERTEX *) malloc(sizeof(OBJ_VERTEX) * p_obj->vertexnum)) == NULL) {
  367. zrus_objekt(&p_obj);
  368. return (NULL);
  369. }
  370. memcpy(p_obj->p_vertex, p_obj1->p_vertex,
  371. sizeof(OBJ_VERTEX) * p_obj1->vertexnum);
  372. memcpy(p_obj->p_vertex + p_obj1->vertexnum, p_obj2->p_vertex,
  373. sizeof(OBJ_VERTEX) * p_obj2->vertexnum);
  374. p_obj->facenum = p_obj1->facenum + p_obj2->facenum;
  375. if ((p_obj->p_face =
  376. (FACE *) mmalloc(sizeof(FACE) * p_obj->facenum)) == NULL) {
  377. zrus_objekt(&p_obj);
  378. return (NULL);
  379. }
  380. memcpy(p_obj->p_face, p_obj1->p_face, sizeof(FACE) * p_obj1->facenum);
  381. f1 = p_obj1->facenum;
  382. f2 = (p_obj2->facenum + f1);
  383. for (i = f1; i < f2; i++)
  384. p_obj->p_face[i] = p_obj1->vertexnum + p_obj2->p_face[i - f1];
  385. p_obj->material = p_obj1->material;
  386. p_obj->m1flag = p_obj1->m1flag;
  387. p_obj->m2flag = p_obj1->m2flag;
  388. p_obj->oflag = p_obj1->oflag;
  389. return (p_obj);
  390. }
  391. /* **************************************************
  392. Kontejner
  393. */
  394. EDIT_KONTEJNER *vyrob_kontejner(void)
  395. {
  396. EDIT_KONTEJNER *p_kont;
  397. if ((p_kont = (EDIT_KONTEJNER *) mmalloc(sizeof(EDIT_KONTEJNER))) == NULL)
  398. chyba("pamet!");
  399. memset(p_kont, 0, sizeof(p_kont[0]));
  400. p_kont->max_objektu = MAX_KONT_OBJEKTU;
  401. p_kont->kreslit = 1;
  402. p_kont->prvek = K_CHYBA;
  403. p_kont->kflag |= KONT_STATIC;
  404. p_kont->kontejner_ID = K_CHYBA; // defaultni id kontejneru
  405. init_matrix(&p_kont->world); // globalni transformacni matice
  406. init_matrix(&p_kont->mpmatrix); // lokalni transformacni matice (mp matrix)
  407. return (p_kont);
  408. }
  409. void zrus_kontejner(EDIT_KONTEJNER ** pp_kont, MLZNA_KOSTKA ** p_first)
  410. {
  411. int i;
  412. EDIT_KONTEJNER *p_kont;
  413. p_kont = *pp_kont;
  414. for (i = 0; i < p_kont->max_objektu; i++) {
  415. if (p_kont->p_obj[i]) {
  416. zrus_objekt(&p_kont->p_obj[i]);
  417. }
  418. }
  419. if (p_kont->p_mlha)
  420. zrus_mlhokostku(p_first, p_kont->p_mlha);
  421. for (i = 0; i < KONT_MAX_ANIM; i++) {
  422. key_sim_root_zrus(p_kont->sim + i);
  423. }
  424. free(p_kont);
  425. *pp_kont = NULL;
  426. }
  427. void zrus_kontejner_rec(EDIT_KONTEJNER ** pp_kont, MLZNA_KOSTKA ** p_first)
  428. {
  429. int i;
  430. EDIT_KONTEJNER *p_kont, *p_next;
  431. p_kont = *pp_kont;
  432. while (p_kont) {
  433. for (i = 0; i < p_kont->max_objektu; i++) {
  434. if (p_kont->p_obj[i]) {
  435. zrus_objekt(&p_kont->p_obj[i]);
  436. }
  437. }
  438. if (p_kont->p_mlha)
  439. zrus_mlhokostku(p_first, p_kont->p_mlha);
  440. for (i = 0; i < KONT_MAX_ANIM; i++) {
  441. key_sim_root_zrus(p_kont->sim + i);
  442. }
  443. p_next = p_kont->p_next;
  444. free(p_kont);
  445. p_kont = p_next;
  446. }
  447. *pp_kont = NULL;
  448. }
  449. void vyprazdni_kontejner(EDIT_KONTEJNER * p_kont)
  450. {
  451. int i;
  452. if (!p_kont)
  453. return;
  454. for (i = 0; i < p_kont->max_objektu; i++) {
  455. if (p_kont->p_obj[i])
  456. zrus_objekt(&p_kont->p_obj[i]);
  457. }
  458. updatuj_kontejner_statistika(p_kont, TRUE);
  459. }
  460. void updatuj_kontejner_flag(EDIT_KONTEJNER * p_kont, EDIT_MATERIAL ** p_mat)
  461. {
  462. int o, m;
  463. while (p_kont) {
  464. p_kont->m1flag = p_kont->m2flag = 0;
  465. for (o = 0; o < p_kont->max_objektu; o++) {
  466. if (p_kont->p_obj[o]) {
  467. m = p_kont->p_obj[o]->material;
  468. if (p_mat[m]) {
  469. p_kont->p_obj[o]->m1flag |= p_mat[m]->flag;
  470. p_kont->p_obj[o]->m2flag |= p_mat[m]->flag2;
  471. }
  472. p_kont->m1flag |= p_kont->p_obj[o]->m1flag;
  473. p_kont->m2flag |= p_kont->p_obj[o]->m2flag;
  474. p_kont->kflag |= p_kont->p_obj[o]->oflag;
  475. }
  476. }
  477. p_kont = p_kont->p_next;
  478. }
  479. }
  480. void updatuj_obalku_kontejner(EDIT_KONTEJNER * p_kont)
  481. {
  482. int i;
  483. if (!p_kont)
  484. return;
  485. for (i = 0; i < p_kont->max_objektu; i++) {
  486. if (p_kont->p_obj[i]) {
  487. obb_calc_obj_fast(p_kont->p_obj[i]);
  488. }
  489. }
  490. kontejner_obalka(p_kont);
  491. }
  492. void updatuj_kontejner_statistika(EDIT_KONTEJNER * p_kont, int obalky)
  493. {
  494. int i, j, f, v;
  495. while (p_kont) {
  496. for (i = 0, j = 0, f = 0, v = 0; i < p_kont->max_objektu; i++) {
  497. if (p_kont->p_obj[i]) {
  498. f += p_kont->p_obj[i]->facenum;
  499. v += p_kont->p_obj[i]->vertexnum;
  500. p_kont->m1flag |= p_kont->p_obj[i]->m1flag;
  501. p_kont->m2flag |= p_kont->p_obj[i]->m2flag;
  502. p_kont->kflag |= p_kont->p_obj[i]->oflag;
  503. j++;
  504. }
  505. }
  506. p_kont->objektu = j;
  507. p_kont->facu = f;
  508. p_kont->bodu = v;
  509. vycisti_kontejner(p_kont);
  510. if (obalky)
  511. updatuj_obalku_kontejner(p_kont);
  512. p_kont = p_kont->p_next;
  513. }
  514. }
  515. void smaz_divoke_vertexy_kontejneru(EDIT_KONTEJNER * p_kont)
  516. {
  517. int i;
  518. if (p_kont) {
  519. for (i = 0; i < p_kont->max_objektu; i++) {
  520. if (p_kont->p_obj[i] && !p_kont->p_obj[i]->p_joit_animace)
  521. smaz_divoke_vertexy_objektu_dir(p_kont->p_obj[i]);
  522. }
  523. }
  524. }
  525. void vycisti_kontejner(EDIT_KONTEJNER * p_kont)
  526. {
  527. int i;
  528. if (!p_kont)
  529. return;
  530. smaz_divoke_vertexy_kontejneru(p_kont);
  531. for (i = 0; i < p_kont->max_objektu; i++) {
  532. if (p_kont->p_obj[i] && (!p_kont->p_obj[i]->vertexnum
  533. || !p_kont->p_obj[i]->facenum))
  534. zrus_objekt(&p_kont->p_obj[i]);
  535. }
  536. }
  537. // posune objekty v kontejneru k sobe a pojmenuje je jednotne
  538. void preindexuj_kontejner(EDIT_KONTEJNER * p_kont)
  539. {
  540. int i, j;
  541. for (i = 0, j = 0; i < p_kont->max_objektu; i++) {
  542. if (!p_kont->p_obj[i])
  543. continue;
  544. if (j != i) {
  545. p_kont->p_obj[j] = p_kont->p_obj[i];
  546. p_kont->p_obj[i] = NULL;
  547. }
  548. j++;
  549. }
  550. }
  551. int slep_kontejner(EDIT_KONTEJNER * p_kont)
  552. {
  553. EDIT_OBJEKT *p_obj;
  554. int i, j, ob;
  555. // 1000 je MAX_EDIT_MATERIALU
  556. for (i = 0; i < 1000 /*MAX_EDIT_MATERIALU */ ; i++) {
  557. for (j = 0; j < p_kont->max_objektu; j++) {
  558. if (p_kont->p_obj[j] && p_kont->p_obj[j]->material == i) {
  559. ob = j;
  560. break;
  561. }
  562. }
  563. if (j == p_kont->max_objektu)
  564. continue;
  565. for (j = ob + 1; j < p_kont->max_objektu; j++) {
  566. if (p_kont->p_obj[j] && p_kont->p_obj[j]->material == i) {
  567. p_obj = slep_objekty(p_kont->p_obj[ob], p_kont->p_obj[j]);
  568. zrus_objekt(&p_kont->p_obj[ob]);
  569. zrus_objekt(&p_kont->p_obj[j]);
  570. p_kont->p_obj[ob] = p_obj;
  571. }
  572. }
  573. }
  574. updatuj_kontejner_statistika(p_kont, TRUE);
  575. preindexuj_kontejner(p_kont);
  576. return (TRUE);
  577. }
  578. /*
  579. Slepi 2 objekty, pokud jsou od sebe vzdaleny mene nez min_dist
  580. */
  581. #define SLEP_FACE_LIMIT 500
  582. int slep_kontejner_dist(EDIT_KONTEJNER * p_kont, float min_dist)
  583. {
  584. GLMATRIX *p_tmp;
  585. EDIT_OBJEKT *p_obj1, *p_obj2;
  586. int i1, i2;
  587. p_tmp = kont_world_matrix(p_kont);
  588. // vraci pocet unikatnich materialu
  589. lo_setrid_kontejner(p_kont);
  590. for (i1 = 0, i2 = 1; i2 < p_kont->max_objektu;) {
  591. p_obj1 = p_kont->p_obj[i1];
  592. p_obj2 = p_kont->p_obj[i2];
  593. if (!p_obj2 || p_obj2->p_joit_animace) {
  594. i2++;
  595. continue;
  596. }
  597. if (!p_obj1 || p_obj1->p_joit_animace
  598. || p_obj1->material != p_obj2->material) {
  599. i1++;
  600. i2++;
  601. continue;
  602. }
  603. if (p_obj1->facenum + p_obj2->facenum > SLEP_FACE_LIMIT) {
  604. i1++;
  605. i2++;
  606. continue;
  607. }
  608. if (vzdal_bodu_bod(&p_obj1->obb.obb_stred,
  609. &p_obj2->obb.obb_stred) < min_dist) {
  610. p_kont->p_obj[i1] = slep_objekty(p_obj1, p_obj2);
  611. p_kont->p_obj[i2] = NULL;
  612. obb_calc_obj_fast(p_kont->p_obj[i1]);
  613. zrus_objekt(&p_obj1);
  614. zrus_objekt(&p_obj2);
  615. i2++;
  616. }
  617. else {
  618. i1++;
  619. i2++;
  620. }
  621. }
  622. preindexuj_kontejner(p_kont);
  623. updatuj_kontejner_statistika(p_kont, TRUE);
  624. return (TRUE);
  625. }
  626. /* Kopie kontejneru */
  627. EDIT_KONTEJNER *kopiruj_kontejner(EDIT_KONTEJNER * p_src,
  628. EDIT_MATERIAL ** p_smat, EDIT_MATERIAL ** p_dmat, int dmatnum,
  629. STATIC_LIGHT * p_slight, int slightnum, DYN_LIGHT * p_dlight, int dlightnum,
  630. EXTRA_DYN_LIGHT * p_elight, int elightnum, LENS_FLARE * p_flare,
  631. int maxflares)
  632. {
  633. EDIT_KONTEJNER *p_dest = NULL;
  634. EDIT_KONTEJNER *p_dest_top = NULL;
  635. int i, mat;
  636. while (p_src) {
  637. if (!p_dest) {
  638. p_dest_top = p_dest = vyrob_kontejner();
  639. }
  640. else {
  641. p_dest = (p_dest->p_next = vyrob_kontejner());
  642. }
  643. *p_dest = *p_src;
  644. if (p_src->p_mlha) {
  645. p_dest->p_mlha = kopiruj_mlhokostku(p_src->p_mlha, p_dest->jmeno);
  646. p_dest->p_mlha->p_kont = p_dest;
  647. }
  648. // Prekopiruju svetla
  649. lo_kopiruj_svetla_do_sceny(p_dest, p_slight, slightnum, p_dlight,
  650. dlightnum, p_elight, elightnum, p_flare, maxflares);
  651. for (i = 0; i < MAX_KONT_OBJEKTU; i++) {
  652. if (p_src->p_obj[i]) {
  653. p_dest->p_obj[i] = kopiruj_objekt(p_src->p_obj[i]);
  654. if (p_smat) {
  655. mat =
  656. lo_najdi_material(p_dmat, dmatnum,
  657. p_smat[p_src->p_obj[i]->material]->jmeno);
  658. if (mat == K_CHYBA) {
  659. mat = lo_najdi_prazdny_material(p_dmat, dmatnum);
  660. if (mat == K_CHYBA)
  661. continue;
  662. p_dmat[mat] = kopiruj_material(p_smat[p_src->p_obj[i]->material]);
  663. }
  664. p_dest->p_obj[i]->material = mat;
  665. }
  666. }
  667. }
  668. // kopie stromu animacniho stromu ...
  669. if (p_src->kflag & KONT_KEYFRAME) {
  670. for (i = 0; i < KONT_MAX_ANIM; i++) {
  671. if (p_src->sim[i].keynum)
  672. key_sim_root_to_sim_root_indir(p_dest, p_dest->sim + i,
  673. p_src->sim + i);
  674. }
  675. }
  676. p_src = p_src->p_next;
  677. }
  678. return (p_dest_top);
  679. }
  680. EDIT_KONTEJNER *kopiruj_kontejner_indir_vyber(EDIT_KONTEJNER * p_src,
  681. EDIT_KONTEJNER * p_dest, int flag)
  682. {
  683. int i;
  684. for (i = 0; i < MAX_KONT_OBJEKTU; i++) {
  685. if (p_src->p_obj[i] && p_dest->p_obj[i]) {
  686. kopiruj_objekt_indir_vyber(p_src->p_obj[i], p_dest->p_obj[i], flag);
  687. }
  688. }
  689. return (p_dest);
  690. }
  691. int lo_setrid_kontejner_compare(const void *p_o1, const void *p_o2)
  692. {
  693. EDIT_OBJEKT **p_obj1 = (EDIT_OBJEKT **) p_o1;
  694. EDIT_OBJEKT **p_obj2 = (EDIT_OBJEKT **) p_o2;
  695. int o1 = INT_MAX, o2 = INT_MAX;
  696. float d1, d2;
  697. if (*p_obj1) {
  698. o1 = ((EDIT_OBJEKT *) * p_obj1)->material;
  699. }
  700. if (*p_obj2) {
  701. o2 = ((EDIT_OBJEKT *) * p_obj2)->material;
  702. }
  703. if (!(*p_obj1) || !(*p_obj2)) {
  704. if (o1 < o2)
  705. return (-1);
  706. if (o1 == o2)
  707. return (0);
  708. else
  709. return (1);
  710. }
  711. if (o1 < o2) // o1 je mensi nez o2
  712. return (-1);
  713. if (o1 == o2) {
  714. d1 = vektor_velikost(&(((EDIT_OBJEKT *) * p_obj1)->obb.obb_stred));
  715. d2 = vektor_velikost(&(((EDIT_OBJEKT *) * p_obj2)->obb.obb_stred));
  716. if (d1 < d2)
  717. return (-1);
  718. if (d1 > d2)
  719. return (1);
  720. else
  721. return (0);
  722. }
  723. else
  724. return (1); // o2 je vetsi nez o1
  725. }
  726. /* setridi staticky kontejner podle pouzitych materialu
  727. da stejne materily k sobe
  728. */
  729. int lo_setrid_kontejner(EDIT_KONTEJNER * p_kont)
  730. {
  731. GLMATRIX *p_tmp;
  732. int mat = 0, i, am = INT_MAX;
  733. if (p_kont->kflag & KONT_KEYFRAME)
  734. return (0);
  735. p_tmp = kont_world_matrix(p_kont);
  736. for (i = 0; i < p_kont->max_objektu; i++) {
  737. if (p_kont->p_obj[i])
  738. obb_calc_obj_fast(p_kont->p_obj[i]);
  739. }
  740. qsort((void *) p_kont->p_obj, (size_t) p_kont->max_objektu,
  741. (size_t) sizeof(EDIT_OBJEKT *), lo_setrid_kontejner_compare);
  742. for (i = 0; i < MAX_KONT_OBJEKTU; i++) {
  743. if (p_kont->p_obj[i] && p_kont->p_obj[i]->material != am) {
  744. am = p_kont->p_obj[i]->material;
  745. mat++;
  746. }
  747. }
  748. return (mat);
  749. }
  750. /* **************************************************************************
  751. Setrideni kontejneru podle materialu
  752. */
  753. int lo_setrid_kontejner_materialy_compare(const void *p_o1, const void *p_o2)
  754. {
  755. EDIT_OBJEKT **p_obj1 = (EDIT_OBJEKT **) p_o1;
  756. EDIT_OBJEKT **p_obj2 = (EDIT_OBJEKT **) p_o2;
  757. int o1 = INT_MAX, o2 = INT_MAX;
  758. if (*p_obj1) {
  759. o1 = ((EDIT_OBJEKT *) * p_obj1)->material;
  760. }
  761. if (*p_obj2) {
  762. o2 = ((EDIT_OBJEKT *) * p_obj2)->material;
  763. }
  764. if (!(*p_obj1) || !(*p_obj2)) {
  765. if (o1 < o2)
  766. return (-1);
  767. if (o1 == o2)
  768. return (0);
  769. else
  770. return (1);
  771. }
  772. return (o1 - o2);
  773. }
  774. /* setridi staticky kontejner podle pouzitych materialu
  775. da stejne materily k sobe
  776. */
  777. void lo_setrid_kontejner_materialy(EDIT_KONTEJNER * p_kont)
  778. {
  779. if (!(p_kont->kflag & KONT_KEYFRAME)) {
  780. qsort((void *) p_kont->p_obj, (size_t) p_kont->max_objektu,
  781. (size_t) sizeof(EDIT_OBJEKT *), lo_setrid_kontejner_materialy_compare);
  782. }
  783. }
  784. /* **************************************************
  785. Animace
  786. */
  787. void zrus_tri_vnitrek(HIERARCHY_TRACK_INFO * p_tri)
  788. {
  789. null_free((void **) &p_tri->p_pkeys);
  790. null_free((void **) &p_tri->p_pos);
  791. null_free((void **) &p_tri->p_rkeys);
  792. null_free((void **) &p_tri->p_at);
  793. null_free((void **) &p_tri->p_scale);
  794. null_free((void **) &p_tri->p_skeys);
  795. }
  796. void zrus_tri(HIERARCHY_TRACK_INFO ** p_trii)
  797. {
  798. zrus_tri_vnitrek(*p_trii);
  799. free(*p_trii);
  800. *p_trii = NULL;
  801. }
  802. void key_root_zrus_rec(HIERARCHY_TRACK_INFO * p_tri)
  803. {
  804. int i;
  805. for (i = 0; i < p_tri->childnum; i++) {
  806. assert(p_tri->p_child[i]);
  807. key_root_zrus_rec(p_tri->p_child[i]);
  808. }
  809. zrus_tri(&p_tri);
  810. }
  811. // zrusi animacni strom
  812. void key_root_zrus(HIERARCHY_ROOT * p_root)
  813. {
  814. int i;
  815. if (p_root->framenum) {
  816. for (i = 0; i < p_root->childnum; i++) {
  817. assert(p_root->p_child[i]);
  818. key_root_zrus_rec(p_root->p_child[i]);
  819. }
  820. memset(p_root, 0, sizeof(*p_root));
  821. }
  822. }
  823. /* *******************************************************
  824. Materialy
  825. */
  826. EDIT_MATERIAL *vyrob_material(void)
  827. {
  828. EDIT_MATERIAL *p_mat;
  829. int i;
  830. if ((p_mat = (EDIT_MATERIAL *) mmalloc(sizeof(EDIT_MATERIAL))) == NULL) {
  831. chyba("pamet");
  832. }
  833. memset(p_mat, 0, sizeof(EDIT_MATERIAL));
  834. p_mat->dxmat.diffuse_r = 1.0f;
  835. p_mat->dxmat.diffuse_g = 1.0f;
  836. p_mat->dxmat.diffuse_b = 1.0f;
  837. p_mat->dxmat.diffuse_a = 1.0f;
  838. p_mat->dxmat.specular_r = 0.0f;
  839. p_mat->dxmat.specular_g = 0.0f;
  840. p_mat->dxmat.specular_b = 0.0f;
  841. p_mat->dxmat.faktor_r = 1.0f;
  842. p_mat->dxmat.faktor_g = 1.0f;
  843. p_mat->dxmat.faktor_b = 1.0f;
  844. p_mat->dxmat.faktor_a = 1.0f;
  845. p_mat->lesk = 1.0f;
  846. p_mat->flag2 |= (MAT2_DIFFUSE | MAT2_DIFFUSE_RAY | MAT2_MAP1);
  847. mat_default_stage_bloky(p_mat);
  848. for (i = 0; i < MAT_TEXTUR; i++) {
  849. init_matrix(p_mat->ttext + i);
  850. }
  851. p_mat->env_scale = 1.0f;
  852. return (p_mat);
  853. }
  854. void zrus_material(EDIT_MATERIAL ** p_mat)
  855. {
  856. int i, j;
  857. if ((*p_mat)->flag & MAT_ANIM_FRAME)
  858. lo_zrus_animaci(&(*p_mat)->anim);
  859. for (j = 0; j < MAT_TEXTUR; j++) {
  860. for (i = 0; i < MAX_TEXT_ANIM; i++) {
  861. if ((*p_mat)->p_atext[j][i])
  862. key_zrus_material_animace((*p_mat)->p_atext[j] + i);
  863. }
  864. }
  865. if ((*p_mat)->p_sub)
  866. zrus_material(&((*p_mat)->p_sub));
  867. null_free((void **) p_mat);
  868. *p_mat = NULL;
  869. }
  870. void lo_zrus_material_kont(EDIT_KONTEJNER * p_kont, EDIT_MATERIAL ** p_list,
  871. int num)
  872. {
  873. EDIT_OBJEKT *p_obj;
  874. int o;
  875. oe_olist_reset(&o);
  876. while ((p_obj = oe_olist_next(p_kont, &o))) {
  877. if (p_obj->material < num && p_list[p_obj->material])
  878. zrus_material(p_list + p_obj->material);
  879. }
  880. }
  881. EDIT_MATERIAL *kopiruj_material_indir(EDIT_MATERIAL * p_src,
  882. EDIT_MATERIAL * p_dest)
  883. {
  884. int i, j;
  885. if (!p_src || !p_dest)
  886. return (NULL);
  887. memcpy(p_dest, p_src, sizeof(EDIT_MATERIAL));
  888. // kopie animaci
  889. if (p_src->flag & MAT_ANIM_FRAME) {
  890. p_dest->anim.p_frame =
  891. (ANIM_FRAME *) mmalloc(sizeof(ANIM_FRAME) * p_dest->anim.framenum);
  892. memcpy(p_dest->anim.p_frame, p_src->anim.p_frame,
  893. sizeof(ANIM_FRAME) * p_dest->anim.framenum);
  894. }
  895. // kopie animaci 1
  896. for (j = 0; j < MAT_TEXTUR; j++) {
  897. for (i = 0; i < MAX_TEXT_ANIM; i++) {
  898. if (p_src->p_atext[j][i])
  899. p_dest->p_atext[j][i] =
  900. key_kopiruj_material_animace(p_src->p_atext[j][i]);
  901. }
  902. }
  903. p_dest->p_sub = NULL;
  904. return (p_dest);
  905. }
  906. EDIT_MATERIAL *kopiruj_material(EDIT_MATERIAL * p_src)
  907. {
  908. EDIT_MATERIAL *p_dest;
  909. if (!p_src)
  910. return (NULL);
  911. p_dest = (EDIT_MATERIAL *) mmalloc(sizeof(EDIT_MATERIAL));
  912. return (kopiruj_material_indir(p_src, p_dest));
  913. }
  914. /* ****************************************************
  915. Dalsi
  916. */
  917. #define miror(promena)\
  918. {\
  919. for(i = 0; i < p_dest->vertexnum; i++) {\
  920. stred += promena;\
  921. }\
  922. stred /= (float)p_dest->vertexnum;\
  923. for(i = 0; i < p_dest->vertexnum; i++) {\
  924. if(promena > stred)\
  925. promena -= (promena - stred);\
  926. else\
  927. promena += (stred - promena);\
  928. } \
  929. }\
  930. /* *******************************************************
  931. Mesh
  932. */
  933. GAME_MESH_OLD *kopiruj_mesh(GAME_MESH_OLD * p_src, GAME_MESH_DATA * p_data)
  934. {
  935. GAME_MESH_OLD *p_dest = vyrob_mesh(p_src->objektu, p_data);
  936. int i;
  937. if (!p_dest)
  938. chyba("Pamet!");
  939. if (!p_data)
  940. kopiruj_mesh_data(p_src->p_data, p_dest, p_dest->p_data);
  941. p_dest->vertexnum = p_src->vertexnum;
  942. p_dest->objektu = p_src->objektu;
  943. p_dest->facevel = p_src->facevel;
  944. p_dest->p_vertex_pos =
  945. (BOD *) kopiruj_pole(p_src->p_vertex_pos,
  946. sizeof(p_src->p_vertex_pos[0]) * p_src->vertexnum);
  947. p_dest->p_vertex_norm =
  948. (BOD *) kopiruj_pole(p_src->p_vertex_norm,
  949. sizeof(p_dest->p_vertex_norm[0]) * p_src->vertexnum);
  950. p_dest->p_vertex_diff =
  951. (BODRGBA *) kopiruj_pole(p_src->p_vertex_diff,
  952. sizeof(p_dest->p_vertex_diff[0]) * p_src->vertexnum);
  953. p_dest->p_vertex_diff_material =
  954. (BODRGBA *) kopiruj_pole(p_src->p_vertex_diff_material,
  955. sizeof(p_dest->p_vertex_diff_material[0]) * p_src->vertexnum);
  956. p_dest->p_vertex_spec =
  957. (BODRGB *) kopiruj_pole(p_src->p_vertex_spec,
  958. sizeof(p_dest->p_vertex_spec[0]) * p_src->vertexnum);
  959. p_dest->p_vertex_spec_material =
  960. (BODRGB *) kopiruj_pole(p_src->p_vertex_spec_material,
  961. sizeof(p_dest->p_vertex_spec_material[0]) * p_src->vertexnum);
  962. p_dest->p_vertex_uv1_material =
  963. (BODUV *) kopiruj_pole(p_src->p_vertex_uv1_material,
  964. sizeof(p_dest->p_vertex_uv1_material[0]) * p_src->vertexnum);
  965. p_dest->p_vertex_uv2_material =
  966. (BODUV *) kopiruj_pole(p_src->p_vertex_uv2_material,
  967. sizeof(p_dest->p_vertex_uv2_material[0]) * p_src->vertexnum);
  968. memcpy(p_dest->objektnum, p_src->objektnum,
  969. sizeof(p_src->objektnum[0]) * p_src->objektu);
  970. memcpy(p_dest->objektstart, p_src->objektstart,
  971. sizeof(p_src->objektstart[0]) * p_src->objektu);
  972. memcpy(p_dest->facenum, p_src->facenum,
  973. sizeof(p_src->facenum[0]) * p_src->objektu);
  974. memcpy(p_dest->facestart, p_src->facestart,
  975. sizeof(p_src->facestart[0]) * p_src->objektu);
  976. memcpy(p_dest->p_mat, p_src->p_mat,
  977. sizeof(p_src->p_mat[0]) * p_src->objektu);
  978. p_dest->p_face =
  979. (int *) mmalloc(sizeof(p_dest->p_face[0]) * p_src->facevel);
  980. memcpy(p_dest->p_face, p_src->p_face,
  981. sizeof(p_dest->p_face[0]) * p_src->facevel);
  982. p_dest->simnum = p_src->simnum;
  983. if (p_dest->simnum) {
  984. p_dest->p_sim =
  985. (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_dest->p_sim[0]) *
  986. p_dest->simnum);
  987. for (i = 0; i < p_dest->simnum; i++) {
  988. key_sim_to_sim_indir(p_dest->p_sim + i, p_src->p_sim + i);
  989. }
  990. }
  991. return (p_dest);
  992. }
  993. /* Kopie Mesh-Dat
  994. */
  995. GAME_MESH_DATA *kopiruj_mesh_data(GAME_MESH_DATA * p_src,
  996. GAME_MESH_OLD * p_mesh_top, GAME_MESH_DATA * p_desc)
  997. {
  998. struct _STATIC_LIGHT *p_lss, *p_lsd;
  999. struct _DYN_LIGHT *p_lds, *p_ldd;
  1000. struct _EXTRA_DYN_LIGHT *p_les, *p_led;
  1001. if (!p_src || !p_desc)
  1002. return (NULL);
  1003. p_desc->p_mesh = p_mesh_top;
  1004. p_desc->kflag = p_src->kflag;
  1005. p_desc->m1flag = p_src->m1flag;
  1006. p_desc->m2flag = p_src->m2flag;
  1007. p_desc->mesh_handle = p_src->mesh_handle;
  1008. p_desc->mesh_ID = p_src->mesh_ID;
  1009. p_desc->slightnum = p_src->slightnum;
  1010. p_desc->lightmax = p_src->lightmax;
  1011. p_desc->lightakt = p_src->lightakt;
  1012. if (p_src->lightmax && p_src->p_light) {
  1013. p_desc->p_light = (void **) mmalloc(sizeof(void *) * p_src->lightmax);
  1014. memcpy(p_desc->p_light, p_src->p_light, sizeof(void *) * p_src->lightmax);
  1015. }
  1016. p_desc->top_edlight = p_src->top_edlight;
  1017. p_desc->edlightnum = p_src->edlightnum;
  1018. p_desc->edlightmax = p_src->edlightmax;
  1019. if (p_src->edlightmax && p_src->p_edlight) {
  1020. p_desc->p_edlight =
  1021. (EXTRA_DYN_LIGHT **) mmalloc(sizeof(p_desc->p_edlight[0]) *
  1022. p_src->edlightnum);
  1023. memcpy(p_desc->p_edlight, p_src->p_edlight,
  1024. sizeof(p_desc->p_edlight[0]) * p_src->edlightnum);
  1025. }
  1026. // Kopie statickych svetel
  1027. if (p_src->p_lslight) {
  1028. p_desc->p_lslight = (STATIC_LIGHT *) mmalloc(sizeof(p_src->p_lslight[0]));
  1029. memcpy(p_desc->p_lslight, p_src->p_lslight, sizeof(p_src->p_lslight[0]));
  1030. p_lss = p_src->p_lslight->p_next;
  1031. p_lsd = p_desc->p_lslight;
  1032. while (p_lss) {
  1033. p_lsd->p_next = (STATIC_LIGHT *) mmalloc(sizeof(p_lsd->p_next[0]));
  1034. memcpy(p_lsd->p_next, p_lss, sizeof(p_lss[0]));
  1035. p_lss = p_lss->p_next;
  1036. p_lsd = p_lsd->p_next;
  1037. }
  1038. }
  1039. // Kopie dynamickych svetel
  1040. if (p_src->p_ldlight) {
  1041. p_desc->p_ldlight = (DYN_LIGHT *) mmalloc(sizeof(p_src->p_ldlight[0]));
  1042. memcpy(p_desc->p_ldlight, p_src->p_ldlight, sizeof(p_src->p_ldlight[0]));
  1043. p_lds = p_src->p_ldlight->p_next;
  1044. p_ldd = p_desc->p_ldlight;
  1045. while (p_lds) {
  1046. p_ldd->p_next = (DYN_LIGHT *) mmalloc(sizeof(p_ldd->p_next[0]));
  1047. memcpy(p_ldd->p_next, p_lss, sizeof(p_lds[0]));
  1048. p_lds = p_lds->p_next;
  1049. p_ldd = p_ldd->p_next;
  1050. }
  1051. }
  1052. // Kopie extra-svetel
  1053. if (p_src->p_lelight) {
  1054. p_desc->p_lelight =
  1055. (EXTRA_DYN_LIGHT *) mmalloc(sizeof(p_src->p_lelight[0]));
  1056. memcpy(p_desc->p_lelight, p_src->p_lelight, sizeof(p_src->p_lelight[0]));
  1057. p_les = p_src->p_lelight->p_next;
  1058. p_led = p_desc->p_lelight;
  1059. while (p_les) {
  1060. p_led->p_next = (EXTRA_DYN_LIGHT *) mmalloc(sizeof(p_led->p_next[0]));
  1061. memcpy(p_led->p_next, p_les, sizeof(p_les[0]));
  1062. p_les = p_les->p_next;
  1063. p_led = p_led->p_next;
  1064. }
  1065. }
  1066. return (p_desc);
  1067. }
  1068. /*
  1069. word *facenum; // pocty facu v extra-facich - polich
  1070. word *facestart; // starty facu jednotlivych objektu
  1071. EXTRA_FACE **p_face;
  1072. int
  1073. */
  1074. void rozsir_objekt_light(EDIT_OBJEKT * p_obj)
  1075. {
  1076. MUJ_BOD v, *p_v1, *p_v2;
  1077. MUJ_BOD nov[5];
  1078. word face[3 * 4], f[6];
  1079. int i, j, p[6], n, num = 0;
  1080. if (p_obj->vertexnum != 4 || p_obj->facenum != 6)
  1081. return;
  1082. for (i = 0; i < 6; i++) {
  1083. for (j = i; j < 6; j++) {
  1084. if (i == j)
  1085. continue;
  1086. if (p_obj->p_face[i] == p_obj->p_face[j]) {
  1087. p[num] = p_obj->p_face[i];
  1088. num++;
  1089. }
  1090. }
  1091. }
  1092. if (num == 2
  1093. && vzdal_bodu(p_obj->p_vertex + p[0], p_obj->p_vertex + p[1]) > 2.0f) {
  1094. p_v1 = p_obj->p_vertex + p[0];
  1095. p_v2 = p_obj->p_vertex + p[1];
  1096. v.x = p_v1->x * 0.5f + p_v2->x * 0.5f;
  1097. v.y = p_v1->y * 0.5f + p_v2->y * 0.5f;
  1098. v.z = p_v1->z * 0.5f + p_v2->z * 0.5f;
  1099. v.nx = p_v1->nx * 0.5f + p_v2->nx * 0.5f;
  1100. v.ny = p_v1->ny * 0.5f + p_v2->ny * 0.5f;
  1101. v.nz = p_v1->nz * 0.5f + p_v2->nz * 0.5f;
  1102. v.tu1 = p_v1->tu1 * 0.5f + p_v2->tu1 * 0.5f;
  1103. v.tu2 = p_v1->tu2 * 0.5f + p_v2->tu2 * 0.5f;
  1104. v.tv1 = p_v1->tv1 * 0.5f + p_v2->tv1 * 0.5f;
  1105. v.tv2 = p_v1->tv2 * 0.5f + p_v2->tv2 * 0.5f;
  1106. v.dr = p_v1->dr * 0.5f + p_v2->dr * 0.5f;
  1107. v.dg = p_v1->dg * 0.5f + p_v2->dg * 0.5f;
  1108. v.db = p_v1->db * 0.5f + p_v2->db * 0.5f;
  1109. v.da = p_v1->da * 0.5f + p_v2->da * 0.5f;
  1110. v.mdr = p_v1->mdr * 0.5f + p_v2->mdr * 0.5f;
  1111. v.mdg = p_v1->mdg * 0.5f + p_v2->mdg * 0.5f;
  1112. v.mdb = p_v1->mdb * 0.5f + p_v2->mdb * 0.5f;
  1113. v.mda = p_v1->mda * 0.5f + p_v2->mda * 0.5f;
  1114. v.sr = p_v1->sr * 0.5f + p_v2->sr * 0.5f;
  1115. v.sg = p_v1->sg * 0.5f + p_v2->sg * 0.5f;
  1116. v.sb = p_v1->sb * 0.5f + p_v2->sb * 0.5f;
  1117. v.msr = p_v1->msr * 0.5f + p_v2->msr * 0.5f;
  1118. v.msg = p_v1->msg * 0.5f + p_v2->msg * 0.5f;
  1119. v.msb = p_v1->msb * 0.5f + p_v2->msb * 0.5f;
  1120. for (i = 0; i < 6; i += 3) {
  1121. n = 0;
  1122. f[0] = p_obj->p_face[i];
  1123. if (p_obj->p_face[i] == p[0] || p_obj->p_face[i] == p[1]) {
  1124. n++;
  1125. }
  1126. if (p_obj->p_face[i + 1] == p[0] || p_obj->p_face[i + 1] == p[1]) {
  1127. if (n) { // druhy spolecny
  1128. f[3] = f[2] = p_obj->p_face[i + 2];
  1129. f[4] = f[1] = 4;
  1130. f[5] = p_obj->p_face[i + 1];
  1131. }
  1132. else { // prvni spolecny
  1133. f[1] = p_obj->p_face[i + 1];
  1134. f[4] = f[2] = 4;
  1135. f[3] = f[0];
  1136. f[5] = p_obj->p_face[i + 2];
  1137. }
  1138. }
  1139. else {
  1140. assert(n);
  1141. f[3] = f[1] = p_obj->p_face[i + 1];
  1142. f[5] = f[2] = 4;
  1143. f[4] = p_obj->p_face[i + 2];
  1144. }
  1145. memcpy(face + (i * 2), f, sizeof(f));
  1146. }
  1147. free(p_obj->p_face);
  1148. p_obj->p_face = (word *) mmalloc(sizeof(f[0]) * 12);
  1149. memcpy(p_obj->p_face, face, sizeof(f[0]) * 12);
  1150. memcpy(nov, p_obj->p_vertex, sizeof(p_obj->p_vertex[0]) * 4);
  1151. free(p_obj->p_vertex);
  1152. p_obj->p_vertex = (OBJ_VERTEX *) mmalloc(sizeof(p_obj->p_vertex[0]) * 5);
  1153. memcpy(p_obj->p_vertex, nov, sizeof(p_obj->p_vertex[0]) * 4);
  1154. p_obj->p_vertex[4] = v;
  1155. p_obj->vertexnum = 5;
  1156. p_obj->facenum = 12;
  1157. }
  1158. }
  1159. // Prida extra-vertex
  1160. void kont_extra_light(EDIT_KONTEJNER * p_kont)
  1161. {
  1162. int i;
  1163. for (i = 0; i < p_kont->objektu; i++) {
  1164. if (p_kont->objektu)
  1165. rozsir_objekt_light(p_kont->p_obj[i]);
  1166. }
  1167. updatuj_kontejner_statistika(p_kont, FALSE);
  1168. }
  1169. void mesh_calc_varray(GAME_MESH_OLD * p_mesh)
  1170. {
  1171. VERTEX_ARRAYS *p_varray = &p_mesh->varray;
  1172. int vertexu = p_mesh->vertexnum;
  1173. int m2flag = p_mesh->p_data->m2flag;
  1174. int last, norm = glstav_pn_triangles
  1175. || p_mesh->p_data->
  1176. m2flag & (MAT2_CALC_MAP1 | MAT2_CALC_MAP2 | MAT2_CALC_MAP3 |
  1177. MAT2_CALC_MAP4);
  1178. if (gl_ext::extlist_vertex_array) {
  1179. p_varray->ati_start_pos = 0;
  1180. last = sizeof(p_mesh->p_vertex_pos[0]) * vertexu;
  1181. if (norm) {
  1182. p_varray->ati_start_norm = last;
  1183. last = last + sizeof(p_mesh->p_vertex_norm[0]) * vertexu;
  1184. }
  1185. if (m2flag & MAT2_DIFFUSE) {
  1186. p_varray->ati_start_diff = last;
  1187. last = last + sizeof(p_mesh->p_vertex_diff[0]) * vertexu;
  1188. }
  1189. p_varray->ati_start_spec = last;
  1190. last = last + sizeof(p_mesh->p_vertex_spec[0]) * vertexu;
  1191. if (m2flag & MAT2_MAP1) {
  1192. p_varray->ati_start_text[0] = last;
  1193. last = last + sizeof(p_mesh->p_vertex_uv2_material[0]) * vertexu;
  1194. }
  1195. if (m2flag & MAT2_MAP2) {
  1196. p_varray->ati_start_text[1] = last;
  1197. last = last + sizeof(p_mesh->p_vertex_uv3_material[0]) * vertexu;
  1198. }
  1199. if (m2flag & MAT2_MAP3) {
  1200. p_varray->ati_start_text[2] = last;
  1201. last = last + sizeof(p_mesh->p_vertex_uv4_material[0]) * vertexu;
  1202. }
  1203. if (m2flag & MAT2_MAP4) {
  1204. p_varray->ati_start_text[3] = last;
  1205. last = last + sizeof(p_mesh->p_vertex_uv4_material[0]) * vertexu;
  1206. }
  1207. //p_varray->ati_velikost = last+sizeof(p_mesh->p_face[0])*p_mesh->facevel;
  1208. p_varray->ati_velikost = last;
  1209. }
  1210. }
  1211. void mesh_preved_jointy_rec(JOINT * p_joint, int prvni_vertex)
  1212. {
  1213. int i;
  1214. for (i = 0; i < p_joint->vertexnum; i++) {
  1215. p_joint->p_vertexlist[i] += prvni_vertex;
  1216. }
  1217. if (p_joint->p_child)
  1218. mesh_preved_jointy_rec(p_joint->p_child, prvni_vertex);
  1219. if (p_joint->p_next)
  1220. mesh_preved_jointy_rec(p_joint->p_next, prvni_vertex);
  1221. if (p_joint->p_keys)
  1222. zrus_kosti_key(&p_joint->p_keys);
  1223. }
  1224. // prevede animace
  1225. JOINT_ANIMACE *mesh_preved_jointy(EDIT_OBJEKT * p_obj, int prvni_vertex,
  1226. int objnum, GAME_MESH_OLD * p_mesh)
  1227. {
  1228. JOINT_ANIMACE *p_ret = p_obj->p_joit_animace;
  1229. JOINT_ANIMACE *p_tmp = p_ret;
  1230. if (!p_ret) {
  1231. p_mesh->p_data->k2flag &= ~KONT2_JOINT_ANIM;
  1232. return (NULL);
  1233. }
  1234. key_kosti_interpoluj(p_ret);
  1235. while (p_tmp) {
  1236. if (p_tmp->p_child) {
  1237. mesh_preved_jointy_rec(p_tmp->p_child, prvni_vertex);
  1238. p_tmp->p_norm_in = p_mesh->p_vertex_norm_kosti;
  1239. p_tmp->p_norm_out = p_mesh->p_vertex_norm;
  1240. p_tmp->p_pos_in = p_mesh->p_vertex_pos_kosti;
  1241. p_tmp->p_pos_out = p_mesh->p_vertex_pos;
  1242. }
  1243. p_tmp = p_tmp->p_next;
  1244. }
  1245. p_ret->p_k2flag = (int *) &p_mesh->p_data->k2flag;
  1246. p_ret->p_kkflag = (int *) &p_mesh->p_data->kflag;
  1247. p_ret->p_koflag = (int *) p_mesh->p_kflag + objnum;
  1248. p_obj->p_joit_animace = NULL;
  1249. return (p_ret);
  1250. }
  1251. /*
  1252. #define O_INDEX_POCET 0
  1253. #define O_INDEX_TYP 1
  1254. #define O_INDEX_DATA 2
  1255. */
  1256. /* Slepi dohromady pole p_opt
  1257. p_mesh->p_face = opt_slep(p_opt, p_optnum, p_mesh->facestart, p_mesh->objektu, &p_mesh->facevel);
  1258. null_free((void **)&p_opt);
  1259. null_free((void **)&p_optnum);
  1260. */
  1261. /*
  1262. p_opt - pole poli p_opt
  1263. p_optnum - delky v jednotlivych pol i
  1264. p_start - pole zacatku poli facu jednotlivych objektu
  1265. objnum - pocet objektu
  1266. p_vysnum - vysledna delka slepeneho pole
  1267. - vraci slepene pole a jeho delku
  1268. */
  1269. int *opt_slep(int **p_opt, int *p_optnum, int *p_start, int objnum,
  1270. int *p_vysnum)
  1271. {
  1272. int start, i, vel, num;
  1273. int *p_tmp;
  1274. vel = 0;
  1275. for (i = 0; i < objnum; i++) {
  1276. vel += p_optnum[i];
  1277. }
  1278. *p_vysnum = vel;
  1279. p_tmp = (int *) mmalloc(sizeof(p_tmp[0]) * vel);
  1280. start = 0;
  1281. for (i = 0; i < objnum; i++) {
  1282. num = p_optnum[i];
  1283. memcpy(p_tmp + start, p_opt[i], sizeof(p_tmp[0]) * num);
  1284. free(p_opt[i]);
  1285. p_start[i] = start;
  1286. start += num;
  1287. }
  1288. return (p_tmp);
  1289. }
  1290. /*
  1291. #define O_INDEX_POCET 0
  1292. #define O_INDEX_TYP 1
  1293. #define O_INDEX_DATA 2
  1294. */
  1295. /* Pripocte k facum add
  1296. *p_opt - pointer na list optu
  1297. optnum - delka pole *p_opt (vcetne vsech indexu)
  1298. */
  1299. int opt_add(int *p_opt, int optnum, int add)
  1300. {
  1301. int i, j, num;
  1302. int sekci;
  1303. if (p_opt) {
  1304. j = 0;
  1305. sekci = 0;
  1306. while (j < optnum) {
  1307. num = p_opt[O_INDEX_POCET];
  1308. for (i = O_INDEX_DATA; i < num + O_INDEX_DATA; i++) {
  1309. p_opt[i] += add;
  1310. }
  1311. j += num + O_INDEX_DATA;
  1312. p_opt += num + O_INDEX_DATA;
  1313. sekci++;
  1314. }
  1315. return (sekci);
  1316. }
  1317. else {
  1318. return (0);
  1319. }
  1320. }
  1321. void opt_dopln(EDIT_OBJEKT * p_obj)
  1322. {
  1323. int optnum;
  1324. int *p_opt;
  1325. int i;
  1326. if (!p_obj->p_opt) {
  1327. kprintf(TRUE, "Stary objekt - calc strip %s...", p_obj->jmeno);
  1328. optnum = p_obj->facenum + 2;
  1329. p_opt = (int *) mmalloc(sizeof(p_opt[0]) * optnum);
  1330. p_opt[O_INDEX_POCET] = p_obj->facenum;
  1331. p_opt[O_INDEX_TYP] = p_obj->face_typ;
  1332. for (i = 0; i < p_obj->facenum; i++)
  1333. p_opt[i + O_INDEX_DATA] = p_obj->p_face[i];
  1334. p_obj->p_opt = p_opt;
  1335. p_obj->optnum = optnum;
  1336. }
  1337. }
  1338. GAME_MESH_OLD *edit_to_mesh(GAME_MESH_DATA * p_mesh_data,
  1339. EDIT_KONTEJNER * p_kont, EDIT_MATERIAL ** p_mat, int max_mat,
  1340. int shadow_volume)
  1341. {
  1342. GAME_MESH_OLD *p_mesh = vyrob_mesh(p_kont->objektu, p_mesh_data);
  1343. VERTEX_ARRAYS *p_varray = &p_mesh->varray;
  1344. GLMATRIX tmp;
  1345. BOD *p_piv;
  1346. int **p_opt;
  1347. int *p_optnum;
  1348. int i, j, p, k, vertexnum, vel, bodu = p_kont->bodu;
  1349. int shut = 0;
  1350. int pivot = 0;
  1351. kprintf(TRUE, "Edit-to-mesh %s (f:%d v:%d)", p_kont->jmeno, p_kont->facu,
  1352. p_kont->bodu);
  1353. strcpy(p_mesh->jmeno, p_kont->jmeno);
  1354. p_mesh->p_data->kflag |=
  1355. (p_kont->kflag & KONT_STATIC ? p_kont->kflag : p_kont->
  1356. kflag | KONT_POHYB);
  1357. p_mesh->p_data->m1flag |= p_kont->m1flag;
  1358. p_mesh->p_data->m2flag |= p_kont->m2flag;
  1359. p_mesh->objektu = p_kont->objektu;
  1360. p_mesh->vertexnum = p_kont->bodu;
  1361. p_mesh->world = p_kont->world; // world matrix meshe
  1362. p_mesh->m = p_kont->mpmatrix; // mp (mesh-pozition) matrix meshe/kontejneru
  1363. p_mesh->low_id = p_kont->low_id;
  1364. p_mesh->p_data->mesh_ID = p_kont->kontejner_ID;
  1365. p_mesh->obb_local = p_kont->obb;
  1366. p_mesh->obb_world = p_kont->obb;
  1367. p_mesh->p_kflag =
  1368. (dword *) mmalloc(sizeof(p_mesh->p_kflag[0]) * p_kont->objektu);
  1369. p_opt = (int **) mmalloc(sizeof(p_opt[0]) * p_kont->objektu);
  1370. p_optnum = (int *) mmalloc(sizeof(p_optnum[0]) * p_kont->objektu);
  1371. p_mesh->p_mlha = p_kont->p_mlha;
  1372. if (p_mesh->p_mlha) {
  1373. p_kont->p_mlha->p_kont = p_mesh;
  1374. p_kont->p_mlha = NULL;
  1375. }
  1376. // Obalkovy system
  1377. p_mesh->p_obb_local =
  1378. (OBB_OLD *) mmalloc(sizeof(p_mesh->p_obb_local[0]) * p_mesh->objektu);
  1379. p_mesh->p_obb_world =
  1380. (OBB_OLD *) mmalloc(sizeof(p_mesh->p_obb_world[0]) * p_mesh->objektu);
  1381. if (p_kont->kflag & KONT_KEYFRAME) {
  1382. p_mesh->p_key =
  1383. (GLMATRIX *) mmalloc(sizeof(p_mesh->p_key[0]) * p_mesh->objektu);
  1384. for (i = 0; i < p_mesh->objektu; i++) {
  1385. init_matrix(p_mesh->p_key + i);
  1386. }
  1387. }
  1388. // joint-animace
  1389. if (p_kont->k2flag & KONT2_JOINT_ANIM) {
  1390. p_mesh->p_joint_anim =
  1391. (JOINT_ANIMACE **) mmalloc(sizeof(p_mesh->p_joint_anim[0]) *
  1392. p_mesh->objektu);
  1393. }
  1394. if (p_kont->kflag & KONT_NORMAL_ANIM) {
  1395. vyrob_pole(&p_mesh->p_normal_scale, p_mesh->objektu);
  1396. vyrob_pole(&p_mesh->p_normal_scale_last, p_mesh->objektu);
  1397. }
  1398. vyrob_pole(&p_mesh->p_Objekt_ID, p_mesh->objektu);
  1399. vel = sizeof(p_mesh->p_vertex_pos[0]) + sizeof(p_mesh->p_vertex_norm[0]);
  1400. if (p_kont->m2flag & MAT2_DIFFUSE) {
  1401. vel += sizeof(p_mesh->p_vertex_diff[0]) +
  1402. sizeof(p_mesh->p_vertex_diff_material[0]);
  1403. }
  1404. if (p_kont->m2flag & MAT2_SPECULAR) {
  1405. vel += sizeof(p_mesh->p_vertex_spec[0]) +
  1406. sizeof(p_mesh->p_vertex_spec_material[0]);
  1407. }
  1408. else if (p_kont->m2flag & MAT2_ENV_SPEC) {
  1409. vel += sizeof(p_mesh->p_vertex_spec[0]);
  1410. }
  1411. if (p_kont->m2flag & MAT2_MAP1) {
  1412. vel += sizeof(p_mesh->p_vertex_uv1_material[0]);
  1413. }
  1414. if (p_kont->m2flag & MAT2_MAP2) {
  1415. vel += sizeof(p_mesh->p_vertex_uv2_material[0]);
  1416. }
  1417. if (p_kont->m2flag & MAT2_MAP3) {
  1418. vel += sizeof(p_mesh->p_vertex_uv3_material[0]);
  1419. }
  1420. if (p_kont->m2flag & MAT2_MAP4) {
  1421. vel += sizeof(p_mesh->p_vertex_uv4_material[0]);
  1422. }
  1423. vyrob_pole_abs(&p_mesh->p_vertex_pos, vel * bodu);
  1424. p_mesh->p_vertex_norm = p_mesh->p_vertex_pos + bodu;
  1425. vel = (int) (p_mesh->p_vertex_norm + bodu);
  1426. if (p_kont->m2flag & MAT2_DIFFUSE) {
  1427. p_mesh->p_vertex_diff = (BARVA_RGBA *) vel;
  1428. p_mesh->p_vertex_diff_material = p_mesh->p_vertex_diff + bodu;
  1429. vel = (int) (p_mesh->p_vertex_diff_material + bodu);
  1430. }
  1431. if (p_kont->m2flag & MAT2_SPECULAR) {
  1432. p_mesh->p_vertex_spec = (BODRGB *) vel;
  1433. p_mesh->p_vertex_spec_material = p_mesh->p_vertex_spec + bodu;
  1434. vel = (int) (p_mesh->p_vertex_spec_material + bodu);
  1435. }
  1436. else if (p_kont->m2flag & MAT2_ENV_SPEC) {
  1437. p_mesh->p_vertex_spec = (BODRGB *) vel;
  1438. vel = (int) (p_mesh->p_vertex_spec + bodu);
  1439. }
  1440. if (p_kont->m2flag & MAT2_MAP1) {
  1441. p_mesh->p_vertex_uv1_material = (BODUV *) vel;
  1442. vel = (int) (p_mesh->p_vertex_uv1_material + bodu);
  1443. }
  1444. if (p_kont->m2flag & MAT2_MAP2) {
  1445. p_mesh->p_vertex_uv2_material = (BODUV *) vel;
  1446. vel = (int) (p_mesh->p_vertex_uv2_material + bodu);
  1447. }
  1448. if (p_kont->m2flag & MAT2_MAP3) {
  1449. p_mesh->p_vertex_uv3_material = (BODUV *) vel;
  1450. vel = (int) (p_mesh->p_vertex_uv3_material + bodu);
  1451. }
  1452. if (p_kont->m2flag & MAT2_MAP4) {
  1453. p_mesh->p_vertex_uv4_material = (BODUV *) vel;
  1454. vel = (int) (p_mesh->p_vertex_uv4_material + bodu);
  1455. }
  1456. if (p_kont->k2flag & KONT2_JOINT_ANIM) {
  1457. p_mesh->p_vertex_pos_kosti =
  1458. (BOD *) mmalloc(sizeof(p_mesh->p_vertex_pos_kosti[0]) * bodu);
  1459. p_mesh->p_vertex_norm_kosti =
  1460. (BOD *) mmalloc(sizeof(p_mesh->p_vertex_norm_kosti[0]) * bodu);
  1461. }
  1462. for (i = 0, p = 0, j = 0; i < MAX_KONT_OBJEKTU; i++) {
  1463. if (!p_kont->p_obj[i])
  1464. continue;
  1465. opt_dopln(p_kont->p_obj[i]);
  1466. if (p_kont->kflag & KONT_KEYFRAME) {
  1467. p_mesh->p_key[j] = p_kont->p_obj[i]->m;
  1468. }
  1469. p_piv = &p_kont->p_obj[i]->pivot;
  1470. if (!pivot && (p_piv->x != 0.0f || p_piv->y != 0.0f || p_piv->z != 0.0f)) {
  1471. p_mesh->kofola_pivot = *p_piv;
  1472. pivot = TRUE;
  1473. }
  1474. p_mesh->p_obb_world[j] = p_mesh->p_obb_local[j] = p_kont->p_obj[i]->obb;
  1475. p_mesh->p_Objekt_ID[j] = p_kont->p_obj[i]->Objekt_ID;
  1476. vertexnum = p_kont->p_obj[i]->vertexnum;
  1477. for (k = 0; k < vertexnum; k++) {
  1478. p_mesh->p_vertex_pos[k + p].x = p_kont->p_obj[i]->p_vertex[k].x;
  1479. p_mesh->p_vertex_pos[k + p].y = p_kont->p_obj[i]->p_vertex[k].y;
  1480. p_mesh->p_vertex_pos[k + p].z = p_kont->p_obj[i]->p_vertex[k].z;
  1481. p_mesh->p_vertex_norm[k + p].x = p_kont->p_obj[i]->p_vertex[k].nx;
  1482. p_mesh->p_vertex_norm[k + p].y = p_kont->p_obj[i]->p_vertex[k].ny;
  1483. p_mesh->p_vertex_norm[k + p].z = p_kont->p_obj[i]->p_vertex[k].nz;
  1484. if (p_mesh->p_vertex_pos_kosti)
  1485. p_mesh->p_vertex_pos_kosti[k + p] = p_mesh->p_vertex_pos[k + p];
  1486. if (p_mesh->p_vertex_norm_kosti)
  1487. p_mesh->p_vertex_norm_kosti[k + p] = p_mesh->p_vertex_norm[k + p];
  1488. }
  1489. if (p_kont->m2flag & MAT2_DIFFUSE) {
  1490. for (k = 0; k < vertexnum; k++) {
  1491. p_mesh->p_vertex_diff[k + p].r = p_kont->p_obj[i]->p_vertex[k].dr;
  1492. p_mesh->p_vertex_diff[k + p].g = p_kont->p_obj[i]->p_vertex[k].dg;
  1493. p_mesh->p_vertex_diff[k + p].b = p_kont->p_obj[i]->p_vertex[k].db;
  1494. p_mesh->p_vertex_diff[k + p].a = p_kont->p_obj[i]->p_vertex[k].da;
  1495. p_mesh->p_vertex_diff_material[k + p].r =
  1496. p_kont->p_obj[i]->p_vertex[k].mdr;
  1497. p_mesh->p_vertex_diff_material[k + p].g =
  1498. p_kont->p_obj[i]->p_vertex[k].mdg;
  1499. p_mesh->p_vertex_diff_material[k + p].b =
  1500. p_kont->p_obj[i]->p_vertex[k].mdb;
  1501. p_mesh->p_vertex_diff_material[k + p].a =
  1502. p_kont->p_obj[i]->p_vertex[k].mda;
  1503. }
  1504. }
  1505. if (p_kont->m2flag & MAT2_SPECULAR) {
  1506. for (k = 0; k < vertexnum; k++) {
  1507. p_mesh->p_vertex_spec[k + p].r = p_kont->p_obj[i]->p_vertex[k].sr;
  1508. p_mesh->p_vertex_spec[k + p].g = p_kont->p_obj[i]->p_vertex[k].sg;
  1509. p_mesh->p_vertex_spec[k + p].b = p_kont->p_obj[i]->p_vertex[k].sb;
  1510. p_mesh->p_vertex_spec_material[k + p].r =
  1511. p_kont->p_obj[i]->p_vertex[k].msr;
  1512. p_mesh->p_vertex_spec_material[k + p].g =
  1513. p_kont->p_obj[i]->p_vertex[k].msg;
  1514. p_mesh->p_vertex_spec_material[k + p].b =
  1515. p_kont->p_obj[i]->p_vertex[k].msb;
  1516. }
  1517. }
  1518. if (p_kont->m2flag & MAT2_MAP1) {
  1519. for (k = 0; k < vertexnum; k++) {
  1520. p_mesh->p_vertex_uv1_material[k + p].u =
  1521. p_kont->p_obj[i]->p_vertex[k].tu1;
  1522. p_mesh->p_vertex_uv1_material[k + p].v =
  1523. p_kont->p_obj[i]->p_vertex[k].tv1;
  1524. }
  1525. }
  1526. if (p_kont->m2flag & MAT2_MAP2) {
  1527. for (k = 0; k < vertexnum; k++) {
  1528. p_mesh->p_vertex_uv2_material[k + p].u =
  1529. p_kont->p_obj[i]->p_vertex[k].tu2;
  1530. p_mesh->p_vertex_uv2_material[k + p].v =
  1531. p_kont->p_obj[i]->p_vertex[k].tv2;
  1532. }
  1533. }
  1534. if (p_kont->m2flag & MAT2_MAP3) {
  1535. for (k = 0; k < vertexnum; k++) {
  1536. p_mesh->p_vertex_uv3_material[k + p].u =
  1537. p_kont->p_obj[i]->p_vertex[k].tu3;
  1538. p_mesh->p_vertex_uv3_material[k + p].v =
  1539. p_kont->p_obj[i]->p_vertex[k].tv3;
  1540. }
  1541. }
  1542. if (p_kont->m2flag & MAT2_MAP4) {
  1543. for (k = 0; k < vertexnum; k++) {
  1544. p_mesh->p_vertex_uv4_material[k + p].u =
  1545. p_kont->p_obj[i]->p_vertex[k].tu4;
  1546. p_mesh->p_vertex_uv4_material[k + p].v =
  1547. p_kont->p_obj[i]->p_vertex[k].tv4;
  1548. }
  1549. }
  1550. p_opt[j] = p_kont->p_obj[i]->p_opt;
  1551. p_optnum[j] = p_kont->p_obj[i]->optnum;
  1552. p_kont->p_obj[i]->p_opt = NULL;
  1553. p_kont->p_obj[i]->optnum = 0;
  1554. p_mesh->facenum[j] = opt_add(p_opt[j], p_optnum[j], p);
  1555. p_mesh->objektnum[j] = p_kont->p_obj[i]->vertexnum;
  1556. p_mesh->objektstart[j] = p;
  1557. p_mesh->p_mat[j] = p_kont->p_obj[i]->material;
  1558. if (p_kont->k2flag & KONT2_JOINT_ANIM) {
  1559. p_mesh->p_joint_anim[j] =
  1560. mesh_preved_jointy(p_kont->p_obj[i], p, j, p_mesh);
  1561. }
  1562. p += p_kont->p_obj[i]->vertexnum;
  1563. j++;
  1564. }
  1565. p_mesh->objektu = j; // pocet skutecne prevedenych objektu
  1566. assert(j == p_kont->objektu);
  1567. p_mesh->p_face =
  1568. opt_slep(p_opt, p_optnum, p_mesh->facestart, p_mesh->objektu,
  1569. &p_mesh->facevel);
  1570. null_free((void **) &p_opt);
  1571. null_free((void **) &p_optnum);
  1572. //assert(!p_kont->p_slight);
  1573. lo_premapuj_svetla_kont_mesh(p_kont, p_mesh);
  1574. // kopie lokalnich animaci
  1575. if (p_kont->kflag & KONT_KEYFRAME) {
  1576. for (i = 0, p = K_CHYBA; i < KONT_MAX_ANIM; i++) {
  1577. if (p_kont->sim[i].keynum) {
  1578. p = i;
  1579. }
  1580. }
  1581. if (p == K_CHYBA) {
  1582. p_kont->kflag &= ~KONT_KEYFRAME;
  1583. }
  1584. else {
  1585. p++;
  1586. // p je posledni pouzity mesh
  1587. p_mesh->p_sim =
  1588. (SIMPLE_TRACK_INFO *) mmalloc(sizeof(p_mesh->p_sim[0]) * p);
  1589. p_mesh->simnum = p;
  1590. // kopirovani animacnich stromu
  1591. for (i = 0; i < p; i++) {
  1592. if (p_kont->sim[i].keynum) {
  1593. key_sim_root_to_sim_indir(p_kont->sim + i, p_mesh->p_sim + i);
  1594. key_sim_dopln_matrix_mesh(p_mesh, p_mesh->p_sim + i);
  1595. }
  1596. }
  1597. // ____OPRAVA____
  1598. p_mesh->p_sim_aktivni = p_mesh->p_sim;
  1599. p_mesh->sim_aktivni_time = 0;
  1600. mat_mult_dir(&p_mesh->world, &p_mesh->m, &tmp);
  1601. key_mesh_reanimuj(p_mesh, p_mesh->sim_aktivni_time, &tmp);
  1602. }
  1603. }
  1604. // Vertex-arrays inicializace
  1605. mesh_calc_varray(p_mesh);
  1606. mesh_pridej_vertex_array(p_mesh);
  1607. if (!(p_mesh->p_data->kflag & KONT_KEYFRAME)) {
  1608. mat_mult_dir(&p_mesh->world, &p_mesh->m, &tmp);
  1609. obb_transformuj(&p_mesh->obb_local, &tmp, &p_mesh->obb_world);
  1610. for (i = 0; i < p_mesh->objektu; i++)
  1611. obb_transformuj(p_mesh->p_obb_local + i, &tmp, p_mesh->p_obb_world + i);
  1612. }
  1613. return (p_mesh);
  1614. }
  1615. GAME_MESH_OLD *vyrob_mesh(int objektu, GAME_MESH_DATA * p_data)
  1616. {
  1617. GAME_MESH_OLD *p_mesh;
  1618. int i;
  1619. if ((p_mesh = (GAME_MESH_OLD *) mmalloc(sizeof(p_mesh[0]))) == NULL) {
  1620. chyba("pamet");
  1621. }
  1622. memset(p_mesh, 0, sizeof(p_mesh[0]));
  1623. p_mesh->p_data = (p_data) ? p_data : vyrob_mesh_data();
  1624. p_mesh->objektu = objektu;
  1625. p_mesh->p_data->top_edlight = K_CHYBA;
  1626. p_mesh->objektnum =
  1627. (word *) mmalloc(sizeof(p_mesh->objektnum[0]) * objektu);
  1628. p_mesh->objektstart =
  1629. (word *) mmalloc(sizeof(p_mesh->objektstart[0]) * objektu);
  1630. p_mesh->facenum = (int *) mmalloc(sizeof(p_mesh->facenum[0]) * objektu);
  1631. p_mesh->facestart = (int *) mmalloc(sizeof(p_mesh->facestart[0]) * objektu);
  1632. p_mesh->p_mat = (int *) mmalloc(sizeof(p_mesh->p_mat[0]) * objektu);
  1633. p_mesh->siminfo.odkaz = K_CHYBA;
  1634. for (i = 0; i < LANI_FRONTA; i++)
  1635. p_mesh->siminfo.akt[i] = K_CHYBA;
  1636. return (p_mesh);
  1637. }
  1638. GAME_MESH_DATA *vyrob_mesh_data(void)
  1639. {
  1640. GAME_MESH_DATA *p_data;
  1641. p_data = (GAME_MESH_DATA *) mmalloc(sizeof(p_data[0]));
  1642. return (p_data);
  1643. }
  1644. void mesh_pridej_vodavertexy(GAME_MESH_OLD * p_mesh)
  1645. {
  1646. vyrob_pole(&p_mesh->p_vertex_diff_voda, p_mesh->vertexnum);
  1647. vyrob_pole(&p_mesh->p_vertex_spec_voda, p_mesh->vertexnum);
  1648. }
  1649. void zrus_fleky(FLEK ** p_flek)
  1650. {
  1651. if (*p_flek) {
  1652. zrus_fleky(&((*p_flek)->p_next));
  1653. free(*p_flek);
  1654. *p_flek = NULL;
  1655. }
  1656. }
  1657. void zrus_flare(LENS_FLARE ** p_flare)
  1658. {
  1659. if (*p_flare) {
  1660. zrus_flare(&((*p_flare)->p_next));
  1661. null_free((void **) &(*p_flare)->p_sloz);
  1662. free(*p_flare);
  1663. *p_flare = NULL;
  1664. }
  1665. }
  1666. void zrus_mesh_data(GAME_MESH_DATA ** p_tmp)
  1667. {
  1668. GAME_MESH_DATA *p_data = *p_tmp;
  1669. null_free((void **) &p_data->p_light);
  1670. null_free((void **) &p_data->p_edlight);
  1671. null_free((void **) p_tmp);
  1672. }
  1673. void zrus_mesh(GAME_MESH_OLD ** p_mesh_top)
  1674. {
  1675. GAME_MESH_OLD *p_mesh = *p_mesh_top;
  1676. GAME_MESH_OLD *p_tmp;
  1677. int i;
  1678. zrus_mesh_data(&p_mesh->p_data);
  1679. while (p_mesh) {
  1680. if (p_mesh->p_sim) {
  1681. for (i = 0; i < p_mesh->simnum; i++) {
  1682. key_sim_zrus(p_mesh->p_sim + i);
  1683. }
  1684. free(p_mesh->p_sim);
  1685. }
  1686. null_free((void **) &p_mesh->p_vertex_pos);
  1687. null_free((void **) &p_mesh->objektnum);
  1688. null_free((void **) &p_mesh->objektstart);
  1689. null_free((void **) &p_mesh->facenum);
  1690. null_free((void **) &p_mesh->facestart);
  1691. null_free((void **) &p_mesh->p_face);
  1692. null_free((void **) &p_mesh->p_mat);
  1693. null_free((void **) &p_mesh->p_key);
  1694. null_free((void **) &p_mesh->p_obb_local);
  1695. null_free((void **) &p_mesh->p_obb_world);
  1696. null_free((void **) &p_mesh->p_Objekt_ID);
  1697. null_free((void **) &p_mesh->p_kflag);
  1698. if (mesh_vertex_array_zrus)
  1699. mesh_vertex_array_zrus(p_mesh);
  1700. p_tmp = p_mesh;
  1701. p_mesh = p_mesh->p_next;
  1702. null_free((void **) &p_tmp);
  1703. }
  1704. *p_mesh_top = NULL;
  1705. }
  1706. /************************************************************************
  1707. Hledaci rutiny - co hledaji ruzne veci jako treba
  1708. volne textury, plne textury a podobne
  1709. ************************************************************************
  1710. */
  1711. // pocet textur - MAX_EDIT_TEXTUR
  1712. int lo_najdi_texturu(EDIT_TEXT * p_text, int max, char *p_file, int flag)
  1713. {
  1714. int i;
  1715. for (i = 0; i < max; i++) {
  1716. if (flag == p_text[i].flag && !strcasecmp(p_file, p_text[i].jmeno))
  1717. return (i);
  1718. }
  1719. return (K_CHYBA);
  1720. }
  1721. int lo_najdi_volnou_texturu(EDIT_TEXT * p_text, int max)
  1722. {
  1723. int i;
  1724. for (i = 0; i < max; i++) {
  1725. if (!p_text[i].jmeno[0]) {
  1726. return (i);
  1727. }
  1728. }
  1729. return (K_CHYBA);
  1730. }
  1731. // Pocet materialu - MAX_EDIT_MATERIALU
  1732. int lo_najdi_material(EDIT_MATERIAL ** p_mat, int max, char *p_text)
  1733. {
  1734. int i;
  1735. for (i = 0; i < max; i++) {
  1736. if (p_mat[i] && !strcasecmp(p_text, p_mat[i]->jmeno))
  1737. return (i);
  1738. }
  1739. return (K_CHYBA);
  1740. }
  1741. EDIT_MATERIAL *lo_najdi_material_text_point(EDIT_MATERIAL ** p_mat, int max,
  1742. EDIT_TEXT * p_text)
  1743. {
  1744. int i;
  1745. for (i = 0; i < max; i++) {
  1746. if (p_mat[i] && p_mat[i]->p_text[0] == p_text)
  1747. return (p_mat[i]);
  1748. }
  1749. return (NULL);
  1750. }
  1751. int lo_najdi_prazdny_material(EDIT_MATERIAL ** p_mat, int max)
  1752. {
  1753. int i;
  1754. for (i = 0; i < max; i++) {
  1755. if (!p_mat[i])
  1756. return (i);
  1757. }
  1758. return (K_CHYBA);
  1759. }
  1760. int lo_pocet_materialu(EDIT_MATERIAL ** p_mat, int max)
  1761. {
  1762. int i, vel = 0;
  1763. for (i = 0; i < max; i++) {
  1764. if (p_mat[i])
  1765. vel = i + 1;
  1766. }
  1767. return (vel);
  1768. }
  1769. int lo_najdi_kameru(KAMERA * p_kam, int max, char *p_jmeno)
  1770. {
  1771. int i;
  1772. for (i = 0; i < max; i++) {
  1773. if (p_kam[i].cislo != K_CHYBA && !strcasecmp(p_kam[i].jmeno, p_jmeno))
  1774. return (i);
  1775. }
  1776. return (K_CHYBA);
  1777. }
  1778. int lo_najdi_volnou_kameru(KAMERA * p_kam, int max)
  1779. {
  1780. int i;
  1781. for (i = 0; i < max; i++) {
  1782. if (p_kam[i].cislo == K_CHYBA) {
  1783. return (i);
  1784. }
  1785. }
  1786. return (K_CHYBA);
  1787. }
  1788. int lo_najdi_volny_kontejner(EDIT_KONTEJNER ** p_kont, int max)
  1789. {
  1790. int i;
  1791. for (i = 0; i < max; i++) {
  1792. if (!p_kont[i]) {
  1793. return (i);
  1794. }
  1795. }
  1796. return (K_CHYBA);
  1797. }
  1798. int lo_najdi_volny_kontejner_up(EDIT_KONTEJNER ** p_kont, int max, int up)
  1799. {
  1800. int i;
  1801. for (i = up; i < max; i++) {
  1802. if (!p_kont[i]) {
  1803. return (i);
  1804. }
  1805. }
  1806. return (K_CHYBA);
  1807. }
  1808. int lo_najdi_volny_kontejner_zpet(EDIT_KONTEJNER ** p_kont, int max)
  1809. {
  1810. int i;
  1811. for (i = max - 1; i > -1; i--) {
  1812. if (!p_kont[i]) {
  1813. return (i);
  1814. }
  1815. }
  1816. return (K_CHYBA);
  1817. }
  1818. int lo_najdi_kontejner(EDIT_KONTEJNER ** p_kont, int max, char *p_jmeno)
  1819. {
  1820. int i;
  1821. for (i = 0; i < max; i++) {
  1822. if (!p_kont[i])
  1823. continue;
  1824. if (!strcasecmp(p_kont[i]->jmeno, p_jmeno))
  1825. return (i);
  1826. }
  1827. return (K_CHYBA);
  1828. }
  1829. int lo_najdi_volny_objekt_kont(EDIT_KONTEJNER * p_kont)
  1830. {
  1831. int i;
  1832. if (!p_kont)
  1833. return (K_CHYBA);
  1834. for (i = 0; i < p_kont->max_objektu; i++) {
  1835. if (!p_kont->p_obj[i]) {
  1836. return (i);
  1837. }
  1838. }
  1839. return (K_CHYBA);
  1840. }
  1841. int lo_najdi_objekt_kont(EDIT_KONTEJNER * p_kont, char *p_jmeno)
  1842. {
  1843. int i;
  1844. if (!p_kont)
  1845. return (K_CHYBA);
  1846. for (i = 0; i < p_kont->max_objektu; i++) {
  1847. if (p_kont->p_obj[i]) {
  1848. if (!strcasecmp(p_kont->p_obj[i]->jmeno, p_jmeno))
  1849. return (i);
  1850. }
  1851. }
  1852. return (K_CHYBA);
  1853. }
  1854. int lo_najdi_objekt_kont_ID(EDIT_KONTEJNER * p_kont, int ID)
  1855. {
  1856. int i;
  1857. if (!p_kont)
  1858. return (K_CHYBA);
  1859. for (i = 0; i < p_kont->max_objektu; i++) {
  1860. if (p_kont->p_obj[i] && p_kont->p_obj[i]->Objekt_ID == ID)
  1861. return (i);
  1862. }
  1863. return (K_CHYBA);
  1864. }
  1865. int lo_najdi_objekt_kont_plny(EDIT_KONTEJNER * p_kont)
  1866. {
  1867. int i;
  1868. if (!p_kont)
  1869. return (K_CHYBA);
  1870. for (i = 0; i < p_kont->max_objektu; i++) {
  1871. if (p_kont->p_obj[i])
  1872. return (i);
  1873. }
  1874. return (K_CHYBA);
  1875. }
  1876. EDIT_OBJEKT *lo_najdi_objekt_kont_poiter(EDIT_KONTEJNER * p_kont,
  1877. char *p_jmeno)
  1878. {
  1879. int i;
  1880. if (!p_kont)
  1881. return (NULL);
  1882. for (i = 0; i < p_kont->max_objektu; i++) {
  1883. if (p_kont->p_obj[i] && !strcmp(p_kont->p_obj[i]->jmeno, p_jmeno))
  1884. return (p_kont->p_obj[i]);
  1885. }
  1886. return (NULL);
  1887. }
  1888. EDIT_OBJEKT *lo_najdi_objekt_kont_poiter_ID(EDIT_KONTEJNER * p_kont, int ID)
  1889. {
  1890. int i;
  1891. if (!p_kont)
  1892. return (NULL);
  1893. for (i = 0; i < p_kont->max_objektu; i++) {
  1894. if (p_kont->p_obj[i] && p_kont->p_obj[i]->Objekt_ID == ID)
  1895. return (p_kont->p_obj[i]);
  1896. }
  1897. return (NULL);
  1898. }
  1899. int lo_najdi_volny_mesh(GAME_MESH_OLD ** p_mesh, int max)
  1900. {
  1901. int i = -1;
  1902. while (p_mesh[++i] && i < max);
  1903. return ((i == max) ? K_CHYBA : i);
  1904. }
  1905. int lo_najdi_volny_flare(LENS_FLARE * p_flare, int max)
  1906. {
  1907. int i = -1;
  1908. while (p_flare[++i].akt && i < max);
  1909. return ((i == max) ? K_CHYBA : i);
  1910. }
  1911. // Prevede pole flaru na oboustrany linearni seznam
  1912. LENS_FLARE *lo_flare2linear(LENS_FLARE * p_flare_list, int max)
  1913. {
  1914. LENS_FLARE *p_flare, *p_flare_first;
  1915. LENS_FLARE *p_prev = NULL;
  1916. int i;
  1917. for (i = 0; i < max; i++) {
  1918. if (!p_flare_list[i].akt)
  1919. continue;
  1920. p_flare = (LENS_FLARE *) mmalloc(sizeof(p_flare[0]));
  1921. *p_flare = p_flare_list[i];
  1922. p_flare->p_next = NULL;
  1923. if (p_prev) {
  1924. p_flare->p_prev = p_prev;
  1925. p_prev->p_next = p_flare;
  1926. }
  1927. else {
  1928. p_flare->p_prev = NULL;
  1929. }
  1930. if (!i) {
  1931. p_flare_first = p_flare;
  1932. }
  1933. p_prev = p_flare;
  1934. }
  1935. return (p_flare_first);
  1936. }
  1937. int lo_posledni_svetlo(STATIC_LIGHT * p_light, int max)
  1938. {
  1939. int i = 0, mmx = 0;
  1940. while (i < max) {
  1941. if (p_light[i].akt)
  1942. mmx = i + 1;
  1943. i++;
  1944. }
  1945. return (mmx);
  1946. }
  1947. int lo_reload_textur_formaty(APAK_HANDLE * pHandle, EDIT_TEXT * p_text,
  1948. int max, int save)
  1949. {
  1950. char file[MAX_JMENO];
  1951. int i;
  1952. for (i = 0; i < max; i++) {
  1953. if (p_text[i].jmeno[0] && !p_text[i].load) {
  1954. kprintf(TRUE, "Texture %s...", p_text[i].jmeno);
  1955. if (strcasestr(p_text[i].jmeno, ".bmp")
  1956. || strcasestr(p_text[i].jmeno, ".btx")) {
  1957. if (!txt_nahraj_texturu_z_func(pHandle, p_text[i].jmeno, p_text + i,
  1958. save, TRUE, NULL, bmp_nahraj)) {
  1959. zamen_koncovku(strcpy(file, p_text[i].jmeno), ".jpg");
  1960. if (txt_nahraj_texturu_z_func(pHandle, file, p_text + i, save, TRUE,
  1961. NULL, bmp_nahraj)) {
  1962. strcpy(p_text[i].jmeno, file);
  1963. }
  1964. }
  1965. }
  1966. else if (strstr(p_text[i].jmeno, ".dds")) {
  1967. txt_nahraj_texturu_z_dds(pHandle, p_text[i].jmeno, p_text + i, save);
  1968. }
  1969. else if (strstr(p_text[i].jmeno, ".tga")) {
  1970. txt_nahraj_texturu_z_tga(pHandle, p_text[i].jmeno, p_text + i);
  1971. }
  1972. else {
  1973. char file[MAX_JMENO];
  1974. zamen_koncovku(strcpy(file, p_text[i].jmeno), ".bmp");
  1975. if (txt_nahraj_texturu_z_func(pHandle, file, p_text + i, save, TRUE,
  1976. NULL, bmp_nahraj)) {
  1977. strcpy(p_text[i].jmeno, file);
  1978. }
  1979. }
  1980. }
  1981. }
  1982. return (0);
  1983. }
  1984. int lo_reload_textur_dir(EDIT_TEXT * p_text, int max, char *p_dir, int save)
  1985. {
  1986. if (chdir((p_dir))) {
  1987. kprintf(TRUE, "Chyba dir %s...", (p_dir));
  1988. return (FALSE);
  1989. }
  1990. lo_reload_textur_formaty(NULL, p_text, max, save);
  1991. return (0);
  1992. }
  1993. int lo_reload_textur_file(EDIT_TEXT * p_text, int max, char *p_file, int save)
  1994. {
  1995. APAK_HANDLE *pHandle;
  1996. int err;
  1997. pHandle = apakopen((p_file), ".", &err);
  1998. if (!pHandle) {
  1999. kprintf(TRUE, "Chyba otevreni pak file %s...", p_file);
  2000. return (FALSE);
  2001. }
  2002. else {
  2003. pHandle->pActualNode = pHandle->pRootNode->pNextNode;
  2004. }
  2005. kprintf(TRUE, "Texture pak file %s...", p_file);
  2006. lo_reload_textur_formaty(pHandle, p_text, max, save);
  2007. apakclose(pHandle);
  2008. return (0);
  2009. }
  2010. int lo_reload_textur(TEXT_DIR * p_dir, EDIT_TEXT * p_text, int num, int save)
  2011. {
  2012. int i;
  2013. for (i = 0; i < TEXT_DIRS; i++) {
  2014. if (p_dir->texture_dir[i][0]) {
  2015. txt_trida(p_dir->texture_dir_class[i]);
  2016. lo_reload_textur_dir(p_text, num, p_dir->texture_dir[i], save);
  2017. }
  2018. }
  2019. for (i = 0; i < TEXT_DIRS; i++) {
  2020. if (p_dir->texture_file[i][0]) {
  2021. txt_trida(p_dir->texture_file_class[i]);
  2022. lo_reload_textur_file(p_text, num, p_dir->texture_file[i], save);
  2023. }
  2024. }
  2025. lo_reload_textur_chyby(p_text, num);
  2026. return (TRUE);
  2027. }
  2028. int lo_reload_textur_chyby(EDIT_TEXT * p_text, int num)
  2029. {
  2030. int i, ok, n;
  2031. for (i = 0, n = 0, ok = 0; i < num; i++) {
  2032. if (p_text[i].jmeno[0] && !p_text[i].load) {
  2033. kprintf(TRUE, "Chyba loadu textury %s...", p_text[i].jmeno);
  2034. n++;
  2035. }
  2036. else {
  2037. ok++;
  2038. }
  2039. }
  2040. kprintf(TRUE, "Nahrano %d textur", ok);
  2041. kprintf(TRUE, "Chybne nahrano %d textur", n);
  2042. return (TRUE);
  2043. }
  2044. int lo_reload_textur_vypis(EDIT_TEXT * p_text, int num)
  2045. {
  2046. int i;
  2047. for (i = 0; i < num; i++) {
  2048. if (p_text[i].jmeno[0]) {
  2049. kprintf(TRUE, "%d textura %s %d...", i, p_text[i].jmeno,
  2050. p_text[i].load);
  2051. }
  2052. }
  2053. return (TRUE);
  2054. }
  2055. int lo_smaz_textury(EDIT_TEXT * p_text, int max)
  2056. {
  2057. int i;
  2058. for (i = 0; i < max; i++) {
  2059. if (p_text[i].load) {
  2060. txt_zrus_texturu(p_text + i);
  2061. }
  2062. }
  2063. return (0);
  2064. }
  2065. int lo_smaz_textury_bmp(EDIT_TEXT * p_text, int max)
  2066. {
  2067. int i;
  2068. for (i = 0; i < max; i++) {
  2069. if (p_text[i].load && p_text[i].p_bmp) {
  2070. bmp_zrus(&p_text[i].p_bmp);
  2071. }
  2072. }
  2073. return (0);
  2074. }
  2075. // Vraci velikost pixelu v texturach
  2076. int lo_velikost_textur(EDIT_TEXT * p_text, int max)
  2077. {
  2078. int i, xres, yres, vel = 0;
  2079. int r, g, b, a, l, in;
  2080. for (i = 0; i < max; i++) {
  2081. if (p_text[i].load) {
  2082. glBindTexture(p_text[i].typ, p_text[i].text);
  2083. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_WIDTH, &xres);
  2084. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_HEIGHT, &yres);
  2085. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_RED_SIZE, &r);
  2086. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_GREEN_SIZE, &g);
  2087. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_BLUE_SIZE, &b);
  2088. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_ALPHA_SIZE, &a);
  2089. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_LUMINANCE_SIZE,
  2090. &l);
  2091. glGetTexLevelParameteriv(p_text[i].typ, 0, GL_TEXTURE_INTENSITY_SIZE,
  2092. &in);
  2093. vel += xres * yres * (r + b + g + a + l + in);
  2094. }
  2095. }
  2096. return (vel);
  2097. }
  2098. /* reloadne stage z textur do materialu
  2099. */
  2100. void lo_reload_stage(EDIT_MATERIAL ** p_mat, int num)
  2101. {
  2102. int i, t, as;
  2103. for (i = 0; i < num; i++) {
  2104. if (p_mat[i]) {
  2105. for (t = 0; t < MAT_TEXTUR; t++) {
  2106. if (p_mat[i]->p_text[t]) {
  2107. as = p_mat[i]->p_text[t]->alfa_stage;
  2108. if (as != K_CHYBA) {
  2109. p_mat[i]->alfa_state = as; //- alfa stage pouze od 1 textury
  2110. if (as == STAGE_ALFA_MASKA) {
  2111. p_mat[i]->flag &=
  2112. ~(MAT_PRUHLEDNY | MAT_NO_ZMASK | MAT_NO_ZTEST | MAT_NO_CULL);
  2113. }
  2114. }
  2115. as = p_mat[i]->p_text[t]->no_cull;
  2116. if (as) {
  2117. p_mat[i]->flag |= (MAT_NO_CULL);
  2118. }
  2119. }
  2120. }
  2121. }
  2122. }
  2123. }
  2124. int lo_pocet_textur(EDIT_TEXT * p_text, int max)
  2125. {
  2126. int i, vel = 0;
  2127. for (i = 0; i < max; i++) {
  2128. if (p_text[i].load) {
  2129. vel = i;
  2130. }
  2131. }
  2132. return (vel);
  2133. }
  2134. int lo_velikost_meshu(GAME_MESH_OLD ** p_mesh, int num, int *p_facu,
  2135. int *p_vertexu)
  2136. {
  2137. int i, vel = 0;
  2138. for (i = 0; i < num; i++) {
  2139. if (p_mesh[i]) {
  2140. vel += p_mesh[i]->varray.ati_velikost;
  2141. vel += p_mesh[i]->facevel * sizeof(p_mesh[0]->p_face[0]);
  2142. *p_facu += p_mesh[i]->facevel;
  2143. *p_vertexu += p_mesh[i]->vertexnum;
  2144. }
  2145. }
  2146. return (vel);
  2147. }
  2148. int lo_velikost_poly(EDIT_MESH_POLY * p_poly, int num, int *p_facu,
  2149. int *p_vertexu)
  2150. {
  2151. int i, vel = 0;
  2152. for (i = 0; i < num; i++) {
  2153. vel += p_poly[i].varray.ati_velikost;
  2154. *p_facu += p_poly[i].facenum;
  2155. *p_vertexu += p_poly[i].facenum;
  2156. }
  2157. return (vel);
  2158. }
  2159. /*
  2160. *.mnt - soubory s materialama
  2161. */
  2162. void lo_vymaz_materialy(EDIT_MATERIAL ** p_mat, int max_mat,
  2163. EDIT_TEXT * p_text, int max_text)
  2164. {
  2165. int i;
  2166. for (i = 0; i < max_mat; i++) {
  2167. if (p_mat[i])
  2168. zrus_material(p_mat + i);
  2169. }
  2170. for (i = 0; i < max_text; i++) {
  2171. if (p_text[i].load) {
  2172. txt_zrus_texturu(p_text + i);
  2173. }
  2174. }
  2175. }
  2176. /******************************************************************************
  2177. Materialy
  2178. ******************************************************************************
  2179. */
  2180. int lo_najdi_prazdnou_animaci(ANIM_MATERIAL * p_anim, int max)
  2181. {
  2182. int i;
  2183. for (i = 0; i < max; i++) {
  2184. if (!p_anim[i].pouzita)
  2185. return (i);
  2186. }
  2187. return (K_CHYBA);
  2188. }
  2189. /*
  2190. komplet = 0 - vsechno
  2191. --||--- = 1 - frame
  2192. --||--- = 2 - posun
  2193. #define ANIM_LOAD_ALL 0
  2194. #define ANIM_LOAD_FRAME 1
  2195. #define ANIM_LOAD_POSUN 2
  2196. */
  2197. #define FFF_FILE 'F' // |F |
  2198. #define FFF_TIME 'T'
  2199. #define FFF_EVENT 'E'
  2200. #define FFF_ALFA 'A'
  2201. #define FFF_POSUN 'P'
  2202. void lo_vyrob_animaci_list(EDIT_MATERIAL * p_mat, char *p_list,
  2203. EDIT_TEXT * p_text, int max, char komplet, char *p_dir)
  2204. {
  2205. ANIM_MATERIAL *p_amat = &p_mat->anim;
  2206. FILE *f;
  2207. char line[200]; // max delka radku
  2208. char *p_pom, *p_next;
  2209. int linenum;
  2210. int first_text = 1, i, t, akt, pos, alfa, a;
  2211. chdir((p_dir));
  2212. if ((f = fopen(p_list, "r")) == NULL) {
  2213. ddw("Nemuzu otevrit soubor %s", p_list);
  2214. assert(0);
  2215. return;
  2216. }
  2217. lo_zrus_animaci(p_amat);
  2218. // Prekopiruj list
  2219. strcpy(p_amat->jmeno, p_list);
  2220. // nahraj informace o frame animaci
  2221. if (komplet == ANIM_LOAD_ALL || komplet == ANIM_LOAD_FRAME) {
  2222. fgets(line, 200, f);
  2223. sscanf(line, "FRAME %d %d %d", &akt, &p_amat->frameakt, &alfa);
  2224. if (akt) {
  2225. p_mat->flag =
  2226. akt ? p_mat->flag | MAT_ANIM_FRAME : p_mat->flag & ~MAT_ANIM_FRAME;
  2227. //p_mat->flag = alfa ? p_mat->flag|MAT_ALFA_FAKTOR : p_mat->flag&~MAT_ALFA_FAKTOR;
  2228. }
  2229. }
  2230. else
  2231. fgets(line, 200, f);
  2232. // nahraj informace o posunu
  2233. if (komplet == ANIM_LOAD_ALL || komplet == ANIM_LOAD_POSUN) {
  2234. fgets(line, 200, f);
  2235. sscanf(line, "POSUN %d\n", &pos);
  2236. }
  2237. else
  2238. fgets(line, 200, f);
  2239. // pokud je pozadavek na load frame animace
  2240. if (komplet == ANIM_LOAD_ALL || komplet == ANIM_LOAD_FRAME) {
  2241. linenum = 0;
  2242. while (fgets(line, 200, f))
  2243. linenum++;
  2244. // ddw("%d radek animace",linenum);
  2245. strcpy(p_amat->jmeno, p_list);
  2246. p_amat->framenum = linenum;
  2247. p_amat->frameakt = 0;
  2248. p_amat->p_frame =
  2249. (ANIM_FRAME *) mmalloc(sizeof(ANIM_FRAME) * p_amat->framenum);
  2250. fseek(f, 0, SEEK_SET);
  2251. fgets(line, 200, f);
  2252. fgets(line, 200, f);
  2253. for (i = 0; i < p_amat->framenum; i++) {
  2254. fgets(line, 200, f); // nacti jmeno souboru
  2255. if ((p_pom = strchr(line, '\n')))
  2256. *p_pom = 0;
  2257. p_amat->p_frame[i].file[0] = 0;
  2258. p_amat->p_frame[i].flag &= ~FRAME_TEXTURA;
  2259. p_pom = line;
  2260. while (p_pom && p_pom[0]) {
  2261. if ((p_next = strchr(p_pom, '|'))) {
  2262. *p_next++ = 0;
  2263. }
  2264. /* Format p_pom:
  2265. A ' '
  2266. p_next -> dalsi zaznam
  2267. */
  2268. // Load textury
  2269. a = tolower((int) p_pom[0]);
  2270. switch (a) {
  2271. case 'f': // je to texture file
  2272. // pridej do texture listu
  2273. t = lo_najdi_texturu(p_text, max, p_pom + 2, FALSE);
  2274. if (t == K_CHYBA) {
  2275. t = lo_najdi_volnou_texturu(p_text, max);
  2276. if (t == K_CHYBA)
  2277. chyba("Neni volna textura !");
  2278. else {
  2279. memset(p_text + t, 0, sizeof(p_text[t]));
  2280. strcpy(p_text[t].jmeno, p_pom + 2);
  2281. }
  2282. }
  2283. p_amat->p_frame[i].p_text = p_text + t;
  2284. strcpy(p_amat->p_frame[i].file, p_pom + 2);
  2285. p_amat->p_frame[i].flag |= FRAME_TEXTURA;
  2286. if (first_text) {
  2287. strcpy(p_mat->textfile[0], p_text[t].jmeno);
  2288. p_mat->p_text[0] = p_text + t;
  2289. p_mat->textflag[0] = 0;
  2290. first_text = FALSE;
  2291. }
  2292. break;
  2293. case 't': // time flag
  2294. p_amat->p_frame[i].time = ftoi(atof(p_pom + 2) * 1000);
  2295. break;
  2296. case 'e': // event flag
  2297. p_amat->p_frame[i].flag |= FRAME_EVENT;
  2298. break;
  2299. case 'a':
  2300. sscanf(p_pom + 2, "%x", &p_amat->p_frame[i].alfa);
  2301. p_amat->p_frame[i].flag |= FRAME_ALFA_FAKTOR;
  2302. break;
  2303. case 'p':
  2304. sscanf(p_pom + 2, "%f %f", &p_amat->p_frame[i].u,
  2305. &p_amat->p_frame[i].v);
  2306. p_amat->p_frame[i].flag |= FRAME_POSUN;
  2307. p_mat->flag |= MAT_POSUN2D;
  2308. break;
  2309. default:
  2310. ddw("Neznamy flag ! (%s)", p_pom);
  2311. break;
  2312. }
  2313. p_pom = p_next;
  2314. }
  2315. }
  2316. }
  2317. fclose(f);
  2318. }
  2319. /*
  2320. #define FFF_FILE 'F' // |F |
  2321. #define FFF_TIME 'T'
  2322. #define FFF_EVENT 'E'
  2323. #define FFF_ALFA 'A'
  2324. #define FFF_POSUN 'P'
  2325. #define FRAME_EVENT 0x1 // timto framem se nepokracuje (ceka se na udalost)
  2326. #define FRAME_ALFA_FAKTOR 0x2 // tento frame ma nastavit alfa-stage
  2327. #define FRAME_TEXTURA 0x4 // tento frame ma nastavit texturu
  2328. #define FRAME_POSUN 0x8 // posun texturu oproti originalu
  2329. */
  2330. void lo_uloz_animaci_list(EDIT_MATERIAL * p_mat, char *p_list, char *p_dir)
  2331. {
  2332. ANIM_MATERIAL *p_amat = &p_mat->anim;
  2333. int i, akt;
  2334. FILE *f;
  2335. if ((f = fopen(p_list, "w")) == NULL)
  2336. chybat(STC, "File %s", p_list);
  2337. akt = p_mat->flag & MAT_ANIM_FRAME;
  2338. fprintf(f, "FRAME %d %d %d\n", akt, p_amat->frameakt, 0);
  2339. fprintf(f, "POSUN %d\n", 0);
  2340. for (i = 0; i < p_amat->framenum; i++) {
  2341. /* Soubor
  2342. */
  2343. fputc(FFF_FILE, f);
  2344. fputc(' ', f);
  2345. fputs(p_amat->p_frame[i].file, f);
  2346. fputc('|', f);
  2347. /* Cas
  2348. */
  2349. fprintf(f, "T %.3f|", (float) (p_amat->p_frame[i].time) * 0.001f);
  2350. /* Event flag
  2351. */
  2352. if (p_amat->p_frame[i].flag & FRAME_EVENT) {
  2353. fputc(FFF_EVENT, f);
  2354. fputc('|', f);
  2355. }
  2356. /* Alfa flag
  2357. */
  2358. if (p_amat->p_frame[i].flag & FRAME_ALFA_FAKTOR) {
  2359. fprintf(f, "%c %x|", FFF_ALFA, p_amat->p_frame[i].alfa);
  2360. }
  2361. /* Posunovaci flag
  2362. */
  2363. if (p_amat->p_frame[i].flag & FRAME_POSUN) {
  2364. fprintf(f, "%c %f %f |", FFF_POSUN, p_amat->p_frame[i].u,
  2365. p_amat->p_frame[i].v);
  2366. }
  2367. fputc('\n', f);
  2368. }
  2369. fclose(f);
  2370. }
  2371. void lo_zrus_animaci(ANIM_MATERIAL * p_amat)
  2372. {
  2373. if (p_amat->p_frame)
  2374. free(p_amat->p_frame);
  2375. memset(p_amat, 0, sizeof(ANIM_MATERIAL));
  2376. }
  2377. /*
  2378. Poly-listy
  2379. */
  2380. EDIT_MESH_POLY *vyrob_poly(void)
  2381. {
  2382. return ((EDIT_MESH_POLY *) mmalloc(sizeof(EDIT_MESH_POLY)));
  2383. }
  2384. void zrus_vnitrek_poly(EDIT_MESH_POLY * p_poly)
  2385. {
  2386. int i;
  2387. if (poly_vertex_array_zrus)
  2388. poly_vertex_array_zrus(p_poly);
  2389. if (p_poly->p_ind) {
  2390. for (i = 0; i < (p_poly->facenum / 3); i++) {
  2391. bmp_zrus(&p_poly->p_ind[i].p_bmp);
  2392. bmp_zrus(&p_poly->p_ind[i].p_zal);
  2393. }
  2394. null_free((void **) &p_poly->p_ind);
  2395. }
  2396. null_free((void **) &p_poly->p_koord);
  2397. null_free((void **) &p_poly->p_light);
  2398. null_free((void **) &p_poly->p_lightnum);
  2399. null_free((void **) &p_poly->p_edlight);
  2400. }
  2401. void zrus_poly(EDIT_MESH_POLY ** p_poly)
  2402. {
  2403. zrus_vnitrek_poly(*p_poly);
  2404. free((*p_poly));
  2405. *p_poly = NULL;
  2406. }
  2407. BOD *lo_edit_to_poly_najdi_vetex(BOD * p_pozice, int bodu, OBJ_VERTEX * p_bod,
  2408. int *p_index)
  2409. {
  2410. int v;
  2411. for (v = 0; v < bodu; v++) {
  2412. if (p_pozice[v].x == p_bod->x &&
  2413. p_pozice[v].y == p_bod->y && p_pozice[v].z == p_bod->z) {
  2414. *p_index = v;
  2415. return (p_pozice);
  2416. }
  2417. }
  2418. return (NULL);
  2419. }
  2420. /*
  2421. Frci pouze na kontejnery 1:1 (1 kont s 1 objektem - poly ma jeden material)
  2422. */
  2423. EDIT_MESH_POLY *edit_to_poly_indir(EDIT_KONTEJNER * p_kont,
  2424. EDIT_MESH_POLY * p_poly, int kID)
  2425. {
  2426. OBJ_VERTEX *p_bod;
  2427. EDIT_OBJEKT *p_obj;
  2428. TEXT_KOORD *p_koord;
  2429. int bodu, f;
  2430. int facu_material;
  2431. int spec = p_kont->m2flag & MAT2_SPECULAR;
  2432. if (!p_poly)
  2433. return (NULL);
  2434. if (p_kont->objektu != 1) {
  2435. ddw("Poly s %d objektama !", p_kont->objektu);
  2436. assert(0);
  2437. }
  2438. p_obj = p_kont->p_obj[0];
  2439. assert(p_obj);
  2440. memset(p_poly, 0, sizeof(*p_poly));
  2441. strcpy(p_poly->jmeno, p_kont->jmeno);
  2442. kont_norm_vect(p_kont);
  2443. updatuj_kontejner_statistika(p_kont, FALSE); // pocty objektu a pod.
  2444. facu_material = p_kont->facu / 3;
  2445. // koordinaty pro vsecny facy kontejneru
  2446. p_koord = (TEXT_KOORD *) mmalloc(sizeof(TEXT_KOORD) * p_obj->facenum);
  2447. // prevede facy
  2448. bodu = 0;
  2449. // vyrobim list sousednosti
  2450. if (!p_obj->p_fsous)
  2451. obj_vyrob_list_sousednosti(p_obj);
  2452. p_poly->p_fsous =
  2453. (dword *) kopiruj_pole(p_obj->p_fsous,
  2454. sizeof(p_obj->p_fsous[0]) * p_obj->facenum);
  2455. p_poly->material = p_obj->material;
  2456. // prekopiruj plosky
  2457. for (f = 0; f < p_obj->facenum; f++) {
  2458. p_bod = p_obj->p_vertex + p_obj->p_face[f];
  2459. p_koord[f].x = p_bod->x;
  2460. p_koord[f].y = p_bod->y;
  2461. p_koord[f].z = p_bod->z;
  2462. p_koord[f].tu1 = p_bod->tu1;
  2463. p_koord[f].tv1 = p_bod->tv1;
  2464. p_koord[f].tu2 = p_bod->tu2;
  2465. p_koord[f].tv2 = p_bod->tv2;
  2466. p_koord[f].tu3 = p_bod->tu3;
  2467. p_koord[f].tv3 = p_bod->tv3;
  2468. p_koord[f].tu4 = p_bod->tu4;
  2469. p_koord[f].tv4 = p_bod->tv4;
  2470. p_koord[f].nx = p_bod->nx;
  2471. p_koord[f].ny = p_bod->ny;
  2472. p_koord[f].nz = p_bod->nz;
  2473. p_koord[f].dr = p_bod->dr;
  2474. p_koord[f].dg = p_bod->dg;
  2475. p_koord[f].db = p_bod->db;
  2476. p_koord[f].da = p_bod->da;
  2477. p_koord[f].mdr = p_bod->mdr;
  2478. p_koord[f].mdg = p_bod->mdg;
  2479. p_koord[f].mdb = p_bod->mdb;
  2480. p_koord[f].mda = p_bod->mda;
  2481. if (spec) {
  2482. p_koord[f].sr = p_bod->sr;
  2483. p_koord[f].sg = p_bod->sg;
  2484. p_koord[f].sb = p_bod->sb;
  2485. p_koord[f].msr = p_bod->msr;
  2486. p_koord[f].msg = p_bod->msg;
  2487. p_koord[f].msb = p_bod->msb;
  2488. }
  2489. else {
  2490. p_koord[f].msr = p_koord[f].sr = 0.0f;
  2491. p_koord[f].msg = p_koord[f].sg = 0.0f;
  2492. p_koord[f].msb = p_koord[f].sb = 0.0f;
  2493. }
  2494. }
  2495. p_poly->p_koord = p_koord;
  2496. p_poly->facenum = p_kont->facu;
  2497. p_poly->kflag = p_kont->kflag;
  2498. p_poly->k2flag = p_kont->k2flag;
  2499. p_poly->m1flag = p_kont->m1flag;
  2500. p_poly->m2flag = p_kont->m2flag;
  2501. p_poly->p_mlha = p_kont->p_mlha;
  2502. if (p_kont->p_mlha) {
  2503. p_kont->p_mlha->poly = kID;
  2504. p_kont->p_mlha->p_kont = NULL;
  2505. p_kont->p_mlha = NULL;
  2506. }
  2507. p_poly->kreslit = TRUE;
  2508. obb_calc_poly(p_poly);
  2509. return (p_poly);
  2510. }
  2511. void lo_poly_flaguj_materialy(EDIT_MESH_POLY * p_poly, EDIT_MATERIAL ** p_mat)
  2512. {
  2513. int mat;
  2514. p_poly->m1flag |= p_mat[p_poly->material]->flag;
  2515. p_poly->m2flag |= p_mat[p_poly->material]->flag2;
  2516. mat = p_poly->material;
  2517. if (alfa_stage_edit_blok[p_mat[mat]->alfa_state].alfa_pruhledny) {
  2518. p_poly->m1flag |= MAT_PRUHLEDNY;
  2519. }
  2520. else {
  2521. p_poly->m1flag &= ~MAT_PRUHLEDNY;
  2522. }
  2523. if (p_mat[mat]->alfa_state == STAGE_ALFA_MASKA) {
  2524. p_poly->m2flag |= MAT2_MASKA;
  2525. }
  2526. else {
  2527. p_poly->m2flag &= ~MAT2_MASKA;
  2528. }
  2529. }
  2530. void lo_poly_oznac_zrcadlo(EDIT_MESH_POLY * p_poly)
  2531. {
  2532. p_poly->kflag |= KONT_ZRCADLO;
  2533. }
  2534. FFILE lo_poly_file_vyrob(char *p_file, int filenum, int velikost)
  2535. {
  2536. FFILE f;
  2537. if (!(f = ffopen(p_file, "wb"))) {
  2538. assert(0);
  2539. chyba("file");
  2540. }
  2541. ffwrite(&filenum, sizeof(int), 1, f);
  2542. ffwrite(&velikost, sizeof(int), 1, f);
  2543. return (f);
  2544. }
  2545. FFILE lo_poly_file_otevri(char *p_file, int *p_filenum, int velikost)
  2546. {
  2547. FFILE f;
  2548. int vel;
  2549. if (!(f = ffopen(p_file, "rb"))) {
  2550. kprintf(1, "Unable to open file %s", p_file);
  2551. assert(0);
  2552. chyba("file");
  2553. }
  2554. ffread(p_filenum, sizeof(int), 1, f);
  2555. ffread(&vel, sizeof(int), 1, f);
  2556. if (vel != velikost) {
  2557. ddw("Nesouhlasi verze poly !! Ulozte ho znova.");
  2558. ffclose(f);
  2559. return (NULL);
  2560. }
  2561. return (f);
  2562. }
  2563. void lo_poly_file_zavri(FFILE f)
  2564. {
  2565. ffclose(f);
  2566. }
  2567. void lo_poly_uloz(FFILE f, EDIT_MESH_POLY * p_poly, EDIT_TEXT * p_light)
  2568. {
  2569. int i;
  2570. ffwrite(p_poly, sizeof(p_poly[0]), 1, f);
  2571. ffwrite(p_poly->p_koord, sizeof(p_poly->p_koord[0]), p_poly->facenum, f);
  2572. for (i = 0; i < p_poly->lightnum; i++) {
  2573. p_poly->p_light[i] = (EDIT_TEXT *) (p_poly->p_light[i] - p_light);
  2574. }
  2575. ffwrite(p_poly->p_light, sizeof(p_poly->p_light[0]), p_poly->lightnum, f);
  2576. ffwrite(p_poly->p_lightnum, sizeof(p_poly->p_lightnum[0]), p_poly->lightnum,
  2577. f);
  2578. for (i = 0; i < p_poly->lightnum; i++) {
  2579. p_poly->p_light[i] = p_light + (int) p_poly->p_light[i];
  2580. }
  2581. }
  2582. void lo_poly_nahraj_indir(FFILE f, EDIT_MESH_POLY * p_poly,
  2583. EDIT_TEXT * p_light)
  2584. {
  2585. int i;
  2586. ffread(p_poly, sizeof(p_poly[0]), 1, f);
  2587. p_poly->mail = 0;
  2588. p_poly->p_koord =
  2589. (TEXT_KOORD *) mmalloc(sizeof(p_poly->p_koord[0]) * p_poly->facenum);
  2590. ffread(p_poly->p_koord, sizeof(p_poly->p_koord[0]), p_poly->facenum, f);
  2591. p_poly->p_light =
  2592. (EDIT_TEXT **) mmalloc(sizeof(p_poly->p_light[0]) * p_poly->lightnum);
  2593. p_poly->p_lightnum =
  2594. (int *) mmalloc(sizeof(p_poly->p_lightnum[0]) * p_poly->lightnum);
  2595. ffread(p_poly->p_light, sizeof(p_poly->p_light[0]), p_poly->lightnum, f);
  2596. ffread(p_poly->p_lightnum, sizeof(p_poly->p_lightnum[0]), p_poly->lightnum,
  2597. f);
  2598. for (i = 0; i < p_poly->lightnum; i++) {
  2599. p_poly->p_light[i] = p_light + (int) p_poly->p_light[i];
  2600. }
  2601. }
  2602. EDIT_MESH_POLY *lo_nahraj_poly_list(char *p_file, int *p_polynum,
  2603. EDIT_TEXT * p_light, EDIT_MATERIAL ** p_mat, int matnum)
  2604. {
  2605. EDIT_MESH_POLY *p_poly;
  2606. char material[50];
  2607. int i, filenum, mat, mn;
  2608. FFILE f;
  2609. if (!(f = lo_poly_file_otevri(p_file, &filenum, sizeof(p_poly[0])))) {
  2610. *p_polynum = 0;
  2611. return (NULL);
  2612. }
  2613. if (!filenum) {
  2614. *p_polynum = 0;
  2615. return (NULL);
  2616. }
  2617. if (!(p_poly = (EDIT_MESH_POLY *) mmalloc(sizeof(p_poly[0]) * filenum))) {
  2618. assert(0);
  2619. chyba("Pamet!");
  2620. }
  2621. for (i = 0; i < filenum; i++) {
  2622. ffread(material, sizeof(char), 50, f);
  2623. lo_poly_nahraj_indir(f, p_poly + i, p_light);
  2624. if (p_poly[i].m1flag & MAT_ANIM_FRAME) {
  2625. // animovany material u poly-listu skopiruju
  2626. mat = lo_najdi_material(p_mat, matnum, material);
  2627. assert(mat != K_CHYBA);
  2628. p_poly[i].material = mn = lo_najdi_prazdny_material(p_mat, matnum);
  2629. assert(mn != K_CHYBA);
  2630. p_mat[mn] = kopiruj_material(p_mat[mat]);
  2631. sprintf(p_mat[mn]->jmeno, "%s_ak%d", p_mat[mat]->jmeno, mn);
  2632. }
  2633. else {
  2634. p_poly[i].material = lo_najdi_material(p_mat, matnum, material);
  2635. }
  2636. assert(p_poly[i].material != K_CHYBA);
  2637. }
  2638. lo_poly_file_zavri(f);
  2639. *p_polynum = filenum;
  2640. for (i = 0; i < filenum; i++)
  2641. p_poly[i].kflag |= KONT_UPLOAD;
  2642. return (p_poly);
  2643. }
  2644. void lo_uloz_poly_list(char *p_file, EDIT_MESH_POLY * p_poly, int polynum,
  2645. EDIT_TEXT * p_light, EDIT_MATERIAL ** p_mat, int matnum)
  2646. {
  2647. char material[50];
  2648. FFILE f;
  2649. int i;
  2650. f = lo_poly_file_vyrob(p_file, polynum, sizeof(p_poly[0]));
  2651. for (i = 0; i < polynum; i++) {
  2652. assert(p_poly[i].material < matnum && p_mat[p_poly[i].material]);
  2653. strcpy(material, p_mat[p_poly[i].material]->jmeno);
  2654. ffwrite(material, sizeof(char), 50, f);
  2655. lo_poly_uloz(f, p_poly + i, p_light);
  2656. }
  2657. lo_poly_file_zavri(f);
  2658. }
  2659. void lo_poly_calc_lightmap_face(EDIT_MESH_POLY * p_poly)
  2660. {
  2661. LIGHTMAP_FACE *p_lf;
  2662. int facu = p_poly->facenum / 3;
  2663. int ind;
  2664. int l, i, last = 0;
  2665. int s, u, v, t;
  2666. BOD prus;
  2667. float bmp_u, bmp_v;
  2668. BOD vu, vv; // smerove vektory x,y
  2669. p_poly->p_ind = (LIGHTMAP_FACE *) mmalloc(sizeof(p_poly->p_ind[0]) * facu);
  2670. for (l = 0; l < p_poly->lightnum; l++) {
  2671. for (i = 0; i < p_poly->p_lightnum[l]; i += 3) {
  2672. ind = (last + i) / 3;
  2673. p_lf = p_poly->p_ind + ind;
  2674. s = last + i;
  2675. u = last + i + 1;
  2676. v = last + i + 2;
  2677. // Setrideni podle u
  2678. if (p_poly->p_koord[s].tul > p_poly->p_koord[u].tul) {
  2679. t = s;
  2680. s = u;
  2681. u = t;
  2682. if (p_poly->p_koord[s].tul > p_poly->p_koord[v].tul) {
  2683. t = s;
  2684. s = v;
  2685. v = t;
  2686. }
  2687. }
  2688. else {
  2689. if (p_poly->p_koord[v].tul > p_poly->p_koord[u].tul) {
  2690. t = u;
  2691. u = v;
  2692. v = t;
  2693. }
  2694. }
  2695. // Setrideni podle v
  2696. if (p_poly->p_koord[s].tvl > p_poly->p_koord[u].tvl) {
  2697. t = s;
  2698. s = u;
  2699. u = t;
  2700. if (p_poly->p_koord[s].tvl > p_poly->p_koord[v].tvl) {
  2701. t = s;
  2702. s = v;
  2703. v = t;
  2704. }
  2705. }
  2706. else {
  2707. if (p_poly->p_koord[v].tvl < p_poly->p_koord[u].tvl) {
  2708. t = u;
  2709. u = v;
  2710. v = t;
  2711. }
  2712. }
  2713. p_lf->last_u = 0;
  2714. // Ted to je OK, s-u-v
  2715. p_lf->s0.x = p_poly->p_koord[s].x;
  2716. p_lf->s0.y = p_poly->p_koord[s].y;
  2717. p_lf->s0.z = p_poly->p_koord[s].z;
  2718. vektor_sub((BOD *) (p_poly->p_koord + u), (BOD *) (p_poly->p_koord + s),
  2719. &vu);
  2720. prusecik((BOD *) (p_poly->p_koord + s), (BOD *) (p_poly->p_koord + u),
  2721. (BOD *) (p_poly->p_koord + v), &prus);
  2722. vektor_sub((BOD *) (p_poly->p_koord + v), &prus, &vv);
  2723. calc_rovinu_bod((BOD *) (p_poly->p_koord + s),
  2724. (BOD *) (p_poly->p_koord + s + 2), (BOD *) (p_poly->p_koord + s + 1),
  2725. &p_poly->p_ind[ind].n);
  2726. norm_rovinu(&p_poly->p_ind[ind].n);
  2727. calc_rovinu_bod_vektor((BOD *) (p_poly->p_koord + s), &vu,
  2728. &p_poly->p_ind[ind].rv);
  2729. norm_rovinu(&p_poly->p_ind[ind].rv);
  2730. calc_rovinu_bod_vektor((BOD *) (p_poly->p_koord + s), &vv,
  2731. &p_poly->p_ind[ind].ru);
  2732. norm_rovinu(&p_poly->p_ind[ind].ru);
  2733. p_poly->p_ind[ind].ddu = vektor_velikost(&vu);
  2734. p_poly->p_ind[ind].ddv = vektor_velikost(&vv);
  2735. vektor_add(&p_lf->s0, &vv, &p_lf->s1);
  2736. vektor_add(&p_lf->s0, &vu, &p_lf->s2);
  2737. vektor_add(&p_lf->s2, &vv, &p_lf->s3);
  2738. if (p_poly->p_light[l]->p_bmp) {
  2739. bmp_u = (float) p_poly->p_light[l]->p_bmp->x;
  2740. bmp_v = (float) p_poly->p_light[l]->p_bmp->y;
  2741. p_poly->p_ind[ind].u =
  2742. ftoi((float) floor(p_poly->p_koord[s].tul * bmp_u));
  2743. p_poly->p_ind[ind].v =
  2744. ftoi((float) floor(p_poly->p_koord[s].tvl * bmp_v));
  2745. p_poly->p_ind[ind].nu =
  2746. ftoi((float) ceil(p_poly->p_koord[u].tul * bmp_u));
  2747. p_poly->p_ind[ind].nv =
  2748. ftoi((float) ceil(p_poly->p_koord[v].tvl * bmp_v));
  2749. p_poly->p_ind[ind].nu -= p_poly->p_ind[ind].u;
  2750. p_poly->p_ind[ind].nv -= p_poly->p_ind[ind].v;
  2751. p_poly->p_ind[ind].p_bmp =
  2752. bmp_vyrob(p_poly->p_ind[ind].nu + 2, p_poly->p_ind[ind].nv + 2);
  2753. p_poly->p_ind[ind].p_zal =
  2754. bmp_vyrob(p_poly->p_ind[ind].nu + 2, p_poly->p_ind[ind].nv + 2);
  2755. // MSS_SET_BLOCK_LABEL(p_poly->p_ind[ind].p_bmp, "lo_poly_calc_lightmap_face1");
  2756. // MSS_SET_BLOCK_LABEL(p_poly->p_ind[ind].p_zal, "lo_poly_calc_lightmap_face2");
  2757. bmp_vyber_rec(p_poly->p_light[l]->p_bmp,
  2758. p_poly->p_ind[ind].p_bmp,
  2759. p_poly->p_ind[ind].u - 1, p_poly->p_ind[ind].v - 1);
  2760. bmp_kopiruj(p_poly->p_ind[ind].p_bmp, p_poly->p_ind[ind].p_zal);
  2761. }
  2762. else {
  2763. kprintf(1, "lo_poly_calc_lightmap_face -> p_bmp = NULL!");
  2764. }
  2765. }
  2766. last += p_poly->p_lightnum[l];
  2767. }
  2768. }
  2769. /* **********************************************************************
  2770. Load/save kont/materialy
  2771. */
  2772. /* Uklada utomaticky do *.b2m
  2773. */
  2774. FFILE lo_uloz_kontejner(EDIT_MATERIAL ** p_mat, int max_mat,
  2775. EDIT_KONTEJNER * p_kont_top, char *p_jmeno, int file, FFILE f)
  2776. {
  2777. EDIT_KONTEJNER *p_kont;
  2778. if (f == FALSE || !file) {
  2779. if ((f = ffopen(p_jmeno, "wb")) == NULL) {
  2780. return (FALSE);
  2781. }
  2782. }
  2783. lo_uloz_kontejner_chunk(f, p_mat, max_mat, p_kont_top, FALSE);
  2784. p_kont = p_kont_top->p_next;
  2785. while (p_kont) {
  2786. lo_uloz_kontejner_chunk(f, p_mat, max_mat, p_kont, TRUE);
  2787. p_kont = p_kont->p_next;
  2788. }
  2789. if (!file) {
  2790. ffclose(f);
  2791. return (NULL);
  2792. }
  2793. else {
  2794. return (f);
  2795. }
  2796. }
  2797. /*
  2798. Nacti b2m (OGL) a out meshe
  2799. */
  2800. EDIT_KONTEJNER *lo_nahraj_kontejner(EDIT_MATERIAL ** p_mat, int max_mat,
  2801. EDIT_TEXT * p_text, int max_text, char *p_jmeno, int mat)
  2802. {
  2803. if (!strcmp(cti_koncovku(p_jmeno), KONCOVKA_MESH_OLD)) {
  2804. return (lo_nahraj_kontejner_out(p_mat, max_mat, p_text, max_text, p_jmeno,
  2805. mat));
  2806. }
  2807. else {
  2808. return (lo_nahraj_kontejner_chunk(p_mat, max_mat, p_text, max_text,
  2809. p_jmeno, mat, FALSE));
  2810. }
  2811. }
  2812. /* Nahraje b2t nebo mnt materialy
  2813. */
  2814. int lo_nahraj_materialy(EDIT_MATERIAL ** p_mat, int max_mat,
  2815. EDIT_TEXT * p_text, int max_text, char *p_file)
  2816. {
  2817. if (!strcmp(cti_koncovku(p_file), KONCOVKA_MATERIAL_OLD)) {
  2818. return (lo_nahraj_materialy_out_jmeno(p_mat, max_mat, p_text, max_text,
  2819. p_file, TRUE));
  2820. }
  2821. else {
  2822. return (lo_nahraj_materialy_chunk(p_mat, max_mat, p_text, max_text,
  2823. p_file, TRUE));
  2824. }
  2825. }
  2826. /*
  2827. Ulozi vsechny materialy vcetne animaci - pouze jako chunk
  2828. */
  2829. int lo_uloz_materialy(EDIT_MATERIAL ** p_mat, int max_mat, char *p_file,
  2830. char *p_dir)
  2831. {
  2832. char file[500];
  2833. FFILE f;
  2834. int i;
  2835. strcpy(file, p_file);
  2836. zamen_koncovku(file, KONCOVKA_MATERIAL);
  2837. chdir((p_dir));
  2838. if ((f = ffopen(file, "wb")) == NULL) {
  2839. return (FALSE);
  2840. }
  2841. for (i = 0; i < max_mat; i++) {
  2842. if (p_mat[i])
  2843. lo_uloz_material_chunk(f, p_mat[i]);
  2844. }
  2845. ffclose(f);
  2846. return (TRUE);
  2847. }
  2848. int lo_uloz_material(EDIT_MATERIAL * p_mat, char *p_file, char *p_dir)
  2849. {
  2850. char file[500];
  2851. FFILE f;
  2852. strcpy(file, p_file);
  2853. zamen_koncovku(file, KONCOVKA_MATERIAL);
  2854. chdir((p_dir));
  2855. if ((f = ffopen(file, "wb")) == NULL) {
  2856. return (FALSE);
  2857. }
  2858. lo_uloz_material_chunk(f, p_mat);
  2859. ffclose(f);
  2860. return (TRUE);
  2861. }
  2862. /*
  2863. ulozi pouzite materily vcetne animaci
  2864. */
  2865. int lo_uloz_materialy_pouzite(EDIT_MATERIAL ** p_mat, int max_mat,
  2866. char *p_file, char *p_dir)
  2867. {
  2868. char file[200];
  2869. FFILE f;
  2870. int i;
  2871. strcpy(file, p_file);
  2872. zamen_koncovku(file, KONCOVKA_MATERIAL);
  2873. chdir((p_dir));
  2874. if ((f = ffopen(file, "wb")) == NULL) {
  2875. return (FALSE);
  2876. }
  2877. for (i = 0; i < max_mat; i++) {
  2878. if (p_mat[i] && p_mat[i]->flag & (MAT_POUZITY | MAT_SYSTEM)) {
  2879. lo_uloz_material_chunk(f, p_mat[i]);
  2880. }
  2881. }
  2882. ffclose(f);
  2883. return (i);
  2884. }
  2885. /*
  2886. Mesi sekce
  2887. */
  2888. GAME_MESH_OLD *lo_nahraj_mesh(EDIT_MATERIAL ** p_mat, int max_mat,
  2889. EDIT_TEXT * p_text, int max_text, char *p_file, int mat, int extra_light)
  2890. {
  2891. EDIT_KONTEJNER *p_kont_top, *p_kont;
  2892. GAME_MESH_OLD *p_mesh_top = NULL, *p_mesh = NULL;
  2893. p_kont = p_kont_top =
  2894. lo_nahraj_kontejner(p_mat, max_mat, p_text, max_text, p_file, mat);
  2895. if (p_kont && p_kont->bodu && p_kont->objektu) {
  2896. while (p_kont) {
  2897. if (extra_light)
  2898. kont_extra_light(p_kont);
  2899. lo_setrid_kontejner_materialy(p_kont);
  2900. if (p_mesh) {
  2901. p_mesh = (p_mesh->p_next =
  2902. edit_to_mesh(p_mesh_top->p_data, p_kont, p_mat, max_mat, FALSE));
  2903. }
  2904. else {
  2905. p_mesh_top = p_mesh =
  2906. edit_to_mesh(NULL, p_kont, p_mat, max_mat, FALSE);
  2907. p_mesh->p_data->p_mesh = p_mesh;
  2908. }
  2909. p_kont = p_kont->p_next;
  2910. }
  2911. }
  2912. else {
  2913. p_mesh_top = NULL;
  2914. }
  2915. zrus_kontejner_rec(&p_kont_top, NULL);
  2916. return (p_mesh_top);
  2917. }
  2918. /* Kontejner to mesh
  2919. */
  2920. GAME_MESH_OLD *lo_kontejner_to_mesh(EDIT_KONTEJNER ** p_kont_top,
  2921. EDIT_MATERIAL ** p_mat, int max_mat, int extra_light)
  2922. {
  2923. EDIT_KONTEJNER *p_kont;
  2924. GAME_MESH_OLD *p_mesh_top = NULL, *p_mesh = NULL;
  2925. p_kont = *p_kont_top;
  2926. if (p_kont->bodu && p_kont->objektu) {
  2927. while (p_kont) {
  2928. if (extra_light)
  2929. kont_extra_light(p_kont);
  2930. lo_setrid_kontejner_materialy(p_kont);
  2931. updatuj_kontejner_statistika(p_kont, FALSE);
  2932. if (p_mesh) {
  2933. p_mesh = (p_mesh->p_next =
  2934. edit_to_mesh(p_mesh_top->p_data, p_kont, p_mat, max_mat, FALSE));
  2935. }
  2936. else {
  2937. p_mesh_top = p_mesh =
  2938. edit_to_mesh(NULL, p_kont, p_mat, max_mat, FALSE);
  2939. p_mesh->p_data->p_mesh = p_mesh;
  2940. }
  2941. p_kont = p_kont->p_next;
  2942. }
  2943. }
  2944. else {
  2945. p_mesh_top = NULL;
  2946. }
  2947. zrus_kontejner_rec(p_kont_top, NULL);
  2948. return (p_mesh_top);
  2949. }
  2950. // Prevede kontejner tak, aby jeho objekty meli jedinecne jmena
  2951. void lo_kontejner_jedinecne_jmena(EDIT_KONTEJNER * p_kont, int ds3)
  2952. {
  2953. char pom[200];
  2954. int i, j, max = 0;
  2955. if (ds3) {
  2956. for (i = 0; i < p_kont->max_objektu; i++) {
  2957. if (p_kont->p_obj[i]) {
  2958. sprintf(p_kont->p_obj[i]->jmeno, "Obj_%d", i);
  2959. }
  2960. }
  2961. }
  2962. else {
  2963. for (i = 0; i < p_kont->max_objektu; i++) {
  2964. if (p_kont->p_obj[i]) {
  2965. max = i + 1;
  2966. }
  2967. }
  2968. for (i = 0; i < max; i++) {
  2969. if (!p_kont->p_obj[i])
  2970. continue;
  2971. for (j = i + 1; j < max; j++) {
  2972. if (!p_kont->p_obj[j])
  2973. continue;
  2974. if (!strcmp(p_kont->p_obj[i]->jmeno, p_kont->p_obj[j]->jmeno)) {
  2975. strcat(p_kont->p_obj[i]->jmeno, "#");
  2976. strcat(p_kont->p_obj[i]->jmeno, itoa(i, pom, 10));
  2977. assert(strlen(p_kont->p_obj[i]->jmeno) < MAX_JMENO);
  2978. break; // koncim a modlim se
  2979. }
  2980. }
  2981. }
  2982. }
  2983. }
  2984. void lo_kontlist_jedinecne_jmena(EDIT_KONTEJNER ** p_kont, int listnum)
  2985. {
  2986. char pom[200];
  2987. int i, j, max = 0;
  2988. // Zjistim posledni objekt
  2989. for (i = 0; i < listnum; i++) {
  2990. if (p_kont[i])
  2991. max = i + 1;
  2992. }
  2993. for (i = 0; i < max; i++) {
  2994. if (!p_kont[i])
  2995. continue;
  2996. for (j = i + 1; j < max; j++) {
  2997. if (!p_kont[j])
  2998. continue;
  2999. if (!strcmp(p_kont[i]->jmeno, p_kont[j]->jmeno)) {
  3000. strcat(p_kont[i]->jmeno, "#");
  3001. strcat(p_kont[i]->jmeno, itoa(i, pom, 10));
  3002. assert(strlen(p_kont[i]->jmeno) < MAX_JMENO);
  3003. break; // koncim a modlim se
  3004. }
  3005. }
  3006. }
  3007. }
  3008. int lo_najdi_volne_stat_svetlo(STATIC_LIGHT * p_light, int max)
  3009. {
  3010. int i;
  3011. for (i = 0; i < max; i++) {
  3012. if (!p_light[i].akt)
  3013. return (i);
  3014. }
  3015. return (K_CHYBA);
  3016. }
  3017. int lo_najdi_plne_stat_svetlo(STATIC_LIGHT * p_light, int max)
  3018. {
  3019. int i;
  3020. for (i = 0; i < max; i++) {
  3021. if (p_light[i].akt)
  3022. return (i);
  3023. }
  3024. return (K_CHYBA);
  3025. }
  3026. int lo_najdi_volne_dsvetlo(DYN_LIGHT * p_dlight, int max)
  3027. {
  3028. int i;
  3029. for (i = 0; i < max; i++) {
  3030. if (!p_dlight[i].akt)
  3031. return (i);
  3032. }
  3033. return (K_CHYBA);
  3034. }
  3035. int lo_najdi_plne_dsvetlo(DYN_LIGHT * p_dlight, int max)
  3036. {
  3037. int i;
  3038. for (i = 0; i < max; i++) {
  3039. if (p_dlight[i].akt)
  3040. return (i);
  3041. }
  3042. return (K_CHYBA);
  3043. }
  3044. DYN_LIGHT *lo_najdi_volne_dsvetlo_point(DYN_LIGHT * p_dlight, int max)
  3045. {
  3046. int i;
  3047. for (i = 0; i < max; i++) {
  3048. if (!p_dlight[i].akt)
  3049. return (p_dlight + i);
  3050. }
  3051. return (NULL);
  3052. }
  3053. int lo_najdi_prepocitej_dsvetlo(DYN_LIGHT * p_dlight, int max)
  3054. {
  3055. int i, dl_lightnum = -1;
  3056. for (i = 0; i < MAX_FLARE_SVETEL; i++) {
  3057. if (p_dlight[i].akt && i > dl_lightnum) {
  3058. dl_lightnum = i;
  3059. }
  3060. }
  3061. return (dl_lightnum + 1);
  3062. }
  3063. /*
  3064. Extra-svetla
  3065. */
  3066. int lo_najdi_prepocitej_extra_svetlo(EXTRA_DYN_LIGHT * p_dlight, int max)
  3067. {
  3068. int i, dl_lightnum = -1;
  3069. for (i = 0; i < MAX_FLARE_SVETEL; i++) {
  3070. if (p_dlight[i].akt && i > dl_lightnum) {
  3071. dl_lightnum = i;
  3072. }
  3073. }
  3074. return (dl_lightnum + 1);
  3075. }
  3076. int lo_najdi_volne_extra_svetlo(EXTRA_DYN_LIGHT * p_dlight, int max)
  3077. {
  3078. int i;
  3079. for (i = 0; i < max; i++) {
  3080. if (!p_dlight[i].akt)
  3081. return (i);
  3082. }
  3083. return (K_CHYBA);
  3084. }
  3085. int lo_najdi_plne_extra_svetlo(EXTRA_DYN_LIGHT * p_dlight, int max)
  3086. {
  3087. int i;
  3088. for (i = 0; i < max; i++) {
  3089. if (p_dlight[i].akt)
  3090. return (i);
  3091. }
  3092. return (K_CHYBA);
  3093. }
  3094. EXTRA_DYN_LIGHT *lo_najdi_volne_extra_svetlo_point(EXTRA_DYN_LIGHT * p_dlight,
  3095. int max)
  3096. {
  3097. int i;
  3098. for (i = 0; i < max; i++) {
  3099. if (!p_dlight[i].akt)
  3100. return (p_dlight + i);
  3101. }
  3102. return (NULL);
  3103. }
  3104. void lo_preved_flare_do_sceny(STATIC_LIGHT * p_light,
  3105. LENS_FLARE * p_flarelist, int flaremax)
  3106. {
  3107. LENS_FLARE *p_flare;
  3108. while (p_light) {
  3109. if (p_light->p_flare) {
  3110. p_flare =
  3111. lo_kopiruj_flare(p_flarelist, flaremax,
  3112. (LENS_FLARE *) p_light->p_flare);
  3113. free(p_light->p_flare);
  3114. p_light->p_flare = p_flare;
  3115. p_flare->p_svetlo = p_light;
  3116. }
  3117. p_light = p_light->p_next;
  3118. }
  3119. }
  3120. void lo_preved_svetla_do_sceny(EDIT_KONTEJNER * p_kont,
  3121. STATIC_LIGHT * p_light, int lightnum, DYN_LIGHT * p_dlist, int dlistnum,
  3122. EXTRA_DYN_LIGHT * p_elist, int elistnum)
  3123. {
  3124. STATIC_LIGHT *p_slight, *p_next;
  3125. DYN_LIGHT *p_dlight, *p_dnext;
  3126. EXTRA_DYN_LIGHT *p_elight, *p_enext;
  3127. int l, p;
  3128. while (p_kont) {
  3129. /* Prevedu staticky svetla
  3130. */
  3131. if (p_light) {
  3132. p_slight = p_kont->p_slight;
  3133. if (p_slight) {
  3134. l = lo_najdi_volne_stat_svetlo(p_light, lightnum);
  3135. if (l != K_CHYBA) {
  3136. p_light[l] = *p_slight;
  3137. if (p_light[l].p_flare)
  3138. ((LENS_FLARE *) (p_light[l].p_flare))->p_svetlo = p_light + l;
  3139. p_light[l].index = l;
  3140. p_light[l].p_mesh_data = p_kont;
  3141. p_light[l].p_prev = NULL;
  3142. p_light[l].p_next = NULL;
  3143. p_kont->p_slight = p_light + l;
  3144. p = l;
  3145. p_next = p_slight->p_next;
  3146. free(p_slight);
  3147. p_slight = p_next;
  3148. while (p_slight) {
  3149. l = lo_najdi_volne_stat_svetlo(p_light, lightnum);
  3150. if (l != K_CHYBA) {
  3151. p_light[l] = *p_slight;
  3152. if (p_light[l].p_flare)
  3153. ((LENS_FLARE *) (p_light[l].p_flare))->p_svetlo = p_light + l;
  3154. p_light[l].index = l;
  3155. p_light[l].p_mesh_data = p_kont;
  3156. p_light[l].p_next = NULL;
  3157. p_light[l].p_prev = p_light + p;
  3158. p_light[p].p_next = p_light + l;
  3159. p = l;
  3160. p_next = p_slight->p_next;
  3161. free(p_slight);
  3162. p_slight = p_next;
  3163. }
  3164. else {
  3165. ddw("Madrfakr!!!! - Dosly nam svetla!");
  3166. }
  3167. }
  3168. }
  3169. }
  3170. }
  3171. /* Prevedu dynamicky svetla
  3172. */
  3173. if (p_dlist) {
  3174. p_dlight = p_kont->p_dlight;
  3175. if (p_dlight) {
  3176. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3177. if (l != K_CHYBA) {
  3178. p_dlist[l] = *p_dlight;
  3179. p_dlist[l].index = l;
  3180. p_dlist[l].p_mesh_data = p_kont;
  3181. p_dlist[l].p_prev = NULL;
  3182. p_dlist[l].p_next = NULL;
  3183. p_kont->p_dlight = p_dlist + l;
  3184. p = l;
  3185. p_dnext = p_dlight->p_next;
  3186. free(p_dlight);
  3187. p_dlight = p_dnext;
  3188. while (p_dlight) {
  3189. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3190. if (l != K_CHYBA) {
  3191. p_dlist[l] = *p_dlight;
  3192. p_dlist[l].index = l;
  3193. p_dlist[l].p_mesh_data = p_kont;
  3194. p_dlist[l].p_next = NULL;
  3195. p_dlist[l].p_prev = p_dlist + p;
  3196. p_dlist[p].p_next = p_dlist + l;
  3197. p = l;
  3198. p_dnext = p_dlight->p_next;
  3199. free(p_dlight);
  3200. p_dlight = p_dnext;
  3201. }
  3202. else {
  3203. ddw("Madrfakr!!!! - Dosly nam dyn. svetla!");
  3204. }
  3205. }
  3206. }
  3207. }
  3208. }
  3209. /* Prevedu extra-dynamicky svetla
  3210. */
  3211. if (p_elist) {
  3212. p_elight = p_kont->p_edlight;
  3213. if (p_elight) {
  3214. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3215. if (l != K_CHYBA) {
  3216. p_elist[l] = *p_elight;
  3217. p_elist[l].index = l;
  3218. p_elist[l].p_mesh_data = p_kont;
  3219. p_elist[l].p_prev = NULL;
  3220. p_elist[l].p_next = NULL;
  3221. p_kont->p_edlight = p_elist + l;
  3222. p = l;
  3223. p_enext = p_elight->p_next;
  3224. free(p_elight);
  3225. p_elight = p_enext;
  3226. while (p_elight) {
  3227. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3228. if (l != K_CHYBA) {
  3229. p_elist[l] = *p_elight;
  3230. p_elist[l].index = l;
  3231. p_elist[l].p_mesh_data = p_kont;
  3232. p_elist[l].p_next = NULL;
  3233. p_elist[l].p_prev = p_elist + p;
  3234. p_elist[p].p_next = p_elist + l;
  3235. p = l;
  3236. p_enext = p_elight->p_next;
  3237. free(p_elight);
  3238. p_elight = p_enext;
  3239. }
  3240. else {
  3241. ddw("Madrfakr!!!! - Dosly nam extra svetla!");
  3242. }
  3243. }
  3244. }
  3245. }
  3246. }
  3247. p_kont = p_kont->p_next;
  3248. }
  3249. }
  3250. // skopiruje svetla do sceny a navaze se na nove svetla
  3251. void lo_kopiruj_svetla_do_sceny(EDIT_KONTEJNER * p_kont,
  3252. STATIC_LIGHT * p_light, int lightnum, DYN_LIGHT * p_dlist, int dlistnum,
  3253. EXTRA_DYN_LIGHT * p_elist, int elistnum, LENS_FLARE * p_flares,
  3254. int maxflares)
  3255. {
  3256. STATIC_LIGHT *p_slight;
  3257. DYN_LIGHT *p_dlight;
  3258. EXTRA_DYN_LIGHT *p_elight;
  3259. int l, p;
  3260. // Prevedu staticky svetla
  3261. if (p_light) {
  3262. p_slight = p_kont->p_slight;
  3263. if (p_slight) {
  3264. l = lo_najdi_volne_stat_svetlo(p_light, lightnum);
  3265. if (l != K_CHYBA) {
  3266. p_light[l] = *p_slight;
  3267. if (p_light[l].p_flare) {
  3268. p_light[l].p_flare =
  3269. lo_kopiruj_flare(p_flares, maxflares,
  3270. (LENS_FLARE *) p_light[l].p_flare);
  3271. ((LENS_FLARE *) (p_light[l].p_flare))->p_svetlo = p_light + l;
  3272. }
  3273. p_light[l].index = l;
  3274. p_light[l].p_mesh_data = p_kont;
  3275. p_light[l].p_prev = NULL;
  3276. p_light[l].p_next = NULL;
  3277. p_kont->p_slight = p_light + l;
  3278. p = l;
  3279. p_slight = p_slight->p_next;
  3280. while (p_slight) {
  3281. l = lo_najdi_volne_stat_svetlo(p_light, lightnum);
  3282. if (l != K_CHYBA) {
  3283. p_light[l] = *p_slight;
  3284. if (p_light[l].p_flare) {
  3285. p_light[l].p_flare =
  3286. lo_kopiruj_flare(p_flares, maxflares,
  3287. (LENS_FLARE *) p_light[l].p_flare);
  3288. ((LENS_FLARE *) (p_light[l].p_flare))->p_svetlo = p_light + l;
  3289. }
  3290. p_light[l].index = l;
  3291. p_light[l].p_mesh_data = p_kont;
  3292. p_light[l].p_next = NULL;
  3293. p_light[l].p_prev = p_light + p;
  3294. p_light[p].p_next = p_light + l;
  3295. p = l;
  3296. p_slight = p_slight->p_next;
  3297. }
  3298. else {
  3299. ddw("Madrfakr!!!! - Dosly nam svetla!");
  3300. }
  3301. }
  3302. }
  3303. }
  3304. }
  3305. // Prevedu dynamicky svetla
  3306. if (p_dlist) {
  3307. p_dlight = p_kont->p_dlight;
  3308. if (p_dlight) {
  3309. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3310. if (l != K_CHYBA) {
  3311. p_dlist[l] = *p_dlight;
  3312. p_dlist[l].index = l;
  3313. p_dlist[l].p_mesh_data = p_kont;
  3314. p_dlist[l].p_prev = NULL;
  3315. p_dlist[l].p_next = NULL;
  3316. p_kont->p_dlight = p_dlist + l;
  3317. p = l;
  3318. p_dlight = p_dlight->p_next;
  3319. while (p_dlight) {
  3320. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3321. if (l != K_CHYBA) {
  3322. p_dlist[l] = *p_dlight;
  3323. p_dlist[l].index = l;
  3324. p_dlist[l].p_mesh_data = p_kont;
  3325. p_dlist[l].p_next = NULL;
  3326. p_dlist[l].p_prev = p_dlist + p;
  3327. p_dlist[p].p_next = p_dlist + l;
  3328. p = l;
  3329. p_dlight = p_dlight->p_next;
  3330. }
  3331. else {
  3332. ddw("Madrfakr!!!! - Dosly nam dyn. svetla!");
  3333. }
  3334. }
  3335. }
  3336. }
  3337. }
  3338. // Prevedu extra svetla
  3339. if (p_elist) {
  3340. p_elight = p_kont->p_edlight;
  3341. if (p_elight) {
  3342. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3343. if (l != K_CHYBA) {
  3344. p_elist[l] = *p_elight;
  3345. p_elist[l].index = l;
  3346. p_elist[l].p_mesh_data = p_kont;
  3347. p_elist[l].p_prev = NULL;
  3348. p_elist[l].p_next = NULL;
  3349. p_kont->p_edlight = p_elist + l;
  3350. p = l;
  3351. p_elight = p_elight->p_next;
  3352. while (p_elight) {
  3353. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3354. if (l != K_CHYBA) {
  3355. p_elist[l] = *p_elight;
  3356. p_elist[l].index = l;
  3357. p_elist[l].p_mesh_data = p_kont;
  3358. p_elist[l].p_next = NULL;
  3359. p_elist[l].p_prev = p_elist + p;
  3360. p_elist[p].p_next = p_elist + l;
  3361. p = l;
  3362. p_elight = p_elight->p_next;
  3363. }
  3364. else {
  3365. ddw("Madrfakr!!!! - Dosly nam extra svetla!");
  3366. }
  3367. }
  3368. }
  3369. }
  3370. }
  3371. }
  3372. // skopiruje svetla do sceny a navaze se na nove svetla
  3373. void lo_kopiruj_svetla_do_sceny_mesh(GAME_MESH_DATA * p_data,
  3374. DYN_LIGHT * p_dlist, int dlistnum, EXTRA_DYN_LIGHT * p_elist, int elistnum)
  3375. {
  3376. DYN_LIGHT *p_dlight;
  3377. EXTRA_DYN_LIGHT *p_elight;
  3378. int l, p;
  3379. /* Prevedu dynamicky svetla
  3380. */
  3381. if (p_dlist) {
  3382. p_dlight = p_data->p_ldlight;
  3383. if (p_dlight) {
  3384. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3385. if (l != K_CHYBA) {
  3386. p_dlist[l] = *p_dlight;
  3387. p_dlist[l].index = l;
  3388. p_dlist[l].p_mesh_data = p_data;
  3389. p_dlist[l].p_prev = NULL;
  3390. p_dlist[l].p_next = NULL;
  3391. p_data->p_ldlight = p_dlist + l;
  3392. p = l;
  3393. p_dlight = p_dlight->p_next;
  3394. while (p_dlight) {
  3395. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3396. if (l != K_CHYBA) {
  3397. p_dlist[l] = *p_dlight;
  3398. p_dlist[l].index = l;
  3399. p_dlist[l].p_mesh_data = p_data;
  3400. p_dlist[l].p_next = NULL;
  3401. p_dlist[l].p_prev = p_dlist + p;
  3402. p_dlist[p].p_next = p_dlist + l;
  3403. p = l;
  3404. p_dlight = p_dlight->p_next;
  3405. }
  3406. else {
  3407. ddw("Madrfakr!!!! - Dosly nam dyn. svetla!");
  3408. }
  3409. }
  3410. }
  3411. }
  3412. }
  3413. /* Prevedu extra svetla
  3414. */
  3415. if (p_elist) {
  3416. p_elight = p_data->p_lelight;
  3417. if (p_dlight) {
  3418. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3419. if (l != K_CHYBA) {
  3420. p_elist[l] = *p_elight;
  3421. p_elist[l].index = l;
  3422. p_elist[l].p_mesh_data = p_data;
  3423. p_elist[l].p_prev = NULL;
  3424. p_elist[l].p_next = NULL;
  3425. p_data->p_lelight = p_elist + l;
  3426. p = l;
  3427. p_elight = p_elight->p_next;
  3428. while (p_elight) {
  3429. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3430. if (l != K_CHYBA) {
  3431. p_elist[l] = *p_elight;
  3432. p_elist[l].index = l;
  3433. p_elist[l].p_mesh_data = p_data;
  3434. p_elist[l].p_next = NULL;
  3435. p_elist[l].p_prev = p_elist + p;
  3436. p_elist[p].p_next = p_elist + l;
  3437. p = l;
  3438. p_elight = p_elight->p_next;
  3439. }
  3440. else {
  3441. ddw("Madrfakr!!!! - Dosly nam dyn. svetla!");
  3442. }
  3443. }
  3444. }
  3445. }
  3446. }
  3447. }
  3448. void lo_preved_svetla_do_sceny_mesh(GAME_MESH_DATA * p_data,
  3449. DYN_LIGHT * p_dlist, int dlistnum, EXTRA_DYN_LIGHT * p_elist, int elistnum)
  3450. {
  3451. DYN_LIGHT *p_dlight, *p_dnext;
  3452. EXTRA_DYN_LIGHT *p_elight, *p_enext;
  3453. int l, p;
  3454. /* Prevedu dynamicky svetla
  3455. */
  3456. if (p_dlist) {
  3457. p_dlight = p_data->p_ldlight;
  3458. if (p_dlight) {
  3459. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3460. if (l != K_CHYBA) {
  3461. p_dlist[l] = *p_dlight;
  3462. p_dlist[l].index = l;
  3463. p_dlist[l].p_mesh_data = p_data;
  3464. p_dlist[l].p_prev = NULL;
  3465. p_dlist[l].p_next = NULL;
  3466. p_data->p_ldlight = p_dlist + l;
  3467. p = l;
  3468. p_dnext = p_dlight->p_next;
  3469. free(p_dlight);
  3470. p_dlight = p_dnext;
  3471. while (p_dlight) {
  3472. l = lo_najdi_volne_dsvetlo(p_dlist, dlistnum);
  3473. if (l != K_CHYBA) {
  3474. p_dlist[l] = *p_dlight;
  3475. p_dlist[l].index = l;
  3476. p_dlist[l].p_mesh_data = p_data;
  3477. p_dlist[l].p_next = NULL;
  3478. p_dlist[l].p_prev = p_dlist + p;
  3479. p_dlist[p].p_next = p_dlist + l;
  3480. p = l;
  3481. p_dnext = p_dlight->p_next;
  3482. free(p_dlight);
  3483. p_dlight = p_dnext;
  3484. }
  3485. else {
  3486. ddw("Madrfakr!!!! - Dosly nam dyn. svetla!");
  3487. }
  3488. }
  3489. }
  3490. }
  3491. }
  3492. /* Prevedu dynamicky svetla
  3493. */
  3494. if (p_elist) {
  3495. p_elight = p_data->p_lelight;
  3496. if (p_elight) {
  3497. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3498. if (l != K_CHYBA) {
  3499. p_elist[l] = *p_elight;
  3500. p_elist[l].index = l;
  3501. p_elist[l].p_mesh_data = p_data;
  3502. p_elist[l].p_prev = NULL;
  3503. p_elist[l].p_next = NULL;
  3504. p_data->p_lelight = p_elist + l;
  3505. p = l;
  3506. p_enext = p_elight->p_next;
  3507. free(p_elight);
  3508. p_elight = p_enext;
  3509. while (p_elight) {
  3510. l = lo_najdi_volne_extra_svetlo(p_elist, elistnum);
  3511. if (l != K_CHYBA) {
  3512. p_elist[l] = *p_elight;
  3513. p_elist[l].index = l;
  3514. p_elist[l].p_mesh_data = p_data;
  3515. p_elist[l].p_next = NULL;
  3516. p_elist[l].p_prev = p_elist + p;
  3517. p_elist[p].p_next = p_elist + l;
  3518. p = l;
  3519. p_enext = p_elight->p_next;
  3520. free(p_elight);
  3521. p_elight = p_enext;
  3522. }
  3523. else {
  3524. ddw("Madrfakr!!!! - Dosly nam dyn. svetla!");
  3525. }
  3526. }
  3527. }
  3528. }
  3529. }
  3530. }
  3531. void lo_vymaz_svetla_ze_sceny(EDIT_KONTEJNER * p_kont)
  3532. {
  3533. STATIC_LIGHT *p_slight = p_kont->p_slight, *p_snext;
  3534. DYN_LIGHT *p_dlight = p_kont->p_dlight, *p_dnext;
  3535. EXTRA_DYN_LIGHT *p_elight = p_kont->p_edlight, *p_enext;
  3536. while (p_slight) {
  3537. p_snext = p_slight->p_next;
  3538. memset(p_slight, 0, sizeof(p_slight[0]));
  3539. p_slight = p_snext;
  3540. }
  3541. while (p_dlight) {
  3542. p_dnext = p_dlight->p_next;
  3543. memset(p_dlight, 0, sizeof(p_dlight[0]));
  3544. p_dlight = p_dnext;
  3545. }
  3546. while (p_elight) {
  3547. p_enext = p_elight->p_next;
  3548. memset(p_elight, 0, sizeof(p_elight[0]));
  3549. p_elight = p_enext;
  3550. }
  3551. }
  3552. void lo_vymaz_svetla(EDIT_KONTEJNER * p_kont)
  3553. {
  3554. STATIC_LIGHT *p_slight = p_kont->p_slight, *p_snext;
  3555. DYN_LIGHT *p_dlight = p_kont->p_dlight, *p_dnext;
  3556. EXTRA_DYN_LIGHT *p_elight = p_kont->p_edlight, *p_enext;
  3557. while (p_slight) {
  3558. p_snext = p_slight->p_next;
  3559. free(p_slight);
  3560. p_slight = p_snext;
  3561. }
  3562. while (p_dlight) {
  3563. p_dnext = p_dlight->p_next;
  3564. free(p_dlight);
  3565. p_dlight = p_dnext;
  3566. }
  3567. while (p_elight) {
  3568. p_enext = p_elight->p_next;
  3569. free(p_elight);
  3570. p_elight = p_enext;
  3571. }
  3572. }
  3573. void lo_vymaz_svetla_ze_sceny_mesh(GAME_MESH_DATA * p_data)
  3574. {
  3575. DYN_LIGHT *p_dlight = p_data->p_ldlight, *p_dnext;
  3576. EXTRA_DYN_LIGHT *p_elight = p_data->p_lelight, *p_enext;
  3577. while (p_dlight) {
  3578. p_dnext = p_dlight->p_next;
  3579. memset(p_dlight, 0, sizeof(p_dlight[0]));
  3580. p_dlight = p_dnext;
  3581. }
  3582. while (p_elight) {
  3583. p_enext = p_elight->p_next;
  3584. memset(p_elight, 0, sizeof(p_elight[0]));
  3585. p_elight = p_enext;
  3586. }
  3587. }
  3588. void lo_vymaz_svetla_mesh(GAME_MESH_DATA * p_data)
  3589. {
  3590. DYN_LIGHT *p_dlight = p_data->p_ldlight, *p_dnext;
  3591. EXTRA_DYN_LIGHT *p_elight = p_data->p_lelight, *p_enext;
  3592. while (p_dlight) {
  3593. p_dnext = p_dlight->p_next;
  3594. free(p_dlight);
  3595. p_dlight = p_dnext;
  3596. }
  3597. while (p_elight) {
  3598. p_enext = p_elight->p_next;
  3599. free(p_elight);
  3600. p_elight = p_enext;
  3601. }
  3602. }
  3603. void lo_premapuj_svetla_kont_mesh(EDIT_KONTEJNER * p_src,
  3604. GAME_MESH_OLD * p_dest)
  3605. {
  3606. STATIC_LIGHT *p_slight = p_src->p_slight;
  3607. DYN_LIGHT *p_dlight = p_src->p_dlight;
  3608. EXTRA_DYN_LIGHT *p_elight = p_src->p_edlight;
  3609. if (!p_src || !p_dest)
  3610. return;
  3611. while (p_slight) {
  3612. p_slight->p_mesh_data = p_dest->p_data;
  3613. p_slight = p_slight->p_next;
  3614. }
  3615. p_dest->p_data->p_lslight = p_src->p_slight;
  3616. p_src->p_slight = NULL;
  3617. while (p_dlight) {
  3618. p_dlight->p_mesh_data = p_dest->p_data;
  3619. p_dlight = p_dlight->p_next;
  3620. }
  3621. p_dest->p_data->p_ldlight = p_src->p_dlight;
  3622. p_src->p_dlight = NULL;
  3623. while (p_elight) {
  3624. p_elight->p_mesh_data = p_dest->p_data;
  3625. p_elight = p_elight->p_next;
  3626. }
  3627. p_dest->p_data->p_lelight = p_src->p_edlight;
  3628. p_src->p_edlight = NULL;
  3629. }
  3630. void lo_premapuj_svetla_mesh(GAME_MESH_OLD * p_src, GAME_MESH_OLD * p_dest)
  3631. {
  3632. STATIC_LIGHT *p_slight = p_src->p_data->p_lslight;
  3633. DYN_LIGHT *p_dlight = p_src->p_data->p_ldlight;
  3634. EXTRA_DYN_LIGHT *p_elight = p_src->p_data->p_lelight;
  3635. if (!p_src || !p_dest)
  3636. return;
  3637. while (p_slight) {
  3638. p_slight->p_mesh_data = p_dest->p_data;
  3639. p_slight = p_slight->p_next;
  3640. }
  3641. p_dest->p_data->p_lslight = p_src->p_data->p_lslight;
  3642. p_src->p_data->p_lslight = NULL;
  3643. while (p_dlight) {
  3644. p_dlight->p_mesh_data = p_dest->p_data;
  3645. p_dlight = p_dlight->p_next;
  3646. }
  3647. p_dest->p_data->p_ldlight = p_src->p_data->p_ldlight;
  3648. p_src->p_data->p_ldlight = NULL;
  3649. while (p_elight) {
  3650. p_elight->p_mesh_data = p_dest->p_data;
  3651. p_elight = p_elight->p_next;
  3652. }
  3653. p_dest->p_data->p_lelight = p_src->p_data->p_lelight;
  3654. p_src->p_data->p_lelight = NULL;
  3655. }
  3656. void lo_transformuj_svetla_do_wordspace(EDIT_KONTEJNER * p_src)
  3657. {
  3658. STATIC_LIGHT *p_slight = p_src->p_slight;
  3659. DYN_LIGHT *p_dlight = p_src->p_dlight;
  3660. EXTRA_DYN_LIGHT *p_elight = p_src->p_edlight;
  3661. GLMATRIX *p_top = kont_world_matrix(p_src);
  3662. if (!p_src)
  3663. return;
  3664. while (p_slight) {
  3665. transformuj_bod_bod_matici(&p_slight->p, p_top);
  3666. p_slight = p_slight->p_next;
  3667. }
  3668. while (p_dlight) {
  3669. transformuj_bod_bod_matici(&p_dlight->np, p_top);
  3670. p_dlight->tp = p_dlight->np;
  3671. p_dlight = p_dlight->p_next;
  3672. }
  3673. while (p_elight) {
  3674. transformuj_bod_bod_matici(&p_elight->np, p_top);
  3675. p_elight->tp = p_elight->np;
  3676. p_elight = p_elight->p_next;
  3677. }
  3678. }
  3679. void lo_premapuj_svetla_do_wordspace(EDIT_KONTEJNER * p_src)
  3680. {
  3681. STATIC_LIGHT *p_slight = p_src->p_slight;
  3682. DYN_LIGHT *p_dlight = p_src->p_dlight;
  3683. EXTRA_DYN_LIGHT *p_elight = p_src->p_edlight;
  3684. GLMATRIX *p_top = kont_world_matrix(p_src);
  3685. if (!p_src)
  3686. return;
  3687. lo_transformuj_svetla_do_wordspace(p_src);
  3688. while (p_slight) {
  3689. if (p_slight->p_flare) {
  3690. ((LENS_FLARE *) (p_slight->p_flare))->p = p_slight->p;
  3691. ((LENS_FLARE *) (p_slight->p_flare))->p_svetlo = NULL;
  3692. }
  3693. p_slight->p_mesh_data = NULL;
  3694. p_slight->flag2 &= ~SL2_MESH;
  3695. p_slight = p_slight->p_next;
  3696. }
  3697. p_src->p_slight = NULL;
  3698. while (p_dlight) {
  3699. p_dlight->p_mesh_data = NULL;
  3700. p_dlight->flag &= ~SDL_MESH;
  3701. p_dlight = p_dlight->p_next;
  3702. }
  3703. p_src->p_dlight = NULL;
  3704. while (p_elight) {
  3705. p_elight->p_mesh_data = NULL;
  3706. p_elight->flag &= ~SDL_MESH;
  3707. p_elight = p_elight->p_next;
  3708. }
  3709. p_src->p_edlight = NULL;
  3710. }
  3711. LENS_FLARE *lo_kopiruj_flare(LENS_FLARE * p_flarelist, int max,
  3712. LENS_FLARE * p_flare)
  3713. {
  3714. int f = lo_najdi_volny_flare(p_flarelist, max);
  3715. p_flarelist[f] = *p_flare;
  3716. if (p_flare->p_sloz) {
  3717. p_flarelist[f].p_sloz =
  3718. (LENS_FLARE_SLOZ *) mmalloc(sizeof(p_flarelist[f].p_sloz[0]) *
  3719. SLOZ_FLARE);
  3720. memcpy(p_flarelist[f].p_sloz, p_flare->p_sloz,
  3721. sizeof(p_flarelist[f].p_sloz[0]) * SLOZ_FLARE);
  3722. }
  3723. p_flarelist[f].index = f;
  3724. return (p_flarelist + f);
  3725. }
  3726. void mesh_pridej_vertex_array(GAME_MESH_OLD * p_mesh)
  3727. {
  3728. int flag, m2flag = p_mesh->p_data->m2flag;
  3729. int norm = 0;
  3730. if (gl_ext::extlist_vertex_array) {
  3731. mesh_vertex_array_init(p_mesh);
  3732. flag = KONT2_UPDATE_POS | KONT2_UPDATE_NORM;
  3733. if (m2flag & MAT2_DIFFUSE)
  3734. flag |= KONT2_UPDATE_DIFF;
  3735. if (m2flag & (MAT2_SPECULAR | MAT2_ENV_SPEC))
  3736. flag |= KONT2_UPDATE_SPEC;
  3737. if (m2flag & MAT2_MAP1)
  3738. flag |= KONT2_UPDATE_TEXT1;
  3739. if (m2flag & MAT2_MAP2)
  3740. flag |= KONT2_UPDATE_TEXT2;
  3741. if (m2flag & MAT2_MAP3)
  3742. flag |= KONT2_UPDATE_TEXT3;
  3743. if (m2flag & MAT2_MAP4)
  3744. flag |= KONT2_UPDATE_TEXT4;
  3745. p_mesh->p_data->k2flag |= flag | KONT2_UPDATE_NEW;
  3746. mesh_vertex_array_upload(p_mesh);
  3747. }
  3748. }
  3749. void poly_pridej_vertex_array(EDIT_MESH_POLY * p_poly)
  3750. {
  3751. memset(&p_poly->varray, 0, sizeof(p_poly->varray));
  3752. poly_vertex_array_init(p_poly);
  3753. poly_vertex_array_upload(p_poly);
  3754. }
  3755. int *NvConsolidateSingleFace(EXTRA_FACE * p_eface, int facenum,
  3756. int *p_facevel)
  3757. {
  3758. int f, velikost;
  3759. int *p_face;
  3760. int akt, j;
  3761. velikost = 0;
  3762. for (f = 0; f < facenum; f++) {
  3763. velikost += p_eface[f].facenum + 2;
  3764. }
  3765. p_face = (int *) mmalloc(sizeof(int) * velikost);
  3766. *p_facevel = velikost;
  3767. akt = 0;
  3768. for (f = 0; f < facenum; f++) {
  3769. p_face[akt++] = p_eface[f].facenum;
  3770. p_face[akt++] = p_eface[f].typ;
  3771. for (j = 0; j < p_eface[f].facenum; j++)
  3772. p_face[akt++] = p_eface[f].p_face[j];
  3773. free(p_eface[f].p_face);
  3774. }
  3775. return (p_face);
  3776. }
  3777. void NvStripToGL(EXTRA_FACE * p_face, int facenum)
  3778. {
  3779. int i;
  3780. for (i = 0; i < facenum; i++) {
  3781. if (p_face[i].typ == ST_LIST) {
  3782. p_face[i].typ = GL_TRIANGLES;
  3783. }
  3784. else if (p_face[i].typ == ST_STRIP) {
  3785. p_face[i].typ = GL_TRIANGLE_STRIP;
  3786. }
  3787. else if (p_face[i].typ == ST_FAN) {
  3788. p_face[i].typ = GL_TRIANGLE_FAN;
  3789. }
  3790. }
  3791. }
  3792. void NvGenerateStrips_fast(unsigned short *p_ind, int num,
  3793. STRIP_FACE ** p_fface, int *p_facenum)
  3794. {
  3795. STRIP_FACE *p_face = (STRIP_FACE *) mmalloc(sizeof(STRIP_FACE));
  3796. p_face->typ = GL_TRIANGLES;
  3797. p_face->facenum = num;
  3798. p_face->p_face = (unsigned short *) mmalloc(sizeof(p_ind[0]) * num);
  3799. memcpy(p_face->p_face, p_ind, sizeof(p_ind[0]) * num);
  3800. *p_fface = p_face;
  3801. *p_facenum = 1;
  3802. }
  3803. void oe_obj_to_strip(EDIT_OBJEKT * p_obj)
  3804. {
  3805. EXTRA_FACE *p_face;
  3806. unsigned short facenum;
  3807. NvGenerateStrips(p_obj->p_face, p_obj->facenum, (STRIP_FACE **) & p_face,
  3808. &facenum);
  3809. NvStripToGL(p_face, facenum);
  3810. p_obj->p_opt = NvConsolidateSingleFace(p_face, facenum, &p_obj->optnum);
  3811. free(p_face);
  3812. }
  3813. void oe_kont_to_strip(EDIT_KONTEJNER * p_kont_top)
  3814. {
  3815. EDIT_KONTEJNER *p_kont;
  3816. EDIT_OBJEKT *p_obj;
  3817. int o;
  3818. p_kont = p_kont_top;
  3819. while (p_kont) {
  3820. oe_olist_reset(&o);
  3821. while ((p_obj = oe_olist_next(p_kont, &o))) {
  3822. oe_obj_to_strip(p_obj);
  3823. }
  3824. p_kont = p_kont->p_next;
  3825. }
  3826. }