GoldFish Engine
Quite simple and lightweight game engine
Loading...
Searching...
No Matches
gf_driver.c
1#define GF_EXPOSE_DRAW_DRIVER
2#define GF_EXPOSE_DRAW
3#define GF_EXPOSE_TEXTURE
4
5#include <gf_pre.h>
6
7/* External library */
8#include <gf_opengl.h>
9
10/* Interface */
11#include <gf_draw_driver.h>
12
13/* Engine */
14#include <gf_draw_platform.h>
15#include <gf_texture.h>
16#include <gf_draw.h>
17#include <gf_log.h>
18#include <gf_math.h>
19#include <gf_graphic.h>
20
21/* Standard */
22#include <stdlib.h>
23#include <string.h>
24
25GLfloat lightwht[] = {1.0f, 1.0f, 1.0f, 1.0f};
26GLfloat lightgry[] = {0.6f, 0.6f, 0.6f, 1.0f};
27GLfloat lightdim[] = {0.2f, 0.2f, 0.2f, 1.0f};
28GLfloat lightblk[] = {0.0f, 0.0f, 0.0f, 1.0f};
29
30gf_draw_driver_texture_t* gf_draw_driver_register_texture(gf_draw_t* draw, int width, int height, int* iwidth, int* iheight, unsigned char* data) {
31 gf_draw_driver_texture_t* r = malloc(sizeof(*r));
32 int w = gf_math_nearest_2pow(width);
33 int h = gf_math_nearest_2pow(height);
34 int x, y;
35 unsigned char* d = malloc(w * h * 4);
36
37 *iwidth = w;
38 *iheight = h;
39
40 memset(d, 0, w * h * 4);
41 for(y = 0; y < height; y++) {
42 for(x = 0; x < width; x++) {
43 int pos = (y * w + x) * 4;
44 int ogpos = (y * width + x) * 4;
45 memcpy(d + pos + 0, data + ogpos + 0, 4);
46 }
47 }
48
49 glGenTextures(1, &r->id);
50 glBindTexture(GL_TEXTURE_2D, r->id);
51 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, d);
52 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
53 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
54#if 0
55 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
56 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
57#endif
58 glBindTexture(GL_TEXTURE_2D, 0);
59
60 return r;
61}
62
64 glDeleteTextures(1, &t->id);
65 free(t);
66}
67
69 gf_draw_driver_t* draw_driver = malloc(sizeof(*draw_driver));
70 memset(draw_driver, 0, sizeof(*draw_driver));
71 draw_driver->engine = engine;
72
73 gf_log_function(engine, "OpenGL renderer: %s", (char*)glGetString(GL_RENDERER));
74
75 glEnable(GL_BLEND);
76 glEnable(GL_NORMALIZE);
77 glEnable(GL_COLOR_MATERIAL);
78 glEnable(GL_DEPTH_TEST);
79 glEnable(GL_CULL_FACE);
80 glEnable(GL_LIGHTING);
81 glEnable(GL_LIGHT0);
82
83 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
84
85 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
86
87 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
88
89 glCullFace(GL_BACK);
90
91 glShadeModel(GL_SMOOTH);
92 glLightfv(GL_LIGHT0, GL_AMBIENT, lightgry);
93 glLightfv(GL_LIGHT0, GL_DIFFUSE, lightwht);
94 glLightfv(GL_LIGHT0, GL_SPECULAR, lightwht);
95
96 glClearColor(0, 0, 0, 1);
97
98 return draw_driver;
99}
100
101int gf_draw_driver_has_extension(gf_draw_t* draw, const char* query) {
102 int ret = gf_draw_platform_has_extension(draw, query);
103 const char* ext = NULL;
104 const char* ptr;
105 const int len = strlen(query);
106 if(ret != 0) return ret;
107
108 ext = glGetString(GL_EXTENSIONS);
109 ptr = strstr(ext, query);
110 return ((ptr != NULL) && ((ptr[len] == ' ') || (ptr[len] == '\0')));
111}
112
114 glViewport(0, 0, (GLint)draw->width, (GLint)draw->height);
115 glMatrixMode(GL_PROJECTION);
116 gf_graphic_perspective(draw, 30, 1.0, 1000.0);
117
118 glMatrixMode(GL_MODELVIEW);
119 glLoadIdentity();
120}
121
123 glEnable(GL_TEXTURE_2D);
124 glBindTexture(GL_TEXTURE_2D, texture->draw_driver_texture->id);
125}
126
128 glDisable(GL_TEXTURE_2D);
129 glBindTexture(GL_TEXTURE_2D, 0);
130}
131
132void gf_draw_driver_set_color(gf_draw_t* draw, gf_graphic_color_t color) { glColor4f(color.r / 255, color.g / 255, color.b / 255, color.a / 255); }
133
135 gf_log_function(driver->engine, "Destroyed drawing driver", "");
136 free(driver);
137}
138
140 GLfloat lightpos[4];
141 GF_MATH_VECTOR_COPY(draw->light, lightpos);
142 lightpos[3] = draw->light[3];
143
145
147
148 glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
149 gf_graphic_clear(draw);
150}
151
152void gf_draw_driver_after(gf_draw_t* draw) { glFlush(); }
Drawing interface.
Drawing driver.
gf_draw_driver_texture_t * gf_draw_driver_register_texture(gf_draw_t *draw, int width, int height, int *iwidth, int *iheight, unsigned char *data)
Register driver-dependent texture.
Definition gf_driver.c:25
void gf_draw_driver_set_color(gf_draw_t *draw, gf_graphic_color_t color)
Set color.
Definition gf_driver.c:53
void gf_draw_driver_end_texture_2d(gf_draw_t *draw)
End 2D texture mode.
Definition gf_driver.c:51
void gf_draw_driver_before(gf_draw_t *draw)
Called before gf_draw_frame.
Definition gf_driver.c:61
void gf_draw_driver_after(gf_draw_t *draw)
Called after gf_draw_frame.
Definition gf_driver.c:71
int gf_draw_driver_has_extension(gf_draw_t *draw, const char *query)
Check if renderer has extension.
Definition gf_driver.c:45
void gf_draw_driver_destroy_texture(gf_draw_driver_texture_t *texture)
Destroy driver-dependent texture.
Definition gf_driver.c:30
void gf_draw_driver_begin_texture_2d(gf_draw_t *draw, gf_texture_t *texture)
Begin 2D texture mode.
Definition gf_driver.c:49
gf_draw_driver_t * gf_draw_driver_create(gf_engine_t *engine, gf_draw_t *draw)
Initialize drawing driver.
Definition gf_driver.c:35
void gf_draw_driver_reshape(gf_draw_t *draw)
Do stuffs required on resizing window.
Definition gf_driver.c:47
void gf_draw_driver_destroy(gf_draw_driver_t *driver)
Destroy drawing driver.
Definition gf_driver.c:55
Platform-dependent part of drawing driver.
int gf_draw_platform_has_extension(gf_draw_t *draw, const char *query)
Check if renderer has extension.
Definition gf_draw.c:99
Graphic interface.
void gf_graphic_clear(gf_draw_t *draw)
Clear the screen.
Definition gf_graphic.c:26
void gf_graphic_perspective(gf_draw_t *draw, double fovy, double znear, double zfar)
Set perspective.
Definition gf_graphic.c:32
void gf_graphic_set_camera(gf_draw_t *draw)
Set camera.
Definition gf_graphic.c:34
Logger.
#define gf_log_function(engine, fmt,...)
Output log with line number and function name.
Definition gf_log.h:26
#define GF_MATH_VECTOR_COPY(from, to)
Copy vector.
Definition gf_math.h:32
double gf_math_nearest_2pow(double x)
Get nearest 2^n.
Definition gf_math.c:64
OpenGL headers.
Required headers before anything.
Texture.
Drawing driver.
Definition draw_driver.h:50
Driver-dependent texture.
Definition draw_driver.h:58
Drawing interface.
Definition draw.h:108
gf_math_vector_t light
Light location.
Definition draw.h:108
int width
Width of window.
Definition draw.h:108
int height
Height of window.
Definition draw.h:108
Engine instance.
Definition core.h:46
double g
Green.
Definition graphic.h:44
double b
Blue.
Definition graphic.h:44
double a
Alpha.
Definition graphic.h:44
double r
Red.
Definition graphic.h:44
Texture.
Definition texture.h:49
gf_draw_driver_texture_t * draw_driver_texture
Driver-dependent texture.
Definition texture.h:49