Berusky3d_light.cpp 102 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914
  1. /*
  2. berusky3d_light.c
  3. Svetelny modul k beruskam II
  4. */
  5. #include <stdio.h>
  6. #include <math.h>
  7. #include <assert.h>
  8. #include "3d_all.h"
  9. #include "Object.h"
  10. #include "Berusky_universal.h"
  11. #include "Berusky3d_castice.h"
  12. #include "Berusky3d.h"
  13. #include "Berusky3d_ini.h"
  14. #include "Berusky3d_load.h"
  15. #include "Berusky3d_render.h"
  16. #include "Berusky3d_animace.h"
  17. #include "Berusky3d_kofola_interface.h"
  18. #include "Berusky3d_light.h"
  19. extern G_KONFIG ber, *p_ber;
  20. inline void sdl_maxlook_korekce(DYN_LIGHT * p_light, float min, float max,
  21. float dosah)
  22. {
  23. p_light->min = min; // utlum je od 0 do 1
  24. if (dosah >= max) {
  25. p_light->max = max;
  26. p_light->dosah = max;
  27. p_light->look_max = 255;
  28. }
  29. else {
  30. p_light->max = max;
  31. p_light->dosah = dosah;
  32. p_light->look_max = (dosah * 255.0f) / max;
  33. }
  34. }
  35. /*
  36. Test mod->render statickych a dynamickych svetel
  37. */
  38. void dl_renderuj_svetla(G_KONFIG * p_ber)
  39. {
  40. int i;
  41. set_matrix_world_init();
  42. for (i = 0; i < p_ber->slightnum; i++) {
  43. kresli_kosoctverec(p_ber->p_project, p_ber->p_camera, get_matrix_init(),
  44. &p_ber->p_slight[i].p, 0.5f, 1.0f, 1.0f, 1.0f);
  45. }
  46. for (i = 0; i < p_ber->dl_lightnum; i++) {
  47. if (p_ber->p_dlight[i].akt)
  48. kresli_kosoctverec(p_ber->p_project, p_ber->p_camera, get_matrix_init(),
  49. &p_ber->p_dlight[i].tp, 0.5f, 1.0f, 0.0f, 0.0f);
  50. }
  51. for (i = 0; i < p_ber->edl_lightnum; i++) {
  52. if (p_ber->p_edlight[i].akt) {
  53. kresli_kosoctverec(p_ber->p_project, p_ber->p_camera, get_matrix_init(),
  54. &p_ber->p_edlight[i].tp, 0.5f, 1.0f, 0.0f, 0.0f);
  55. }
  56. }
  57. glColor3f(1.0f, 1.0f, 1.0f);
  58. }
  59. /* ***********************************************
  60. Dynamicka scena
  61. ***********************************************
  62. */
  63. static inline void dl_poly_diff_color_set(EDIT_MESH_POLY * p_poly, float r,
  64. float g, float b, float a)
  65. {
  66. TEXT_KOORD *p_koord = p_poly->p_koord;
  67. int i;
  68. for (i = 0; i < p_poly->facenum; i++) {
  69. p_koord->da = a;
  70. p_koord->dr = r;
  71. p_koord->dg = g;
  72. p_koord->db = b;
  73. p_koord++;
  74. }
  75. }
  76. static inline void dl_poly_diff_color_add(EDIT_MESH_POLY * p_poly, float r,
  77. float g, float b, float a)
  78. {
  79. TEXT_KOORD *p_koord = p_poly->p_koord;
  80. int i;
  81. for (i = 0; i < p_poly->facenum; i++) {
  82. p_koord->da += a;
  83. p_koord->dr += r;
  84. p_koord->dg += g;
  85. p_koord->db += b;
  86. p_koord++;
  87. }
  88. }
  89. static inline void dl_poly_diff_color_mult(EDIT_MESH_POLY * p_poly, float r,
  90. float g, float b, float a)
  91. {
  92. TEXT_KOORD *p_koord = p_poly->p_koord;
  93. int i;
  94. for (i = 0; i < p_poly->facenum; i++) {
  95. p_koord->da *= a;
  96. p_koord->dr *= r;
  97. p_koord->dg *= g;
  98. p_koord->db *= b;
  99. p_koord++;
  100. }
  101. }
  102. static inline void dl_mesh_diff_color_set(GAME_MESH_OLD * p_mesh, float r,
  103. float g, float b, float a)
  104. {
  105. BODRGBA *p_vertex;
  106. int i, vnum;
  107. p_vertex = p_mesh->p_vertex_diff;
  108. vnum = p_mesh->vertexnum;
  109. for (i = 0; i < vnum; i++) {
  110. p_vertex->a = a;
  111. p_vertex->r = r;
  112. p_vertex->g = g;
  113. p_vertex->b = b;
  114. p_vertex++;
  115. }
  116. }
  117. static inline void dl_mesh_diff_color_add(GAME_MESH_OLD * p_mesh, float r,
  118. float g, float b, float a)
  119. {
  120. BODRGBA *p_vertex;
  121. int i, vnum;
  122. p_vertex = p_mesh->p_vertex_diff;
  123. vnum = p_mesh->vertexnum;
  124. for (i = 0; i < vnum; i++) {
  125. p_vertex->a += a;
  126. p_vertex->r += r;
  127. p_vertex->g += g;
  128. p_vertex->b += b;
  129. p_vertex++;
  130. }
  131. }
  132. inline void ld_mesh_diff_color_mul(GAME_MESH_OLD * p_mesh, float r, float g,
  133. float b, float a)
  134. {
  135. BODRGBA *p_vertex;
  136. int i, vnum;
  137. p_vertex = p_mesh->p_vertex_diff;
  138. vnum = p_mesh->vertexnum;
  139. for (i = 0; i < vnum; i++) {
  140. p_vertex->a *= a;
  141. p_vertex->r *= r;
  142. p_vertex->g *= g;
  143. p_vertex->b *= b;
  144. p_vertex++;
  145. }
  146. }
  147. /* Spekularni
  148. */
  149. static inline void dl_poly_spec_color_set(EDIT_MESH_POLY * p_poly, float r,
  150. float g, float b, float a)
  151. {
  152. TEXT_KOORD *p_koord = p_poly->p_koord;
  153. int i;
  154. for (i = 0; i < p_poly->facenum; i++) {
  155. p_koord->sr = r;
  156. p_koord->sg = g;
  157. p_koord->sb = b;
  158. p_koord++;
  159. }
  160. }
  161. static inline void dl_poly_spec_color_add(EDIT_MESH_POLY * p_poly, float r,
  162. float g, float b, float a)
  163. {
  164. TEXT_KOORD *p_koord = p_poly->p_koord;
  165. int i;
  166. for (i = 0; i < p_poly->facenum; i++) {
  167. p_koord->sr += r;
  168. p_koord->sg += g;
  169. p_koord->sb += b;
  170. p_koord++;
  171. }
  172. }
  173. static inline void dl_poly_spec_color_mult(EDIT_MESH_POLY * p_poly, float r,
  174. float g, float b, float a)
  175. {
  176. TEXT_KOORD *p_koord = p_poly->p_koord;
  177. int i;
  178. for (i = 0; i < p_poly->facenum; i++) {
  179. p_koord->sr *= r;
  180. p_koord->sg *= g;
  181. p_koord->sb *= b;
  182. p_koord++;
  183. }
  184. }
  185. static inline void dl_mesh_spec_color_set(GAME_MESH_OLD * p_mesh, float r,
  186. float g, float b, float a)
  187. {
  188. BODRGB *p_vertex;
  189. int i, vnum;
  190. p_vertex = p_mesh->p_vertex_spec;
  191. vnum = p_mesh->vertexnum;
  192. for (i = 0; i < vnum; i++) {
  193. p_vertex->r = r;
  194. p_vertex->g = g;
  195. p_vertex->b = b;
  196. p_vertex++;
  197. }
  198. }
  199. static inline void dl_mesh_spec_color_add(GAME_MESH_OLD * p_mesh, float r,
  200. float g, float b, float a)
  201. {
  202. BODRGB *p_vertex;
  203. int i, vnum;
  204. p_vertex = p_mesh->p_vertex_spec;
  205. vnum = p_mesh->vertexnum;
  206. for (i = 0; i < vnum; i++) {
  207. p_vertex->r += r;
  208. p_vertex->g += g;
  209. p_vertex->b += b;
  210. p_vertex++;
  211. }
  212. }
  213. static inline void dl_mesh_spec_color_mul(GAME_MESH_OLD * p_mesh, float r,
  214. float g, float b, float a)
  215. {
  216. BODRGB *p_vertex;
  217. int i, vnum;
  218. p_vertex = p_mesh->p_vertex_spec;
  219. vnum = p_mesh->vertexnum;
  220. for (i = 0; i < vnum; i++) {
  221. p_vertex->r *= r;
  222. p_vertex->g *= g;
  223. p_vertex->b *= b;
  224. p_vertex++;
  225. }
  226. }
  227. /* Aplikuje se na vsechny meshe a poly
  228. */
  229. void dl_scena_set_ambient(float r, float g, float b, float a)
  230. {
  231. p_ber->dl_ambient[0] = r;
  232. p_ber->dl_ambient[1] = g;
  233. p_ber->dl_ambient[2] = b;
  234. p_ber->dl_ambient[3] = a;
  235. }
  236. /* Prace s meshama
  237. */
  238. int dl_mesh_modulate_diff(MeshHandle mh, float r, float g, float b, float a)
  239. {
  240. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[mh];
  241. if (p_mesh) {
  242. ld_mesh_diff_color_mul(p_mesh, r, g, b, a);
  243. return (TRUE);
  244. }
  245. return (FALSE);
  246. }
  247. int dl_mesh_set_diff(MeshHandle mh, float r, float g, float b, float a)
  248. {
  249. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_ber->p_prv_lev[mh]->mesh];
  250. if (p_mesh) {
  251. dl_mesh_diff_color_set(p_mesh, r, g, b, a);
  252. return (TRUE);
  253. }
  254. return (FALSE);
  255. }
  256. int dl_mesh_add_diff(MeshHandle mh, float r, float g, float b, float a)
  257. {
  258. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_ber->p_prv_lev[mh]->mesh];
  259. if (p_mesh) {
  260. dl_mesh_diff_color_add(p_mesh, r, g, b, a);
  261. return (TRUE);
  262. }
  263. return (FALSE);
  264. }
  265. int dl_mesh_modulate_spec(MeshHandle mh, float r, float g, float b, float a)
  266. {
  267. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_ber->p_prv_lev[mh]->mesh];
  268. if (p_mesh && p_mesh->p_data->m2flag & MAT2_SPECULAR) {
  269. dl_mesh_spec_color_mul(p_mesh, r, g, b, a);
  270. return (TRUE);
  271. }
  272. return (FALSE);
  273. }
  274. int dl_mesh_set_spec(MeshHandle mh, float r, float g, float b, float a)
  275. {
  276. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_ber->p_prv_lev[mh]->mesh];
  277. if (p_mesh && p_mesh->p_data->m2flag & MAT2_SPECULAR) {
  278. dl_mesh_spec_color_set(p_mesh, r, g, b, a);
  279. return (TRUE);
  280. }
  281. return (FALSE);
  282. }
  283. int dl_mesh_add_spec(MeshHandle mh, float r, float g, float b, float a)
  284. {
  285. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_ber->p_prv_lev[mh]->mesh];
  286. if (p_mesh && p_mesh->p_data->m2flag & MAT2_SPECULAR) {
  287. dl_mesh_spec_color_add(p_mesh, r, g, b, a);
  288. return (TRUE);
  289. }
  290. return (FALSE);
  291. }
  292. /* *******************************************************************
  293. Dynamicke svetla
  294. *******************************************************************
  295. */
  296. inline void sdla_animaci_zrus(DYN_LIGHT_ANIM * p_an)
  297. {
  298. p_an->endtime = 0;
  299. if (p_an->diff_keys) {
  300. null_free((void **) &p_an->p_dfkeys);
  301. null_free((void **) &p_an->p_diff);
  302. p_an->diff_keys = 0;
  303. }
  304. if (p_an->alfa_keys) {
  305. null_free((void **) &p_an->p_akeys);
  306. null_free((void **) &p_an->p_alfa);
  307. p_an->alfa_keys = 0;
  308. }
  309. if (p_an->pos_keys) {
  310. null_free((void **) &p_an->p_pkeys);
  311. null_free((void **) &p_an->p_pos);
  312. p_an->pos_keys = 0;
  313. }
  314. if (p_an->trg_keys) {
  315. null_free((void **) &p_an->p_tkeys);
  316. null_free((void **) &p_an->p_trg);
  317. p_an->trg_keys = 0;
  318. }
  319. if (p_an->dos_keys) {
  320. null_free((void **) &p_an->p_dskeys);
  321. null_free((void **) &p_an->p_dosah);
  322. p_an->dos_keys = 0;
  323. }
  324. }
  325. void sdla_animaci_zrus_online(DYN_LIGHT_ANIM * p_an)
  326. {
  327. sdla_animaci_zrus(p_an);
  328. }
  329. inline void sdla_animaci_vyrob(DYN_LIGHT_ANIM * p_an, int framenum,
  330. int pos_keys, int dir_keys, int diff_keys,
  331. int spec_keys, int dos_keys, int alfa_keys)
  332. {
  333. p_an->endtime = calc_endtime(framenum);
  334. p_an->pos_keys = pos_keys;
  335. if (pos_keys) {
  336. p_an->p_pkeys =
  337. (KEY_POINT_BRS *) mmalloc(sizeof(p_an->p_pkeys[0]) * pos_keys);
  338. p_an->p_pos = (BOD *) mmalloc(sizeof(p_an->p_pos[0]) * pos_keys);
  339. }
  340. p_an->trg_keys = dir_keys;
  341. if (dir_keys) {
  342. p_an->p_tkeys =
  343. (KEY_POINT_BRS *) mmalloc(sizeof(p_an->p_tkeys[0]) * dir_keys);
  344. p_an->p_trg = (BOD *) mmalloc(sizeof(p_an->p_trg[0]) * dir_keys);
  345. }
  346. p_an->dos_keys = dos_keys;
  347. if (dos_keys) {
  348. p_an->p_dskeys =
  349. (KEY_POINT_BRS *) mmalloc(sizeof(p_an->p_dskeys[0]) * dos_keys);
  350. p_an->p_dosah = (BOD *) mmalloc(sizeof(p_an->p_dosah[0]) * dos_keys);
  351. }
  352. p_an->diff_keys = diff_keys;
  353. if (diff_keys) {
  354. p_an->p_dfkeys =
  355. (KEY_POINT_BRS *) mmalloc(sizeof(p_an->p_dfkeys[0]) * diff_keys);
  356. p_an->p_diff =
  357. (BARVA_RGBA *) mmalloc(sizeof(p_an->p_diff[0]) * diff_keys);
  358. }
  359. p_an->alfa_keys = alfa_keys;
  360. if (alfa_keys) {
  361. p_an->p_akeys =
  362. (KEY_POINT_BRS *) mmalloc(sizeof(p_an->p_akeys[0]) * alfa_keys);
  363. p_an->p_alfa = (float *) mmalloc(sizeof(p_an->p_alfa[0]) * alfa_keys);
  364. }
  365. p_an->spec_keys = spec_keys;
  366. if (spec_keys) {
  367. p_an->p_spkeys =
  368. (KEY_POINT_BRS *) mmalloc(sizeof(p_an->p_spkeys[0]) * spec_keys);
  369. p_an->p_spec =
  370. (BARVA_RGBA *) mmalloc(sizeof(p_an->p_spec[0]) * spec_keys);
  371. }
  372. }
  373. /* keyframova animace svetel
  374. */
  375. inline void sdl_light_to_light(DYN_LIGHT * p_light, DYN_LIGHT_ANIM * p_track,
  376. int time)
  377. {
  378. int loop = p_light->an_flag & GK_LOOP;
  379. BOD d;
  380. if (p_track->pos_keys) {
  381. key_track_interpolace_bod(&p_light->np, p_track->p_pos, p_track->p_pkeys,
  382. time, p_track->endtime, p_track->pos_keys, loop);
  383. p_light->tp = p_light->np;
  384. }
  385. if (p_track->dos_keys) {
  386. key_track_interpolace_bod_linear(&d, p_track->p_dosah, p_track->p_dskeys,
  387. time, p_track->endtime, p_track->dos_keys, loop);
  388. sdl_maxlook_korekce(p_light, d.y, d.z, d.x); // interpolace je dosah/min/max
  389. }
  390. if (p_track->diff_keys) {
  391. key_track_interpolace_wbod_linear((WBOD *) & p_light->dr,
  392. (WBOD *) p_track->p_diff, p_track->p_dfkeys, time, p_track->endtime,
  393. p_track->diff_keys, loop);
  394. }
  395. }
  396. LightHandle sdl_svetlo_vyrob(dword flag)
  397. {
  398. DYN_LIGHT *p_light;
  399. int l;
  400. for (l = 0; l < p_ber->dl_lightnum; l++) {
  401. if (!p_ber->p_dlight[l].akt) {
  402. p_light = p_ber->p_dlight + l;
  403. goto nasel;
  404. }
  405. }
  406. p_light = p_ber->p_dlight + l;
  407. p_ber->dl_lightnum++;
  408. nasel:
  409. p_light->akt = TRUE;
  410. p_light->flag = flag | SDL_ZMENA_GLOBAL | SDL_KOFOLA;
  411. p_ber->dl_new = TRUE;
  412. sprintf(p_light->jmeno, "Run-time svetlo %d", l);
  413. return (l);
  414. }
  415. LightHandle sdl_svetlo_pojmenuj(LightHandle handle, char *p_jmeno)
  416. {
  417. if (!p_ber->p_dlight[handle].akt)
  418. return (FALSE);
  419. else
  420. strcpy(p_ber->p_dlight[handle].jmeno, p_jmeno);
  421. return (handle);
  422. }
  423. int sdl_svetlo_zrus(LightHandle handle)
  424. {
  425. if (!p_ber->p_dlight[handle].akt)
  426. return (K_CHYBA);
  427. else {
  428. // Zruseni svetla
  429. p_ber->p_dlight[handle].akt = FALSE;
  430. if (p_ber->dl_lightnum == handle + 1)
  431. p_ber->dl_lightnum--;
  432. p_ber->dl_new = TRUE;
  433. // Zruseni pripadne animace
  434. if (p_ber->p_dlight[handle].an.endtime)
  435. sdla_animaci_zrus(&p_ber->p_dlight[handle].an);
  436. return (TRUE);
  437. }
  438. }
  439. // Vrati pocet dynamickych svetel
  440. int sdl_get_num(void)
  441. {
  442. int i, num = 0;
  443. for (i = 0; i < p_ber->dl_lightnum; i++)
  444. if (p_ber->p_dlight[i].akt)
  445. num++;
  446. return (num);
  447. }
  448. // Pointer na pole dynamickych svetel
  449. int sdl_get_list(LIGHT_INFO * p_li, int max)
  450. {
  451. int i, num = 0;
  452. for (i = 0; i < p_ber->dl_lightnum; i++) {
  453. if (p_ber->p_dlight[i].akt && num < max) {
  454. strcpy(p_li[num].jmeno, p_ber->p_dlight[i].jmeno);
  455. p_li[num].light_handle = i;
  456. p_li[num].light_handle = p_ber->p_dlight[i].ktrida;
  457. num++;
  458. }
  459. }
  460. return (num);
  461. }
  462. // Vrati pocet dynamickych svetel
  463. int edl_get_num(void)
  464. {
  465. int i, num = 0;
  466. for (i = 0; i < p_ber->edl_lightnum; i++)
  467. if (p_ber->p_edlight[i].akt)
  468. num++;
  469. return (num);
  470. }
  471. // Pointer na pole dynamickych svetel
  472. int edl_get_list(LIGHT_INFO * p_li, int max)
  473. {
  474. int i, num = 0;
  475. for (i = 0; i < p_ber->edl_lightnum; i++) {
  476. if (p_ber->p_edlight[i].akt && num < max) {
  477. strcpy(p_li[num].jmeno, p_ber->p_edlight[i].jmeno);
  478. p_li[num].light_handle = i;
  479. p_li[num].light_handle = p_ber->p_edlight[i].ktrida;
  480. num++;
  481. }
  482. }
  483. return (num);
  484. }
  485. /* ***********************************************
  486. vyroba / ruseni svetel
  487. ***********************************************
  488. */
  489. LightHandle sdl_svetlo_set_pos(LightHandle lh, BOD * p_bod)
  490. {
  491. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  492. if (lh < p_ber->dl_lightnum && p_light->akt) {
  493. p_light->tp = p_light->np = *p_bod;
  494. p_light->flag |= SDL_ZMENA_GLOBAL;
  495. p_ber->dl_recalc = TRUE;
  496. return (lh);
  497. }
  498. else
  499. return (K_CHYBA);
  500. }
  501. LightHandle sdl_svetlo_set_pos_ext(LightHandle lh, float x, float y, float z)
  502. {
  503. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  504. if (lh < p_ber->dl_lightnum && p_light->akt) {
  505. p_light->np.x = x;
  506. p_light->np.y = y;
  507. p_light->np.z = z;
  508. p_light->tp = p_light->np;
  509. p_light->flag |= SDL_ZMENA_GLOBAL;
  510. p_ber->dl_recalc = TRUE;
  511. return (lh);
  512. }
  513. else
  514. return (K_CHYBA);
  515. }
  516. /*
  517. min -> zacatek utlumu svetla
  518. max -> tady uz je to svetlo uplne neviditelne
  519. */
  520. LightHandle sdl_svetlo_set_diff(LightHandle lh, float dr, float dg, float db,
  521. float min, float max, float dosah)
  522. {
  523. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  524. if (lh < p_ber->dl_lightnum && p_light->akt) {
  525. p_light->dr = dr; // zakladni barva svetla
  526. p_light->dg = dg;
  527. p_light->db = db;
  528. sdl_maxlook_korekce(p_light, min, max, dosah);
  529. p_light->flag |= SDL_ZMENA_LOKAL;
  530. p_ber->dl_recalc = TRUE;
  531. return (lh);
  532. }
  533. else
  534. return (K_CHYBA);
  535. }
  536. LightHandle sdl_svetlo_set_diff_sub(LightHandle lh, float sr, float sg,
  537. float sb)
  538. {
  539. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  540. if (lh < p_ber->dl_lightnum && p_light->akt) {
  541. p_light->sr = sr; // zakladni barva svetla
  542. p_light->sg = sg;
  543. p_light->sb = sb;
  544. p_light->flag |= SDL_ZMENA_LOKAL;
  545. p_ber->dl_recalc = TRUE;
  546. return (lh);
  547. }
  548. else
  549. return (K_CHYBA);
  550. }
  551. RunHandle sdl_svetlo_anim(LightHandle handle, BOD * p_bod,
  552. float dr, float dg, float db, float da,
  553. float dosah, float min, float max, int flag, int *p_flag, int framenum)
  554. {
  555. return (TRUE);
  556. }
  557. LightHandle sdl_anim_vyrob(LightHandle lh, int framenum, int pos_keys,
  558. int diff_keys, int dosah_keys)
  559. {
  560. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  561. DYN_LIGHT_ANIM *p_an;
  562. if (lh < p_ber->dl_lightnum && p_light->akt) {
  563. p_an = &p_light->an;
  564. if (p_an->endtime)
  565. sdla_animaci_zrus(p_an);
  566. sdla_animaci_vyrob(p_an, framenum, pos_keys, 0, diff_keys, 0, dosah_keys,
  567. 0);
  568. return (lh);
  569. }
  570. else
  571. return (K_CHYBA);
  572. }
  573. LightHandle sdl_anim_zrus(LightHandle lh)
  574. {
  575. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  576. if (lh < p_ber->dl_lightnum && p_light->akt && p_light->an.endtime) {
  577. sdla_animaci_zrus(&p_light->an);
  578. return (lh);
  579. }
  580. else
  581. return (K_CHYBA);
  582. }
  583. LightHandle sdl_anim_vloz_klic_posun(LightHandle lh, int klic, float x,
  584. float y, float z, int frame)
  585. {
  586. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  587. DYN_LIGHT_ANIM *p_an = &p_light->an;
  588. if (lh < p_ber->dl_lightnum && p_light->akt &&
  589. p_an->endtime && klic < p_an->pos_keys) {
  590. p_an->p_pos[klic].x = x;
  591. p_an->p_pos[klic].y = y;
  592. p_an->p_pos[klic].z = z;
  593. p_an->p_pkeys[klic].time = frame * SIM_KONSTI;
  594. return (lh);
  595. }
  596. else
  597. return (K_CHYBA);
  598. }
  599. LightHandle sdl_anim_vloz_klic_posun_bod(LightHandle lh, int klic, BOD * p_p,
  600. int frame)
  601. {
  602. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  603. DYN_LIGHT_ANIM *p_an = &p_light->an;
  604. if (lh < p_ber->dl_lightnum && p_light->akt && p_an->endtime
  605. && klic < p_an->pos_keys) {
  606. p_an->p_pos[klic] = *p_p;
  607. p_an->p_pkeys[klic].time = frame * SIM_KONSTI;
  608. return (lh);
  609. }
  610. else
  611. return (K_CHYBA);
  612. }
  613. LightHandle sdl_anim_vloz_klic_diff(LightHandle lh, int klic, float r,
  614. float g, float b, float a, int frame)
  615. {
  616. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  617. DYN_LIGHT_ANIM *p_an = &p_light->an;
  618. if (lh < p_ber->dl_lightnum && p_light->akt && p_an->endtime
  619. && klic < p_an->diff_keys) {
  620. p_an->p_diff[klic].r = r;
  621. p_an->p_diff[klic].g = g;
  622. p_an->p_diff[klic].b = b;
  623. p_an->p_diff[klic].a = a;
  624. p_an->p_dfkeys[klic].time = frame * SIM_KONSTI;
  625. return (lh);
  626. }
  627. else
  628. return (K_CHYBA);
  629. }
  630. LightHandle sdl_anim_vloz_klic_vzdal(LightHandle lh, int klic, float dosah,
  631. float min, float max, int frame)
  632. {
  633. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  634. DYN_LIGHT_ANIM *p_an = &p_light->an;
  635. if (lh < p_ber->dl_lightnum && p_light->akt && p_an->endtime
  636. && klic < p_an->dos_keys) {
  637. p_an->p_dosah[klic].x = dosah;
  638. p_an->p_dosah[klic].y = min;
  639. p_an->p_dosah[klic].z = max;
  640. p_an->p_dskeys[klic].time = frame * SIM_KONSTI;
  641. return (lh);
  642. }
  643. else
  644. return (K_CHYBA);
  645. }
  646. /* **************************************
  647. Run-time animace
  648. **************************************
  649. */
  650. RunHandle sdl_anim_start(LightHandle lh, int *p_flag, int flag, int start,
  651. int stop)
  652. {
  653. DYN_LIGHT *p_light = p_ber->p_dlight + lh;
  654. DYN_LIGHT_ANIM *p_an = &p_light->an;
  655. if (lh < p_ber->dl_lightnum && p_light->akt && p_an->endtime) {
  656. calc_time_end(p_an->endtime, p_ber->TimeEndLastFrame,
  657. start, stop,
  658. &p_light->start,
  659. &p_light->stop,
  660. &p_light->time_start, &p_light->time_stop, &p_light->time_delka);
  661. p_light->p_flag = p_flag;
  662. p_light->an_flag = flag;
  663. p_light->flag |= SDL_ANIMACE;
  664. return (lh);
  665. }
  666. else
  667. return (K_CHYBA);
  668. }
  669. int sdl_anim_stop(RunHandle rh)
  670. {
  671. DYN_LIGHT *p_light = p_ber->p_dlight + rh;
  672. DYN_LIGHT_ANIM *p_an = &p_light->an;
  673. if (rh < p_ber->dl_lightnum && p_light->akt && p_an->endtime
  674. && p_light->flag & SDL_ANIMACE) {
  675. p_light->flag &= ~SDL_ANIMACE;
  676. return (rh);
  677. }
  678. else
  679. return (K_CHYBA);
  680. }
  681. /* keyframova animace svetel
  682. */
  683. void sdla_updatuj(G_KONFIG * p_ber)
  684. {
  685. dword next_time = p_ber->TimeEndLastFrame;
  686. DYN_LIGHT *p_light;
  687. DYN_LIGHT_ANIM *p_an;
  688. int i;
  689. int konec;
  690. /*
  691. Animace se updatuji kazdy frame
  692. */
  693. for (i = 0; i < p_ber->dl_lightnum; i++) {
  694. p_light = p_ber->p_dlight + i;
  695. p_an = &p_light->an;
  696. if (p_light->flag & SDL_REMOVE) {
  697. sdl_svetlo_zrus(i);
  698. continue;
  699. }
  700. if (p_light->flag & SDL_ANIMACE) {
  701. /* Test na konec animace
  702. */
  703. if ((konec = (next_time > p_light->time_stop))) {
  704. if (p_light->an_flag & GK_LOOP) {
  705. calc_time_loop(next_time, p_light->start,
  706. &p_light->time_start,
  707. &p_light->time_stop, &p_light->time_delka, &p_light->time);
  708. konec = 0;
  709. if (p_light->p_flag)
  710. *(p_light->p_flag) = 0;
  711. }
  712. else {
  713. p_light->time = p_light->time_delka;
  714. p_light->flag &= ~SDL_ANIMACE;
  715. if (p_light->p_flag)
  716. *(p_light->p_flag) = ANIM_FLAG_KONEC;
  717. if (p_light->an_flag & GK_REMOVE)
  718. p_light->flag |= SDL_REMOVE;
  719. }
  720. }
  721. else {
  722. p_light->time = calc_time_akt(next_time, p_light->time_start);
  723. if (p_light->p_flag)
  724. *(p_light->p_flag) =
  725. ftoi((p_light->time / (float) p_light->time_delka) * 100.0f);
  726. }
  727. /* Vypocitej animaci svetla
  728. */
  729. sdl_light_to_light(p_light, p_an, p_light->time);
  730. p_light->flag |= SDL_ZMENA_GLOBAL;
  731. p_ber->dl_recalc = TRUE;
  732. }
  733. }
  734. }
  735. // 1. Update svetel podle meshu
  736. // 2. Update svetel privazane k meshum -> update specialnima rutinama !!!
  737. // 3. Update svetel privazane k scene -> update specialnima rutinama !!!
  738. int dl_mesh_pridej_svetla(G_KONFIG * p_ber, GAME_MESH_OLD * p_mesh)
  739. {
  740. GAME_MESH_DATA *p_data = p_mesh->p_data;
  741. STATIC_LIGHT *p_slight = p_ber->p_slight;
  742. DYN_LIGHT *p_dlight = p_ber->p_dlight;
  743. void *p_light_dyn[MAX_FLARE_SVETEL * 2];
  744. void *p_light_stat[MAX_FLARE_SVETEL * 2];
  745. int lightakt = 0;
  746. int slightnum = 0;
  747. int dlightnum = 0;
  748. int i;
  749. int kflag = p_data->kflag;
  750. if (kflag & (KONT_POHYB | KONT_VIDITELNY_ZMENA) || p_ber->dl_recalc
  751. || p_ber->dl_new) {
  752. // Zapocitam staticke svetla pri pohybu nebo je prekopiruju
  753. if (p_data->kflag & KONT_POHYB) {
  754. for (lightakt = 0, i = 0; i < p_ber->slightnum; i++) {
  755. p_slight = p_ber->p_slight + i;
  756. if (p_slight->flag2 & SL2_DYNAMIC
  757. && p_slight->dosah > obb_vzdal_bod(&p_mesh->obb_world,
  758. &p_slight->p))
  759. p_light_stat[lightakt++] = p_slight;
  760. }
  761. slightnum = lightakt;
  762. }
  763. else {
  764. slightnum = p_data->slightnum;
  765. }
  766. // Zaradim dynamicke svetla
  767. for (lightakt = 0, i = 0; i < p_ber->dl_lightnum; i++) {
  768. p_dlight = p_ber->p_dlight + i;
  769. if (p_dlight->akt
  770. && p_dlight->dosah > obb_vzdal_bod(&p_mesh->obb_world,
  771. &p_dlight->tp)) {
  772. p_light_dyn[lightakt++] = p_dlight;
  773. }
  774. }
  775. dlightnum = lightakt;
  776. i = dlightnum + slightnum;
  777. if (!i) {
  778. null_free((void **) &p_data->p_light);
  779. p_data->lightakt = p_data->lightmax = p_data->slightnum = 0;
  780. }
  781. else {
  782. if (i >= p_data->lightmax) {
  783. if (!(p_mesh->p_data->kflag & KONT_POHYB))
  784. memcpy(p_light_stat, p_data->p_light,
  785. slightnum * sizeof(p_data->p_light[0]));
  786. null_free((void **) &p_data->p_light);
  787. i += (i >> 1) + 10;
  788. p_data->p_light = (void **) mmalloc(sizeof(p_data->p_light[0]) * i);
  789. p_data->lightmax = i;
  790. memcpy(p_data->p_light, p_light_stat,
  791. slightnum * sizeof(p_data->p_light[0]));
  792. memcpy(p_data->p_light + slightnum, p_light_dyn,
  793. dlightnum * sizeof(p_data->p_light[0]));
  794. }
  795. else {
  796. if (p_data->kflag & KONT_POHYB)
  797. memcpy(p_data->p_light, p_light_stat,
  798. slightnum * sizeof(p_data->p_light[0]));
  799. memcpy(p_data->p_light + slightnum, p_light_dyn,
  800. dlightnum * sizeof(p_data->p_light[0]));
  801. }
  802. p_data->lightakt = slightnum + dlightnum;
  803. p_data->slightnum = slightnum;
  804. }
  805. return (TRUE);
  806. }
  807. else {
  808. return (FALSE);
  809. }
  810. }
  811. /* Zjisti jestli se nektery dynamicky svetlo meshe zmenilo
  812. a musi se teda prepocitat
  813. */
  814. inline int dl_mesh_svetlo_update(GAME_MESH_DATA * p_data)
  815. {
  816. DYN_LIGHT **p_dlight = (DYN_LIGHT **) p_data->p_light;
  817. dword flags = 0;
  818. int i;
  819. for (i = p_data->slightnum; i < p_data->lightakt; i++) {
  820. flags |= p_dlight[i]->flag;
  821. }
  822. return (flags & (SDL_ZMENA_GLOBAL | SDL_ZMENA_LOKAL));
  823. }
  824. /* Pokud je svetlo privazany -> automaticky ho updatuju
  825. */
  826. int dl_mesh_pripocitej_svetla(G_KONFIG * p_ber, GAME_MESH_OLD * p_mesh,
  827. int dyn_light, int extra_light, int full_light, int all)
  828. {
  829. EDIT_MATERIAL **p_mat = p_ber->p_mat;
  830. GAME_MESH_DATA *p_data = p_mesh->p_data;
  831. STATIC_LIGHT *p_slight;
  832. DYN_LIGHT *p_dlight;
  833. EXTRA_DYN_LIGHT *p_light;
  834. GLMATRIX *p_m = NULL;
  835. BOD *p_vertex_pos = NULL;
  836. BOD *p_vertex_norm = NULL;
  837. BODRGBA *p_vertex_diff = NULL;
  838. BODRGBA *p_vertex_diff_mat = NULL;
  839. BODRGB *p_vertex_spec = NULL;
  840. BODRGB *p_vertex_spec_mat = NULL;
  841. BOD p, n, dir, cam;
  842. int i, v, vnum, dflag, m2flag, j;
  843. int diffuse, specular, specular_light;
  844. int diffuse_ray, specular_ray;
  845. int kflag = p_data->kflag;
  846. int *p_kflag;
  847. int keyframe;
  848. int norm, o, objektu;
  849. int staticky, bump;
  850. int beruska = ber_je_mesh_beruska_fast(p_mesh);
  851. float vzdal, vzdal2, I, lesk = 1.0f;
  852. float Ar, Ag, Ab;
  853. float *p_looksqrt_linear_float = p_ber->p_looksqrt_linear_float;
  854. float *p_looksqrt_quad_float = p_ber->p_looksqrt_quadratic_float;
  855. m2flag = p_data->m2flag;
  856. diffuse = m2flag & MAT2_DIFFUSE && p_mesh->p_vertex_diff;
  857. specular = m2flag & MAT2_SPECULAR;
  858. if (!diffuse && !specular)
  859. return (FALSE);
  860. if (!diffuse || (dyn_light && !(kflag & KONT_POHYB) && !p_ber->dl_new
  861. && !dl_mesh_svetlo_update(p_data))) {
  862. dyn_light = FALSE;
  863. }
  864. extra_light = extra_light ? p_data->edlightnum : 0;
  865. specular_light = extra_light && kflag & KONT_DRAW_SPEC;
  866. keyframe = kflag & KONT_KEYFRAME;
  867. staticky = kflag & KONT_STATIC;
  868. vnum = p_mesh->vertexnum;
  869. if (diffuse) {
  870. diffuse_ray = m2flag & MAT2_DIFFUSE_RAY;
  871. specular_ray = m2flag & MAT2_SPECULAR_RAY;
  872. Ar = p_ber->dl_ambient[0];
  873. Ag = p_ber->dl_ambient[1];
  874. Ab = p_ber->dl_ambient[2];
  875. }
  876. else {
  877. diffuse_ray = specular_ray = FALSE;
  878. }
  879. if (extra_light) {
  880. cam.x = p_ber->p_invcam->_41;
  881. cam.y = p_ber->p_invcam->_42;
  882. cam.z = p_ber->p_invcam->_43;
  883. }
  884. if (!keyframe)
  885. p_m = &p_mesh->m;
  886. #ifdef DEBUG_MOD
  887. p_ber->debug.light_meshu++;
  888. #endif
  889. objektu = p_mesh->objektu;
  890. p_kflag = (int *) p_mesh->p_kflag;
  891. for (o = 0; o < objektu; o++) {
  892. if (all || p_kflag[o] & (KONT_VIDITELNY | KONT_VIDITELNY_ZRC)) {
  893. v = p_mesh->objektstart[o];
  894. vnum = v + p_mesh->objektnum[o];
  895. bump = p_mat[p_mesh->p_mat[o]]->flag2 & MAT2_BUMP;
  896. if (keyframe)
  897. p_m = p_mesh->p_key + o;
  898. p_vertex_pos = p_mesh->p_vertex_pos + v;
  899. p_vertex_diff = p_mesh->p_vertex_diff + v;
  900. p_vertex_diff_mat = p_mesh->p_vertex_diff_material + v;
  901. if (diffuse_ray)
  902. p_vertex_norm = p_mesh->p_vertex_norm + v;
  903. if (specular || specular_light) {
  904. p_vertex_spec = p_mesh->p_vertex_spec + v;
  905. p_vertex_spec_mat = p_mesh->p_vertex_spec_material + v;
  906. }
  907. for (; v < vnum; v++, p_vertex_pos++, p_vertex_norm++) {
  908. if (full_light) {
  909. if (p_vertex_diff) {
  910. if (beruska) {
  911. p_vertex_diff->r = p_vertex_diff_mat->r;
  912. p_vertex_diff->g = p_vertex_diff_mat->g;
  913. p_vertex_diff->b = p_vertex_diff_mat->b;
  914. }
  915. else {
  916. p_vertex_diff->r = 1.0f;
  917. p_vertex_diff->g = 1.0f;
  918. p_vertex_diff->b = 1.0f;
  919. }
  920. }
  921. if (p_vertex_spec) {
  922. p_vertex_spec->r = 0.0f;
  923. p_vertex_spec->g = 0.0f;
  924. p_vertex_spec->b = 0.0f;
  925. }
  926. }
  927. else {
  928. norm = keyframe;
  929. transformuj_bod_matici_bod(p_vertex_pos, p_m, &p);
  930. if (diffuse) {
  931. if (!staticky && diffuse_ray) {
  932. transformuj_nbod_matici_bod(p_vertex_norm, p_m, &n);
  933. p_vertex_diff->r = p_vertex_diff_mat->r * Ar;
  934. p_vertex_diff->g = p_vertex_diff_mat->g * Ag;
  935. p_vertex_diff->b = p_vertex_diff_mat->b * Ab;
  936. }
  937. else {
  938. p_vertex_diff->r = p_vertex_diff_mat->r;
  939. p_vertex_diff->g = p_vertex_diff_mat->g;
  940. p_vertex_diff->b = p_vertex_diff_mat->b;
  941. }
  942. }
  943. if (specular) {
  944. if (specular_ray) { // defaultni spekularni svetlo bude modifikovano
  945. vektor_set((BOD *) p_vertex_spec, 0.0f);
  946. }
  947. else { // defaultni spekularni se kopiruje
  948. *p_vertex_spec = *p_vertex_spec_mat;
  949. }
  950. }
  951. else if (specular_light) { // defaultni spekularni neexistuje
  952. vektor_set((BOD *) p_vertex_spec, 0.0f);
  953. }
  954. // Update statickych svetel podle materialu
  955. if (diffuse && !staticky) {
  956. for (i = 0; i < p_data->slightnum; i++) {
  957. p_slight = (STATIC_LIGHT *) p_data->p_light[i];
  958. vzdal = vzdal_bodu_bod(&p_slight->p, &p);
  959. if (vzdal < p_slight->dosah) {
  960. if (p_slight->uhel) {
  961. vektor_sub(&p, &p_slight->p, &dir);
  962. vektor_norm(&dir);
  963. if (norm) {
  964. vektor_norm(&n);
  965. norm = FALSE;
  966. }
  967. I = vektor_dot_product(&n, &dir);
  968. if (I <= 0.0f)
  969. continue;
  970. }
  971. else {
  972. I = 1.0f;
  973. }
  974. if (p_slight->utlum) {
  975. I *=
  976. 1.0f / (p_slight->k1 + p_slight->k2 * vzdal +
  977. p_slight->k3 * vzdal * vzdal);
  978. }
  979. if (diffuse_ray) {
  980. p_vertex_diff->r += p_vertex_diff_mat->r * p_slight->r * I;
  981. p_vertex_diff->g += p_vertex_diff_mat->g * p_slight->g * I;
  982. p_vertex_diff->b += p_vertex_diff_mat->b * p_slight->b * I;
  983. }
  984. if (specular_ray) {
  985. I *= lesk;
  986. p_vertex_spec->r += p_vertex_spec_mat->r * p_slight->r * I;
  987. p_vertex_spec->g += p_vertex_spec_mat->g * p_slight->g * I;
  988. p_vertex_spec->b += p_vertex_spec_mat->b * p_slight->b * I;
  989. }
  990. #ifdef DEBUG_MOD
  991. p_ber->debug.light_vertexu++;
  992. #endif
  993. }
  994. }
  995. // Normalizace barev
  996. if (diffuse_ray) {
  997. vektor_norm_up((BOD *) p_vertex_diff);
  998. }
  999. if (specular_ray) {
  1000. vektor_norm_up((BOD *) p_vertex_spec);
  1001. }
  1002. }
  1003. // Update jednoduchych dynamickych svetel
  1004. if (dyn_light) {
  1005. for (i = p_data->slightnum; i < p_data->lightakt; i++) {
  1006. p_dlight = (DYN_LIGHT *) p_data->p_light[i];
  1007. dflag = p_dlight->flag;
  1008. vzdal = vzdal_bodu_bod(&p_dlight->tp, &p);
  1009. if (vzdal > p_dlight->dosah)
  1010. continue;
  1011. if (vzdal <= p_dlight->min) {
  1012. if (dflag & SDL_ADD_SUB) {
  1013. p_vertex_diff->r -= p_dlight->sr;
  1014. p_vertex_diff->g -= p_dlight->sg;
  1015. p_vertex_diff->b -= p_dlight->sb;
  1016. vektor_norm_down((BOD *) p_vertex_diff);
  1017. p_vertex_diff->r += p_dlight->dr;
  1018. p_vertex_diff->g += p_dlight->dg;
  1019. p_vertex_diff->b += p_dlight->db;
  1020. }
  1021. else if (dflag & SDL_SUB) {
  1022. p_vertex_diff->r -= p_dlight->dr;
  1023. p_vertex_diff->g -= p_dlight->dg;
  1024. p_vertex_diff->b -= p_dlight->db;
  1025. }
  1026. else {
  1027. p_vertex_diff->r += p_dlight->dr;
  1028. p_vertex_diff->g += p_dlight->dg;
  1029. p_vertex_diff->b += p_dlight->db;
  1030. }
  1031. }
  1032. else {
  1033. j =
  1034. ftoi(((vzdal - p_dlight->min) / (p_dlight->max -
  1035. p_dlight->min)) * 255.0f);
  1036. I =
  1037. (dflag & SDL_UTLUM_LINEAR) ? p_looksqrt_linear_float[j] :
  1038. p_looksqrt_quad_float[j];
  1039. if (I < DELTA_MIN)
  1040. continue;
  1041. if (dflag & SDL_ADD_SUB) {
  1042. p_vertex_diff->r -= p_dlight->sr * I;
  1043. p_vertex_diff->g -= p_dlight->sg * I;
  1044. p_vertex_diff->b -= p_dlight->sb * I;
  1045. vektor_norm_down((BOD *) p_vertex_diff);
  1046. p_vertex_diff->r += p_dlight->dr * I;
  1047. p_vertex_diff->g += p_dlight->dg * I;
  1048. p_vertex_diff->b += p_dlight->db * I;
  1049. }
  1050. else if (dflag & SDL_SUB) {
  1051. p_vertex_diff->r -= p_dlight->dr * I;
  1052. p_vertex_diff->g -= p_dlight->dg * I;
  1053. p_vertex_diff->b -= p_dlight->db * I;
  1054. }
  1055. else {
  1056. p_vertex_diff->r += p_dlight->dr * I;
  1057. p_vertex_diff->g += p_dlight->dg * I;
  1058. p_vertex_diff->b += p_dlight->db * I;
  1059. }
  1060. }
  1061. }
  1062. }
  1063. // Update extra-svetel - pokud jsou
  1064. if (extra_light) {
  1065. for (i = 0; i < extra_light; i++) {
  1066. p_light = p_data->p_edlight[i];
  1067. dflag = p_light->flag;
  1068. if (dflag & EDL_ZEMNI_MLHA) {
  1069. vzdal = fabsf(p_light->tp.y - p.y);
  1070. if (vzdal <= p_light->v_start) {
  1071. p_vertex_spec->r = p_light->sr;
  1072. p_vertex_spec->g = p_light->sg;
  1073. p_vertex_spec->b = p_light->sb;
  1074. }
  1075. else if (vzdal < p_light->v_stop) {
  1076. vzdal2 = vzdal_bodu_bod(&cam, &p);
  1077. if (vzdal2 < p_light->h_start) {
  1078. I =
  1079. 1.0f - (vzdal - p_light->v_start) / (p_light->v_stop -
  1080. p_light->v_start);
  1081. p_vertex_spec->r = p_light->sr * I;
  1082. p_vertex_spec->g = p_light->sg * I;
  1083. p_vertex_spec->b = p_light->sb * I;
  1084. }
  1085. else if (vzdal2 > p_light->h_stop) {
  1086. p_vertex_spec->r = p_light->sr;
  1087. p_vertex_spec->g = p_light->sg;
  1088. p_vertex_spec->b = p_light->sb;
  1089. }
  1090. else {
  1091. vzdal =
  1092. 1.0f - (vzdal - p_light->v_start) / (p_light->v_stop -
  1093. p_light->v_start);
  1094. vzdal2 =
  1095. (vzdal2 - p_light->h_start) / (p_light->h_stop -
  1096. p_light->h_start);
  1097. I = MAX(vzdal, vzdal2);
  1098. p_vertex_spec->r = p_light->sr * I;
  1099. p_vertex_spec->g = p_light->sg * I;
  1100. p_vertex_spec->b = p_light->sb * I;
  1101. }
  1102. }
  1103. }
  1104. else {
  1105. if (dflag & EDL_DOSAH) {
  1106. if (dflag & EDL_BODOVE) {
  1107. vzdal = vzdal_bodu_bod(&p_light->tp, &p);
  1108. }
  1109. else if (dflag & (EDL_PLOSNE_X | EDL_PLOSNE_Y |
  1110. EDL_PLOSNE_Z)) {
  1111. if (dflag & EDL_PLOSNE_X) {
  1112. vzdal = fabsf(p_light->tp.x - p.x);
  1113. }
  1114. else if (dflag & EDL_PLOSNE_Y) {
  1115. vzdal = fabsf(p_light->tp.y - p.y);
  1116. }
  1117. else {
  1118. vzdal = fabsf(p_light->tp.z - p.z);
  1119. }
  1120. }
  1121. if (vzdal >= p_light->dosah)
  1122. continue;
  1123. if (dflag & EDL_UTLUM_LIN) {
  1124. vzdal =
  1125. 1.0f - (vzdal) / (p_light->dosah * p_light->utlum);
  1126. if (vzdal < DELTA_MIN)
  1127. continue;
  1128. }
  1129. else if (dflag & EDL_UTLUM_KVAD) {
  1130. vzdal =
  1131. 1.0f -
  1132. (vzdal * vzdal) / (p_light->dosah * p_light->utlum);
  1133. if (vzdal < DELTA_MIN)
  1134. continue;
  1135. }
  1136. else {
  1137. vzdal = 1.0f;
  1138. }
  1139. }
  1140. else {
  1141. vzdal = 1.0f;
  1142. }
  1143. if (dflag & EDL_GOURAND) {
  1144. vektor_sub(&p, &p_light->tp, &dir);
  1145. vektor_norm(&dir);
  1146. if (norm) {
  1147. vektor_norm(&n);
  1148. norm = FALSE;
  1149. }
  1150. I = vektor_dot_product(&n, &dir) * vzdal * p_light->gourand;
  1151. if (I < DELTA_MIN)
  1152. continue;
  1153. }
  1154. else {
  1155. I = vzdal;
  1156. }
  1157. // Nastav alfa slozku
  1158. if (dflag & (EDL_ALFA_MOD | EDL_ALFA_SET | EDL_ALFA_ADD |
  1159. EDL_ALFA_SUB)) {
  1160. if (dflag & EDL_ALFA_SET) {
  1161. p_vertex_diff->a = 1.0f - p_light->da * I;
  1162. }
  1163. else if (dflag & EDL_ALFA_ADD) {
  1164. p_vertex_diff->a =
  1165. p_vertex_diff_mat->a + (1.0f - p_light->da * I);
  1166. }
  1167. else if (dflag & EDL_ALFA_MOD) {
  1168. p_vertex_diff->a =
  1169. p_vertex_diff_mat->a * (1.0f - p_light->da * I);
  1170. }
  1171. else {
  1172. p_vertex_diff->a =
  1173. p_vertex_diff_mat->a - (1.0f - p_light->da * I);
  1174. }
  1175. }
  1176. // Nastav spekularni slozku
  1177. if (dflag & (EDL_SPEC_MOD | EDL_SPEC_SET | EDL_SPEC_ADD |
  1178. EDL_SPEC_SUB)) {
  1179. if (dflag & EDL_SPEC_ADD) {
  1180. p_vertex_spec->r += p_light->sr * I;
  1181. p_vertex_spec->g += p_light->sg * I;
  1182. p_vertex_spec->b += p_light->sb * I;
  1183. }
  1184. else if (dflag & EDL_SPEC_MOD) {
  1185. p_vertex_spec->r *= p_light->sr * I;
  1186. p_vertex_spec->g *= p_light->sg * I;
  1187. p_vertex_spec->b *= p_light->sb * I;
  1188. }
  1189. else if (dflag & EDL_SPEC_SUB) {
  1190. p_vertex_spec->r -= p_light->sr * I;
  1191. p_vertex_spec->g -= p_light->sg * I;
  1192. p_vertex_spec->b -= p_light->sb * I;
  1193. }
  1194. else {
  1195. p_vertex_spec->r = p_light->sr * I;
  1196. p_vertex_spec->g = p_light->sg * I;
  1197. p_vertex_spec->b = p_light->sb * I;
  1198. }
  1199. }
  1200. }
  1201. }
  1202. }
  1203. }
  1204. if (bump && diffuse) {
  1205. vektor_norm_bump((BOD *) p_vertex_diff);
  1206. }
  1207. // Posun na dalsi vertex
  1208. p_vertex_diff++;
  1209. p_vertex_diff_mat++;
  1210. if (specular || specular_light) {
  1211. p_vertex_spec++;
  1212. p_vertex_spec_mat++;
  1213. }
  1214. }
  1215. }
  1216. }
  1217. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  1218. if (specular || specular_light)
  1219. p_mesh->p_data->k2flag |= KONT2_UPDATE_SPEC;
  1220. return (TRUE);
  1221. }
  1222. void dl_reset_svetel(G_KONFIG * p_ber)
  1223. {
  1224. DYN_LIGHT *p_light;
  1225. EXTRA_DYN_LIGHT *p_edlight;
  1226. int i;
  1227. for (i = 0; i < p_ber->dl_lightnum; i++) {
  1228. p_light = p_ber->p_dlight + i;
  1229. if (p_light->akt) {
  1230. p_light->flag &= ~(SDL_ZMENA_GLOBAL | SDL_ZMENA_LOKAL);
  1231. }
  1232. }
  1233. for (i = 0; i < p_ber->edl_lightnum; i++) {
  1234. p_edlight = p_ber->p_edlight + i;
  1235. if (p_edlight->akt) {
  1236. p_edlight->flag &= ~(EDL_ZMENA_GLOBAL | EDL_ZMENA_LOKAL);
  1237. }
  1238. }
  1239. }
  1240. inline void dl_updatuj_mesh(G_KONFIG * p_ber, GAME_MESH_OLD * p_mesh,
  1241. int full_light, int all)
  1242. {
  1243. int v1, v2;
  1244. v1 = dl_mesh_pridej_svetla(p_ber, p_mesh);
  1245. v2 = edl_mesh_pridej_svetla(p_ber, p_mesh);
  1246. if (v1 || v2) {
  1247. dl_mesh_pripocitej_svetla(p_ber, p_mesh, v1, v2, full_light, all);
  1248. p_mesh->p_data->kflag |= KONT_POHYB_ZRUS;
  1249. }
  1250. }
  1251. inline void dl_updatuj_seznam_meshu(G_KONFIG * p_ber, int all)
  1252. {
  1253. GAME_MESH_OLD *p_mesh;
  1254. int flag = (p_ber->conf_dyn_light_prvky
  1255. || p_ber->conf_dyn_light_beruska) ? KONT_PRVEK : FALSE;
  1256. int full = p_ber->conf_full_light;
  1257. int m;
  1258. if (all) {
  1259. for (m = 0; m < p_ber->meshnum; m++) {
  1260. p_mesh = p_ber->p_mesh[m];
  1261. if (p_mesh) {
  1262. dl_updatuj_mesh(p_ber, p_mesh,
  1263. full ? ber_je_mesh_prvek_fast(p_mesh) : FALSE, all);
  1264. }
  1265. }
  1266. }
  1267. else {
  1268. ber_mesh_render_list_reset(p_ber);
  1269. while (p_mesh = ber_mesh_render_list_next_flag(p_ber, flag, FALSE)) {
  1270. if (!p_ber->conf_dyn_light_beruska || (p_ber->conf_dyn_light_beruska
  1271. && ber_je_mesh_beruska_fast(p_mesh)))
  1272. dl_updatuj_mesh(p_ber, p_mesh,
  1273. full ? ber_je_mesh_prvek_fast(p_mesh) : FALSE, FALSE);
  1274. }
  1275. }
  1276. }
  1277. // Vzdalenost od ctvercove obalky
  1278. int dl_poly_pridej_svetla(G_KONFIG * p_ber, EDIT_MESH_POLY * p_poly)
  1279. {
  1280. DYN_LIGHT *p_dlight = p_ber->p_dlight;
  1281. void *p_light_dyn[MAX_FLARE_SVETEL * 2];
  1282. int lightakt = 0;
  1283. int i;
  1284. if (!p_ber->dl_recalc && !p_ber->dl_new)
  1285. return (FALSE);
  1286. for (lightakt = 0, i = 0; i < p_ber->dl_lightnum; i++) {
  1287. p_dlight = p_ber->p_dlight + i;
  1288. if (p_dlight->akt
  1289. && p_dlight->dosah > obb_vzdal_bod(&p_poly->obb, &p_dlight->tp)) {
  1290. p_light_dyn[lightakt++] = p_dlight;
  1291. }
  1292. }
  1293. p_poly->lightakt = i = lightakt;
  1294. if (!i) {
  1295. null_free((void **) &p_poly->p_dlight);
  1296. p_poly->lightmax = 0;
  1297. }
  1298. else {
  1299. if (i >= p_poly->lightmax) {
  1300. null_free((void **) &p_poly->p_dlight);
  1301. i += (i >> 1) + 10;
  1302. p_poly->p_dlight = (void **) mmalloc(sizeof(p_poly->p_dlight[0]) * i);
  1303. p_poly->lightmax = i;
  1304. }
  1305. memcpy(p_poly->p_dlight, p_light_dyn, i * sizeof(p_poly->p_dlight[0]));
  1306. }
  1307. return (TRUE);
  1308. }
  1309. // Vzdalenost od ctvercove obalky
  1310. int edl_poly_pridej_svetla(G_KONFIG * p_ber, EDIT_MESH_POLY * p_poly)
  1311. {
  1312. EXTRA_DYN_LIGHT *p_light;
  1313. EXTRA_DYN_LIGHT *p_light_dyn[MAX_FLARE_SVETEL * 2];
  1314. float vzdal;
  1315. int kflag = p_poly->kflag;
  1316. dword flags = 0;
  1317. int flag;
  1318. int lightnum;
  1319. int i;
  1320. if (!p_ber->edl_recalc && !p_ber->edl_new)
  1321. return (FALSE);
  1322. // Zaradim dynamicke svetla
  1323. lightnum = 0;
  1324. for (i = 0; i < p_ber->edl_lightnum; i++) {
  1325. p_light = p_ber->p_edlight + i;
  1326. if (p_light->akt) {
  1327. flag = p_light->flag;
  1328. if (!(flag & EDL_SCENA)) {
  1329. if (flag & EDL_MESH_LIGHT) {
  1330. if (kflag & KONT_DRAW_LIGHT && p_poly->top_edlight == i) {
  1331. p_light_dyn[lightnum++] = p_light;
  1332. flags |= p_light->flag;
  1333. }
  1334. }
  1335. else if (flag & EDL_DOSAH) {
  1336. if (flag & EDL_BODOVE) {
  1337. if (p_light->dosah > obb_vzdal_bod(&p_poly->obb, &p_light->tp)) {
  1338. p_light_dyn[lightnum++] = p_light;
  1339. flags |= p_light->flag;
  1340. }
  1341. }
  1342. else if (flag & (EDL_PLOSNE_X | EDL_PLOSNE_Y | EDL_PLOSNE_Z)) {
  1343. if (flag & EDL_PLOSNE_X) {
  1344. vzdal = obb_vzdal_rovina_x(&p_poly->obb, p_light->tp.x);
  1345. }
  1346. else if (flag & EDL_PLOSNE_Y) {
  1347. vzdal = obb_vzdal_rovina_y(&p_poly->obb, p_light->tp.y);
  1348. }
  1349. else {
  1350. vzdal = obb_vzdal_rovina_z(&p_poly->obb, p_light->tp.z);
  1351. }
  1352. if (p_light->dosah > vzdal) {
  1353. p_light_dyn[lightnum++] = p_light;
  1354. flags |= p_light->flag;
  1355. }
  1356. }
  1357. }
  1358. }
  1359. else {
  1360. p_light_dyn[lightnum++] = p_light;
  1361. flags |= p_light->flag;
  1362. }
  1363. }
  1364. }
  1365. if (!lightnum) {
  1366. null_free((void **) &p_poly->p_edlight);
  1367. p_poly->edlightakt = p_poly->edlightmax = 0;
  1368. if (!(kflag & KONT_DRAW_LIGHT)) {
  1369. p_poly->kflag &= ~(KONT_DRAW_SPEC);
  1370. p_poly->kflag &= ~(KONT_DRAW_PRUHL);
  1371. }
  1372. }
  1373. else {
  1374. // Nastav ostrou spekularni barvu
  1375. if (flags & (EDL_SPEC_MOD | EDL_SPEC_SET | EDL_SPEC_ADD | EDL_SPEC_SUB)) {
  1376. p_poly->kflag |= KONT_DRAW_SPEC;
  1377. }
  1378. if (flags & EDL_PRUHL_LIGHT) {
  1379. p_poly->kflag |= KONT_DRAW_PRUHL;
  1380. }
  1381. if (lightnum >= p_poly->edlightmax) {
  1382. null_free((void **) &p_poly->p_edlight);
  1383. i += (lightnum >> 1) + 10;
  1384. p_poly->p_edlight = (void **) mmalloc(sizeof(p_poly->p_edlight[0]) * i);
  1385. p_poly->edlightmax = i;
  1386. memcpy(p_poly->p_edlight, p_light_dyn,
  1387. sizeof(p_poly->p_edlight[0]) * lightnum);
  1388. }
  1389. else {
  1390. memcpy(p_poly->p_edlight, p_light_dyn,
  1391. sizeof(p_poly->p_edlight[0]) * lightnum);
  1392. }
  1393. p_poly->edlightakt = lightnum;
  1394. }
  1395. return (TRUE);
  1396. }
  1397. inline int dl_poly_svetlo_update(EDIT_MESH_POLY * p_poly)
  1398. {
  1399. DYN_LIGHT **p_dlight = (DYN_LIGHT **) p_poly->p_dlight;
  1400. dword flags = 0;
  1401. int i;
  1402. for (i = 0; i < p_poly->lightakt; i++) {
  1403. flags |= p_dlight[i]->flag;
  1404. }
  1405. return (flags & (SDL_ZMENA_GLOBAL | SDL_ZMENA_LOKAL));
  1406. }
  1407. inline int edl_poly_svetlo_update(EDIT_MESH_POLY * p_poly, int *p_flag)
  1408. {
  1409. EXTRA_DYN_LIGHT **p_edlight = (EXTRA_DYN_LIGHT **) p_poly->p_edlight;
  1410. dword flags = 0;
  1411. int i;
  1412. for (i = 0; i < p_poly->edlightakt; i++) {
  1413. flags |= p_edlight[i]->flag;
  1414. }
  1415. *p_flag = flags;
  1416. return (flags & (EDL_ZMENA_GLOBAL | EDL_ZMENA_LOKAL));
  1417. }
  1418. /* Updatuju dynamicky svetla a extra-svetla
  1419. */
  1420. int edl_poly_pripocitej_svetla(G_KONFIG * p_ber, EDIT_MESH_POLY * p_poly)
  1421. {
  1422. EXTRA_DYN_LIGHT *p_light;
  1423. BODRGBA *p_vertex_diff;
  1424. BODRGBA *p_vertex_diff_mat;
  1425. BODRGB *p_vertex_spec;
  1426. BODRGB *p_vertex_spec_mat;
  1427. BOD *p, *n, dir, cam;
  1428. int i, v, vnum, dflag;
  1429. int specular, specular_light;
  1430. int extra_light;
  1431. int lflag, diffuse, update;
  1432. float vzdal, vzdal2, I;
  1433. update = edl_poly_svetlo_update(p_poly, &lflag);
  1434. if (!p_ber->edl_new && !update) {
  1435. return (FALSE);
  1436. }
  1437. diffuse =
  1438. lflag & (EDL_ALFA_MOD | EDL_ALFA_SET | EDL_ALFA_ADD | EDL_ALFA_SUB);
  1439. specular =
  1440. lflag & (EDL_SPEC_MOD | EDL_SPEC_SET | EDL_SPEC_ADD | EDL_SPEC_SUB);
  1441. specular_light = p_poly->kflag & KONT_DRAW_SPEC;
  1442. if (lflag & EDL_ZEMNI_MLHA) {
  1443. cam.x = p_ber->p_invcam->_41;
  1444. cam.y = p_ber->p_invcam->_42;
  1445. cam.z = p_ber->p_invcam->_43;
  1446. }
  1447. #ifdef DEBUG_MOD
  1448. p_ber->debug.light_meshu++;
  1449. #endif
  1450. extra_light = p_poly->edlightakt;
  1451. vnum = p_poly->facenum;
  1452. for (v = 0; v < vnum; v++) {
  1453. p = (BOD *) & p_poly->p_koord[v].x;
  1454. n = (BOD *) & p_poly->p_koord[v].nx;
  1455. if (diffuse) { // je aktivni diff-operace
  1456. p_vertex_diff = (BODRGBA *) & p_poly->p_koord[v].dr;
  1457. p_vertex_diff_mat = (BODRGBA *) & p_poly->p_koord[v].mdr;
  1458. }
  1459. if (specular) { // je aktivni spec-operace -> loaduju defaultni specy
  1460. p_vertex_spec = (BODRGB *) & p_poly->p_koord[v].sr;
  1461. p_vertex_spec_mat = (BODRGB *) & p_poly->p_koord[v].msr;
  1462. *p_vertex_spec = *p_vertex_spec_mat;
  1463. }
  1464. else if (specular_light) { // defaultni spekularni neexistuje
  1465. p_vertex_spec = (BODRGB *) & p_poly->p_koord[v].sr;
  1466. p_vertex_spec->r = 0.0f;
  1467. p_vertex_spec->g = 0.0f;
  1468. p_vertex_spec->b = 0.0f;
  1469. }
  1470. /* Update extra-svetel
  1471. */
  1472. for (i = 0; i < extra_light; i++) {
  1473. p_light = (EXTRA_DYN_LIGHT *) p_poly->p_edlight[i];
  1474. dflag = p_light->flag;
  1475. if (dflag & EDL_ZEMNI_MLHA) {
  1476. vzdal = fabsf(p_light->tp.y - p->y);
  1477. if (vzdal <= p_light->v_start) {
  1478. p_vertex_spec->r = p_light->sr;
  1479. p_vertex_spec->g = p_light->sg;
  1480. p_vertex_spec->b = p_light->sb;
  1481. }
  1482. else if (vzdal <= p_light->v_stop) {
  1483. vzdal2 = vzdal_bodu_bod(&cam, p);
  1484. if (vzdal2 < p_light->h_start) {
  1485. I =
  1486. 1.0f - (vzdal - p_light->v_start) / (p_light->v_stop -
  1487. p_light->v_start);
  1488. p_vertex_spec->r = p_light->sr * I;
  1489. p_vertex_spec->g = p_light->sg * I;
  1490. p_vertex_spec->b = p_light->sb * I;
  1491. }
  1492. else if (vzdal2 > p_light->h_stop) {
  1493. p_vertex_spec->r = p_light->sr;
  1494. p_vertex_spec->g = p_light->sg;
  1495. p_vertex_spec->b = p_light->sb;
  1496. }
  1497. else {
  1498. vzdal =
  1499. 1.0f - (vzdal - p_light->v_start) / (p_light->v_stop -
  1500. p_light->v_start);
  1501. vzdal2 =
  1502. (vzdal2 - p_light->h_start) / (p_light->h_stop -
  1503. p_light->h_start);
  1504. I = MAX(vzdal, vzdal2);
  1505. p_vertex_spec->r = p_light->sr * I;
  1506. p_vertex_spec->g = p_light->sg * I;
  1507. p_vertex_spec->b = p_light->sb * I;
  1508. }
  1509. }
  1510. }
  1511. else {
  1512. if (dflag & EDL_DOSAH) {
  1513. if (dflag & EDL_BODOVE) {
  1514. vzdal = vzdal_bodu_bod(&p_light->tp, p);
  1515. }
  1516. else if (dflag & (EDL_PLOSNE_X | EDL_PLOSNE_Y | EDL_PLOSNE_Z)) {
  1517. if (dflag & EDL_PLOSNE_X) {
  1518. vzdal = fabsf(p_light->tp.x - p->x);
  1519. }
  1520. else if (dflag & EDL_PLOSNE_Y) {
  1521. vzdal = fabsf(p_light->tp.y - p->y);
  1522. }
  1523. else {
  1524. vzdal = fabsf(p_light->tp.z - p->z);
  1525. }
  1526. }
  1527. if (vzdal >= p_light->dosah)
  1528. continue;
  1529. if (dflag & EDL_UTLUM_LIN) {
  1530. vzdal = 1.0f - (vzdal) / (p_light->dosah * p_light->utlum);
  1531. if (vzdal < DELTA_MIN)
  1532. continue;
  1533. }
  1534. else if (dflag & EDL_UTLUM_KVAD) {
  1535. vzdal =
  1536. 1.0f - (vzdal * vzdal) / (p_light->dosah * p_light->utlum);
  1537. if (vzdal < DELTA_MIN)
  1538. continue;
  1539. }
  1540. else {
  1541. vzdal = 1.0f;
  1542. }
  1543. }
  1544. else {
  1545. vzdal = 1.0f;
  1546. }
  1547. if (dflag & EDL_GOURAND) {
  1548. vektor_sub(p, &p_light->tp, &dir);
  1549. vektor_norm(&dir);
  1550. I = vektor_dot_product(n, &dir) * vzdal * p_light->gourand;
  1551. if (I < DELTA_MIN)
  1552. continue;
  1553. }
  1554. else {
  1555. I = vzdal;
  1556. }
  1557. // Nastav alfa slozku
  1558. if (dflag & (EDL_ALFA_MOD | EDL_ALFA_SET | EDL_ALFA_ADD |
  1559. EDL_ALFA_SUB)) {
  1560. if (dflag & EDL_ALFA_SET) {
  1561. p_vertex_diff->a = 1.0f - p_light->da * I;
  1562. }
  1563. else if (dflag & EDL_ALFA_ADD) {
  1564. p_vertex_diff->a = p_vertex_diff_mat->a + 1.0f - p_light->da * I;
  1565. }
  1566. else if (dflag & EDL_ALFA_MOD) {
  1567. p_vertex_diff->a =
  1568. p_vertex_diff_mat->a * (1.0f - p_light->da * I);
  1569. }
  1570. else {
  1571. p_vertex_diff->a =
  1572. p_vertex_diff_mat->a - (1.0f - p_light->da * I);
  1573. }
  1574. }
  1575. // Nastav spekularni slozku
  1576. if (dflag & (EDL_SPEC_MOD | EDL_SPEC_SET | EDL_SPEC_ADD |
  1577. EDL_SPEC_SUB)) {
  1578. if (dflag & EDL_SPEC_ADD) {
  1579. p_vertex_spec->r += p_light->sr * I;
  1580. p_vertex_spec->g += p_light->sg * I;
  1581. p_vertex_spec->b += p_light->sb * I;
  1582. }
  1583. else if (dflag & EDL_SPEC_MOD) {
  1584. p_vertex_spec->r *= p_light->sr * I;
  1585. p_vertex_spec->g *= p_light->sg * I;
  1586. p_vertex_spec->b *= p_light->sb * I;
  1587. }
  1588. else if (dflag & EDL_SPEC_SUB) {
  1589. p_vertex_spec->r -= p_light->sr * I;
  1590. p_vertex_spec->g -= p_light->sg * I;
  1591. p_vertex_spec->b -= p_light->sb * I;
  1592. }
  1593. else {
  1594. p_vertex_spec->r = p_light->sr * I;
  1595. p_vertex_spec->g = p_light->sg * I;
  1596. p_vertex_spec->b = p_light->sb * I;
  1597. }
  1598. }
  1599. }
  1600. }
  1601. }
  1602. p_poly->kflag |= KONT_UPLOAD;
  1603. return (TRUE);
  1604. }
  1605. /*
  1606. - nahodim lightmapu a provedu update vsech regionu
  1607. - U dynamickeho svetla udelam nakvantovani celeho jeho dosahu
  1608. po n krocich pro vsechny barvy po kroku vzdal nadruhou max 255 kombinaci)
  1609. */
  1610. /*
  1611. #define MAX_LOOKF 255.0f
  1612. #define MAX_LOOK 255
  1613. */
  1614. #define MIN_LOOKF 0.0f
  1615. #define MIN_LOOK 0
  1616. // full_light - plne osvetleni
  1617. inline int sdl_poly_pripocitej_svetla_face(G_KONFIG * p_ber,
  1618. EDIT_MESH_POLY * p_poly, LIGHTMAP_FACE * p_lf, int full_light)
  1619. {
  1620. int lnum = p_poly->lightakt;
  1621. dword *p_data;
  1622. int ddx;
  1623. float suf1, suf2, svf1, svf2;
  1624. float vzdal, dosah2d, look_max, max_vzdal;
  1625. BOD s;
  1626. DYN_LIGHT *p_dlight;
  1627. int l, sv, su, u;
  1628. dword r, g, b;
  1629. dword sr, sg, sb;
  1630. int nup, nul; // pocet pravych/levych pixelu
  1631. int sup, sul; // pocet pravych/levych pixelu
  1632. int nvp, nvl; // pocet pravych/levych pixelu
  1633. int svp, svl; // pocet pravych/levych pixelu
  1634. int kup, skup; // fixed pricitaci krok prave/leve strany
  1635. int kul, skul; // fixed start prave/leve strany
  1636. int kvp, skvp; // fixed pricitaci krok prave/leve strany
  1637. int kvl, skvl; // fixed start prave/leve strany
  1638. int fvzdal; // fixed-point 8:24 korekcni hodnota v look-up tabulce
  1639. int min_u, max_u;
  1640. int min_v, max_v;
  1641. int zal, nusu, nvsv;
  1642. int *p_looksqrt;
  1643. int nu, nv;
  1644. if (!full_light) {
  1645. for (l = 0, u = 0; l < lnum; l++) {
  1646. p_dlight = (DYN_LIGHT *) p_poly->p_dlight[l];
  1647. vzdal = vzdal_bodu_a_roviny(&p_dlight->tp, &p_lf->n);
  1648. if (p_dlight->aup = (vzdal < p_dlight->dosah)) {
  1649. p_dlight->avzdal = vzdal;
  1650. u++;
  1651. }
  1652. }
  1653. if (!u && !p_lf->last_u && !p_ber->conf_full_light_last) {
  1654. p_lf->upload = FALSE;
  1655. return (FALSE);
  1656. }
  1657. }
  1658. // kopie ze zalohy do vysledku
  1659. bmp_kopiruj(p_lf->p_zal, p_lf->p_bmp);
  1660. if (full_light) {
  1661. bmp_smaz(p_lf->p_bmp, 0xffffff);
  1662. u = 0;
  1663. }
  1664. p_lf->last_u = u;
  1665. if (!u) {
  1666. p_lf->upload = TRUE;
  1667. return (TRUE);
  1668. }
  1669. ddx = p_lf->p_bmp->x;
  1670. p_data = p_lf->p_bmp->data;
  1671. // udelam to pro kazde svetlo extra zvlaste
  1672. for (l = 0; l < lnum; l++) {
  1673. p_dlight = (DYN_LIGHT *) p_poly->p_dlight[l];
  1674. if (!p_dlight->aup)
  1675. continue;
  1676. p_looksqrt = p_dlight->flag & SDL_UTLUM_KVADRATIC ?
  1677. p_ber->p_looksqrt_quadratic : p_ber->p_looksqrt_linear;
  1678. // 3D bod na rovine
  1679. s.x = p_dlight->tp.x - p_lf->n.x * p_dlight->avzdal;
  1680. s.y = p_dlight->tp.y - p_lf->n.y * p_dlight->avzdal;
  1681. s.z = p_dlight->tp.z - p_lf->n.z * p_dlight->avzdal;
  1682. // 2D bod ve svetle
  1683. nu = p_lf->nu + 2;
  1684. nv = p_lf->nv + 2;
  1685. su =
  1686. ftoi(vzdal_bodu_a_roviny_nabs(&s,
  1687. &p_lf->rv) * ((float) nu / p_lf->ddu));
  1688. sv =
  1689. ftoi(vzdal_bodu_a_roviny_nabs(&s,
  1690. &p_lf->ru) * ((float) nv / p_lf->ddv));
  1691. suf1 = vzdal_bodu_a_primky(&s, &p_lf->s0, &p_lf->s1);
  1692. svf1 = vzdal_bodu_a_primky(&s, &p_lf->s0, &p_lf->s2);
  1693. suf2 = vzdal_bodu_a_primky(&s, &p_lf->s2, &p_lf->s3);
  1694. svf2 = vzdal_bodu_a_primky(&s, &p_lf->s1, &p_lf->s3);
  1695. r = (byte) ftoi(255.0f * p_dlight->dr);
  1696. g = (byte) ftoi(255.0f * p_dlight->dg);
  1697. b = (byte) ftoi(255.0f * p_dlight->db);
  1698. if (p_dlight->flag & SDL_ADD_SUB) {
  1699. sr = (byte) ftoi(255.0f * p_dlight->sr);
  1700. sg = (byte) ftoi(255.0f * p_dlight->sg);
  1701. sb = (byte) ftoi(255.0f * p_dlight->sb);
  1702. }
  1703. look_max = p_dlight->look_max;
  1704. if (p_dlight->avzdal >= p_dlight->min) {
  1705. fvzdal =
  1706. 0x01000000 - ftoi((float) 0x01000000 * ((p_dlight->avzdal -
  1707. p_dlight->min) / p_dlight->max));
  1708. }
  1709. else {
  1710. fvzdal = 0x01000000;
  1711. }
  1712. dosah2d =
  1713. sqrtf(p_dlight->dosah * p_dlight->dosah -
  1714. p_dlight->avzdal * p_dlight->avzdal);
  1715. nusu = nu - su;
  1716. nvsv = nv - sv;
  1717. // Strana U lightmapy
  1718. if (su <= 0) {
  1719. if (suf1 > dosah2d)
  1720. continue;
  1721. min_u = ftoi(look_max * suf1 / dosah2d);
  1722. if (suf2 > dosah2d) {
  1723. max_u = ftoi(look_max);
  1724. nup = ftoi(((dosah2d - suf1) / (suf2 - suf1)) * nu);
  1725. }
  1726. else {
  1727. nup = nu;
  1728. max_u = ftoi(look_max * suf2 / dosah2d);
  1729. }
  1730. nul = sul = sup = 0;
  1731. if (nup > 0) {
  1732. kup = ((max_u - min_u) << 16) / nup;
  1733. skup = (min_u << 16) - kup;
  1734. }
  1735. }
  1736. else if (su >= nu - 1) {
  1737. if (suf2 > dosah2d)
  1738. continue;
  1739. min_u = ftoi(look_max * suf2 / dosah2d);
  1740. if (suf1 > dosah2d) {
  1741. max_u = ftoi(look_max);
  1742. nul = ftoi(((dosah2d - suf2) / (suf1 - suf2)) * nu);
  1743. }
  1744. else {
  1745. nul = nu;
  1746. max_u = ftoi(look_max * suf1 / dosah2d);
  1747. }
  1748. nup = sup = 0;
  1749. sul = nu - 1;
  1750. if (nul > 0) {
  1751. kul = ((max_u - min_u) << 16) / nul;
  1752. skul = (min_u << 16) - kul;
  1753. }
  1754. }
  1755. else {
  1756. min_u = MIN_LOOK;
  1757. max_vzdal = (suf2 > suf1) ? suf2 : suf1;
  1758. max_u =
  1759. (max_vzdal >
  1760. dosah2d) ? ftoi(look_max) : ftoi(look_max * max_vzdal / dosah2d);
  1761. // Spocitam pravou stranu -> sf2
  1762. nup = (suf2 > dosah2d) ? ftoi((dosah2d / suf2) * nusu) : nusu;
  1763. // Leva strana -> su
  1764. nul = (suf1 > dosah2d) ? ftoi((dosah2d / suf1) * su) : su;
  1765. /*
  1766. if(--nul < 0)
  1767. nul = 0;
  1768. */
  1769. sup = su; // Start prave strany
  1770. sul = su - 1; // Start leve strany
  1771. if (nup > 0 && nul > 0)
  1772. kup = kul = (nul > nup) ? (max_u << 16) / nul : (max_u << 16) / nup;
  1773. else if (nul > nup && nul > 0)
  1774. kup = kul = (max_u << 16) / nul;
  1775. else if (nup > 0)
  1776. kup = kul = (max_u << 16) / nup;
  1777. skul = skup = -kup;
  1778. }
  1779. /*
  1780. Strana V lightmapy
  1781. */
  1782. if (sv <= 0) {
  1783. if (svf1 > dosah2d)
  1784. continue;
  1785. min_v = ftoi(look_max * svf1 / dosah2d);
  1786. if (svf2 > dosah2d) {
  1787. max_v = ftoi(look_max);
  1788. nvp = ftoi(((dosah2d - svf1) / (svf2 - svf1)) * nv);
  1789. }
  1790. else {
  1791. nvp = nv;
  1792. max_v = ftoi(look_max * svf2 / dosah2d);
  1793. }
  1794. nvl = svl = svp = 0;
  1795. if (nvp > 0) {
  1796. kvp = ((max_v - min_v) << 16) / nvp;
  1797. skvp = (min_v << 16) - kvp;
  1798. }
  1799. }
  1800. else if (sv >= nv - 1) {
  1801. if (svf2 > dosah2d)
  1802. continue;
  1803. min_v = ftoi(look_max * svf2 / dosah2d);
  1804. if (svf1 > dosah2d) {
  1805. max_v = ftoi(look_max);
  1806. nvl = ftoi(((dosah2d - svf2) / (svf1 - svf2)) * nv);
  1807. }
  1808. else {
  1809. nvl = nv;
  1810. max_v = ftoi(look_max * svf1 / dosah2d);
  1811. }
  1812. nvp = svp = 0;
  1813. svl = nv - 1;
  1814. if (nvl > 0) {
  1815. kvl = ((max_v - min_v) << 16) / nvl;
  1816. skvl = (min_v << 16) - kvl;
  1817. }
  1818. }
  1819. else {
  1820. min_v = MIN_LOOK;
  1821. max_vzdal = (svf2 > svf1) ? svf2 : svf1;
  1822. max_v =
  1823. (max_vzdal >
  1824. dosah2d) ? ftoi(look_max) : ftoi(look_max * max_vzdal / dosah2d);
  1825. // Spocitam pravou stranu -> sf2
  1826. nvp = (svf2 > dosah2d) ? ftoi((dosah2d / svf2) * nvsv) : nvsv;
  1827. // Leva strana -> su
  1828. nvl = (svf1 > dosah2d) ? ftoi((dosah2d / svf1) * sv) : sv;
  1829. /*
  1830. if(--nvl < 0)
  1831. nvl = 0;
  1832. */
  1833. svp = sv; // Start prave strany
  1834. svl = sv - 1; // Start leve strany
  1835. if (nvp > 0 && nvl > 0)
  1836. kvp = kvl = (nvl > nvp) ? (max_v << 16) / nvl : (max_v << 16) / nvp;
  1837. else if (nvl > nvp && nvl > 0)
  1838. kvp = kvl = (max_v << 16) / nvl;
  1839. else if (nvp > 0)
  1840. kvp = kvl = (max_v << 16) / nvp;
  1841. skvl = skvp = -kvp;
  1842. }
  1843. // pokud je index po priteni mensi nez 0 -> vezmu maximum !!!
  1844. // pokud je vetsi nez 255 -> kaslu na to
  1845. // Prvne spocitam prave sloupce v lightmape
  1846. // potom leve sloupce
  1847. /*
  1848. if(p_dlight->flag&SDL_ADD_SUB) {
  1849. __asm {
  1850. pushfd
  1851. pushad
  1852. // Pocet pocitanych radku
  1853. mov ecx, nvp // pocet radku smerem nahoru
  1854. test ecx, ecx
  1855. jz __prava_strana_ms
  1856. ____dalsi_radek_prava_strana_ms:
  1857. mov edi, p_data
  1858. mov eax, svp
  1859. mov edx, nu
  1860. add eax, ecx
  1861. dec eax
  1862. mul edx
  1863. shl eax, 2
  1864. add edi, eax // edi -> mam cilovy radek v lightmape
  1865. mov eax, ecx
  1866. mov edx, kvp
  1867. mul edx
  1868. add eax, skvp
  1869. shr eax, 16 // vypoctu radku tabulky
  1870. shl eax, 10 // krat sirka tabulky * 4
  1871. mov ebx, p_looksqrt
  1872. add ebx, eax
  1873. mov zal, ebx // cilovy radk v look-up
  1874. push ecx
  1875. call __spocitej_radek_ms
  1876. pop ecx
  1877. dec ecx
  1878. jnz ____dalsi_radek_prava_strana_ms
  1879. // udelam levou stranu
  1880. __prava_strana_ms:
  1881. mov ecx, nvl // pocet radku smerem nahoru
  1882. test ecx, ecx
  1883. jz __konec_vseho_ms
  1884. ____dalsi_radek_leva_strana_ms: // prvne udelam levou stranu a potom pravou
  1885. mov edi, p_data
  1886. mov eax, svl
  1887. mov edx, nu
  1888. sub eax, ecx
  1889. inc eax
  1890. mul edx
  1891. shl eax, 2
  1892. add edi, eax // edi -> mam cilovy radek v lightmape
  1893. mov eax, ecx
  1894. mov edx, kvl
  1895. mul edx
  1896. add eax, skvl
  1897. shr eax, 16
  1898. shl eax, 10
  1899. mov ebx, p_looksqrt
  1900. add ebx, eax
  1901. mov zal, ebx
  1902. push ecx
  1903. call __spocitej_radek_ms
  1904. pop ecx
  1905. dec ecx
  1906. jnz ____dalsi_radek_leva_strana_ms
  1907. jmp __konec_vseho_ms
  1908. */
  1909. /* **************************************************
  1910. Vypocty scan_line
  1911. */
  1912. /*
  1913. // edi -> zacatek radku cilove ligthmapy
  1914. // zal -> zacatek radku look-up tabulky
  1915. __spocitej_radek_ms:
  1916. // spocitam jeden radek
  1917. push edi
  1918. cmp nup,0
  1919. jz __radek_dozadu_ms // pravy radek neexistuje -> preskoc ho
  1920. mov eax,sup
  1921. shl eax,2
  1922. add edi,eax // prictu sup -> zacatek v tabulce
  1923. mov ecx,nup // VV // cx -> pocet opakovani - pocet radku ligthmapy
  1924. mov edx,kup // krok v look-up tabulce (fixed)
  1925. mov ebx,skup // start bod v look-up tabulce (fixed)
  1926. sloupec_dopredu_ms: // prava strana
  1927. add ebx,edx // ebx -> aktualni fixed point bod
  1928. // edx -> fixed point krok
  1929. // cx -> pocet kroku
  1930. // edi -> kam zapisuju
  1931. mov eax,ebx // eax je tmp registr
  1932. shr eax,16
  1933. shl eax,2
  1934. mov esi,zal
  1935. add esi,eax
  1936. push edx
  1937. mov eax,[esi] // nactu intenzitu rgb barev
  1938. mul fvzdal // vynasobim fixed-point koeficientem a-vzdal
  1939. shl edx,8
  1940. shr eax,24
  1941. or edx,eax
  1942. mov esi,edx // schovam si fixed-point hodnotu
  1943. mov eax,r // add-mod
  1944. mul esi
  1945. shr eax,24
  1946. mov dl,[edi]
  1947. add dl,al
  1948. jnc __neni_prenos_r1_msa
  1949. mov dl,0xff
  1950. __neni_prenos_r1_msa:
  1951. push edx
  1952. mov eax,sr // sub-mod
  1953. mul esi
  1954. pop edx
  1955. shr eax,24
  1956. sub dl,al
  1957. ja __neni_prenos_r1_ms
  1958. mov dl,0x0
  1959. __neni_prenos_r1_ms:
  1960. mov [edi],dl
  1961. inc edi
  1962. mov eax,g
  1963. mul esi
  1964. shr eax,24
  1965. mov dl,[edi]
  1966. add dl,al
  1967. jnc __neni_prenos_g1_msa
  1968. mov dl,0xff
  1969. __neni_prenos_g1_msa:
  1970. push edx
  1971. mov eax,sg
  1972. mul esi
  1973. pop edx
  1974. shr eax,24
  1975. sub dl,al
  1976. ja __neni_prenos_g1_ms
  1977. mov dl,0x0
  1978. __neni_prenos_g1_ms:
  1979. mov [edi],dl
  1980. inc edi
  1981. mov eax,b
  1982. mul esi
  1983. shr eax,24
  1984. mov dl,[edi]
  1985. add dl,al
  1986. jnc __neni_prenos_b1_msa
  1987. mov dl,0xff
  1988. __neni_prenos_b1_msa:
  1989. push edx
  1990. mov eax,sb
  1991. mul esi
  1992. pop edx
  1993. shr eax,24
  1994. sub dl,al
  1995. ja __neni_prenos_b1_ms
  1996. mov dl,0x0
  1997. __neni_prenos_b1_ms:
  1998. mov [edi],dl
  1999. inc edi
  2000. inc edi
  2001. pop edx
  2002. dec cx
  2003. jnz short sloupec_dopredu_ms
  2004. // Frcime nazpatek -> opacne
  2005. __radek_dozadu_ms:
  2006. pop edi // vyber puvodni zacatek
  2007. cmp nul,0
  2008. jz __radek_konec_ms // levy radek neexistuje -> preskoc ho
  2009. mov eax,sul
  2010. shl eax,2
  2011. add edi,eax
  2012. mov ecx,nul //VV// cx -> pocet opakovani - pocet radku ligthmapy
  2013. mov edx,kul // krok v look-up tabulce (fixed)
  2014. mov ebx,skul // start bod v look-up tabulce (fixed)
  2015. sloupec_dozadu_ms: // prava strana
  2016. add ebx,edx // ebx -> aktualni fixed point bod
  2017. // edx -> fixed point krok
  2018. // cx -> pocet kroku
  2019. // edi -> kam zapisuju
  2020. mov eax,ebx // eax je tmp registr
  2021. shr eax,16
  2022. shl eax,2
  2023. mov esi,zal
  2024. add esi,eax
  2025. push edx
  2026. mov eax,[esi] // nactu intenzitu rgb barev
  2027. mul fvzdal
  2028. shl edx,8
  2029. shr eax,24
  2030. or edx,eax
  2031. mov esi,edx // schovam si fixed-point hodnotu
  2032. mov eax,r
  2033. mul esi
  2034. shr eax,24
  2035. mov dl,[edi]
  2036. add dl,al
  2037. jnc __neni_prenos_r2_msa
  2038. mov dl,0xff
  2039. __neni_prenos_r2_msa:
  2040. push edx
  2041. mov eax,sr
  2042. mul esi
  2043. pop edx
  2044. shr eax,24
  2045. sub dl,al
  2046. ja __neni_prenos_r2_ms
  2047. mov dl,0x0
  2048. __neni_prenos_r2_ms:
  2049. mov [edi],dl
  2050. inc edi
  2051. mov eax,g
  2052. mul esi
  2053. shr eax,24
  2054. mov dl,[edi]
  2055. add dl,al
  2056. jnc __neni_prenos_g2_msa
  2057. mov dl,0xff
  2058. __neni_prenos_g2_msa:
  2059. push edx
  2060. mov eax,sg
  2061. mul esi
  2062. pop edx
  2063. shr eax,24
  2064. sub dl,al
  2065. ja __neni_prenos_g2_ms
  2066. mov dl,0x0
  2067. __neni_prenos_g2_ms:
  2068. mov [edi],dl
  2069. inc edi
  2070. mov eax,s
  2071. mul esi
  2072. shr eax,24
  2073. mov dl,[edi]
  2074. sub dl,al
  2075. jnc __neni_prenos_b2_msa
  2076. mov dl,0xff
  2077. __neni_prenos_b2_msa:
  2078. push edx
  2079. mov eax,sb
  2080. mul esi
  2081. pop edx
  2082. shr eax,24
  2083. sub dl,al
  2084. ja __neni_prenos_b2_ms
  2085. mov dl,0x0
  2086. __neni_prenos_b2_ms:
  2087. mov [edi],dl
  2088. inc edi
  2089. sub edi,7
  2090. pop edx
  2091. dec cx
  2092. jnz short sloupec_dozadu_ms
  2093. __radek_konec_ms:
  2094. ret // vrat se zpet
  2095. __konec_vseho_ms:
  2096. popad
  2097. popfd
  2098. }
  2099. } else if(p_dlight->flag&SDL_SUB) {
  2100. __asm {
  2101. pushfd
  2102. pushad
  2103. // Pocet pocitanych radku
  2104. mov ecx, nvp // pocet radku smerem nahoru
  2105. test ecx, ecx
  2106. jz __prava_strana_m
  2107. ____dalsi_radek_prava_strana_m:
  2108. mov edi, p_data
  2109. mov eax, svp
  2110. mov edx, nu
  2111. add eax, ecx
  2112. dec eax
  2113. mul edx
  2114. shl eax, 2
  2115. add edi, eax // edi -> mam cilovy radek v lightmape
  2116. mov eax, ecx
  2117. mov edx, kvp
  2118. mul edx
  2119. add eax, skvp
  2120. shr eax, 16 // vypoctu radku tabulky
  2121. shl eax, 10 // krat sirka tabulky * 4
  2122. mov ebx, p_looksqrt
  2123. add ebx, eax
  2124. mov zal, ebx // cilovy radk v look-up
  2125. push ecx
  2126. call __spocitej_radek_m
  2127. pop ecx
  2128. dec ecx
  2129. jnz ____dalsi_radek_prava_strana_m
  2130. // udelam levou stranu
  2131. __prava_strana_m:
  2132. mov ecx, nvl // pocet radku smerem nahoru
  2133. test ecx, ecx
  2134. jz __konec_vseho_m
  2135. ____dalsi_radek_leva_strana_m: // prvne udelam levou stranu a potom pravou
  2136. mov edi, p_data
  2137. mov eax, svl
  2138. mov edx, nu
  2139. sub eax, ecx
  2140. inc eax
  2141. mul edx
  2142. shl eax, 2
  2143. add edi, eax // edi -> mam cilovy radek v lightmape
  2144. mov eax, ecx
  2145. mov edx, kvl
  2146. mul edx
  2147. add eax, skvl
  2148. shr eax, 16
  2149. shl eax, 10
  2150. mov ebx, p_looksqrt
  2151. add ebx, eax
  2152. mov zal, ebx
  2153. push ecx
  2154. call __spocitej_radek_m
  2155. pop ecx
  2156. dec ecx
  2157. jnz ____dalsi_radek_leva_strana_m
  2158. jmp __konec_vseho_m
  2159. */
  2160. /* **************************************************
  2161. Vypocty scan_line
  2162. */
  2163. /*
  2164. // edi -> zacatek radku cilove ligthmapy
  2165. // zal -> zacatek radku look-up tabulky
  2166. __spocitej_radek_m:
  2167. // spocitam jeden radek
  2168. push edi
  2169. cmp nup,0
  2170. jz __radek_dozadu_m // pravy radek neexistuje -> preskoc ho
  2171. mov eax,sup
  2172. shl eax,2
  2173. add edi,eax // prictu sup -> zacatek v tabulce
  2174. mov ecx,nup // VV // cx -> pocet opakovani - pocet radku ligthmapy
  2175. mov edx,kup // krok v look-up tabulce (fixed)
  2176. mov ebx,skup // start bod v look-up tabulce (fixed)
  2177. sloupec_dopredu_m: // prava strana
  2178. add ebx,edx // ebx -> aktualni fixed point bod
  2179. // edx -> fixed point krok
  2180. // cx -> pocet kroku
  2181. // edi -> kam zapisuju
  2182. mov eax,ebx // eax je tmp registr
  2183. shr eax,16
  2184. shl eax,2
  2185. mov esi,zal
  2186. add esi,eax
  2187. push edx
  2188. mov eax,[esi] // nactu intenzitu rgb barev
  2189. mul fvzdal // vynasobim fixed-point koeficientem a-vzdal
  2190. shl edx,8
  2191. shr eax,24
  2192. or edx,eax
  2193. mov esi,edx // schovam si fixed-point hodnotu
  2194. mov eax,r
  2195. mul esi
  2196. shr eax,24
  2197. mov dl,[edi]
  2198. sub dl,al
  2199. ja __neni_prenos_r1_m
  2200. mov dl,0x0
  2201. __neni_prenos_r1_m:
  2202. mov [edi],dl
  2203. inc edi
  2204. mov eax,g
  2205. mul esi
  2206. shr eax,24
  2207. mov dl,[edi]
  2208. sub dl,al
  2209. ja __neni_prenos_g1_m
  2210. mov dl,0x0
  2211. __neni_prenos_g1_m:
  2212. mov [edi],dl
  2213. inc edi
  2214. mov eax,b
  2215. mul esi
  2216. shr eax,24
  2217. mov dl,[edi]
  2218. sub dl,al
  2219. ja __neni_prenos_b1_m
  2220. mov dl,0x0
  2221. __neni_prenos_b1_m:
  2222. mov [edi],dl
  2223. inc edi
  2224. inc edi
  2225. pop edx
  2226. dec cx
  2227. jnz short sloupec_dopredu_m
  2228. // Frcime nazpatek -> opacne
  2229. __radek_dozadu_m:
  2230. pop edi // vyber puvodni zacatek
  2231. cmp nul,0
  2232. jz __radek_konec_m // levy radek neexistuje -> preskoc ho
  2233. mov eax,sul
  2234. shl eax,2
  2235. add edi,eax
  2236. mov ecx,nul //VV// cx -> pocet opakovani - pocet radku ligthmapy
  2237. mov edx,kul // krok v look-up tabulce (fixed)
  2238. mov ebx,skul // start bod v look-up tabulce (fixed)
  2239. sloupec_dozadu_m: // prava strana
  2240. add ebx,edx // ebx -> aktualni fixed point bod
  2241. // edx -> fixed point krok
  2242. // cx -> pocet kroku
  2243. // edi -> kam zapisuju
  2244. mov eax,ebx // eax je tmp registr
  2245. shr eax,16
  2246. shl eax,2
  2247. mov esi,zal
  2248. add esi,eax
  2249. push edx
  2250. mov eax,[esi] // nactu intenzitu rgb barev
  2251. mul fvzdal
  2252. shl edx,8
  2253. shr eax,24
  2254. or edx,eax
  2255. mov esi,edx // schovam si fixed-point hodnotu
  2256. mov eax,r
  2257. mul esi
  2258. shr eax,24
  2259. mov dl,[edi]
  2260. sub dl,al
  2261. ja __neni_prenos_r2_m
  2262. mov dl,0x0
  2263. __neni_prenos_r2_m:
  2264. mov [edi],dl
  2265. inc edi
  2266. mov eax,g
  2267. mul esi
  2268. shr eax,24
  2269. mov dl,[edi]
  2270. sub dl,al
  2271. ja __neni_prenos_g2_m
  2272. mov dl,0x0
  2273. __neni_prenos_g2_m:
  2274. mov [edi],dl
  2275. inc edi
  2276. mov eax,b
  2277. mul esi
  2278. shr eax,24
  2279. mov dl,[edi]
  2280. sub dl,al
  2281. ja __neni_prenos_b2_m
  2282. mov dl,0x0
  2283. __neni_prenos_b2_m:
  2284. mov [edi],dl
  2285. inc edi
  2286. sub edi,7
  2287. pop edx
  2288. dec cx
  2289. jnz short sloupec_dozadu_m
  2290. __radek_konec_m:
  2291. ret // vrat se zpet
  2292. __konec_vseho_m:
  2293. popad
  2294. popfd
  2295. }
  2296. } else {
  2297. __asm {
  2298. pushfd
  2299. pushad
  2300. // Pocet pocitanych radku
  2301. mov ecx, nvp // pocet radku smerem nahoru
  2302. test ecx, ecx
  2303. jz __prava_strana
  2304. ____dalsi_radek_prava_strana:
  2305. mov edi, p_data
  2306. mov eax, svp
  2307. mov edx, nu
  2308. add eax, ecx
  2309. dec eax
  2310. mul edx
  2311. shl eax, 2
  2312. add edi, eax // edi -> mam cilovy radek v lightmape
  2313. mov eax, ecx
  2314. mov edx, kvp
  2315. mul edx
  2316. add eax, skvp
  2317. shr eax, 16 // vypoctu radku tabulky
  2318. shl eax, 10 // krat sirka tabulky * 4
  2319. mov ebx, p_looksqrt
  2320. add ebx, eax
  2321. mov zal, ebx // cilovy radk v look-up
  2322. push ecx
  2323. call __spocitej_radek
  2324. pop ecx
  2325. dec ecx
  2326. jnz ____dalsi_radek_prava_strana
  2327. // udelam levou stranu
  2328. __prava_strana:
  2329. mov ecx, nvl // pocet radku smerem nahoru
  2330. test ecx, ecx
  2331. jz __konec_vseho
  2332. ____dalsi_radek_leva_strana: // prvne udelam levou stranu a potom pravou
  2333. mov edi, p_data
  2334. mov eax, svl
  2335. mov edx, nu
  2336. sub eax, ecx
  2337. inc eax
  2338. mul edx
  2339. shl eax, 2
  2340. add edi, eax // edi -> mam cilovy radek v lightmape
  2341. mov eax, ecx
  2342. mov edx, kvl
  2343. mul edx
  2344. add eax, skvl
  2345. shr eax, 16
  2346. shl eax, 10
  2347. mov ebx, p_looksqrt
  2348. add ebx, eax
  2349. mov zal, ebx
  2350. push ecx
  2351. call __spocitej_radek
  2352. pop ecx
  2353. dec ecx
  2354. jnz ____dalsi_radek_leva_strana
  2355. jmp __konec_vseho
  2356. */
  2357. /* **************************************************
  2358. Vypocty scan_line
  2359. */
  2360. /*
  2361. // edi -> zacatek radku cilove ligthmapy
  2362. // zal -> zacatek radku look-up tabulky
  2363. __spocitej_radek:
  2364. // spocitam jeden radek
  2365. push edi
  2366. cmp nup,0
  2367. jz __radek_dozadu // pravy radek neexistuje -> preskoc ho
  2368. mov eax,sup
  2369. shl eax,2
  2370. add edi,eax // prictu sup -> zacatek v tabulce
  2371. mov ecx,nup // VV // cx -> pocet opakovani - pocet radku ligthmapy
  2372. mov edx,kup // krok v look-up tabulce (fixed)
  2373. mov ebx,skup // start bod v look-up tabulce (fixed)
  2374. sloupec_dopredu: // prava strana
  2375. add ebx,edx // ebx -> aktualni fixed point bod
  2376. // edx -> fixed point krok
  2377. // cx -> pocet kroku
  2378. // edi -> kam zapisuju
  2379. mov eax,ebx // eax je tmp registr
  2380. shr eax,16
  2381. shl eax,2
  2382. mov esi,zal
  2383. add esi,eax
  2384. push edx
  2385. mov eax,[esi] // nactu intenzitu rgb barev
  2386. mul fvzdal // vynasobim fixed-point koeficientem a-vzdal
  2387. shl edx,8
  2388. shr eax,24
  2389. or edx,eax
  2390. mov esi,edx // schovam si fixed-point hodnotu
  2391. mov eax,r
  2392. mul esi
  2393. shr eax,24
  2394. mov dl,[edi]
  2395. add dl,al
  2396. jnc __neni_prenos_r1
  2397. mov dl,0xff
  2398. __neni_prenos_r1:
  2399. mov [edi],dl
  2400. inc edi
  2401. mov eax,g
  2402. mul esi
  2403. shr eax,24
  2404. mov dl,[edi]
  2405. add dl,al
  2406. jnc __neni_prenos_g1
  2407. mov dl,0xff
  2408. __neni_prenos_g1:
  2409. mov [edi],dl
  2410. inc edi
  2411. mov eax,b
  2412. mul esi
  2413. shr eax,24
  2414. mov dl,[edi]
  2415. add dl,al
  2416. jnc __neni_prenos_b1
  2417. mov dl,0xff
  2418. __neni_prenos_b1:
  2419. mov [edi],dl
  2420. inc edi
  2421. inc edi
  2422. pop edx
  2423. dec cx
  2424. jnz short sloupec_dopredu
  2425. // Frcime nazpatek -> opacne
  2426. __radek_dozadu:
  2427. pop edi // vyber puvodni zacatek
  2428. cmp nul,0
  2429. jz __radek_konec // levy radek neexistuje -> preskoc ho
  2430. mov eax,sul
  2431. shl eax,2
  2432. add edi,eax
  2433. mov ecx,nul //VV// cx -> pocet opakovani - pocet radku ligthmapy
  2434. mov edx,kul // krok v look-up tabulce (fixed)
  2435. mov ebx,skul // start bod v look-up tabulce (fixed)
  2436. sloupec_dozadu: // prava strana
  2437. add ebx,edx // ebx -> aktualni fixed point bod
  2438. // edx -> fixed point krok
  2439. // cx -> pocet kroku
  2440. // edi -> kam zapisuju
  2441. mov eax,ebx // eax je tmp registr
  2442. shr eax,16
  2443. shl eax,2
  2444. mov esi,zal
  2445. add esi,eax
  2446. push edx
  2447. mov eax,[esi] // nactu intenzitu rgb barev
  2448. mul fvzdal
  2449. shl edx,8
  2450. shr eax,24
  2451. or edx,eax
  2452. mov esi,edx // schovam si fixed-point hodnotu
  2453. mov eax,r
  2454. mul esi
  2455. shr eax,24
  2456. mov dl,[edi]
  2457. add dl,al
  2458. jnc __neni_prenos_r2
  2459. mov dl,0xff
  2460. __neni_prenos_r2:
  2461. mov [edi],dl
  2462. inc edi
  2463. mov eax,g
  2464. mul esi
  2465. shr eax,24
  2466. mov dl,[edi]
  2467. add dl,al
  2468. jnc __neni_prenos_g2
  2469. mov dl,0xff
  2470. __neni_prenos_g2:
  2471. mov [edi],dl
  2472. inc edi
  2473. mov eax,b
  2474. mul esi
  2475. shr eax,24
  2476. mov dl,[edi]
  2477. add dl,al
  2478. jnc __neni_prenos_b2
  2479. mov dl,0xff
  2480. __neni_prenos_b2:
  2481. mov [edi],dl
  2482. inc edi
  2483. sub edi,7
  2484. pop edx
  2485. dec cx
  2486. jnz short sloupec_dozadu
  2487. __radek_konec:
  2488. ret // vrat se zpet
  2489. __konec_vseho:
  2490. popad
  2491. popfd
  2492. }
  2493. }
  2494. */
  2495. }
  2496. p_lf->upload = TRUE;
  2497. return (TRUE);
  2498. }
  2499. // Pripocita vsechna svetla v seznamu a provede update lightmapy
  2500. int sdl_poly_pripocitej_svetla(G_KONFIG * p_ber, EDIT_MESH_POLY * p_poly,
  2501. int full_light)
  2502. {
  2503. int f, ret;
  2504. if (!p_ber->dl_recalc && !p_ber->dl_new)
  2505. return (FALSE);
  2506. if (!p_ber->dl_new && !dl_poly_svetlo_update(p_poly))
  2507. return (FALSE);
  2508. // pripocitej k tomuto poly ke kazde face vsechny lightmapy
  2509. for (f = 0, ret = 0; f < p_poly->facenum / 3; f++) {
  2510. ret +=
  2511. sdl_poly_pripocitej_svetla_face(p_ber, p_poly, p_poly->p_ind + f,
  2512. full_light);
  2513. }
  2514. return (ret);
  2515. }
  2516. // uploaduje lightmapu do akceleratoru
  2517. int sdl_poly_updatuj_lightmap(G_KONFIG * p_ber, EDIT_MESH_POLY * p_poly)
  2518. {
  2519. LIGHTMAP_FACE *p_lf = p_poly->p_ind;
  2520. int l, i, ln, up, last;
  2521. int uploaded = 0;
  2522. last = 0;
  2523. for (l = 0; l < p_poly->lightnum; l++) {
  2524. ln = last + p_poly->p_lightnum[l] / 3;
  2525. up = 0;
  2526. for (i = last; i < ln; i++)
  2527. up += p_lf[i].upload;
  2528. /*
  2529. if(up) {
  2530. glBindTexture(p_poly->p_light[l]->typ, p_poly->p_light[l]->text);
  2531. for(i = last; i < ln; i++) {
  2532. if(p_lf[i].upload) {
  2533. glTexSubImage2D(p_poly->p_light[l]->typ, 0, p_lf[i].u-1, p_lf[i].v-1, p_lf[i].nu+2,
  2534. p_lf[i].nv+2, GL_RGBA, GL_UNSIGNED_BYTE, p_lf[i].p_bmp->data);
  2535. uploaded += p_lf[i].p_bmp->x*p_lf[i].p_bmp->y*4;
  2536. }
  2537. }
  2538. }
  2539. */
  2540. last += p_poly->p_lightnum[l] / 3;
  2541. }
  2542. return (uploaded);
  2543. }
  2544. void sdl_save_lightmap(EDIT_MESH_POLY * p_poly, int p)
  2545. { /*
  2546. char pom[200];
  2547. int l;
  2548. chdir("e:\\");
  2549. for(l = 0; l < p_poly->lightnum; l++) {
  2550. sprintf(pom,"poly%dlight%d.bmp",p,l);
  2551. bmp_uloz(pom,p_poly->p_light[l]->p_bmp);
  2552. }
  2553. for(l = 0; l < p_poly->facenum/3; l++) {
  2554. sprintf(pom,"poly%dfacelight%d.bmp",p,l);
  2555. bmp_uloz(pom,p_poly->p_ind[l].p_bmp);
  2556. }
  2557. */
  2558. }
  2559. inline void sdl_updatuj_poly(G_KONFIG * p_ber, EDIT_MESH_POLY * p_poly,
  2560. int full_light)
  2561. {
  2562. if (dl_poly_pridej_svetla(p_ber, p_poly)) {
  2563. if (sdl_poly_pripocitej_svetla(p_ber, p_poly, full_light)) {
  2564. sdl_poly_updatuj_lightmap(p_ber, p_poly);
  2565. }
  2566. }
  2567. if (edl_poly_pridej_svetla(p_ber, p_poly))
  2568. edl_poly_pripocitej_svetla(p_ber, p_poly);
  2569. }
  2570. inline void sdl_updatuj_seznam_poly(G_KONFIG * p_ber, int all)
  2571. {
  2572. int flag = (p_ber->conf_dyn_light_prvky) ? KONT_PRVEK : FALSE;
  2573. int full = p_ber->conf_full_light;
  2574. EDIT_MESH_POLY *p_poly;
  2575. int p;
  2576. if (all) {
  2577. for (p = 0; p < p_ber->polynum; p++) {
  2578. p_poly = p_ber->p_poly + p;
  2579. sdl_updatuj_poly(p_ber, p_poly,
  2580. full ? p_poly->kflag & KONT_PRVEK : FALSE);
  2581. }
  2582. }
  2583. else {
  2584. ber_poly_render_list_reset(p_ber);
  2585. while (p_poly = ber_poly_render_list_next_flag(p_ber, flag, FALSE)) {
  2586. sdl_updatuj_poly(p_ber, p_poly,
  2587. full ? p_poly->kflag & KONT_PRVEK : FALSE);
  2588. }
  2589. }
  2590. }
  2591. void dl_transformuj_svetla(G_KONFIG * p_ber)
  2592. {
  2593. GAME_MESH_DATA *p_data;
  2594. GAME_MESH_OLD *p_mesh;
  2595. DYN_LIGHT *p_light;
  2596. EXTRA_DYN_LIGHT *p_edlight;
  2597. int kamera_zmena = p_ber->kamera.zmena || p_ber->kamera.zmena_last;
  2598. int i;
  2599. /*
  2600. for(i = 0; i < p_ber->dl_lightnum; i++) {
  2601. p_light = p_ber->p_dlight+i;
  2602. if(p_light->akt && p_light->flag&SDL_MESH) {
  2603. p_data = p_light->p_mesh_data;
  2604. if(p_data->kflag&KONT_POHYB) {
  2605. p_mesh = p_data->p_mesh;
  2606. transformuj_bod_matici_bod(&p_light->np,&p_mesh->m,&p_light->tp);
  2607. }
  2608. }
  2609. }
  2610. for(i = 0; i < p_ber->edl_lightnum; i++) {
  2611. p_edlight = p_ber->p_edlight+i;
  2612. if(p_edlight->akt) {
  2613. if(p_edlight->flag&EDL_MESH) {
  2614. p_data = p_edlight->p_mesh_data;
  2615. if(p_data->kflag&KONT_POHYB) {
  2616. p_mesh = p_data->p_mesh;
  2617. transformuj_bod_matici_bod(&p_edlight->np,&p_mesh->m,&p_edlight->tp);
  2618. }
  2619. } else if(p_edlight->flag&EDL_CAMERA_POINT && kamera_zmena) {
  2620. p_edlight->tp.x = p_ber->p_invcam->_41;
  2621. p_edlight->tp.y = p_ber->p_invcam->_42;
  2622. p_edlight->tp.z = p_ber->p_invcam->_43;
  2623. p_ber->edl_recalc = TRUE;
  2624. p_edlight->flag |= EDL_ZMENA_GLOBAL;
  2625. }
  2626. if(p_edlight->flag&(EDL_CAMERA_POINT|EDL_ZMENA_CAMERA) && kamera_zmena) {
  2627. p_ber->edl_recalc = TRUE;
  2628. p_edlight->flag |= EDL_ZMENA_GLOBAL;
  2629. }
  2630. }
  2631. }
  2632. */
  2633. }
  2634. void dl_updatuj(G_KONFIG * p_ber)
  2635. {
  2636. int all = p_ber->conf_dyn_light_update_all;
  2637. if (p_ber->dl_on || all) {
  2638. if (all)
  2639. p_ber->conf_dyn_light_update_all = FALSE;
  2640. dl_transformuj_svetla(p_ber);
  2641. if (p_ber->conf_dyn_light_mesh || p_ber->conf_dyn_light_beruska)
  2642. dl_updatuj_seznam_meshu(p_ber, all);
  2643. if (p_ber->conf_dyn_light_poly) {
  2644. sdl_updatuj_seznam_poly(p_ber, all);
  2645. p_ber->conf_full_light_last = FALSE;
  2646. }
  2647. dl_reset_svetel(p_ber);
  2648. p_ber->dl_recalc = FALSE;
  2649. p_ber->dl_new = FALSE;
  2650. p_ber->edl_recalc = FALSE;
  2651. p_ber->edl_new = FALSE;
  2652. }
  2653. }
  2654. /*
  2655. Udelat update-list -> ktere meshe a svetla se maji prepocitat
  2656. - mesh -> pri posunu meshe (dyn+staticke)
  2657. - svetlo -> vse v okoli
  2658. */
  2659. /*
  2660. Svetlo privazat k:
  2661. - targetu kamery
  2662. - kamere
  2663. - meshi
  2664. kameru privazat k:
  2665. - meshi
  2666. - svetlu
  2667. */
  2668. ExtraLightHandle edl_svetlo_vyrob(dword flag, int meshnum)
  2669. {
  2670. EXTRA_DYN_LIGHT *p_light;
  2671. int l;
  2672. if (flag & EDL_MESH_LIGHT && flag & EDL_SCENA) {
  2673. return (K_CHYBA);
  2674. }
  2675. for (l = 0; l < p_ber->edl_lightnum; l++) {
  2676. if (!p_ber->p_edlight[l].akt) {
  2677. p_light = p_ber->p_edlight + l;
  2678. goto nasel;
  2679. }
  2680. }
  2681. if (l == MAX_FLARE_SVETEL)
  2682. return (K_CHYBA);
  2683. p_light = p_ber->p_edlight + l;
  2684. p_ber->edl_lightnum++;
  2685. nasel:
  2686. p_light->akt = TRUE;
  2687. p_light->flag = flag | EDL_ZMENA_GLOBAL;
  2688. /*
  2689. if(flag|EDL_MESH_LIGHT && meshnum) {
  2690. p_light->p_lmesh = mmalloc(sizeof(p_light->p_lmesh[0])*meshnum);
  2691. p_light->lmeshnum = meshnum;
  2692. p_light->lmeshakt = 0;
  2693. }
  2694. */
  2695. p_ber->kamera.zmena = TRUE;
  2696. p_ber->edl_new = TRUE;
  2697. return (l);
  2698. }
  2699. ExtraLightHandle edl_svetlo_zrus_meshe(ExtraLightHandle lh)
  2700. {
  2701. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2702. GAME_MESH_DATA *p_data;
  2703. GAME_MESH_OLD *p_mesh;
  2704. int i;
  2705. /*
  2706. if(!p_light->akt)
  2707. return(FALSE);
  2708. else {
  2709. p_ber->edl_new = TRUE;
  2710. // Zruseni meshu
  2711. if(p_light->flag|EDL_MESH_LIGHT && p_light->lmeshnum) {
  2712. for(i = 0; i < p_light->lmeshakt; i++) {
  2713. p_mesh = p_ber->p_mesh[p_light->p_lmesh[i]];
  2714. if(p_mesh) {
  2715. p_data = p_mesh->p_data;
  2716. p_data->kflag &= ~KONT_DRAW_LIGHT;
  2717. p_data->kflag |= KONT_POHYB;
  2718. p_data->top_edlight = K_CHYBA;
  2719. }
  2720. }
  2721. null_free(&p_light->p_lmesh);
  2722. p_light->lmeshnum = p_light->lmeshakt = 0;
  2723. }
  2724. return(TRUE);
  2725. }
  2726. */
  2727. }
  2728. int edl_svetlo_zrus(ExtraLightHandle lh)
  2729. {
  2730. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2731. if (!p_light->akt)
  2732. return (FALSE);
  2733. else {
  2734. edl_svetlo_zrus_meshe(lh);
  2735. // Zruseni svetla
  2736. p_light->akt = FALSE;
  2737. if (p_ber->edl_lightnum == lh + 1)
  2738. p_ber->edl_lightnum--;
  2739. p_ber->edl_new = TRUE;
  2740. // Zruseni animace
  2741. if (p_light->an.endtime)
  2742. sdla_animaci_zrus(&p_light->an);
  2743. // Zajisti prepocitani svetel
  2744. p_ber->dl_new = TRUE;
  2745. return (TRUE);
  2746. }
  2747. }
  2748. ExtraLightHandle edl_svetlo_pridej_mesh(ExtraLightHandle lh, MeshHandle mh)
  2749. {
  2750. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2751. GAME_MESH_DATA *p_data;
  2752. int m;
  2753. if (lh < p_ber->edl_lightnum &&
  2754. p_light->akt &&
  2755. p_light->flag | EDL_MESH_LIGHT &&
  2756. p_light->lmeshnum && p_light->lmeshakt < p_light->lmeshnum) {
  2757. assert(p_ber->p_prv_lev[mh]);
  2758. p_data = p_ber->p_prv_lev[mh]->p_mesh_data;
  2759. m = p_ber->p_prv_lev[mh]->mesh;
  2760. if (p_data->kflag & KONT_DRAW_LIGHT) {
  2761. return (K_CHYBA);
  2762. }
  2763. else {
  2764. p_light->p_lmesh[p_light->lmeshakt++] = m;
  2765. p_data->top_edlight = lh;
  2766. return (lh);
  2767. }
  2768. }
  2769. else {
  2770. return (K_CHYBA);
  2771. }
  2772. }
  2773. ExtraLightHandle edl_svetlo_set_pos(ExtraLightHandle lh, BOD * p_bod,
  2774. BOD * p_dir)
  2775. {
  2776. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2777. if (lh < p_ber->edl_lightnum && p_light->akt) {
  2778. p_light->tp = p_light->np = *p_bod;
  2779. p_light->dir = *p_dir;
  2780. p_light->flag |= EDL_ZMENA_GLOBAL;
  2781. p_ber->edl_recalc = TRUE;
  2782. return (lh);
  2783. }
  2784. else
  2785. return (K_CHYBA);
  2786. }
  2787. ExtraLightHandle edl_svetlo_set_pos_ext(ExtraLightHandle lh,
  2788. float px, float py, float pz, float dx, float dy, float dz)
  2789. {
  2790. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2791. if (lh < p_ber->edl_lightnum && p_light->akt) {
  2792. p_light->np.x = px;
  2793. p_light->np.y = py;
  2794. p_light->np.z = pz;
  2795. p_light->dir.x = dx;
  2796. p_light->dir.y = dy;
  2797. p_light->dir.z = dz;
  2798. p_light->tp = p_light->np;
  2799. p_light->flag |= EDL_ZMENA_GLOBAL;
  2800. p_ber->edl_recalc = TRUE;
  2801. return (lh);
  2802. }
  2803. else
  2804. return (K_CHYBA);
  2805. }
  2806. ExtraLightHandle edl_svetlo_set_par(ExtraLightHandle lh, float utlum,
  2807. float dosah, float theta, float gourand)
  2808. {
  2809. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2810. if (lh < p_ber->edl_lightnum && p_light->akt) {
  2811. p_light->dosah = dosah;
  2812. p_light->utlum = utlum;
  2813. p_light->theta = theta;
  2814. p_light->gourand = gourand;
  2815. p_light->flag |= EDL_ZMENA_GLOBAL;
  2816. p_ber->edl_recalc = TRUE;
  2817. return (lh);
  2818. }
  2819. else
  2820. return (K_CHYBA);
  2821. }
  2822. ExtraLightHandle edl_svetlo_set_diff(ExtraLightHandle lh, float da)
  2823. {
  2824. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2825. if (lh < p_ber->edl_lightnum && p_light->akt) {
  2826. p_light->da = da;
  2827. p_light->flag |= EDL_ZMENA_LOKAL;
  2828. p_ber->edl_recalc = TRUE;
  2829. return (lh);
  2830. }
  2831. else
  2832. return (K_CHYBA);
  2833. }
  2834. ExtraLightHandle edl_svetlo_set_spec(ExtraLightHandle lh, float sr, float sg,
  2835. float sb)
  2836. {
  2837. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2838. if (lh < p_ber->edl_lightnum && p_light->akt) {
  2839. p_light->sr = sr;
  2840. p_light->sg = sg;
  2841. p_light->sb = sb;
  2842. p_light->flag |= EDL_ZMENA_LOKAL;
  2843. p_ber->edl_recalc = TRUE;
  2844. return (lh);
  2845. }
  2846. else
  2847. return (K_CHYBA);
  2848. }
  2849. ExtraLightHandle edl_svetlo_vyrob_zemni_mlha(dword barva, float v_start,
  2850. float v_stop, float h_start, float h_stop)
  2851. {
  2852. EXTRA_DYN_LIGHT *p_light;
  2853. int l;
  2854. for (l = 0; l < p_ber->edl_lightnum; l++) {
  2855. if (!p_ber->p_edlight[l].akt) {
  2856. p_light = p_ber->p_edlight + l;
  2857. goto nasel;
  2858. }
  2859. }
  2860. if (l == MAX_FLARE_SVETEL)
  2861. return (K_CHYBA);
  2862. p_light = p_ber->p_edlight + l;
  2863. p_ber->edl_lightnum++;
  2864. nasel:
  2865. p_light->akt = TRUE;
  2866. p_light->flag =
  2867. EDL_ZEMNI_MLHA | EDL_SPEC_ADD | EDL_SCENA | EDL_ZMENA_GLOBAL |
  2868. EDL_ZMENA_LOKAL | EDL_ZMENA_CAMERA;
  2869. rgb_float(barva, &p_light->sr);
  2870. p_light->v_start = v_start;
  2871. p_light->v_stop = v_stop;
  2872. p_light->h_start = h_start;
  2873. p_light->h_stop = h_stop;
  2874. p_ber->kamera.zmena = TRUE;
  2875. p_ber->edl_new = TRUE;
  2876. return (l);
  2877. }
  2878. /*
  2879. Privaze svetlo k meshum
  2880. */
  2881. ExtraLightHandle edl_svetlo_uzavri_meshe(ExtraLightHandle lh)
  2882. {
  2883. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2884. GAME_MESH_OLD *p_mesh;
  2885. GAME_MESH_DATA *p_data;
  2886. int i, flags;
  2887. /*
  2888. if(lh < p_ber->edl_lightnum && p_light->akt && p_light->flag|EDL_MESH_LIGHT) {
  2889. flags = p_light->flag;
  2890. for(i = 0; i < p_light->lmeshakt; i++) {
  2891. p_mesh = p_ber->p_mesh[p_light->p_lmesh[i]];
  2892. p_data = p_mesh->p_data;
  2893. assert(p_mesh);
  2894. if(flags&(EDL_SPEC_MOD|EDL_SPEC_SET|EDL_SPEC_ADD|EDL_SPEC_SUB)) {
  2895. p_data->kflag |= KONT_DRAW_SPEC;
  2896. if(!(p_data->m2flag&MAT2_SPECULAR)) {
  2897. p_mesh->p_vertex_spec = mmalloc(sizeof(p_mesh->p_vertex_spec[0])*p_mesh->vertexnum);
  2898. }
  2899. }
  2900. if(flags&EDL_PRUHL_LIGHT) {
  2901. p_data->kflag |= KONT_DRAW_PRUHL;
  2902. }
  2903. p_data->kflag |= KONT_DRAW_LIGHT;
  2904. }
  2905. return(lh);
  2906. } else {
  2907. return(K_CHYBA);
  2908. }
  2909. */
  2910. }
  2911. /*
  2912. Animace extra-svetel
  2913. */
  2914. ExtraLightHandle edl_anim_vyrob(ExtraLightHandle lh, int framenum,
  2915. int pos_keys, int trg_keys, int alfa_keys, int spec_keys, int dosah_keys)
  2916. {
  2917. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2918. DYN_LIGHT_ANIM *p_an;
  2919. if (lh < p_ber->edl_lightnum && p_light->akt) {
  2920. p_an = &p_light->an;
  2921. if (p_an->endtime)
  2922. sdla_animaci_zrus(p_an);
  2923. sdla_animaci_vyrob(p_an, framenum, pos_keys, trg_keys,
  2924. 0, spec_keys, dosah_keys, alfa_keys);
  2925. return (lh);
  2926. }
  2927. else
  2928. return (K_CHYBA);
  2929. }
  2930. ExtraLightHandle edl_anim_zrus(ExtraLightHandle lh)
  2931. {
  2932. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2933. if (lh < p_ber->edl_lightnum && p_light->akt && p_light->an.endtime) {
  2934. sdla_animaci_zrus(&p_light->an);
  2935. return (lh);
  2936. }
  2937. else
  2938. return (K_CHYBA);
  2939. }
  2940. /*
  2941. In-Klice extra-dyn-light
  2942. */
  2943. ExtraLightHandle edl_anim_vloz_klic_posun(ExtraLightHandle lh,
  2944. int klic, float x, float y, float z, int frame)
  2945. {
  2946. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2947. DYN_LIGHT_ANIM *p_an = &p_light->an;
  2948. if (lh < p_ber->edl_lightnum && p_light->akt &&
  2949. p_an->endtime && klic < p_an->pos_keys) {
  2950. p_an->p_pos[klic].x = x;
  2951. p_an->p_pos[klic].y = y;
  2952. p_an->p_pos[klic].z = z;
  2953. p_an->p_pkeys[klic].time = frame * SIM_KONSTI;
  2954. return (lh);
  2955. }
  2956. else
  2957. return (K_CHYBA);
  2958. }
  2959. ExtraLightHandle edl_anim_vloz_klic_posun_bod(ExtraLightHandle lh, int klic,
  2960. BOD * p_p, int frame)
  2961. {
  2962. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2963. DYN_LIGHT_ANIM *p_an = &p_light->an;
  2964. if (lh < p_ber->edl_lightnum && p_light->akt && p_an->endtime &&
  2965. klic < p_an->pos_keys) {
  2966. p_an->p_pos[klic] = *p_p;
  2967. p_an->p_pkeys[klic].time = frame * SIM_KONSTI;
  2968. return (lh);
  2969. }
  2970. else
  2971. return (K_CHYBA);
  2972. }
  2973. ExtraLightHandle edl_anim_vloz_klic_target(ExtraLightHandle lh,
  2974. int klic, float x, float y, float z, int frame)
  2975. {
  2976. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2977. DYN_LIGHT_ANIM *p_an = &p_light->an;
  2978. if (lh < p_ber->edl_lightnum && p_light->akt &&
  2979. p_an->endtime && klic < p_an->trg_keys) {
  2980. p_an->p_trg[klic].x = x;
  2981. p_an->p_trg[klic].y = y;
  2982. p_an->p_trg[klic].z = z;
  2983. p_an->p_tkeys[klic].time = frame * SIM_KONSTI;
  2984. return (lh);
  2985. }
  2986. else
  2987. return (K_CHYBA);
  2988. }
  2989. ExtraLightHandle edl_anim_vloz_klic_target_bod(ExtraLightHandle lh, int klic,
  2990. BOD * p_p, int frame)
  2991. {
  2992. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  2993. DYN_LIGHT_ANIM *p_an = &p_light->an;
  2994. if (lh < p_ber->edl_lightnum && p_light->akt && p_an->endtime &&
  2995. klic < p_an->trg_keys) {
  2996. p_an->p_trg[klic] = *p_p;
  2997. p_an->p_tkeys[klic].time = frame * SIM_KONSTI;
  2998. return (lh);
  2999. }
  3000. else
  3001. return (K_CHYBA);
  3002. }
  3003. ExtraLightHandle edl_anim_vloz_klic_diff(ExtraLightHandle lh, int klic,
  3004. float a, int frame)
  3005. {
  3006. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  3007. DYN_LIGHT_ANIM *p_an = &p_light->an;
  3008. if (lh < p_ber->edl_lightnum && p_light->akt && p_an->endtime
  3009. && klic < p_an->alfa_keys) {
  3010. p_an->p_alfa[klic] = a;
  3011. p_an->p_akeys[klic].time = frame * SIM_KONSTI;
  3012. return (lh);
  3013. }
  3014. else
  3015. return (K_CHYBA);
  3016. }
  3017. ExtraLightHandle edl_anim_vloz_klic_spec(ExtraLightHandle lh, int klic,
  3018. float r, float g, float b, int frame)
  3019. {
  3020. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  3021. DYN_LIGHT_ANIM *p_an = &p_light->an;
  3022. if (lh < p_ber->edl_lightnum && p_light->akt && p_an->endtime &&
  3023. klic < p_an->spec_keys) {
  3024. p_an->p_spec[klic].r = r;
  3025. p_an->p_spec[klic].g = g;
  3026. p_an->p_spec[klic].b = b;
  3027. p_an->p_spkeys[klic].time = frame * SIM_KONSTI;
  3028. return (lh);
  3029. }
  3030. else
  3031. return (K_CHYBA);
  3032. }
  3033. LightHandle edl_anim_vloz_klic_vzdal(LightHandle lh, int klic, float dosah,
  3034. float theta, float utlum, int frame)
  3035. {
  3036. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  3037. DYN_LIGHT_ANIM *p_an = &p_light->an;
  3038. if (lh < p_ber->edl_lightnum && p_light->akt && p_an->endtime &&
  3039. klic < p_an->dos_keys) {
  3040. p_an->p_dosah[klic].x = dosah;
  3041. p_an->p_dosah[klic].y = theta;
  3042. p_an->p_dosah[klic].z = utlum;
  3043. p_an->p_dskeys[klic].time = frame * SIM_KONSTI;
  3044. return (lh);
  3045. }
  3046. else
  3047. return (K_CHYBA);
  3048. }
  3049. /* ***************************************************
  3050. Run-time animace extra-dynamickych svetel
  3051. ***************************************************
  3052. */
  3053. RunHandle edl_anim_start(ExtraLightHandle lh, int *p_flag, int flag,
  3054. int start, int stop)
  3055. {
  3056. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + lh;
  3057. DYN_LIGHT_ANIM *p_an = &p_light->an;
  3058. if (lh < p_ber->edl_lightnum && p_light->akt && p_an->endtime) {
  3059. calc_time_end(p_an->endtime, p_ber->TimeEndLastFrame, start, stop,
  3060. &p_light->start,
  3061. &p_light->stop,
  3062. &p_light->time_start, &p_light->time_stop, &p_light->time_delka);
  3063. p_light->p_flag = p_flag;
  3064. p_light->an_flag = flag;
  3065. p_light->flag |= EDL_ANIMACE;
  3066. return (lh);
  3067. }
  3068. else
  3069. return (K_CHYBA);
  3070. }
  3071. int edl_anim_stop(RunHandle rh)
  3072. {
  3073. EXTRA_DYN_LIGHT *p_light = p_ber->p_edlight + rh;
  3074. DYN_LIGHT_ANIM *p_an = &p_light->an;
  3075. if (rh < p_ber->edl_lightnum && p_light->akt &&
  3076. p_an->endtime && p_light->flag & EDL_ANIMACE) {
  3077. p_light->flag &= ~EDL_ANIMACE;
  3078. return (rh);
  3079. }
  3080. else
  3081. return (K_CHYBA);
  3082. }
  3083. /* ****************************************************************
  3084. Extra-svetla - keyframova animace svetel
  3085. ****************************************************************
  3086. */
  3087. inline void edl_light_to_light(EXTRA_DYN_LIGHT * p_light,
  3088. DYN_LIGHT_ANIM * p_track, int time)
  3089. {
  3090. int loop = p_light->an_flag & GK_LOOP;
  3091. if (p_track->pos_keys) {
  3092. key_track_interpolace_bod(&p_light->np, p_track->p_pos, p_track->p_pkeys,
  3093. time, p_track->endtime, p_track->pos_keys, loop);
  3094. p_light->tp = p_light->np;
  3095. }
  3096. if (p_track->trg_keys) {
  3097. key_track_interpolace_bod(&p_light->dir, p_track->p_trg, p_track->p_tkeys,
  3098. time, p_track->endtime, p_track->trg_keys, loop);
  3099. }
  3100. if (p_track->dos_keys) {
  3101. key_track_interpolace_bod_linear((BOD *) & p_light->dosah,
  3102. p_track->p_dosah, p_track->p_dskeys, time, p_track->endtime,
  3103. p_track->dos_keys, loop);
  3104. }
  3105. if (p_track->alfa_keys) {
  3106. key_track_interpolace_float_linear(&p_light->da, p_track->p_alfa,
  3107. p_track->p_akeys, time, p_track->endtime, p_track->alfa_keys, loop);
  3108. }
  3109. if (p_track->spec_keys) {
  3110. key_track_interpolace_bod_linear((BOD *) & p_light->sr,
  3111. (BOD *) p_track->p_spec, p_track->p_spkeys, time, p_track->endtime,
  3112. p_track->spec_keys, loop);
  3113. }
  3114. }
  3115. void edla_updatuj(G_KONFIG * p_ber)
  3116. {
  3117. dword next_time = p_ber->TimeEndLastFrame;
  3118. EXTRA_DYN_LIGHT *p_light;
  3119. DYN_LIGHT_ANIM *p_an;
  3120. int i;
  3121. int konec;
  3122. /*
  3123. Animace se updatuji kazdy frame
  3124. */
  3125. for (i = 0; i < p_ber->edl_lightnum; i++) {
  3126. p_light = p_ber->p_edlight + i;
  3127. p_an = &p_light->an;
  3128. if (p_light->flag & EDL_ANIMACE) {
  3129. /* Test na konec animace
  3130. */
  3131. if ((konec = (next_time > p_light->time_stop))) {
  3132. if (p_light->an_flag & GK_LOOP) {
  3133. calc_time_loop(next_time, p_light->start,
  3134. &p_light->time_start,
  3135. &p_light->time_stop, &p_light->time_delka, &p_light->time);
  3136. if (p_light->p_flag)
  3137. *(p_light->p_flag) = 0;
  3138. konec = 0;
  3139. }
  3140. else {
  3141. p_light->time = p_light->time_delka;
  3142. p_light->flag &= ~EDL_ANIMACE;
  3143. if (p_light->p_flag)
  3144. *(p_light->p_flag) = ANIM_FLAG_KONEC;
  3145. }
  3146. }
  3147. else {
  3148. p_light->time = calc_time_akt(next_time, p_light->time_start);
  3149. if (p_light->p_flag)
  3150. *(p_light->p_flag) =
  3151. ftoi((p_light->time / (float) p_light->time_delka) * 100.0f);
  3152. }
  3153. /* Vypocitej animaci svetla
  3154. */
  3155. edl_light_to_light(p_light, p_an, p_light->time);
  3156. p_light->flag |= EDL_ZMENA_GLOBAL;
  3157. p_ber->edl_recalc = TRUE;
  3158. }
  3159. }
  3160. }
  3161. /*
  3162. Run-time rutiny pro extra-dynamicke svetla
  3163. */
  3164. /*
  3165. Prepocitam seznamy svetel -> pouze pri update
  3166. */
  3167. int edl_mesh_pridej_svetla(G_KONFIG * p_ber, GAME_MESH_OLD * p_mesh)
  3168. { /*
  3169. GAME_MESH_DATA *p_data = p_mesh->p_data;
  3170. EXTRA_DYN_LIGHT *p_light;
  3171. EXTRA_DYN_LIGHT *p_light_dyn[MAX_FLARE_SVETEL*2];
  3172. dword flags = 0;
  3173. float vzdal;
  3174. int flag;
  3175. int lightnum = 0;
  3176. int i;
  3177. int kflag = p_data->kflag;
  3178. if(kflag&(KONT_POHYB|KONT_VIDITELNY_ZMENA) || p_ber->edl_recalc || p_ber->edl_new) {
  3179. // Zaradim dynamicke svetla
  3180. lightnum = 0;
  3181. for(i = 0; i < p_ber->edl_lightnum; i++) {
  3182. p_light = p_ber->p_edlight+i;
  3183. if(p_light->akt) {
  3184. flag = p_light->flag;
  3185. if(!(flag&EDL_SCENA)) {
  3186. if(flag&EDL_MESH_LIGHT) {
  3187. if(kflag&KONT_DRAW_LIGHT && p_data->top_edlight == i) {
  3188. p_light_dyn[lightnum++] = p_light;
  3189. flags |= p_light->flag;
  3190. }
  3191. } else if(flag&EDL_DOSAH) {
  3192. if(flag&EDL_BODOVE) {
  3193. if(p_light->dosah > obb_vzdal_bod(&p_mesh->obb_world,&p_light->tp)) {
  3194. p_light_dyn[lightnum++] = p_light;
  3195. flags |= p_light->flag;
  3196. }
  3197. } else if(flag&(EDL_PLOSNE_X|EDL_PLOSNE_Y|EDL_PLOSNE_Z)) {
  3198. if(flag&EDL_PLOSNE_X) {
  3199. vzdal = obb_vzdal_rovina_x(&p_mesh->obb_world,p_light->tp.x);
  3200. } else if(flag&EDL_PLOSNE_Y) {
  3201. vzdal = obb_vzdal_rovina_y(&p_mesh->obb_world,p_light->tp.y);
  3202. } else {
  3203. vzdal = obb_vzdal_rovina_z(&p_mesh->obb_world,p_light->tp.z);
  3204. }
  3205. if(p_light->dosah > vzdal) {
  3206. p_light_dyn[lightnum++] = p_light;
  3207. flags |= p_light->flag;
  3208. }
  3209. }
  3210. }
  3211. } else {
  3212. p_light_dyn[lightnum++] = p_light;
  3213. flags |= p_light->flag;
  3214. }
  3215. }
  3216. }
  3217. if(!lightnum) {
  3218. null_free((void **)&p_data->p_edlight);
  3219. p_data->edlightnum = p_data->edlightmax = 0;
  3220. if(!(kflag&KONT_DRAW_LIGHT)) {
  3221. p_data->kflag &=~(KONT_DRAW_SPEC);
  3222. p_data->kflag &=~(KONT_DRAW_PRUHL);
  3223. if(!(p_data->m2flag&(MAT2_SPECULAR|MAT2_ENV_SPEC)) && p_mesh->p_vertex_spec) {
  3224. free(p_mesh->p_vertex_spec);
  3225. p_mesh->p_vertex_spec = NULL;
  3226. }
  3227. }
  3228. } else {
  3229. // Nastav ostrou spekularni barvu
  3230. if(flags&(EDL_SPEC_MOD|EDL_SPEC_SET|EDL_SPEC_ADD|EDL_SPEC_SUB)) {
  3231. p_data->kflag |= KONT_DRAW_SPEC;
  3232. if(!p_mesh->p_vertex_spec) {
  3233. p_mesh->p_vertex_spec = mmalloc(sizeof(p_mesh->p_vertex_spec[0])*p_mesh->vertexnum);
  3234. }
  3235. }
  3236. if(flags&EDL_PRUHL_LIGHT) {
  3237. p_data->kflag |= KONT_DRAW_PRUHL;
  3238. }
  3239. if(lightnum >= p_data->edlightmax) {
  3240. null_free((void **)&p_data->p_edlight);
  3241. i += (lightnum>>1)+10;
  3242. p_data->p_edlight = mmalloc(sizeof(p_data->p_edlight[0])*i);
  3243. p_data->edlightmax = i;
  3244. memcpy(p_data->p_edlight,p_light_dyn,sizeof(p_data->p_edlight[0])*lightnum);
  3245. } else {
  3246. memcpy(p_data->p_edlight,p_light_dyn,sizeof(p_data->p_edlight[0])*lightnum);
  3247. }
  3248. p_data->edlightnum = lightnum;
  3249. }
  3250. return(TRUE);
  3251. } else {
  3252. return(FALSE);
  3253. }
  3254. */
  3255. }
  3256. /***********************************************************************
  3257. Dynamicke flare
  3258. **********************************************************************
  3259. */
  3260. FlareHandle kom_flare_set_param(FlareHandle fh, float r, float g, float b,
  3261. float a, float dx, float dy, int material, int alfa)
  3262. {
  3263. LENS_FLARE *p_flare = (LENS_FLARE *) fh;
  3264. p_flare->akt = TRUE;
  3265. p_flare->r = r;
  3266. p_flare->g = g;
  3267. p_flare->b = b;
  3268. p_flare->a = a;
  3269. p_flare->dx = dx;
  3270. p_flare->dy = dy;
  3271. p_flare->material = material;
  3272. p_flare->alfa = alfa;
  3273. p_flare->p_mat = p_ber->p_mat[material];
  3274. return (fh);
  3275. }
  3276. LENS_FLARE *kom_flare_get_pointer(FlareHandle fh)
  3277. {
  3278. return ((LENS_FLARE *) fh);
  3279. }
  3280. FlareHandle kom_flare_set_pivot(FlareHandle fh, BOD * p_pivot)
  3281. {
  3282. LENS_FLARE *p_flare = (LENS_FLARE *) fh;
  3283. p_flare->p_bod = p_pivot;
  3284. return (fh);
  3285. }
  3286. FlareHandle kom_flare_set_pos(FlareHandle fh, BOD * p_pos)
  3287. {
  3288. LENS_FLARE *p_flare = (LENS_FLARE *) fh;
  3289. p_flare->p = *p_pos;
  3290. return (fh);
  3291. }
  3292. FlareHandle kom_flare_vyrob(int flag)
  3293. {
  3294. LENS_FLARE *p_flare;
  3295. /*
  3296. p_flare = mmalloc(sizeof(p_flare[0]));
  3297. p_flare->p_next = p_ber->p_flare;
  3298. p_flare->p_prev = NULL;
  3299. if(p_ber->p_flare) {
  3300. p_ber->p_flare->p_prev = p_flare;
  3301. }
  3302. p_ber->p_flare = p_flare;
  3303. p_flare->zflag = flag;
  3304. p_flare->p_svetlo = NULL;
  3305. return((int)p_flare);
  3306. */
  3307. }
  3308. void kom_flare_zrus(FlareHandle fh)
  3309. {
  3310. LENS_FLARE *p_flare = (LENS_FLARE *) fh;
  3311. if (p_flare->p_next)
  3312. p_flare->p_next->p_prev = p_flare->p_prev;
  3313. if (p_flare->p_prev)
  3314. p_flare->p_prev->p_next = p_flare->p_next;
  3315. else
  3316. p_ber->p_flare = p_flare->p_next;
  3317. free(p_flare);
  3318. }
  3319. void dl_nastav_kvalitu(G_KONFIG * p_ber)
  3320. {
  3321. if (p_ber->conf_dyn_rychlost == LIGHT_ALL) {
  3322. p_ber->conf_dyn_light_prvky = FALSE;
  3323. p_ber->conf_dyn_light_beruska = FALSE;
  3324. p_ber->conf_dyn_light_mesh = TRUE;
  3325. p_ber->conf_dyn_light_poly = TRUE;
  3326. }
  3327. else if (p_ber->conf_dyn_rychlost == LIGHT_PRVKY) {
  3328. p_ber->conf_dyn_light_prvky = TRUE; // pouze prvky
  3329. p_ber->conf_dyn_light_beruska = FALSE;
  3330. p_ber->conf_dyn_light_mesh = TRUE;
  3331. p_ber->conf_dyn_light_poly = TRUE;
  3332. }
  3333. else if (p_ber->conf_dyn_rychlost == LIGHT_VERTEXY) {
  3334. p_ber->conf_dyn_light_prvky = TRUE; // pouze vertexove prvky
  3335. p_ber->conf_dyn_light_beruska = FALSE;
  3336. p_ber->conf_dyn_light_mesh = TRUE;
  3337. p_ber->conf_dyn_light_poly = FALSE;
  3338. }
  3339. else if (p_ber->conf_dyn_rychlost == LIGHT_NIC) {
  3340. p_ber->conf_dyn_light_beruska = TRUE; // pouze beruska
  3341. p_ber->conf_dyn_light_prvky = FALSE;
  3342. p_ber->conf_dyn_light_mesh = FALSE;
  3343. p_ber->conf_dyn_light_poly = FALSE;
  3344. }
  3345. }
  3346. /* Nastavi detaily pro dynamicke svetla
  3347. */
  3348. void dl_nastav(G_KONFIG * p_ber)
  3349. {
  3350. int rych = p_ber->conf_dyn_rychlost;
  3351. // on-off svetel
  3352. p_ber->conf_dyn_rychlost = LIGHT_ALL;
  3353. p_ber->conf_dyn_light_update_all = TRUE;
  3354. dl_nastav_kvalitu(p_ber);
  3355. dl_updatuj(p_ber);
  3356. p_ber->conf_dyn_rychlost = rych;
  3357. dl_nastav_kvalitu(p_ber);
  3358. }
  3359. void mlha_reset(void)
  3360. {
  3361. p_ber->p_mlha_akt = NULL;
  3362. }