Skip to content

Commit ff9ab7b

Browse files
authored
Merge pull request #28 from gimhael/nonocompress
Remove IF_NOCOMPRESSION and compression-related cvars.
2 parents f6d5449 + 1aa3f6a commit ff9ab7b

File tree

5 files changed

+52
-118
lines changed

5 files changed

+52
-118
lines changed

src/engine/renderer/tr_bsp.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ static void R_LoadLightmaps( lump_t *l, const char *bspName )
479479
width = height = 0;
480480
LoadRGBEToBytes( va( "%s/%s", mapName, lightmapFiles[ i ] ), &ldrImage, &width, &height );
481481

482-
auto image = R_CreateImage( va( "%s/%s", mapName, lightmapFiles[ i ] ), (const byte **)&ldrImage, width, height, 1, IF_NOPICMIP | IF_LIGHTMAP | IF_NOCOMPRESSION, filterType_t::FT_DEFAULT, wrapTypeEnum_t::WT_CLAMP );
482+
auto image = R_CreateImage( va( "%s/%s", mapName, lightmapFiles[ i ] ), (const byte **)&ldrImage, width, height, 1, IF_NOPICMIP | IF_LIGHTMAP, filterType_t::FT_DEFAULT, wrapTypeEnum_t::WT_CLAMP );
483483

484484
Com_AddToGrowList( &tr.lightmaps, image );
485485

@@ -498,7 +498,7 @@ static void R_LoadLightmaps( lump_t *l, const char *bspName )
498498

499499
for (int i = 0; i < numLightmaps; i++) {
500500
Log::Debug("...loading external lightmap '%s/%s'", mapName, lightmapFiles[i]);
501-
auto image = R_FindImageFile(va("%s/%s", mapName, lightmapFiles[i]), IF_NORMALMAP | IF_NOCOMPRESSION, filterType_t::FT_DEFAULT, wrapTypeEnum_t::WT_CLAMP);
501+
auto image = R_FindImageFile(va("%s/%s", mapName, lightmapFiles[i]), IF_NORMALMAP, filterType_t::FT_DEFAULT, wrapTypeEnum_t::WT_CLAMP);
502502
Com_AddToGrowList(&tr.deluxemaps, image);
503503
}
504504
}
@@ -521,10 +521,10 @@ static void R_LoadLightmaps( lump_t *l, const char *bspName )
521521
Log::Debug("...loading external lightmap '%s/%s'", mapName, lightmapFiles[i]);
522522

523523
if (!tr.worldDeluxeMapping || i % 2 == 0) {
524-
auto image = R_FindImageFile(va("%s/%s", mapName, lightmapFiles[i]), IF_LIGHTMAP | IF_NOCOMPRESSION, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP);
524+
auto image = R_FindImageFile(va("%s/%s", mapName, lightmapFiles[i]), IF_LIGHTMAP, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP);
525525
Com_AddToGrowList(&tr.lightmaps, image);
526526
} else {
527-
auto image = R_FindImageFile(va("%s/%s", mapName, lightmapFiles[i]), IF_NORMALMAP | IF_NOCOMPRESSION, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP);
527+
auto image = R_FindImageFile(va("%s/%s", mapName, lightmapFiles[i]), IF_NORMALMAP, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP);
528528
Com_AddToGrowList(&tr.deluxemaps, image);
529529
}
530530
}
@@ -607,7 +607,7 @@ static void R_LoadLightmaps( lump_t *l, const char *bspName )
607607

608608
tr.fatLightmap = R_CreateImage( va( "_fatlightmap%d", 0 ), (const byte **)&fatbuffer,
609609
tr.fatLightmapSize, tr.fatLightmapSize, 1,
610-
IF_LIGHTMAP | IF_NOCOMPRESSION, filterType_t::FT_DEFAULT, wrapTypeEnum_t::WT_CLAMP );
610+
IF_LIGHTMAP, filterType_t::FT_DEFAULT, wrapTypeEnum_t::WT_CLAMP );
611611
Com_AddToGrowList( &tr.lightmaps, tr.fatLightmap );
612612

