SHOW:
|
|
- or go back to the newest paste.
1 | - | #include "Draw.h" |
1 | + | #ifndef DRAW_H_INCLUDED |
2 | - | ///vars to add to structs |
2 | + | #define DRAW_H_INCLUDED |
3 | ||
4 | - | float bw,bh;//blit width/height if non pwr 2 textures |
4 | + | #include <GL/gl.h> |
5 | #include <GL/glext.h> | |
6 | #include <stdint.h> | |
7 | - | float bw,bh; |
7 | + | |
8 | ||
9 | ///OGL texture structs | |
10 | - | ///Draw Funcs to replace (also replace "GL_TEXTURE_RECTANGLE_NV" with "GL_TEXTURE_2D") |
10 | + | //textures are the format OGL blits, non editable data -(loaded sprites/images) |
11 | - | bool IsPowerOfTwo(uint32_t x) |
11 | + | |
12 | - | { |
12 | + | protected: |
13 | - | return ((x & (x - 1)) == 0); |
13 | + | bool texture_generated; |
14 | - | } |
14 | + | |
15 | - | int HighestBit(uint32_t x) |
15 | + | public: |
16 | - | { |
16 | + | GLuint Texture_ID; |
17 | - | if (IsPowerOfTwo(x)){return x;} |
17 | + | uint32_t w,h; |
18 | - | uint32_t y = 1<<31; |
18 | + | |
19 | - | while (y>x){y=y>>1;} |
19 | + | void gen_texture(uint16_t w, uint16_t h, uint8_t *PixData); |
20 | - | return y<<1; |
20 | + | |
21 | - | } |
21 | + | OGL_Texture(); |
22 | - | void OGL_Texture::gen_texture(uint16_t width, uint16_t height, uint8_t *PixData){ |
22 | + | ~OGL_Texture(); |
23 | - | if (width==0 || height==0){printf("ERROR! WIDTH OR HEIGHT OF TEXTURE == 0"); exit(1);} |
23 | + | |
24 | - | //delete old texture if existing |
24 | + | //surfaces contain editable pixel data, can be cast to textures for blitting -(effects, debug/primitive data draws) |
25 | - | if (texture_generated && Texture_ID){ |
25 | + | |
26 | - | glDeleteTextures(1,&Texture_ID); |
26 | + | uint32_t w,h; |
27 | - | } |
27 | + | uint8_t bpp; |
28 | - | //Power of two texture support |
28 | + | uint8_t *PixData; |
29 | - | w = width; |
29 | + | |
30 | - | h = height; |
30 | + | void Create_Surface(uint16_t w,uint16_t h, char bpp); |
31 | - | uint8_t *NewPixData = PixData; |
31 | + | void Clear_Surface(uint8_t r, uint8_t g, uint8_t b, uint8_t a=255); |
32 | - | bool todelete = false; |
32 | + | void Set_Surface_AlphaKey(uint8_t r, uint8_t g, uint8_t b); |
33 | - | if (!(IsPowerOfTwo(w) && IsPowerOfTwo(h))){ |
33 | + | void gen_texture(); |
34 | - | uint32_t new_w = HighestBit(w); |
34 | + | |
35 | - | uint32_t new_h = HighestBit(h); |
35 | + | OGL_Surface(); |
36 | - | NewPixData = new uint8_t[new_w*new_h*4]; |
36 | + | ~OGL_Surface(); |
37 | - | memset(NewPixData,255, new_w*new_h*4); |
37 | + | |
38 | - | uint32_t pos1 = 0; |
38 | + | |
39 | - | uint32_t pos2 = 0; |
39 | + | OGL_Texture *Texture_Cast(OGL_Surface *Surface); |
40 | - | for (uint32_t y = 0; y<h; y++){ |
40 | + | |
41 | - | for (uint32_t x = 0; x<w; x++){ |
41 | + | |
42 | - | NewPixData[pos1] = PixData[pos2]; |
42 | + | |
43 | - | NewPixData[pos1+1]= PixData[pos2+1]; |
43 | + | |
44 | - | NewPixData[pos1+2]= PixData[pos2+2]; |
44 | + | enum Image_Options{ |
45 | - | NewPixData[pos1+3]= PixData[pos2+3]; |
45 | + | IMG_NORM = 0, |
46 | - | pos1+=4; |
46 | + | IMG_HFLIP = 1, |
47 | - | pos2+=4; |
47 | + | IMG_VFLIP = 2, |
48 | - | } |
48 | + | IMG_ADD_BLEND = 3 |
49 | - | pos1+=(new_w-w)*4; |
49 | + | |
50 | - | } |
50 | + | void DrawImage(OGL_Texture *Texture, int dx, int dy, float rot=0.0,float scale_x=1.0,float scale_y=1.0,float alpha=1.0,int options=0); |
51 | - | width= new_w; |
51 | + | void DrawSubImage(OGL_Texture *Texture, int sx, int sy, int sw, int sh, int dx, int dy, float rot=0.0,float scale_x=1.0,float scale_y=1.0,float alpha=1.0,int options=0); |
52 | - | height= new_h; |
52 | + | |
53 | - | bw = float(w)/float(new_w); |
53 | + | ////////// |
54 | - | bh = float(h)/float(new_h); |
54 | + | //COLOUR// |
55 | - | todelete = true; |
55 | + | ////////// |
56 | - | } |
56 | + | uint32_t make_col(uint8_t r, uint8_t g, uint8_t b, uint8_t a); |
57 | - | //generate texture |
57 | + | uint32_t make_col(uint8_t r, uint8_t g, uint8_t b); |
58 | - | glGenTextures(1,&Texture_ID); |
58 | + | |
59 | - | if (Texture_ID==0){printf("ERROR IN TEXTURE GENERATION! NO DEVICE CONTEXT?"); exit(1);} |
59 | + | /////////////////// |
60 | - | glEnable(GL_TEXTURE_2D); |
60 | + | //DRAW PRIMITIVES// |
61 | - | glBindTexture(GL_TEXTURE_2D, Texture_ID); |
61 | + | /////////////////// |
62 | - | //2d texture, level of detail, number of components (3=rgb), w,h, border, byte order, data format, data |
62 | + | bool putpixel(OGL_Surface *Surface, int x, int y, uint32_t col); |
63 | - | glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA8, width, height, 0, GL_BGRA,GL_UNSIGNED_BYTE, NewPixData); |
63 | + | bool getpixel(OGL_Surface *Surface, int x, int y, uint32_t &col); |
64 | - | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
64 | + | // |
65 | - | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
65 | + | void hline(OGL_Surface *Surface, int x, int y, int w, uint32_t col); |
66 | - | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
66 | + | void vline(OGL_Surface *Surface, int x, int y, int h, uint32_t col); |
67 | - | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
67 | + | void line(OGL_Surface *Surface, int x1, int y1, int x2, int y2, uint32_t col); |
68 | - | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); |
68 | + | void box(OGL_Surface *Surface, int x, int y, int w, int h, uint32_t col); |
69 | - | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); |
69 | + | void rect(OGL_Surface *Surface, int x, int y, int w, int h, uint32_t col); |
70 | - | glDisable(GL_TEXTURE_2D); |
70 | + | void polyline(OGL_Surface *Surface, unsigned char n, int points[], uint32_t col); |
71 | - | texture_generated = true; |
71 | + | void polygon(OGL_Surface *Surface, unsigned char n, int points[], uint32_t col); |
72 | - | //cleanup |
72 | + | void circle(OGL_Surface *Surface, int x0, int y0, int radius, uint32_t col); |
73 | - | if (todelete){delete [] NewPixData;} |
73 | + | void circle_fill(OGL_Surface *Surface, int x0, int y0, int radius, uint32_t col); |
74 | - | } |
74 | + | // |
75 | ||
76 | - | /////////////// |
76 | + | #endif // DRAW_H_INCLUDED |