fix up the rest of the GL code, add glew to project, add makefiles for opengl, fix makefiles so that it can be built with gcc, update project files to automatically output to the build directory

This commit is contained in:
jp9000
2013-10-16 23:31:18 -07:00
parent 0dfc844abc
commit dfa2dc6eab
40 changed files with 937 additions and 389 deletions

View File

@@ -1299,7 +1299,7 @@ static void ep_compile_param(struct effect_parser *ep, size_t idx)
ep->effect->world = param;
}
static inline void ep_compile_pass_shaderparams(struct effect_parser *ep,
static bool ep_compile_pass_shaderparams(struct effect_parser *ep,
struct darray *pass_params, struct darray *used_params,
shader_t shader)
{
@@ -1319,7 +1319,14 @@ static inline void ep_compile_pass_shaderparams(struct effect_parser *ep,
param_name->array);
param->sparam = shader_getparambyname(shader,
param_name->array);
if (!param->sparam) {
blog(LOG_ERROR, "Effect shader parameter not found");
return false;
}
}
return true;
}
static inline bool ep_compile_pass_shader(struct effect_parser *ep,
@@ -1332,6 +1339,7 @@ static inline bool ep_compile_pass_shader(struct effect_parser *ep,
struct darray used_params; /* struct dstr */
struct darray *pass_params; /* struct pass_shaderparam */
shader_t shader;
bool success = true;
dstr_init(&shader_str);
darray_init(&used_params);
@@ -1375,15 +1383,17 @@ static inline bool ep_compile_pass_shader(struct effect_parser *ep,
blog(LOG_DEBUG, "+++++++++++++++++++++++++++++++++++");
if (shader)
ep_compile_pass_shaderparams(ep, pass_params, &used_params,
shader);
success = ep_compile_pass_shaderparams(ep, pass_params,
&used_params, shader);
else
success = false;
dstr_free(&location);
dstr_array_free(used_params.array, used_params.num);
darray_free(&used_params);
dstr_free(&shader_str);
return shader != NULL;
return success;
}
static bool ep_compile_pass(struct effect_parser *ep,

View File

@@ -97,7 +97,6 @@ bool load_graphics_imports(struct gs_exports *exports, void *module,
GRAPHICS_IMPORT(device_setscissorrect);
GRAPHICS_IMPORT(device_ortho);
GRAPHICS_IMPORT(device_frustum);
GRAPHICS_IMPORT(device_perspective);
GRAPHICS_IMPORT(device_projection_push);
GRAPHICS_IMPORT(device_projection_pop);

View File

@@ -36,14 +36,14 @@ struct gs_exports {
uint32_t (*device_getheight)(device_t device);
texture_t (*device_create_texture)(device_t device, uint32_t width,
uint32_t height, enum gs_color_format color_format,
uint32_t levels, void **data, uint32_t flags);
uint32_t levels, const void **data, uint32_t flags);
texture_t (*device_create_cubetexture)(device_t device, uint32_t size,
enum gs_color_format color_format, uint32_t levels,
void **data, uint32_t flags);
const void **data, uint32_t flags);
texture_t (*device_create_volumetexture)(device_t device,
uint32_t width, uint32_t height, uint32_t depth,
enum gs_color_format color_format, uint32_t levels,
void **data, uint32_t flags);
const void **data, uint32_t flags);
zstencil_t (*device_create_zstencil)(device_t device,
uint32_t width, uint32_t height,
enum gs_zstencil_format format);
@@ -128,8 +128,6 @@ struct gs_exports {
float top, float bottom, float znear, float zfar);
void (*device_frustum)(device_t device, float left, float right,
float top, float bottom, float znear, float zfar);
void (*device_perspective)(device_t device, float fovy, float aspect,
float znear, float zfar);
void (*device_projection_push)(device_t device);
void (*device_projection_pop)(device_t device);

View File

@@ -149,17 +149,13 @@ void gs_destroy(graphics_t graphics)
while (thread_graphics)
gs_leavecontext();
graphics->exports.device_entercontext(graphics->device);
if (graphics->sprite_buffer)
if (graphics->device) {
graphics->exports.device_entercontext(graphics->device);
graphics->exports.vertexbuffer_destroy(graphics->sprite_buffer);
if (graphics->immediate_vertbuffer)
graphics->exports.vertexbuffer_destroy(
graphics->immediate_vertbuffer);
if (graphics->device)
graphics->exports.device_destroy(graphics->device);
}
pthread_mutex_destroy(&graphics->mutex);
da_free(graphics->matrix_stack);
@@ -596,8 +592,7 @@ effect_t gs_create_effect(const char *effect_string, const char *filename,
return effect;
}
shader_t gs_create_vertexshader_from_file(const char *file,
char **error_string)
shader_t gs_create_vertexshader_from_file(const char *file, char **error_string)
{
char *file_string;
shader_t shader = NULL;
@@ -615,8 +610,7 @@ shader_t gs_create_vertexshader_from_file(const char *file,
return shader;
}
shader_t gs_create_pixelshader_from_file(const char *file,
char **error_string)
shader_t gs_create_pixelshader_from_file(const char *file, char **error_string)
{
char *file_string;
shader_t shader = NULL;
@@ -640,13 +634,13 @@ texture_t gs_create_texture_from_file(const char *file, uint32_t flags)
return NULL;
}
texture_t gs_create_cubetexture_from_file(const char *flie, uint32_t flags)
texture_t gs_create_cubetexture_from_file(const char *file, uint32_t flags)
{
/* TODO */
return NULL;
}
texture_t gs_create_volumetexture_from_file(const char *flie, uint32_t flags)
texture_t gs_create_volumetexture_from_file(const char *file, uint32_t flags)
{
/* TODO */
return NULL;
@@ -681,6 +675,7 @@ void gs_draw_sprite(texture_t tex)
vec2_set(tvarray+3, 1.0f, 1.0f);
vertexbuffer_flush(graphics->sprite_buffer, false);
gs_load_vertexbuffer(graphics->sprite_buffer);
gs_load_indexbuffer(NULL);
gs_draw(GS_TRISTRIP, 0, 0);
}
@@ -740,6 +735,21 @@ void cubetexture_setimage(texture_t cubetex, uint32_t side, const void *data,
/* TODO */
}
void gs_perspective(float angle, float aspect, float near, float far)
{
graphics_t graphics = thread_graphics;
float xmin, xmax, ymin, ymax;
ymax = near * tanf(RAD(angle)*0.5f);
ymin = -ymax;
xmin = ymin * aspect;
xmax = ymax * aspect;
graphics->exports.device_frustum(graphics->device, xmin, xmax,
ymin, ymax, near, far);
}
/* ------------------------------------------------------------------------- */
swapchain_t gs_create_swapchain(struct gs_init_data *data)
@@ -779,8 +789,8 @@ static inline bool is_pow2(uint32_t size)
}
texture_t gs_create_texture(uint32_t width, uint32_t height,
enum gs_color_format color_format, uint32_t levels, void **data,
uint32_t flags)
enum gs_color_format color_format, uint32_t levels,
const void **data, uint32_t flags)
{
graphics_t graphics = thread_graphics;
bool pow2tex = is_pow2(width) && is_pow2(height);
@@ -809,7 +819,7 @@ texture_t gs_create_texture(uint32_t width, uint32_t height,
texture_t gs_create_cubetexture(uint32_t size,
enum gs_color_format color_format, uint32_t levels,
void **data, uint32_t flags)
const void **data, uint32_t flags)
{
graphics_t graphics = thread_graphics;
bool pow2tex = is_pow2(size);
@@ -839,7 +849,7 @@ texture_t gs_create_cubetexture(uint32_t size,
texture_t gs_create_volumetexture(uint32_t width, uint32_t height,
uint32_t depth, enum gs_color_format color_format,
uint32_t levels, void **data, uint32_t flags)
uint32_t levels, const void **data, uint32_t flags)
{
graphics_t graphics = thread_graphics;
return graphics->exports.device_create_volumetexture(graphics->device,
@@ -1182,13 +1192,6 @@ void gs_frustum(float left, float right, float top, float bottom, float znear,
bottom, znear, zfar);
}
void gs_perspective(float fovy, float aspect, float znear, float zfar)
{
graphics_t graphics = thread_graphics;
graphics->exports.device_perspective(graphics->device, fovy, aspect,
znear, zfar);
}
void gs_projection_push(void)
{
graphics_t graphics = thread_graphics;

View File

@@ -503,6 +503,8 @@ EXPORT void texture_setimage(texture_t tex, const void *data,
EXPORT void cubetexture_setimage(texture_t cubetex, uint32_t side,
const void *data, uint32_t byte_width);
EXPORT void gs_perspective(float fovy, float aspect, float znear, float zfar);
/* -------------------------- */
/* library-specific functions */
@@ -514,14 +516,14 @@ EXPORT uint32_t gs_getwidth(void);
EXPORT uint32_t gs_getheight(void);
EXPORT texture_t gs_create_texture(uint32_t width, uint32_t height,
enum gs_color_format color_format, uint32_t levels, void **data,
uint32_t flags);
enum gs_color_format color_format, uint32_t levels,
const void **data, uint32_t flags);
EXPORT texture_t gs_create_cubetexture(uint32_t size,
enum gs_color_format color_format, uint32_t levels,
void **data, uint32_t flags);
const void **data, uint32_t flags);
EXPORT texture_t gs_create_volumetexture(uint32_t width, uint32_t height,
uint32_t depth, enum gs_color_format color_format,
uint32_t levels, void **data, uint32_t flags);
uint32_t levels, const void **data, uint32_t flags);
EXPORT zstencil_t gs_create_zstencil(uint32_t width, uint32_t height,
enum gs_zstencil_format format);
@@ -612,8 +614,6 @@ EXPORT void gs_ortho(float left, float right, float top, float bottom,
float znear, float zfar);
EXPORT void gs_frustum(float left, float right, float top, float bottom,
float znear, float zfar);
EXPORT void gs_perspective(float fovy, float aspect, float znear,
float zfar);
EXPORT void gs_projection_push(void);
EXPORT void gs_projection_pop(void);

View File

@@ -124,7 +124,7 @@ void matrix4_transpose(struct matrix4 *dst, const struct matrix4 *m)
{
struct matrix4 temp;
/* TODO: Use SSE */
/* TODO: Add SSE */
temp.x.x = m->x.x;
temp.x.y = m->y.x;
temp.x.z = m->z.x;
@@ -144,66 +144,3 @@ void matrix4_transpose(struct matrix4 *dst, const struct matrix4 *m)
matrix4_copy(dst, &temp);
}
void matrix4_ortho(struct matrix4 *dst, float left, float right,
float top, float bottom, float near, float far)
{
float rml = right-left;
float bmt = bottom-top;
float fmn = far-near;
vec4_zero(&dst->x);
vec4_zero(&dst->y);
vec4_zero(&dst->z);
vec4_zero(&dst->t);
dst->x.x = 2.0f / rml;
dst->t.x = (left+right) / -rml;
dst->y.y = 2.0f / -bmt;
dst->t.y = (bottom+top) / bmt;
dst->z.z = 1.0f / fmn;
dst->t.z = near / -fmn;
dst->t.w = 1.0f;
}
void matrix4_frustum(struct matrix4 *dst, float left, float right,
float top, float bottom, float near, float far)
{
float rml = right-left;
float bmt = bottom-top;
float fmn = far-near;
float nearx2 = 2.0f*near;
vec4_zero(&dst->x);
vec4_zero(&dst->y);
vec4_zero(&dst->z);
vec4_zero(&dst->t);
dst->x.x = nearx2 / rml;
dst->z.x = (left+right) / -rml;
dst->y.y = nearx2 / -bmt;
dst->z.y = (bottom+top) / bmt;
dst->z.z = far / fmn;
dst->t.z = (near*far) / -fmn;
dst->z.w = 1.0f;
}
void matrix4_perspective(struct matrix4 *dst, float angle,
float aspect, float near, float far)
{
float xmin, xmax, ymin, ymax;
ymax = near * tanf(RAD(angle)*0.5f);
ymin = -ymax;
xmin = ymin * aspect;
xmax = ymax * aspect;
matrix4_frustum(dst, xmin, xmax, ymin, ymax, near, far);
}

View File

@@ -61,13 +61,6 @@ EXPORT float matrix4_determinant(const struct matrix4 *m);
EXPORT bool matrix4_inv(struct matrix4 *dst, const struct matrix4 *m);
EXPORT void matrix4_transpose(struct matrix4 *dst, const struct matrix4 *m);
EXPORT void matrix4_ortho(struct matrix4 *dst, float left, float right,
float top, float bottom, float near, float far);
EXPORT void matrix4_frustum(struct matrix4 *dst, float left, float right,
float top, float bottom, float near, float far);
EXPORT void matrix4_perspective(struct matrix4 *dst, float angle,
float aspect, float near, float far);
#ifdef __cplusplus
}
#endif