613613
ri.Hunk_FreeTempMemory( fatbuffer );
@@ -3939,11 +3939,11 @@ void R_LoadLightGrid( lump_t *l )
39393939

39403940
tr.lightGrid1Image = R_Create3DImage("<lightGrid1>", (const byte *)w->lightGridData1,
39413941
w->lightGridBounds[ 0 ], w->lightGridBounds[ 1 ],
3942-
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE | IF_NOCOMPRESSION,
3942+
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE,
39433943
filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_EDGE_CLAMP );
39443944
tr.lightGrid2Image = R_Create3DImage("<lightGrid2>", (const byte *)w->lightGridData2,
39453945
w->lightGridBounds[ 0 ], w->lightGridBounds[ 1 ],
3946-
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE | IF_NOCOMPRESSION,
3946+
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE,
39473947
filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_EDGE_CLAMP );
39483948

39493949
return;
@@ -4103,11 +4103,11 @@ void R_LoadLightGrid( lump_t *l )
41034103

41044104
tr.lightGrid1Image = R_Create3DImage("<lightGrid1>", (const byte *)w->lightGridData1,
41054105
w->lightGridBounds[ 0 ], w->lightGridBounds[ 1 ],
4106-
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE | IF_NOCOMPRESSION,
4106+
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE,
41074107
filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_EDGE_CLAMP );
41084108
tr.lightGrid2Image = R_Create3DImage("<lightGrid2>", (const byte *)w->lightGridData2,
41094109
w->lightGridBounds[ 0 ], w->lightGridBounds[ 1 ],
4110-
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE | IF_NOCOMPRESSION,
4110+
w->lightGridBounds[ 2 ], IF_NOPICMIP | IF_NOLIGHTSCALE,
41114111
filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_EDGE_CLAMP );
41124112

41134113
Log::Debug("%i light grid points created", w->numLightGridPoints );

src/engine/renderer/tr_image.cpp

Lines changed: 15 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,14 +1038,7 @@ void R_UploadImage( const byte **dataArray, int numLayers, int numMips,
10381038
// select proper internal format
10391039
if ( samples == 3 )
10401040
{
1041-
if ( glConfig.textureCompression == textureCompression_t::TC_S3TC && !(image->bits & IF_NOCOMPRESSION ) )
1042-
{
1043-
internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
1044-
}
1045-
else
1046-
{
1047-
internalFormat = GL_RGB8;
1048-
}
1041+
internalFormat = GL_RGB8;
10491042
}
10501043
else if ( samples == 4 )
10511044
{
@@ -1055,25 +1048,7 @@ void R_UploadImage( const byte **dataArray, int numLayers, int numMips,
10551048
}
10561049
else
10571050
{
1058-
if ( glConfig.textureCompression == textureCompression_t::TC_S3TC && !( image->bits & IF_NOCOMPRESSION ) )
1059-
{
1060-
if ( image->bits & IF_DISPLACEMAP )
1061-
{
1062-
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
1063-
}
1064-
else if ( image->bits & IF_ALPHATEST )
1065-
{
1066-
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
1067-
}
1068-
else
1069-
{
1070-
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
1071-
}
1072-
}
1073-
else
1074-
{
1075-
internalFormat = GL_RGBA8;
1076-
}
1051+
internalFormat = GL_RGBA8;
10771052
}
10781053
}
10791054
}
@@ -1804,8 +1779,6 @@ image_t *R_FindImageFile( const char *imageName, int bits, filterType_t f
18041779
if ( bits & IF_LIGHTMAP )
18051780
{
18061781
R_ProcessLightmap( pic[ 0 ], 4, width, height, bits, pic[ 0 ] );
1807-
1808-
bits |= IF_NOCOMPRESSION;
18091782
}
18101783

18111784
image = R_CreateImage( ( char * ) buffer, (const byte **)pic,
@@ -2353,7 +2326,7 @@ static void R_CreateContrastRenderFBOImage()
23532326
width = glConfig.vidWidth * 0.25f;
23542327
height = glConfig.vidHeight * 0.25f;
23552328

2356-
tr.contrastRenderFBOImage = R_CreateImage( "_contrastRenderFBO", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP );
2329+
tr.contrastRenderFBOImage = R_CreateImage( "_contrastRenderFBO", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP );
23572330
}
23582331

23592332
static void R_CreateBloomRenderFBOImage()
@@ -2366,7 +2339,7 @@ static void R_CreateBloomRenderFBOImage()
23662339

23672340
for ( i = 0; i < 2; i++ )
23682341
{
2369-
tr.bloomRenderFBOImage[ i ] = R_CreateImage( va( "_bloomRenderFBO%d", i ), nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP );
2342+
tr.bloomRenderFBOImage[ i ] = R_CreateImage( va( "_bloomRenderFBO%d", i ), nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP );
23702343
}
23712344
}
23722345

