Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.67 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.  
  12. #include "glib2d.h"
  13.  
  14. #define PSP_LINE_SIZE (512)
  15. #define PIXEL_SIZE (4)
  16. #define FRAMEBUFFER_SIZE (PSP_LINE_SIZE*SCR_H*PIXEL_SIZE)
  17. #define MALLOC_STEP 10
  18.  
  19. #define DEFAULT_UNKNOWN    (0)
  20. #define DEFAULT_COORD_MODE (G_UP_LEFT)
  21. #define DEFAULT_X          (0.f)
  22. #define DEFAULT_Y          (0.f)
  23. #define DEFAULT_Z          (0.f)
  24. #define DEFAULT_COLOR      (WHITE)
  25. #define DEFAULT_ALPHA      (0xFF)
  26.  
  27. #define CURRENT_OBJ obj_list[obj_list_size]
  28.  
  29. typedef struct
  30. {
  31.   float x, y, z;
  32.   int crop_x, crop_y;
  33.   int crop_w, crop_h;
  34.   int scale_w, scale_h;
  35.   gColor color;
  36.   gAlpha alpha;
  37. } Obj_Properties;
  38.  
  39. // * Main vars *
  40. 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(SCR_W,SCR_H,(void*)0,PSP_LINE_SIZE);
  70.   sceGuDepthBuffer((void*)(FRAMEBUFFER_SIZE*2),PSP_LINE_SIZE);
  71.   sceGuOffset(2048-(SCR_W/2),2048-(SCR_H/2));
  72.   sceGuViewport(2048,2048,SCR_W,SCR_H);
  73.   sceGuDepthRange(0xc350,0x2710);
  74.  
  75.   sceGuScissor(0,0,SCR_W,SCR_H);
  76.   sceGuAlphaFunc(GU_GREATER,0,0xff);
  77.   sceGuDepthFunc(GU_GEQUAL);
  78.   sceGuBlendFunc(GU_ADD,GU_SRC_ALPHA,GU_ONE_MINUS_SRC_ALPHA,0,0);
  79.   sceGuTexFunc(GU_TFX_MODULATE,GU_TCC_RGBA);
  80.   sceGuTexFilter(GU_LINEAR,GU_LINEAR);
  81.   sceGuFrontFace(GU_CW);
  82.   sceGuShadeModel(GU_SMOOTH);
  83.  
  84.   sceGuEnable(GU_CULL_FACE);
  85.   sceGuEnable(GU_CLIP_PLANES);
  86.   sceGuEnable(GU_ALPHA_TEST);
  87.   sceGuEnable(GU_CLIP_PLANES);
  88.   sceGuEnable(GU_SCISSOR_TEST);
  89.  
  90.   sceGuFinish();
  91.   sceGuSync(0,0);
  92.   sceDisplayWaitVblankStart();
  93.   sceGuDisplay(GU_TRUE);
  94.  
  95.   init = G_TRUE;
  96. }
  97.  
  98.  
  99. void _gStart()
  100. {
  101.   if (!init) _gInit();
  102.  
  103.   sceKernelDcacheWritebackAll();
  104.   sceGuStart(GU_DIRECT,gu_list);
  105.   start = G_TRUE;
  106. }
  107.  
  108.  
  109. void _gCoordInit()
  110. {
  111.   gResetCoord();
  112.   obj_use_z = G_FALSE;
  113. }
  114.  
  115.  
  116. void _gScaleInit()
  117. {
  118.   gResetScale();
  119. }
  120.  
  121.  
  122. void _gColorInit()
  123. {
  124.   gResetColor();
  125.   obj_colors_count = 0;
  126.   obj_use_vert_color = G_FALSE;
  127. }
  128.  
  129.  
  130. void _gAlphaInit()
  131. {
  132.   gResetAlpha();
  133.   obj_use_blend = 0;
  134. }
  135.  
  136.  
  137. void _gAdd()
  138. {
  139.   if (!obj_begin) return;
  140.  
  141.   if (obj_list_size >= obj_list_size_malloc)
  142.   {
  143.     obj_list_size_malloc += MALLOC_STEP;
  144.     obj_list = realloc(obj_list,obj_list_size_malloc * sizeof(Obj_Properties));
  145.   }
  146.  
  147.   CURRENT_OBJ.x = obj_x;
  148.   CURRENT_OBJ.y = obj_y;
  149.   CURRENT_OBJ.z = obj_z;
  150.   CURRENT_OBJ.scale_w = obj_scale_w;
  151.   CURRENT_OBJ.scale_h = obj_scale_h;
  152.   CURRENT_OBJ.color = obj_color;
  153.   CURRENT_OBJ.alpha = obj_alpha;
  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. // * Main functions *
  181.  
  182. void gClear(gColor color, bool zclear)
  183. {
  184.   if (!start) _gStart();
  185.  
  186.   sceGuClearColor(color);
  187.   sceGuClearDepth(0);
  188.   sceGuClear(GU_COLOR_BUFFER_BIT | GU_FAST_CLEAR_BIT
  189.              | (zclear ? GU_DEPTH_BUFFER_BIT : 0));
  190. }
  191.  
  192.  
  193. void gBegin()
  194. {
  195.   if (obj_begin) return;
  196.   if (!start) _gStart();
  197.  
  198.   _gCoordInit();
  199.   _gScaleInit();
  200.   _gColorInit();
  201.   _gAlphaInit();
  202.  
  203.   obj_list_size = 0;
  204.   obj_list_size_malloc = MALLOC_STEP;
  205.   obj_list = realloc(obj_list,obj_list_size_malloc * sizeof(Obj_Properties));
  206.  
  207.   obj_begin = G_TRUE;
  208. }
  209.  
  210.  
  211. void gEnd()
  212. {
  213.   if (!obj_begin || obj_list_size <= 0) return;
  214.  
  215.   int prim = GU_SPRITES,
  216.       v_obj_nbr = 2,
  217.       v_nbr = v_obj_nbr * obj_list_size,
  218.       v_coord_size = 3,
  219.       v_tex_size = 0,
  220.       v_color_size = (obj_use_vert_color) ? 1 : 0,
  221.       v_size = v_tex_size * sizeof(int) +
  222.                v_color_size * sizeof(gColor) +
  223.                v_coord_size * sizeof(float),
  224.       v_type = GU_VERTEX_32BITF | GU_TRANSFORM_2D,
  225.       i;
  226.  
  227.   if (obj_use_vert_color) v_type |= GU_COLOR_8888;
  228.  
  229.   void *v = sceGuGetMemory(v_nbr * v_size), *vi = v;
  230.  
  231.   for (i=0; i!=obj_list_size; i++)
  232.   {
  233.     vi = _gSetVertex(vi,i,0,0);
  234.     vi = _gSetVertex(vi,i,1,1);
  235.   }
  236.  
  237.   if (obj_use_z)          sceGuEnable(GU_DEPTH_TEST);
  238.   else                    sceGuDisable(GU_DEPTH_TEST);
  239.   if (obj_use_blend)      sceGuEnable(GU_BLEND);
  240.   else                    sceGuDisable(GU_BLEND);
  241.   if (obj_use_vert_color) sceGuColor(WHITE);
  242.   else                    sceGuColor(obj_color);
  243.   sceGuDisable(GU_TEXTURE_2D);
  244.  
  245.   sceGuDrawArray(prim,v_type,v_nbr,NULL,v);
  246.  
  247.   obj_begin = G_FALSE;
  248. }
  249.  
  250.  
  251. void gReset()
  252. {
  253.   gResetCoord();
  254.   gResetScale();
  255.   gResetColor();
  256.   gResetAlpha();
  257. }
  258.  
  259.  
  260. void gFlip(bool vsync)
  261. {
  262.   sceGuFinish();
  263.   sceGuSync(0,0);
  264.   if (vsync) sceDisplayWaitVblankStart();
  265.   sceGuSwapBuffers();
  266.   start = G_FALSE;
  267. }
  268.  
  269. // * Coord functions *
  270.  
  271. void gResetCoord()
  272. {
  273.   obj_coord_mode = DEFAULT_COORD_MODE;
  274.   obj_x = DEFAULT_X;
  275.   obj_y = DEFAULT_Y;
  276.   obj_z = DEFAULT_Z;
  277. }
  278.  
  279.  
  280. void gSetCoordMode(gEnum mode)
  281. {
  282.   obj_coord_mode = mode;
  283.   if (obj_coord_mode < G_UP_LEFT || obj_coord_mode > G_CENTER)
  284.     obj_coord_mode = G_UP_LEFT;
  285. }
  286.  
  287.  
  288. void gSetCoordXY(float x, float y)
  289. {
  290.   obj_x = x;
  291.   obj_y = y;
  292.   _gAdd();
  293. }
  294.  
  295.  
  296. void gSetCoordXYZ(float x, float y, float z)
  297. {
  298.   obj_x = x;
  299.   obj_y = y;
  300.   obj_z = z;
  301.   obj_use_z = G_TRUE;
  302.   _gAdd();
  303. }
  304.  
  305.  
  306. void gSetCoordXYRelative(float x, float y)
  307. {
  308.   gSetCoordXY(obj_x + x,obj_y + y);
  309. }
  310.  
  311.  
  312. void gSetCoordXYZRelative(float x, float y, float z)
  313. {
  314.   gSetCoordXYZ(obj_x + x,obj_y + y,obj_z + z);
  315. }
  316.  
  317. // * Scale functions *
  318.  
  319. void gResetScale()
  320. {
  321.   obj_scale_w = DEFAULT_UNKNOWN;
  322.   obj_scale_h = DEFAULT_UNKNOWN;
  323. }
  324.  
  325.  
  326. void gSetScale(float w, float h)
  327. {
  328.   gSetScaleRelative(w,h);
  329. }
  330.  
  331.  
  332. void gSetScaleWH(int w, int h)
  333. {
  334.   obj_scale_w = w;
  335.   obj_scale_h = h;
  336. }
  337.  
  338.  
  339. void gSetScaleRelative(float w, float h)
  340. {
  341.   obj_scale_w *= w;
  342.   obj_scale_h *= h;
  343. }
  344.  
  345.  
  346. void gSetScaleWHRelative(int w, int h)
  347. {
  348.   obj_scale_w += w;
  349.   obj_scale_h += h;
  350. }
  351.  
  352. // * Color functions *
  353.  
  354. void gResetColor()
  355. {
  356.   obj_color = DEFAULT_COLOR;
  357. }
  358.  
  359.  
  360. void gResetAlpha()
  361. {
  362.   obj_alpha = DEFAULT_ALPHA;
  363. }
  364.  
  365.  
  366. void gSetColor(gColor color)
  367. {
  368.   obj_color = color;
  369.   if (++obj_colors_count > 1) obj_use_vert_color = G_TRUE;
  370.   if (G_GET_A(obj_color) < 255) obj_use_blend = G_TRUE;
  371. }
  372.  
  373.  
  374. void gSetAlpha(gAlpha alpha)
  375. {
  376.   obj_alpha = alpha;
  377.   if (obj_alpha > 255) obj_alpha = 255;
  378.   else if (obj_alpha < 0) obj_alpha = 0;
  379.   if (++obj_alpha_count > 1) obj_use_vert_color = G_TRUE;
  380.   if (obj_alpha < 255) obj_use_blend = G_TRUE;
  381. }
  382.  
  383.  
  384. void gSetAlphaRelative(gAlpha alpha)
  385. {
  386.   gSetAlpha(obj_alpha + alpha);
  387. }
  388.  
  389. // EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement