Finally, load textures for iqm :)

This commit is contained in:
Bill Currie 2012-05-14 23:02:06 +09:00
parent a032aa5adf
commit 1375c3cf03
13 changed files with 139 additions and 10 deletions

View file

@ -32,6 +32,13 @@
#include "QF/iqm.h"
typedef struct glsliqm_s {
GLuint *textures;
GLuint *normmaps;
GLuint vertex_array;
GLuint element_array;
} glsliqm_t;
void glsl_R_InitIQM (void);
void glsl_R_DrawIQM (void);
void glsl_R_IQMBegin (void);

View file

@ -47,6 +47,8 @@ struct texture_s;
int GLSL_LoadQuakeMipTex (const struct texture_s *tex);
int GLSL_LoadRGBTexture (const char *identifier, int width, int height,
byte *data);
int GLSL_LoadRGBATexture (const char *identifier, int width, int height,
byte *data);
void GLSL_ReleaseTexture (int tex);
void GLSL_TextureInit (void);

View file

@ -139,6 +139,7 @@ typedef struct {
iqmframe_t **frames;
int num_anims;
iqmanim *anims;
void *extra_data;
} iqm_t;
#endif//__QF_iqm_h__

View file

@ -93,7 +93,8 @@ typedef struct vid_model_funcs_s {
void *(*Mod_LoadSkin) (byte *skin, int skinsize, int snum, int gnum,
qboolean group, maliasskindesc_t *skindesc);
void (*Mod_FinalizeAliasModel) (model_t *m, aliashdr_t *hdr);
void (*Mod_LoadExternalSkins) (model_t * mod);
void (*Mod_LoadExternalSkins) (model_t *mod);
void (*Mod_IQMFinish) (model_t *mod);
int alias_cache;
void (*Mod_SpriteLoadTexture) (mspriteframe_t *pspriteframe, int framenum);

View file

@ -12,21 +12,24 @@ void gl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
void *gl_Mod_LoadSkin (byte *skin, int skinsize, int snum, int gnum,
qboolean group, maliasskindesc_t *skindesc);
void gl_Mod_FinalizeAliasModel (model_t *m, aliashdr_t *hdr);
void gl_Mod_LoadExternalSkins (model_t * mod);
void gl_Mod_LoadExternalSkins (model_t *mod);
void gl_Mod_IQMFinish (model_t *mod);
void glsl_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr,
void *_m, int _s, int extra);
void *glsl_Mod_LoadSkin (byte *skin, int skinsize, int snum, int gnum,
qboolean group, maliasskindesc_t *skindesc);
void glsl_Mod_FinalizeAliasModel (model_t *m, aliashdr_t *hdr);
void glsl_Mod_LoadExternalSkins (model_t * mod);
void glsl_Mod_LoadExternalSkins (model_t *mod);
void glsl_Mod_IQMFinish (model_t *mod);
void sw_Mod_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m,
int _s, int extra);
void *sw_Mod_LoadSkin (byte *skin, int skinsize, int snum, int gnum,
qboolean group, maliasskindesc_t *skindesc);
void sw_Mod_FinalizeAliasModel (model_t *m, aliashdr_t *hdr);
void sw_Mod_LoadExternalSkins (model_t * mod);
void sw_Mod_LoadExternalSkins (model_t *mod);
void sw_Mod_IQMFinish (model_t *mod);
void gl_Mod_LoadExternalTextures (model_t *mod);
void gl_Mod_LoadLighting (bsp_t *bsp);

View file