@@ -2377,9 +2350,9 @@ static void R_CreateCurrentRenderImage()
23772350
width = glConfig.vidWidth;
23782351
height = glConfig.vidHeight;
23792352

2380-
tr.currentRenderImage[0] = R_CreateImage( "_currentRender[0]", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2381-
tr.currentRenderImage[1] = R_CreateImage( "_currentRender[1]", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2382-
tr.currentDepthImage = R_CreateImage( "_currentDepth", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION | IF_PACKED_DEPTH24_STENCIL8, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2353+
tr.currentRenderImage[0] = R_CreateImage( "_currentRender[0]", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2354+
tr.currentRenderImage[1] = R_CreateImage( "_currentRender[1]", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2355+
tr.currentDepthImage = R_CreateImage( "_currentDepth", nullptr, width, height, 1, IF_NOPICMIP | IF_PACKED_DEPTH24_STENCIL8, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
23832356
}
23842357

23852358
static void R_CreateDepthRenderImage()
@@ -2416,7 +2389,7 @@ static void R_CreatePortalRenderImage()
24162389
width = glConfig.vidWidth;
24172390
height = glConfig.vidHeight;
24182391

2419-
tr.portalRenderImage = R_CreateImage( "_portalRender", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2392+
tr.portalRenderImage = R_CreateImage( "_portalRender", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
24202393
}
24212394

24222395
static void R_CreateDepthToColorFBOImages()
@@ -2427,8 +2400,8 @@ static void R_CreateDepthToColorFBOImages()
24272400
height = glConfig.vidHeight;
24282401

24292402
{
2430-
tr.depthToColorBackFacesFBOImage = R_CreateImage( "_depthToColorBackFacesFBORender", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2431-
tr.depthToColorFrontFacesFBOImage = R_CreateImage( "_depthToColorFrontFacesFBORender", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2403+
tr.depthToColorBackFacesFBOImage = R_CreateImage( "_depthToColorBackFacesFBORender", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2404+
tr.depthToColorFrontFacesFBOImage = R_CreateImage( "_depthToColorFrontFacesFBORender", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
24322405
}
24332406
}
24342407

@@ -2440,11 +2413,11 @@ static void R_CreateDownScaleFBOImages()
24402413
width = glConfig.vidWidth * 0.25f;
24412414
height = glConfig.vidHeight * 0.25f;
24422415

2443-
tr.downScaleFBOImage_quarter = R_CreateImage( "_downScaleFBOImage_quarter", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2416+
tr.downScaleFBOImage_quarter = R_CreateImage( "_downScaleFBOImage_quarter", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
24442417

24452418
width = height = 64;
24462419

2447-
tr.downScaleFBOImage_64x64 = R_CreateImage( "_downScaleFBOImage_64x64", nullptr, width, height, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
2420+
tr.downScaleFBOImage_64x64 = R_CreateImage( "_downScaleFBOImage_64x64", nullptr, width, height, 1, IF_NOPICMIP, filterType_t::FT_NEAREST, wrapTypeEnum_t::WT_CLAMP );
24482421
}
24492422

24502423
// *INDENT-OFF*
@@ -2665,7 +2638,7 @@ static void R_CreateColorGradeImage()
26652638
REF_COLORGRADEMAP_SIZE,
26662639
REF_COLORGRADEMAP_SIZE,
26672640
REF_COLORGRADE_SLOTS * REF_COLORGRADEMAP_SIZE,
2668-
IF_NOPICMIP | IF_NOCOMPRESSION | IF_NOLIGHTSCALE,
2641+
IF_NOPICMIP | IF_NOLIGHTSCALE,
26692642
filterType_t::FT_LINEAR,
26702643
wrapTypeEnum_t::WT_EDGE_CLAMP );
26712644

@@ -2769,7 +2742,7 @@ void R_CreateBuiltinImages()
27692742

27702743
tr.quadraticImage =
27712744
R_CreateImage( "_quadratic", ( const byte ** ) &dataPtr,
2772-
DEFAULT_SIZE, DEFAULT_SIZE, 1, IF_NOPICMIP | IF_NOCOMPRESSION, filterType_t::FT_LINEAR,
2745+
DEFAULT_SIZE, DEFAULT_SIZE, 1, IF_NOPICMIP, filterType_t::FT_LINEAR,
27732746
wrapTypeEnum_t::WT_CLAMP );
27742747

27752748
R_CreateRandomNormalsImage();
@@ -2890,5 +2863,5 @@ qhandle_t RE_GenerateTexture( const byte *pic, int width, int height )
28902863
{
28912864
const char *name = va( "rocket%d", numTextures++ );
28922865
R_SyncRenderThread();
2893-
return RE_RegisterShaderFromImage( name, R_CreateImage( name, &pic, width, height, 1, IF_NOCOMPRESSION | IF_NOPICMIP, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP ) );
2866+
return RE_RegisterShaderFromImage( name, R_CreateImage( name, &pic, width, height, 1, IF_NOPICMIP, filterType_t::FT_LINEAR, wrapTypeEnum_t::WT_CLAMP ) );
28942867
}

src/engine/renderer/tr_init.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
8282
cvar_t *r_dynamicLightCastShadows;
8383
cvar_t *r_precomputedLighting;
8484
cvar_t *r_vertexLighting;
85-
cvar_t *r_compressDiffuseMaps;
86-
cvar_t *r_compressSpecularMaps;
87-
cvar_t *r_compressNormalMaps;
8885
cvar_t *r_exportTextures;
8986
cvar_t *r_heatHaze;
9087
cvar_t *r_noMarksOnTrisurfs;
@@ -1103,9 +1100,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
11031100
r_dynamicLightCastShadows = ri.Cvar_Get( "r_dynamicLightCastShadows", "1", 0 );
11041101
r_precomputedLighting = ri.Cvar_Get( "r_precomputedLighting", "1", CVAR_SHADER );
11051102
r_vertexLighting = ri.Cvar_Get( "r_vertexLighting", "0", CVAR_LATCH | CVAR_ARCHIVE );
1106-
r_compressDiffuseMaps = ri.Cvar_Get( "r_compressDiffuseMaps", "1", CVAR_LATCH );
1107-
r_compressSpecularMaps = ri.Cvar_Get( "r_compressSpecularMaps", "1", CVAR_LATCH );
1108-
r_compressNormalMaps = ri.Cvar_Get( "r_compressNormalMaps", "0", CVAR_LATCH );
11091103
r_exportTextures = ri.Cvar_Get( "r_exportTextures", "0", 0 );
11101104
r_heatHaze = ri.Cvar_Get( "r_heatHaze", "1", 0 );
11111105
r_noMarksOnTrisurfs = ri.Cvar_Get( "r_noMarksOnTrisurfs", "1", CVAR_CHEAT );

src/engine/renderer/tr_local.h

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -512,30 +512,29 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out )
512512
{
513513
IF_NONE,
514514
IF_NOPICMIP = BIT( 0 ),
515-
IF_NOCOMPRESSION = BIT( 1 ),
516-
IF_ALPHA = BIT( 2 ),
517-
IF_NORMALMAP = BIT( 3 ),
518-
IF_RGBA16F = BIT( 4 ),
519-
IF_RGBA32F = BIT( 5 ),
520-
IF_TWOCOMP16F = BIT( 6 ),
521-
IF_TWOCOMP32F = BIT( 7 ),
522-
IF_ONECOMP16F = BIT( 8 ),
523-
IF_ONECOMP32F = BIT( 9 ),
524-
IF_DEPTH16 = BIT( 10 ),
525-
IF_DEPTH24 = BIT( 11 ),
526-
IF_DEPTH32 = BIT( 12 ),
527-
IF_PACKED_DEPTH24_STENCIL8 = BIT( 13 ),
528-
IF_LIGHTMAP = BIT( 14 ),
529-
IF_RGBA16 = BIT( 15 ),
530-
IF_RGBE = BIT( 16 ),
531-
IF_ALPHATEST = BIT( 17 ),
532-
IF_DISPLACEMAP = BIT( 18 ),
533-
IF_NOLIGHTSCALE = BIT( 19 ),
534-
IF_BC1 = BIT( 20 ),
535-
IF_BC3 = BIT( 21 ),
536-
IF_BC4 = BIT( 22 ),
537-
IF_BC5 = BIT( 23 ),
538-
IF_RGBA32UI = BIT( 24 )
515+
IF_ALPHA = BIT( 1 ),
516+
IF_NORMALMAP = BIT( 2 ),
517+
IF_RGBA16F = BIT( 3 ),
518+
IF_RGBA32F = BIT( 4 ),
519+
IF_TWOCOMP16F = BIT( 5 ),
520+
IF_TWOCOMP32F = BIT( 6 ),
521+
IF_ONECOMP16F = BIT( 7 ),
522+
IF_ONECOMP32F = BIT( 8 ),
523+
IF_DEPTH16 = BIT( 9 ),
524+
IF_DEPTH24 = BIT( 10 ),
525+
IF_DEPTH32 = BIT( 11 ),
526+
IF_PACKED_DEPTH24_STENCIL8 = BIT( 12 ),
527+
IF_LIGHTMAP = BIT( 13 ),
528+
IF_RGBA16 = BIT( 14 ),
529+
IF_RGBE = BIT( 15 ),
530+
IF_ALPHATEST = BIT( 16 ),
531+
IF_DISPLACEMAP = BIT( 17 ),
532+
IF_NOLIGHTSCALE = BIT( 18 ),
533+
IF_BC1 = BIT( 19 ),
534+
IF_BC3 = BIT( 20 ),
535+
IF_BC4 = BIT( 21 ),
536+
IF_BC5 = BIT( 22 ),
537+
IF_RGBA32UI = BIT( 23 )
539538
};
540539

541540
enum class filterType_t
@@ -1110,7 +1109,6 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out )
11101109
bool overrideWrapType;
11111110
wrapType_t wrapType;
11121111

1113-
bool uncompressed;
11141112
bool highQuality;
11151113
bool forceHighQuality;
11161114

@@ -1230,7 +1228,6 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out )
12301228
bool polygonOffset; // set for decals and other items that must be offset
12311229
float polygonOffsetValue;
12321230

1233-
bool uncompressed;
12341231
bool noPicMip; // for images that must always be full resolution
12351232
filterType_t filterType; // for console fonts, 2D elements, etc.
12361233
wrapType_t wrapType;
@@ -2843,9 +2840,6 @@ static inline void halfToFloat( const f16vec4_t in, vec4_t out )
28432840
extern cvar_t *r_dynamicLightCastShadows;
28442841
extern cvar_t *r_precomputedLighting;
28452842
extern cvar_t *r_vertexLighting;
2846-
extern cvar_t *r_compressDiffuseMaps;
2847-
extern cvar_t *r_compressSpecularMaps;
2848-
extern cvar_t *r_compressNormalMaps;
28492843
extern cvar_t *r_exportTextures;
28502844
extern cvar_t *r_heatHaze;
28512845
extern cvar_t *r_noMarksOnTrisurfs;

0 commit comments

Comments
 (0)