fix compiler warnings in tools and test-

This commit is contained in:
Kim Kulling
2020-03-11 00:43:44 +01:00
parent 02e5698a38
commit 7e7555a91b
14 changed files with 669 additions and 733 deletions

View File

@@ -5,8 +5,6 @@ Open Asset Import Library (assimp)
Copyright (c) 2006-2020, assimp team
All rights reserved.
Redistribution and use of this software in source and binary forms,
@@ -46,94 +44,89 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "Main.h"
#include <assimp/fast_atof.h>
#include <assimp/ParsingUtils.h>
#include <assimp/StringComparison.h>
#include <assimp/fast_atof.h>
const char* AICMD_MSG_DUMP_HELP_E =
"assimp extract <model> [<out>] [-t<n>] [-f<fmt>] [-ba] [-s] [common parameters]\n"
"\t -ba Writes BMP's with alpha channel\n"
"\t -t<n> Zero-based index of the texture to be extracted \n"
"\t -f<f> Specify the file format if <out> is omitted \n"
"\t[See the assimp_cmd docs for a full list of all common parameters] \n"
"\t -cfast Fast post processing preset, runs just a few important steps \n"
"\t -cdefault Default post processing: runs all recommended steps\n"
"\t -cfull Fires almost all post processing steps \n"
;
static const char *AICMD_MSG_DUMP_HELP_E =
"assimp extract <model> [<out>] [-t<n>] [-f<fmt>] [-ba] [-s] [common parameters]\n"
"\t -ba Writes BMP's with alpha channel\n"
"\t -t<n> Zero-based index of the texture to be extracted \n"
"\t -f<f> Specify the file format if <out> is omitted \n"
"\t[See the assimp_cmd docs for a full list of all common parameters] \n"
"\t -cfast Fast post processing preset, runs just a few important steps \n"
"\t -cdefault Default post processing: runs all recommended steps\n"
"\t -cfull Fires almost all post processing steps \n";
#define AI_EXTRACT_WRITE_BMP_ALPHA 0x1
#include <assimp/Compiler/pushpack1.h>
// -----------------------------------------------------------------------------------
// Data structure for the first header of a BMP
struct BITMAPFILEHEADER
{
uint16_t bfType ;
uint32_t bfSize;
uint16_t bfReserved1 ;
uint16_t bfReserved2;
uint32_t bfOffBits;
struct BITMAPFILEHEADER {
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1;
uint16_t bfReserved2;
uint32_t bfOffBits;
} PACK_STRUCT;
// -----------------------------------------------------------------------------------
// Data structure for the second header of a BMP
struct BITMAPINFOHEADER
{
int32_t biSize;
int32_t biWidth;
int32_t biHeight;
int16_t biPlanes;
int16_t biBitCount;
uint32_t biCompression;
int32_t biSizeImage;
int32_t biXPelsPerMeter;
int32_t biYPelsPerMeter;
int32_t biClrUsed;
int32_t biClrImportant;
struct BITMAPINFOHEADER {
int32_t biSize;
int32_t biWidth;
int32_t biHeight;
int16_t biPlanes;
int16_t biBitCount;
uint32_t biCompression;
int32_t biSizeImage;
int32_t biXPelsPerMeter;
int32_t biYPelsPerMeter;
int32_t biClrUsed;
int32_t biClrImportant;
// pixel data follows header
} PACK_STRUCT;
// -----------------------------------------------------------------------------------
// Data structure for the header of a TGA
struct TGA_HEADER
{
uint8_t identsize; // size of ID field that follows 18 byte header (0 usually)
uint8_t colourmaptype; // type of colour map 0=none, 1=has palette
uint8_t imagetype; // type of image 0=none,1=indexed,2=rgb,3=grey,+8=rle packed
struct TGA_HEADER {
uint8_t identsize; // size of ID field that follows 18 byte header (0 usually)
uint8_t colourmaptype; // type of colour map 0=none, 1=has palette
uint8_t imagetype; // type of image 0=none,1=indexed,2=rgb,3=gray,+8=rle packed
uint16_t colourmapstart; // first colour map entry in palette
uint16_t colourmaplength; // number of colours in palette
uint8_t colourmapbits; // number of bits per palette entry 15,16,24,32
uint16_t colourmapstart; // first colour map entry in palette
uint16_t colourmaplength; // number of colors in palette
uint8_t colourmapbits; // number of bits per palette entry 15,16,24,32
uint16_t xstart; // image x origin
uint16_t ystart; // image y origin
uint16_t width; // image width in pixels
uint16_t height; // image height in pixels
uint8_t bits; // image bits per pixel 8,16,24,32
uint8_t descriptor; // image descriptor bits (vh flip bits)
uint16_t xstart; // image x origin
uint16_t ystart; // image y origin
uint16_t width; // image width in pixels
uint16_t height; // image height in pixels
uint8_t bits; // image bits per pixel 8,16,24,32
uint8_t descriptor; // image descriptor bits (vh flip bits)
// pixel data follows header
} PACK_STRUCT;
#include <assimp/Compiler/poppack1.h>
// -----------------------------------------------------------------------------------
// Save a texture as bitmap
int SaveAsBMP (FILE* file, const aiTexel* data, unsigned int width, unsigned int height, bool SaveAlpha = false)
{
int SaveAsBMP(FILE *file, const aiTexel *data, unsigned int width, unsigned int height, bool SaveAlpha = false) {
if (!file || !data) {
return 1;
}
const unsigned int numc = (SaveAlpha ? 4 : 3);
unsigned char* buffer = new unsigned char[width*height*numc];
unsigned char *buffer = new unsigned char[width * height * numc];
for (unsigned int y = 0; y < height; ++y) {
for (unsigned int x = 0; x < width; ++x) {
unsigned char* s = &buffer[(y*width+x) * numc];
const aiTexel* t = &data [ y*width+x];
unsigned char *s = &buffer[(y * width + x) * numc];
const aiTexel *t = &data[y * width + x];
s[0] = t->b;
s[1] = t->g;
s[2] = t->r;
@@ -143,33 +136,33 @@ int SaveAsBMP (FILE* file, const aiTexel* data, unsigned int width, unsigned int
}
BITMAPFILEHEADER header;
header.bfType = 'B' | (int('M') << 8u);
header.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
header.bfSize = header.bfOffBits+width*height*numc;
header.bfType = 'B' | (int('M') << 8u);
header.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
header.bfSize = header.bfOffBits + width * height * numc;
header.bfReserved1 = header.bfReserved2 = 0;
fwrite(&header,sizeof(BITMAPFILEHEADER),1,file);
fwrite(&header, sizeof(BITMAPFILEHEADER), 1, file);
BITMAPINFOHEADER info;
info.biSize = 40;
info.biWidth = width;
info.biHeight = height;
info.biPlanes = 1;
info.biBitCount = numc<<3;
info.biSize = 40;
info.biWidth = width;
info.biHeight = height;
info.biPlanes = 1;
info.biBitCount = (int16_t)numc << 3;
info.biCompression = 0;
info.biSizeImage = width*height*numc;
info.biSizeImage = width * height * numc;
info.biXPelsPerMeter = 1; // dummy
info.biYPelsPerMeter = 1; // dummy
info.biClrUsed = 0;
info.biClrImportant = 0;
fwrite(&info,sizeof(BITMAPINFOHEADER),1,file);
fwrite(&info, sizeof(BITMAPINFOHEADER), 1, file);
unsigned char* temp = buffer+info.biSizeImage;
const unsigned int row = width*numc;
unsigned char *temp = buffer + info.biSizeImage;
const unsigned int row = width * numc;
for (int y = 0; temp -= row,y < info.biHeight;++y) {
fwrite(temp,row,1,file);
for (int y = 0; temp -= row, y < info.biHeight; ++y) {
fwrite(temp, row, 1, file);
}
// delete the buffer
@@ -179,25 +172,24 @@ int SaveAsBMP (FILE* file, const aiTexel* data, unsigned int width, unsigned int
// -----------------------------------------------------------------------------------
// Save a texture as tga
int SaveAsTGA (FILE* file, const aiTexel* data, unsigned int width, unsigned int height)
{
int SaveAsTGA(FILE *file, const aiTexel *data, unsigned int width, unsigned int height) {
if (!file || !data) {
return 1;
}
TGA_HEADER head;
memset(&head, 0, sizeof(head));
head.bits = 32;
head.bits = 32;
head.height = (uint16_t)height;
head.width = (uint16_t)width;
head.descriptor |= (1u<<5);
head.width = (uint16_t)width;
head.descriptor |= (1u << 5);
head.imagetype = 2; // actually it's RGBA
fwrite(&head,sizeof(TGA_HEADER),1,file);
fwrite(&head, sizeof(TGA_HEADER), 1, file);
for (unsigned int y = 0; y < height; ++y) {
for (unsigned int x = 0; x < width; ++x) {
fwrite(data + y*width+x,4,1,file);
fwrite(data + y * width + x, 4, 1, file);
}
}
@@ -206,18 +198,15 @@ int SaveAsTGA (FILE* file, const aiTexel* data, unsigned int width, unsigned int
// -----------------------------------------------------------------------------------
// Do the texture import for a given aiTexture
int DoExport(const aiTexture* tx, FILE* p, const std::string& extension,
unsigned int flags)
{
int DoExport(const aiTexture *tx, FILE *p, const std::string &extension,
unsigned int flags) {
// export the image to the appropriate decoder
if (extension == "bmp") {
SaveAsBMP(p,tx->pcData,tx->mWidth,tx->mHeight,
(0 != (flags & AI_EXTRACT_WRITE_BMP_ALPHA)));
}
else if (extension == "tga") {
SaveAsTGA(p,tx->pcData,tx->mWidth,tx->mHeight);
}
else {
SaveAsBMP(p, tx->pcData, tx->mWidth, tx->mHeight,
(0 != (flags & AI_EXTRACT_WRITE_BMP_ALPHA)));
} else if (extension == "tga") {
SaveAsTGA(p, tx->pcData, tx->mWidth, tx->mHeight);
} else {
printf("assimp extract: No available texture encoder found for %s\n", extension.c_str());
return AssimpCmdExtractError::NoAvailableTextureEncoderFound;
}
@@ -226,9 +215,8 @@ int DoExport(const aiTexture* tx, FILE* p, const std::string& extension,
// -----------------------------------------------------------------------------------
// Implementation of the assimp extract utility
int Assimp_Extract (const char* const* params, unsigned int num)
{
const char* const invalid = "assimp extract: Invalid number of arguments. See \'assimp extract --help\'\n";
int Assimp_Extract(const char *const *params, unsigned int num) {
const char *const invalid = "assimp extract: Invalid number of arguments. See \'assimp extract --help\'\n";
// assimp extract in out [options]
if (num < 1) {
printf(invalid);
@@ -236,46 +224,39 @@ int Assimp_Extract (const char* const* params, unsigned int num)
}
// --help
if (!strcmp( params[0], "-h") || !strcmp( params[0], "--help") || !strcmp( params[0], "-?") ) {
printf("%s",AICMD_MSG_DUMP_HELP_E);
if (!strcmp(params[0], "-h") || !strcmp(params[0], "--help") || !strcmp(params[0], "-?")) {
printf("%s", AICMD_MSG_DUMP_HELP_E);
return AssimpCmdError::Success;
}
std::string in = std::string(params[0]);
std::string in = std::string(params[0]);
std::string out = (num > 1 ? std::string(params[1]) : "-");
// get import flags
ImportData import;
ProcessStandardArguments(import,params+1,num-1);
ProcessStandardArguments(import, params + 1, num - 1);
bool nosuffix = false;
unsigned int texIdx = 0xffffffff, flags = 0;
unsigned int texIdx = 0xffffffff, flags = 0;
// process other flags
std::string extension = "bmp";
for (unsigned int i = (out[0] == '-' ? 1 : 2); i < num;++i) {
for (unsigned int i = (out[0] == '-' ? 1 : 2); i < num; ++i) {
if (!params[i]) {
continue;
}
if (!strncmp( params[i], "-f",2)) {
extension = std::string(params[i]+2);
}
else if ( !strncmp( params[i], "--format=",9)) {
extension = std::string(params[i]+9);
}
else if ( !strcmp( params[i], "--nosuffix") || !strcmp(params[i],"-s")) {
if (!strncmp(params[i], "-f", 2)) {
extension = std::string(params[i] + 2);
} else if (!strncmp(params[i], "--format=", 9)) {
extension = std::string(params[i] + 9);
} else if (!strcmp(params[i], "--nosuffix") || !strcmp(params[i], "-s")) {
nosuffix = true;
}
else if ( !strncmp( params[i], "--texture=",10)) {
texIdx = Assimp::strtoul10(params[i]+10);
}
else if ( !strncmp( params[i], "-t",2)) {
texIdx = Assimp::strtoul10(params[i]+2);
}
else if ( !strcmp( params[i], "-ba") || !strcmp( params[i], "--bmp-with-alpha")) {
} else if (!strncmp(params[i], "--texture=", 10)) {
texIdx = Assimp::strtoul10(params[i] + 10);
} else if (!strncmp(params[i], "-t", 2)) {
texIdx = Assimp::strtoul10(params[i] + 2);
} else if (!strcmp(params[i], "-ba") || !strcmp(params[i], "--bmp-with-alpha")) {
flags |= AI_EXTRACT_WRITE_BMP_ALPHA;
}
#if 0
@@ -286,28 +267,28 @@ int Assimp_Extract (const char* const* params, unsigned int num)
#endif
}
std::transform(extension.begin(),extension.end(),extension.begin(),::tolower);
std::transform(extension.begin(), extension.end(), extension.begin(), Assimp::ToLower<char>);
if (out[0] == '-') {
// take file name from input file
std::string::size_type s = in.find_last_of('.');
if (s == std::string::npos)
s = in.length();
out = in.substr(0,s);
out = in.substr(0, s);
}
// take file extension from file name, if given
std::string::size_type s = out.find_last_of('.');
if (s != std::string::npos) {
extension = out.substr(s+1,in.length()-(s+1));
out = out.substr(0,s);
extension = out.substr(s + 1, in.length() - (s + 1));
out = out.substr(0, s);
}
// import the main model
const aiScene* scene = ImportModel(import,in);
const aiScene *scene = ImportModel(import, in);
if (!scene) {
printf("assimp extract: Unable to load input file %s\n",in.c_str());
printf("assimp extract: Unable to load input file %s\n", in.c_str());
return AssimpCmdError::FailedToLoadInputFile;
}
@@ -317,28 +298,27 @@ int Assimp_Extract (const char* const* params, unsigned int num)
// check whether the requested texture is existing
if (texIdx >= scene->mNumTextures) {
::printf("assimp extract: Texture %i requested, but there are just %i textures\n",
texIdx, scene->mNumTextures);
texIdx, scene->mNumTextures);
return AssimpCmdExtractError::TextureIndexIsOutOfRange;
}
}
else {
::printf("assimp extract: Exporting %i textures\n",scene->mNumTextures);
} else {
::printf("assimp extract: Exporting %i textures\n", scene->mNumTextures);
}
// now write all output textures
for (unsigned int i = 0; i < scene->mNumTextures;++i) {
for (unsigned int i = 0; i < scene->mNumTextures; ++i) {
if (texIdx != 0xffffffff && texIdx != i) {
continue;
}
const aiTexture* tex = scene->mTextures[i];
const aiTexture *tex = scene->mTextures[i];
std::string out_cpy = out, out_ext = extension;
// append suffix if necessary - always if all textures are exported
if (!nosuffix || (texIdx == 0xffffffff)) {
out_cpy.append ("_img");
out_cpy.append("_img");
char tmp[10];
Assimp::ASSIMP_itoa10(tmp,i);
Assimp::ASSIMP_itoa10(tmp, i);
out_cpy.append(std::string(tmp));
}
@@ -347,32 +327,35 @@ int Assimp_Extract (const char* const* params, unsigned int num)
// it to its native file format
if (!tex->mHeight) {
printf("assimp extract: Texture %i is compressed (%s). Writing native file format.\n",
i,tex->achFormatHint);
i, tex->achFormatHint);
// modify file extension
out_ext = std::string(tex->achFormatHint);
}
out_cpy.append("."+out_ext);
out_cpy.append("." + out_ext);
// open output file
FILE* p = ::fopen(out_cpy.c_str(),"wb");
if (!p) {
printf("assimp extract: Unable to open output file %s\n",out_cpy.c_str());
FILE *p = ::fopen(out_cpy.c_str(), "wb");
if (!p) {
printf("assimp extract: Unable to open output file %s\n", out_cpy.c_str());
return AssimpCmdError::FailedToOpenOutputFile;
}
int m;
if (!tex->mHeight) {
m = (1 != fwrite(tex->pcData,tex->mWidth,1,p))
? static_cast<int>(AssimpCmdError::Success)
: static_cast<int>(AssimpCmdExtractError::FailedToExportCompressedTexture);
m = (1 != fwrite(tex->pcData, tex->mWidth, 1, p)) ?
static_cast<int>(AssimpCmdError::Success) :
static_cast<int>(AssimpCmdExtractError::FailedToExportCompressedTexture);
} else {
m = DoExport(tex, p, extension, flags);
}
else m = DoExport(tex,p,extension,flags);
::fclose(p);
printf("assimp extract: Wrote texture %i to %s\n",i, out_cpy.c_str());
if (texIdx != 0xffffffff)
printf("assimp extract: Wrote texture %i to %s\n", i, out_cpy.c_str());
if (texIdx != 0xffffffff) {
return m;
}
}
return AssimpCmdError::Success;
}