@ -40,12 +40,91 @@
#include <stdlib.h>
#include "QF/dstring.h"
#include "QF/image.h"
#include "QF/quakefs.h"
#include "QF/va.h"
#include "QF/GLSL/defines.h"
#include "QF/GLSL/funcs.h"
//#include "QF/GLSL/qf_iqm.h"
#include "QF/GLSL/qf_iqm.h"
#include "QF/GLSL/qf_textures.h"
#include "mod_internal.h"
#include "r_shared.h"
static byte null_texture[] = {
204, 204, 204, 255,
204, 204, 204, 255,
204, 204, 204, 255,
204, 204, 204, 255,
};
static byte null_normmap[] = {
127, 127, 255, 255,
127, 127, 255, 255,
127, 127, 255, 255,
127, 127, 255, 255,
};
static void
glsl_iqm_clear (model_t *mod)
{
iqm_t *iqm = (iqm_t *) mod->aliashdr;
glsliqm_t *glsl = (glsliqm_t *) iqm->extra_data;
int i;
for (i = 0; i < iqm->num_meshes; i++) {
GLSL_ReleaseTexture (glsl->textures[i]);
GLSL_ReleaseTexture (glsl->normmaps[i]);
}
free (glsl);
free (iqm->text);
free (iqm->vertices);
free (iqm->vertexarrays);
free (iqm->elements);
free (iqm->meshes);
free (iqm->joints);
free (iqm->baseframe);
free (iqm->inverse_baseframe);
free (iqm->anims);
free (iqm->frames[0]);
free (iqm->frames);
free (iqm);
}
static void
glsl_iqm_load_textures (iqm_t *iqm)
{
glsliqm_t *glsl = (glsliqm_t *) iqm->extra_data;
int i;
dstring_t *str = dstring_new ();
tex_t *tex;
glsl->textures = malloc (2 * iqm->num_meshes * sizeof (GLuint));
glsl->normmaps = &glsl->textures[iqm->num_meshes];
for (i = 0; i < iqm->num_meshes; i++) {
dstring_copystr (str, iqm->text + iqm->meshes[i].material);
QFS_StripExtension (str->str, str->str);
if ((tex = LoadImage (va ("textures/%s", str->str))))
glsl->textures[i] = GLSL_LoadRGBATexture (str->str, tex->width,
tex->height, tex->data);
else
glsl->textures[i] = GLSL_LoadRGBATexture ("", 2, 2, null_texture);
if ((tex = LoadImage (va ("textures/%s_norm", str->str))))
glsl->normmaps[i] = GLSL_LoadRGBATexture (str->str, tex->width,
tex->height, tex->data);
else
glsl->normmaps[i] = GLSL_LoadRGBATexture ("", 2, 2, null_normmap);
}
dstring_delete (str);
}
void
glsl_Mod_IQMFinish (model_t *mod)
{
iqm_t *iqm = (iqm_t *) mod->aliashdr;
mod->clear = glsl_iqm_clear;
iqm->extra_data = calloc (1, sizeof (glsliqm_t));
glsl_iqm_load_textures (iqm);
}

View file

@ -519,4 +519,5 @@ Mod_LoadIQM (model_t *mod, void *buffer)
Sys_Error ("%s: error loading meshes", loadname);
if (hdr->num_anims && !load_iqm_anims (mod, hdr, (byte *) buffer))
Sys_Error ("%s: error loading anims", loadname);
m_funcs->Mod_IQMFinish (mod);
}

View file

@ -195,6 +195,7 @@ glsl_R_DrawIQM (void)
entity_t *ent = currententity;
model_t *model = ent->model;
iqm_t *iqm = (iqm_t *) model->aliashdr;
glsliqm_t *glsl = (glsliqm_t *) iqm->extra_data;
dlight_t *lights[MAX_IQM_LIGHTS];
int i;
vec_t norm_mat[9];
@ -256,6 +257,10 @@ glsl_R_DrawIQM (void)
qfeglVertexAttrib4fv (iqm_shader.vcolor.location, color);
set_arrays (iqm);
for (i = 0; i < iqm->num_meshes; i++) {
qfeglActiveTexture (GL_TEXTURE0 + 0);
qfeglBindTexture (GL_TEXTURE_2D, glsl->textures[i]);
qfeglActiveTexture (GL_TEXTURE0 + 1);
qfeglBindTexture (GL_TEXTURE_2D, glsl->normmaps[i]);
qfeglDrawElements (GL_TRIANGLES, 3 * iqm->meshes[i].num_triangles,
GL_UNSIGNED_SHORT,
iqm->elements + 3 * iqm->meshes[i].first_triangle);
@ -276,6 +281,14 @@ glsl_R_IQMBegin (void)
VectorCopy (glsl_Fog_GetColor (), fog);
fog[3] = glsl_Fog_GetDensity () / 64.0;
qfeglUniform4fv (iqm_shader.fog.location, 1, fog);
qfeglUniform1i (iqm_shader.texture.location, 0);
qfeglActiveTexture (GL_TEXTURE0 + 0);
qfeglEnable (GL_TEXTURE_2D);
qfeglUniform1i (iqm_shader.normalmap.location, 1);
qfeglActiveTexture (GL_TEXTURE0 + 1);
qfeglEnable (GL_TEXTURE_2D);
}
void

