Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.25 KB | None | 0 0
  1. // gLib2D by Geecko - A simple, fast, light-weight 2D graphics library.
  2. //
  3. // This work is licensed under the Creative Commons BY-SA 3.0 Unported License.
  4. // See LICENSE for more details.
  5.  
  6. #include <pspkernel.h>
  7. #include <pspdebug.h>
  8. #include <pspdisplay.h>
  9. #include <pspgu.h>
  10. #include <malloc.h>
  11. #include <string.h>
  12.  
  13. #include "glib2d.h"
  14.  
  15. #define PSP_LINE_SIZE (512)
  16. #define PIXEL_SIZE (4)
  17. #define FRAMEBUFFER_SIZE (PSP_LINE_SIZE*G_SCR_H*PIXEL_SIZE)
  18. #define MALLOC_STEP 10
  19.  
  20. #define DEFAULT_SIDE       (10)
  21. #define DEFAULT_COORD_MODE (G_UP_LEFT)
  22. #define DEFAULT_X          (0.f)
  23. #define DEFAULT_Y          (0.f)
  24. #define DEFAULT_Z          (0.f)
  25. #define DEFAULT_COLOR      (WHITE)
  26. #define DEFAULT_ALPHA      (0xFF)
  27.  
  28. #define CURRENT_OBJ obj_list[obj_list_size]
  29.  
  30. typedef struct
  31. {
  32.   float x, y, z;
  33.   int crop_x, crop_y;
  34.   int crop_w, crop_h;
  35.   int scale_w, scale_h;
  36.   gColor color;
  37. } Obj_Properties;
  38.  
  39. // * Main vars *
  40. static unsigned int __attribute__((aligned(16))) gu_list[262144];
  41. bool init = G_FALSE, start = G_FALSE;
  42. // * Object vars *
  43. Obj_Properties* obj_list = NULL;
  44. int obj_list_size, obj_list_size_malloc; // Real & malloc'ed size
  45. bool obj_begin = G_FALSE;
  46. bool obj_use_z, obj_use_vert_color, obj_use_blend;
  47. // * Coord vars *
  48. gEnum obj_coord_mode;
  49. float obj_x, obj_y, obj_z;
  50. // * Crop vars *
  51. int obj_crop_x, obj_crop_y;
  52. int obj_crop_w, obj_crop_h;
  53. // * Scale vars *
  54. float obj_scale_w, obj_scale_h;
  55. // * Color & alpha vars *
  56. gColor obj_color;
  57. gAlpha obj_alpha;
  58. bool obj_colors_count, obj_alpha_count;
  59.  
  60. // * Internal functions *
  61.  
  62. void _gInit()
  63. {
  64.   // Init & setup GU
  65.   sceGuInit();
  66.   sceGuStart(GU_DIRECT, gu_list);
  67.  
  68.   sceGuDrawBuffer(GU_PSM_8888,(void*)FRAMEBUFFER_SIZE,PSP_LINE_SIZE);
  69.   sceGuDispBuffer(G_SCR_W,G_SCR_H,(void*)0,PSP_LINE_SIZE);
  70.   sceGuDepthBuffer((void*)(FRAMEBUFFER_SIZE*2),PSP_LINE_SIZE);
  71.   sceGuOffset(2048-(G_SCR_W/2),2048-(G_SCR_H/2));
  72.   sceGuViewport(2048,2048,G_SCR_W,G_SCR_H);
  73.   sceGuDepthRange(65535,0);
  74.   sceGuClearDepth(65535);
  75.  
  76.   sceGuScissor(0,0,G_SCR_W,G_SCR_H);
  77.   sceGuAlphaFunc(GU_GREATER,0,0xff);
  78.   sceGuDepthFunc(GU_LEQUAL);
  79.   sceGuBlendFunc(GU_ADD,GU_SRC_ALPHA,GU_ONE_MINUS_SRC_ALPHA,0,0);
  80.   sceGuTexFunc(GU_TFX_MODULATE,GU_TCC_RGBA);
  81.   sceGuTexFilter(GU_LINEAR,GU_LINEAR);
  82.   sceGuFrontFace(GU_CW);
  83.   sceGuShadeModel(GU_SMOOTH);
  84.  
  85.   sceGuEnable(GU_CULL_FACE);
  86.   sceGuEnable(GU_CLIP_PLANES);
  87.   sceGuEnable(GU_ALPHA_TEST);
  88.   sceGuEnable(GU_CLIP_PLANES);
  89.   sceGuEnable(GU_SCISSOR_TEST);
  90.  
  91.   sceGuFinish();
  92.   sceGuSync(0,0);
  93.   sceDisplayWaitVblankStart();
  94.   sceGuDisplay(GU_TRUE);
  95.  
  96.   init = G_TRUE;
  97. }
  98.  
  99.  
  100. void _gStart()
  101. {
  102.   if (!init) _gInit();
  103.  
  104.   sceKernelDcacheWritebackAll();
  105.   sceGuStart(GU_DIRECT,gu_list);
  106.   start = G_TRUE;
  107. }
  108.  
  109.  
  110. void _gCoordInit()
  111. {
  112.   gResetCoord();
  113.   obj_use_z = G_FALSE;
  114. }
  115.  
  116.  
  117. void _gScaleInit()
  118. {
  119.   gResetScale();
  120. }
  121.  
  122.  
  123. void _gColorInit()
  124. {
  125.   gResetColor();
  126.   obj_colors_count = 0;
  127.   obj_use_vert_color = G_FALSE;
  128. }
  129.  
  130.  
  131. void _gAlphaInit()
  132. {
  133.   gResetAlpha();
  134.   obj_use_blend = G_FALSE;
  135. }
  136.  
  137.  
  138. void _gAdd()
  139. {
  140.   if (!obj_begin) return;
  141.  
  142.   if (obj_list_size >= obj_list_size_malloc)
  143.   {
  144.     obj_list_size_malloc += MALLOC_STEP;
  145.     obj_list = realloc(obj_list,obj_list_size_malloc * sizeof(Obj_Properties));
  146.   }
  147.  
  148.   CURRENT_OBJ.x = obj_x;
  149.   CURRENT_OBJ.y = obj_y;
  150.   CURRENT_OBJ.z = obj_z;
  151.   CURRENT_OBJ.scale_w = obj_scale_w;
  152.   CURRENT_OBJ.scale_h = obj_scale_h;
  153.   CURRENT_OBJ.color = G_MODULATE(obj_color,255,obj_alpha); // Apply alpha modulation
  154.  
  155.   obj_list_size++;
  156. }
  157.  
  158.  
  159. // Vertex order: [texture uv] [color] [vertex]
  160. void* _gSetVertex(void* v, int i, bool x, bool y)
  161. {
  162.   int* v_p_int = v;
  163.   gColor* v_p_color;
  164.   float* v_p_float = v;
  165.  
  166.   // Texture
  167.  
  168.   // Color
  169.   v_p_color = (gColor*)v_p_int;
  170.   if (obj_use_vert_color) *(v_p_color++) = obj_list[i].color;
  171.   // Coord
  172.   v_p_float = (float*)v_p_color;
  173.   *(v_p_float++) = obj_list[i].x + (x ? obj_list[i].scale_w : 0);
  174.   *(v_p_float++) = obj_list[i].y + (y ? obj_list[i].scale_h : 0);
  175.   *(v_p_float++) = obj_list[i].z;
  176.  
  177.   return (void*)v_p_float;
  178. }
  179.  
  180.  
  181. // Insertion sort, because it is a fast and _stable_ sort.
  182. void _gVertexSort()
  183. {
  184.   int i, j;
  185.   Obj_Properties obj_tmp;
  186.   for (i=1; i<obj_list_size; i++)
  187.   {
  188.     j = i;
  189.     memcpy(&obj_tmp,obj_list+j,sizeof(Obj_Properties));
  190.     while (j>0 && obj_list[j-1].z < obj_tmp.z)
  191.     {
  192.       memcpy(obj_list+j,obj_list+j-1,sizeof(Obj_Properties));
  193.       j--;
  194.     }
  195.     memcpy(obj_list+j,&obj_tmp,sizeof(Obj_Properties));
  196.   }
  197. }
  198.  
  199. // * Main functions *
  200.  
  201. void gClear(gColor color, bool zclear)
  202. {
  203.   if (!start) _gStart();
  204.  
  205.   sceGuClearColor(color);
  206.   sceGuClear(GU_COLOR_BUFFER_BIT | GU_FAST_CLEAR_BIT
  207.              | (zclear ? GU_DEPTH_BUFFER_BIT : 0));
  208. }
  209.  
  210.  
  211. void gBegin()
  212. {
  213.   if (obj_begin) return;
  214.   if (!start) _gStart();
  215.  
  216.   _gCoordInit();
  217.   _gScaleInit();
  218.   _gColorInit();
  219.   _gAlphaInit();
  220.  
  221.   obj_list_size = 0;
  222.   obj_list_size_malloc = MALLOC_STEP;
  223.   obj_list = realloc(obj_list,obj_list_size_malloc * sizeof(Obj_Properties));
  224.  
  225.   obj_begin = G_TRUE;
  226. }
  227.  
  228.  
  229. void gEnd()
  230. {
  231.   if (!obj_begin || obj_list_size <= 0) return;
  232.  
  233.   // Horror : we need to sort the vertices.
  234.   if (obj_use_z && obj_use_blend) _gVertexSort();
  235.  
  236.   int prim = GU_SPRITES,
  237.       v_obj_nbr = 2,
  238.       v_nbr = v_obj_nbr * obj_list_size,
  239.       v_coord_size = 3,
  240.       v_tex_size = 0,
  241.       v_color_size = (obj_use_vert_color) ? 1 : 0,
  242.       v_size = v_tex_size * sizeof(int) +
  243.                v_color_size * sizeof(gColor) +
  244.                v_coord_size * sizeof(float),
  245.       v_type = GU_VERTEX_32BITF | GU_TRANSFORM_2D,
  246.       i;
  247.  
  248.   if (obj_use_vert_color) v_type |= GU_COLOR_8888;
  249.  
  250.   void *v = sceGuGetMemory(v_nbr * v_size), *vi = v;
  251.  
  252.   for (i=0; i!=obj_list_size; i++)
  253.   {
  254.     vi = _gSetVertex(vi,i,0,0);
  255.     vi = _gSetVertex(vi,i,1,1);
  256.   }
  257.  
  258.   if (obj_use_z)          sceGuEnable(GU_DEPTH_TEST);
  259.   else                    sceGuDisable(GU_DEPTH_TEST);
  260.   if (obj_use_blend)      sceGuEnable(GU_BLEND);
  261.   else                    sceGuDisable(GU_BLEND);
  262.   if (obj_use_vert_color) sceGuColor(WHITE);
  263.   else                    sceGuColor(obj_color);
  264.   sceGuDisable(GU_TEXTURE_2D);
  265.  
  266.   sceGuDrawArray(prim,v_type,v_nbr,NULL,v);
  267.  
  268.   obj_begin = G_FALSE;
  269. }
  270.  
  271.  
  272. void gReset()
  273. {
  274.   gResetCoord();
  275.   gResetScale();
  276.   gResetColor();
  277.   gResetAlpha();
  278. }
  279.  
  280.  
  281. void gFlip(bool vsync)
  282. {
  283.   sceGuFinish();
  284.   sceGuSync(0,0);
  285.   if (vsync) sceDisplayWaitVblankStart();
  286.   sceGuSwapBuffers();
  287.   start = G_FALSE;
  288. }
  289.  
  290. // * Coord functions *
  291.  
  292. void gResetCoord()
  293. {
  294.   obj_coord_mode = DEFAULT_COORD_MODE;
  295.   obj_x = DEFAULT_X;
  296.   obj_y = DEFAULT_Y;
  297.   obj_z = DEFAULT_Z;
  298. }
  299.  
  300.  
  301. void gSetCoordMode(gEnum mode)
  302. {
  303.   obj_coord_mode = mode;
  304.   if (obj_coord_mode < G_UP_LEFT || obj_coord_mode > G_CENTER)
  305.     obj_coord_mode = G_UP_LEFT;
  306. }
  307.  
  308.  
  309. void gSetCoordXY(float x, float y)
  310. {
  311.   obj_x = x;
  312.   obj_y = y;
  313.   obj_z = 0;
  314.   _gAdd();
  315. }
  316.  
  317.  
  318. void gSetCoordXYZ(float x, float y, float z)
  319. {
  320.   obj_x = x;
  321.   obj_y = y;
  322.   obj_z = z;
  323.   obj_use_z = G_TRUE;
  324.   _gAdd();
  325. }
  326.  
  327.  
  328. void gSetCoordXYRelative(float x, float y)
  329. {
  330.   gSetCoordXY(obj_x + x,obj_y + y);
  331. }
  332.  
  333.  
  334. void gSetCoordXYZRelative(float x, float y, float z)
  335. {
  336.   gSetCoordXYZ(obj_x + x,obj_y + y,obj_z + z);
  337. }
  338.  
  339. // * Scale functions *
  340.  
  341. void gResetScale()
  342. {
  343.   obj_scale_w = DEFAULT_SIDE;
  344.   obj_scale_h = DEFAULT_SIDE;
  345. }
  346.  
  347.  
  348. void gSetScale(float w, float h)
  349. {
  350.   gSetScaleRelative(w,h);
  351. }
  352.  
  353.  
  354. void gSetScaleWH(int w, int h)
  355. {
  356.   obj_scale_w = w;
  357.   obj_scale_h = h;
  358. }
  359.  
  360.  
  361. void gSetScaleRelative(float w, float h)
  362. {
  363.   obj_scale_w *= w;
  364.   obj_scale_h *= h;
  365. }
  366.  
  367.  
  368. void gSetScaleWHRelative(int w, int h)
  369. {
  370.   obj_scale_w += w;
  371.   obj_scale_h += h;
  372. }
  373.  
  374. // * Color functions *
  375.  
  376. void gResetColor()
  377. {
  378.   obj_color = DEFAULT_COLOR;
  379. }
  380.  
  381.  
  382. void gResetAlpha()
  383. {
  384.   obj_alpha = DEFAULT_ALPHA;
  385. }
  386.  
  387.  
  388. void gSetColor(gColor color)
  389. {
  390.   obj_color = color;
  391.   if (++obj_colors_count > 1) obj_use_vert_color = G_TRUE;
  392.   if (G_GET_A(obj_color) < 255) obj_use_blend = G_TRUE;
  393. }
  394.  
  395.  
  396. void gSetAlpha(gAlpha alpha)
  397. {
  398.   obj_alpha = alpha;
  399.   if (obj_alpha > 255) obj_alpha = 255;
  400.   else if (obj_alpha < 0) obj_alpha = 0;
  401.   if (++obj_alpha_count > 1) obj_use_vert_color = G_TRUE;
  402.   if (obj_alpha < 255) obj_use_blend = G_TRUE;
  403. }
  404.  
  405.  
  406. void gSetAlphaRelative(gAlpha alpha)
  407. {
  408.   gSetAlpha(obj_alpha + alpha);
  409. }
  410.  
  411. // EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement