summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSmileTheory <SmileTheory@gmail.com>2015-12-23 09:58:11 -0800
committerTim Angus <tim@ngus.net>2016-04-07 11:46:05 +0100
commitcedfa02c6b3b17cda26202abf5e4dd32f9720cb5 (patch)
treefe92a0b799820983f70cfd5e09c939755124bbe4 /src
parent19c44d9c50d6a3057e79007c779552d0eb7fe4ef (diff)
OpenGL2: Replace r_exportCubemaps cvar with exportCubemaps command.
Diffstat (limited to 'src')
-rw-r--r--src/renderergl2/tr_backend.c62
-rw-r--r--src/renderergl2/tr_bsp.c35
-rw-r--r--src/renderergl2/tr_init.c33
-rw-r--r--src/renderergl2/tr_local.h8
4 files changed, 99 insertions, 39 deletions
diff --git a/src/renderergl2/tr_backend.c b/src/renderergl2/tr_backend.c
index ad43e5b2..4a29c966 100644
--- a/src/renderergl2/tr_backend.c
+++ b/src/renderergl2/tr_backend.c
@@ -1738,6 +1738,65 @@ const void *RB_PostProcess(const void *data)
return (const void *)(cmd + 1);
}
+// FIXME: put this function declaration elsewhere
+void R_SaveDDS(const char *filename, byte *pic, int width, int height, int depth);
+
+/*
+=============
+RB_ExportCubemaps
+
+=============
+*/
+const void *RB_ExportCubemaps(const void *data)
+{
+ const exportCubemapsCommand_t *cmd = data;
+
+ // finish any 2D drawing if needed
+ if (tess.numIndexes)
+ RB_EndSurface();
+
+ if (!glRefConfig.framebufferObject || !tr.world || tr.numCubemaps == 0)
+ {
+ // do nothing
+ ri.Printf(PRINT_ALL, "Nothing to export!\n");
+ return (const void *)(cmd + 1);
+ }
+
+ if (cmd)
+ {
+ FBO_t *oldFbo = glState.currentFBO;
+ int sideSize = CUBE_MAP_SIZE * CUBE_MAP_SIZE * 4;
+ byte *cubemapPixels = ri.Malloc(sideSize * 6);
+ int i, j;
+
+ FBO_Bind(tr.renderCubeFbo);
+
+ for (i = 0; i < tr.numCubemaps; i++)
+ {
+ char filename[MAX_QPATH];
+ cubemap_t *cubemap = &tr.cubemaps[i];
+ char *p = cubemapPixels;
+
+ for (j = 0; j < 6; j++)
+ {
+ qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, cubemap->image->texnum, 0);
+ qglReadPixels(0, 0, CUBE_MAP_SIZE, CUBE_MAP_SIZE, GL_RGBA, GL_UNSIGNED_BYTE, p);
+ p += sideSize;
+ }
+
+ Com_sprintf(filename, MAX_QPATH, "cubemaps/%s/%03d.dds", tr.world->baseName, i);
+ R_SaveDDS(filename, cubemapPixels, CUBE_MAP_SIZE, CUBE_MAP_SIZE, 6);
+ ri.Printf(PRINT_ALL, "Saved cubemap %d as %s\n", i, filename);
+ }
+
+ FBO_Bind(oldFbo);
+
+ ri.Free(cubemapPixels);
+ }
+
+ return (const void *)(cmd + 1);
+}
+
/*
====================
@@ -1786,6 +1845,9 @@ void RB_ExecuteRenderCommands( const void *data ) {
case RC_POSTPROCESS:
data = RB_PostProcess(data);
break;
+ case RC_EXPORT_CUBEMAPS:
+ data = RB_ExportCubemaps(data);
+ break;
case RC_END_OF_LIST:
default:
// finish any 2D drawing if needed
diff --git a/src/renderergl2/tr_bsp.c b/src/renderergl2/tr_bsp.c
index 81463c66..960e9282 100644
--- a/src/renderergl2/tr_bsp.c
+++ b/src/renderergl2/tr_bsp.c
@@ -3068,13 +3068,9 @@ void R_AssignCubemapsToWorldSurfaces(void)
}
}
-// FIXME: put this function declaration elsewhere
-void R_SaveDDS(const char *filename, byte *pic, int width, int height, int depth);
void R_RenderAllCubemaps(void)
{
- byte *data = NULL;
- int sideSize = CUBE_MAP_SIZE * CUBE_MAP_SIZE * 4;
int i, j;
for (i = 0; i < tr.numCubemaps; i++)
@@ -3082,9 +3078,6 @@ void R_RenderAllCubemaps(void)
tr.cubemaps[i].image = R_CreateImage(va("*cubeMap%d", i), NULL, CUBE_MAP_SIZE, CUBE_MAP_SIZE, IMGTYPE_COLORALPHA, IMGFLAG_NO_COMPRESSION | IMGFLAG_CLAMPTOEDGE | IMGFLAG_MIPMAP | IMGFLAG_CUBEMAP, GL_RGBA8);
}
- if (r_exportCubemaps->integer)
- data = ri.Malloc(sideSize * 6);
-
for (i = 0; i < tr.numCubemaps; i++)
{
for (j = 0; j < 6; j++)
@@ -3094,34 +3087,6 @@ void R_RenderAllCubemaps(void)
R_IssuePendingRenderCommands();
R_InitNextFrame();
}
-
- if (r_exportCubemaps->integer)
- {
- char filename[MAX_QPATH];
- byte *p;
- cubemap_t *cubemap = &tr.cubemaps[i];
-
- // FIXME: do this in backEnd
- FBO_Bind(tr.renderCubeFbo);
-
- p = data;
- for (j = 0; j < 6; j++)
- {
- qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, cubemap->image->texnum, 0);
- qglReadPixels(0, 0, CUBE_MAP_SIZE, CUBE_MAP_SIZE, GL_RGBA, GL_UNSIGNED_BYTE, p);
- p += sideSize;
- }
- FBO_Bind(NULL);
-
- Com_sprintf(filename, MAX_QPATH, "cubemaps/%s/%03d.dds", tr.world->baseName, backEnd.viewParms.targetFboCubemapIndex);
- R_SaveDDS(filename, data, CUBE_MAP_SIZE, CUBE_MAP_SIZE, 6);
- }
- }
-
- if (r_exportCubemaps->integer)
- {
- ri.Cvar_Set("r_exportCubemaps", "0");
- ri.Free(data);
}
}
diff --git a/src/renderergl2/tr_init.c b/src/renderergl2/tr_init.c
index 44808639..8a84c1f8 100644
--- a/src/renderergl2/tr_init.c
+++ b/src/renderergl2/tr_init.c
@@ -141,7 +141,6 @@ cvar_t *r_specularMapping;
cvar_t *r_deluxeMapping;
cvar_t *r_parallaxMapping;
cvar_t *r_cubeMapping;
-cvar_t *r_exportCubemaps;
cvar_t *r_specularIsMetallic;
cvar_t *r_glossIsRoughness;
cvar_t *r_baseNormalX;
@@ -762,6 +761,35 @@ void R_ScreenShotJPEG_f (void) {
/*
==================
+R_ExportCubemaps
+==================
+*/
+void R_ExportCubemaps()
+{
+ exportCubemapsCommand_t *cmd;
+
+ cmd = R_GetCommandBuffer(sizeof(*cmd));
+ if (!cmd) {
+ return;
+ }
+ cmd->commandId = RC_EXPORT_CUBEMAPS;
+}
+
+
+/*
+==================
+R_ExportCubemaps_f
+==================
+*/
+void R_ExportCubemaps_f(void)
+{
+ R_ExportCubemaps();
+}
+
+//============================================================================
+
+/*
+==================
RB_TakeVideoFrameCmd
==================
*/
@@ -1143,7 +1171,6 @@ void R_Register( void )
r_deluxeMapping = ri.Cvar_Get( "r_deluxeMapping", "1", CVAR_ARCHIVE | CVAR_LATCH );
r_parallaxMapping = ri.Cvar_Get( "r_parallaxMapping", "0", CVAR_ARCHIVE | CVAR_LATCH );
r_cubeMapping = ri.Cvar_Get( "r_cubeMapping", "0", CVAR_ARCHIVE | CVAR_LATCH );
- r_exportCubemaps = ri.Cvar_Get("r_exportCubemaps", "0", 0);
r_specularIsMetallic = ri.Cvar_Get( "r_specularIsMetallic", "0", CVAR_ARCHIVE | CVAR_LATCH );
r_glossIsRoughness = ri.Cvar_Get("r_glossIsRoughness", "0", CVAR_ARCHIVE | CVAR_LATCH);
r_baseNormalX = ri.Cvar_Get( "r_baseNormalX", "1.0", CVAR_ARCHIVE | CVAR_LATCH );
@@ -1280,6 +1307,7 @@ void R_Register( void )
ri.Cmd_AddCommand( "gfxinfo", GfxInfo_f );
ri.Cmd_AddCommand( "minimize", GLimp_Minimize );
ri.Cmd_AddCommand( "gfxmeminfo", GfxMemInfo_f );
+ ri.Cmd_AddCommand( "exportCubemaps", R_ExportCubemaps_f );
}
void R_InitQueries(void)
@@ -1421,6 +1449,7 @@ void RE_Shutdown( qboolean destroyWindow ) {
ri.Cmd_RemoveCommand("minimize");
ri.Cmd_RemoveCommand( "shaderstate" );
ri.Cmd_RemoveCommand( "gfxmeminfo" );
+ ri.Cmd_RemoveCommand( "exportCubemaps" );
if ( tr.registered ) {
diff --git a/src/renderergl2/tr_local.h b/src/renderergl2/tr_local.h
index f716065e..a652a396 100644
--- a/src/renderergl2/tr_local.h
+++ b/src/renderergl2/tr_local.h
@@ -1794,7 +1794,6 @@ extern cvar_t *r_specularMapping;
extern cvar_t *r_deluxeMapping;
extern cvar_t *r_parallaxMapping;
extern cvar_t *r_cubeMapping;
-extern cvar_t *r_exportCubemaps;
extern cvar_t *r_specularIsMetallic;
extern cvar_t *r_glossIsRoughness;
extern cvar_t *r_baseNormalX;
@@ -2422,6 +2421,10 @@ typedef struct {
viewParms_t viewParms;
} postProcessCommand_t;
+typedef struct {
+ int commandId;
+} exportCubemapsCommand_t;
+
typedef enum {
RC_END_OF_LIST,
RC_SET_COLOR,
@@ -2434,7 +2437,8 @@ typedef enum {
RC_COLORMASK,
RC_CLEARDEPTH,
RC_CAPSHADOWMAP,
- RC_POSTPROCESS
+ RC_POSTPROCESS,
+ RC_EXPORT_CUBEMAPS
} renderCommand_t;