Berusky3d_render.cpp 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971
  1. /*
  2. Rendering berusek
  3. */
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <assert.h>
  7. #include "3d_all.h"
  8. #include "Object.h"
  9. #include "Berusky_universal.h"
  10. #include "Berusky3d_castice.h"
  11. #include "Berusky3d.h"
  12. #include "Berusky3d_ini.h"
  13. #include "Berusky3d_load.h"
  14. #include "Berusky3d_render.h"
  15. #include "Berusky3d_animace.h"
  16. #include "Berusky3d_kamery.h"
  17. #include "Berusky3d_kofola_interface.h"
  18. #include "Berusky3d_light.h"
  19. #include "Berusky3d_castice2.h"
  20. #include "Berusky3d_kofola2d.h"
  21. extern G_KONFIG ber, *p_ber;
  22. #define TEST_DIFF 0
  23. #define RIF(min,max) (((max)+(min))*0.5f)
  24. #define DIF(min,max) (((max)-(min))*0.5f)
  25. EDIT_MATERIAL *__p_last_mat;
  26. inline float ber_vzdal_bodu_z(BOD * p_stred, GLMATRIX * p_mat)
  27. {
  28. return (p_mat->_13 * p_stred->x + p_mat->_23 * p_stred->y +
  29. p_mat->_33 * p_stred->z + p_mat->_43);
  30. }
  31. static float __flare_faktor;
  32. /* Pointery na renderovaci funkce
  33. */
  34. void (*ber_kresli_mesh_v1) (GAME_MESH_OLD * p_mesh, EDIT_MATERIAL ** p_mt);
  35. void (*ber_kresli_mesh_v2) (GAME_MESH_OLD * p_mesh, EDIT_MATERIAL ** p_mt);
  36. void (*ber_kresli_poly_v1) (EDIT_MESH_POLY * p_poly, EDIT_MATERIAL ** p_mat);
  37. int (*ber_nastav_material_single) (EDIT_MATERIAL * p_smat,
  38. EDIT_MATERIAL * p_mat, dword kflag);
  39. int (*ber_nastav_material_single_poly) (EDIT_MATERIAL * p_smat,
  40. EDIT_MATERIAL * p_mat, dword kflag);
  41. void ber_nahod_render_funkce(void)
  42. {
  43. vertex_array_ini();
  44. ber_nastav_material_single = ber_nastav_material_single_multi_spec;
  45. ber_nastav_material_single_poly =
  46. ber_nastav_material_single_poly_multi_spec;
  47. if (gl_ext::extlist_vertex_array) {
  48. kprintf(TRUE, "Array-Vertex function ok");
  49. ber_kresli_poly_v1 = ber_kresli_poly_array;
  50. if (gl_ext::extlist_indicie_array) {
  51. kprintf(TRUE, "Array-Indices function ok");
  52. ber_kresli_mesh_v1 = ber_kresli_mesh_array;
  53. ber_kresli_mesh_v2 = ber_kresli_mesh_array;
  54. }
  55. else {
  56. ber_kresli_mesh_v1 = ber_kresli_mesh_vertex_multitext;
  57. ber_kresli_mesh_v2 = ber_kresli_mesh_vertex_multitext_specular;
  58. }
  59. }
  60. else {
  61. ber_kresli_mesh_v1 = ber_kresli_mesh_vertex_multitext;
  62. ber_kresli_mesh_v2 = ber_kresli_mesh_vertex_multitext_specular;
  63. ber_kresli_poly_v1 = ber_kresli_poly_vertex_multitext_specular;
  64. }
  65. }
  66. /* Inicializacni funkce
  67. */
  68. void ber_ini_vertex_arrays(void)
  69. {
  70. /* Povoleni vertex-arrays
  71. */
  72. glEnable(GL_VERTEX_ARRAY_EXT);
  73. }
  74. void ber_ini_nic(void)
  75. {
  76. }
  77. // urci jestli jsou flare viditelne
  78. void ber_viditelnost_flare(G_KONFIG * p_ber, LENS_FLARE * p_flare)
  79. {
  80. GLMATRIX *p_camera_project = get_matrix_camera_project();
  81. float pixel_z, t, xw, yw, zw, w, ryw, sx, sy, xq, yq;
  82. int s, nx, ny, maxx, maxy, ox, oy;
  83. LENS_FLARE_SLOZ *p_sloz;
  84. STATIC_LIGHT *p_light;
  85. BOD p;
  86. get_matrix_view(&nx, &ny, &maxx, &maxy);
  87. ox = (maxx >> 1);
  88. oy = (maxy >> 1);
  89. __flare_faktor = (float) (maxx) / 10.0f;
  90. while (p_flare) {
  91. p_flare->vid = FALSE;
  92. if (!p_flare->akt) {
  93. p_flare = p_flare->p_next;
  94. continue;
  95. }
  96. if (p_flare->p_bod) {
  97. p = *p_flare->p_bod;
  98. }
  99. else {
  100. if (p_flare->p_svetlo) {
  101. p = p_flare->p_svetlo->p;
  102. }
  103. else {
  104. p = p_flare->p;
  105. p_light = NULL;
  106. }
  107. }
  108. w = 1.0f;
  109. transformuj_wbod_matici(&p.x, &p.y, &p.z, &w, p_camera_project);
  110. p_flare->vid = (0 < p.z && p.z < w && -w < p.x && p.x <= w && -w < p.y
  111. && p.y <= w);
  112. if (p.z > 0.0f && (p_flare->vid || p_flare->p_sloz)) {
  113. p_flare->wz = p.z; //wz musi byt vetsi nez 0 a mensi nez w
  114. xw = (maxx >> 1) * (p.x / w) + ox;
  115. yw = (maxy >> 1) * (p.y / w) + oy;
  116. zw = (0.5f) * (p.z / w) + 0.5f;
  117. p_flare->wx = xw;
  118. p_flare->wy = ryw = maxy - 1 - yw;
  119. if (!(p_flare->zflag & FLR_NO_ZTEST) && p_flare->vid) {
  120. glReadPixels(ftoi(xw), ny + ftoi(yw), 1, 1, GL_DEPTH_COMPONENT,
  121. GL_FLOAT, &pixel_z);
  122. p_flare->vid = (pixel_z >= zw);
  123. }
  124. if (p_flare->p_sloz) {
  125. xq = (float) ox - xw;
  126. yq = (float) oy - ryw;
  127. p_sloz = p_flare->p_sloz;
  128. for (s = 0; s < SLOZ_FLARE; s++) {
  129. t = p_sloz[s].vzdal;
  130. if (t > 0.0f) {
  131. t *= 1.3f;
  132. p_sloz[s].wx = sx = xw + xq * t;
  133. p_sloz[s].wy = sy = ryw + yq * t;
  134. p_sloz[s].vid = (0 <= sx && sx < maxx && 0 <= sy && sy < maxy);
  135. }
  136. else {
  137. p_sloz[s].vid = FALSE;
  138. }
  139. }
  140. }
  141. }
  142. p_flare = p_flare->p_next;
  143. }
  144. }
  145. inline void ber_kresli_flare_pre(G_KONFIG * p_ber)
  146. {
  147. int __flare_x, __flare_y, __flare_maxx, __flare_maxy;
  148. get_matrix_view(&__flare_x, &__flare_y, &__flare_maxx, &__flare_maxy);
  149. set_matrix_2d(__flare_maxx, __flare_maxy);
  150. text_set_num(1);
  151. text_off(GL_TEXTURE_1D);
  152. text_off(GL_TEXTURE_2D);
  153. text_set_num(0);
  154. text_on(GL_TEXTURE_2D);
  155. blend_on();
  156. deph_test_set(FALSE);
  157. disable_fog_causal();
  158. specular_off();
  159. }
  160. inline void ber_kresli_flare_po(G_KONFIG * p_ber)
  161. {
  162. deph_test_set(TRUE);
  163. ret_matrix_2d();
  164. reset_stage_bloky();
  165. enable_fog_causal();
  166. }
  167. #define SLOZ_FLARE 14
  168. // vykresli ty viditelne spolu s pruhlednyma mesh/poly
  169. void ber_kresli_flare(G_KONFIG * p_ber, LENS_FLARE * p_flare)
  170. {
  171. EDIT_TEXT *p_text;
  172. LENS_FLARE_SLOZ *p_sloz;
  173. float dx, dy, xw, yw;
  174. int s;
  175. ber_kresli_flare_pre(p_ber);
  176. while (p_flare) {
  177. if (!p_flare->vid || !p_flare->akt) {
  178. p_flare = p_flare->p_next;
  179. continue;
  180. }
  181. blend_set(GL_SRC_ALPHA, p_flare->alfa);
  182. // Nastavim material flaru
  183. p_text = p_flare->p_mat->p_text[0];
  184. text_set(p_text->text, p_text->typ);
  185. glColor4fv(&p_flare->r);
  186. dx = p_flare->dx * __flare_faktor;
  187. dy = p_flare->dy * __flare_faktor;
  188. xw = p_flare->wx;
  189. yw = p_flare->wy;
  190. glBegin(GL_QUADS);
  191. glTexCoord2f(0.0f, 0.0f);
  192. glVertex3f(-dx + xw, dy + yw, 0.0f);
  193. glTexCoord2f(1.0f, 0.0f);
  194. glVertex3f(dx + xw, dy + yw, 0.0f);
  195. glTexCoord2f(1.0f, 1.0f);
  196. glVertex3f(dx + xw, -dy + yw, 0.0f);
  197. glTexCoord2f(0.0f, 1.0f);
  198. glVertex3f(-dx + xw, -dy + yw, 0.0f);
  199. glEnd();
  200. if (p_flare->p_sloz) {
  201. p_sloz = p_flare->p_sloz;
  202. for (s = 0; s < SLOZ_FLARE; s++) {
  203. if (p_sloz[s].vid) {
  204. xw = p_sloz[s].wx;
  205. yw = p_sloz[s].wy;
  206. dx = p_sloz[s].dx * __flare_faktor;
  207. dy = p_sloz[s].dy * __flare_faktor;
  208. p_text = p_sloz[s].p_mat->p_text[0];
  209. text_set(p_text->text, p_text->typ);
  210. glColor4fv(&p_sloz[s].r);
  211. glBegin(GL_QUADS);
  212. glTexCoord2f(0.0f, 0.0f);
  213. glVertex3f(-dx + xw, dy + yw, 0.0f);
  214. glTexCoord2f(1.0f, 0.0f);
  215. glVertex3f(dx + xw, dy + yw, 0.0f);
  216. glTexCoord2f(1.0f, 1.0f);
  217. glVertex3f(dx + xw, -dy + yw, 0.0f);
  218. glTexCoord2f(0.0f, 1.0f);
  219. glVertex3f(-dx + xw, -dy + yw, 0.0f);
  220. glEnd();
  221. }
  222. }
  223. }
  224. p_flare = p_flare->p_next;
  225. }
  226. ber_kresli_flare_po(p_ber);
  227. }
  228. inline void ber_render_polylistu_start(void)
  229. {
  230. set_matrix_world_init();
  231. }
  232. int ber_nastav_material_single_multi_spec(EDIT_MATERIAL * p_smat,
  233. EDIT_MATERIAL * p_mat, dword kflag)
  234. {
  235. MATERIAL_TEXT_OLD *p_stg;
  236. MATERIAL_TEXT_OLD *p_stg_smat;
  237. int i, s, t, rezerva_smat, rezerva_mat, pozice_smat, stage_smat;
  238. /* Nastaveni spekularni barvy
  239. */
  240. if (p_mat->flag2 & (MAT2_SPECULAR | MAT2_ENV_SPEC)
  241. || kflag & KONT_DRAW_SPEC)
  242. specular_on();
  243. else
  244. specular_off();
  245. /* Nastaveni pruhlednosti
  246. */
  247. if (kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) { // ... prehozeni stage bloku + 50
  248. set_alfa_blok(STATE_BLOK_PRUHL);
  249. }
  250. else {
  251. //... nahod aktualni alfa-stage
  252. /* Alfa-blending
  253. */
  254. set_alfa_blok(p_mat->alfa_state);
  255. }
  256. /* Test na duplicitu materialu
  257. */
  258. if (!p_mat || __p_last_mat == p_mat)
  259. return (FALSE);
  260. __p_last_mat = p_mat;
  261. /* Nahozeni matrose-plazivce
  262. */
  263. if (!p_smat || !p_smat->p_text[0]->load || p_mat->flag & MAT_NO_SCMT) {
  264. p_stg = p_mat->text_state;
  265. t = 0;
  266. for (i = 0; i < MAT_TEXTUR; i++) {
  267. if ((s = p_stg->text_stage) != K_CHYBA) {
  268. if ((t =
  269. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  270. 0)) == K_CHYBA)
  271. break;
  272. }
  273. else { // defaultni stage - nic
  274. text_stage_func_nic(t);
  275. break;
  276. }
  277. p_stg++;
  278. }
  279. }
  280. else {
  281. p_stg = p_mat->text_state;
  282. p_stg_smat = p_smat->text_state;
  283. pozice_smat = p_smat->smaterial_pozice;
  284. stage_smat = p_stg_smat->text_stage;
  285. if (p_smat->flag & MAT_SCENE_NUTNY) {
  286. rezerva_smat = p_smat->textur;
  287. rezerva_mat = 0;
  288. }
  289. else {
  290. rezerva_smat = 0;
  291. rezerva_mat = p_mat->textur;
  292. }
  293. t = 0;
  294. for (i = 0; i < MAT_TEXTUR; i++) {
  295. if (i == pozice_smat) {
  296. if ((t =
  297. p_text_stage_func[stage_smat] (p_smat,
  298. text_stage_edit_blok + stage_smat, p_stg_smat, t,
  299. rezerva_mat)) == K_CHYBA)
  300. break;
  301. rezerva_smat = 0;
  302. }
  303. if ((s = p_stg->text_stage) != K_CHYBA) {
  304. if ((t =
  305. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  306. rezerva_smat)) == K_CHYBA)
  307. break;
  308. }
  309. else { // defaultni stage - nic - konec
  310. break;
  311. }
  312. p_stg++;
  313. }
  314. if (i < pozice_smat) {
  315. t =
  316. p_text_stage_func[stage_smat] (p_smat,
  317. text_stage_edit_blok + stage_smat, p_stg_smat, t, 0);
  318. }
  319. text_stage_func_nic(t);
  320. }
  321. /* Nastaveni difusni barvy
  322. */
  323. if (p_mat->flag2 & MAT2_DIFFUSE) {
  324. diffuse_on();
  325. }
  326. else {
  327. diffuse_off(p_mat->dxmat.diffuse_r, p_mat->dxmat.diffuse_g,
  328. p_mat->dxmat.diffuse_b, p_mat->dxmat.diffuse_a);
  329. }
  330. /* Nastaveni z-bufferu
  331. */
  332. deph_test_set((~p_mat->flag) & MAT_NO_ZTEST);
  333. zmask_set((~p_mat->flag) & MAT_NO_ZMASK);
  334. /* Nastaveni cullingu
  335. */
  336. if (p_mat->flag & MAT_NO_CULL)
  337. cull_off();
  338. else
  339. cull_on();
  340. return (TRUE);
  341. }
  342. /* Strc to tam!!!!
  343. */
  344. int ber_nastav_material_single_multi(EDIT_MATERIAL * p_smat,
  345. EDIT_MATERIAL * p_mat, dword kflag)
  346. {
  347. MATERIAL_TEXT_OLD *p_stg;
  348. MATERIAL_TEXT_OLD *p_stg_smat;
  349. int i, s, t, rezerva_smat, rezerva_mat, pozice_smat, stage_smat;
  350. /* Nastaveni pruhlednosti
  351. */
  352. if (kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) { // ... prehozeni stage bloku + 50
  353. set_alfa_blok(STATE_BLOK_PRUHL);
  354. }
  355. else {
  356. //... nahod aktualni alfa-stage
  357. /* Alfa-blending
  358. */
  359. set_alfa_blok(p_mat->alfa_state);
  360. }
  361. /* Test na duplicitu materialu
  362. */
  363. if (!p_mat || __p_last_mat == p_mat)
  364. return (FALSE);
  365. __p_last_mat = p_mat;
  366. /* Nahozeni matrose-plazivce
  367. */
  368. if (!p_smat || !p_smat->p_text[0]->load || p_mat->flag & MAT_NO_SCMT) {
  369. p_stg = p_mat->text_state;
  370. t = 0;
  371. for (i = 0; i < MAT_TEXTUR; i++) {
  372. if ((s = p_stg->text_stage) != K_CHYBA) {
  373. if ((t =
  374. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  375. 0)) == K_CHYBA)
  376. break;
  377. }
  378. else { // defaultni stage - nic
  379. text_stage_func_nic(t);
  380. break;
  381. }
  382. p_stg++;
  383. }
  384. }
  385. else {
  386. p_stg = p_mat->text_state;
  387. p_stg_smat = p_smat->text_state;
  388. pozice_smat = p_smat->smaterial_pozice;
  389. stage_smat = p_stg_smat->text_stage;
  390. if (p_smat->flag & MAT_SCENE_NUTNY) {
  391. rezerva_smat = p_smat->textur;
  392. rezerva_mat = 0;
  393. }
  394. else {
  395. rezerva_smat = 0;
  396. rezerva_mat = p_mat->textur;
  397. }
  398. t = 0;
  399. for (i = 0; i < MAT_TEXTUR; i++) {
  400. if (i == pozice_smat) {
  401. if ((t =
  402. p_text_stage_func[stage_smat] (p_smat,
  403. text_stage_edit_blok + stage_smat, p_stg_smat, t,
  404. rezerva_mat)) == K_CHYBA)
  405. break;
  406. rezerva_smat = 0;
  407. }
  408. if ((s = p_stg->text_stage) != K_CHYBA) {
  409. if ((t =
  410. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  411. rezerva_smat)) == K_CHYBA)
  412. break;
  413. }
  414. else { // defaultni stage - nic - konec
  415. break;
  416. }
  417. p_stg++;
  418. }
  419. if (i < pozice_smat) {
  420. t =
  421. p_text_stage_func[stage_smat] (p_smat,
  422. text_stage_edit_blok + stage_smat, p_stg_smat, t, 0);
  423. }
  424. text_stage_func_nic(t);
  425. }
  426. /* Nastaveni difusni barvy
  427. */
  428. if (p_mat->flag2 & MAT2_DIFFUSE) {
  429. diffuse_on();
  430. }
  431. else {
  432. diffuse_off(p_mat->dxmat.diffuse_r, p_mat->dxmat.diffuse_g,
  433. p_mat->dxmat.diffuse_b, p_mat->dxmat.diffuse_a);
  434. }
  435. /* Nastaveni z-bufferu
  436. */
  437. deph_test_set((~p_mat->flag) & MAT_NO_ZTEST);
  438. zmask_set((~p_mat->flag) & MAT_NO_ZMASK);
  439. /* Nastaveni cullingu
  440. */
  441. if (p_mat->flag & MAT_NO_CULL)
  442. cull_off();
  443. else
  444. cull_on();
  445. return (TRUE);
  446. }
  447. int ber_nastav_material_single_nic(EDIT_MATERIAL * p_smat,
  448. EDIT_MATERIAL * p_mat, dword kflag)
  449. {
  450. MATERIAL_TEXT_OLD *p_stg;
  451. int s, t;
  452. /* Nastaveni pruhlednosti
  453. */
  454. if (kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) { // ... prehozeni stage bloku + 50
  455. set_alfa_blok(STATE_BLOK_PRUHL);
  456. }
  457. else {
  458. //... nahod aktualni alfa-stage
  459. /* Alfa-blending
  460. */
  461. set_alfa_blok(p_mat->alfa_state);
  462. }
  463. /* Test na duplicitu materialu
  464. */
  465. if (!p_mat || __p_last_mat == p_mat)
  466. return (FALSE);
  467. __p_last_mat = p_mat;
  468. /* Nahozeni matrose-plazivce
  469. */
  470. p_stg = p_mat->text_state;
  471. t = 0;
  472. if ((s = p_stg->text_stage) != K_CHYBA) {
  473. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t, 0);
  474. }
  475. else { // defaultni stage - nic
  476. text_stage_func_nic(t);
  477. }
  478. /* Nastaveni difusni barvy
  479. */
  480. if (p_mat->flag2 & MAT2_DIFFUSE) {
  481. diffuse_on();
  482. }
  483. else {
  484. diffuse_off(p_mat->dxmat.diffuse_r, p_mat->dxmat.diffuse_g,
  485. p_mat->dxmat.diffuse_b, p_mat->dxmat.diffuse_a);
  486. }
  487. /* Nastaveni cullingu
  488. */
  489. if (p_mat->flag & MAT_NO_CULL)
  490. cull_off();
  491. else
  492. cull_on();
  493. /* Nastaveni z-bufferu
  494. */
  495. deph_test_set((~p_mat->flag) & MAT_NO_ZTEST);
  496. zmask_set((~p_mat->flag) & MAT_NO_ZMASK);
  497. return (TRUE);
  498. }
  499. /* Rendering meshe -> verze 1 -> multitexturing bez spekularu
  500. v poly
  501. */
  502. void ber_kresli_mesh_array(GAME_MESH_OLD * p_mesh, EDIT_MATERIAL ** p_mt)
  503. {
  504. int i, j, o, facenum, fnum2;
  505. int kflag = p_mesh->p_data->kflag;
  506. int key_flag = kflag & KONT_KEYFRAME;
  507. int *p_face, ind, gltyp;
  508. dword *p_vflag = p_mesh->p_kflag;
  509. #ifdef DEBUG_MOD
  510. p_ber->debug.meshu++;
  511. #endif
  512. if (!key_flag) {
  513. set_matrix_world(&p_mesh->m);
  514. }
  515. // Ma se mesh uploadoat do graficke pameti?
  516. if (p_mesh->p_data->k2flag & KONT2_UPLOAD) {
  517. mesh_vertex_array_upload(p_mesh);
  518. }
  519. mesh_vertex_array_set(p_mesh);
  520. o = p_mesh->objektu;
  521. for (i = 0; i < o; i++, p_vflag++) { // kresli to po objektech
  522. if ((*p_vflag) & KONT_VIDITELNY) {
  523. if (ber_nastav_material_single(p_ber->p_smat, p_mt[p_mesh->p_mat[i]],
  524. kflag) || !i)
  525. mesh_vertex_array_set_koord(p_mesh);
  526. #ifdef DEBUG_MOD
  527. p_ber->debug.bodu += p_mesh->objektnum[i];
  528. p_ber->debug.objektu++;
  529. #endif
  530. if (key_flag)
  531. set_matrix_world(p_mesh->p_key + i);
  532. ind = p_mesh->facestart[i];
  533. p_face = p_mesh->p_face + ind;
  534. facenum = p_mesh->facenum[i];
  535. for (j = 0; j < facenum; j++) {
  536. fnum2 = *p_face++;
  537. gltyp = *p_face++;
  538. ind += 2;
  539. #ifdef DEBUG_MOD
  540. p_ber->debug.facu += fnum2;
  541. #endif
  542. if (gl_ext::extlist_arb_vertex_buffer) {
  543. glDrawElements(gltyp, fnum2, GL_UNSIGNED_INT,
  544. BUFFER_OFFSET(sizeof(p_mesh->p_face[0]) *
  545. (p_face - p_mesh->p_face)));
  546. }
  547. else {
  548. glElementPointerATI(GL_UNSIGNED_INT, p_face);
  549. glDrawElementArrayATI(gltyp, fnum2);
  550. }
  551. p_face += fnum2;
  552. }
  553. }
  554. }
  555. }
  556. /* Renderig meshe z poly-listu
  557. */
  558. void ber_kresli_mesh_vertex_multitext_specular(GAME_MESH_OLD * p_mesh,
  559. EDIT_MATERIAL ** p_mt)
  560. {
  561. BOD *p_vertex_pos = NULL;
  562. BODUV *p_vertex_text1 = NULL;
  563. BODUV *p_vertex_text2 = NULL;
  564. BODUV *p_vertex_text3 = NULL;
  565. BODUV *p_vertex_text4 = NULL;
  566. BODRGBA *p_vertex_diff = NULL;
  567. BODRGB *p_vertex_spec = NULL;
  568. BOD *p_vertex_normal;
  569. int *p_face;
  570. int v, i, j, o, d, facenum, fnum2;
  571. int kflag = p_mesh->p_data->kflag;
  572. int key_flag = kflag & KONT_KEYFRAME;
  573. dword *p_vflag = p_mesh->p_kflag;
  574. BODUV **p_map;
  575. int *p_int, ind;
  576. #ifdef DEBUG_MOD
  577. p_ber->debug.meshu++;
  578. #endif
  579. if (!key_flag) {
  580. set_matrix_world(&p_mesh->m);
  581. }
  582. o = p_mesh->objektu;
  583. p_vertex_pos = p_mesh->p_vertex_pos;
  584. p_vertex_normal = (glstav_pn_triangles
  585. || p_mesh->p_data->
  586. m2flag & (MAT2_CALC_MAP1 | MAT2_CALC_MAP2 | MAT2_CALC_MAP3 |
  587. MAT2_CALC_MAP4)) ? p_mesh->p_vertex_norm : NULL;
  588. for (i = 0; i < o; i++, p_vflag++) { // kresli to po objektech
  589. if ((*p_vflag) & KONT_VIDITELNY) {
  590. if (ber_nastav_material_single(p_ber->p_smat, p_mt[p_mesh->p_mat[i]],
  591. kflag) || !i) {
  592. p_map = &p_mesh->p_vertex_uv1_material;
  593. p_int = glstav_text_map_indicie;
  594. if ((ind = *p_int++) != K_CHYBA)
  595. p_vertex_text1 = p_map[ind];
  596. if ((ind = *p_int++) != K_CHYBA)
  597. p_vertex_text2 = p_map[ind];
  598. if ((ind = *p_int++) != K_CHYBA)
  599. p_vertex_text3 = p_map[ind];
  600. if ((ind = *p_int++) != K_CHYBA)
  601. p_vertex_text4 = p_map[ind];
  602. if (kflag & KONT_DRAW_VODA) {
  603. if (glstav_diffuse)
  604. p_vertex_diff = p_mesh->p_vertex_diff_voda;
  605. p_vertex_spec = p_mesh->p_vertex_spec_voda;
  606. }
  607. else {
  608. if (glstav_diffuse)
  609. p_vertex_diff = p_mesh->p_vertex_diff;
  610. p_vertex_spec = p_mesh->p_vertex_spec;
  611. }
  612. }
  613. #ifdef DEBUG_MOD
  614. p_ber->debug.bodu += p_mesh->objektnum[i];
  615. p_ber->debug.objektu++;
  616. #endif
  617. if (key_flag)
  618. set_matrix_world(p_mesh->p_key + i);
  619. p_face = p_mesh->p_face + p_mesh->facestart[i];
  620. facenum = p_mesh->facenum[i];
  621. for (j = 0; j < facenum; j++) {
  622. fnum2 = *p_face++;
  623. glBegin(*p_face++);
  624. #ifdef DEBUG_MOD
  625. p_ber->debug.facu += fnum2;
  626. #endif
  627. for (d = 0; d < fnum2; d++) {
  628. v = *p_face++;
  629. if (p_vertex_text1)
  630. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,
  631. (float *) (p_vertex_text1 + v));
  632. if (p_vertex_text2)
  633. glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,
  634. (float *) (p_vertex_text2 + v));
  635. if (p_vertex_text3)
  636. glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,
  637. (float *) (p_vertex_text3 + v));
  638. if (p_vertex_text4)
  639. glMultiTexCoord2fvARB(GL_TEXTURE3_ARB,
  640. (float *) (p_vertex_text4 + v));
  641. if (p_vertex_spec)
  642. glSecondaryColor3fvEXT((float *) (p_vertex_spec + v));
  643. if (p_vertex_normal)
  644. glNormal3fv((float *) (p_vertex_normal + v));
  645. if (p_vertex_diff)
  646. glColor4fv((float *) (p_vertex_diff + v));
  647. glVertex3fv((float *) (p_vertex_pos + v));
  648. }
  649. glEnd();
  650. }
  651. }
  652. }
  653. }
  654. void ber_kresli_mesh_vertex_multitext(GAME_MESH_OLD * p_mesh,
  655. EDIT_MATERIAL ** p_mt)
  656. {
  657. BOD *p_vertex_pos = NULL;
  658. BODUV *p_vertex_text1 = NULL;
  659. BODUV *p_vertex_text2 = NULL;
  660. BODUV *p_vertex_text3 = NULL;
  661. BODUV *p_vertex_text4 = NULL;
  662. BODRGBA *p_vertex_diff = NULL;
  663. BOD *p_vertex_normal;
  664. int *p_face;
  665. int v, i, j, o, d, facenum, fnum2;
  666. int kflag = p_mesh->p_data->kflag;
  667. int key_flag = kflag & KONT_KEYFRAME;
  668. dword *p_vflag = p_mesh->p_kflag;
  669. BODUV **p_map;
  670. int *p_int, ind;
  671. #ifdef DEBUG_MOD
  672. p_ber->debug.meshu++;
  673. #endif
  674. if (!key_flag) {
  675. set_matrix_world(&p_mesh->m);
  676. }
  677. o = p_mesh->objektu;
  678. p_vertex_pos = p_mesh->p_vertex_pos;
  679. p_vertex_normal = glstav_pn_triangles
  680. || p_mesh->p_data->
  681. m2flag & (MAT2_CALC_MAP1 | MAT2_CALC_MAP2 | MAT2_CALC_MAP3 |
  682. MAT2_CALC_MAP4) ? p_mesh->p_vertex_norm : NULL;
  683. for (i = 0; i < o; i++, p_vflag++) { // kresli to po objektech
  684. if ((*p_vflag) & KONT_VIDITELNY) {
  685. if (ber_nastav_material_single(p_ber->p_smat, p_mt[p_mesh->p_mat[i]],
  686. kflag) || !i) {
  687. p_map = &p_mesh->p_vertex_uv1_material;
  688. p_int = glstav_text_map_indicie;
  689. if ((ind = *p_int++) != K_CHYBA)
  690. p_vertex_text1 = p_map[ind];
  691. if ((ind = *p_int++) != K_CHYBA)
  692. p_vertex_text2 = p_map[ind];
  693. if ((ind = *p_int++) != K_CHYBA)
  694. p_vertex_text3 = p_map[ind];
  695. if ((ind = *p_int++) != K_CHYBA)
  696. p_vertex_text4 = p_map[ind];
  697. if (glstav_diffuse)
  698. p_vertex_diff =
  699. kflag & KONT_DRAW_VODA ? p_mesh->p_vertex_diff_voda : p_mesh->
  700. p_vertex_diff;
  701. }
  702. #ifdef DEBUG_MOD
  703. p_ber->debug.bodu += p_mesh->objektnum[i];
  704. p_ber->debug.objektu++;
  705. #endif
  706. if (key_flag)
  707. set_matrix_world(p_mesh->p_key + i);
  708. p_face = p_mesh->p_face + p_mesh->facestart[i];
  709. facenum = p_mesh->facenum[i];
  710. for (j = 0; j < facenum; j++) {
  711. fnum2 = *p_face++;
  712. glBegin(*p_face++);
  713. #ifdef DEBUG_MOD
  714. p_ber->debug.facu += fnum2;
  715. #endif
  716. for (d = 0; d < fnum2; d++) {
  717. v = *p_face++;
  718. if (p_vertex_text1)
  719. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,
  720. (float *) (p_vertex_text1 + v));
  721. if (p_vertex_text2)
  722. glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,
  723. (float *) (p_vertex_text2 + v));
  724. if (p_vertex_text3)
  725. glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,
  726. (float *) (p_vertex_text3 + v));
  727. if (p_vertex_text4)
  728. glMultiTexCoord2fvARB(GL_TEXTURE3_ARB,
  729. (float *) (p_vertex_text4 + v));
  730. if (p_vertex_normal)
  731. glNormal3fv((float *) (p_vertex_normal + v));
  732. if (p_vertex_diff)
  733. glColor4fv((float *) (p_vertex_diff + v));
  734. glVertex3fv((float *) (p_vertex_pos + v));
  735. }
  736. glEnd();
  737. }
  738. }
  739. }
  740. }
  741. void ber_kresli_mesh_vertex(GAME_MESH_OLD * p_mesh, EDIT_MATERIAL ** p_mt)
  742. {
  743. BOD *p_vertex_pos = NULL;
  744. BOD *p_vertex_normal = NULL;
  745. BODUV *p_vertex_text1 = NULL;
  746. BODRGBA *p_vertex_diff = NULL;
  747. int v, i, j, o, d, facenum, fnum2;
  748. int kflag = p_mesh->p_data->kflag;
  749. int key_flag = kflag & KONT_KEYFRAME;
  750. int *p_face;
  751. dword *p_vflag = p_mesh->p_kflag;
  752. BODUV **p_map;
  753. int *p_int, ind;
  754. #ifdef DEBUG_MOD
  755. p_ber->debug.meshu++;
  756. #endif
  757. if (!key_flag) {
  758. set_matrix_world(&p_mesh->m);
  759. }
  760. o = p_mesh->objektu;
  761. p_vertex_pos = p_mesh->p_vertex_pos;
  762. p_vertex_normal = glstav_pn_triangles
  763. || p_mesh->p_data->m2flag & MAT2_CALC_MAP1 ? p_mesh->p_vertex_norm : NULL;
  764. for (i = 0; i < o; i++, p_vflag++) { // kresli to po objektech
  765. if ((*p_vflag) & KONT_VIDITELNY) {
  766. if (ber_nastav_material_single(p_ber->p_smat, p_mt[p_mesh->p_mat[i]],
  767. kflag) || !i) {
  768. p_map = &p_mesh->p_vertex_uv1_material;
  769. p_int = glstav_text_map_indicie;
  770. if ((ind = *p_int) != K_CHYBA)
  771. p_vertex_text1 = p_map[ind];
  772. if (glstav_diffuse)
  773. p_vertex_diff =
  774. kflag & KONT_DRAW_VODA ? p_mesh->p_vertex_diff_voda : p_mesh->
  775. p_vertex_diff;
  776. }
  777. #ifdef DEBUG_MOD
  778. p_ber->debug.bodu += p_mesh->objektnum[i];
  779. p_ber->debug.objektu++;
  780. #endif
  781. if (key_flag)
  782. set_matrix_world(p_mesh->p_key + i);
  783. p_face = p_mesh->p_face + p_mesh->facestart[i];
  784. facenum = p_mesh->facenum[i];
  785. for (j = 0; j < facenum; j++) {
  786. fnum2 = *p_face++;
  787. glBegin(*p_face++);
  788. #ifdef DEBUG_MOD
  789. p_ber->debug.facu += fnum2;
  790. #endif
  791. if (p_vertex_normal) {
  792. for (d = 0; d < fnum2; d++) {
  793. v = *p_face++;
  794. if (p_vertex_text1)
  795. glTexCoord2fv((float *) (p_vertex_text1 + v));
  796. if (p_vertex_diff)
  797. glColor4fv((float *) (p_vertex_diff + v));
  798. glNormal3fv((float *) (p_vertex_normal + v));
  799. glVertex3fv((float *) (p_vertex_pos + v));
  800. }
  801. }
  802. else {
  803. for (d = 0; d < fnum2; d++) {
  804. v = *p_face++;
  805. if (p_vertex_text1)
  806. glTexCoord2fv((float *) (p_vertex_text1 + v));
  807. if (p_vertex_diff)
  808. glColor4fv((float *) (p_vertex_diff + v));
  809. glVertex3fv((float *) (p_vertex_pos + v));
  810. }
  811. }
  812. glEnd();
  813. }
  814. }
  815. }
  816. }
  817. void ber_kresli_obalku_mesh(GAME_MESH_OLD * p_mesh)
  818. {
  819. set_matrix_world_init();
  820. obb_kresli_obalku(&p_mesh->obb_world, DDRGBA(1, 1, 1, 1), NULL);
  821. }
  822. void ber_kresli_obalku_poly(EDIT_MESH_POLY * p_poly)
  823. {
  824. set_matrix_world_init();
  825. obb_kresli_obalku(&p_poly->obb, DDRGBA(1, 1, 1, 1), NULL);
  826. }
  827. inline void ber_kresli_mesh(GAME_MESH_OLD * p_mesh, EDIT_MATERIAL ** p_mat)
  828. {
  829. int kflag = p_mesh->p_data->kflag;
  830. int m2flag = p_mesh->p_data->m2flag;
  831. // Pripadne vypnuti mlhy
  832. if (kflag & KONT_NO_FOG) {
  833. disable_fog_causal();
  834. }
  835. else {
  836. // Pripadne zapnuti mlhy
  837. if (p_mesh->p_mlha) {
  838. if (!p_ber->p_mlha_akt)
  839. enable_fog();
  840. nastav_fog(p_mesh->p_mlha);
  841. }
  842. }
  843. #ifdef DEBUG_MOD_OBALKY
  844. ber_kresli_obalku_mesh(p_mesh);
  845. #endif
  846. // Nastaveni spec-env-mappingu
  847. if (m2flag & MAT2_ENV_SPEC && (p_ber->kamera.zmena || kflag & KONT_POHYB))
  848. mesh_env_maping_spec(p_mesh, get_matrix_camera_point(), p_mat);
  849. // Nastaveni polygon-offsetu
  850. if (kflag & KONT_PLG_OFFSET) {
  851. glEnable(GL_POLYGON_OFFSET_FILL);
  852. glPolygonOffset(-1.0f, -2.0f);
  853. }
  854. // Rendering samotneho meshe
  855. if (p_mesh->p_data->m2flag & (MAT2_SPECULAR | MAT2_ENV_SPEC) ||
  856. p_mesh->p_data->kflag & KONT_DRAW_SPEC) {
  857. ber_kresli_mesh_v2(p_mesh, p_mat);
  858. }
  859. else {
  860. ber_kresli_mesh_v1(p_mesh, p_mat);
  861. }
  862. // Smazani polygon-offsetu
  863. if (kflag & KONT_PLG_OFFSET) {
  864. glDisable(GL_POLYGON_OFFSET_FILL);
  865. }
  866. // Odflagovani meshe
  867. if (kflag & KONT_POHYB_ZRUS) {
  868. p_mesh->p_data->kflag &= ~(KONT_POHYB_ZRUS | KONT_POHYB);
  869. }
  870. // Pripadne zapnuti mlhy
  871. if (p_mesh->p_data->kflag & KONT_NO_FOG) {
  872. enable_fog_causal();
  873. }
  874. else {
  875. // Pripadne vypnuti mlhy
  876. if (p_mesh->p_mlha) {
  877. if (p_ber->p_mlha_akt) {
  878. nastav_fog(p_ber->p_mlha_akt);
  879. }
  880. else {
  881. disable_fog();
  882. }
  883. }
  884. }
  885. }
  886. int ber_nastav_material_single_poly_multi_spec(EDIT_MATERIAL * p_smat,
  887. EDIT_MATERIAL * p_mat, dword kflag)
  888. {
  889. MATERIAL_TEXT_OLD *p_stg;
  890. MATERIAL_TEXT_OLD *p_stg_smat;
  891. int i, s, t, rezerva_smat, rezerva_mat, pozice_smat, stage_smat, poly_text;
  892. /* Nastaveni spekularni barvy
  893. */
  894. if (p_mat->flag2 & (MAT2_SPECULAR | MAT2_ENV_SPEC)
  895. || kflag & KONT_DRAW_SPEC)
  896. specular_on();
  897. else
  898. specular_off();
  899. /* Nastaveni pruhlednosti
  900. */
  901. if (kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) { // ... prehozeni stage bloku + 50
  902. set_alfa_blok(STATE_BLOK_PRUHL);
  903. }
  904. else {
  905. //... nahod aktualni alfa-stage
  906. /* Alfa-blending
  907. */
  908. set_alfa_blok(p_mat->alfa_state);
  909. }
  910. /* Test na duplicitu materialu
  911. */
  912. if (!p_mat || __p_last_mat == p_mat)
  913. return (FALSE);
  914. __p_last_mat = p_mat;
  915. /* Nahozeni matrose-plazivce
  916. */
  917. if (!p_smat || !p_smat->p_text[0]->load || p_mat->flag & MAT_NO_SCMT) {
  918. p_stg = p_mat->text_state;
  919. t = 0;
  920. for (i = 0; i < MAT_TEXTUR; i++) {
  921. if ((s = p_stg->text_stage) != K_CHYBA) {
  922. if ((t =
  923. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  924. 1)) == K_CHYBA)
  925. break;
  926. }
  927. else { // defaultni stage - nic
  928. text_stage_func_nic_poly(t + 1, t);
  929. break;
  930. }
  931. p_stg++;
  932. }
  933. }
  934. else {
  935. p_stg = p_mat->text_state;
  936. p_stg_smat = p_smat->text_state;
  937. pozice_smat = p_smat->smaterial_pozice;
  938. stage_smat = p_stg_smat->text_stage;
  939. if (p_smat->flag & MAT_SCENE_NUTNY) {
  940. rezerva_smat = p_smat->textur + 1;
  941. rezerva_mat = 1;
  942. }
  943. else {
  944. rezerva_smat = 0;
  945. rezerva_mat = p_mat->textur + 1;
  946. }
  947. t = 0;
  948. for (i = 0; i < MAT_TEXTUR; i++) {
  949. if (i == pozice_smat) {
  950. if ((t =
  951. p_text_stage_func[stage_smat] (p_smat,
  952. text_stage_edit_blok + stage_smat, p_stg_smat, t,
  953. rezerva_mat)) == K_CHYBA)
  954. break;
  955. rezerva_smat = 1;
  956. }
  957. if ((s = p_stg->text_stage) != K_CHYBA) {
  958. if ((t =
  959. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  960. rezerva_smat)) == K_CHYBA)
  961. break;
  962. }
  963. else { // defaultni stage - nic - konec
  964. break;
  965. }
  966. p_stg++;
  967. }
  968. poly_text = t++;
  969. if (i < pozice_smat) {
  970. t =
  971. p_text_stage_func[stage_smat] (p_smat,
  972. text_stage_edit_blok + stage_smat, p_stg_smat, t, 1);
  973. }
  974. text_stage_func_nic_poly(t, poly_text);
  975. }
  976. /* Nastaveni difusni barvy
  977. */
  978. if (p_mat->flag2 & MAT2_DIFFUSE) {
  979. diffuse_on();
  980. }
  981. else {
  982. diffuse_off(p_mat->dxmat.diffuse_r, p_mat->dxmat.diffuse_g,
  983. p_mat->dxmat.diffuse_b, p_mat->dxmat.diffuse_a);
  984. }
  985. /* Nastaveni z-bufferu
  986. */
  987. deph_test_set((~p_mat->flag) & MAT_NO_ZTEST);
  988. zmask_set((~p_mat->flag) & MAT_NO_ZMASK);
  989. /* Nastaveni cullingu
  990. */
  991. if (p_mat->flag & MAT_NO_CULL)
  992. cull_off();
  993. else
  994. cull_on();
  995. return (TRUE);
  996. }
  997. int ber_nastav_material_single_poly_multi(EDIT_MATERIAL * p_smat,
  998. EDIT_MATERIAL * p_mat, dword kflag)
  999. {
  1000. MATERIAL_TEXT_OLD *p_stg;
  1001. MATERIAL_TEXT_OLD *p_stg_smat;
  1002. int i, s, t, rezerva_smat, rezerva_mat, pozice_smat, stage_smat, poly_text;
  1003. /* Nastaveni pruhlednosti
  1004. */
  1005. if (kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) { // ... prehozeni stage bloku + 50
  1006. set_alfa_blok(STATE_BLOK_PRUHL);
  1007. }
  1008. else {
  1009. //... nahod aktualni alfa-stage
  1010. /* Alfa-blending
  1011. */
  1012. set_alfa_blok(p_mat->alfa_state);
  1013. }
  1014. /* Test na duplicitu materialu
  1015. */
  1016. if (!p_mat || __p_last_mat == p_mat)
  1017. return (FALSE);
  1018. __p_last_mat = p_mat;
  1019. /* Nahozeni matrose-plazivce
  1020. */
  1021. if (!p_smat || !p_smat->p_text[0]->load || p_mat->flag & MAT_NO_SCMT) {
  1022. p_stg = p_mat->text_state;
  1023. t = 0;
  1024. for (i = 0; i < MAT_TEXTUR; i++) {
  1025. if ((s = p_stg->text_stage) != K_CHYBA) {
  1026. if ((t =
  1027. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  1028. 1)) == K_CHYBA)
  1029. break;
  1030. }
  1031. else { // defaultni stage - nic
  1032. text_stage_func_nic_poly(t + 1, t);
  1033. break;
  1034. }
  1035. p_stg++;
  1036. }
  1037. }
  1038. else {
  1039. p_stg = p_mat->text_state;
  1040. p_stg_smat = p_smat->text_state;
  1041. pozice_smat = p_smat->smaterial_pozice;
  1042. stage_smat = p_stg_smat->text_stage;
  1043. if (p_smat->flag & MAT_SCENE_NUTNY) {
  1044. rezerva_smat = p_smat->textur + 1;
  1045. rezerva_mat = 1;
  1046. }
  1047. else {
  1048. rezerva_smat = 0;
  1049. rezerva_mat = p_mat->textur + 1;
  1050. }
  1051. t = 0;
  1052. for (i = 0; i < MAT_TEXTUR; i++) {
  1053. if (i == pozice_smat) {
  1054. if ((t =
  1055. p_text_stage_func[stage_smat] (p_smat,
  1056. text_stage_edit_blok + stage_smat, p_stg_smat, t,
  1057. rezerva_mat)) == K_CHYBA)
  1058. break;
  1059. rezerva_smat = 1;
  1060. }
  1061. if ((s = p_stg->text_stage) != K_CHYBA) {
  1062. if ((t =
  1063. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t,
  1064. rezerva_smat)) == K_CHYBA)
  1065. break;
  1066. }
  1067. else { // defaultni stage - nic - konec
  1068. break;
  1069. }
  1070. p_stg++;
  1071. }
  1072. poly_text = t++;
  1073. if (i < pozice_smat) {
  1074. t =
  1075. p_text_stage_func[stage_smat] (p_smat,
  1076. text_stage_edit_blok + stage_smat, p_stg_smat, t, 1);
  1077. }
  1078. text_stage_func_nic_poly(t, poly_text);
  1079. }
  1080. /* Nastaveni difusni barvy
  1081. */
  1082. if (p_mat->flag2 & MAT2_DIFFUSE) {
  1083. diffuse_on();
  1084. }
  1085. else {
  1086. diffuse_off(p_mat->dxmat.diffuse_r, p_mat->dxmat.diffuse_g,
  1087. p_mat->dxmat.diffuse_b, p_mat->dxmat.diffuse_a);
  1088. }
  1089. /* Nastaveni z-bufferu
  1090. */
  1091. deph_test_set((~p_mat->flag) & MAT_NO_ZTEST);
  1092. zmask_set((~p_mat->flag) & MAT_NO_ZMASK);
  1093. /* Nastaveni cullingu
  1094. */
  1095. if (p_mat->flag & MAT_NO_CULL)
  1096. cull_off();
  1097. else
  1098. cull_on();
  1099. return (TRUE);
  1100. }
  1101. int ber_nastav_material_single_poly_nic(EDIT_MATERIAL * p_smat,
  1102. EDIT_MATERIAL * p_mat, dword kflag)
  1103. {
  1104. MATERIAL_TEXT_OLD *p_stg;
  1105. int s, t;
  1106. /* Nastaveni pruhlednosti
  1107. */
  1108. if (kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) { // ... prehozeni stage bloku + 50
  1109. set_alfa_blok(STATE_BLOK_PRUHL);
  1110. }
  1111. else {
  1112. //... nahod aktualni alfa-stage
  1113. /* Alfa-blending
  1114. */
  1115. set_alfa_blok(p_mat->alfa_state);
  1116. }
  1117. /* Test na duplicitu materialu
  1118. */
  1119. if (!p_mat || __p_last_mat == p_mat)
  1120. return (FALSE);
  1121. __p_last_mat = p_mat;
  1122. /* Nahozeni matrose-plazivce
  1123. */
  1124. p_stg = p_mat->text_state;
  1125. t = 0;
  1126. if ((s = p_stg->text_stage) != K_CHYBA) {
  1127. p_text_stage_func[s] (p_mat, text_stage_edit_blok + s, p_stg, t, 1);
  1128. }
  1129. else { // defaultni stage - nic
  1130. text_stage_func_nic_poly(t + 1, t);
  1131. }
  1132. /* Nastaveni difusni barvy
  1133. */
  1134. if (p_mat->flag2 & MAT2_DIFFUSE) {
  1135. diffuse_on();
  1136. }
  1137. else {
  1138. diffuse_off(p_mat->dxmat.diffuse_r, p_mat->dxmat.diffuse_g,
  1139. p_mat->dxmat.diffuse_b, p_mat->dxmat.diffuse_a);
  1140. }
  1141. /* Nastaveni z-bufferu
  1142. */
  1143. deph_test_set((~p_mat->flag) & MAT_NO_ZTEST);
  1144. zmask_set((~p_mat->flag) & MAT_NO_ZMASK);
  1145. /* Nastaveni cullingu
  1146. */
  1147. if (p_mat->flag & MAT_NO_CULL)
  1148. cull_off();
  1149. else
  1150. cull_on();
  1151. return (TRUE);
  1152. }
  1153. /* Rendering bez spekularu
  1154. */
  1155. void ber_kresli_poly_array(EDIT_MESH_POLY * p_poly, EDIT_MATERIAL ** p_mat)
  1156. {
  1157. int l, last = 0;
  1158. /* Ma se poly uploadoat do graficke pameti?
  1159. */
  1160. if (p_poly->kflag & KONT_UPLOAD) {
  1161. poly_vertex_array_upload(p_poly);
  1162. p_poly->kflag &= ~KONT_UPLOAD;
  1163. }
  1164. assert(p_mat[p_poly->material]);
  1165. ber_nastav_material_single_poly(p_ber->p_smat, p_mat[p_poly->material],
  1166. p_poly->kflag);
  1167. poly_vertex_array_set(p_poly);
  1168. #ifdef DEBUG_MOD
  1169. p_ber->debug.poly++;
  1170. p_ber->debug.facu += p_poly->facenum;
  1171. p_ber->debug.bodu += p_poly->facenum;
  1172. #endif
  1173. for (l = 0; l < p_poly->lightnum; l++) {
  1174. text_set(p_poly->p_light[l]->text, GL_TEXTURE_2D);
  1175. glDrawArrays(GL_TRIANGLES, last, p_poly->p_lightnum[l]);
  1176. last += p_poly->p_lightnum[l];
  1177. }
  1178. }
  1179. /* Rendering vcetne spekularu
  1180. */
  1181. void ber_kresli_poly_vertex_multitext_specular(EDIT_MESH_POLY * p_poly,
  1182. EDIT_MATERIAL ** p_mat)
  1183. {
  1184. TEXT_KOORD *p_koord;
  1185. EDIT_MATERIAL *p_amat = p_mat[p_poly->material];
  1186. int l, i, last = 0;
  1187. int kflag = p_poly->kflag;
  1188. int norm = glstav_pn_triangles
  1189. || p_poly->
  1190. m2flag & (MAT2_CALC_MAP1 | MAT2_CALC_MAP2 | MAT2_CALC_MAP3 |
  1191. MAT2_CALC_MAP4);
  1192. int spec = (p_amat->flag2 & (MAT2_SPECULAR | MAT2_ENV_SPEC)
  1193. || kflag & KONT_DRAW_SPEC);
  1194. int *p_int, ind;
  1195. assert(p_amat);
  1196. ber_nastav_material_single_poly(p_ber->p_smat, p_amat, kflag);
  1197. #ifdef DEBUG_MOD
  1198. p_ber->debug.poly++;
  1199. p_ber->debug.facu += p_poly->facenum;
  1200. p_ber->debug.bodu += p_poly->facenum;
  1201. #endif
  1202. for (l = 0; l < p_poly->lightnum; l++) {
  1203. text_set(p_poly->p_light[l]->text, GL_TEXTURE_2D);
  1204. glBegin(GL_TRIANGLES);
  1205. p_koord = p_poly->p_koord + last;
  1206. for (i = 0; i < p_poly->p_lightnum[l]; i++) {
  1207. p_int = glstav_text_map_indicie;
  1208. if ((ind = *p_int) != K_CHYBA)
  1209. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,
  1210. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1211. p_int++;
  1212. if ((ind = *p_int) != K_CHYBA)
  1213. glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,
  1214. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1215. p_int++;
  1216. if ((ind = *p_int) != K_CHYBA)
  1217. glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,
  1218. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1219. p_int++;
  1220. if ((ind = *p_int) != K_CHYBA)
  1221. glMultiTexCoord2fvARB(GL_TEXTURE3_ARB,
  1222. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1223. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB + glstav_text_poly_indicie,
  1224. &p_poly->p_koord[last + i].tul);
  1225. if (norm)
  1226. glNormal3fv(&p_koord[i].nx);
  1227. if (spec)
  1228. glSecondaryColor3fvEXT(&p_koord[i].sr);
  1229. glColor4fv(&p_koord[i].dr);
  1230. glVertex3fv(&p_koord[i].x);
  1231. }
  1232. glEnd();
  1233. last += p_poly->p_lightnum[l];
  1234. }
  1235. }
  1236. void ber_kresli_poly_vertex_multitext(EDIT_MESH_POLY * p_poly,
  1237. EDIT_MATERIAL ** p_mat)
  1238. {
  1239. TEXT_KOORD *p_koord;
  1240. int l, i, last = 0;
  1241. int norm = glstav_pn_triangles
  1242. || p_poly->
  1243. m2flag & (MAT2_CALC_MAP1 | MAT2_CALC_MAP2 | MAT2_CALC_MAP3 |
  1244. MAT2_CALC_MAP4);
  1245. int *p_int, ind;
  1246. assert(p_mat[p_poly->material]);
  1247. ber_nastav_material_single_poly(p_ber->p_smat, p_mat[p_poly->material],
  1248. p_poly->kflag);
  1249. #ifdef DEBUG_MOD
  1250. p_ber->debug.poly++;
  1251. p_ber->debug.facu += p_poly->facenum;
  1252. p_ber->debug.bodu += p_poly->facenum;
  1253. #endif
  1254. for (l = 0; l < p_poly->lightnum; l++) {
  1255. text_set(p_poly->p_light[l]->text, GL_TEXTURE_2D);
  1256. glBegin(GL_TRIANGLES);
  1257. p_koord = p_poly->p_koord + last;
  1258. for (i = 0; i < p_poly->p_lightnum[l]; i++) {
  1259. p_int = glstav_text_map_indicie;
  1260. if ((ind = *p_int) != K_CHYBA)
  1261. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB,
  1262. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1263. p_int++;
  1264. if ((ind = *p_int) != K_CHYBA)
  1265. glMultiTexCoord2fvARB(GL_TEXTURE1_ARB,
  1266. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1267. p_int++;
  1268. if ((ind = *p_int) != K_CHYBA)
  1269. glMultiTexCoord2fvARB(GL_TEXTURE2_ARB,
  1270. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1271. p_int++;
  1272. if ((ind = *p_int) != K_CHYBA)
  1273. glMultiTexCoord2fvARB(GL_TEXTURE3_ARB,
  1274. ((float *) (&p_poly->p_koord[last + i].tu1)) + ((ind) << 1));
  1275. glMultiTexCoord2fvARB(GL_TEXTURE0_ARB + glstav_text_poly_indicie,
  1276. &p_poly->p_koord[last + i].tul);
  1277. glColor4fv(&p_koord[i].dr);
  1278. if (norm)
  1279. glNormal3fv(&p_koord[i].nx);
  1280. glVertex3fv(&p_koord[i].x);
  1281. }
  1282. glEnd();
  1283. last += p_poly->p_lightnum[l];
  1284. }
  1285. }
  1286. void ber_kresli_poly_vertex(EDIT_MESH_POLY * p_poly, EDIT_MATERIAL ** p_mat)
  1287. {
  1288. TEXT_KOORD *p_koord;
  1289. int l, i, last = 0;
  1290. int norm = glstav_pn_triangles
  1291. || p_poly->
  1292. m2flag & (MAT2_CALC_MAP1 | MAT2_CALC_MAP2 | MAT2_CALC_MAP3 |
  1293. MAT2_CALC_MAP4);
  1294. assert(p_mat[p_poly->material]);
  1295. ber_nastav_material_single_poly(p_ber->p_smat, p_mat[p_poly->material],
  1296. p_poly->kflag);
  1297. #ifdef DEBUG_MOD
  1298. p_ber->debug.poly++;
  1299. p_ber->debug.facu += p_poly->facenum;
  1300. p_ber->debug.bodu += p_poly->facenum;
  1301. #endif
  1302. if (norm) {
  1303. for (l = 0; l < p_poly->lightnum; l++) {
  1304. glBegin(GL_TRIANGLES);
  1305. p_koord = p_poly->p_koord + last;
  1306. for (i = 0; i < p_poly->p_lightnum[l]; i++) {
  1307. glTexCoord2fv(&p_koord[i].tu1);
  1308. glColor4fv(&p_koord[i].dr);
  1309. glNormal3fv(&p_koord[i].nx);
  1310. glVertex3fv(&p_koord[i].x);
  1311. }
  1312. glEnd();
  1313. last += p_poly->p_lightnum[l];
  1314. }
  1315. }
  1316. else {
  1317. for (l = 0; l < p_poly->lightnum; l++) {
  1318. glBegin(GL_TRIANGLES);
  1319. p_koord = p_poly->p_koord + last;
  1320. for (i = 0; i < p_poly->p_lightnum[l]; i++) {
  1321. glTexCoord2fv(&p_koord[i].tu1);
  1322. glColor4fv(&p_koord[i].dr);
  1323. glVertex3fv(&p_koord[i].x);
  1324. }
  1325. glEnd();
  1326. last += p_poly->p_lightnum[l];
  1327. }
  1328. }
  1329. }
  1330. inline void ber_kresli_poly(EDIT_MESH_POLY * p_poly, EDIT_MATERIAL ** p_mat)
  1331. {
  1332. int kamera_zmena = p_ber->kamera.zmena || p_ber->kamera.zmena_last;
  1333. /* Pripadne vypnuti mlhy
  1334. */
  1335. if (p_poly->kflag & KONT_NO_FOG) {
  1336. disable_fog_causal();
  1337. }
  1338. else {
  1339. /* Pripadne zapnuti mlhy
  1340. */
  1341. if (p_poly->p_mlha) {
  1342. if (!p_ber->p_mlha_akt)
  1343. enable_fog();
  1344. nastav_fog(p_poly->p_mlha);
  1345. }
  1346. }
  1347. #ifdef DEBUG_MOD_OBALKY
  1348. ber_kresli_obalku_poly(p_poly);
  1349. #endif
  1350. /* Env-spec mapping
  1351. */
  1352. if (p_poly->m2flag & MAT2_ENV_SPEC && kamera_zmena)
  1353. poly_env_maping_spec(p_poly, p_mat[p_poly->material],
  1354. get_matrix_camera_point());
  1355. /* Rednering poly-listu
  1356. */
  1357. ber_kresli_poly_v1(p_poly, p_mat);
  1358. /* Pripadne zapnuti mlhy
  1359. */
  1360. if (p_poly->kflag & KONT_NO_FOG) {
  1361. enable_fog_causal();
  1362. }
  1363. else {
  1364. /* Pripadne vypnuti mlhy
  1365. */
  1366. if (p_poly->p_mlha) {
  1367. if (p_ber->p_mlha_akt) {
  1368. nastav_fog(p_ber->p_mlha_akt);
  1369. }
  1370. else {
  1371. disable_fog();
  1372. }
  1373. }
  1374. }
  1375. }
  1376. /* Rendering fleku
  1377. */
  1378. void ber_kresli_fleky(G_KONFIG * p_ber, FLEK * p_topflek)
  1379. {
  1380. BOD *p_pos, *p_nx, *p_nz;
  1381. FLEK *p_flek = p_topflek;
  1382. glEnable(GL_POLYGON_OFFSET_FILL);
  1383. glPolygonOffset(-1.0f, p_flek->bias);
  1384. zmask_set_fleky(FALSE);
  1385. while (p_flek) {
  1386. if (!(p_flek->flag & FLEK_NEKRESLIT)) {
  1387. ber_nastav_material_single(p_ber->p_smat,
  1388. p_ber->p_mat[p_flek->material], FALSE);
  1389. glColor3f(1.0f, 1.0f, 1.0f);
  1390. if (p_flek->mesh != K_CHYBA) {
  1391. set_matrix_world(&p_ber->p_mesh[p_flek->mesh]->m);
  1392. }
  1393. p_pos = &p_flek->p;
  1394. p_nx = &p_flek->nx;
  1395. p_nz = &p_flek->nz;
  1396. glBegin(GL_TRIANGLE_STRIP);
  1397. glTexCoord2f(p_flek->u[0], p_flek->v[0]);
  1398. glVertex3f(p_pos->x - p_nx->x - p_nz->x,
  1399. p_pos->y - p_nx->y - p_nz->y, p_pos->z - p_nx->z - p_nz->z);
  1400. glTexCoord2f(p_flek->u[1], p_flek->v[1]);
  1401. glVertex3f(p_pos->x + p_nx->x - p_nz->x,
  1402. p_pos->y + p_nx->y - p_nz->y, p_pos->z + p_nx->z - p_nz->z);
  1403. glTexCoord2f(p_flek->u[3], p_flek->v[3]);
  1404. glVertex3f(p_pos->x - p_nx->x + p_nz->x,
  1405. p_pos->y - p_nx->y + p_nz->y, p_pos->z - p_nx->z + p_nz->z);
  1406. glTexCoord2f(p_flek->u[2], p_flek->v[2]);
  1407. glVertex3f(p_pos->x + p_nx->x + p_nz->x,
  1408. p_pos->y + p_nx->y + p_nz->y, p_pos->z + p_nx->z + p_nz->z);
  1409. glEnd();
  1410. }
  1411. p_flek = p_flek->p_next;
  1412. }
  1413. glDisable(GL_POLYGON_OFFSET_FILL);
  1414. zmask_set_fleky(TRUE);
  1415. }
  1416. /* Porovnani pruhlednych objektu
  1417. */
  1418. static int ber_renderuj_scenu_pruhledne_compare(const void *p_r1,
  1419. const void *p_r2)
  1420. {
  1421. return (ftoi((((PRUHLEDNY_OBJEKT *) p_r2)->vzdal -
  1422. ((PRUHLEDNY_OBJEKT *) p_r1)->vzdal) * 1000.0f));
  1423. }
  1424. /* Render hierarchie pruhlednych objektu
  1425. */
  1426. void ber_renderuj_scenu_pruhledne(G_KONFIG * p_ber)
  1427. {
  1428. int i, last = K_CHYBA;
  1429. if (p_ber->prhlnum) {
  1430. qsort(p_ber->prhl, p_ber->prhlnum, sizeof(p_ber->prhl[0]),
  1431. ber_renderuj_scenu_pruhledne_compare);
  1432. for (i = 0; i < p_ber->prhlnum; i++) { // render pruhlednych objektu odzadu
  1433. switch (p_ber->prhl[i].typ) {
  1434. case PRUHLEDNY_MESH:
  1435. if (last != PRUHLEDNY_MESH) {
  1436. last = PRUHLEDNY_MESH;
  1437. __p_last_mat = NULL;
  1438. }
  1439. ber_kresli_mesh((GAME_MESH_OLD *) p_ber->prhl[i].p_objekt,
  1440. p_ber->p_mat);
  1441. break;
  1442. case PRUHLEDNY_POLY:
  1443. if (last != PRUHLEDNY_POLY) {
  1444. last = PRUHLEDNY_POLY;
  1445. ber_render_polylistu_start();
  1446. __p_last_mat = NULL;
  1447. }
  1448. ber_kresli_poly((EDIT_MESH_POLY *) p_ber->prhl[i].p_objekt,
  1449. p_ber->p_mat);
  1450. break;
  1451. default:
  1452. break;
  1453. }
  1454. }
  1455. }
  1456. }
  1457. void ber_renderuj_scenu_obyc(int zrc)
  1458. {
  1459. EDIT_MESH_POLY *p_poly;
  1460. GAME_MESH_OLD *p_mesh;
  1461. int flag = zrc ? KONT_VIDITELNY_ZRC : KONT_VIDITELNY;
  1462. /* Vyrobi list pruhlednosti
  1463. */
  1464. ber_render_list_vyrob_pruhlist(p_ber);
  1465. /* Reset posledniho materialu
  1466. */
  1467. __p_last_mat = NULL;
  1468. #ifdef DEBUG_MOD
  1469. if (p_ber->debug_draty)
  1470. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  1471. #endif
  1472. /*
  1473. Render levelu - budu kreslit podle listu meshu
  1474. */
  1475. ber_mesh_render_list_reset(p_ber);
  1476. while ((p_mesh =
  1477. ber_mesh_render_list_next_flag(p_ber, flag, KONT_VIDITELNY_PRUHL))) {
  1478. ber_kresli_mesh(p_mesh, p_ber->p_mat);
  1479. }
  1480. /* Reset posledniho materialu
  1481. */
  1482. __p_last_mat = NULL;
  1483. /*
  1484. Render poly-listu
  1485. */
  1486. ber_render_polylistu_start();
  1487. ber_poly_render_list_reset(p_ber);
  1488. while ((p_poly =
  1489. ber_poly_render_list_next_flag(p_ber, flag, KONT_VIDITELNY_PRUHL))) {
  1490. ber_kresli_poly(p_poly, p_ber->p_mat);
  1491. }
  1492. /* Reset posledniho materialu
  1493. */
  1494. __p_last_mat = NULL;
  1495. /* Zjisti viditelne flare
  1496. */
  1497. if (p_ber->p_flare)
  1498. ber_viditelnost_flare(p_ber, p_ber->p_flare);
  1499. /* Kresli fleky sceny
  1500. */
  1501. if (!zrc) {
  1502. set_matrix_world_init();
  1503. disable_fog_causal();
  1504. if (p_ber->p_fleky)
  1505. ber_kresli_fleky(p_ber, p_ber->p_fleky);
  1506. if (p_ber->p_fleky_mesh)
  1507. ber_kresli_fleky(p_ber, p_ber->p_fleky_mesh);
  1508. enable_fog_causal();
  1509. }
  1510. /* Render casticoveho systemu
  1511. */
  1512. pe_renderuj(p_ber);
  1513. /* Vykresli viditelne flare
  1514. */
  1515. if (p_ber->p_flare) {
  1516. disable_fog_causal();
  1517. ber_kresli_flare(p_ber, p_ber->p_flare);
  1518. enable_fog_causal();
  1519. }
  1520. /*
  1521. Hromadny render pruhlednych objektu
  1522. */
  1523. ber_renderuj_scenu_pruhledne(p_ber);
  1524. #ifdef DEBUG_MOD
  1525. if (p_ber->debug_draty)
  1526. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  1527. #endif
  1528. }
  1529. void ber_calc_clip_focus(G_KONFIG * p_ber)
  1530. {
  1531. BOD cp, *p_a, *p_b, *p_c, *p_d;
  1532. cp.x = p_ber->p_invcam->_41;
  1533. cp.y = p_ber->p_invcam->_42;
  1534. cp.z = p_ber->p_invcam->_43;
  1535. p_a = p_ber->zrc.p;
  1536. p_b = p_ber->zrc.p + 1;
  1537. p_c = p_ber->zrc.p + 2;
  1538. p_d = p_ber->zrc.p + 3;
  1539. calc_drovinu_bod(p_b, p_a, &cp, p_ber->zrc.r);
  1540. calc_drovinu_bod(p_d, p_b, &cp, p_ber->zrc.r + 1);
  1541. calc_drovinu_bod(p_c, p_d, &cp, p_ber->zrc.r + 2);
  1542. calc_drovinu_bod(p_a, p_c, &cp, p_ber->zrc.r + 3);
  1543. calc_drovinu_bod(p_a, p_c, p_b, p_ber->zrc.r + 4);
  1544. }
  1545. void ber_zrcadlo_nastav(void)
  1546. {
  1547. // Nastaveni propriet k zrcadlu -> klip roviny a pod.
  1548. ber_calc_clip_focus(p_ber);
  1549. assert(GL_MAX_CLIP_PLANES >= 4);
  1550. glEnable(GL_CLIP_PLANE0);
  1551. glEnable(GL_CLIP_PLANE1);
  1552. glEnable(GL_CLIP_PLANE2);
  1553. glEnable(GL_CLIP_PLANE3);
  1554. glEnable(GL_CLIP_PLANE4);
  1555. glClipPlane(GL_CLIP_PLANE0, (double *) (p_ber->zrc.r));
  1556. glClipPlane(GL_CLIP_PLANE1, (double *) (p_ber->zrc.r + 1));
  1557. glClipPlane(GL_CLIP_PLANE2, (double *) (p_ber->zrc.r + 2));
  1558. glClipPlane(GL_CLIP_PLANE3, (double *) (p_ber->zrc.r + 3));
  1559. glClipPlane(GL_CLIP_PLANE4, (double *) (p_ber->zrc.r + 4));
  1560. cull_front();
  1561. set_matrix_world_top(&p_ber->zrc.ref);
  1562. set_matrix_camera_project(p_ber->p_project);
  1563. }
  1564. void ber_zrcadlo_zrus(void)
  1565. {
  1566. // Zruseni klipovacich rovin
  1567. glDisable(GL_CLIP_PLANE0);
  1568. glDisable(GL_CLIP_PLANE1);
  1569. glDisable(GL_CLIP_PLANE2);
  1570. glDisable(GL_CLIP_PLANE3);
  1571. glDisable(GL_CLIP_PLANE4);
  1572. // Zruseni cullingu
  1573. cull_back();
  1574. ret_matrix_world_top();
  1575. set_matrix_camera_project(p_ber->p_project);
  1576. // Reset materialu
  1577. __p_last_mat = NULL;
  1578. // Vykresleni zrcadloveho poly
  1579. {
  1580. ZDRCADLO_DESC_POLY *p_poly = p_ber->zrc.p_poly;
  1581. int p;
  1582. while (p_poly) {
  1583. p = p_poly->poly;
  1584. if (p != K_CHYBA && p_ber->p_poly[p].kflag & KONT_ZRCADLO) {
  1585. ber_render_polylistu_start();
  1586. ber_kresli_poly(p_ber->p_poly + p, p_ber->p_mat);
  1587. }
  1588. p_poly = p_poly->p_next;
  1589. }
  1590. }
  1591. }
  1592. void ber_kresli_kofoli_cary(void)
  1593. {
  1594. KOFOLOVA_CARA *p_cara;
  1595. int i;
  1596. if (p_ber->car_a_kouzel && p_ber->p_cary) {
  1597. deph_test_set(0);
  1598. glBegin(GL_LINES);
  1599. for (i = 0; i < p_ber->car_a_kouzel; i++) {
  1600. p_cara = p_ber->p_cary + i;
  1601. glColor3fv((float *) &p_cara->b1);
  1602. glVertex3fv((float *) &p_cara->p1);
  1603. glColor3fv((float *) &p_cara->b2);
  1604. glVertex3fv((float *) &p_cara->p2);
  1605. }
  1606. glEnd();
  1607. deph_test_set(1);
  1608. }
  1609. }
  1610. void ber_reset_render(void)
  1611. {
  1612. int i;
  1613. glstav_text_akt = K_CHYBA;
  1614. blend_off();
  1615. specular_off();
  1616. set_alfa_blok(0);
  1617. zmask_set(TRUE);
  1618. for (i = 0; i < MAT_TEXTUR; i++) {
  1619. if (text_set_num(i)) {
  1620. text_off(GL_TEXTURE_1D);
  1621. text_off(GL_TEXTURE_2D);
  1622. glstav_textury_1d[i] = FALSE;
  1623. glstav_textury_2d[i] = FALSE;
  1624. glstav_last_text_1d[i] = FALSE;
  1625. glstav_last_text_2d[i] = FALSE;
  1626. glstav_text_blok[i] = K_CHYBA;
  1627. }
  1628. }
  1629. }
  1630. /*
  1631. Redering:
  1632. 1. zrcadlova scena
  1633. 2. deska zdcadla pruhedne + z_bufer on
  1634. 3. vrchni scena
  1635. */
  1636. void ber_renderuj_scenu(void)
  1637. {
  1638. int kamera_zmena = p_ber->kamera.zmena || p_ber->kamera.zmena_last;
  1639. #ifdef DEBUG_MOD
  1640. memset(&p_ber->debug, 0, sizeof(p_ber->debug));
  1641. #endif
  1642. if (!p_ber->conf_menu_render) {
  1643. /* Reset nastaveni textur & stage
  1644. */
  1645. ber_reset_render();
  1646. text_sharp(txconf.text_ostrost);
  1647. /* Animace kamer (Polarni/3ds)
  1648. */
  1649. if (p_ber->kamera.aktivni & GAME_KAMERA_ANIMACE)
  1650. kani_updatuj(p_ber);
  1651. /* Urci viditelnost meshu
  1652. */
  1653. ber_render_list_vyrob(p_ber, p_ber->zrc_akt, kamera_zmena);
  1654. /* Update materialovych animaci
  1655. */
  1656. amat_updatuj(p_ber);
  1657. /* Update animace textur
  1658. */
  1659. tani_updatuj(p_ber);
  1660. /* Update globalni animace
  1661. */
  1662. rani_updatuj(p_ber);
  1663. /* Updatuje mesh-key-frame animaci
  1664. */
  1665. lani_updatuj(p_ber);
  1666. /* Update chapadelniku
  1667. */
  1668. chani_updatuj(p_ber);
  1669. /* Update casticovych systemu
  1670. */
  1671. pe_updatuj(p_ber);
  1672. /* Animace svetel
  1673. */
  1674. sdla_updatuj(p_ber);
  1675. edla_updatuj(p_ber);
  1676. /* Update dynamickych & statickych svetel
  1677. */
  1678. dl_updatuj(p_ber);
  1679. /* Update vodniho systemu
  1680. */
  1681. vod_updatuj(p_ber->p_voda);
  1682. /* Zapni/povol rendering mlhy
  1683. */
  1684. ber_renderuj_mlhu(p_ber);
  1685. /* Zpruhledneni prvku pred kamerou
  1686. */
  1687. ber_zpruhledni_prvky(p_ber);
  1688. /* Zpruhledneni objekty pred kamerou
  1689. */
  1690. ber_kamera_zpruhledni_objekty(p_ber);
  1691. if (p_ber->karmin_aktivni) {
  1692. glClear(GL_DEPTH_BUFFER_BIT);
  1693. if (p_ber->conf_barva_pozadi_pouzit)
  1694. glClear(GL_COLOR_BUFFER_BIT);
  1695. set_matrix_world_init();
  1696. #ifdef DEBUG_MOD_OBALKY
  1697. obbtree_kresli(&p_ber->obbtree, DDRGB(1, 0, 0));
  1698. #endif
  1699. vertex_array_start_render();
  1700. if (p_ber->zrc_akt) {
  1701. ber_zrcadlo_nastav();
  1702. ber_renderuj_scenu_obyc(TRUE);
  1703. ber_zrcadlo_zrus();
  1704. }
  1705. ber_renderuj_scenu_obyc(FALSE);
  1706. vertex_array_stop_render();
  1707. ber_reset_render();
  1708. set_matrix_world_init();
  1709. ber_kresli_kofoli_cary();
  1710. #ifdef DEBUG_MOD
  1711. set_matrix_2d(OXRES, OYRES);
  1712. ber_tiskni_statistiku(p_ber);
  1713. ret_matrix_2d();
  1714. if (p_ber->debug_light)
  1715. dl_renderuj_svetla(p_ber);
  1716. //ber_test_render_mysi();
  1717. #endif
  1718. /* Nastaveni flagu zmeny kamery
  1719. */
  1720. p_ber->kamera.zmena_last = p_ber->kamera.zmena;
  1721. p_ber->kamera.zmena = FALSE;
  1722. reset_kamera_flag();
  1723. /* Vypnuti scale-faktoru texturoveho filtru
  1724. */
  1725. text_sharp(0.0f);
  1726. }
  1727. }
  1728. /* Update fps
  1729. */
  1730. ber_updatuj_fps(p_ber);
  1731. /* Kofolovo nastaveni
  1732. */
  1733. text_set_num(0);
  1734. text_on(GL_TEXTURE_2D);
  1735. text_set_blok(0, BLOK_MODULACE);
  1736. }
  1737. /* Prevzato z DX7 SDK */
  1738. void ber_updatuj_fps(G_KONFIG * p_ber)
  1739. {
  1740. #ifdef DEBUG_MOD
  1741. static dword akt = 0;
  1742. static dword end = 0;
  1743. static dword framu = 0;
  1744. #endif
  1745. static dword time[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  1746. static dword fin_time = 0;
  1747. fin_time = timeGetTime() / DELICKA_CASU;
  1748. p_ber->TimeLastFrame = fin_time - p_ber->TimeEndLastFrame;
  1749. p_ber->TimeEndLastFrame = fin_time;
  1750. p_ber->frame++;
  1751. #ifdef DEBUG_MOD
  1752. framu++;
  1753. if (fin_time - end > 1000) {
  1754. p_ber->fps = (1000 * framu) / (float) (fin_time - end);
  1755. end = fin_time;
  1756. framu = 0;
  1757. }
  1758. #endif
  1759. }
  1760. /* Rendering castic
  1761. */
  1762. void pe_kresli_strepiny(G_KONFIG * p_ber, PARMETAC * p_par)
  1763. {
  1764. PAR_STREPINA *p_part;
  1765. EDIT_MATERIAL *p_mat;
  1766. GLMATRIX *p_cam = get_matrix_camera_point();
  1767. BOD up, rg;
  1768. float r1x, r1y, r1z;
  1769. float r2x, r2y, r2z;
  1770. float r3x, r3y, r3z;
  1771. float r4x, r4y, r4z;
  1772. float x, y, z;
  1773. float v1, v2, v3, v4;
  1774. int frame, framelast;
  1775. up.x = p_cam->_12;
  1776. up.y = p_cam->_22;
  1777. up.z = p_cam->_32;
  1778. rg.x = p_cam->_11;
  1779. rg.y = p_cam->_21;
  1780. rg.z = p_cam->_31;
  1781. r1x = -up.x - rg.x;
  1782. r1y = -up.y - rg.y;
  1783. r1z = -up.z - rg.z;
  1784. r2x = -up.x + rg.x;
  1785. r2y = -up.y + rg.y;
  1786. r2z = -up.z + rg.z;
  1787. r3x = up.x - rg.x;
  1788. r3y = up.y - rg.y;
  1789. r3z = up.z - rg.z;
  1790. r4x = up.x + rg.x;
  1791. r4y = up.y + rg.y;
  1792. r4z = up.z + rg.z;
  1793. if (p_par->flag & TPAR_NO_FOG)
  1794. disable_fog_causal();
  1795. p_mat = p_ber->p_mat[p_par->material];
  1796. ber_nastav_material_single(NULL, p_mat, FALSE);
  1797. frame = p_par->flag & TPAR_FRAME;
  1798. if (frame) {
  1799. framelast = amat_get_frame(p_mat);
  1800. frame = (framelast != K_CHYBA);
  1801. }
  1802. p_part = (PAR_STREPINA *) p_par->p_first;
  1803. while (p_part) {
  1804. x = p_part->p.x;
  1805. y = p_part->p.y;
  1806. z = p_part->p.z;
  1807. v1 = p_part->vel1;
  1808. v2 = p_part->vel2;
  1809. v3 = p_part->vel3;
  1810. v4 = p_part->vel4;
  1811. if (frame)
  1812. amat_set_frame_text(p_mat, (int) floor(p_part->frame));
  1813. glColor3f(p_part->barva, p_part->barva, p_part->barva);
  1814. glBegin(GL_TRIANGLE_STRIP);
  1815. glTexCoord2f(p_part->u1, p_part->v1);
  1816. glVertex3f(x + r1x * v1, y + r1y * v1, z + r1z * v1);
  1817. glTexCoord2f(p_part->u2, p_part->v2);
  1818. glVertex3f(x + r2x * v2, y + r2y * v2, z + r2z * v2);
  1819. glTexCoord2f(p_part->u3, p_part->v3);
  1820. glVertex3f(x + r3x * v3, y + r3y * v3, z + r3z * v3);
  1821. glTexCoord2f(p_part->u4, p_part->v4);
  1822. glVertex3f(x + r4x * v4, y + r4y * v4, z + r4z * v4);
  1823. glEnd();
  1824. p_part = p_part->p_next;
  1825. }
  1826. if (frame)
  1827. amat_set_frame_text(p_mat, framelast);
  1828. if (p_par->flag & TPAR_NO_FOG)
  1829. enable_fog_causal();
  1830. }
  1831. void pe_kresli_fleky(G_KONFIG * p_ber, PARMETAC * p_par)
  1832. {
  1833. EDIT_MATERIAL *p_mat;
  1834. PAR_FLEK *p_part;
  1835. BOD *p_bod;
  1836. int frame, framelast;
  1837. if (p_par->flag & TPAR_NO_FOG)
  1838. disable_fog_causal();
  1839. p_mat = p_ber->p_mat[p_par->material];
  1840. frame = p_par->flag & TPAR_FRAME;
  1841. if (frame) {
  1842. framelast = amat_get_frame(p_mat);
  1843. frame = (framelast != K_CHYBA);
  1844. }
  1845. ber_nastav_material_single(p_ber->p_smat, p_mat, FALSE);
  1846. p_part = (PAR_FLEK *) p_par->p_first;
  1847. while (p_part) {
  1848. if (frame)
  1849. amat_set_frame_text(p_mat, (int) floor(p_part->frame));
  1850. glColor4f(p_part->r, p_part->g, p_part->b, p_part->a);
  1851. glBegin(GL_TRIANGLE_STRIP);
  1852. glTexCoord2f(0, 0);
  1853. p_bod = p_part->tmp;
  1854. glVertex3f(p_bod->x, p_bod->y, p_bod->z);
  1855. glTexCoord2f(1, 0);
  1856. p_bod = p_part->tmp + 1;
  1857. glVertex3f(p_bod->x, p_bod->y, p_bod->z);
  1858. glTexCoord2f(0, 1);
  1859. p_bod = p_part->tmp + 2;
  1860. glVertex3f(p_bod->x, p_bod->y, p_bod->z);
  1861. glTexCoord2f(1, 1);
  1862. p_bod = p_part->tmp + 3;
  1863. glVertex3f(p_bod->x, p_bod->y, p_bod->z);
  1864. glEnd();
  1865. p_part = p_part->p_next;
  1866. }
  1867. if (frame)
  1868. amat_set_frame_text(p_mat, framelast);
  1869. if (p_par->flag & TPAR_NO_FOG)
  1870. enable_fog_causal();
  1871. }
  1872. /* Kresli coudy
  1873. */
  1874. void pe_kresli_kour_stopu(G_KONFIG * p_ber, PARMETAC * p_mt)
  1875. {
  1876. GLMATRIX *p_camera_project = get_matrix_camera_project();
  1877. PARMETAC_HNIZDO *p_hnizdo;
  1878. EDIT_MATERIAL *p_mat;
  1879. PAR_KOUR_STOPA *p_par;
  1880. BOD *p_bod, tmp[4], nx, ny, zup, up, zrg, cp, rg;
  1881. float b1x, b1z, b2x, b2z, b3x, b3z, b4x, b4z;
  1882. float b1y, b2y, b3y, b4y;
  1883. float sx, sz;
  1884. float tu, tv;
  1885. float min_x, max_x, min_z, max_z;
  1886. int frame, framelast;
  1887. int clip = p_mt->flag & TPAR_2DCLIP;
  1888. int par3d = p_mt->flag & TPAR_3D;
  1889. int parhl = p_mt->flag & TPAR_HALF_LIFE;
  1890. if (p_mt->flag & TPAR_NO_FOG)
  1891. disable_fog_causal();
  1892. p_mat = p_ber->p_mat[p_mt->material];
  1893. frame = p_mt->flag & TPAR_FRAME;
  1894. if (frame) {
  1895. framelast = amat_get_frame(p_mat);
  1896. frame = (framelast != K_CHYBA);
  1897. }
  1898. if (!par3d) {
  1899. GLMATRIX *p_cam = get_matrix_world_camera();
  1900. zup.x = p_cam->_12;
  1901. zup.y = p_cam->_22;
  1902. zup.z = p_cam->_32;
  1903. zrg.x = p_cam->_11;
  1904. zrg.y = p_cam->_21;
  1905. zrg.z = p_cam->_31;
  1906. }
  1907. if (parhl) {
  1908. GLMATRIX inv;
  1909. invert_matrix(get_matrix_world_camera(), &inv);
  1910. cp.x = inv._41;
  1911. cp.y = inv._42;
  1912. cp.z = inv._43;
  1913. }
  1914. ber_nastav_material_single(NULL, p_mat, FALSE);
  1915. zmask_set_fleky(FALSE);
  1916. cull_off();
  1917. #ifdef DEBUG_MOD
  1918. p_ber->debug.hnizd = 0;
  1919. p_ber->debug.hnizd_vid = 0;
  1920. #endif
  1921. // Prejedu pres vsechny hnizda
  1922. p_hnizdo = p_mt->p_hnizdo;
  1923. while (p_hnizdo) {
  1924. #ifdef DEBUG_MOD_OBALKY
  1925. kresli_oktanovou_bunku_minmax(&p_hnizdo->min, &p_hnizdo->max, DDRGBA(0, 0,
  1926. 0, 1));
  1927. #endif
  1928. #ifdef DEBUG_MOD
  1929. p_ber->debug.hnizd++;
  1930. #endif
  1931. if (kd_visibility(&p_hnizdo->min, &p_hnizdo->max, p_camera_project)) {
  1932. #ifdef DEBUG_MOD
  1933. p_ber->debug.hnizd_vid++;
  1934. #endif
  1935. p_par = (PAR_KOUR_STOPA *) p_hnizdo->p_first;
  1936. while (p_par) {
  1937. if (frame)
  1938. amat_set_frame_text(p_mat, (int) floor(p_par->frame));
  1939. if (!par3d) { // 2d fleky natocene ke kamere - Vypocti nove hodnoty
  1940. vektor_mult_skalar(&zup, p_par->rychlost_x, &up);
  1941. vektor_mult_skalar(&zrg, p_par->rychlost_y, &rg);
  1942. vektor_sub(vektor_sub(&p_par->rp, &up, tmp), &rg, tmp);
  1943. vektor_add(vektor_sub(&p_par->rp, &up, tmp + 1), &rg, tmp + 1);
  1944. vektor_sub(vektor_add(&p_par->rp, &up, tmp + 2), &rg, tmp + 2);
  1945. vektor_add(vektor_add(&p_par->rp, &up, tmp + 3), &rg, tmp + 3);
  1946. }
  1947. else if (par3d || parhl) { // par3d
  1948. if (parhl) {
  1949. BOD t1;
  1950. vektor_soucin(&p_par->nx, vektor_sub(&cp, &p_par->rp, &t1), &ny);
  1951. vektor_norm(&ny);
  1952. vektor_scale(&ny, p_par->rychlost_y);
  1953. vektor_mult_skalar(&p_par->nx, p_par->rychlost_x, &nx);
  1954. }
  1955. else {
  1956. vektor_mult_skalar(&p_par->nx, p_par->rychlost_x, &nx);
  1957. vektor_mult_skalar(&p_par->ny, p_par->rychlost_y, &ny);
  1958. }
  1959. vektor_sub(vektor_sub(&p_par->rp, &nx, tmp), &ny, tmp);
  1960. vektor_sub(vektor_add(&p_par->rp, &nx, tmp + 1), &ny, tmp + 1);
  1961. vektor_add(vektor_sub(&p_par->rp, &nx, tmp + 2), &ny, tmp + 2);
  1962. vektor_add(vektor_add(&p_par->rp, &nx, tmp + 3), &ny, tmp + 3);
  1963. }
  1964. glColor4f(p_par->r, p_par->g, p_par->b, p_par->a);
  1965. if (!clip) {
  1966. glBegin(GL_TRIANGLE_STRIP);
  1967. if (!p_par->rotace) { // rotace textury na castici
  1968. glTexCoord2f(0, 0);
  1969. glVertex3fv((float *) (tmp));
  1970. glTexCoord2f(1, 0);
  1971. glVertex3fv((float *) (tmp + 1));
  1972. glTexCoord2f(0, 1);
  1973. glVertex3fv((float *) (tmp + 2));
  1974. glTexCoord2f(1, 1);
  1975. glVertex3fv((float *) (tmp + 3));
  1976. }
  1977. else if (p_par->rotace == 3) {
  1978. glTexCoord2f(0, 1);
  1979. glVertex3fv((float *) (tmp));
  1980. glTexCoord2f(0, 0);
  1981. glVertex3fv((float *) (tmp + 1));
  1982. glTexCoord2f(1, 1);
  1983. glVertex3fv((float *) (tmp + 2));
  1984. glTexCoord2f(1, 0);
  1985. glVertex3fv((float *) (tmp + 3));
  1986. }
  1987. else if (p_par->rotace == 2) {
  1988. glTexCoord2f(0, 1);
  1989. glVertex3fv((float *) (tmp));
  1990. glTexCoord2f(1, 1);
  1991. glVertex3fv((float *) (tmp + 1));
  1992. glTexCoord2f(0, 0);
  1993. glVertex3fv((float *) (tmp + 2));
  1994. glTexCoord2f(1, 0);
  1995. glVertex3fv((float *) (tmp + 3));
  1996. }
  1997. else if (p_par->rotace == 1) {
  1998. glTexCoord2f(1, 0);
  1999. glVertex3fv((float *) (tmp));
  2000. glTexCoord2f(1, 1);
  2001. glVertex3fv((float *) (tmp + 1));
  2002. glTexCoord2f(0, 0);
  2003. glVertex3fv((float *) (tmp + 2));
  2004. glTexCoord2f(0, 1);
  2005. glVertex3fv((float *) (tmp + 3));
  2006. }
  2007. glEnd();
  2008. }
  2009. else {
  2010. min_x = p_par->x_min;
  2011. max_x = p_par->x_max;
  2012. min_z = p_par->z_min;
  2013. max_z = p_par->z_max;
  2014. p_bod = tmp;
  2015. b1x = p_bod->x;
  2016. b1y = p_bod->y;
  2017. b1z = p_bod->z;
  2018. p_bod = tmp + 1;
  2019. b2x = p_bod->x;
  2020. b2y = p_bod->y;
  2021. b2z = p_bod->z;
  2022. p_bod = tmp + 2;
  2023. b3x = p_bod->x;
  2024. b3y = p_bod->y;
  2025. b3z = p_bod->z;
  2026. p_bod = tmp + 3;
  2027. b4x = p_bod->x;
  2028. b4y = p_bod->y;
  2029. b4z = p_bod->z;
  2030. sx = p_par->p.x;
  2031. sz = p_par->p.z;
  2032. if (b1x < min_x && b2x < min_x && b3x < min_x && b4x < min_x) {
  2033. p_par = p_par->p_next;
  2034. continue;
  2035. }
  2036. if (b1x > max_x && b2x > max_x && b3x > max_x && b4x > max_x) {
  2037. p_par = p_par->p_next;
  2038. continue;
  2039. }
  2040. if (b1z < min_z && b2z < min_z && b3z < min_z && b4z < min_z) {
  2041. p_par = p_par->p_next;
  2042. continue;
  2043. }
  2044. if (b1z > max_z && b2z > max_z && b3z > max_z && b4z > max_z) {
  2045. p_par = p_par->p_next;
  2046. continue;
  2047. }
  2048. glBegin(GL_TRIANGLE_STRIP);
  2049. if (b1x < min_x) {
  2050. tu = 0.5f - 0.5f * (sx - min_x) / (sx - b1x);
  2051. b1x = min_x;
  2052. }
  2053. else if (b1x > max_x) {
  2054. tu = 0.5f + 0.5f * (max_x - sx) / (b1x - sx);
  2055. b1x = max_x;
  2056. }
  2057. else {
  2058. tu = 0.0f;
  2059. }
  2060. if (b1z < min_z) {
  2061. tv = 0.5f - 0.5f * (sz - min_z) / (sz - b1z);
  2062. b1z = min_z;
  2063. }
  2064. else if (b1z > max_z) {
  2065. tv = 0.5f + 0.5f * (max_z - sz) / (b1z - sz);
  2066. b1z = max_z;
  2067. }
  2068. else {
  2069. tv = 0.0f;
  2070. }
  2071. glTexCoord2f(tu, tv);
  2072. glVertex3f(b1x, b1y, b1z);
  2073. if (b2x < min_x) {
  2074. tu = 0.5f - 0.5f * (sx - min_x) / (sx - b2x);
  2075. b2x = min_x;
  2076. }
  2077. else if (b2x > max_x) {
  2078. tu = 0.5f + 0.5f * (max_x - sx) / (b2x - sx);
  2079. b2x = max_x;
  2080. }
  2081. else {
  2082. tu = 1.0f;
  2083. }
  2084. if (b2z < min_z) {
  2085. tv = 0.5f - 0.5f * (sz - min_z) / (sz - b2z);
  2086. b2z = min_z;
  2087. }
  2088. else if (b2z > max_z) {
  2089. tv = 0.5f + 0.5f * (max_z - sz) / (b2z - sz);
  2090. b2z = max_z;
  2091. }
  2092. else {
  2093. tv = 0.0f;
  2094. }
  2095. glTexCoord2f(tu, tv);
  2096. glVertex3f(b2x, b2y, b2z);
  2097. if (b3x < min_x) {
  2098. tu = 0.5f - 0.5f * (sx - min_x) / (sx - b3x);
  2099. b3x = min_x;
  2100. }
  2101. else if (b3x > max_x) {
  2102. tu = 0.5f + 0.5f * (max_x - sx) / (b3x - sx);
  2103. b3x = max_x;
  2104. }
  2105. else {
  2106. tu = 0.0f;
  2107. }
  2108. if (b3z < min_z) {
  2109. tv = 0.5f - 0.5f * (sz - min_z) / (sz - b3z);
  2110. b3z = min_z;
  2111. }
  2112. else if (b3z > max_z) {
  2113. tv = 0.5f + 0.5f * (max_z - sz) / (b3z - sz);
  2114. b3z = max_z;
  2115. }
  2116. else {
  2117. tv = 1.0f;
  2118. }
  2119. glTexCoord2f(tu, tv);
  2120. glVertex3f(b3x, b3y, b3z);
  2121. if (b4x < min_x) {
  2122. tu = 0.5f - 0.5f * (sx - min_x) / (sx - b4x);
  2123. b4x = min_x;
  2124. }
  2125. else if (b4x > max_x) {
  2126. tu = 0.5f + 0.5f * (max_x - sx) / (b4x - sx);
  2127. b4x = max_x;
  2128. }
  2129. else {
  2130. tu = 1.0f;
  2131. }
  2132. if (b4z < min_z) {
  2133. tv = 0.5f - 0.5f * (sz - min_z) / (sz - b4z);
  2134. b4z = min_z;
  2135. }
  2136. else if (b4z > max_z) {
  2137. tv = 0.5f + 0.5f * (max_z - sz) / (b4z - sz);
  2138. b4z = max_z;
  2139. }
  2140. else {
  2141. tv = 1.0f;
  2142. }
  2143. glTexCoord2f(tu, tv);
  2144. glVertex3f(b4x, b4y, b4z);
  2145. glEnd();
  2146. }
  2147. p_par = p_par->p_next;
  2148. }
  2149. }
  2150. p_hnizdo = p_hnizdo->p_next;
  2151. }
  2152. if (frame)
  2153. amat_set_frame_text(p_mat, framelast);
  2154. cull_on();
  2155. zmask_set_fleky(TRUE);
  2156. if (p_mt->flag & TPAR_NO_FOG)
  2157. enable_fog_causal();
  2158. }
  2159. void pe_renderuj(G_KONFIG * p_ber)
  2160. {
  2161. GLMATRIX *p_camera_project = get_matrix_camera_project();
  2162. PARMETAC *p_par = p_ber->p_par;
  2163. PARMETAC *p_next = NULL;
  2164. set_matrix_world_init();
  2165. while (p_par) {
  2166. p_next = p_par->p_next;
  2167. if (p_par->flag & TPAR_STREP) {
  2168. if (p_par->pnum
  2169. && kd_visibility(&p_par->min, &p_par->max, p_camera_project))
  2170. pe_kresli_strepiny(p_ber, p_par);
  2171. }
  2172. else if (p_par->flag & TPAR_KOUR_STOPA) {
  2173. if (p_par->pnum)
  2174. pe_kresli_kour_stopu(p_ber, p_par);
  2175. }
  2176. else if (p_par->flag & TPAR_FLEK) {
  2177. if (p_par->pnum
  2178. && kd_visibility(&p_par->min, &p_par->max, p_camera_project))
  2179. pe_kresli_fleky(p_ber, p_par);
  2180. }
  2181. else
  2182. assert(0);
  2183. p_par = p_next;
  2184. }
  2185. }
  2186. void ber_renderuj_mlhu(G_KONFIG * p_ber)
  2187. {
  2188. MLZNA_KOSTKA *p_tmp = p_ber->p_mlha;
  2189. MLZNA_KOSTKA *p_top = NULL;
  2190. BOD *p_cbod = (BOD *) & p_ber->p_invcam->_41;
  2191. int kamera_zmena = p_ber->kamera.zmena || p_ber->kamera.zmena_last;
  2192. if (kamera_zmena) {
  2193. while (p_tmp) {
  2194. if (!p_tmp->p_kont
  2195. && kd_je_bod_v_kostce(p_cbod, &p_tmp->min, &p_tmp->max) && (!p_top
  2196. || p_tmp->priorita >= p_top->priorita)) {
  2197. p_top = p_tmp;
  2198. }
  2199. p_tmp = p_tmp->p_next;
  2200. }
  2201. if (p_top) {
  2202. if (p_ber->p_mlha_akt != p_top) {
  2203. p_ber->p_mlha_akt = p_top;
  2204. nastav_fog(p_top);
  2205. enable_fog();
  2206. }
  2207. }
  2208. else {
  2209. if (p_ber->p_mlha_akt) {
  2210. p_ber->p_mlha_akt = NULL;
  2211. disable_fog();
  2212. }
  2213. }
  2214. }
  2215. }
  2216. void ber_test_render_mysi(void)
  2217. {
  2218. BOD a, b, c, v(10, 10, 10);
  2219. int ax, ay, bx, by, cx, cy;
  2220. float z1, z2, z3;
  2221. transf_2d_3d_z((float) mi.x, (float) mi.y, 500.0f, &a.x, &a.y, &a.z,
  2222. p_ber->p_camera, p_ber->p_project,
  2223. OXRES, OYRES, OXSTART, OYSTART,
  2224. p_ber->kam.near_plane, p_ber->kam.far_plane);
  2225. transf_2d_3d_z((float) mi.x, (float) mi.y, 250.0f, &b.x, &b.y, &b.z,
  2226. p_ber->p_camera, p_ber->p_project,
  2227. OXRES, OYRES, OXSTART, OYSTART,
  2228. p_ber->kam.near_plane, p_ber->kam.far_plane);
  2229. transf_2d_3d_z((float) mi.x, (float) mi.y, 0.01f, &c.x, &c.y, &c.z,
  2230. p_ber->p_camera, p_ber->p_project,
  2231. OXRES, OYRES, OXSTART, OYSTART,
  2232. p_ber->kam.near_plane, p_ber->kam.far_plane);
  2233. dbgprintf("m [%d %d]", mi.x, mi.y);
  2234. dbgprintf("a3 [%f %f %f]", a.x, a.y, a.z);
  2235. dbgprintf("b3 [%f %f %f]", b.x, b.y, b.z);
  2236. dbgprintf("c3 [%f %f %f]", c.x, c.y, c.z);
  2237. set_matrix_world_init();
  2238. kresli_oktanovou_bunku_minmax(&a, &v, 0xffffffff);
  2239. kresli_kosoctverec(p_ber->p_project, p_ber->p_camera, get_matrix_init(),
  2240. &a, 0.5f, 1.0f, 0.0f, 0.0f);
  2241. kresli_kosoctverec(p_ber->p_project, p_ber->p_camera, get_matrix_init(),
  2242. &b, 0.5f, 0.0f, 1.0f, 0.0f);
  2243. kresli_kosoctverec(p_ber->p_project, p_ber->p_camera, get_matrix_init(),
  2244. &c, 0.5f, 0.0f, 0.0f, 1.0f);
  2245. transf_3d_2d(a.x, a.y, a.z, &ax, &ay, &z1, get_matrix_init(),
  2246. p_ber->p_camera, p_ber->p_project,
  2247. OXRES, OYRES, OXSTART, OYSTART,
  2248. p_ber->kam.near_plane, p_ber->kam.far_plane);
  2249. transf_3d_2d(b.x, b.y, b.z, &bx, &by, &z2, get_matrix_init(),
  2250. p_ber->p_camera, p_ber->p_project,
  2251. OXRES, OYRES, OXSTART, OYSTART,
  2252. p_ber->kam.near_plane, p_ber->kam.far_plane);
  2253. transf_3d_2d(c.x, c.y, c.z, &cx, &cy, &z3, get_matrix_init(),
  2254. p_ber->p_camera, p_ber->p_project,
  2255. OXRES, OYRES, OXSTART, OYSTART,
  2256. p_ber->kam.near_plane, p_ber->kam.far_plane);
  2257. dbgprintf("a2 [%d %d %f]", ax, ay, z1);
  2258. dbgprintf("b2 [%d %d %f]", bx, by, z2);
  2259. dbgprintf("c2 [%d %d %f]", cx, cy, z3);
  2260. set_matrix_2d(OXRES, OYRES);
  2261. kresli_ctverec_2d_diff(ax, ay, 10, 10, 1, 1, 1);
  2262. kresli_ctverec_2d_diff(bx, by, 20, 20, 1, 1, 1);
  2263. kresli_ctverec_2d_diff(cx, cy, 30, 30, 1, 1, 1);
  2264. ret_matrix_2d();
  2265. }
  2266. GAME_MESH_OLD *ber_vyrob_stinove_teleso(GAME_MESH_OLD * p_mesh, BOD * p_light)
  2267. {
  2268. return (NULL);
  2269. }
  2270. static int mesh_mat_num(GAME_MESH_OLD * p_mesh)
  2271. {
  2272. int i;
  2273. for (i = 1; i < p_mesh->objektu; i++) {
  2274. if (p_mesh->p_mat[i - 1] != p_mesh->p_mat[i])
  2275. return (K_CHYBA);
  2276. }
  2277. return ((int) p_mesh->p_mat[0]);
  2278. }
  2279. static int ber_mesh_render_list_setrid_compare(const void *p_m1,
  2280. const void *p_m2)
  2281. {
  2282. int mat1 = mesh_mat_num(**(GAME_MESH_OLD ***) p_m1),
  2283. mat2 = mesh_mat_num(**(GAME_MESH_OLD ***) p_m2);
  2284. if (mat1 == K_CHYBA && mat2 == K_CHYBA)
  2285. return (0);
  2286. else {
  2287. if (mat1 == K_CHYBA)
  2288. return (1);
  2289. if (mat2 == K_CHYBA)
  2290. return (-1);
  2291. return (mat1 - mat2);
  2292. }
  2293. }
  2294. static int ber_poly_render_list_setrid_compare(const void *p_m1,
  2295. const void *p_m2)
  2296. {
  2297. EDIT_MESH_POLY *p_p1 = *(EDIT_MESH_POLY **) p_m1;
  2298. EDIT_MESH_POLY *p_p2 = *(EDIT_MESH_POLY **) p_m2;
  2299. return (p_p1->material - p_p2->material);
  2300. }
  2301. void ber_render_list_setrid(G_KONFIG * p_ber)
  2302. {
  2303. qsort(p_ber->p_mesh_renderlist, p_ber->mesh_rendernum,
  2304. sizeof(p_ber->p_mesh_renderlist[0]), ber_mesh_render_list_setrid_compare);
  2305. qsort(p_ber->p_poly_renderlist, p_ber->poly_rendernum,
  2306. sizeof(p_ber->p_poly_renderlist[0]), ber_poly_render_list_setrid_compare);
  2307. }
  2308. inline int obb_visibility_flag(OBB_OLD * p_obb, GLMATRIX * p_mat, int viz,
  2309. int flag)
  2310. {
  2311. return (viz ? flag : obb_visibility(p_obb, p_mat));
  2312. }
  2313. // viz = TRUE - automaticky viditelny
  2314. inline int ber_render_list_vyrob_mesh(G_KONFIG * p_ber, int viz,
  2315. GAME_MESH_OLD ** p_src, int add, GLMATRIX * p_mat, int viditelny_flag,
  2316. int zmena_flag, int mail, int kamera_zmena)
  2317. {
  2318. GAME_MESH_OLD *p_mesh = *p_src;
  2319. int *p_flag, kflag;
  2320. OBB_OLD *p_obb;
  2321. int j;
  2322. int viditelny_zmena = FALSE;
  2323. kflag = p_mesh->p_data->kflag;
  2324. viditelny_zmena = FALSE;
  2325. if (kflag & KONT_ZRCADLO)
  2326. return (TRUE);
  2327. if (viz || obb_visibility(&p_mesh->obb_world, p_mat)) {
  2328. p_flag = (int *) p_mesh->p_kflag;
  2329. if (p_mesh->objektu > 1) {
  2330. int stat = (kflag & KONT_STATIC && !kamera_zmena);
  2331. for (j = 0, p_obb = p_mesh->p_obb_world; j < p_mesh->objektu;
  2332. j++, p_obb++, p_flag++) {
  2333. if (obb_visibility_flag(p_obb, p_mat, stat,
  2334. (*p_flag) & viditelny_flag)) {
  2335. if (!((*p_flag) & viditelny_flag)) { // objekt nebyl driv viditelnej
  2336. viditelny_zmena = TRUE;
  2337. }
  2338. *p_flag |= viditelny_flag;
  2339. }
  2340. else {
  2341. *p_flag &= ~viditelny_flag;
  2342. }
  2343. }
  2344. }
  2345. else {
  2346. if (!((*p_flag) & viditelny_flag)) { // objekt nebyl driv viditelnej
  2347. viditelny_zmena = TRUE;
  2348. }
  2349. *p_flag |= viditelny_flag;
  2350. }
  2351. if (viditelny_zmena || !(kflag & viditelny_flag)
  2352. || p_mesh->mail + 1 != mail)
  2353. kflag |= zmena_flag;
  2354. else
  2355. kflag &= ~zmena_flag;
  2356. p_mesh->p_data->kflag = kflag | viditelny_flag;
  2357. if (add) {
  2358. assert(p_mesh->mail != mail);
  2359. p_mesh->mail = mail;
  2360. p_ber->p_mesh_renderlist[p_ber->mesh_rendernum++] = p_src;
  2361. }
  2362. return (TRUE);
  2363. }
  2364. else {
  2365. p_mesh->p_data->kflag &= ~viditelny_flag;
  2366. p_flag = (int *) p_mesh->p_kflag;
  2367. for (j = 0; j < p_mesh->objektu; j++, p_flag++) {
  2368. *p_flag &= ~viditelny_flag;
  2369. }
  2370. return (FALSE);
  2371. }
  2372. }
  2373. inline void ber_render_list_vyrob_poly(G_KONFIG * p_ber,
  2374. EDIT_MESH_POLY * p_poly, int add, GLMATRIX * p_mat, int viditelny_flag,
  2375. int zmena_flag, int mail)
  2376. {
  2377. int kflag;
  2378. kflag = p_poly->kflag;
  2379. if (kflag & KONT_ZRCADLO)
  2380. return;
  2381. if (!(kflag & viditelny_flag) || p_poly->mail + 1 != mail)
  2382. kflag |= zmena_flag;
  2383. else
  2384. kflag &= ~zmena_flag;
  2385. p_poly->kflag = (kflag | viditelny_flag);
  2386. if (add) {
  2387. assert(p_poly->mail != mail);
  2388. p_poly->mail = mail;
  2389. p_ber->p_poly_renderlist[p_ber->poly_rendernum++] = p_poly;
  2390. assert(p_ber->poly_rendernum <= p_ber->polynum);
  2391. }
  2392. }
  2393. void ber_render_list_vyrob_rec(G_KONFIG * p_ber, OBB_TREE_OLD * p_prvni,
  2394. GLMATRIX * p_m, GLMATRIX * p_zrc, int kamera_zmena, int mail)
  2395. {
  2396. EDIT_MESH_POLY *p_poly;
  2397. OBB_TREE_ITEM_OLD *p_item;
  2398. OBB_TREE_OLD *p_next;
  2399. int i;
  2400. p_item = p_prvni->p_item;
  2401. for (i = 0; i < p_prvni->itnum; i++, p_item++) {
  2402. if (kamera_zmena) {
  2403. p_item->viditelny = obb_visibility(p_item->p_obb, p_m);
  2404. }
  2405. if (p_item->viditelny) {
  2406. p_poly = p_item->p_poly;
  2407. if (p_poly) {
  2408. ber_render_list_vyrob_poly(p_ber, p_poly, TRUE, p_m, KONT_VIDITELNY,
  2409. KONT_VIDITELNY_ZMENA, mail);
  2410. }
  2411. else {
  2412. ber_render_list_vyrob_mesh(p_ber, TRUE, p_ber->p_mesh + p_item->mesh,
  2413. TRUE, p_m, KONT_VIDITELNY, KONT_VIDITELNY_ZMENA, mail,
  2414. kamera_zmena);
  2415. }
  2416. }
  2417. if (p_zrc) {
  2418. if (kamera_zmena) {
  2419. p_item->zrc_viditelny = obb_visibility(p_item->p_obb, p_zrc);
  2420. }
  2421. if (p_item->zrc_viditelny) {
  2422. p_poly = p_item->p_poly;
  2423. if (p_poly) {
  2424. ber_render_list_vyrob_poly(p_ber, p_poly, !p_item->viditelny, p_zrc,
  2425. KONT_VIDITELNY_ZRC, KONT_VIDITELNY_ZMENA, mail);
  2426. }
  2427. else {
  2428. ber_render_list_vyrob_mesh(p_ber, TRUE,
  2429. p_ber->p_mesh + p_item->mesh, !p_item->viditelny, p_zrc,
  2430. KONT_VIDITELNY_ZRC, KONT_VIDITELNY_ZMENA, mail, kamera_zmena);
  2431. }
  2432. }
  2433. }
  2434. }
  2435. p_next = p_prvni->p_next;
  2436. for (i = 0; i < p_prvni->nextnum; i++, p_next++) {
  2437. if (obb_visibility(&p_next->obb, p_m) || (p_zrc
  2438. && obb_visibility(&p_next->obb, p_zrc)))
  2439. ber_render_list_vyrob_rec(p_ber, p_next, p_m, p_zrc, kamera_zmena,
  2440. mail);
  2441. }
  2442. }
  2443. void ber_render_list_vyrob(G_KONFIG * p_ber, int zrcadlo, int kamera_zmena)
  2444. {
  2445. GLMATRIX *p_zrc, camera_project_zrc;
  2446. GLMATRIX *p_camera_project = get_matrix_camera_project();
  2447. GAME_MESH_OLD ***p_src;
  2448. int i, viditelny, zmena;
  2449. int mail = ++p_ber->mail;
  2450. /* Nastavi pocet pruhlednych objektu
  2451. */
  2452. p_zrc =
  2453. zrcadlo ? mat_mult_dir(__mat_top_matrix + __mat_top_matrix_akt,
  2454. p_camera_project, &camera_project_zrc) : NULL;
  2455. if (!p_ber->p_poly_renderlist) {
  2456. p_ber->p_poly_renderlist =
  2457. (EDIT_MESH_POLY **) mmalloc(sizeof(p_ber->p_poly_renderlist[0]) *
  2458. p_ber->polynum * 2);
  2459. p_ber->poly_rendernum = 0;
  2460. p_ber->poly_renderakt = 0;
  2461. }
  2462. p_ber->mesh_rendernum = 0;
  2463. p_ber->poly_rendernum = 0;
  2464. /* Prihozeni statickych veci z obbtree render-listu
  2465. */
  2466. if (obb_visibility(&p_ber->obbtree.obb, p_camera_project) || (p_zrc
  2467. && obb_visibility(&p_ber->obbtree.obb, p_zrc))) {
  2468. ber_render_list_vyrob_rec(p_ber, &p_ber->obbtree, p_camera_project, p_zrc,
  2469. kamera_zmena, mail);
  2470. }
  2471. /* Prihozeni dynamickych veci z dynamickeho render-listu
  2472. */
  2473. p_src = p_ber->p_dyn_meshlist;
  2474. for (i = 0; i < p_ber->dyn_meshlistnum; i++, p_src++) {
  2475. if (**p_src && !((**p_src)->nekreslit)) {
  2476. zmena = kamera_zmena || (((**p_src)->p_data->kflag) & KONT_POHYB);
  2477. viditelny =
  2478. ber_render_list_vyrob_mesh(p_ber, FALSE, *p_src, TRUE,
  2479. p_camera_project, KONT_VIDITELNY, KONT_VIDITELNY_ZMENA, mail, zmena);
  2480. if (p_zrc)
  2481. ber_render_list_vyrob_mesh(p_ber, FALSE, *p_src, !viditelny, p_zrc,
  2482. KONT_VIDITELNY_ZRC, KONT_VIDITELNY_ZMENA, mail, zmena);
  2483. }
  2484. }
  2485. /* Setrideni podle materialu
  2486. */
  2487. ber_render_list_setrid(p_ber);
  2488. }
  2489. void ber_render_list_vyrob_pruhlist(G_KONFIG * p_ber)
  2490. {
  2491. GLMATRIX *p_mat = get_matrix_camera_project();
  2492. EDIT_MESH_POLY *p_poly;
  2493. GAME_MESH_OLD *p_mesh;
  2494. /* A zaciname!
  2495. */
  2496. p_ber->prhlnum = 0;
  2497. /*
  2498. Render Mesh-listu
  2499. */
  2500. ber_mesh_render_list_reset(p_ber);
  2501. while ((p_mesh = ber_mesh_render_list_next(p_ber))) {
  2502. if (p_mesh->p_data->m1flag & MAT_PRUHLEDNY
  2503. || p_mesh->p_data->kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) {
  2504. PRUHLEDNY_OBJEKT *p_pruhl = p_ber->prhl + p_ber->prhlnum++;
  2505. assert(p_ber->prhlnum < MAX_PRHL_OBJEKTU);
  2506. p_pruhl->vzdal = ber_vzdal_bodu_z(&p_mesh->obb_world.obb_stred, p_mat);
  2507. p_pruhl->p_objekt = (void *) p_mesh;
  2508. p_pruhl->typ = PRUHLEDNY_MESH;
  2509. p_mesh->p_data->kflag |= KONT_VIDITELNY_PRUHL;
  2510. }
  2511. else {
  2512. p_mesh->p_data->kflag &= ~KONT_VIDITELNY_PRUHL;
  2513. }
  2514. }
  2515. /*
  2516. Render poly-listu
  2517. */
  2518. ber_poly_render_list_reset(p_ber);
  2519. while ((p_poly = ber_poly_render_list_next(p_ber))) {
  2520. if (p_poly->m1flag & MAT_PRUHLEDNY
  2521. || p_poly->kflag & (KONT_DRAW_PRUHL | KONT_DRAW_CAMERA)) {
  2522. PRUHLEDNY_OBJEKT *p_pruhl = p_ber->prhl + p_ber->prhlnum++;
  2523. assert(p_ber->prhlnum < MAX_PRHL_OBJEKTU);
  2524. p_pruhl->vzdal = ber_vzdal_bodu_z(&p_poly->obb.obb_stred, p_mat);
  2525. p_pruhl->p_objekt = (void *) (p_poly);
  2526. p_pruhl->typ = PRUHLEDNY_POLY;
  2527. p_poly->kflag |= KONT_VIDITELNY_PRUHL;
  2528. }
  2529. else {
  2530. p_poly->kflag &= ~KONT_VIDITELNY_PRUHL;
  2531. }
  2532. }
  2533. }