From 51bd1bd12f2246f52d01f65c8b86d13d01da290b Mon Sep 17 00:00:00 2001 From: castano Date: Thu, 25 Oct 2007 08:49:23 +0000 Subject: [PATCH] Add normal diff option for normal maps. Start dds assembling tool. --- src/nvtt/CMakeLists.txt | 5 +- src/nvtt/tools/assemble.cpp | 139 ++++++++++++++++++++++++++++++++++++ src/nvtt/tools/imgdiff.cpp | 30 +++++--- 3 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 src/nvtt/tools/assemble.cpp diff --git a/src/nvtt/CMakeLists.txt b/src/nvtt/CMakeLists.txt index 387e045..59d29e0 100644 --- a/src/nvtt/CMakeLists.txt +++ b/src/nvtt/CMakeLists.txt @@ -57,6 +57,9 @@ TARGET_LINK_LIBRARIES(nvddsinfo nvcore nvmath nvimage) ADD_EXECUTABLE(nvimgdiff tools/imgdiff.cpp) TARGET_LINK_LIBRARIES(nvimgdiff nvcore nvmath nvimage) -INSTALL(TARGETS nvcompress nvdecompress nvddsinfo nvimgdiff DESTINATION bin) +ADD_EXECUTABLE(nvassemble tools/assemble.cpp) +TARGET_LINK_LIBRARIES(nvassemble nvcore nvmath nvimage) + +INSTALL(TARGETS nvcompress nvdecompress nvddsinfo nvimgdiff nvassemble DESTINATION bin) diff --git a/src/nvtt/tools/assemble.cpp b/src/nvtt/tools/assemble.cpp new file mode 100644 index 0000000..2c41008 --- /dev/null +++ b/src/nvtt/tools/assemble.cpp @@ -0,0 +1,139 @@ +// Copyright NVIDIA Corporation 2007 -- Ignacio Castano +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. + +#include +#include + +#include +#include + +#include + +#include "cmdline.h" + +// @@ Add decent error messages. +// @@ Add option to resize images. +// @@ Output DDS header according to surface type. +// @@ Output images. + +int main(int argc, char *argv[]) +{ + MyAssertHandler assertHandler; + MyMessageHandler messageHandler; + + bool assembleCubeMap = true; +// bool assembleVolume = false; +// bool assembleTextureArray = false; + + nv::Array files; + + // Parse arguments. + for (int i = 1; i < argc; i++) + { + // Input options. + if (strcmp("-cube", argv[i]) == 0) + { + assembleCubeMap = true; + assembleVolume = false; + assembleTextureArray = false; + } + /*if (strcmp("-volume", argv[i]) == 0) + { + assembleCubeMap = false; + assembleVolume = true; + assembleTextureArray = false; + } + if (strcmp("-array", argv[i]) == 0) + { + assembleCubeMap = false; + assembleVolume = false; + assembleTextureArray = true; + }*/ + + else if (argv[i][0] != '-') + { + files.append(argv[i]); + } + } + + if (files.count() == 0) + { + printf("NVIDIA Texture Tools - Copyright NVIDIA Corporation 2007\n\n"); + printf("usage: nvassemble [-cube|-volume|-array] 'file0' 'file1' ...\n\n"); + return 1; + } + + if (assembleCubeMap && files.count() != 0) + { + printf("*** error, 6 files expected, but got %d\n", files.count()); + return 1; + } + + // Load all files. + nv::Array images; + + uint w, h; + bool hasAlpha = false; + + const uint imageCount = files.count(); + for (uint i = 0; i < imageCount; i++) + { + if (!images[i].load(files[i])) + { + printf("*** error loading file\n"); + return 1; + } + + if (i == 0) + { + w = images[i].width(); + h = images[i].height(); + } + else if (images[i].width() != w || images[i].height() != h) + { + printf("*** error, size of image '%s' does not match\n", files[i].str()); + return 1; + } + + if (images[i].format() == nv::Image::Format_ARGB) + { + hasAlpha = true; + } + } + + + nv::Path name("output.dds"); + + nv::StdOutputStream stream(name); + if (stream.isError()) { + printf("Error opening '%s' for writting\n", name.str()); + return 1; + } + + // @@ Output DDS header. + + // @@ Output images. + + return 0; +} + diff --git a/src/nvtt/tools/imgdiff.cpp b/src/nvtt/tools/imgdiff.cpp index 036cd73..708bcca 100644 --- a/src/nvtt/tools/imgdiff.cpp +++ b/src/nvtt/tools/imgdiff.cpp @@ -90,10 +90,10 @@ struct Error void print() { - printf("Mean absolute error: %f\n", mabse); - printf("Max absolute error: %f\n", maxabse); - printf("Root mean squared error: %f\n", rmse); - printf("Peak signal to noise ratio in dB: %f\n", psnr); + printf(" Mean absolute error: %f\n", mabse); + printf(" Max absolute error: %f\n", maxabse); + printf(" Root mean squared error: %f\n", rmse); + printf(" Peak signal to noise ratio in dB: %f\n", psnr); } int samples; @@ -109,7 +109,8 @@ struct NormalError NormalError() { samples = 0; - ade = 0; + ade = 0.0f; + mse = 0.0f; } void addSample(nv::Color32 o, nv::Color32 c) @@ -117,26 +118,36 @@ struct NormalError nv::Vector3 vo = nv::Vector3(o.r, o.g, o.b); nv::Vector3 vc = nv::Vector3(c.r, c.g, c.b); - vo = nv::normalize(2 * (vo / 255.0f) - 1); - vc = nv::normalize(2 * (vc / 255.0f) - 1); + // Unpack and normalize. + vo = nv::normalize(2.0f * (vo / 255.0f) - 1.0f); + vc = nv::normalize(2.0f * (vc / 255.0f) - 1.0f); ade += acosf(nv::clamp(dot(vo, vc), -1.0f, 1.0f)); - + mse += length_squared((vo - vc) * (255 / 2.0f)); + samples++; } void done() { ade /= samples; + mse /= samples * 3; + rmse = sqrt(mse); + psnr = (rmse == 0) ? 999.0f : 20.0f * log10(255.0 / rmse); } void print() { - printf("Angular deviation error: %f\n", ade); + printf(" Angular deviation error: %f\n", ade); + printf(" Root mean squared error: %f\n", rmse); + printf(" Peak signal to noise ratio in dB: %f\n", psnr); } int samples; float ade; + float mse; + float rmse; + float psnr; }; @@ -265,6 +276,7 @@ int main(int argc, char *argv[]) if (compareNormal) { + printf("Normal:\n"); error_normal.print(); }