Mat3d.cpp 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538
  1. /*
  2. Engine - samotna parba
  3. */
  4. #include "3d_all.h"
  5. GLMATRIX __kont_world_matrix;
  6. void transformuj_kontejner_matici(EDIT_KONTEJNER * p_kont, GLMATRIX * p_m)
  7. {
  8. OBJ_VERTEX *p_vert;
  9. BOD *p_kost;
  10. int i, j;
  11. int pocet;
  12. int celkem = 0;
  13. if (p_kont == NULL)
  14. return;
  15. for (j = 0; j < p_kont->max_objektu; j++) {
  16. if (!p_kont->p_obj[j])
  17. continue;
  18. p_vert = p_kont->p_obj[j]->p_vertex;
  19. pocet = p_kont->p_obj[j]->vertexnum;
  20. for (i = 0; i < pocet; i++) {
  21. transformuj_bod_matici(&p_vert[i].x, &p_vert[i].y, &p_vert[i].z, p_m);
  22. }
  23. p_kost = p_kont->p_obj[j]->p_vertex_kosti;
  24. if (p_kost) {
  25. for (i = 0; i < pocet; i++) {
  26. transformuj_bod_matici(&p_kost[i].x, &p_kost[i].y, &p_kost[i].z, p_m);
  27. }
  28. }
  29. }
  30. }
  31. // Vymaze key-frame!!!
  32. void transformuj_kontejner_keyframe(EDIT_KONTEJNER * p_kont)
  33. {
  34. EDIT_OBJEKT *p_obj;
  35. int i, o;
  36. if (p_kont->kflag & KONT_KEYFRAME) {
  37. oe_olist_reset(&o);
  38. while (p_obj = oe_olist_next(p_kont, &o)) {
  39. transformuj_objekt_matici(p_obj, &p_obj->m);
  40. init_matrix(&p_obj->m);
  41. }
  42. init_matrix(&p_kont->world);
  43. init_matrix(&p_kont->mpmatrix);
  44. p_kont->kflag &= ~KONT_KEYFRAME;
  45. for (i = 0; i < KONT_MAX_ANIM; i++) {
  46. key_sim_root_zrus(p_kont->sim + i);
  47. }
  48. }
  49. }
  50. void transformuj_kontejner(EDIT_KONTEJNER * p_kont)
  51. {
  52. if (!(p_kont->kflag & KONT_KEYFRAME)) {
  53. lo_transformuj_svetla_do_wordspace(p_kont);
  54. transformuj_kontejner_matici(p_kont, kont_world_matrix(p_kont));
  55. init_matrix(&p_kont->world);
  56. init_matrix(&p_kont->mpmatrix);
  57. }
  58. }
  59. void transformuj_mesh(GAME_MESH_OLD * p_mesh)
  60. {
  61. dword i;
  62. if (!(p_mesh->p_data->kflag & KONT_KEYFRAME)) {
  63. for (i = 0; i < p_mesh->vertexnum; i++) {
  64. transformuj_bod_bod_matici(p_mesh->p_vertex_pos + i, &p_mesh->m);
  65. }
  66. init_matrix(&p_mesh->m);
  67. }
  68. }
  69. void calc_norm_vec_inter_object(EDIT_OBJEKT * p_obj)
  70. {
  71. int j, i, v, v1, k;
  72. float p_x, p_y, p_z, p;
  73. ROVINA r;
  74. byte *p_hv = (byte *) mmalloc(p_obj->vertexnum);
  75. word *p_nasle = (word *) mmalloc(p_obj->vertexnum * sizeof(word));
  76. word naslych = 0;
  77. for (v = 0; v < p_obj->vertexnum; v++) {
  78. if (p_hv[v]) // pokud byl pouzit -> preskoc ho
  79. continue;
  80. else
  81. p_hv[v] = 1;
  82. p_nasle[0] = v;
  83. naslych = 1;
  84. for (v1 = 0; v1 < p_obj->vertexnum; v1++) {
  85. if (v == v1)
  86. continue;
  87. if (stejny_vertex(p_obj->p_vertex[v], p_obj->p_vertex[v1])) {
  88. p_nasle[naslych++] = v1;
  89. p_hv[v1] = 1;
  90. }
  91. }
  92. // mam seznam vsech stejnych vertexu -> najdu k nim facy
  93. p_x = p_y = p_z = p = 0;
  94. for (k = 0; k < naslych; k++) {
  95. j = p_nasle[k];
  96. for (i = 0; i < p_obj->facenum; i += 3) {
  97. if ((p_obj->p_face[i] == j) || (p_obj->p_face[i + 1] == j)
  98. || (p_obj->p_face[i + 2] == j)) {
  99. // spocitat rovinu
  100. calc_rovinu(p_obj->p_vertex + p_obj->p_face[i],
  101. p_obj->p_vertex + p_obj->p_face[i + 1],
  102. p_obj->p_vertex + p_obj->p_face[i + 2], &r);
  103. p_x += r.x;
  104. p_y += r.y;
  105. p_z += r.z;
  106. p++;
  107. }
  108. }
  109. }
  110. p_x /= p;
  111. p_y /= p;
  112. p_z /= p;
  113. norm_vect(&p_x, &p_y, &p_z);
  114. if (p) {
  115. for (k = 0; k < naslych; k++) {
  116. j = p_nasle[k];
  117. p_obj->p_vertex[j].nx = p_x;
  118. p_obj->p_vertex[j].ny = p_y;
  119. p_obj->p_vertex[j].nz = p_z;
  120. }
  121. }
  122. }
  123. free(p_hv);
  124. free(p_nasle);
  125. }
  126. void texturuj_zemi(EDIT_OBJEKT * p_obj, int rect_x, int rect_y, int c_text,
  127. int flag, int mat, float skok_u, float skok_v)
  128. {
  129. float *p_fl;
  130. int x, y, i;
  131. rect_x++;
  132. rect_y++;
  133. p_obj->material = mat;
  134. if (flag & T_MIRROR) {
  135. for (y = 0; y < rect_y - 1; y += 2) {
  136. for (x = 0; x < rect_x - 1; x += 2) {
  137. // spodni rada
  138. i = x + y * rect_x;
  139. p_fl = &p_obj->p_vertex[i].tu1;
  140. p_fl[0 + c_text * 2] = 0.0f; //text x
  141. p_fl[1 + c_text * 2] = 0.0f; //text y
  142. i = x + 1 + y * rect_x;
  143. p_fl = &p_obj->p_vertex[i].tu1;
  144. p_fl[0 + c_text * 2] = 1.0f;
  145. p_fl[1 + c_text * 2] = 0.0f;
  146. i = x + 2 + y * rect_x;
  147. p_fl = &p_obj->p_vertex[i].tu1;
  148. p_fl[0 + c_text * 2] = 0.0f;
  149. p_fl[1 + c_text * 2] = 0.0f;
  150. // stredni rada
  151. i = x + (y + 1) * rect_x;
  152. p_fl = &p_obj->p_vertex[i].tu1;
  153. p_fl[0 + c_text * 2] = 0.0f;
  154. p_fl[1 + c_text * 2] = 1.0f;
  155. i = x + 1 + (y + 1) * rect_x;
  156. p_fl = &p_obj->p_vertex[i].tu1;
  157. p_fl[0 + c_text * 2] = 1.0f;
  158. p_fl[1 + c_text * 2] = 1.0f;
  159. i = x + 2 + (y + 1) * rect_x;
  160. p_fl = &p_obj->p_vertex[i].tu1;
  161. p_fl[0 + c_text * 2] = 0.0f;
  162. p_fl[1 + c_text * 2] = 1.0f;
  163. // horni rada
  164. i = x + (y + 2) * rect_x;
  165. p_fl = &p_obj->p_vertex[i].tu1;
  166. p_fl[0 + c_text * 2] = 0.0f;
  167. p_fl[1 + c_text * 2] = 0.0f;
  168. i = x + 1 + (y + 2) * rect_x;
  169. p_fl = &p_obj->p_vertex[i].tu1;
  170. p_fl[0 + c_text * 2] = 1.0f;
  171. p_fl[1 + c_text * 2] = 0.0f;
  172. i = x + 2 + (y + 2) * rect_x;
  173. p_fl = &p_obj->p_vertex[i].tu1;
  174. p_fl[0 + c_text * 2] = 0.0f;
  175. p_fl[1 + c_text * 2] = 0.0f;
  176. }
  177. }
  178. }
  179. if (flag & T_WRAP) {
  180. for (y = 0; y < rect_y; y++) {
  181. for (x = 0; x < rect_x; x++) {
  182. i = x + y * rect_x;
  183. p_fl = &p_obj->p_vertex[i].tu1;
  184. p_fl[0 + c_text * 2] = ((float) x) * skok_u; //text x
  185. p_fl[1 + c_text * 2] = ((float) y) * skok_v; //text y
  186. }
  187. }
  188. }
  189. }
  190. EDIT_OBJEKT *vyrob_zemi(int rect_x, int rect_y, float skok)
  191. {
  192. return (vyrob_zemi_start(rect_x, rect_y, skok, 0.0f, 0.0f));
  193. }
  194. EDIT_OBJEKT *vyrob_zemi_start(int rect_x, int rect_y, float skok,
  195. float start_x, float start_y)
  196. {
  197. int num_x = rect_x + 1;
  198. int num_y = rect_y + 1;
  199. int vertexnum = num_x * num_y;
  200. int facenum = rect_x * rect_y * 2 * 3;
  201. EDIT_OBJEKT *p_obj = vyrob_objekt();
  202. int i, x, y;
  203. p_obj->vertexnum = vertexnum;
  204. if ((p_obj->p_vertex =
  205. (OBJ_VERTEX *) mmalloc(sizeof(p_obj->p_vertex[0]) *
  206. p_obj->vertexnum)) == NULL) {
  207. zrus_objekt(&p_obj);
  208. return (NULL);
  209. }
  210. p_obj->facenum = facenum;
  211. if ((p_obj->p_face =
  212. (word *) mmalloc(sizeof(p_obj->p_face[0]) * p_obj->facenum)) == NULL) {
  213. zrus_objekt(&p_obj);
  214. return (NULL);
  215. }
  216. for (y = 0, i = 0; y < num_y; y++) {
  217. for (x = 0; x < num_x; x++) {
  218. p_obj->p_vertex[i].x = ((float) x) * skok;
  219. p_obj->p_vertex[i].z = ((float) y) * skok;
  220. p_obj->p_vertex[i].y = 0.0f;
  221. p_obj->p_vertex[i].db = p_obj->p_vertex[i].dg =
  222. p_obj->p_vertex[i].dr = 1.0f;
  223. i++;
  224. }
  225. }
  226. for (y = 0, i = 0; y < rect_y; y++) {
  227. for (x = 0; x < rect_x; x++) {
  228. p_obj->p_face[i++] = x + y * num_x;
  229. p_obj->p_face[i++] = x + 1 + y * num_x;
  230. p_obj->p_face[i++] = x + 1 + (y + 1) * num_x;
  231. p_obj->p_face[i++] = x + (y + 1) * num_x;
  232. p_obj->p_face[i++] = x + y * num_x;
  233. p_obj->p_face[i++] = x + 1 + (y + 1) * num_x;
  234. }
  235. }
  236. return (p_obj);
  237. }
  238. void rozloz_zemi(EDIT_OBJEKT ** p_src, int ctvercu)
  239. {
  240. EDIT_OBJEKT *p_obj = *p_src;
  241. float skok;
  242. if (!p_obj->x_rect || !p_obj->y_rect)
  243. return;
  244. if (p_obj->x_rect != p_obj->y_rect != 1)
  245. return;
  246. skok = p_obj->p_vertex[1].x - p_obj->p_vertex[0].x;
  247. skok /= (float) ctvercu;
  248. p_obj =
  249. vyrob_zemi_start(ctvercu, ctvercu, skok, p_obj->p_vertex[0].x,
  250. p_obj->p_vertex[0].z);
  251. zrus_objekt(p_src);
  252. *p_src = p_obj;
  253. }
  254. /*
  255. mirror == 1 - v ose x
  256. == 2 - v ose y
  257. == 3 - v ose z
  258. */
  259. EDIT_OBJEKT *mirror_objekt(EDIT_OBJEKT * p_src, int st, int mx, int my,
  260. int mz)
  261. {
  262. EDIT_OBJEKT *p_dest = vyrob_objekt();
  263. int i;
  264. float stred = 0;
  265. *p_dest = *p_src;
  266. /* Skopiruju vertexy */
  267. if ((p_dest->p_vertex =
  268. (OBJ_VERTEX *) mmalloc(sizeof(OBJ_VERTEX) * p_dest->vertexnum)) ==
  269. NULL) {
  270. zrus_objekt(&p_dest);
  271. return (NULL);
  272. }
  273. memcpy(p_dest->p_vertex, p_src->p_vertex,
  274. sizeof(OBJ_VERTEX) * p_dest->vertexnum);
  275. if (st) {
  276. if (mx) {
  277. for (i = 0; i < p_dest->vertexnum; i++)
  278. stred += p_src->p_vertex[i].x;
  279. stred /= (float) p_dest->vertexnum;
  280. for (i = 0; i < p_dest->vertexnum; i++)
  281. p_dest->p_vertex[i].x = (stred - p_src->p_vertex[i].x);
  282. }
  283. if (my) {
  284. for (i = 0; i < p_dest->vertexnum; i++)
  285. stred += p_src->p_vertex[i].y;
  286. stred /= (float) p_dest->vertexnum;
  287. for (i = 0; i < p_dest->vertexnum; i++)
  288. p_dest->p_vertex[i].y = (stred - p_src->p_vertex[i].y);
  289. }
  290. if (mz) {
  291. for (i = 0; i < p_dest->vertexnum; i++)
  292. stred += p_src->p_vertex[i].z;
  293. stred /= (float) p_dest->vertexnum;
  294. for (i = 0; i < p_dest->vertexnum; i++)
  295. p_dest->p_vertex[i].z = (stred - p_src->p_vertex[i].z);
  296. }
  297. }
  298. else {
  299. for (i = 0; i < p_dest->vertexnum; i++) {
  300. if (mx)
  301. p_dest->p_vertex[i].x = -p_src->p_vertex[i].x;
  302. if (my)
  303. p_dest->p_vertex[i].y = -p_src->p_vertex[i].y;
  304. if (mz)
  305. p_dest->p_vertex[i].z = -p_src->p_vertex[i].z;
  306. }
  307. }
  308. /* Skopiruju facy */
  309. if ((p_dest->p_face =
  310. (FACE *) mmalloc(sizeof(FACE) * p_dest->facenum)) == NULL) {
  311. zrus_objekt(&p_dest);
  312. return (NULL);
  313. }
  314. memcpy(p_dest->p_face, p_src->p_face, sizeof(FACE) * p_dest->facenum);
  315. p_dest->p_line = NULL;
  316. return (p_dest);
  317. }
  318. /*
  319. mirror == 1 - v ose u
  320. == 2 - v ose v
  321. */
  322. void mirror_text(EDIT_OBJEKT * p_src, int t, int mu, int mv)
  323. {
  324. int i;
  325. float *p_fl;
  326. if (!mu && !mv)
  327. return;
  328. for (i = 0; i < p_src->vertexnum; i++) {
  329. p_fl = &p_src->p_vertex[i].tu1;
  330. if (mu)
  331. p_fl[0 + t * 2] = -p_fl[0 + t * 2];
  332. if (mv)
  333. p_fl[1 + t * 2] = -p_fl[1 + t * 2];
  334. }
  335. }
  336. /*
  337. rotace == 1 - 90
  338. == 2 - 180
  339. == 3 - 270
  340. */
  341. void rotuj_text(EDIT_OBJEKT * p_obj, int t, int uhel)
  342. {
  343. OBJ_VERTEX *p_vertex;
  344. int x, y, x_num = p_obj->x_rect + 1, y_num = p_obj->y_rect + 1;
  345. float *p_fls, *p_fld;
  346. if (!p_obj->x_rect || !p_obj->y_rect || !uhel
  347. || (p_obj->x_rect != p_obj->y_rect)) {
  348. return;
  349. }
  350. if ((p_vertex =
  351. (OBJ_VERTEX *) mmalloc(sizeof(OBJ_VERTEX) * p_obj->vertexnum)) ==
  352. NULL) {
  353. return;
  354. }
  355. memcpy(p_vertex, p_obj->p_vertex, sizeof(OBJ_VERTEX) * p_obj->vertexnum);
  356. if (uhel == 1) { // 90
  357. for (y = 0; y < x_num; y++) {
  358. for (x = 0; x < y_num; x++) {
  359. p_fld = &p_obj->p_vertex[(y_num - x - 1) * x_num + y].tu1;
  360. p_fls = &p_vertex[y * x_num + x].tu1;
  361. p_fld[0 + t * 2] = p_fls[0 + t * 2];
  362. p_fld[1 + t * 2] = p_fls[1 + t * 2];
  363. }
  364. }
  365. }
  366. else if (uhel == 2) { // 180
  367. for (y = 0; y < x_num; y++) {
  368. for (x = 0; x < y_num; x++) {
  369. p_fld =
  370. &p_obj->p_vertex[(y_num - y - 1) * x_num + (x_num - x - 1)].tu1;
  371. p_fls = &p_vertex[y * x_num + x].tu1;
  372. p_fld[0 + t * 2] = p_fls[0 + t * 2];
  373. p_fld[1 + t * 2] = p_fls[1 + t * 2];
  374. }
  375. }
  376. }
  377. else if (uhel == 3) { // 270
  378. for (y = 0; y < x_num; y++) {
  379. for (x = 0; x < y_num; x++) {
  380. p_fld = &p_obj->p_vertex[x * x_num + (y_num - y - 1)].tu1;
  381. p_fls = &p_vertex[y * x_num + x].tu1;
  382. p_fld[0 + t * 2] = p_fls[0 + t * 2];
  383. p_fld[1 + t * 2] = p_fls[1 + t * 2];
  384. }
  385. }
  386. }
  387. free(p_vertex);
  388. }
  389. void dopln_cary(EDIT_OBJEKT * p_obj)
  390. {
  391. word j, k, mf;
  392. word *p_line, *p_face;
  393. mf = p_obj->facenum;
  394. if (p_obj->p_line != NULL) {
  395. free(p_obj->p_line);
  396. p_obj->p_line = NULL;
  397. }
  398. if ((p_line = (word *) mmalloc(sizeof(word) * mf * 2)) == NULL)
  399. chyba("pamet");
  400. p_face = p_obj->p_face;
  401. for (j = 0, k = 0; j < p_obj->facenum; j += 3, k += 6) {
  402. p_line[k + 5] = p_line[k] = p_face[j];
  403. p_line[k + 2] = p_line[k + 1] = p_face[j + 1];
  404. p_line[k + 4] = p_line[k + 3] = p_face[j + 2];
  405. }
  406. p_obj->p_line = p_line;
  407. p_obj->linenum = mf * 2;
  408. }
  409. void kresli_ctverec_2d(int x1, int y1, int x2, int y2, float r, float g,
  410. float b)
  411. {
  412. glColor3f(r, g, b);
  413. glBegin(GL_LINE_STRIP);
  414. glVertex2d(x1, y1);
  415. glVertex2d(x2, y1);
  416. glVertex2d(x2, y2);
  417. glVertex2d(x1, y2);
  418. glVertex2d(x1, y1);
  419. glEnd();
  420. }
  421. void kresli_ctverec_2d_diff(int x1, int y1, int dx, int dy, float r, float g,
  422. float b)
  423. {
  424. kresli_ctverec_2d(x1 - dx, y1 - dy, x1 + dx, y1 + dy, r, g, b);
  425. }
  426. void kresli_ctverec_2d_plnej(int x1, int y1, int x2, int y2, float r, float g,
  427. float b)
  428. {
  429. glColor3f(r, g, b);
  430. glBegin(GL_QUADS);
  431. glVertex2d(x1, y1);
  432. glVertex2d(x1, y2);
  433. glVertex2d(x2, y2);
  434. glVertex2d(x2, y1);
  435. glEnd();
  436. }
  437. void kresli_caru(BOD * p_s, BOD * p_k, dword barva)
  438. {
  439. glColor4ubv((byte *) & barva);
  440. glBegin(GL_LINES);
  441. glVertex3f(p_s->x, p_s->y, p_s->z);
  442. glVertex3f(p_k->x, p_k->y, p_k->z);
  443. glEnd();
  444. }
  445. void kresli_kurzor_mysi_kriz(int xres, int yres)
  446. {
  447. glColor3f(1.0f, 1.0f, 1.0f);
  448. glBegin(GL_LINES);
  449. glVertex2i(mi.x, 0);
  450. glVertex2i(mi.x, yres);
  451. glVertex2i(0, mi.y);
  452. glVertex2i(xres, mi.y);
  453. glEnd();
  454. }
  455. /*
  456. Stredovy bod + dx,dy,dz
  457. */
  458. EDIT_OBJEKT *vyrob_krychli(BOD * p_bod, float x, float y, float z,
  459. dword barva)
  460. {
  461. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(8, 12 * 3);
  462. int i;
  463. x /= 2;
  464. y /= 2;
  465. z /= 2;
  466. p_obj->p_vertex[0].x = -x;
  467. p_obj->p_vertex[0].y = -y;
  468. p_obj->p_vertex[0].z = -z;
  469. p_obj->p_vertex[1].x = x;
  470. p_obj->p_vertex[1].y = -y;
  471. p_obj->p_vertex[1].z = -z;
  472. p_obj->p_vertex[2].x = x;
  473. p_obj->p_vertex[2].y = y;
  474. p_obj->p_vertex[2].z = -z;
  475. p_obj->p_vertex[3].x = -x;
  476. p_obj->p_vertex[3].y = y;
  477. p_obj->p_vertex[3].z = -z;
  478. p_obj->p_vertex[4].x = -x;
  479. p_obj->p_vertex[4].y = -y;
  480. p_obj->p_vertex[4].z = z;
  481. p_obj->p_vertex[5].x = x;
  482. p_obj->p_vertex[5].y = -y;
  483. p_obj->p_vertex[5].z = z;
  484. p_obj->p_vertex[6].x = x;
  485. p_obj->p_vertex[6].y = y;
  486. p_obj->p_vertex[6].z = z;
  487. p_obj->p_vertex[7].x = -x;
  488. p_obj->p_vertex[7].y = y;
  489. p_obj->p_vertex[7].z = z;
  490. for (i = 0; i < 8; i++) {
  491. p_obj->p_vertex[i].x += p_bod->x;
  492. p_obj->p_vertex[i].y += p_bod->y;
  493. p_obj->p_vertex[i].z += p_bod->z;
  494. rgb_float(barva, &p_obj->p_vertex[i].dr);
  495. }
  496. // predni strana
  497. p_obj->p_face[0] = 0;
  498. p_obj->p_face[1] = 1;
  499. p_obj->p_face[2] = 2;
  500. p_obj->p_face[3] = 2;
  501. p_obj->p_face[4] = 3;
  502. p_obj->p_face[5] = 0;
  503. //zadni strana
  504. p_obj->p_face[6] = 5;
  505. p_obj->p_face[7] = 6;
  506. p_obj->p_face[8] = 7;
  507. p_obj->p_face[9] = 7;
  508. p_obj->p_face[10] = 4;
  509. p_obj->p_face[11] = 5;
  510. // bok pravej
  511. p_obj->p_face[12] = 1;
  512. p_obj->p_face[13] = 5;
  513. p_obj->p_face[14] = 6;
  514. p_obj->p_face[15] = 6;
  515. p_obj->p_face[16] = 2;
  516. p_obj->p_face[17] = 1;
  517. // bok levej
  518. p_obj->p_face[18] = 4;
  519. p_obj->p_face[19] = 0;
  520. p_obj->p_face[20] = 3;
  521. p_obj->p_face[21] = 3;
  522. p_obj->p_face[22] = 7;
  523. p_obj->p_face[23] = 4;
  524. // vrsek
  525. p_obj->p_face[24] = 3;
  526. p_obj->p_face[25] = 2;
  527. p_obj->p_face[26] = 6;
  528. p_obj->p_face[27] = 6;
  529. p_obj->p_face[28] = 7;
  530. p_obj->p_face[29] = 3;
  531. // spodek
  532. p_obj->p_face[30] = 4;
  533. p_obj->p_face[31] = 0;
  534. p_obj->p_face[32] = 1;
  535. p_obj->p_face[33] = 1;
  536. p_obj->p_face[34] = 5;
  537. p_obj->p_face[35] = 4;
  538. return (p_obj);
  539. }
  540. EDIT_OBJEKT *vyrob_krychli_dratovou(BOD * p_bod, float x, float y, float z,
  541. dword barva)
  542. {
  543. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(8, 1);
  544. int i, mf;
  545. x /= 2;
  546. y /= 2;
  547. z /= 2;
  548. p_obj->p_vertex[0].x = -x;
  549. p_obj->p_vertex[0].y = -y;
  550. p_obj->p_vertex[0].z = -z;
  551. p_obj->p_vertex[1].x = x;
  552. p_obj->p_vertex[1].y = -y;
  553. p_obj->p_vertex[1].z = -z;
  554. p_obj->p_vertex[2].x = x;
  555. p_obj->p_vertex[2].y = y;
  556. p_obj->p_vertex[2].z = -z;
  557. p_obj->p_vertex[3].x = -x;
  558. p_obj->p_vertex[3].y = y;
  559. p_obj->p_vertex[3].z = -z;
  560. p_obj->p_vertex[4].x = -x;
  561. p_obj->p_vertex[4].y = -y;
  562. p_obj->p_vertex[4].z = z;
  563. p_obj->p_vertex[5].x = x;
  564. p_obj->p_vertex[5].y = -y;
  565. p_obj->p_vertex[5].z = z;
  566. p_obj->p_vertex[6].x = x;
  567. p_obj->p_vertex[6].y = y;
  568. p_obj->p_vertex[6].z = z;
  569. p_obj->p_vertex[7].x = -x;
  570. p_obj->p_vertex[7].y = y;
  571. p_obj->p_vertex[7].z = z;
  572. for (i = 0; i < 8; i++) {
  573. p_obj->p_vertex[i].x += p_bod->x;
  574. p_obj->p_vertex[i].y += p_bod->y;
  575. p_obj->p_vertex[i].z += p_bod->z;
  576. }
  577. p_obj->linenum = mf = 12 * 2;
  578. if ((p_obj->p_line = (word *) mmalloc(sizeof(word) * mf * 2)) == NULL)
  579. chyba("pamet");
  580. p_obj->p_line[0] = 0;
  581. p_obj->p_line[1] = 1;
  582. p_obj->p_line[2] = 1;
  583. p_obj->p_line[3] = 2;
  584. p_obj->p_line[4] = 2;
  585. p_obj->p_line[5] = 3;
  586. p_obj->p_line[6] = 3;
  587. p_obj->p_line[7] = 0;
  588. p_obj->p_line[8] = 4;
  589. p_obj->p_line[9] = 5;
  590. p_obj->p_line[10] = 5;
  591. p_obj->p_line[11] = 6;
  592. p_obj->p_line[12] = 6;
  593. p_obj->p_line[13] = 7;
  594. p_obj->p_line[14] = 7;
  595. p_obj->p_line[15] = 4;
  596. p_obj->p_line[16] = 0;
  597. p_obj->p_line[17] = 4;
  598. p_obj->p_line[18] = 1;
  599. p_obj->p_line[19] = 5;
  600. p_obj->p_line[20] = 2;
  601. p_obj->p_line[21] = 6;
  602. p_obj->p_line[22] = 3;
  603. p_obj->p_line[23] = 7;
  604. nastav_barvu_bodu_obj_dword(p_obj, barva);
  605. return (p_obj);
  606. }
  607. void krychli_dratovou_recalc(EDIT_OBJEKT * p_obj, BOD * p_bod, float x,
  608. float y, float z, dword barva)
  609. {
  610. int i;
  611. x /= 2;
  612. y /= 2;
  613. z /= 2;
  614. p_obj->p_vertex[0].x = -x;
  615. p_obj->p_vertex[0].y = -y;
  616. p_obj->p_vertex[0].z = -z;
  617. p_obj->p_vertex[1].x = x;
  618. p_obj->p_vertex[1].y = -y;
  619. p_obj->p_vertex[1].z = -z;
  620. p_obj->p_vertex[2].x = x;
  621. p_obj->p_vertex[2].y = y;
  622. p_obj->p_vertex[2].z = -z;
  623. p_obj->p_vertex[3].x = -x;
  624. p_obj->p_vertex[3].y = y;
  625. p_obj->p_vertex[3].z = -z;
  626. p_obj->p_vertex[4].x = -x;
  627. p_obj->p_vertex[4].y = -y;
  628. p_obj->p_vertex[4].z = z;
  629. p_obj->p_vertex[5].x = x;
  630. p_obj->p_vertex[5].y = -y;
  631. p_obj->p_vertex[5].z = z;
  632. p_obj->p_vertex[6].x = x;
  633. p_obj->p_vertex[6].y = y;
  634. p_obj->p_vertex[6].z = z;
  635. p_obj->p_vertex[7].x = -x;
  636. p_obj->p_vertex[7].y = y;
  637. p_obj->p_vertex[7].z = z;
  638. for (i = 0; i < 8; i++) {
  639. p_obj->p_vertex[i].x += p_bod->x;
  640. p_obj->p_vertex[i].y += p_bod->y;
  641. p_obj->p_vertex[i].z += p_bod->z;
  642. }
  643. nastav_barvu_bodu_obj_dword(p_obj, barva);
  644. }
  645. EDIT_OBJEKT *umisti_krychli_dratovou(EDIT_OBJEKT * p_obj, BOD * p_bod)
  646. {
  647. int i;
  648. for (i = 0; i < p_obj->vertexnum; i++) {
  649. p_obj->p_vertex[i].x += p_bod->x;
  650. p_obj->p_vertex[i].y += p_bod->y;
  651. p_obj->p_vertex[i].z += p_bod->z;
  652. }
  653. return (p_obj);
  654. }
  655. EDIT_OBJEKT *kameru_dratovou_calc(EDIT_OBJEKT * p_obj, BOD * p_p, BOD * p_t,
  656. float fov, float roll, dword barva)
  657. {
  658. BOD p;
  659. float z = vektor_velikost(vektor_sub(p_p, p_t, &p));
  660. float s = (float) tan(fov) * z / 2;
  661. p_obj->p_vertex[0].x = 0.0f;
  662. p_obj->p_vertex[0].y = 0.0f;
  663. p_obj->p_vertex[0].z = 0.0f;
  664. rgb_float(barva, &p_obj->p_vertex[0].dr);
  665. p_obj->p_vertex[1].x = s;
  666. p_obj->p_vertex[1].y = -s;
  667. p_obj->p_vertex[1].z = z;
  668. rgb_float(barva, &p_obj->p_vertex[1].dr);
  669. p_obj->p_vertex[2].x = s;
  670. p_obj->p_vertex[2].y = s;
  671. p_obj->p_vertex[2].z = z;
  672. rgb_float(barva, &p_obj->p_vertex[2].dr);
  673. p_obj->p_vertex[3].x = -s;
  674. p_obj->p_vertex[3].y = s;
  675. p_obj->p_vertex[3].z = z;
  676. rgb_float(barva, &p_obj->p_vertex[3].dr);
  677. p_obj->p_vertex[4].x = -s;
  678. p_obj->p_vertex[4].y = -s;
  679. p_obj->p_vertex[4].z = z;
  680. rgb_float(barva, &p_obj->p_vertex[4].dr);
  681. p_obj->linenum = 16;
  682. assert(p_obj->p_line);
  683. p_obj->p_line[0] = 0;
  684. p_obj->p_line[1] = 1;
  685. p_obj->p_line[2] = 0;
  686. p_obj->p_line[3] = 2;
  687. p_obj->p_line[4] = 0;
  688. p_obj->p_line[5] = 3;
  689. p_obj->p_line[6] = 0;
  690. p_obj->p_line[7] = 4;
  691. p_obj->p_line[8] = 4;
  692. p_obj->p_line[9] = 1;
  693. p_obj->p_line[10] = 1;
  694. p_obj->p_line[11] = 2;
  695. p_obj->p_line[12] = 2;
  696. p_obj->p_line[13] = 3;
  697. p_obj->p_line[14] = 3;
  698. p_obj->p_line[15] = 4;
  699. nastav_barvu_bodu_obj_dword(p_obj, barva);
  700. return (p_obj);
  701. }
  702. EDIT_OBJEKT *kameru_dratovou_vyrob(BOD * p_p, BOD * p_t, float fov,
  703. float roll)
  704. {
  705. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(5, 0);
  706. GLMATRIX m;
  707. if ((p_obj->p_line = (word *) mmalloc(sizeof(word) * 16)) == NULL)
  708. chyba("pamet");
  709. kameru_dratovou_calc(p_obj, p_p, p_t, fov, roll, DDRGB(0, 0, 1));
  710. calc_camera_3ds(&m, &p_obj->m, p_p, p_t, roll);
  711. return (p_obj);
  712. }
  713. int vyrob_kameru_indir(KAMERA * p_kam, char *p_jmeno, BOD * p_p, BOD * p_t,
  714. float fov, float roll)
  715. {
  716. BOD p(0, 0, 0);
  717. strcpy(p_kam->jmeno, p_jmeno);
  718. p_kam->p = *p_p;
  719. p_kam->t = *p_t;
  720. p_kam->roll = roll;
  721. p_kam->fov = fov;
  722. p_kam->p_objekt = kameru_dratovou_vyrob(p_p, p_t, fov, roll);
  723. p_kam->p_pos = vyrob_krychli_dratovou(&p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  724. p.z = vzdal_bodu_bod(&p_kam->p, &p_kam->t);
  725. p_kam->p_target = vyrob_krychli_dratovou(&p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  726. return (TRUE);
  727. }
  728. void kameru_dratovou_reanimuj(KAMERA * p_kam)
  729. {
  730. GLMATRIX m;
  731. BOD p(0, 0, 0);
  732. kameru_dratovou_calc(p_kam->p_objekt, &p_kam->p, &p_kam->t, p_kam->fov,
  733. 0.0f, 0xff0000);
  734. krychli_dratovou_recalc(p_kam->p_pos, &p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  735. p.z = vzdal_bodu_bod(&p_kam->p, &p_kam->t);
  736. krychli_dratovou_recalc(p_kam->p_target, &p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  737. calc_camera_3ds(&m, &p_kam->p_objekt->m, &p_kam->p, &p_kam->t, p_kam->roll);
  738. }
  739. // invertuje poradi plosek
  740. void invertuj_face_objektu(EDIT_OBJEKT * p_obj)
  741. {
  742. word fcp[3];
  743. int f;
  744. for (f = 0; f < p_obj->facenum; f += 3) {
  745. fcp[0] = p_obj->p_face[f];
  746. fcp[1] = p_obj->p_face[f + 1];
  747. p_obj->p_face[f] = fcp[1];
  748. p_obj->p_face[f + 1] = fcp[0];
  749. }
  750. }
  751. void invertuj_face_kontejner(EDIT_KONTEJNER * p_kont)
  752. {
  753. int o;
  754. for (o = 0; o < p_kont->max_objektu; o++) {
  755. if (p_kont->p_obj[o])
  756. invertuj_face_objektu(p_kont->p_obj[o]);
  757. }
  758. }
  759. EDIT_KONTEJNER *vyrob_krychli_rozlozenou(BOD * p_bod, float x, float y,
  760. float z)
  761. {
  762. EDIT_KONTEJNER *p_kont = vyrob_kontejner();
  763. EDIT_OBJEKT *p_obj;
  764. int i;
  765. x /= 2;
  766. y /= 2;
  767. z /= 2;
  768. // predni strana
  769. p_obj = vyrob_objekt_komplet(4, 6);
  770. strcpy(p_obj->jmeno, "obj1");
  771. p_obj->x_rect = p_obj->y_rect = 1;
  772. p_obj->p_vertex[0].x = -x;
  773. p_obj->p_vertex[0].y = -y;
  774. p_obj->p_vertex[0].z = -z;
  775. p_obj->p_vertex[0].tu1 = 0;
  776. p_obj->p_vertex[0].tv1 = 0;
  777. p_obj->p_vertex[0].tu2 = 0;
  778. p_obj->p_vertex[0].tv2 = 0;
  779. p_obj->p_vertex[0].tu3 = 0;
  780. p_obj->p_vertex[0].tv3 = 0;
  781. p_obj->p_vertex[0].tu4 = 0;
  782. p_obj->p_vertex[0].tv4 = 0;
  783. p_obj->p_vertex[1].x = x;
  784. p_obj->p_vertex[1].y = -y;
  785. p_obj->p_vertex[1].z = -z;
  786. p_obj->p_vertex[1].tu1 = 1;
  787. p_obj->p_vertex[1].tv1 = 0;
  788. p_obj->p_vertex[1].tu2 = 1;
  789. p_obj->p_vertex[1].tv2 = 0;
  790. p_obj->p_vertex[1].tu3 = 1;
  791. p_obj->p_vertex[1].tv3 = 0;
  792. p_obj->p_vertex[1].tu4 = 1;
  793. p_obj->p_vertex[1].tv4 = 0;
  794. p_obj->p_vertex[2].x = -x;
  795. p_obj->p_vertex[2].y = y;
  796. p_obj->p_vertex[2].z = -z;
  797. p_obj->p_vertex[2].tu1 = 0;
  798. p_obj->p_vertex[2].tv1 = 1;
  799. p_obj->p_vertex[2].tu2 = 0;
  800. p_obj->p_vertex[2].tv2 = 1;
  801. p_obj->p_vertex[2].tu3 = 0;
  802. p_obj->p_vertex[2].tv3 = 1;
  803. p_obj->p_vertex[2].tu4 = 0;
  804. p_obj->p_vertex[2].tv4 = 1;
  805. p_obj->p_vertex[3].x = x;
  806. p_obj->p_vertex[3].y = y;
  807. p_obj->p_vertex[3].z = -z;
  808. p_obj->p_vertex[3].tu1 = 1;
  809. p_obj->p_vertex[3].tv1 = 1;
  810. p_obj->p_vertex[3].tu2 = 1;
  811. p_obj->p_vertex[3].tv2 = 1;
  812. p_obj->p_vertex[3].tu3 = 1;
  813. p_obj->p_vertex[3].tv3 = 1;
  814. p_obj->p_vertex[3].tu4 = 1;
  815. p_obj->p_vertex[3].tv4 = 1;
  816. p_obj->p_face[0] = 0;
  817. p_obj->p_face[1] = 1;
  818. p_obj->p_face[2] = 3;
  819. p_obj->p_face[3] = 3;
  820. p_obj->p_face[4] = 2;
  821. p_obj->p_face[5] = 0;
  822. for (i = 0; i < 4; i++) {
  823. p_obj->p_vertex[i].x += p_bod->x;
  824. p_obj->p_vertex[i].y += p_bod->y;
  825. p_obj->p_vertex[i].z += p_bod->z;
  826. }
  827. p_kont->p_obj[0] = p_obj;
  828. // Bocni strana
  829. p_obj = vyrob_objekt_komplet(4, 6);
  830. strcpy(p_obj->jmeno, "obj2");
  831. p_obj->x_rect = p_obj->y_rect = 1;
  832. p_obj->p_vertex[0].x = x;
  833. p_obj->p_vertex[0].y = -y;
  834. p_obj->p_vertex[0].z = -z;
  835. p_obj->p_vertex[0].tu1 = 0;
  836. p_obj->p_vertex[0].tv1 = 0;
  837. p_obj->p_vertex[0].tu2 = 0;
  838. p_obj->p_vertex[0].tv2 = 0;
  839. p_obj->p_vertex[0].tu3 = 0;
  840. p_obj->p_vertex[0].tv3 = 0;
  841. p_obj->p_vertex[0].tu4 = 0;
  842. p_obj->p_vertex[0].tv4 = 0;
  843. p_obj->p_vertex[1].x = x;
  844. p_obj->p_vertex[1].y = -y;
  845. p_obj->p_vertex[1].z = z;
  846. p_obj->p_vertex[1].tu1 = 1;
  847. p_obj->p_vertex[1].tv1 = 0;
  848. p_obj->p_vertex[1].tu2 = 1;
  849. p_obj->p_vertex[1].tv2 = 0;
  850. p_obj->p_vertex[1].tu3 = 1;
  851. p_obj->p_vertex[1].tv3 = 0;
  852. p_obj->p_vertex[1].tu4 = 1;
  853. p_obj->p_vertex[1].tv4 = 0;
  854. p_obj->p_vertex[3].x = x;
  855. p_obj->p_vertex[3].y = y;
  856. p_obj->p_vertex[3].z = z;
  857. p_obj->p_vertex[3].tu1 = 1;
  858. p_obj->p_vertex[3].tv1 = 1;
  859. p_obj->p_vertex[3].tu2 = 1;
  860. p_obj->p_vertex[3].tv2 = 1;
  861. p_obj->p_vertex[3].tu3 = 1;
  862. p_obj->p_vertex[3].tv3 = 1;
  863. p_obj->p_vertex[3].tu4 = 1;
  864. p_obj->p_vertex[3].tv4 = 1;
  865. p_obj->p_vertex[2].x = x;
  866. p_obj->p_vertex[2].y = y;
  867. p_obj->p_vertex[2].z = -z;
  868. p_obj->p_vertex[2].tu1 = 0;
  869. p_obj->p_vertex[2].tv1 = 1;
  870. p_obj->p_vertex[2].tu2 = 0;
  871. p_obj->p_vertex[2].tv2 = 1;
  872. p_obj->p_vertex[2].tu3 = 0;
  873. p_obj->p_vertex[2].tv3 = 1;
  874. p_obj->p_vertex[2].tu4 = 0;
  875. p_obj->p_vertex[2].tv4 = 1;
  876. p_obj->p_face[0] = 0;
  877. p_obj->p_face[1] = 1;
  878. p_obj->p_face[2] = 3;
  879. p_obj->p_face[3] = 3;
  880. p_obj->p_face[4] = 2;
  881. p_obj->p_face[5] = 0;
  882. for (i = 0; i < 4; i++) {
  883. p_obj->p_vertex[i].x += p_bod->x;
  884. p_obj->p_vertex[i].y += p_bod->y;
  885. p_obj->p_vertex[i].z += p_bod->z;
  886. }
  887. p_kont->p_obj[1] = p_obj;
  888. // Zadni strana
  889. p_obj = vyrob_objekt_komplet(4, 6);
  890. strcpy(p_obj->jmeno, "obj3");
  891. p_obj->x_rect = p_obj->y_rect = 1;
  892. p_obj->p_vertex[2].x = -x;
  893. p_obj->p_vertex[2].y = -y;
  894. p_obj->p_vertex[2].z = z;
  895. p_obj->p_vertex[2].tu1 = 1;
  896. p_obj->p_vertex[2].tv1 = 0;
  897. p_obj->p_vertex[2].tu2 = 1;
  898. p_obj->p_vertex[2].tv2 = 0;
  899. p_obj->p_vertex[2].tu3 = 1;
  900. p_obj->p_vertex[2].tv3 = 0;
  901. p_obj->p_vertex[2].tu4 = 1;
  902. p_obj->p_vertex[2].tv4 = 0;
  903. p_obj->p_vertex[3].x = x;
  904. p_obj->p_vertex[3].y = -y;
  905. p_obj->p_vertex[3].z = z;
  906. p_obj->p_vertex[3].tu1 = 0;
  907. p_obj->p_vertex[3].tv1 = 0;
  908. p_obj->p_vertex[3].tu2 = 0;
  909. p_obj->p_vertex[3].tv2 = 0;
  910. p_obj->p_vertex[3].tu3 = 0;
  911. p_obj->p_vertex[3].tv3 = 0;
  912. p_obj->p_vertex[3].tu4 = 0;
  913. p_obj->p_vertex[3].tv4 = 0;
  914. p_obj->p_vertex[1].x = x;
  915. p_obj->p_vertex[1].y = y;
  916. p_obj->p_vertex[1].z = z;
  917. p_obj->p_vertex[1].tu1 = 0;
  918. p_obj->p_vertex[1].tv1 = 1;
  919. p_obj->p_vertex[1].tu2 = 0;
  920. p_obj->p_vertex[1].tv2 = 1;
  921. p_obj->p_vertex[1].tu3 = 0;
  922. p_obj->p_vertex[1].tv3 = 1;
  923. p_obj->p_vertex[1].tu4 = 0;
  924. p_obj->p_vertex[1].tv4 = 1;
  925. p_obj->p_vertex[0].x = -x;
  926. p_obj->p_vertex[0].y = y;
  927. p_obj->p_vertex[0].z = z;
  928. p_obj->p_vertex[0].tu1 = 1;
  929. p_obj->p_vertex[0].tv1 = 1;
  930. p_obj->p_vertex[0].tu2 = 1;
  931. p_obj->p_vertex[0].tv2 = 1;
  932. p_obj->p_vertex[0].tu3 = 1;
  933. p_obj->p_vertex[0].tv3 = 1;
  934. p_obj->p_vertex[0].tu4 = 1;
  935. p_obj->p_vertex[0].tv4 = 1;
  936. p_obj->p_face[0] = 2;
  937. p_obj->p_face[1] = 0;
  938. p_obj->p_face[2] = 3;
  939. p_obj->p_face[3] = 3;
  940. p_obj->p_face[4] = 0;
  941. p_obj->p_face[5] = 1;
  942. for (i = 0; i < 4; i++) {
  943. p_obj->p_vertex[i].x += p_bod->x;
  944. p_obj->p_vertex[i].y += p_bod->y;
  945. p_obj->p_vertex[i].z += p_bod->z;
  946. }
  947. p_kont->p_obj[2] = p_obj;
  948. // Dalsi bocni strana
  949. p_obj = vyrob_objekt_komplet(4, 6);
  950. strcpy(p_obj->jmeno, "obj4");
  951. p_obj->x_rect = p_obj->y_rect = 1;
  952. p_obj->p_vertex[0].x = -x;
  953. p_obj->p_vertex[0].y = -y;
  954. p_obj->p_vertex[0].z = z;
  955. p_obj->p_vertex[0].tu1 = 0;
  956. p_obj->p_vertex[0].tv1 = 0;
  957. p_obj->p_vertex[0].tu2 = 0;
  958. p_obj->p_vertex[0].tv2 = 0;
  959. p_obj->p_vertex[0].tu3 = 0;
  960. p_obj->p_vertex[0].tv3 = 0;
  961. p_obj->p_vertex[0].tu4 = 0;
  962. p_obj->p_vertex[0].tv4 = 0;
  963. p_obj->p_vertex[1].x = -x;
  964. p_obj->p_vertex[1].y = y;
  965. p_obj->p_vertex[1].z = z;
  966. p_obj->p_vertex[1].tu1 = 0;
  967. p_obj->p_vertex[1].tv1 = 1;
  968. p_obj->p_vertex[1].tu2 = 0;
  969. p_obj->p_vertex[1].tv2 = 1;
  970. p_obj->p_vertex[1].tu3 = 0;
  971. p_obj->p_vertex[1].tv3 = 1;
  972. p_obj->p_vertex[1].tu4 = 0;
  973. p_obj->p_vertex[1].tv4 = 1;
  974. p_obj->p_vertex[3].x = -x;
  975. p_obj->p_vertex[3].y = y;
  976. p_obj->p_vertex[3].z = -z;
  977. p_obj->p_vertex[3].tu1 = 1;
  978. p_obj->p_vertex[3].tv1 = 1;
  979. p_obj->p_vertex[3].tu2 = 1;
  980. p_obj->p_vertex[3].tv2 = 1;
  981. p_obj->p_vertex[3].tu3 = 1;
  982. p_obj->p_vertex[3].tv3 = 1;
  983. p_obj->p_vertex[3].tu4 = 1;
  984. p_obj->p_vertex[3].tv4 = 1;
  985. p_obj->p_vertex[2].x = -x;
  986. p_obj->p_vertex[2].y = -y;
  987. p_obj->p_vertex[2].z = -z;
  988. p_obj->p_vertex[2].tu1 = 1;
  989. p_obj->p_vertex[2].tv1 = 0;
  990. p_obj->p_vertex[2].tu2 = 1;
  991. p_obj->p_vertex[2].tv2 = 0;
  992. p_obj->p_vertex[2].tu3 = 1;
  993. p_obj->p_vertex[2].tv3 = 0;
  994. p_obj->p_vertex[2].tu4 = 1;
  995. p_obj->p_vertex[2].tv4 = 0;
  996. p_obj->p_face[0] = 1;
  997. p_obj->p_face[1] = 0;
  998. p_obj->p_face[2] = 3;
  999. p_obj->p_face[3] = 3;
  1000. p_obj->p_face[4] = 0;
  1001. p_obj->p_face[5] = 2;
  1002. for (i = 0; i < 4; i++) {
  1003. p_obj->p_vertex[i].x += p_bod->x;
  1004. p_obj->p_vertex[i].y += p_bod->y;
  1005. p_obj->p_vertex[i].z += p_bod->z;
  1006. }
  1007. p_kont->p_obj[3] = p_obj;
  1008. // vrchni strana
  1009. p_obj = vyrob_objekt_komplet(4, 6);
  1010. strcpy(p_obj->jmeno, "obj5");
  1011. p_obj->x_rect = p_obj->y_rect = 1;
  1012. p_obj->p_vertex[0].x = -x;
  1013. p_obj->p_vertex[0].y = y;
  1014. p_obj->p_vertex[0].z = -z;
  1015. p_obj->p_vertex[0].tu1 = 0;
  1016. p_obj->p_vertex[0].tv1 = 0;
  1017. p_obj->p_vertex[0].tu2 = 0;
  1018. p_obj->p_vertex[0].tv2 = 0;
  1019. p_obj->p_vertex[0].tu3 = 0;
  1020. p_obj->p_vertex[0].tv3 = 0;
  1021. p_obj->p_vertex[0].tu4 = 0;
  1022. p_obj->p_vertex[0].tv4 = 0;
  1023. p_obj->p_vertex[1].x = x;
  1024. p_obj->p_vertex[1].y = y;
  1025. p_obj->p_vertex[1].z = -z;
  1026. p_obj->p_vertex[1].tu1 = 1;
  1027. p_obj->p_vertex[1].tv1 = 0;
  1028. p_obj->p_vertex[1].tu2 = 1;
  1029. p_obj->p_vertex[1].tv2 = 0;
  1030. p_obj->p_vertex[1].tu3 = 1;
  1031. p_obj->p_vertex[1].tv3 = 0;
  1032. p_obj->p_vertex[1].tu4 = 1;
  1033. p_obj->p_vertex[1].tv4 = 0;
  1034. p_obj->p_vertex[3].x = x;
  1035. p_obj->p_vertex[3].y = y;
  1036. p_obj->p_vertex[3].z = z;
  1037. p_obj->p_vertex[3].tu1 = 1;
  1038. p_obj->p_vertex[3].tv1 = 1;
  1039. p_obj->p_vertex[3].tu2 = 1;
  1040. p_obj->p_vertex[3].tv2 = 1;
  1041. p_obj->p_vertex[3].tu3 = 1;
  1042. p_obj->p_vertex[3].tv3 = 1;
  1043. p_obj->p_vertex[3].tu4 = 1;
  1044. p_obj->p_vertex[3].tv4 = 1;
  1045. p_obj->p_vertex[2].x = -x;
  1046. p_obj->p_vertex[2].y = y;
  1047. p_obj->p_vertex[2].z = z;
  1048. p_obj->p_vertex[2].tu1 = 0;
  1049. p_obj->p_vertex[2].tv1 = 1;
  1050. p_obj->p_vertex[2].tu2 = 0;
  1051. p_obj->p_vertex[2].tv2 = 1;
  1052. p_obj->p_vertex[2].tu3 = 0;
  1053. p_obj->p_vertex[2].tv3 = 1;
  1054. p_obj->p_vertex[2].tu4 = 0;
  1055. p_obj->p_vertex[2].tv4 = 1;
  1056. p_obj->p_face[0] = 0;
  1057. p_obj->p_face[1] = 1;
  1058. p_obj->p_face[2] = 3;
  1059. p_obj->p_face[3] = 3;
  1060. p_obj->p_face[4] = 2;
  1061. p_obj->p_face[5] = 0;
  1062. for (i = 0; i < 4; i++) {
  1063. p_obj->p_vertex[i].x += p_bod->x;
  1064. p_obj->p_vertex[i].y += p_bod->y;
  1065. p_obj->p_vertex[i].z += p_bod->z;
  1066. }
  1067. p_kont->p_obj[4] = p_obj;
  1068. // dolni strana
  1069. p_obj = vyrob_objekt_komplet(4, 6);
  1070. strcpy(p_obj->jmeno, "obj6");
  1071. p_obj->x_rect = p_obj->y_rect = 1;
  1072. p_obj->p_vertex[0].x = -x;
  1073. p_obj->p_vertex[0].y = -y;
  1074. p_obj->p_vertex[0].z = -z;
  1075. p_obj->p_vertex[0].tu1 = 0;
  1076. p_obj->p_vertex[0].tv1 = 0;
  1077. p_obj->p_vertex[0].tu2 = 0;
  1078. p_obj->p_vertex[0].tv2 = 0;
  1079. p_obj->p_vertex[0].tu3 = 0;
  1080. p_obj->p_vertex[0].tv3 = 0;
  1081. p_obj->p_vertex[0].tu4 = 0;
  1082. p_obj->p_vertex[0].tv4 = 0;
  1083. p_obj->p_vertex[1].x = x;
  1084. p_obj->p_vertex[1].y = -y;
  1085. p_obj->p_vertex[1].z = -z;
  1086. p_obj->p_vertex[1].tu1 = 1;
  1087. p_obj->p_vertex[1].tv1 = 0;
  1088. p_obj->p_vertex[1].tu2 = 1;
  1089. p_obj->p_vertex[1].tv2 = 0;
  1090. p_obj->p_vertex[1].tu3 = 1;
  1091. p_obj->p_vertex[1].tv3 = 0;
  1092. p_obj->p_vertex[1].tu4 = 1;
  1093. p_obj->p_vertex[1].tv4 = 0;
  1094. p_obj->p_vertex[3].x = x;
  1095. p_obj->p_vertex[3].y = -y;
  1096. p_obj->p_vertex[3].z = z;
  1097. p_obj->p_vertex[3].tu1 = 1;
  1098. p_obj->p_vertex[3].tv1 = 1;
  1099. p_obj->p_vertex[3].tu2 = 1;
  1100. p_obj->p_vertex[3].tv2 = 1;
  1101. p_obj->p_vertex[3].tu3 = 1;
  1102. p_obj->p_vertex[3].tv3 = 1;
  1103. p_obj->p_vertex[3].tu4 = 1;
  1104. p_obj->p_vertex[3].tv4 = 1;
  1105. p_obj->p_vertex[2].x = -x;
  1106. p_obj->p_vertex[2].y = -y;
  1107. p_obj->p_vertex[2].z = z;
  1108. p_obj->p_vertex[2].tu1 = 0;
  1109. p_obj->p_vertex[2].tv1 = 1;
  1110. p_obj->p_vertex[2].tu2 = 0;
  1111. p_obj->p_vertex[2].tv2 = 1;
  1112. p_obj->p_vertex[2].tu3 = 0;
  1113. p_obj->p_vertex[2].tv3 = 1;
  1114. p_obj->p_vertex[2].tu4 = 0;
  1115. p_obj->p_vertex[2].tv4 = 1;
  1116. p_obj->p_face[0] = 1;
  1117. p_obj->p_face[1] = 0;
  1118. p_obj->p_face[2] = 3;
  1119. p_obj->p_face[3] = 3;
  1120. p_obj->p_face[4] = 0;
  1121. p_obj->p_face[5] = 2;
  1122. for (i = 0; i < 4; i++) {
  1123. p_obj->p_vertex[i].x += p_bod->x;
  1124. p_obj->p_vertex[i].y += p_bod->y;
  1125. p_obj->p_vertex[i].z += p_bod->z;
  1126. }
  1127. p_kont->p_obj[5] = p_obj;
  1128. updatuj_kontejner_statistika(p_kont, TRUE);
  1129. nastav_barvu_bodu_kont_dword(p_kont, 0xffffffff, COLOR_SET);
  1130. kont_norm_vect(p_kont);
  1131. return (p_kont);
  1132. }
  1133. /*
  1134. Stredovy bod + dx,dy,dz
  1135. */
  1136. void pridej_krychli(EDIT_OBJEKT ** p_src, BOD * p_bod, float x, float y,
  1137. float z)
  1138. {
  1139. EDIT_OBJEKT *p_obj = vyrob_krychli(p_bod, x, y, z, 0xffffffff);
  1140. EDIT_OBJEKT *p_obj2;
  1141. p_obj2 = slep_objekty(*p_src, p_obj);
  1142. zrus_objekt(p_src);
  1143. zrus_objekt(&p_obj);
  1144. *p_src = p_obj2;
  1145. }
  1146. /*
  1147. Vyrobi billboard na BOD + dx,dy
  1148. */
  1149. EDIT_OBJEKT *vyrob_billboard(BOD * p_bod, float x, float y)
  1150. {
  1151. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(4, 6);
  1152. int i;
  1153. p_obj->p_vertex[0].x = -x;
  1154. p_obj->p_vertex[0].y = -y;
  1155. p_obj->p_vertex[0].z = 0;
  1156. p_obj->p_vertex[1].x = x;
  1157. p_obj->p_vertex[1].y = -y;
  1158. p_obj->p_vertex[1].z = 0;
  1159. p_obj->p_vertex[2].x = x;
  1160. p_obj->p_vertex[2].y = y;
  1161. p_obj->p_vertex[2].z = 0;
  1162. p_obj->p_vertex[3].x = -x;
  1163. p_obj->p_vertex[3].y = y;
  1164. p_obj->p_vertex[3].z = 0;
  1165. p_obj->p_vertex[0].tu1 = 0;
  1166. p_obj->p_vertex[0].tv1 = 0;
  1167. p_obj->p_vertex[1].tu1 = 1;
  1168. p_obj->p_vertex[1].tv1 = 0;
  1169. p_obj->p_vertex[2].tu1 = 1;
  1170. p_obj->p_vertex[2].tv1 = 1;
  1171. p_obj->p_vertex[3].tu1 = 0;
  1172. p_obj->p_vertex[3].tv1 = 1;
  1173. for (i = 0; i < 4; i++) {
  1174. p_obj->p_vertex[i].x += p_bod->x;
  1175. p_obj->p_vertex[i].y += p_bod->y;
  1176. p_obj->p_vertex[i].z += p_bod->z;
  1177. }
  1178. // predni strana
  1179. p_obj->p_face[0] = 0;
  1180. p_obj->p_face[1] = 1;
  1181. p_obj->p_face[2] = 2;
  1182. p_obj->p_face[3] = 2;
  1183. p_obj->p_face[4] = 3;
  1184. p_obj->p_face[5] = 0;
  1185. return (p_obj);
  1186. }
  1187. // Spocita obalku objektu
  1188. void objekt_obalka(EDIT_OBJEKT * p_obj, GLMATRIX * p_m, BOD * p_min,
  1189. BOD * p_max)
  1190. {
  1191. MUJ_BOD *p_vert;
  1192. BOD a;
  1193. int v;
  1194. p_vert = p_obj->p_vertex;
  1195. assert(p_vert && p_obj->vertexnum);
  1196. mujbod2bod(&a, p_obj->p_vertex);
  1197. if (p_m)
  1198. transformuj_bod_bod_matici(&a, p_m);
  1199. *p_min = *p_max = a;
  1200. for (v = 1; v < p_obj->vertexnum; v++) {
  1201. mujbod2bod(&a, p_obj->p_vertex + v);
  1202. if (p_m)
  1203. transformuj_bod_bod_matici(&a, p_m);
  1204. if (a.x < p_min->x)
  1205. p_min->x = a.x;
  1206. if (a.y < p_min->y)
  1207. p_min->y = a.y;
  1208. if (a.z < p_min->z)
  1209. p_min->z = a.z;
  1210. if (a.x > p_max->x)
  1211. p_max->x = a.x;
  1212. if (a.y > p_max->y)
  1213. p_max->y = a.y;
  1214. if (a.z > p_max->z)
  1215. p_max->z = a.z;
  1216. }
  1217. }
  1218. void poly_obalka(EDIT_MESH_POLY * p_poly, GLMATRIX * p_mat, BOD * p_min,
  1219. BOD * p_max)
  1220. {
  1221. BOD max(-FLT_MAX, -FLT_MAX, -FLT_MAX), min(FLT_MAX, FLT_MAX, FLT_MAX), a;
  1222. int f;
  1223. for (f = 0; f < p_poly->facenum; f++) {
  1224. a.x = p_poly->p_koord[f].x;
  1225. a.y = p_poly->p_koord[f].y;
  1226. a.z = p_poly->p_koord[f].z;
  1227. if (p_mat)
  1228. transformuj_bod_bod_matici(&a, p_mat);
  1229. if (a.x < min.x)
  1230. min.x = a.x;
  1231. if (a.y < min.y)
  1232. min.y = a.y;
  1233. if (a.z < min.z)
  1234. min.z = a.z;
  1235. if (a.x > max.x)
  1236. max.x = a.x;
  1237. if (a.y > max.y)
  1238. max.y = a.y;
  1239. if (a.z > max.z)
  1240. max.z = a.z;
  1241. }
  1242. *p_max = max;
  1243. *p_min = min;
  1244. }
  1245. // spocita obalku kontejneru - spocita z matic objektu
  1246. void kontejner_obalka(EDIT_KONTEJNER * p_kont)
  1247. {
  1248. EDIT_OBJEKT *p_obj;
  1249. OBB_OLD *p_obb = &p_kont->obb;
  1250. BOD max(-FLT_MAX, -FLT_MAX, -FLT_MAX), min(FLT_MAX, FLT_MAX, FLT_MAX);
  1251. int k;
  1252. for (k = 0; k < MAX_KONT_OBJEKTU; k++) {
  1253. p_obj = p_kont->p_obj[k];
  1254. if (p_obj) {
  1255. kd_min_max_bod(&p_obj->obb.aabb_min, &min, &max);
  1256. kd_min_max_bod(&p_obj->obb.aabb_max, &min, &max);
  1257. }
  1258. }
  1259. vektor_set_all(p_obb->obb, 1, 0, 0);
  1260. vektor_set_all(p_obb->obb + 1, 0, 1, 0);
  1261. vektor_set_all(p_obb->obb + 2, 0, 0, 1);
  1262. kd_stred_bunky(&min, &max, &p_kont->obb.obb_stred);
  1263. kd_len_bunky(&min, &max, &p_kont->obb.obb_len);
  1264. }
  1265. void kontejner_obalka_aabb(EDIT_KONTEJNER * p_kont, BOD * p_min, BOD * p_max)
  1266. {
  1267. EDIT_OBJEKT *p_obj;
  1268. int k;
  1269. vektor_set(p_min, FLT_MAX);
  1270. vektor_set(p_max, -FLT_MAX);
  1271. for (k = 0; k < MAX_KONT_OBJEKTU; k++) {
  1272. p_obj = p_kont->p_obj[k];
  1273. if (p_obj) {
  1274. kd_min_max_bod(&p_obj->obb.aabb_min, p_min, p_max);
  1275. kd_min_max_bod(&p_obj->obb.aabb_max, p_min, p_max);
  1276. }
  1277. }
  1278. }
  1279. // cte velikost objektu v bytech
  1280. int cti_velikost_objektu(EDIT_OBJEKT * p_obj)
  1281. {
  1282. if (p_obj)
  1283. return (sizeof(EDIT_OBJEKT) +
  1284. p_obj->vertexnum * sizeof(p_obj->p_vertex[0]) +
  1285. p_obj->facenum * sizeof(p_obj->p_face[0]) +
  1286. p_obj->linenum * sizeof(p_obj->p_line[0]));
  1287. else
  1288. return (0);
  1289. }
  1290. void cti_velikost_kontejneru(EDIT_KONTEJNER * p_kont, int *p_size,
  1291. int *p_objektu)
  1292. {
  1293. int o;
  1294. int size;
  1295. int objektu = 0;
  1296. size = sizeof(EDIT_KONTEJNER);
  1297. for (o = 0; o < p_kont->max_objektu; o++) {
  1298. if (p_kont->p_obj[o]) {
  1299. size += cti_velikost_objektu(p_kont->p_obj[o]);
  1300. objektu++;
  1301. }
  1302. }
  1303. *p_size += size;
  1304. *p_objektu += objektu;
  1305. }
  1306. int intersect_ray_koule(BOD * p_stred, float radius, BOD * p_orig,
  1307. BOD * p_dir)
  1308. {
  1309. BOD q = *p_dir;
  1310. BOD p(p_orig->x - p_stred->x, p_orig->y - p_stred->y,
  1311. p_orig->z - p_stred->z);
  1312. float a, b2, c;
  1313. float D4, sqD4, t2;
  1314. a = q.x * q.x + q.y * q.y + q.z * q.z;
  1315. b2 = (skal_soucin(q, p)) / 2;
  1316. c = (q.x - p_stred->x) * (q.x - p_stred->x)
  1317. + (q.y - p_stred->y) * (q.y - p_stred->y)
  1318. + (q.z - p_stred->z) * (q.z - p_stred->z)
  1319. - radius * radius;
  1320. // att + bt + c = 0
  1321. D4 = b2 * b2 - a * c;
  1322. if (D4 < 0)
  1323. return (FALSE);
  1324. sqD4 = (float) sqrt(D4);
  1325. t2 = (sqD4 - b2) / a;
  1326. if (t2 < 0)
  1327. return (FALSE);
  1328. else
  1329. return (TRUE);
  1330. }
  1331. // FACE_SOUS *p_fsous;
  1332. static int _num_pass(word * p_f1, word * p_f2)
  1333. {
  1334. int i, j;
  1335. int hit = 0;
  1336. for (i = 0; i < 3; i++) {
  1337. for (j = 0; j < 3; j++) {
  1338. if (p_f1[i] == p_f2[j])
  1339. hit++;
  1340. }
  1341. }
  1342. return (hit);
  1343. }
  1344. // importovat z 3ds modelama !!!!
  1345. // toto je moje berlicka
  1346. void obj_vyrob_list_sousednosti(EDIT_OBJEKT * p_obj)
  1347. {
  1348. int f, fi;
  1349. int hit;
  1350. if (p_obj->p_fsous) {
  1351. free(p_obj->p_fsous);
  1352. }
  1353. /*
  1354. p_obj->p_fsous = mmalloc(sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1355. memset(p_obj->p_fsous,K_CHYBA,sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1356. for(f = 0; f < p_obj->facenum; f+=3) {
  1357. hit = 0;
  1358. for(fi = 0; fi < p_obj->facenum; fi+=3) {
  1359. if(f == fi)
  1360. continue;
  1361. // face maji 2 spolecne body
  1362. if(_num_pass(p_obj->p_face+f, p_obj->p_face+fi) == 2) {
  1363. assert(hit < 3);
  1364. p_obj->p_fsous[f+hit] = fi;
  1365. hit++;
  1366. }
  1367. }
  1368. }
  1369. */
  1370. }
  1371. static int _num_pass_vertex(OBJ_VERTEX ** p_f1, OBJ_VERTEX ** p_f2)
  1372. {
  1373. int i, j;
  1374. int hit = 0;
  1375. for (i = 0; i < 3; i++) {
  1376. for (j = 0; j < 3; j++) {
  1377. if (stejny_vertex_point((BOD *) (p_f1[i]), (BOD *) (p_f2[j])))
  1378. hit++;
  1379. }
  1380. }
  1381. return (hit);
  1382. }
  1383. void obj_vyrob_list_sousednosti_full(EDIT_OBJEKT * p_obj)
  1384. {
  1385. OBJ_VERTEX *p_face1[3];
  1386. OBJ_VERTEX *p_face2[3];
  1387. int f, fi;
  1388. int hit;
  1389. if (p_obj->p_fsous) {
  1390. free(p_obj->p_fsous);
  1391. }
  1392. /*
  1393. p_obj->p_fsous = mmalloc(sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1394. memset(p_obj->p_fsous,K_CHYBA,sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1395. for(f = 0; f < p_obj->facenum; f+=3) {
  1396. hit = 0;
  1397. for(fi = 0; fi < p_obj->facenum; fi+=3) {
  1398. if(f == fi)
  1399. continue;
  1400. // face maji 2 spolecne body
  1401. p_face1[0] = p_obj->p_vertex+(p_obj->p_face[f]);
  1402. p_face1[1] = p_obj->p_vertex+(p_obj->p_face[f+1]);
  1403. p_face1[2] = p_obj->p_vertex+(p_obj->p_face[f+2]);
  1404. p_face2[0] = p_obj->p_vertex+(p_obj->p_face[fi]);
  1405. p_face2[1] = p_obj->p_vertex+(p_obj->p_face[fi+1]);
  1406. p_face2[2] = p_obj->p_vertex+(p_obj->p_face[fi+2]);
  1407. if(_num_pass_vertex(p_face1, p_face2) == 2) {
  1408. assert(hit < 3);
  1409. p_obj->p_fsous[f+hit++] = fi;
  1410. }
  1411. }
  1412. }
  1413. */
  1414. }
  1415. void scale_normal_roh(MUJ_BOD * p_vertex, FACE * p_face, int v1, int v2,
  1416. int v3, BOD * p_normal)
  1417. {
  1418. BOD vektor1, vektor2, p1, p2;
  1419. float uhel; // 180 stupnu = 1.0f
  1420. vektor_sub(mujbod2bod(&p1, p_vertex + p_face[v2]),
  1421. mujbod2bod(&p2, p_vertex + p_face[v1]), &vektor1);
  1422. vektor_norm(&vektor1);
  1423. vektor_sub(mujbod2bod(&p1, p_vertex + p_face[v3]),
  1424. mujbod2bod(&p2, p_vertex + p_face[v1]), &vektor2);
  1425. vektor_norm(&vektor2);
  1426. uhel = acosf(vektor_uhel(&vektor1, &vektor2));
  1427. if (finite(uhel) && !isnan(uhel))
  1428. vektor_scale(p_normal, uhel / PI);
  1429. else
  1430. vektor_set(p_normal, 0.0f);
  1431. }
  1432. typedef struct _NORM_INDICIE
  1433. { // popisuje vertex
  1434. BOD *p_vert;
  1435. BOD norm;
  1436. int vertex;
  1437. } NORM_INDICIE;
  1438. typedef struct _FACE_INDICIE
  1439. { // popisuje face
  1440. int vertex;
  1441. BOD norm;
  1442. } FACE_INDICIE;
  1443. typedef struct _NORM_INT_PROC
  1444. {
  1445. int ind_akt; // Pole vertexu
  1446. int ind_max;
  1447. NORM_INDICIE *p_ind;
  1448. int fn_akt; // Pole facu
  1449. int fn_max;
  1450. FACE_INDICIE *p_fn;
  1451. } NORM_INT_PROC;
  1452. void ind_init(NORM_INT_PROC * p_prc, int vert, int facu)
  1453. {
  1454. memset(p_prc, 0, sizeof(p_prc[0]));
  1455. /*
  1456. p_prc->p_ind = mmalloc(sizeof(p_prc->p_ind[0])*vert);
  1457. p_prc->ind_max = vert;
  1458. p_prc->p_fn = mmalloc(sizeof(p_prc->p_fn[0])*facu);
  1459. p_prc->fn_max = facu;
  1460. */
  1461. }
  1462. void ind_smaz(NORM_INT_PROC * p_prc)
  1463. {
  1464. /*
  1465. null_free(&p_prc->p_ind);
  1466. null_free(&p_prc->p_fn);
  1467. memset(p_prc,0,sizeof(p_prc[0]));
  1468. */
  1469. }
  1470. BOD *ind_calc_fnorm(EDIT_OBJEKT * p_obj)
  1471. {
  1472. BOD *p_fnorm;
  1473. int i;
  1474. p_fnorm = (BOD *) mmalloc(sizeof(p_fnorm[0]) * p_obj->facenum);
  1475. for (i = 0; i < p_obj->facenum; i += 3) {
  1476. vektor_norm(calc_face_normal((BOD *) (p_obj->p_vertex + p_obj->p_face[i]),
  1477. (BOD *) (p_obj->p_vertex + p_obj->p_face[i + 1]),
  1478. (BOD *) (p_obj->p_vertex + p_obj->p_face[i + 2]), p_fnorm + i / 3));
  1479. }
  1480. return (p_fnorm);
  1481. }
  1482. int ind_add_obj(NORM_INT_PROC * p_prc, EDIT_OBJEKT * p_obj)
  1483. {
  1484. int i, vnum = p_obj->vertexnum, fnum = p_obj->facenum;
  1485. int handle;
  1486. NORM_INDICIE *p_ind;
  1487. FACE_INDICIE *p_fn;
  1488. BOD *p_fnorm;
  1489. if (p_prc->ind_akt + vnum > p_prc->ind_max)
  1490. return (K_CHYBA);
  1491. if (p_prc->fn_akt + fnum > p_prc->fn_max)
  1492. return (K_CHYBA);
  1493. p_fnorm = ind_calc_fnorm(p_obj);
  1494. handle = p_prc->ind_akt;
  1495. p_ind = p_prc->p_ind + handle;
  1496. p_prc->ind_akt += vnum;
  1497. for (i = 0; i < vnum; i++, p_ind++) {
  1498. p_ind->p_vert = (BOD *) (p_obj->p_vertex + i);
  1499. p_ind->vertex = handle + i;
  1500. }
  1501. p_fn = p_prc->p_fn + p_prc->fn_akt;
  1502. p_prc->fn_akt += fnum;
  1503. for (i = 0; i < fnum; i += 3) {
  1504. p_fn->norm = p_fnorm[i / 3];
  1505. scale_normal_roh(p_obj->p_vertex, p_obj->p_face + i, 0, 1, 2,
  1506. &p_fn->norm);
  1507. p_fn->vertex = handle + p_obj->p_face[i];
  1508. p_fn++;
  1509. p_fn->norm = p_fnorm[i / 3];
  1510. scale_normal_roh(p_obj->p_vertex, p_obj->p_face + i, 1, 0, 2,
  1511. &p_fn->norm);
  1512. p_fn->vertex = handle + p_obj->p_face[i + 1];
  1513. p_fn++;
  1514. p_fn->norm = p_fnorm[i / 3];
  1515. scale_normal_roh(p_obj->p_vertex, p_obj->p_face + i, 2, 0, 1,
  1516. &p_fn->norm);
  1517. p_fn->vertex = handle + p_obj->p_face[i + 2];
  1518. p_fn++;
  1519. }
  1520. free(p_fnorm);
  1521. return (handle);
  1522. }
  1523. // Kopiruje normaly zpet do objektu
  1524. int ind_vypln_obj(NORM_INT_PROC * p_prc, EDIT_OBJEKT * p_obj, int handle)
  1525. {
  1526. NORM_INDICIE *p_ind;
  1527. int i, vnum = p_obj->vertexnum;
  1528. if (handle + vnum > p_prc->ind_akt)
  1529. return (K_CHYBA);
  1530. p_ind = p_prc->p_ind + handle;
  1531. for (i = 0; i < vnum; i++, p_ind++) {
  1532. norm2mujbod(p_obj->p_vertex + i, &p_ind->norm);
  1533. }
  1534. return (handle);
  1535. }
  1536. inline int porovnej_vertexy(BOD * p_v1, BOD * p_v2)
  1537. {
  1538. if (p_v1->x > p_v2->x) {
  1539. return (1);
  1540. }
  1541. else if (p_v1->x < p_v2->x) {
  1542. return (-1);
  1543. }
  1544. else if (p_v1->y > p_v2->y) {
  1545. return (1);
  1546. }
  1547. else if (p_v1->y < p_v2->y) {
  1548. return (-1);
  1549. }
  1550. else if (p_v1->z > p_v2->z) {
  1551. return (1);
  1552. }
  1553. else if (p_v1->z < p_v2->z) {
  1554. return (-1);
  1555. }
  1556. else {
  1557. return (0);
  1558. }
  1559. }
  1560. int ind_sort_rec(const void *p_m1, const void *p_m2)
  1561. {
  1562. const NORM_INDICIE *p_i1 = (NORM_INDICIE *) p_m1;
  1563. const NORM_INDICIE *p_i2 = (NORM_INDICIE *) p_m2;
  1564. return (porovnej_vertexy(p_i1->p_vert, p_i2->p_vert));
  1565. }
  1566. int ind_sort_rec2(const void *p_m1, const void *p_m2)
  1567. {
  1568. const FACE_INDICIE *p_i1 = (FACE_INDICIE *) p_m1;
  1569. const FACE_INDICIE *p_i2 = (FACE_INDICIE *) p_m2;
  1570. return (p_i1->vertex - p_i2->vertex);
  1571. }
  1572. void ind_sort(NORM_INT_PROC * p_prc, int brutal)
  1573. {
  1574. if (brutal)
  1575. qsort(p_prc->p_ind, p_prc->ind_akt, sizeof(p_prc->p_ind[0]),
  1576. ind_sort_rec);
  1577. qsort(p_prc->p_fn, p_prc->fn_akt, sizeof(p_prc->p_fn[0]), ind_sort_rec2);
  1578. }
  1579. int ind_sort_obj_rec(const void *p_m1, const void *p_m2)
  1580. {
  1581. const NORM_INDICIE *p_i1 = (NORM_INDICIE *) p_m1;
  1582. const NORM_INDICIE *p_i2 = (NORM_INDICIE *) p_m2;
  1583. return (p_i1->vertex - p_i2->vertex);
  1584. }
  1585. void ind_sort_obj(NORM_INT_PROC * p_prc)
  1586. {
  1587. qsort(p_prc->p_ind, p_prc->ind_akt, sizeof(p_prc->p_ind[0]),
  1588. ind_sort_obj_rec);
  1589. }
  1590. BOD *ind_najdi_normal(NORM_INT_PROC * p_prc, int vertex, BOD * p_norm)
  1591. {
  1592. FACE_INDICIE *p_face = p_prc->p_fn;
  1593. int i, start = 0, stop = p_prc->fn_akt, stred;
  1594. do {
  1595. stred = start + ((stop - start) >> 1);
  1596. if (p_face[stred].vertex == vertex) {
  1597. break;
  1598. }
  1599. else {
  1600. if (start + 1 >= stop) {
  1601. return (NULL);
  1602. }
  1603. else if (p_face[stred].vertex > vertex) {
  1604. stop = stred;
  1605. }
  1606. else {
  1607. start = stred;
  1608. }
  1609. }
  1610. } while (1);
  1611. for (i = stred; i < p_prc->fn_akt && p_face[i].vertex == vertex; i++) {
  1612. vektor_add(p_norm, &p_face[i].norm, p_norm);
  1613. }
  1614. for (i = stred - 1; i > -1 && p_face[i].vertex == vertex; i--) {
  1615. vektor_add(p_norm, &p_face[i].norm, p_norm);
  1616. }
  1617. return (p_norm);
  1618. }
  1619. inline int stejny_ind(NORM_INDICIE * p_ind1, NORM_INDICIE * p_ind2)
  1620. {
  1621. return (stejny_vertex_point(p_ind1->p_vert, p_ind2->p_vert));
  1622. }
  1623. void ind_calc_norm(NORM_INT_PROC * p_prc, int brutal)
  1624. {
  1625. NORM_INDICIE *p_first;
  1626. NORM_INDICIE *p_last;
  1627. BOD norm;
  1628. int i, j, num;
  1629. ind_sort(p_prc, brutal);
  1630. p_last = p_prc->p_ind;
  1631. i = 0;
  1632. do {
  1633. p_first = p_last;
  1634. if (brutal) {
  1635. for (; (i < p_prc->ind_akt) && stejny_ind(p_first, p_last);
  1636. i++, p_last++);
  1637. num = p_last - p_first;
  1638. }
  1639. else {
  1640. if (i < p_prc->ind_akt) {
  1641. i++;
  1642. p_last++;
  1643. num = 1;
  1644. }
  1645. }
  1646. vektor_set(&norm, 0.0f);
  1647. for (j = 0; j < num; j++) {
  1648. ind_najdi_normal(p_prc, p_first[j].vertex, &norm);
  1649. }
  1650. vektor_norm(&norm);
  1651. for (j = 0; j < num; j++) {
  1652. p_first[j].norm = norm;
  1653. }
  1654. } while (i < p_prc->ind_akt);
  1655. ind_sort_obj(p_prc);
  1656. }
  1657. void calc_norm_vec(EDIT_OBJEKT * p_obj)
  1658. {
  1659. NORM_INT_PROC prc;
  1660. int h1;
  1661. ind_init(&prc, p_obj->vertexnum, p_obj->facenum);
  1662. h1 = ind_add_obj(&prc, p_obj);
  1663. ind_calc_norm(&prc, FALSE);
  1664. ind_vypln_obj(&prc, p_obj, h1);
  1665. ind_smaz(&prc);
  1666. }
  1667. void kont_norm_vect_iobject(EDIT_KONTEJNER * p_kont)
  1668. {
  1669. EDIT_OBJEKT *p_obj;
  1670. NORM_INT_PROC prc;
  1671. int *p_handle;
  1672. int i, o;
  1673. updatuj_kontejner_statistika(p_kont, FALSE);
  1674. ind_init(&prc, p_kont->bodu, p_kont->facu);
  1675. p_handle = (int *) mmalloc(sizeof(p_handle[0]) * p_kont->objektu);
  1676. i = 0;
  1677. oe_olist_reset(&o);
  1678. while ((p_obj = oe_olist_next(p_kont, &o))) {
  1679. p_handle[i] = ind_add_obj(&prc, p_obj);
  1680. i++;
  1681. }
  1682. ind_calc_norm(&prc, TRUE);
  1683. i = 0;
  1684. oe_olist_reset(&o);
  1685. while ((p_obj = oe_olist_next(p_kont, &o))) {
  1686. ind_vypln_obj(&prc, p_obj, p_handle[i]);
  1687. i++;
  1688. }
  1689. ind_smaz(&prc);
  1690. free(p_handle);
  1691. }
  1692. void kont_norm_vect(EDIT_KONTEJNER * p_kont_top)
  1693. {
  1694. EDIT_KONTEJNER *p_kont = p_kont_top;
  1695. int i;
  1696. while (p_kont) {
  1697. if (p_kont->kflag & KONT_BRUTALNORMAL) {
  1698. kont_norm_vect_iobject(p_kont);
  1699. }
  1700. else {
  1701. for (i = 0; i < p_kont->max_objektu; i++) {
  1702. if (p_kont->p_obj[i])
  1703. calc_norm_vec(p_kont->p_obj[i]);
  1704. }
  1705. }
  1706. p_kont = p_kont->p_next;
  1707. }
  1708. }
  1709. /*
  1710. Rendering linelistu
  1711. */
  1712. void kresli_objekt_dratove_jednoduse(EDIT_OBJEKT * p_obj)
  1713. {
  1714. int i, l1, l2;
  1715. assert(p_obj);
  1716. glBegin(GL_LINES);
  1717. for (i = 0; i < p_obj->linenum; i += 2) {
  1718. l1 = p_obj->p_line[i];
  1719. l2 = p_obj->p_line[i + 1];
  1720. glColor3fv(&p_obj->p_vertex[l1].dr);
  1721. glVertex3f(p_obj->p_vertex[l1].x, p_obj->p_vertex[l1].y,
  1722. p_obj->p_vertex[l1].z);
  1723. glColor3fv(&p_obj->p_vertex[l2].dr);
  1724. glVertex3f(p_obj->p_vertex[l2].x, p_obj->p_vertex[l2].y,
  1725. p_obj->p_vertex[l2].z);
  1726. }
  1727. glEnd();
  1728. }
  1729. void nastav_material_rgb_MAT(RGB_M * p_rgb)
  1730. {
  1731. MATERIAL mtrl;
  1732. ZeroMemory(&mtrl, sizeof(mtrl));
  1733. mtrl.ambient_r = p_rgb->r;
  1734. mtrl.ambient_g = p_rgb->g;
  1735. mtrl.ambient_b = p_rgb->b;
  1736. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (float *) p_rgb);
  1737. }
  1738. void nastav_material(float r, float g, float b)
  1739. {
  1740. MATERIAL mtrl;
  1741. ZeroMemory(&mtrl, sizeof(mtrl));
  1742. mtrl.ambient_r = r;
  1743. mtrl.ambient_g = g;
  1744. mtrl.ambient_b = b;
  1745. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, &mtrl.ambient_r);
  1746. }
  1747. void kresli_kosoctverec(GLMATRIX * p_project, GLMATRIX * p_camera,
  1748. GLMATRIX * p_world, BOD * p_p, float r, float dr, float dg, float db)
  1749. {
  1750. GLMATRIX rr;
  1751. BOD p, vrc[6];
  1752. p.x = p_p->x;
  1753. p.y = p_p->y;
  1754. p.z = p_p->z;
  1755. calc_3d_2d_matrix(p_world, p_camera, p_project, &rr);
  1756. transformuj_bod_matici(&p.x, &p.y, &p.z, &rr);
  1757. r = r * p.z * 0.1f;
  1758. vrc[0].x = p_p->x + r;
  1759. vrc[0].y = p_p->y;
  1760. vrc[0].z = p_p->z;
  1761. vrc[1].x = p_p->x;
  1762. vrc[1].y = p_p->y;
  1763. vrc[1].z = p_p->z + r;
  1764. vrc[2].x = p_p->x - r;
  1765. vrc[2].y = p_p->y;
  1766. vrc[2].z = p_p->z;
  1767. vrc[3].x = p_p->x;
  1768. vrc[3].y = p_p->y;
  1769. vrc[3].z = p_p->z - r;
  1770. vrc[4].x = p_p->x;
  1771. vrc[4].y = p_p->y + r;
  1772. vrc[4].z = p_p->z;
  1773. vrc[5].x = p_p->x;
  1774. vrc[5].y = p_p->y - r;
  1775. vrc[5].z = p_p->z;
  1776. glColor3f(dr, dg, db);
  1777. glBegin(GL_LINE_LOOP);
  1778. glVertex3fv((float *) &vrc[0]);
  1779. glVertex3fv((float *) &vrc[1]);
  1780. glVertex3fv((float *) &vrc[2]);
  1781. glVertex3fv((float *) &vrc[3]);
  1782. glVertex3fv((float *) &vrc[0]);
  1783. glVertex3fv((float *) &vrc[4]);
  1784. glVertex3fv((float *) &vrc[2]);
  1785. glVertex3fv((float *) &vrc[5]);
  1786. glVertex3fv((float *) &vrc[0]);
  1787. glEnd();
  1788. glBegin(GL_LINE_LOOP);
  1789. glVertex3fv((float *) &vrc[3]);
  1790. glVertex3fv((float *) &vrc[4]);
  1791. glVertex3fv((float *) &vrc[1]);
  1792. glVertex3fv((float *) &vrc[5]);
  1793. glVertex3fv((float *) &vrc[3]);
  1794. glEnd();
  1795. glFlush();
  1796. }
  1797. void kresli_kosoctverec_word(BOD * p_p, float r, dword barva)
  1798. {
  1799. BOD vrc[6];
  1800. vrc[0].x = p_p->x + r;
  1801. vrc[0].y = p_p->y;
  1802. vrc[0].z = p_p->z;
  1803. vrc[1].x = p_p->x;
  1804. vrc[1].y = p_p->y;
  1805. vrc[1].z = p_p->z + r;
  1806. vrc[2].x = p_p->x - r;
  1807. vrc[2].y = p_p->y;
  1808. vrc[2].z = p_p->z;
  1809. vrc[3].x = p_p->x;
  1810. vrc[3].y = p_p->y;
  1811. vrc[3].z = p_p->z - r;
  1812. vrc[4].x = p_p->x;
  1813. vrc[4].y = p_p->y + r;
  1814. vrc[4].z = p_p->z;
  1815. vrc[5].x = p_p->x;
  1816. vrc[5].y = p_p->y - r;
  1817. vrc[5].z = p_p->z;
  1818. glColor4ubv((byte *) & barva);
  1819. glBegin(GL_LINE_LOOP);
  1820. glVertex3fv((float *) (&vrc[0]));
  1821. glVertex3fv((float *) (&vrc[1]));
  1822. glVertex3fv((float *) (&vrc[2]));
  1823. glVertex3fv((float *) (&vrc[3]));
  1824. glVertex3fv((float *) (&vrc[0]));
  1825. glVertex3fv((float *) (&vrc[4]));
  1826. glVertex3fv((float *) (&vrc[2]));
  1827. glVertex3fv((float *) (&vrc[5]));
  1828. glVertex3fv((float *) (&vrc[0]));
  1829. glEnd();
  1830. glBegin(GL_LINE_LOOP);
  1831. glVertex3fv((float *) (&vrc[3]));
  1832. glVertex3fv((float *) (&vrc[4]));
  1833. glVertex3fv((float *) (&vrc[1]));
  1834. glVertex3fv((float *) (&vrc[5]));
  1835. glVertex3fv((float *) (&vrc[3]));
  1836. glEnd();
  1837. glFlush();
  1838. }
  1839. void kresli_oktanovou_bunku_minmax(BOD * p_min, BOD * p_max, dword barva)
  1840. {
  1841. glColor3ubv((byte *) & barva);
  1842. glBegin(GL_LINES);
  1843. glVertex3f(p_min->x, p_min->y, p_min->z);
  1844. glVertex3f(p_min->x, p_max->y, p_min->z);
  1845. glVertex3f(p_min->x, p_min->y, p_min->z);
  1846. glVertex3f(p_max->x, p_min->y, p_min->z);
  1847. glVertex3f(p_min->x, p_min->y, p_min->z);
  1848. glVertex3f(p_min->x, p_min->y, p_max->z);
  1849. glVertex3f(p_max->x, p_max->y, p_max->z);
  1850. glVertex3f(p_min->x, p_max->y, p_max->z);
  1851. glVertex3f(p_max->x, p_max->y, p_max->z);
  1852. glVertex3f(p_max->x, p_min->y, p_max->z);
  1853. glVertex3f(p_max->x, p_max->y, p_max->z);
  1854. glVertex3f(p_max->x, p_max->y, p_min->z);
  1855. glVertex3f(p_min->x, p_max->y, p_min->z);
  1856. glVertex3f(p_min->x, p_max->y, p_max->z);
  1857. glVertex3f(p_min->x, p_max->y, p_min->z);
  1858. glVertex3f(p_max->x, p_max->y, p_min->z);
  1859. glVertex3f(p_max->x, p_min->y, p_max->z);
  1860. glVertex3f(p_min->x, p_min->y, p_max->z);
  1861. glVertex3f(p_max->x, p_min->y, p_max->z);
  1862. glVertex3f(p_max->x, p_min->y, p_min->z);
  1863. glVertex3f(p_max->x, p_min->y, p_min->z);
  1864. glVertex3f(p_max->x, p_max->y, p_min->z);
  1865. glVertex3f(p_min->x, p_min->y, p_max->z);
  1866. glVertex3f(p_min->x, p_max->y, p_max->z);
  1867. glEnd();
  1868. }
  1869. void konfiguruj_look_up(int *p_looksqrt_linear,
  1870. int *p_looksqrt_quadratic,
  1871. float *p_looksqrt_linear_float, float *p_looksqrt_quadratic_float)
  1872. {
  1873. int x, y, i;
  1874. float vzdal;
  1875. float fx, fy, fz, m1, m2, qk = (float) sqrt(255.0f);
  1876. // 0 = max
  1877. // 255 = min -> tak to nastavit
  1878. // koeficienty utlumu si schovat !!
  1879. for (x = 0; x < MAX_LOOK_TABLE; x++) {
  1880. for (y = 0; y < MAX_LOOK_TABLE; y++) {
  1881. i = y * MAX_LOOK_TABLE + x;
  1882. // intenzity ve fixed-point
  1883. fx = (float) (x);
  1884. fy = (float) (y);
  1885. fz = 0.0f;
  1886. vzdal = sqrtf((float) (fx * fx + fy * fy + fz * fz)); // vzdal
  1887. if ((m1 = (255.0f - vzdal) / 255.0f) < 0.0f)
  1888. m1 = 0.0f;
  1889. vzdal = (qk / 255.0f) * vzdal;
  1890. if ((m2 = (255.0f - vzdal * vzdal) / 255.0f) < 0.0f)
  1891. m2 = 0.0f;
  1892. p_looksqrt_linear[i] = ftoi(((float) (0xffffff)) * m1);
  1893. if (p_looksqrt_linear[i] > 0x01000000)
  1894. p_looksqrt_linear[i] = 0x01000000;
  1895. p_looksqrt_quadratic[i] = ftoi(((float) (0xffffff)) * m2);
  1896. if (p_looksqrt_quadratic[i] > 0x01000000)
  1897. p_looksqrt_quadratic[i] = 0x01000000;
  1898. }
  1899. }
  1900. for (i = 0; i < MAX_LOOK_TABLE; i++) {
  1901. vzdal = (float) (i);
  1902. if ((m1 = (255.0f - vzdal) / 255.0f) < 0.0f)
  1903. m1 = 0.0f;
  1904. vzdal = qk / 255.0f * vzdal;
  1905. if ((m2 = (255.0f - vzdal * vzdal) / 255.0f) < 0.0f)
  1906. m2 = 0.0f;
  1907. p_looksqrt_linear_float[i] = m1;
  1908. p_looksqrt_quadratic_float[i] = m2;
  1909. }
  1910. }
  1911. void transformuj_objekt_text_coord(EDIT_OBJEKT * p_obj, GLMATRIX * p_mat,
  1912. int coord)
  1913. {
  1914. int i;
  1915. float z;
  1916. for (i = 0; i < p_obj->vertexnum; i++) {
  1917. if (coord & 0x1) {
  1918. z = 0.0f;
  1919. transformuj_bod_matici(&p_obj->p_vertex[i].tu1, &p_obj->p_vertex[i].tv1,
  1920. &z, p_mat);
  1921. }
  1922. if (coord & 0x2) {
  1923. z = 0.0f;
  1924. transformuj_bod_matici(&p_obj->p_vertex[i].tu2, &p_obj->p_vertex[i].tv2,
  1925. &z, p_mat);
  1926. }
  1927. }
  1928. }
  1929. void transformuj_kontejner_text_coord(EDIT_KONTEJNER * p_kont,
  1930. GLMATRIX * p_mat, int coord)
  1931. {
  1932. EDIT_OBJEKT *p_obj;
  1933. int o;
  1934. oe_olist_reset(&o);
  1935. while (p_obj = oe_olist_next(p_kont, &o)) {
  1936. transformuj_objekt_text_coord(p_obj, p_mat, coord);
  1937. }
  1938. }
  1939. /* Spekularni ENV mapping na vybrany
  1940. */
  1941. void mesh_env_maping_spec(GAME_MESH_OLD * p_mesh, GLMATRIX * p_cam,
  1942. EDIT_MATERIAL ** p_mt)
  1943. {
  1944. EDIT_MATERIAL *p_mat, *p_mat_prev = NULL;
  1945. float tx, ty, tz;
  1946. float px, py, pz;
  1947. float v1, v2, v3;
  1948. float r, g, b, uhel;
  1949. BOD *p_norm;
  1950. BODRGB *p_spec;
  1951. BODRGB *p_spec_src;
  1952. float add1, add2, scale;
  1953. int os, v, vertexnum;
  1954. int i, kframe;
  1955. GLMATRIX *p_kw;
  1956. int flag2;
  1957. p_mesh->p_data->k2flag |= KONT2_UPDATE_SPEC;
  1958. kframe = p_mesh->p_data->kflag & KONT_KEYFRAME;
  1959. if (!kframe)
  1960. p_kw = &p_mesh->m;
  1961. v1 = p_cam->_13;
  1962. v2 = p_cam->_23;
  1963. v3 = p_cam->_33;
  1964. for (i = 0; i < p_mesh->objektu; i++) {
  1965. p_mat = p_mt[p_mesh->p_mat[i]];
  1966. flag2 = p_mat->flag2;
  1967. if (flag2 & MAT2_ENV_SPEC) {
  1968. if (p_mat_prev != p_mat) {
  1969. // test na zmenu materialu
  1970. os = p_mat->flag2 & MAT2_ENV_SPEC_OBE;
  1971. r = p_mat->env_r;
  1972. g = p_mat->env_g;
  1973. b = p_mat->env_b;
  1974. add1 = p_mat->env_add1;
  1975. add2 = p_mat->env_add2;
  1976. scale = p_mat->env_scale;
  1977. p_mat_prev = p_mat;
  1978. }
  1979. vertexnum = p_mesh->objektnum[i];
  1980. v = p_mesh->objektstart[i];
  1981. p_norm = p_mesh->p_vertex_norm + v;
  1982. p_spec = p_mesh->p_vertex_spec + v;
  1983. //p_spec_src = p_mesh->p_vertex_spec ? p_mesh->p_vertex_spec+v : NULL;
  1984. p_spec_src = NULL;
  1985. if (kframe)
  1986. p_kw = p_mesh->p_key + i;
  1987. for (v = 0; v < vertexnum; v++) {
  1988. px = p_norm->x;
  1989. py = p_norm->y;
  1990. pz = p_norm->z;
  1991. p_norm++;
  1992. tx = p_kw->_11 * px + p_kw->_21 * py + p_kw->_31 * pz;
  1993. ty = p_kw->_12 * px + p_kw->_22 * py + p_kw->_32 * pz;
  1994. tz = p_kw->_13 * px + p_kw->_23 * py + p_kw->_33 * pz;
  1995. norm_vect(&tx, &ty, &tz);
  1996. uhel = (scale * (add1 + tx * v1 + ty * v2 + tz * v3)) + add2;
  1997. if (p_spec_src) {
  1998. if (os) {
  1999. uhel = fabsf(uhel);
  2000. p_spec->r = (r * uhel) + p_spec_src->r;
  2001. p_spec->g = (g * uhel) + p_spec_src->g;
  2002. p_spec->b = (b * uhel) + p_spec_src->b;
  2003. }
  2004. else {
  2005. if (uhel > 0) {
  2006. p_spec->r = (r * uhel) + p_spec_src->r;
  2007. p_spec->g = (g * uhel) + p_spec_src->g;
  2008. p_spec->b = (b * uhel) + p_spec_src->b;
  2009. }
  2010. }
  2011. p_spec_src++;
  2012. p_spec++;
  2013. }
  2014. else {
  2015. if (os) {
  2016. uhel = fabsf(uhel);
  2017. p_spec->r = r * uhel;
  2018. p_spec->g = g * uhel;
  2019. p_spec->b = b * uhel;
  2020. }
  2021. else {
  2022. if (uhel > 0) {
  2023. p_spec->r = r * uhel;
  2024. p_spec->g = g * uhel;
  2025. p_spec->b = b * uhel;
  2026. }
  2027. }
  2028. p_spec++;
  2029. }
  2030. }
  2031. }
  2032. }
  2033. }
  2034. /*
  2035. Env-mapping na poly
  2036. */
  2037. void poly_env_maping_spec(EDIT_MESH_POLY * p_poly, EDIT_MATERIAL * p_mat,
  2038. GLMATRIX * p_cam)
  2039. {
  2040. TEXT_KOORD *p_koord;
  2041. int os = p_mat->flag2 & MAT2_ENV_SPEC_OBE;
  2042. float tx, ty, tz;
  2043. float v1, v2, v3;
  2044. int v, vertexnum;
  2045. float uhel;
  2046. float r, g, b;
  2047. float add1, add2, scale;
  2048. r = p_mat->env_r;
  2049. g = p_mat->env_g;
  2050. b = p_mat->env_b;
  2051. v1 = p_cam->_13;
  2052. v2 = p_cam->_23;
  2053. v3 = p_cam->_33;
  2054. add1 = p_mat->env_add1;
  2055. add2 = p_mat->env_add2;
  2056. scale = p_mat->env_scale;
  2057. vertexnum = p_poly->facenum;
  2058. p_koord = p_poly->p_koord;
  2059. for (v = 0; v < vertexnum; v++) {
  2060. tx = p_koord->nx;
  2061. ty = p_koord->ny;
  2062. tz = p_koord->nz;
  2063. uhel = (scale * (add1 + (tx * v1 + ty * v2 + tz * v3))) + add2;
  2064. if (os)
  2065. uhel = fabsf(uhel);
  2066. else if (uhel < 0)
  2067. continue;
  2068. p_koord->sr = r * uhel + p_koord->msr;
  2069. p_koord->sg = g * uhel + p_koord->msr;
  2070. p_koord->sb = b * uhel + p_koord->msr;
  2071. p_koord++;
  2072. }
  2073. p_poly->kflag |= KONT_UPLOAD;
  2074. }
  2075. int intersect_poly(EDIT_MESH_POLY * p_poly, BOD * p_orig, BOD * p_dir)
  2076. {
  2077. TEXT_KOORD *p_face;
  2078. int f, facenum = p_poly->facenum;
  2079. float t, u, v;
  2080. p_face = p_poly->p_koord;
  2081. for (f = 0; f < facenum; f += 3, p_face += 3) {
  2082. if (intersect_triangle_ncull(p_orig, p_dir, (BOD *) p_face,
  2083. (BOD *) (p_face + 2), (BOD *) (p_face + 1), &t, &u, &v) && t > 0.0f
  2084. && t < 1.0f)
  2085. return (TRUE);
  2086. }
  2087. return (FALSE);
  2088. }
  2089. int intersect_mesh_objekt(GAME_MESH_OLD * p_mesh, int o, BOD * p_orig,
  2090. BOD * p_dir)
  2091. {
  2092. BOD *p_vertex_pos;
  2093. int j, d, facenum, fnum2;
  2094. int kflag = p_mesh->p_data->kflag;
  2095. int key_flag = kflag & KONT_KEYFRAME;
  2096. int *p_face, typ;
  2097. int *p_face_prvni;
  2098. float t, u, v;
  2099. // Dynamicke meshe - automaticky uspech
  2100. if (p_mesh->p_data->kflag & KONT_STATIC
  2101. || p_mesh->p_data->kflag & KONT_NORMAL_ANIM) {
  2102. assert(o < p_mesh->objektu);
  2103. p_vertex_pos = p_mesh->p_vertex_pos;
  2104. p_face = p_mesh->p_face + p_mesh->facestart[o];
  2105. facenum = p_mesh->facenum[o];
  2106. for (j = 0; j < facenum; j++) {
  2107. fnum2 = *p_face++;
  2108. typ = *p_face++;
  2109. switch (typ) {
  2110. case GL_TRIANGLES:
  2111. for (d = 0; d < fnum2; d += 3, p_face += 3) {
  2112. if (intersect_triangle_ncull(p_orig, p_dir,
  2113. p_vertex_pos + p_face[0], p_vertex_pos + p_face[2],
  2114. p_vertex_pos + p_face[1], &t, &u, &v) && t > 0.0f && t < 1.0f)
  2115. return (TRUE);
  2116. }
  2117. break;
  2118. case GL_TRIANGLE_STRIP:
  2119. if (intersect_triangle_ncull(p_orig, p_dir,
  2120. p_vertex_pos + p_face[0], p_vertex_pos + p_face[2],
  2121. p_vertex_pos + p_face[1], &t, &u, &v) && t > 0.0f && t < 1.0f)
  2122. return (TRUE);
  2123. p_face += 3;
  2124. for (d = 3; d < fnum2; d++, p_face++) {
  2125. if (intersect_triangle_ncull(p_orig, p_dir,
  2126. p_vertex_pos + p_face[-2], p_vertex_pos + p_face[-1],
  2127. p_vertex_pos + p_face[0], &t, &u, &v) && t > 0.0f && t < 1.0f)
  2128. return (TRUE);
  2129. }
  2130. break;
  2131. case GL_TRIANGLE_FAN:
  2132. if (intersect_triangle_ncull(p_orig, p_dir,
  2133. p_vertex_pos + p_face[0], p_vertex_pos + p_face[2],
  2134. p_vertex_pos + p_face[1], &t, &u, &v) && t > 0.0f && t < 1.0f)
  2135. return (TRUE);
  2136. p_face_prvni = p_face;
  2137. p_face += 3;
  2138. fnum2 -= 3;
  2139. for (d = 3; d < fnum2; d++, p_face++) {
  2140. if (intersect_triangle_ncull(p_orig, p_dir,
  2141. p_vertex_pos + p_face_prvni[0], p_vertex_pos + p_face[0],
  2142. p_vertex_pos + p_face[-1], &t, &u, &v) && t > 0.0f
  2143. && t < 1.0f)
  2144. return (TRUE);
  2145. }
  2146. break;
  2147. }
  2148. }
  2149. return (FALSE);
  2150. }
  2151. else {
  2152. return (TRUE);
  2153. }
  2154. }