diff --git a/source/collada/CommonConvert.cpp b/source/collada/CommonConvert.cpp index 3d7a5e702c..49497422bf 100644 --- a/source/collada/CommonConvert.cpp +++ b/source/collada/CommonConvert.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2009 Wildfire Games. +/* Copyright (C) 2011 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -74,14 +74,18 @@ FColladaErrorHandler::~FColladaErrorHandler() void FColladaErrorHandler::OnError(FUError::Level errorLevel, uint32 errorCode, uint32 UNUSED(lineNumber)) { + // Ignore warnings about missing materials, since we ignore materials entirely anyway + if (errorCode == FUError::WARNING_INVALID_POLYGON_MAT_SYMBOL) + return; + const char* errorString = FUError::GetErrorString((FUError::Code) errorCode); if (! errorString) errorString = "Unknown error code"; if (errorLevel == FUError::DEBUG_LEVEL) - Log(LOG_INFO, "FCollada message %d: %s", errorCode, errorString); + Log(LOG_INFO, "FCollada %d: %s", errorCode, errorString); else if (errorLevel == FUError::WARNING_LEVEL) - Log(LOG_WARNING, "FCollada warning %d: %s", errorCode, errorString); + Log(LOG_WARNING, "FCollada %d: %s", errorCode, errorString); else throw ColladaException(errorString); } diff --git a/source/collada/DLL.cpp b/source/collada/DLL.cpp index 2576fa12a1..f789d3b434 100644 --- a/source/collada/DLL.cpp +++ b/source/collada/DLL.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2009 Wildfire Games. +/* Copyright (C) 2011 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -25,19 +25,26 @@ #include #include -void default_logger(int severity, const char* message) +void default_logger(void*, int severity, const char* message) { fprintf(stderr, "[%d] %s\n", severity, message); } static LogFn g_Logger = &default_logger; +static void* g_LoggerCBData = NULL; -EXPORT void set_logger(LogFn logger) +EXPORT void set_logger(LogFn logger, void* cb_data) { if (logger) + { g_Logger = logger; + g_LoggerCBData = cb_data; + } else + { g_Logger = &default_logger; + g_LoggerCBData = NULL; + } } void Log(int severity, const char* msg, ...) @@ -49,7 +56,7 @@ void Log(int severity, const char* msg, ...) buffer[sizeof(buffer)-1] = '\0'; va_end(ap); - g_Logger(severity, buffer); + g_Logger(g_LoggerCBData, severity, buffer); } struct BufferedOutputCallback : public OutputCB diff --git a/source/collada/DLL.h b/source/collada/DLL.h index 2f0552ee80..aa17dfe02a 100644 --- a/source/collada/DLL.h +++ b/source/collada/DLL.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2009 Wildfire Games. +/* Copyright (C) 2011 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -36,14 +36,14 @@ #define LOG_WARNING 1 #define LOG_ERROR 2 -typedef void (*LogFn) (int severity, const char* text); +typedef void (*LogFn) (void* cb_data, int severity, const char* text); typedef void (*OutputFn) (void* cb_data, const char* data, unsigned int length); /* This version number should be bumped whenever incompatible changes * are made, to invalidate old caches. */ #define COLLADA_CONVERTER_VERSION 2 -EXPORT void set_logger(LogFn logger); +EXPORT void set_logger(LogFn logger, void* cb_data); EXPORT int set_skeleton_definitions(const char* xml, int length); EXPORT int convert_dae_to_pmd(const char* dae, OutputFn pmd_writer, void* cb_data); EXPORT int convert_dae_to_psa(const char* dae, OutputFn psa_writer, void* cb_data); diff --git a/source/graphics/ColladaManager.cpp b/source/graphics/ColladaManager.cpp index 8d227ea50d..4a54e853cc 100644 --- a/source/graphics/ColladaManager.cpp +++ b/source/graphics/ColladaManager.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2009 Wildfire Games. +/* Copyright (C) 2011 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -33,14 +33,16 @@ namespace Collada namespace { - void ColladaLog(int severity, const char* text) + void ColladaLog(void* cb_data, int severity, const char* text) { + VfsPath* path = static_cast(cb_data); + if (severity == LOG_INFO) - LOGMESSAGE(L"Collada message: %hs", text); + LOGMESSAGE(L"%ls: %hs", path->string().c_str(), text); else if (severity == LOG_WARNING) - LOGWARNING(L"Collada warning: %hs", text); + LOGWARNING(L"%ls: %hs", path->string().c_str(), text); else - LOGERROR(L"Collada error: %hs", text); + LOGERROR(L"%ls: %hs", path->string().c_str(), text); } void ColladaOutput(void* cb_data, const char* data, unsigned int length) @@ -54,7 +56,7 @@ class CColladaManagerImpl { DllLoader dll; - void (*set_logger)(Collada::LogFn logger); + void (*set_logger)(Collada::LogFn logger, void* cb_data); int (*set_skeleton_definitions)(const char* xml, int length); int (*convert_dae_to_pmd)(const char* dae, Collada::OutputFn pmd_writer, void* cb_data); int (*convert_dae_to_psa)(const char* dae, Collada::OutputFn psa_writer, void* cb_data); @@ -68,7 +70,7 @@ public: ~CColladaManagerImpl() { if (dll.IsLoaded()) - set_logger(NULL); // unregister the log handler + set_logger(NULL, NULL); // unregister the log handler } bool Convert(const VfsPath& daeFilename, const VfsPath& pmdFilename, CColladaManager::FileType type) @@ -101,10 +103,13 @@ public: return false; } - set_logger(ColladaLog); + VfsPath skeletonPath("art/skeletons/skeletons.xml"); + + // Set the filename for the logger to report + set_logger(ColladaLog, static_cast(&skeletonPath)); CVFSFile skeletonFile; - if (skeletonFile.Load(g_VFS, L"art/skeletons/skeletons.xml") != PSRETURN_OK) + if (skeletonFile.Load(g_VFS, skeletonPath) != PSRETURN_OK) { LOGERROR(L"Failed to read skeleton definitions"); dll.Unload(); @@ -124,6 +129,9 @@ public: // as to why it's not picking up their changes } + // Set the filename for the logger to report + set_logger(ColladaLog, const_cast(static_cast(&daeFilename))); + // We need to null-terminate the buffer, so do it (possibly inefficiently) // by converting to a CStr CStr daeData; @@ -145,7 +153,7 @@ public: // don't create zero-length files (as happens in test_invalid_dae when // we deliberately pass invalid XML data) because the VFS caching // logic warns when asked to load such. - if(writeBuffer.Size()) + if (writeBuffer.Size()) { Status ret = g_VFS->CreateFile(pmdFilename, writeBuffer.Data(), writeBuffer.Size()); ENSURE(ret == INFO::OK);