25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

401 lines
18 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://www.wtfpl.net/ for more details.
  9. //
  10. #include <lol/engine-internal.h>
  11. namespace lol
  12. {
  13. Debug::DrawContext::Data Debug::DrawContext::m_global = Debug::DrawContext::Data(vec4(1.f));
  14. typedef Debug::DrawContext DC;
  15. typedef Debug::DrawContext::Data DCD;
  16. //Screen to world conversion
  17. vec3 Debug::WorldToScreen(vec3 pos) { return Debug::WorldToScreen(vec4(pos, 1.f)); }
  18. vec3 Debug::WorldToScreen(vec3 pos, mat4 view_proj) { return Debug::WorldToScreen(vec4(pos, 1.f), view_proj); }
  19. vec3 Debug::WorldToScreen(vec4 pos)
  20. {
  21. Scene& scene = Scene::GetScene();
  22. if (!scene.GetCamera())
  23. return vec3::zero;
  24. mat4 const view_proj = scene.GetCamera()->GetProjection() * scene.GetCamera()->GetView();
  25. return Debug::WorldToScreen(pos, view_proj);
  26. }
  27. vec3 Debug::WorldToScreen(vec4 pos, mat4 view_proj)
  28. {
  29. vec4 screen_pos = view_proj * pos;
  30. return (screen_pos / screen_pos.w).xyz;
  31. }
  32. //--
  33. vec3 Debug::ScreenToWorld(vec2 pos, float z) { return Debug::ScreenToWorld(vec3(pos, z)); }
  34. vec3 Debug::ScreenToWorld(vec3 pos)
  35. {
  36. Scene& scene = Scene::GetScene();
  37. if (!scene.GetCamera())
  38. return vec3::zero;
  39. mat4 const inv_view_proj = inverse(scene.GetCamera()->GetProjection() * scene.GetCamera()->GetView());
  40. return Debug::ScreenToWorld(pos, inv_view_proj);
  41. }
  42. vec3 Debug::ScreenToWorld(vec2 pos, mat4 inv_view_proj, float z) { return Debug::ScreenToWorld(vec3(pos, z), inv_view_proj); }
  43. vec3 Debug::ScreenToWorld(vec3 pos, mat4 inv_view_proj)
  44. {
  45. vec4 screen_pos = inv_view_proj * vec4(pos, 1.f);
  46. return (screen_pos / screen_pos.w).xyz;
  47. }
  48. vec3 Debug::ScreenToWorld(vec3 pos, mat4 view, mat4 proj)
  49. {
  50. vec4 screen_pos = inverse(proj) * vec4(pos, 1.f);
  51. return (inverse(view) * (screen_pos / screen_pos.w)).xyz;
  52. }
  53. //Draw stuff in World
  54. //-- LINE: 3D -2D - 3D_to_2D --------------------------------------------------
  55. //Root func
  56. void Debug::DrawLine(vec3 a, vec3 b, DCD data)
  57. {
  58. Scene::GetScene().AddLine(a, b, data.m_color, data.m_duration, data.m_mask);
  59. }
  60. void Debug::DrawLine(vec2 a, vec3 b, DCD data, float az) { DrawLine(vec3(a, az), b, data); }
  61. void Debug::DrawLine(vec2 a, vec2 b, DCD data, float az, float bz) { DrawLine(vec3(a, az), vec3(b, bz), data); }
  62. void Debug::DrawLine(vec3 a, vec3 b) { DrawLine(a, b, DC::GetGlobalData()); }
  63. void Debug::DrawLine(vec2 a, vec3 b, float az) { DrawLine(a, b, DC::GetGlobalData(), az); }
  64. void Debug::DrawLine(vec2 a, vec2 b, float az, float bz) { DrawLine(a, b, DC::GetGlobalData(), az, bz); }
  65. //-- GIZMO --------------------------------------------------------------------
  66. void Debug::DrawGizmo(vec3 pos, vec3 x, vec3 y, vec3 z, float size)
  67. {
  68. Debug::DrawLine(pos, pos + x * size, Color::red);
  69. Debug::DrawLine(pos, pos + y * size, Color::green);
  70. Debug::DrawLine(pos, pos + z * size, Color::blue);
  71. }
  72. void Debug::DrawGizmo(vec2 pos, vec3 x, vec3 y, vec3 z, float size, float posz)
  73. {
  74. Debug::DrawLine(pos, pos + x.xy * size, Color::red, posz, posz + x.z * size);
  75. Debug::DrawLine(pos, pos + y.xy * size, Color::green, posz, posz + y.z * size);
  76. Debug::DrawLine(pos, pos + z.xy * size, Color::blue, posz, posz + z.z * size);
  77. }
  78. //-- GRID ---------------------------------------------------------------------
  79. void Debug::DrawGrid(vec3 pos, vec3 x, vec3 y, vec3 z, float size, bool draw_3d)
  80. {
  81. float seg_sz = DC::GetGlobalData().m_segment_size;
  82. int seg_nb = lol::max((int)(size / seg_sz), 1);
  83. seg_sz = size / (float)seg_nb;
  84. //Draw Gizmo
  85. Debug::DrawGizmo(pos, x, y, z, size);
  86. Debug::DrawLine(pos, pos - x * size, Color::gray);
  87. Debug::DrawLine(pos, pos - y * size, Color::gray);
  88. Debug::DrawLine(pos, pos - z * size, Color::gray);
  89. //grid
  90. for (float i = (float)-seg_nb; i <= seg_nb; i++)
  91. {
  92. if (i != 0)
  93. {
  94. float iter = seg_sz * ((float)i);
  95. Debug::DrawLine(vec3(-size, 0, iter), vec3(size, 0, iter), Color::dark_gray);
  96. Debug::DrawLine(vec3(iter, 0, -size), vec3(iter, 0, size), Color::dark_gray);
  97. if (draw_3d)
  98. {
  99. Debug::DrawLine(vec3(0, -size, iter), vec3(0, size, iter), Color::dark_gray);
  100. Debug::DrawLine(vec3(0, iter, -size), vec3(0, iter, size), Color::dark_gray);
  101. Debug::DrawLine(vec3(-size, iter, 0), vec3(size, iter, 0), Color::dark_gray);
  102. Debug::DrawLine(vec3(iter, -size, 0), vec3(iter, size, 0), Color::dark_gray);
  103. }
  104. }
  105. }
  106. }
  107. //-- ARROW: 3D -2D - 3D_to_2D -------------------------------------------------
  108. void Debug::DrawArrow(vec3 a, vec3 b, vec2 s) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y)); }
  109. void Debug::DrawArrow(vec2 a, vec3 b, vec2 s, float az) { Debug::DrawArrow(a, b.xy, vec3(s.x, s.y, s.y), az, b.z); }
  110. void Debug::DrawArrow(vec2 a, vec2 b, vec2 s, float az, float bz) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), az, bz); }
  111. void Debug::DrawArrow(vec3 a, vec3 b, vec3 s) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), DC::GetGlobalData()); }
  112. void Debug::DrawArrow(vec2 a, vec3 b, vec3 s, float az) { Debug::DrawArrow(a, b.xy, vec3(s.x, s.y, s.y), DC::GetGlobalData(), az, b.z); }
  113. void Debug::DrawArrow(vec2 a, vec2 b, vec3 s, float az, float bz) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), DC::GetGlobalData(), az, bz); }
  114. void Debug::DrawArrow(vec3 a, vec3 b, vec3 s, DCD data)
  115. {
  116. vec3 z = s.x * normalize(b - a);
  117. vec3 x = s.z * orthonormal(b - a);
  118. vec3 y = s.y * cross(normalize(x), normalize(z));
  119. Debug::DrawLine(a, b, data);
  120. Debug::DrawLine(b, b - z + x, data);
  121. Debug::DrawLine(b, b - z - x, data);
  122. Debug::DrawLine(b, b - z + y, data);
  123. Debug::DrawLine(b, b - z - y, data);
  124. Debug::DrawLine(b - z + x, b - z + y, data);
  125. Debug::DrawLine(b - z + x, b - z - y, data);
  126. Debug::DrawLine(b - z - x, b - z + y, data);
  127. Debug::DrawLine(b - z - x, b - z - y, data);
  128. Debug::DrawLine(b - z + x, b - z - x, data);
  129. Debug::DrawLine(b - z + y, b - z - y, data);
  130. }
  131. void Debug::DrawArrow(vec2 a, vec3 b, vec3 s, DCD data, float az)
  132. {
  133. vec3 bn = Debug::WorldToScreen(b);
  134. DrawArrow(a, bn.xy, s, data, az, bn.z);
  135. }
  136. void Debug::DrawArrow(vec2 a, vec2 b, vec3 s, DCD data, float az, float bz)
  137. {
  138. vec3 an = vec3(a, az);
  139. vec3 bn = vec3(b, bz);
  140. vec3 z = s.x * normalize(bn - an);
  141. vec3 x = s.z * orthonormal(bn - an);
  142. vec3 y = s.y * cross(normalize(x), normalize(z));
  143. Debug::DrawLine(a, b, data, az, bz);
  144. Debug::DrawLine(b, b - (z + x).xy, data, bz, bz - (z + x).z);
  145. Debug::DrawLine(b, b - (z - x).xy, data, bz, bz - (z - x).z);
  146. Debug::DrawLine(b, b - (z + y).xy, data, bz, bz - (z + y).z);
  147. Debug::DrawLine(b, b - (z - y).xy, data, bz, bz - (z - y).z);
  148. Debug::DrawLine(b - (z + x).xy, b - (z + y).xy, data, bz - (z + x).z, bz - (z + y).z);
  149. Debug::DrawLine(b - (z + x).xy, b - (z - y).xy, data, bz - (z + x).z, bz - (z - y).z);
  150. Debug::DrawLine(b - (z - x).xy, b - (z + y).xy, data, bz - (z - x).z, bz - (z + y).z);
  151. Debug::DrawLine(b - (z - x).xy, b - (z - y).xy, data, bz - (z - x).z, bz - (z - y).z);
  152. Debug::DrawLine(b - (z + x).xy, b - (z - x).xy, data, bz - (z + x).z, bz - (z - x).z);
  153. Debug::DrawLine(b - (z + y).xy, b - (z - y).xy, data, bz - (z + y).z, bz - (z - y).z);
  154. }
  155. //-- BOX: 3D -2D - 3D_to_2D ---------------------------------------------------
  156. void Debug::DrawBox(box3 a) { Debug::DrawBox(a.aa, a.bb, DC::GetGlobalData()); }
  157. void Debug::DrawBox(box2 a) { Debug::DrawBox(a.aa, a.bb, DC::GetGlobalData()); }
  158. void Debug::DrawBox(box3 a, DCD data) { Debug::DrawBox(a.aa, a.bb, data); }
  159. void Debug::DrawBox(box2 a, DCD data) { Debug::DrawBox(a.aa, a.bb, data); }
  160. void Debug::DrawBox(vec3 a, vec3 b) { Debug::DrawBox(a, b, DC::GetGlobalData()); }
  161. void Debug::DrawBox(vec2 a, vec2 b) { Debug::DrawBox(a, b, DC::GetGlobalData()); }
  162. void Debug::DrawBox(vec2 a, float s) { Debug::DrawBox(a, s, DC::GetGlobalData()); }
  163. void Debug::DrawBox(vec3 a, vec3 b, DCD data) { Debug::DrawBox(a, b, mat4::identity, data); }
  164. void Debug::DrawBox(vec2 a, vec2 b, DCD data) { Debug::DrawBox(a, b, mat2::identity, data); }
  165. void Debug::DrawBox(vec2 a, float s, DCD data) { Debug::DrawBox(a, s, mat2::identity, data); }
  166. void Debug::DrawBox(box3 a, mat4 transform) { Debug::DrawBox(a.aa, a.bb, transform, DC::GetGlobalData()); }
  167. void Debug::DrawBox(box2 a, mat2 transform) { Debug::DrawBox(a.aa, a.bb, transform, DC::GetGlobalData()); }
  168. void Debug::DrawBox(box3 a, mat4 transform, DCD data) { Debug::DrawBox(a.aa, a.bb, transform, data); }
  169. void Debug::DrawBox(box2 a, mat2 transform, DCD data) { Debug::DrawBox(a.aa, a.bb, transform, data); }
  170. void Debug::DrawBox(vec3 a, vec3 b, mat4 transform) { Debug::DrawBox(a, b, transform, DC::GetGlobalData()); }
  171. void Debug::DrawBox(vec2 a, vec2 b, mat2 transform) { Debug::DrawBox(a, b, transform, DC::GetGlobalData()); }
  172. void Debug::DrawBox(vec2 a, float s, mat2 transform) { Debug::DrawBox(a, s, transform, DC::GetGlobalData()); }
  173. void Debug::DrawBox(vec3 a, vec3 b, mat4 transform, DCD data)
  174. {
  175. vec4 v[8];
  176. for (int i = 0; i < 8; i++)
  177. {
  178. v[i].x = i & 1 ? a.x : b.x;
  179. v[i].y = i & 2 ? a.y : b.y;
  180. v[i].z = i & 4 ? a.z : b.z;
  181. v[i].w = 1.f;
  182. }
  183. for (int i = 0; i < 4; i++)
  184. {
  185. int j = ((i & 1) << 1) | ((i >> 1) ^ 1);
  186. Debug::DrawLine((transform * v[i]).xyz, (transform * v[i + 4]).xyz, data);
  187. Debug::DrawLine((transform * v[i]).xyz, (transform * v[j]).xyz, data);
  188. Debug::DrawLine((transform * v[i + 4]).xyz, (transform * v[j + 4]).xyz, data);
  189. }
  190. }
  191. void Debug::DrawBox(vec2 a, vec2 b, mat2 transform, DCD data)
  192. {
  193. vec2 v[4];
  194. v[0] = a;
  195. v[1] = vec2(a.x, b.y);
  196. v[2] = b;
  197. v[3] = vec2(b.x, a.y);
  198. Debug::DrawLine((transform * v[0]).xy, (transform * v[1]).xy, data);
  199. Debug::DrawLine((transform * v[1]).xy, (transform * v[2]).xy, data);
  200. Debug::DrawLine((transform * v[2]).xy, (transform * v[3]).xy, data);
  201. Debug::DrawLine((transform * v[3]).xy, (transform * v[0]).xy, data);
  202. }
  203. void Debug::DrawBox(vec2 a, float s, mat2 transform, DCD data)
  204. {
  205. vec2 b = s * vec2(1.f, Renderer::Get()->GetXYRatio());
  206. Debug::DrawBox(a - b, a + b, transform, data);
  207. }
  208. //-- CIRCLE -------------------------------------------------------------------
  209. void Debug::DrawCircle(vec2 a, float s) { Debug::DrawCircle(a, s * vec2(1.f, Renderer::Get()->GetXYRatio()), DC::GetGlobalData()); }
  210. void Debug::DrawCircle(vec3 a, vec3 n) { Debug::DrawCircle(a, n, DC::GetGlobalData()); }
  211. void Debug::DrawCircle(vec2 a, vec2 s) { Debug::DrawCircle(a, s * vec2(1.f, Renderer::Get()->GetXYRatio()), DC::GetGlobalData()); }
  212. void Debug::DrawCircle(vec3 a, vec3 x, vec3 y) { Debug::DrawCircle(a, x, y, DC::GetGlobalData()); }
  213. void Debug::DrawCircle(vec2 a, vec2 x, vec2 y) { Debug::DrawCircle(a, x, y, DC::GetGlobalData()); }
  214. void Debug::DrawCircle(vec3 a, vec3 n, DCD data)
  215. {
  216. vec3 x = orthogonal(n);
  217. vec3 y = cross(normalize(n), normalize(x)) * length(n);
  218. DrawCircle(a, x, y, data);
  219. }
  220. void Debug::DrawCircle(vec2 a, vec2 s, DCD data)
  221. {
  222. vec2 x = vec2::axis_x * s.x;
  223. vec2 y = vec2::axis_y * s.y;
  224. DrawCircle(a, x, y, data);
  225. }
  226. //--
  227. void Debug::DrawCircle(vec3 a, vec3 x, vec3 y, DCD data)
  228. {
  229. float size = F_PI * 2.f * lol::max(length(x), length(y));
  230. int segment_nb = lol::max(1, (int)((size * .25f) / data.m_segment_size));
  231. for (int i = 0; i < segment_nb; i++)
  232. {
  233. float a0 = (((float)i) / (float)segment_nb) * F_PI_2;
  234. float a1 = (((float)i + 1) / (float)segment_nb) * F_PI_2;
  235. vec2 p0 = vec2(lol::cos(a0), lol::sin(a0));
  236. vec2 p1 = vec2(lol::cos(a1), lol::sin(a1));
  237. Debug::DrawLine(a + p0.x * x + p0.y * y, a + p1.x * x + p1.y * y, data);
  238. Debug::DrawLine(a + p0.x * -x + p0.y * -y, a + p1.x * -x + p1.y * -y, data);
  239. Debug::DrawLine(a + p0.x * x + p0.y * -y, a + p1.x * x + p1.y * -y, data);
  240. Debug::DrawLine(a + p0.x * -x + p0.y * y, a + p1.x * -x + p1.y * y, data);
  241. }
  242. }
  243. //--
  244. void Debug::DrawCircle(vec2 a, vec2 x, vec2 y, DCD data)
  245. {
  246. float size = F_PI * 2.f * lol::max(length(x), length(y));
  247. int segment_nb = lol::max(1, (int)((size * .25f) / data.m_segment_size));
  248. for (int i = 0; i < segment_nb; i++)
  249. {
  250. float a0 = (((float)i) / (float)segment_nb) * F_PI_2;
  251. float a1 = (((float)i + 1) / (float)segment_nb) * F_PI_2;
  252. vec2 p0 = vec2(lol::cos(a0), lol::sin(a0));
  253. vec2 p1 = vec2(lol::cos(a1), lol::sin(a1));
  254. Debug::DrawLine(a + p0.x * x + p0.y * y, a + p1.x * x + p1.y * y, data);
  255. Debug::DrawLine(a + p0.x * -x + p0.y * -y, a + p1.x * -x + p1.y * -y, data);
  256. Debug::DrawLine(a + p0.x * x + p0.y * -y, a + p1.x * x + p1.y * -y, data);
  257. Debug::DrawLine(a + p0.x * -x + p0.y * y, a + p1.x * -x + p1.y * y, data);
  258. }
  259. }
  260. //-- SPHERE -------------------------------------------------------------------
  261. void Debug::DrawSphere(vec3 a, float s) { Debug::DrawSphere(a, s, DC::GetGlobalData()); }
  262. void Debug::DrawSphere(vec3 a, float s, DCD data) { Debug::DrawSphere(a, vec3::axis_x * s, vec3::axis_y * s, vec3::axis_z * s, data); }
  263. void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z) { Debug::DrawSphere(a, x, y, z, DC::GetGlobalData()); }
  264. void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z, DCD data)
  265. {
  266. Debug::DrawCircle(a, x, y, data);
  267. Debug::DrawCircle(a, x, (y + z) * .707f, data);
  268. Debug::DrawCircle(a, x, (y - z) * .707f, data);
  269. Debug::DrawCircle(a, z, x, data);
  270. Debug::DrawCircle(a, z, (x + y) * .707f, data);
  271. Debug::DrawCircle(a, z, (x - y) * .707f, data);
  272. Debug::DrawCircle(a, y, z, data);
  273. Debug::DrawCircle(a, y, (z + x) * .707f, data);
  274. Debug::DrawCircle(a, y, (z - x) * .707f, data);
  275. }
  276. //-- CAPSULE ------------------------------------------------------------------
  277. void Debug::DrawCapsule(vec3 a, float s, vec3 h) { Debug::DrawCapsule(a, s, h, DC::GetGlobalData()); }
  278. void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h) { Debug::DrawCapsule(a, x, y, z, h, DC::GetGlobalData()); }
  279. void Debug::DrawCapsule(vec3 a, float s, vec3 h, DCD data)
  280. {
  281. vec3 x = orthonormal(h) * s;
  282. vec3 y = cross(normalize(h), normalize(x)) * s;
  283. Debug::DrawCapsule(a, x, y, normalize(h) * s, h, data);
  284. }
  285. //--
  286. void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h, DCD data)
  287. {
  288. float size = F_PI * 2.f * lol::max(length(x), length(y));
  289. int segment_nb = lol::max(1, (int)((size * .25f) / data.m_segment_size));
  290. for (int i = -1; i < 2; i += 2)
  291. {
  292. vec3 b = a + h * .5f * (float)i;
  293. vec3 c = a - h * .5f * (float)i;
  294. Debug::DrawCircle(b, x, y, data);
  295. Debug::DrawLine(b + x * (float)i, c + x * (float)i, data);
  296. Debug::DrawLine(b + y * (float)i, c + y * (float)i, data);
  297. for (int j = 0; j < segment_nb; j++)
  298. {
  299. float a0 = (((float)j) / (float)segment_nb) * F_PI_2;
  300. float a1 = (((float)j + 1) / (float)segment_nb) * F_PI_2;
  301. vec2 p0 = vec2(lol::cos(a0), lol::sin(a0));
  302. vec2 p1 = vec2(lol::cos(a1), lol::sin(a1));
  303. Debug::DrawLine(b + p0.x * x + p0.y * z * (float)i, b + p1.x * x + p1.y * z * (float)i, data);
  304. Debug::DrawLine(b + p0.x * -x + p0.y * z * (float)i, b + p1.x * -x + p1.y * z * (float)i, data);
  305. Debug::DrawLine(b + p0.x * y + p0.y * z * (float)i, b + p1.x * y + p1.y * z * (float)i, data);
  306. Debug::DrawLine(b + p0.x * -y + p0.y * z * (float)i, b + p1.x * -y + p1.y * z * (float)i, data);
  307. }
  308. }
  309. }
  310. //-- VIEW PROJ ----------------------------------------------------------------
  311. void Debug::DrawViewProj(mat4 view, mat4 proj) { Debug::DrawViewProj(view, proj, DC::GetGlobalData()); }
  312. void Debug::DrawViewProj(mat4 view_proj) { Debug::DrawViewProj(view_proj, DC::GetGlobalData()); }
  313. void Debug::DrawViewProj(mat4 view, mat4 proj, DCD data)
  314. {
  315. mat4 const view_proj = proj * view;
  316. //Pos to center
  317. vec3 p0 = (inverse(view) * vec4(vec3::zero, 1.f)).xyz;
  318. //Near plane
  319. mat4 const inv_view_proj = inverse(view_proj);
  320. vec4 p[4] = { inv_view_proj * vec4(-1.f, 1.f, -1.f, 1.f),
  321. inv_view_proj * vec4( 1.f, 1.f, -1.f, 1.f),
  322. inv_view_proj * vec4( 1.f,-1.f, -1.f, 1.f),
  323. inv_view_proj * vec4(-1.f,-1.f, -1.f, 1.f) };
  324. for (int i = 0; i < 4; i++)
  325. p[i] = p[i] / p[i].w;
  326. //Draw near
  327. for (int i = 0; i < 4; i++)
  328. Debug::DrawLine(p[i].xyz, p0, data);
  329. Debug::DrawViewProj(view_proj, data);
  330. }
  331. //--
  332. void Debug::DrawViewProj(mat4 view_proj, DCD data)
  333. {
  334. //Near plane
  335. mat4 const inv_view_proj = inverse(view_proj);
  336. vec4 p[8] = { inv_view_proj * vec4(-1.f, 1.f, 1.f, 1.f),
  337. inv_view_proj * vec4( 1.f, 1.f, 1.f, 1.f),
  338. inv_view_proj * vec4( 1.f,-1.f, 1.f, 1.f),
  339. inv_view_proj * vec4(-1.f,-1.f, 1.f, 1.f),
  340. inv_view_proj * vec4(-1.f, 1.f,-1.f, 1.f),
  341. inv_view_proj * vec4( 1.f, 1.f,-1.f, 1.f),
  342. inv_view_proj * vec4( 1.f,-1.f,-1.f, 1.f),
  343. inv_view_proj * vec4(-1.f,-1.f,-1.f, 1.f)
  344. };
  345. for (int i = 0; i < 8; i++)
  346. p[i] = p[i] / p[i].w;
  347. //Draw near
  348. for (int i = 0; i < 4; i++)
  349. Debug::DrawLine(p[i].xyz, p[(i + 1) % 4].xyz, data);
  350. //Draw far
  351. for (int i = 4; i < 8; i++)
  352. Debug::DrawLine(p[i].xyz, p[(i - 4 + 1) % 4 + 4].xyz, data);
  353. //Draw near to far
  354. for (int i = 0; i < 4; i++)
  355. Debug::DrawLine(p[i].xyz, p[i + 4].xyz, data);
  356. //Draw diagonal
  357. for (int i = 2; i < 6; i++)
  358. Debug::DrawLine(p[i].xyz, p[i + ((i < 4)?(-2):(+2))].xyz, data);
  359. }
  360. } /* namespace lol */