91 lines
3.4 KiB
Nim
91 lines
3.4 KiB
Nim
|
|
{.passC:"-DBC7ENC_USE_MINIZ=0".}
|
|
{.compile:"./bc7enc_rdo/bc7decomp.cpp",
|
|
compile:"./bc7enc_rdo/bc7decomp_ref.cpp",
|
|
compile:"./bc7enc_rdo/bc7enc.cpp",
|
|
compile:"./bc7enc_rdo/ert.cpp",
|
|
compile:"./bc7enc_rdo/lodepng.cpp",
|
|
compile:"./bc7enc_rdo/rdo_bc_encoder.cpp",
|
|
compile:"./bc7enc_rdo/rgbcx.cpp",
|
|
compile:"./bc7enc_rdo/utils.cpp",
|
|
compile:"./bc7enc.cpp".}
|
|
|
|
## Valid formats: 1 3 4 5 7
|
|
## BC1 RGB 4bpp fast, small
|
|
## BC3 RGBA 8bpp fast
|
|
## BC4 gray 4bpp best for grayscale
|
|
## BC5 X+Y 8bpp
|
|
## BC7 RGB(A) 8bpp slow, best quality
|
|
|
|
type EncodeBcInput* {.bycopy.} = object
|
|
data*: pointer
|
|
len*: int32
|
|
width*: int32
|
|
height*: int32
|
|
format*: int8 ## BCn format to use.
|
|
bc1_quality*: int8 ## between 0 and 18
|
|
bc7_quality*: int8 ## between 0 and 6
|
|
|
|
type EncodeBcOutput* {.bycopy.} = object
|
|
data*: pointer
|
|
len*: int32
|
|
row_len*: int32
|
|
|
|
type EncodeBcError* {.size:4.} = enum
|
|
NO_ERROR = 0, ENCODER_INIT_ERROR = 1, ENCODE_ERROR = 2,
|
|
INVALID_SIZE_ERROR = 3, UNSUPPORTED_FORMAT_ERROR = 4,
|
|
INVALID_INPUT_LENGTH_ERROR = 5, INVALID_OUTPUT_LENGTH_ERROR = 6,
|
|
INVALID_SETTINGS = 7,
|
|
|
|
proc encode_bc*(input: var EncodeBcInput, output: var EncodeBcOutput, verbose: bool): EncodeBcError {.importc, cdecl.}
|
|
|
|
{.hint[XDeclaredButNotUsed]: off.}
|
|
|
|
# S3TC (BC1-3)
|
|
const GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0'i32
|
|
const GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1'i32
|
|
const GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2'i32
|
|
const GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3'i32
|
|
# S3TC (BC1-3) sRGB
|
|
const GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8C4C'i32
|
|
const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8C4D'i32
|
|
const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8C4E'i32
|
|
const GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8C4F'i32
|
|
# RGTC (BC4-5)
|
|
const GL_COMPRESSED_RED_RGTC1_EXT = 0x8DBB'i32
|
|
const GL_COMPRESSED_SIGNED_RED_RGTC1_EXT = 0x8DBC'i32
|
|
const GL_COMPRESSED_RED_GREEN_RGTC2_EXT = 0x8DBD'i32
|
|
const GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT = 0x8DBE'i32
|
|
# BPTC float (BC6H)
|
|
const GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E'i32
|
|
const GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F'i32
|
|
# BPTC (BC7)
|
|
const GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C'i32
|
|
# BPTC (BC7) sRGB
|
|
const GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D'i32
|
|
|
|
func get_bc_bpp_internal_format*(bc_format: int8, is_sRGB: bool): (int8, int32) =
|
|
let (bpp, internal_format) = if is_sRGB:
|
|
case bc_format:
|
|
of 1: (4, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT)
|
|
of 2: (8, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT)
|
|
of 3: (8, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT)
|
|
of 4: (4, GL_COMPRESSED_RED_RGTC1_EXT) # sRGB is ignored
|
|
of 5: (8, GL_COMPRESSED_RED_GREEN_RGTC2_EXT) # sRGB is ignored
|
|
of 6: (8, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB) # sRGB is ignored
|
|
of 7: (8, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB)
|
|
else: (0, 0'i32)
|
|
else:
|
|
case bc_format:
|
|
of 1: (4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT)
|
|
of 2: (8, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)
|
|
of 3: (8, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
|
|
of 4: (4, GL_COMPRESSED_RED_RGTC1_EXT)
|
|
of 5: (8, GL_COMPRESSED_RED_GREEN_RGTC2_EXT)
|
|
of 6: (8, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB)
|
|
of 7: (8, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB)
|
|
else: (0, 0'i32)
|
|
assert bpp != 0, "Invalid bc_format " & $bc_format
|
|
return (bpp.int8, internal_format)
|
|
|