View file

@ -75,7 +75,7 @@ GLSL_LoadQuakeTexture (const char *identifier, int width, int height,
qfeglGenTextures (1, &tnum);
qfeglBindTexture (GL_TEXTURE_2D, tnum);
qfeglTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE,
width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
width, height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@ -173,7 +173,7 @@ GLSL_LoadQuakeMipTex (const texture_t *tex)
scaled = data + tex->offsets[lod];
}
qfeglTexImage2D (GL_TEXTURE_2D, lod, GL_LUMINANCE, swidth, sheight,
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, scaled);
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, scaled);
}
if (swidth > 1 || sheight > 1) {
// mipmap will hold the reduced image, so this is more than enough
@ -187,7 +187,7 @@ GLSL_LoadQuakeMipTex (const texture_t *tex)
swidth = max (swidth, 1);
sheight = max (sheight, 1);
qfeglTexImage2D (GL_TEXTURE_2D, lod, GL_LUMINANCE, swidth, sheight,
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, mip);
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, mip);
scaled = mip;
mip += swidth * sheight;
lod++;
@ -207,7 +207,7 @@ GLSL_LoadRGBTexture (const char *identifier, int width, int height, byte *data)
qfeglGenTextures (1, &tnum);
qfeglBindTexture (GL_TEXTURE_2D, tnum);
qfeglTexImage2D (GL_TEXTURE_2D, 0, GL_RGB,
width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@ -217,6 +217,24 @@ GLSL_LoadRGBTexture (const char *identifier, int width, int height, byte *data)
return tnum;
}
int
GLSL_LoadRGBATexture (const char *identifier, int width, int height, byte *data)
{
GLuint tnum;
qfeglGenTextures (1, &tnum);
qfeglBindTexture (GL_TEXTURE_2D, tnum);
qfeglTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
qfeglGenerateMipmap (GL_TEXTURE_2D);
return tnum;
}
void
GLSL_ReleaseTexture (int tex)
{
@ -303,7 +321,7 @@ GLSL_CreateScrap (int size, int format)
qfeglBindTexture (GL_TEXTURE_2D, scrap->tnum);
qfeglTexImage2D (GL_TEXTURE_2D, 0, format,
size, size, 0, format, GL_UNSIGNED_BYTE, data);
size, size, 0, format, GL_UNSIGNED_BYTE, data);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
qfeglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
//FIXME parameterize (linear for lightmaps)

View file

@ -55,6 +55,7 @@ static vid_model_funcs_t model_funcs = {
gl_Mod_LoadSkin,
gl_Mod_FinalizeAliasModel,
gl_Mod_LoadExternalSkins,
0,
1,
gl_Mod_SpriteLoadTexture,

View file

@ -55,6 +55,7 @@ static vid_model_funcs_t model_funcs = {
glsl_Mod_LoadSkin,
glsl_Mod_FinalizeAliasModel,
glsl_Mod_LoadExternalSkins,
glsl_Mod_IQMFinish,
0,
glsl_Mod_SpriteLoadTexture,

View file

@ -48,6 +48,7 @@ static vid_model_funcs_t model_funcs = {
sw_Mod_LoadSkin,
sw_Mod_FinalizeAliasModel,
sw_Mod_LoadExternalSkins,
0,
1,
sw_Mod_SpriteLoadTexture,

View file

@ -53,6 +53,7 @@ static vid_model_funcs_t model_funcs = {
sw_Mod_LoadSkin,
sw_Mod_FinalizeAliasModel,
sw_Mod_LoadExternalSkins,
0,
1,
sw_Mod_SpriteLoadTexture,