Merged
This commit is contained in:
commit
da926956b7
32 changed files with 865 additions and 337 deletions
|
@ -17,13 +17,28 @@ SET(WINSDK_VERSION "CURRENT" CACHE STRING "Windows SDK version to prefer")
|
|||
MACRO(DETECT_WINSDK_VERSION_HELPER _ROOT _VERSION)
|
||||
GET_FILENAME_COMPONENT(WINSDK${_VERSION}_DIR "[${_ROOT}\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v${_VERSION};InstallationFolder]" ABSOLUTE)
|
||||
|
||||
IF(WINSDK${_VERSION}_DIR AND NOT WINSDK${_VERSION}_DIR STREQUAL "/registry")
|
||||
IF(WINSDK${_VERSION}_DIR AND NOT WINSDK${_VERSION}_DIR STREQUAL "/registry" AND EXISTS "${WINSDK${_VERSION}_DIR}/Include")
|
||||
SET(WINSDK${_VERSION}_FOUND ON)
|
||||
GET_FILENAME_COMPONENT(WINSDK${_VERSION}_VERSION_FULL "[${_ROOT}\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v${_VERSION};ProductVersion]" NAME)
|
||||
IF(NOT WindowsSDK_FIND_QUIETLY)
|
||||
MESSAGE(STATUS "Found Windows SDK ${_VERSION} in ${WINSDK${_VERSION}_DIR}")
|
||||
ENDIF(NOT WindowsSDK_FIND_QUIETLY)
|
||||
ELSE(WINSDK${_VERSION}_DIR AND NOT WINSDK${_VERSION}_DIR STREQUAL "/registry")
|
||||
ENDIF()
|
||||
ELSE()
|
||||
SET(WINSDK${_VERSION}_DIR "")
|
||||
ENDIF()
|
||||
ENDMACRO()
|
||||
|
||||
MACRO(DETECT_WINKIT_VERSION _VERSION _SUFFIX)
|
||||
GET_FILENAME_COMPONENT(WINSDK${_VERSION}_DIR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot${_SUFFIX}]" ABSOLUTE)
|
||||
|
||||
IF(WINSDK${_VERSION}_DIR AND NOT WINSDK${_VERSION}_DIR STREQUAL "/registry")
|
||||
SET(WINSDK${_VERSION}_FOUND ON)
|
||||
SET(WINSDK${_VERSION}_VERSION_FULL "${_VERSION}")
|
||||
IF(NOT WindowsSDK_FIND_QUIETLY)
|
||||
MESSAGE(STATUS "Found Windows SDK ${_VERSION} in ${WINSDK${_VERSION}_DIR}")
|
||||
ENDIF()
|
||||
LIST(APPEND WINSDK_DETECTED_VERSIONS ${_VERSION})
|
||||
ELSE()
|
||||
SET(WINSDK${_VERSION}_DIR "")
|
||||
ENDIF()
|
||||
ENDMACRO()
|
||||
|
@ -37,9 +52,16 @@ MACRO(DETECT_WINSDK_VERSION _VERSION)
|
|||
ENDIF()
|
||||
ENDMACRO()
|
||||
|
||||
SET(WINSDK_VERSIONS "8.1" "8.0" "7.1" "7.1A" "7.0" "7.0A" "6.1" "6.0" "6.0A")
|
||||
SET(WINSDK_DETECTED_VERSIONS)
|
||||
|
||||
# Fixed versions for Windows Kits (VC++ from 2012)
|
||||
DETECT_WINKIT_VERSION("10.0" "10")
|
||||
DETECT_WINKIT_VERSION("8.1" "81")
|
||||
DETECT_WINKIT_VERSION("8.0" "")
|
||||
|
||||
# For VC++ up to 2010
|
||||
SET(WINSDK_VERSIONS "7.1" "7.1A" "7.0" "7.0A" "6.1" "6.0" "6.0A")
|
||||
|
||||
# Search all supported Windows SDKs
|
||||
FOREACH(_VERSION ${WINSDK_VERSIONS})
|
||||
DETECT_WINSDK_VERSION(${_VERSION})
|
||||
|
@ -51,7 +73,9 @@ ENDFOREACH()
|
|||
|
||||
SET(WINSDK_SUFFIXES)
|
||||
|
||||
IF(TARGET_ARM)
|
||||
IF(TARGET_ARM64)
|
||||
SET(WINSDK8_SUFFIX "arm64")
|
||||
ELSEIF(TARGET_ARM)
|
||||
SET(WINSDK8_SUFFIX "arm")
|
||||
ELSEIF(TARGET_X64)
|
||||
SET(WINSDK8_SUFFIX "x64")
|
||||
|
@ -216,7 +240,9 @@ MACRO(USE_CURRENT_WINSDK)
|
|||
|
||||
IF(NOT WINSDK_DIR)
|
||||
# Use Windows SDK versions installed with VC++ when possible
|
||||
IF(MSVC12)
|
||||
IF(MSVC14)
|
||||
SET(WINSDK_VERSION "8.1")
|
||||
ELSEIF(MSVC12)
|
||||
SET(WINSDK_VERSION "8.1")
|
||||
ELSEIF(MSVC11)
|
||||
SET(WINSDK_VERSION "8.0")
|
||||
|
@ -267,6 +293,16 @@ MACRO(USE_CURRENT_WINSDK)
|
|||
ENDIF()
|
||||
ENDMACRO()
|
||||
|
||||
IF(MSVC14)
|
||||
# Under VC++ 2015, stdio.h, stdlib.h, etc... are part of UCRT
|
||||
SET(WINSDK_UCRT_VERSION "10.0")
|
||||
ENDIF()
|
||||
|
||||
# Look for correct UCRT
|
||||
IF(WINSDK_UCRT_VERSION AND WINSDK${WINSDK_UCRT_VERSION}_FOUND)
|
||||
SET(WINSDK_UCRT_DIR "${WINSDK${WINSDK_UCRT_VERSION}_DIR}")
|
||||
ENDIF()
|
||||
|
||||
IF(WINSDK_VERSION STREQUAL "CURRENT")
|
||||
USE_CURRENT_WINSDK()
|
||||
ELSE()
|
||||
|
@ -291,11 +327,16 @@ FIND_PATH(WINSDK_INCLUDE_DIR Windows.h
|
|||
${WINSDK_DIR}/Include
|
||||
)
|
||||
|
||||
# directory where WinRT headers are found
|
||||
FIND_PATH(WINSDK_WINRT_INCLUDE_DIR winstring.h
|
||||
HINTS
|
||||
${WINSDK_DIR}/Include/winrt
|
||||
)
|
||||
|
||||
# directory where DirectX headers are found
|
||||
FIND_PATH(WINSDK_SHARED_INCLUDE_DIR d3d9.h
|
||||
HINTS
|
||||
${WINSDK_DIR}/Include/shared
|
||||
${WINSDK_DIR}/Include
|
||||
)
|
||||
|
||||
# directory where OpenGL headers are found
|
||||
|
@ -303,12 +344,13 @@ FIND_PATH(WINSDK_OPENGL_INCLUDE_DIR GL.h
|
|||
HINTS
|
||||
${WINSDK_DIR}/Include/um/gl
|
||||
${WINSDK_DIR}/Include/gl
|
||||
${WINSDK_DIR}/Include
|
||||
)
|
||||
|
||||
SET(WINSDK_LIBRARY_DIRS
|
||||
${WINSDK_DIR}/Lib/winv6.3/um/${WINSDK8_SUFFIX}
|
||||
${WINSDK_DIR}/Lib/win8/um/${WINSDK8_SUFFIX})
|
||||
${WINSDK_DIR}/Lib/win8/um/${WINSDK8_SUFFIX}
|
||||
${WINSDK_DIR}/Lib/${WINSDK_SUFFIX}
|
||||
)
|
||||
|
||||
IF(WINSDK_SUFFIXES)
|
||||
FOREACH(_SUFFIX ${WINSDK_SUFFIXES})
|
||||
|
@ -324,6 +366,22 @@ FIND_PATH(WINSDK_LIBRARY_DIR ComCtl32.lib
|
|||
${WINSDK_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
IF(WINSDK_UCRT_DIR)
|
||||
# directory where UCRT headers are found
|
||||
FIND_PATH(WINSDK_UCRT_INCLUDE_DIR corecrt.h
|
||||
HINTS
|
||||
${WINSDK_UCRT_DIR}/Include/10.0.10056.0/ucrt
|
||||
${WINSDK_UCRT_DIR}/Include/10.0.10150.0/ucrt
|
||||
)
|
||||
|
||||
# directory where UCRT libraries are found
|
||||
FIND_PATH(WINSDK_UCRT_LIBRARY_DIR ucrt.lib
|
||||
HINTS
|
||||
${WINSDK_UCRT_DIR}/Lib/10.0.10056.0/ucrt/${WINSDK8_SUFFIX}
|
||||
${WINSDK_UCRT_DIR}/Lib/10.0.10150.0/ucrt/${WINSDK8_SUFFIX}
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
# signtool is used to sign executables
|
||||
FIND_PROGRAM(WINSDK_SIGNTOOL signtool
|
||||
HINTS
|
||||
|
@ -342,10 +400,33 @@ FIND_PROGRAM(WINSDK_MIDL midl
|
|||
|
||||
IF(WINSDK_INCLUDE_DIR)
|
||||
SET(WINSDK_FOUND ON)
|
||||
SET(WINSDK_INCLUDE_DIRS ${WINSDK_INCLUDE_DIR} ${WINSDK_SHARED_INCLUDE_DIR} ${WINSDK_OPENGL_INCLUDE_DIR})
|
||||
SET(CMAKE_LIBRARY_PATH ${WINSDK_LIBRARY_DIR} ${CMAKE_LIBRARY_PATH})
|
||||
|
||||
IF(WINSDK_UCRT_INCLUDE_DIR)
|
||||
SET(WINSDK_INCLUDE_DIRS ${WINSDK_INCLUDE_DIRS} ${WINSDK_UCRT_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
|
||||
IF(WINSDK_SHARED_INCLUDE_DIR)
|
||||
SET(WINSDK_INCLUDE_DIRS ${WINSDK_INCLUDE_DIRS} ${WINSDK_SHARED_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
|
||||
SET(WINSDK_INCLUDE_DIRS ${WINSDK_INCLUDE_DIRS} ${WINSDK_INCLUDE_DIR})
|
||||
|
||||
IF(WINSDK_OPENGL_INCLUDE_DIR)
|
||||
SET(WINSDK_INCLUDE_DIRS ${WINSDK_INCLUDE_DIRS} ${WINSDK_OPENGL_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
|
||||
IF(WINSDK_WINRT_INCLUDE_DIR)
|
||||
SET(WINSDK_INCLUDE_DIRS ${WINSDK_INCLUDE_DIRS} ${WINSDK_WINRT_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
|
||||
INCLUDE_DIRECTORIES(${WINSDK_INCLUDE_DIRS}) # TODO: Move this after all other includes somehow...
|
||||
|
||||
IF(WINSDK_UCRT_LIBRARY_DIR)
|
||||
SET(CMAKE_LIBRARY_PATH ${WINSDK_UCRT_LIBRARY_DIR} ${CMAKE_LIBRARY_PATH})
|
||||
ENDIF()
|
||||
|
||||
SET(CMAKE_LIBRARY_PATH ${WINSDK_LIBRARY_DIR} ${CMAKE_LIBRARY_PATH})
|
||||
|
||||
# Fix for using Windows SDK 7.1 with Visual C++ 2012
|
||||
IF(WINSDK_VERSION STREQUAL "7.1" AND MSVC11)
|
||||
ADD_DEFINITIONS(-D_USING_V110_SDK71_)
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "nel/misc/debug.h"
|
||||
#include "nel/misc/stream.h"
|
||||
#include "nel/misc/rgba.h"
|
||||
#include "nel/misc/path.h"
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <string>
|
||||
|
@ -82,8 +83,8 @@ public:
|
|||
// not free
|
||||
_Flags&=~NL3D_CTILE_FREE_FLAG;
|
||||
|
||||
// set filename
|
||||
_BitmapName[bitmapType]=name;
|
||||
// set filename, replacing \\ by / if needed
|
||||
_BitmapName[bitmapType] = NLMISC::CPath::standardizePath(name, false);
|
||||
}
|
||||
|
||||
std::string getFileName (TBitmap bitmapType) const
|
||||
|
|
|
@ -31,36 +31,86 @@ namespace NLMISC
|
|||
class CCmdArgs
|
||||
{
|
||||
public:
|
||||
/// Sets the command line and init _Args variable. You must call this before calling main()
|
||||
void setArgs (int argc, const char **argv);
|
||||
CCmdArgs();
|
||||
|
||||
/// Sets the command line and init _Args variable. You must call this before calling main()
|
||||
void setArgs (const char *args);
|
||||
struct TArg
|
||||
{
|
||||
std::string shortName; // short argument. Eg: o for -o
|
||||
std::string longName; // long argument. Eg: output for --output
|
||||
|
||||
std::string helpName; // name of argument in help. Eg: <output directory>
|
||||
std::string helpDescription; // description of argument in help. Eg: Specifies the directory where to write generated files
|
||||
|
||||
bool found; // all values for this argument
|
||||
std::vector<std::string> values; // all values for this argument
|
||||
};
|
||||
|
||||
typedef std::vector<TArg> TArgs;
|
||||
|
||||
/// Add a TArg structure to arguments list.
|
||||
void addArg(const TArg &arg);
|
||||
|
||||
/// Add an full argument to arguments list.
|
||||
/// shortName is "p" of the argument is -p
|
||||
/// longName is "print" of the argument is --print
|
||||
/// helpName is the name that will be displayed in help if it's a required argument
|
||||
/// helpDescription is the description of the argument that will be displayed in help
|
||||
void addArg(const std::string &shortName, const std::string &longName, const std::string &helpName, const std::string &helpDescription);
|
||||
|
||||
/// Add a required argument to arguments list.
|
||||
/// helpName is the name that will be displayed in help if it's a required argument
|
||||
/// helpDescription is the description of the argument that will be displayed in help
|
||||
void addArg(const std::string &helpName, const std::string &helpDescription);
|
||||
|
||||
/// Parse the command line from main() parameters argc and argv and process default arguments.
|
||||
bool parse(int argc, char **argv);
|
||||
|
||||
/// Parse the command line from a std::string and process default arguments.
|
||||
bool parse(const std::string &args);
|
||||
|
||||
/// Parse the command linefrom a std::vector<std::string> and process default arguments.
|
||||
bool parse(const std::vector<std::string> &args);
|
||||
|
||||
/// Returns arguments of the program pass from the user to the program using parameters (ie: "myprog param1 param2")
|
||||
const NLMISC::CVectorSString &getArgs () const { return _Args; }
|
||||
const TArgs& getArgs() const { return _Args; }
|
||||
|
||||
/// Returns true if the argument if present in the command line (ie: haveArg('p') will return true if -p is in the command line)
|
||||
bool haveArg (char argName) const;
|
||||
/// Returns true if the argument if present in the command line (ie: haveArg("p") will return true if -p is in the command line)
|
||||
bool haveArg(const std::string &argName) const;
|
||||
|
||||
/** Returns the parameter linked to an option
|
||||
* getArg('p') will return toto if -ptoto is in the command line
|
||||
* getArg('p') will return C:\Documents and Settings\toto.tmp if -p"C:\Documents and Settings\toto.tmp" is in the command line
|
||||
* It'll thrown an Exception if the argName is not found
|
||||
/** Returns the parameters linked to an option
|
||||
* getArg("p") will return toto if -ptoto is in the command line
|
||||
* getArg("p") will return C:\Documents and Settings\toto.tmp if -p"C:\Documents and Settings\toto.tmp" is in the command line
|
||||
*/
|
||||
std::string getArg (char argName) const;
|
||||
std::vector<std::string> getArg(const std::string &argName) const;
|
||||
|
||||
/// return true if named long arg is present on the commandline
|
||||
/// eg haveLongArg("toto") returns true if "--toto" or "--toto=xxx" can be found on commandline
|
||||
bool haveLongArg (const char* argName) const;
|
||||
bool haveLongArg(const std::string &argName) const;
|
||||
|
||||
/// returns the value associated with the given named argument
|
||||
/// returns values associated with the given named argument
|
||||
/// both "--toto=xxx" and "--toto xxx" are acceptable
|
||||
/// quotes round arguments are stripped
|
||||
std::string getLongArg (const char* argName) const;
|
||||
std::vector<std::string> getLongArg(const std::string &argName) const;
|
||||
|
||||
/// return true if there are arguments that are required
|
||||
bool needRequiredArg() const;
|
||||
|
||||
/// return true if required or optional args are present on the commandline
|
||||
bool haveRequiredArg() const;
|
||||
|
||||
/// Returns all additional required parameters
|
||||
std::vector<std::string> getRequiredArg() const;
|
||||
|
||||
/// Display help of the program.
|
||||
void displayHelp();
|
||||
|
||||
/// Display version of the program.
|
||||
void displayVersion();
|
||||
protected:
|
||||
std::string _ProgramName;
|
||||
|
||||
/// Array of arguments pass from the command line
|
||||
NLMISC::CVectorSString _Args;
|
||||
TArgs _Args;
|
||||
}; // class CCmdArgs
|
||||
|
||||
}; // NAMESPACE NLMISC
|
||||
|
|
|
@ -360,6 +360,11 @@ sint launchProgramAndWaitForResult (const std::string &programName, const std::s
|
|||
/// This function executes a program and returns output as a string
|
||||
std::string getCommandOutput(const std::string &command);
|
||||
|
||||
/// This function replace all environment variables in a string by their content.
|
||||
/// Environment variables names can use both Windows (%NAME%) and UNIX syntax ($NAME)
|
||||
/// Authorized characters in names are A-Z, a-z, 0-9 and _
|
||||
std::string expandEnvironmentVariables(const std::string &s);
|
||||
|
||||
/// This function kills a program using his pid (on unix, it uses the kill() POSIX function)
|
||||
bool killProgram(uint32 pid);
|
||||
|
||||
|
|
|
@ -497,7 +497,7 @@ public:
|
|||
static void getFileListByName(const std::string &extension, const std::string &name, std::vector<std::string> &filenames);
|
||||
|
||||
/** Create a list of file having the requested string in the path and the requested extension
|
||||
*/
|
||||
*/
|
||||
static void getFileListByPath(const std::string &extension, const std::string &path, std::vector<std::string> &filenames);
|
||||
|
||||
/** Make a path relative to another if possible, else doesn't change it.
|
||||
|
@ -508,18 +508,24 @@ public:
|
|||
static bool makePathRelative (const char *basePath, std::string &relativePath);
|
||||
|
||||
/** Make path absolute
|
||||
* \param relativePath - The relative path
|
||||
* \param directory - the directory to which the path is relative to
|
||||
* returns the absolute path, or empty if something went wrong.
|
||||
*/
|
||||
* \param relativePath - The relative path
|
||||
* \param directory - the directory to which the path is relative to
|
||||
* returns the absolute path, or empty if something went wrong.
|
||||
*/
|
||||
static std::string makePathAbsolute (const std::string &relativePath, const std::string &directory );
|
||||
|
||||
/** Return if a path is absolute or not.
|
||||
* \param path - The path
|
||||
* returns true if path is absolute or false if relative.
|
||||
*/
|
||||
static bool isAbsolutePath (const std::string &path);
|
||||
|
||||
/** If File in this list is added more than one in an addSearchPath, it doesn't launch a warning.
|
||||
*/
|
||||
static void addIgnoredDoubleFile(const std::string &ignoredFile);
|
||||
|
||||
/** For the moment after memoryCompress you cant addsearchpath anymore
|
||||
*/
|
||||
*/
|
||||
static void memoryCompress();
|
||||
|
||||
static void memoryUncompress();
|
||||
|
@ -527,17 +533,17 @@ public:
|
|||
static bool isMemoryCompressed() { return getInstance()->_FileContainer.isMemoryCompressed(); }
|
||||
|
||||
/** Get the ms windows directory (in standardized way with end slash), or returns an empty string on other os
|
||||
*/
|
||||
*/
|
||||
static std::string getWindowsDirectory();
|
||||
|
||||
/** Get application directory.
|
||||
* \return directory where applications should write files.
|
||||
*/
|
||||
* \return directory where applications should write files.
|
||||
*/
|
||||
static std::string getApplicationDirectory(const std::string &appName = "");
|
||||
|
||||
/** Get a temporary directory.
|
||||
* \return temporary directory where applications should write files.
|
||||
*/
|
||||
* \return temporary directory where applications should write files.
|
||||
*/
|
||||
static std::string getTemporaryDirectory();
|
||||
|
||||
// release singleton
|
||||
|
@ -612,7 +618,7 @@ struct CFile
|
|||
* Return the position between [begin,end[ of the last separator between path and filename ('/' or '\').
|
||||
* If there's no separator, it returns string::npos.
|
||||
*/
|
||||
static int getLastSeparator (const std::string &filename);
|
||||
static std::string::size_type getLastSeparator (const std::string &filename);
|
||||
|
||||
static std::string getFilenameWithoutExtension (const std::string &filename);
|
||||
static std::string getExtension (const std::string &filename);
|
||||
|
|
|
@ -477,7 +477,7 @@ uint8 CBitmap::readDDS(NLMISC::IStream &f, uint mipMapSkip)
|
|||
|
||||
uint32 size = 0;
|
||||
f.serial(size); // size in Bytes of header(without "DDS")
|
||||
uint32 * _DDSSurfaceDesc = new uint32[size];
|
||||
uint32 * _DDSSurfaceDesc = new uint32[size];
|
||||
_DDSSurfaceDesc[0]= size;
|
||||
|
||||
#ifdef NL_LITTLE_ENDIAN
|
||||
|
@ -508,6 +508,7 @@ uint8 CBitmap::readDDS(NLMISC::IStream &f, uint mipMapSkip)
|
|||
// If no mipmap.
|
||||
if(_MipMapCount==0)
|
||||
_MipMapCount=1;
|
||||
|
||||
switch (_DDSSurfaceDesc[20])
|
||||
{
|
||||
case DXTC1HEADER:
|
||||
|
@ -2761,7 +2762,6 @@ bool CBitmap::writeTGA( NLMISC::IStream &f, uint32 d, bool upsideDown)
|
|||
|
||||
for(y=0; y<(sint32)height; y++)
|
||||
{
|
||||
|
||||
uint32 k=0;
|
||||
if (PixelFormat == Alpha)
|
||||
{
|
||||
|
@ -3569,7 +3569,7 @@ void CBitmap::loadSize(NLMISC::IStream &f, uint32 &retWidth, uint32 &retHeight)
|
|||
f.serial(imageType);
|
||||
if(imageType!=2 && imageType!=3 && imageType!=10 && imageType!=11)
|
||||
{
|
||||
nlwarning("Invalid TGA format, type %u in not supported (must be 2,3,10 or 11)", imageType);
|
||||
nlwarning("Invalid TGA format, type %u in not supported (must be 2, 3, 10 or 11)", imageType);
|
||||
return;
|
||||
}
|
||||
f.serial(tgaOrigin);
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
// Includes
|
||||
//
|
||||
#include "stdmisc.h"
|
||||
|
||||
#include "nel/misc/types_nl.h"
|
||||
#include "nel/misc/sstring.h"
|
||||
|
||||
#include "nel/misc/cmd_args.h"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_NEW
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
@ -31,114 +31,170 @@
|
|||
namespace NLMISC
|
||||
{
|
||||
|
||||
bool CCmdArgs::haveArg(char argName) const
|
||||
CCmdArgs::CCmdArgs()
|
||||
{
|
||||
for(uint32 i = 0; i < _Args.size(); i++)
|
||||
// add help
|
||||
addArg("h", "help", "", "Display this help");
|
||||
|
||||
// add version
|
||||
addArg("v", "version", "", "Display version of this program");
|
||||
}
|
||||
|
||||
void CCmdArgs::addArg(const TArg &arg)
|
||||
{
|
||||
_Args.push_back(arg);
|
||||
}
|
||||
|
||||
void CCmdArgs::addArg(const std::string &shortName, const std::string &longName, const std::string &helpName, const std::string &helpDescription)
|
||||
{
|
||||
TArg arg;
|
||||
arg.shortName = shortName;
|
||||
arg.longName = longName;
|
||||
arg.helpName = helpName;
|
||||
arg.helpDescription = helpDescription;
|
||||
arg.found = false;
|
||||
|
||||
addArg(arg);
|
||||
}
|
||||
|
||||
void CCmdArgs::addArg(const std::string &helpName, const std::string &helpDescription)
|
||||
{
|
||||
TArg arg;
|
||||
arg.helpName = helpName;
|
||||
arg.helpDescription = helpDescription;
|
||||
arg.found = false;
|
||||
|
||||
addArg(arg);
|
||||
}
|
||||
|
||||
bool CCmdArgs::haveArg(const std::string &argName) const
|
||||
{
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); i)
|
||||
{
|
||||
if(_Args[i].size() >= 2 && _Args[i][0] == '-')
|
||||
{
|
||||
if(_Args[i][1] == argName)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// return true if long arg found
|
||||
if (arg.shortName == argName) return arg.found;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string CCmdArgs::getArg(char argName) const
|
||||
std::vector<std::string> CCmdArgs::getArg(const std::string &argName) const
|
||||
{
|
||||
for(uint32 i = 0; i < _Args.size(); i++)
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
if(_Args[i].size() >= 2 && _Args[i][0] == '-')
|
||||
{
|
||||
if(_Args[i][1] == argName)
|
||||
{
|
||||
/* Remove the first and last '"' :
|
||||
-c"C:\Documents and Settings\toto.tmp"
|
||||
will return :
|
||||
C:\Documents and Settings\toto.tmp
|
||||
*/
|
||||
uint begin = 2;
|
||||
if(_Args[i].size() < 3)
|
||||
return "";
|
||||
//throw Exception ("Parameter '-%c' is malformed, missing content", argName);
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
if(_Args[i][begin] == '"')
|
||||
begin++;
|
||||
|
||||
// End
|
||||
uint size = (uint)_Args[i].size();
|
||||
if(size && _Args[i][size-1] == '"')
|
||||
size--;
|
||||
size = (uint)(std::max((int)0, (int)size-(int)begin));
|
||||
return _Args[i].substr(begin, size);
|
||||
}
|
||||
}
|
||||
// return values if short arg found
|
||||
if (arg.shortName == argName && arg.found) return arg.values;
|
||||
}
|
||||
throw Exception("Parameter '-%c' is not found in command line", argName);
|
||||
|
||||
// return an empty vector
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
bool CCmdArgs::haveLongArg(const char* argName) const
|
||||
bool CCmdArgs::haveLongArg(const std::string &argName) const
|
||||
{
|
||||
for(uint32 i = 0; i < _Args.size(); i++)
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
if(_Args[i].left(2)=="--" && _Args[i].leftCrop(2).splitTo('=')==argName)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// return true if long arg found
|
||||
if (arg.longName == argName) return arg.found;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<std::string> CCmdArgs::getLongArg(const std::string &argName) const
|
||||
{
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// return values if long arg found
|
||||
if (arg.longName == argName && arg.found) return arg.values;
|
||||
}
|
||||
|
||||
// return an empty vector
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
bool CCmdArgs::needRequiredArg() const
|
||||
{
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// they don't have any short or long name, but need a name in help
|
||||
if (arg.shortName.empty() && arg.longName.empty() && !arg.helpName.empty())
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string CCmdArgs::getLongArg (const char* argName) const
|
||||
bool CCmdArgs::haveRequiredArg() const
|
||||
{
|
||||
for (uint32 i = 0; i < _Args.size(); i++)
|
||||
{
|
||||
if (_Args[i].left(2)=="--" && _Args[i].leftCrop(2).splitTo('=')==argName)
|
||||
{
|
||||
NLMISC::CSString val= _Args[i].splitFrom('=');
|
||||
if (!val.empty())
|
||||
{
|
||||
return val.unquoteIfQuoted();
|
||||
}
|
||||
if (i+1<_Args.size() && _Args[i+1].c_str()[0]!='-')
|
||||
{
|
||||
return _Args[i+1].unquoteIfQuoted();
|
||||
}
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
return std::string();
|
||||
}
|
||||
// they don't have any short or long name, but need a name in help
|
||||
if (arg.shortName.empty() && arg.longName.empty() && !arg.helpName.empty())
|
||||
return !arg.values.empty();
|
||||
}
|
||||
return std::string();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CCmdArgs::setArgs(const char *args)
|
||||
std::vector<std::string> CCmdArgs::getRequiredArg() const
|
||||
{
|
||||
_Args.push_back ("<ProgramName>");
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
std::string sargs (args);
|
||||
// they don't have any short or long name, but need a name in help
|
||||
if (arg.shortName.empty() && arg.longName.empty() && !arg.helpName.empty())
|
||||
return arg.values;
|
||||
}
|
||||
|
||||
// return an empty vector
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
bool CCmdArgs::parse(const std::string &args)
|
||||
{
|
||||
std::vector<std::string> argv;
|
||||
std::string::size_type pos1 = 0, pos2 = 0;
|
||||
|
||||
do
|
||||
{
|
||||
// Look for the first non space character
|
||||
pos1 = sargs.find_first_not_of (" ", pos2);
|
||||
pos1 = args.find_first_not_of (" ", pos2);
|
||||
if(pos1 == std::string::npos) break;
|
||||
|
||||
// Look for the first space or "
|
||||
pos2 = sargs.find_first_of (" \"", pos1);
|
||||
pos2 = args.find_first_of (" \"", pos1);
|
||||
if(pos2 != std::string::npos)
|
||||
{
|
||||
// " ?
|
||||
if(sargs[pos2] == '"')
|
||||
if(args[pos2] == '"')
|
||||
{
|
||||
// Look for the final \"
|
||||
pos2 = sargs.find_first_of ("\"", pos2+1);
|
||||
pos2 = args.find_first_of ("\"", pos2+1);
|
||||
if(pos2 != std::string::npos)
|
||||
{
|
||||
// Look for the first space
|
||||
pos2 = sargs.find_first_of (" ", pos2+1);
|
||||
pos2 = args.find_first_of (" ", pos2+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -146,18 +202,277 @@ void CCmdArgs::setArgs(const char *args)
|
|||
// Compute the size of the string to extract
|
||||
std::string::difference_type length = (pos2 != std::string::npos) ? pos2-pos1 : std::string::npos;
|
||||
|
||||
std::string tmp = sargs.substr (pos1, length);
|
||||
_Args.push_back (tmp);
|
||||
std::string tmp = args.substr (pos1, length);
|
||||
argv.push_back (tmp);
|
||||
}
|
||||
while(pos2 != std::string::npos);
|
||||
|
||||
return parse(argv);
|
||||
}
|
||||
|
||||
void CCmdArgs::setArgs(int argc, const char **argv)
|
||||
bool CCmdArgs::parse(int argc, char **argv)
|
||||
{
|
||||
for (sint i = 0; i < argc; i++)
|
||||
// convert C strings to STL strings
|
||||
std::vector<std::string> args;
|
||||
|
||||
for(sint i = 0; i < argc; ++i)
|
||||
{
|
||||
_Args.push_back (argv[i]);
|
||||
args.push_back(argv[i]);
|
||||
}
|
||||
|
||||
return parse(args);
|
||||
}
|
||||
|
||||
bool CCmdArgs::parse(const std::vector<std::string> &argv)
|
||||
{
|
||||
// no parameters
|
||||
if (argv.empty()) return false;
|
||||
|
||||
// first argument is always the program name
|
||||
_ProgramName = CFile::getFilename(argv.front());
|
||||
|
||||
// arguments count
|
||||
uint argc = argv.size();
|
||||
|
||||
// process each argument
|
||||
for (sint i = 1; i < argc; i++)
|
||||
{
|
||||
std::string name = argv[i];
|
||||
|
||||
#ifdef NL_OS_WINDOWS
|
||||
// support / and - under Windows, arguments should be at least 2 characters
|
||||
if (name.size() > 1 && (name[0] == '-' || name[0] == '/'))
|
||||
#else
|
||||
if (name.size() > 1 && name[0] == '-')
|
||||
#endif
|
||||
{
|
||||
// it's a long name if using --
|
||||
bool useLongName = name[0] == '-' && name[1] == '-';
|
||||
|
||||
// extract argument name
|
||||
name = name.substr(useLongName ? 2:1);
|
||||
|
||||
std::string value;
|
||||
|
||||
if (useLongName)
|
||||
{
|
||||
// look if using = to define value
|
||||
std::string::size_type pos = name.find('=');
|
||||
|
||||
if (pos != std::string::npos)
|
||||
{
|
||||
// value is second part, name the first one
|
||||
value = name.substr(pos+1);
|
||||
name = name.substr(0, pos);
|
||||
}
|
||||
}
|
||||
else if (name.length() > 1)
|
||||
{
|
||||
value = name.substr(1);
|
||||
name = name.substr(0, 1);
|
||||
}
|
||||
|
||||
// process each argument definition
|
||||
for(uint j = 0; j < _Args.size(); ++j)
|
||||
{
|
||||
TArg &arg = _Args[j];
|
||||
|
||||
// only process arguments of the right type
|
||||
if ((useLongName && name != arg.longName) || (!useLongName && name != arg.shortName)) continue;
|
||||
|
||||
// argument is found
|
||||
arg.found = true;
|
||||
|
||||
// another argument is required
|
||||
if (!arg.helpName.empty())
|
||||
{
|
||||
// if the value hasn't be specified by =
|
||||
if (value.empty() && i+1 < argc)
|
||||
{
|
||||
// take next argument
|
||||
value = argv[++i];
|
||||
}
|
||||
|
||||
// add argument value if not empty
|
||||
if (!value.empty())
|
||||
{
|
||||
arg.values.push_back(value);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// process each argument definition
|
||||
for(uint j = 0, len = _Args.size(); j < len; ++j)
|
||||
{
|
||||
TArg &arg = _Args[j];
|
||||
|
||||
// only process arguments that don't have a name
|
||||
if (!arg.shortName.empty() || !arg.longName.empty()) continue;
|
||||
|
||||
// in fact, if there are more than one required arguments, all arguments are added in first one to simplify
|
||||
arg.values.push_back(name);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// process version
|
||||
if (haveLongArg("version"))
|
||||
{
|
||||
displayVersion();
|
||||
return false;
|
||||
}
|
||||
|
||||
// process help if requested or if required arguments are missing
|
||||
if (haveLongArg("help") || (needRequiredArg() && !haveRequiredArg()))
|
||||
{
|
||||
displayHelp();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCmdArgs::displayHelp()
|
||||
{
|
||||
// display program name
|
||||
printf("Usage: %s ", _ProgramName.c_str());
|
||||
|
||||
// display optional parameters
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// only short argument is displayed
|
||||
if (!arg.shortName.empty())
|
||||
{
|
||||
printf("[-%s", arg.shortName.c_str());
|
||||
|
||||
// a parameter is required
|
||||
if (!arg.helpName.empty())
|
||||
{
|
||||
printf("<%s>", arg.helpName.c_str());
|
||||
}
|
||||
|
||||
printf("]");
|
||||
}
|
||||
}
|
||||
|
||||
sint last = -1;
|
||||
|
||||
// look for last required argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
if (_Args[i].shortName.empty()) last = (sint)i;
|
||||
}
|
||||
|
||||
// display required arguments
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// they don't have any short or long name, but need a name in help
|
||||
if (arg.shortName.empty() && arg.longName.empty() && !arg.helpName.empty())
|
||||
{
|
||||
printf(" <%s>", arg.helpName.c_str());
|
||||
|
||||
// if last argument, it can support additional arguments
|
||||
if ((sint)i == last)
|
||||
{
|
||||
printf(" [%s...]", arg.helpName.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
// display details on each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// not an optional argument
|
||||
if (arg.shortName.empty() && arg.longName.empty()) continue;
|
||||
|
||||
// a tab
|
||||
printf("\t");
|
||||
|
||||
// display short argument
|
||||
if (!arg.shortName.empty())
|
||||
{
|
||||
printf("-%s", arg.shortName.c_str());
|
||||
|
||||
// and it's required argument
|
||||
if (!arg.helpName.empty())
|
||||
{
|
||||
printf(" <%s>", arg.helpName.c_str());
|
||||
printf(" or -%s<%s>", arg.shortName.c_str(), arg.helpName.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// display long argument
|
||||
if (!arg.longName.empty())
|
||||
{
|
||||
if (!arg.helpName.empty())
|
||||
{
|
||||
// prepend a coma if a short argument was already displayed
|
||||
if (!arg.shortName.empty())
|
||||
{
|
||||
printf(", ");
|
||||
}
|
||||
|
||||
// display first syntax for long argument, --arg <value>
|
||||
printf("--%s <%s>", arg.longName.c_str(), arg.helpName.c_str());
|
||||
}
|
||||
|
||||
// prepend " or " if 3 formats for argument
|
||||
if (!arg.shortName.empty() || !arg.helpName.empty())
|
||||
{
|
||||
printf(" or ");
|
||||
}
|
||||
|
||||
// display second syntax for long argument, --arg=<value>
|
||||
printf("--%s", arg.longName.c_str());
|
||||
|
||||
if (!arg.helpName.empty())
|
||||
{
|
||||
printf("=<%s>", arg.helpName.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// display argument description
|
||||
if (!arg.helpDescription.empty())
|
||||
{
|
||||
printf(" : %s", arg.helpDescription.c_str());
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
// process each argument
|
||||
for(uint i = 0; i < _Args.size(); ++i)
|
||||
{
|
||||
const TArg &arg = _Args[i];
|
||||
|
||||
// only display required arguments
|
||||
if (arg.shortName.empty() && arg.longName.empty() && !arg.helpName.empty() && !arg.helpDescription.empty())
|
||||
{
|
||||
printf("\t%s : %s\n", arg.helpName.c_str(), arg.helpDescription.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCmdArgs::displayVersion()
|
||||
{
|
||||
// display a verbose version string
|
||||
#ifdef BUILD_DATE
|
||||
printf("%s %s (built on %s)\nCopyright (C) %s\n", _ProgramName.c_str(), NL_VERSION, BUILD_DATE, COPYRIGHT);
|
||||
#endif
|
||||
}
|
||||
|
||||
}; // NAMESPACE NLMISC
|
||||
|
|
|
@ -913,6 +913,80 @@ std::string getCommandOutput(const std::string &command)
|
|||
return result;
|
||||
}
|
||||
|
||||
std::string expandEnvironmentVariables(const std::string &s)
|
||||
{
|
||||
size_t len = s.length();
|
||||
std::string ret;
|
||||
|
||||
std::string::size_type pos1 = 0, pos2 = 0;
|
||||
|
||||
// look for environement variables delimiters
|
||||
while(pos2 < len && (pos1 = s.find_first_of("%$", pos2)) != std::string::npos)
|
||||
{
|
||||
// copy string unprocessed part
|
||||
ret += s.substr(pos2, pos1-pos2);
|
||||
|
||||
// extract a valid variable name (a-zA-Z0-9_)
|
||||
pos2 = pos1+1;
|
||||
|
||||
while(pos2 < len && (isalnum(s[pos2]) || s[pos2] == '_')) ++pos2;
|
||||
|
||||
// check if variable name is empty
|
||||
bool found = pos2 > pos1+1;
|
||||
|
||||
std::string name;
|
||||
|
||||
if (found)
|
||||
{
|
||||
// found at least 1 character
|
||||
name = s.substr(pos1+1, pos2-pos1-1);
|
||||
}
|
||||
|
||||
// Windows format needs a trailing % delimiter
|
||||
if (found && s[pos1] == '%')
|
||||
{
|
||||
if (pos2 >= len || s[pos2] != '%')
|
||||
{
|
||||
// not a variable name, because no trailing %
|
||||
found = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// found a trailing %, next character to check
|
||||
++pos2;
|
||||
}
|
||||
}
|
||||
|
||||
// get variable value if name found
|
||||
if (found)
|
||||
{
|
||||
const char *value = getenv(name.c_str());
|
||||
|
||||
if (value)
|
||||
{
|
||||
// value found
|
||||
ret += std::string(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
// value not found
|
||||
found = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
// variable or value not found, don't evaluate variable
|
||||
ret += s.substr(pos1, pos2-pos1);
|
||||
}
|
||||
}
|
||||
|
||||
// copy last unprocessed part
|
||||
ret += s.substr(pos2);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the bits (with 0 and 1) composing a byte (from right to left)
|
||||
*/
|
||||
|
|
|
@ -1854,7 +1854,7 @@ std::string CFileContainer::getTemporaryDirectory()
|
|||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int CFile::getLastSeparator (const string &filename)
|
||||
std::string::size_type CFile::getLastSeparator (const string &filename)
|
||||
{
|
||||
string::size_type pos = filename.find_last_of ('/');
|
||||
if (pos == string::npos)
|
||||
|
@ -1865,7 +1865,7 @@ int CFile::getLastSeparator (const string &filename)
|
|||
pos = filename.find_last_of ('@');
|
||||
}
|
||||
}
|
||||
return (int)pos;
|
||||
return pos;
|
||||
}
|
||||
|
||||
string CFile::getFilename (const string &filename)
|
||||
|
@ -2597,6 +2597,25 @@ std::string CPath::makePathAbsolute( const std::string &relativePath, const std:
|
|||
return npath;
|
||||
}
|
||||
|
||||
bool CPath::isAbsolutePath(const std::string &path)
|
||||
{
|
||||
if (path.empty()) return false;
|
||||
|
||||
#ifdef NL_OS_WINDOWS
|
||||
// Windows root of current disk. Eg.: "\" or
|
||||
// Windows network address. Eg.: \\someshare\path
|
||||
if (path[0] == '\\') return true;
|
||||
|
||||
// Normal Windows absolute path. Eg.: C:\something
|
||||
if (path.length() > 2 && isalpha(path[0]) && (path[1] == ':' ) && ((path[2] == '\\') || (path[2] == '/' ))) return true;
|
||||
#endif
|
||||
|
||||
// Unix filesystem absolute path (works also under Windows)
|
||||
if (path[0] == '/') return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CFile::setRWAccess(const std::string &filename)
|
||||
{
|
||||
#ifdef NL_OS_WINDOWS
|
||||
|
|
|
@ -1169,7 +1169,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName,
|
|||
{
|
||||
for (uint i = 0; i < var->size(); i++)
|
||||
{
|
||||
CPath::addSearchPath (var->asString(i), true, false);
|
||||
CPath::addSearchPath (NLMISC::expandEnvironmentVariables(var->asString(i)), true, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1177,7 +1177,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName,
|
|||
{
|
||||
for (uint i = 0; i < var->size(); i++)
|
||||
{
|
||||
CPath::addSearchPath (var->asString(i), false, false);
|
||||
CPath::addSearchPath (NLMISC::expandEnvironmentVariables(var->asString(i)), false, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,16 +50,6 @@ bool recompute (const char* f1, const char* f2)
|
|||
return buf1.st_mtime > buf2.st_mtime;
|
||||
}
|
||||
|
||||
// Return true if the file exist
|
||||
bool isFileExist (const char* sName)
|
||||
{
|
||||
FILE *pFile=fopen (sName, "rb");
|
||||
if (!pFile)
|
||||
return false;
|
||||
fclose (pFile);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Fill tile far pixel with this bitmap
|
||||
bool fillTileFar (uint tile, const char* sName, CTileFarBank::TFarType type, CTileFarBank& farBank, bool _256, uint8 rotate)
|
||||
{
|
||||
|
@ -90,7 +80,7 @@ bool fillTileFar (uint tile, const char* sName, CTileFarBank::TFarType type, CTi
|
|||
// Get bitmap size
|
||||
uint width=bitmap.getWidth();
|
||||
uint height=bitmap.getHeight();
|
||||
|
||||
|
||||
|
||||
// Check size..
|
||||
if ((!((_256&&(width==256)&&(height==256))||((!_256)&&(width==128)&&(height==128)))))
|
||||
|
@ -163,8 +153,6 @@ int main (int argc, char **argv)
|
|||
outputVersion=true;
|
||||
if (strcmp (argv[n], "-?")==0)
|
||||
outputHelp=true;
|
||||
if (strcmp (argv[n], "-?")==0)
|
||||
outputHelp=true;
|
||||
if (strncmp (argv[n], "-d", 2)==0)
|
||||
{
|
||||
rootDir = argv[n];
|
||||
|
@ -192,7 +180,6 @@ int main (int argc, char **argv)
|
|||
"\t-d#: change the root directory of the small bank. # is the new directory\n"
|
||||
"\t-p#: postfix tiles filename by #\n"
|
||||
"\t-r: load the bitmaps from the current directory\n"
|
||||
"\t-r: load the bitmaps from the current directory\n"
|
||||
"\t-f: force recomputation of all the tiles\n"
|
||||
"\t-v: print the version\n"
|
||||
"\t-?: print help\n"
|
||||
|
@ -223,7 +210,7 @@ int main (int argc, char **argv)
|
|||
// Serial the bank in input
|
||||
farBank.serial (inputFarBank);
|
||||
}
|
||||
|
||||
|
||||
// Force recomputation ?
|
||||
if (recompute (argv[1], argv[2]))
|
||||
{
|
||||
|
@ -287,8 +274,8 @@ int main (int argc, char **argv)
|
|||
if (pTile->getRelativeFileName (CTile::diffuse)!="")
|
||||
{
|
||||
// File exist ?
|
||||
string tileFilename = bank.getAbsPath()+pTile->getRelativeFileName (CTile::diffuse);
|
||||
if (isFileExist (tileFilename.c_str()))
|
||||
string tileFilename = bank.getAbsPath()+CPath::standardizePath(pTile->getRelativeFileName (CTile::diffuse), false);
|
||||
if (CFile::fileExists(tileFilename))
|
||||
{
|
||||
// Recompute it?
|
||||
if (recompute (tileFilename.c_str(), argv[2])||forceRecomputation)
|
||||
|
@ -307,7 +294,7 @@ int main (int argc, char **argv)
|
|||
{
|
||||
// One more tile
|
||||
tileCount++;
|
||||
|
||||
|
||||
printf ("Skipping %s...\n", tileFilename.c_str());
|
||||
bDeleteDiffuse=false;
|
||||
}
|
||||
|
@ -318,8 +305,8 @@ int main (int argc, char **argv)
|
|||
if (pTile->getRelativeFileName (CTile::additive)!="")
|
||||
{
|
||||
// File exist ?
|
||||
string tileFilename = bank.getAbsPath()+pTile->getRelativeFileName (CTile::additive);
|
||||
if (isFileExist (tileFilename.c_str()))
|
||||
string tileFilename = bank.getAbsPath()+CPath::standardizePath(pTile->getRelativeFileName (CTile::additive), false);
|
||||
if (CFile::fileExists(tileFilename))
|
||||
{
|
||||
// Recompute it?
|
||||
if (recompute (tileFilename.c_str(), argv[2])||forceRecomputation)
|
||||
|
@ -349,8 +336,8 @@ int main (int argc, char **argv)
|
|||
if (pTile->getRelativeFileName (CTile::alpha)!="")
|
||||
{
|
||||
// File exist ?
|
||||
string tileFilename = bank.getAbsPath()+pTile->getRelativeFileName (CTile::alpha);
|
||||
if (isFileExist (tileFilename.c_str()))
|
||||
string tileFilename = bank.getAbsPath()+CPath::standardizePath(pTile->getRelativeFileName (CTile::alpha), false);
|
||||
if (CFile::fileExists(tileFilename))
|
||||
{
|
||||
// Recompute it?
|
||||
if (recompute (tileFilename.c_str(), argv[2])||forceRecomputation)
|
||||
|
@ -418,7 +405,7 @@ int main (int argc, char **argv)
|
|||
{
|
||||
nlwarning ("ERROR Can't open file %s for reading\n", argv[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// exit
|
||||
return 0;
|
||||
|
|
|
@ -24,54 +24,63 @@
|
|||
#include <nel/3d/register_3d.h>
|
||||
#include <nel/3d/scene.h>
|
||||
|
||||
int printHelp(const NLMISC::CCmdArgs &args)
|
||||
{
|
||||
printf("NeL Mesh Export\n");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
NLMISC::CApplicationContext app;
|
||||
|
||||
NLMISC::CCmdArgs args;
|
||||
args.setArgs(argc, (const char **)argv);
|
||||
|
||||
if (args.getArgs().size() == 1
|
||||
|| args.haveArg('h')
|
||||
|| args.haveLongArg("help"))
|
||||
return printHelp(args);
|
||||
args.addArg("d", "dst", "destination", "Destination directory path");
|
||||
args.addArg("", "dependlog", "log", "Dependencies log path");
|
||||
args.addArg("", "errorlog", "log", "Errors log path");
|
||||
args.addArg("filename", "Filename of 3D model to convert");
|
||||
|
||||
const NLMISC::CSString &filePath = args.getArgs().back();
|
||||
if (!NLMISC::CFile::fileExists(filePath))
|
||||
{
|
||||
printHelp(args);
|
||||
nlerror("File '%s' does not exist", filePath.c_str());
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
if (!args.parse(argc, argv)) return EXIT_SUCCESS;
|
||||
|
||||
CMeshUtilsSettings settings;
|
||||
settings.SourceFilePath = filePath;
|
||||
|
||||
if (args.haveArg('d'))
|
||||
settings.DestinationDirectoryPath = args.getArg('d');
|
||||
if (settings.DestinationDirectoryPath.empty())
|
||||
settings.DestinationDirectoryPath = args.getLongArg("dst");
|
||||
if (settings.DestinationDirectoryPath.empty())
|
||||
settings.DestinationDirectoryPath = filePath + "_export";
|
||||
settings.DestinationDirectoryPath += "/";
|
||||
|
||||
settings.ToolDependLog = args.getLongArg("dependlog");
|
||||
if (settings.ToolDependLog.empty())
|
||||
settings.ToolDependLog = settings.DestinationDirectoryPath + "depend.log";
|
||||
settings.ToolErrorLog = args.getLongArg("errorlog");
|
||||
if (settings.ToolErrorLog.empty())
|
||||
settings.ToolErrorLog = settings.DestinationDirectoryPath + "error.log";
|
||||
const std::vector<std::string> &filePathes = args.getRequiredArg();
|
||||
|
||||
NL3D::CScene::registerBasics();
|
||||
NL3D::registerSerial3d();
|
||||
|
||||
return exportScene(settings);
|
||||
sint res = 0;
|
||||
|
||||
for(uint i = 0; i < filePathes.size(); ++i)
|
||||
{
|
||||
std::string filePath = filePathes[i];
|
||||
|
||||
if (!NLMISC::CFile::fileExists(filePath))
|
||||
{
|
||||
nlerror("File '%s' does not exist", filePath.c_str());
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
CMeshUtilsSettings settings;
|
||||
settings.SourceFilePath = filePath;
|
||||
|
||||
if (args.haveArg("d"))
|
||||
settings.DestinationDirectoryPath = args.getArg("d").front();
|
||||
|
||||
if (settings.DestinationDirectoryPath.empty())
|
||||
settings.DestinationDirectoryPath = filePath + "_export";
|
||||
|
||||
settings.DestinationDirectoryPath = NLMISC::CPath::standardizePath(settings.DestinationDirectoryPath);
|
||||
|
||||
if (args.haveLongArg("dependlog"))
|
||||
settings.ToolDependLog = args.getLongArg("dependlog").front();
|
||||
|
||||
if (settings.ToolDependLog.empty())
|
||||
settings.ToolDependLog = settings.DestinationDirectoryPath + "depend.log";
|
||||
|
||||
if (args.haveLongArg("errorlog"))
|
||||
settings.ToolErrorLog = args.getLongArg("errorlog").front();
|
||||
|
||||
if (settings.ToolErrorLog.empty())
|
||||
settings.ToolErrorLog = settings.DestinationDirectoryPath + "error.log";
|
||||
|
||||
res = exportScene(settings);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/* end of file */
|
||||
|
|
|
@ -86,11 +86,10 @@ namespace NL3D
|
|||
|
||||
class CEntitySheet;
|
||||
class CEntityCL;
|
||||
class CAttackInfo;
|
||||
|
||||
class CItemSheet;
|
||||
|
||||
class CPhysicalDamage;
|
||||
|
||||
namespace NLMISC{
|
||||
class CCDBNodeLeaf;
|
||||
class CCDBNodeBranch;
|
||||
|
@ -586,7 +585,7 @@ public:
|
|||
virtual void impact(uint /* impactType */, uint /* type */, uint /* id */, uint /* intensity */) {}
|
||||
/** Try to play a melee impact on this entity.
|
||||
*/
|
||||
virtual void meleeImpact(const CPhysicalDamage &/* damage */) {}
|
||||
virtual void meleeImpact(const CAttackInfo &/* attack */) {}
|
||||
/** Play the magic impact on the entity
|
||||
* \param type : type of the impact (host/good/neutral).
|
||||
* \param intensity : intensity of the impact.
|
||||
|
|
|
@ -616,6 +616,63 @@ void initStereoDisplayDevice()
|
|||
IStereoDisplay::releaseUnusedLibraries();
|
||||
}
|
||||
|
||||
static void addPaths(IProgressCallback &progress, const std::vector<std::string> &paths, bool recurse)
|
||||
{
|
||||
// all prefixes for paths
|
||||
std::vector<std::string> directoryPrefixes;
|
||||
|
||||
// current directory has priority everywhere
|
||||
directoryPrefixes.push_back("");
|
||||
|
||||
#if defined(NL_OS_WINDOWS)
|
||||
char path[MAX_PATH];
|
||||
GetModuleFileNameA(GetModuleHandleA(NULL), path, MAX_PATH);
|
||||
|
||||
// check in same directory as executable
|
||||
directoryPrefixes.push_back(CPath::standardizePath(CFile::getPath(path)));
|
||||
#elif defined(NL_OS_MAC)
|
||||
// check in bundle (Installer)
|
||||
directoryPrefixes.push_back(CPath::standardizePath(getAppBundlePath() + "/Contents/Resources"));
|
||||
|
||||
// check in same directory as bundle (Steam)
|
||||
directoryPrefixes.push_back(CPath::standardizePath(getAppBundlePath() + "/.."));
|
||||
#elif defined(NL_OS_UNIX)
|
||||
if (CFile::isDirectory(getRyzomSharePrefix())) directoryPrefixes.push_back(CPath::standardizePath(getRyzomSharePrefix()));
|
||||
#endif
|
||||
|
||||
float total = (float)(directoryPrefixes.size() * paths.size());
|
||||
float current = 0.f, next = 0.f;
|
||||
|
||||
for (uint j = 0; j < directoryPrefixes.size(); j++)
|
||||
{
|
||||
std::string directoryPrefix = directoryPrefixes[j];
|
||||
|
||||
for (uint i = 0; i < paths.size(); i++)
|
||||
{
|
||||
std::string directory = NLMISC::expandEnvironmentVariables(paths[i]);
|
||||
|
||||
// only prepend default directory if path is relative
|
||||
if (!directory.empty() && !directoryPrefix.empty() && !CPath::isAbsolutePath(directory))
|
||||
{
|
||||
directory = directoryPrefix + directory;
|
||||
}
|
||||
|
||||
// update next progress value
|
||||
next += 1.f;
|
||||
|
||||
progress.progress (current/total);
|
||||
progress.pushCropedValues (current/total, next/total);
|
||||
|
||||
// next is current value
|
||||
current = next;
|
||||
|
||||
CPath::addSearchPath(directory, recurse, false, &progress);
|
||||
|
||||
progress.popCropedValues ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void addSearchPaths(IProgressCallback &progress)
|
||||
{
|
||||
// Add search path of UI addon. Allow only a subset of files.
|
||||
|
@ -625,54 +682,13 @@ void addSearchPaths(IProgressCallback &progress)
|
|||
// Add Standard search paths
|
||||
{
|
||||
H_AUTO(InitRZAddSearchPath2)
|
||||
for (uint i = 0; i < ClientCfg.DataPath.size(); i++)
|
||||
{
|
||||
progress.progress ((float)i/(float)ClientCfg.DataPath.size());
|
||||
progress.pushCropedValues ((float)i/(float)ClientCfg.DataPath.size(), (float)(i+1)/(float)ClientCfg.DataPath.size());
|
||||
|
||||
CPath::addSearchPath(ClientCfg.DataPath[i], true, false, &progress);
|
||||
|
||||
progress.popCropedValues ();
|
||||
}
|
||||
addPaths(progress, ClientCfg.DataPath, true);
|
||||
|
||||
CPath::loadRemappedFiles("remap_files.csv");
|
||||
}
|
||||
|
||||
for (uint i = 0; i < ClientCfg.DataPathNoRecurse.size(); i++)
|
||||
{
|
||||
progress.progress ((float)i/(float)ClientCfg.DataPathNoRecurse.size());
|
||||
progress.pushCropedValues ((float)i/(float)ClientCfg.DataPathNoRecurse.size(), (float)(i+1)/(float)ClientCfg.DataPathNoRecurse.size());
|
||||
|
||||
CPath::addSearchPath(ClientCfg.DataPathNoRecurse[i], false, false, &progress);
|
||||
|
||||
progress.popCropedValues ();
|
||||
}
|
||||
|
||||
std::string defaultDirectory;
|
||||
|
||||
#ifdef NL_OS_MAC
|
||||
defaultDirectory = CPath::standardizePath(getAppBundlePath() + "/Contents/Resources");
|
||||
#elif defined(NL_OS_UNIX)
|
||||
if (CFile::isDirectory(getRyzomSharePrefix())) defaultDirectory = CPath::standardizePath(getRyzomSharePrefix());
|
||||
#endif
|
||||
|
||||
// add in last position, a specific possibly read only directory
|
||||
if (!defaultDirectory.empty())
|
||||
{
|
||||
for (uint i = 0; i < ClientCfg.DataPath.size(); i++)
|
||||
{
|
||||
// don't prepend default directory if path is absolute
|
||||
if (!ClientCfg.DataPath[i].empty() && ClientCfg.DataPath[i][0] != '/')
|
||||
{
|
||||
progress.progress ((float)i/(float)ClientCfg.DataPath.size());
|
||||
progress.pushCropedValues ((float)i/(float)ClientCfg.DataPath.size(), (float)(i+1)/(float)ClientCfg.DataPath.size());
|
||||
|
||||
CPath::addSearchPath(defaultDirectory + ClientCfg.DataPath[i], true, false, &progress);
|
||||
|
||||
progress.popCropedValues ();
|
||||
}
|
||||
}
|
||||
}
|
||||
addPaths(progress, ClientCfg.DataPathNoRecurse, false);
|
||||
}
|
||||
|
||||
void addPreDataPaths(NLMISC::IProgressCallback &progress)
|
||||
|
@ -681,43 +697,9 @@ void addPreDataPaths(NLMISC::IProgressCallback &progress)
|
|||
|
||||
H_AUTO(InitRZAddSearchPaths);
|
||||
|
||||
for (uint i = 0; i < ClientCfg.PreDataPath.size(); i++)
|
||||
{
|
||||
progress.progress ((float)i/(float)ClientCfg.PreDataPath.size());
|
||||
progress.pushCropedValues ((float)i/(float)ClientCfg.PreDataPath.size(), (float)(i+1)/(float)ClientCfg.PreDataPath.size());
|
||||
|
||||
CPath::addSearchPath(ClientCfg.PreDataPath[i], true, false, &progress);
|
||||
|
||||
progress.popCropedValues ();
|
||||
}
|
||||
addPaths(progress, ClientCfg.PreDataPath, true);
|
||||
|
||||
//nlinfo ("PROFILE: %d seconds for Add search paths Predata", (uint32)(ryzomGetLocalTime ()-initPaths)/1000);
|
||||
|
||||
std::string defaultDirectory;
|
||||
|
||||
#ifdef NL_OS_MAC
|
||||
defaultDirectory = CPath::standardizePath(getAppBundlePath() + "/Contents/Resources");
|
||||
#elif defined(NL_OS_UNIX)
|
||||
if (CFile::isDirectory(getRyzomSharePrefix())) defaultDirectory = CPath::standardizePath(getRyzomSharePrefix());
|
||||
#endif
|
||||
|
||||
// add in last position, a specific possibly read only directory
|
||||
if (!defaultDirectory.empty())
|
||||
{
|
||||
for (uint i = 0; i < ClientCfg.PreDataPath.size(); i++)
|
||||
{
|
||||
// don't prepend default directory if path is absolute
|
||||
if (!ClientCfg.PreDataPath[i].empty() && ClientCfg.PreDataPath[i][0] != '/')
|
||||
{
|
||||
progress.progress ((float)i/(float)ClientCfg.PreDataPath.size());
|
||||
progress.pushCropedValues ((float)i/(float)ClientCfg.PreDataPath.size(), (float)(i+1)/(float)ClientCfg.PreDataPath.size());
|
||||
|
||||
CPath::addSearchPath(defaultDirectory + ClientCfg.PreDataPath[i], true, false, &progress);
|
||||
|
||||
progress.popCropedValues ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void addPackedSheetUpdatePaths(NLMISC::IProgressCallback &progress)
|
||||
|
@ -726,7 +708,7 @@ static void addPackedSheetUpdatePaths(NLMISC::IProgressCallback &progress)
|
|||
{
|
||||
progress.progress((float)i/(float)ClientCfg.UpdatePackedSheetPath.size());
|
||||
progress.pushCropedValues ((float)i/(float)ClientCfg.UpdatePackedSheetPath.size(), (float)(i+1)/(float)ClientCfg.UpdatePackedSheetPath.size());
|
||||
CPath::addSearchPath(ClientCfg.UpdatePackedSheetPath[i], true, false, &progress);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(ClientCfg.UpdatePackedSheetPath[i]), true, false, &progress);
|
||||
progress.popCropedValues();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -94,70 +94,59 @@ void CVisualSlotManager::init()
|
|||
f.close();
|
||||
|
||||
// Display elements read.
|
||||
// for(uint i=0; i<_VisualSlot.size(); ++i)
|
||||
// {
|
||||
for(uint i=0, len = _VisualSlot.size(); i<len; ++i)
|
||||
{
|
||||
_VisualSlot[i].updateMaps();
|
||||
// for(uint j=0; j<_VisualSlot[i].Element.size(); ++j)
|
||||
// nlinfo("Visu: %d Num: %d Id: %d sheet: %s", i, _VisualSlot[i].Element[j].Index, _VisualSlot[i].Element[j].SheetId.asInt(), _VisualSlot[i].Element[j].SheetId.toString().c_str());
|
||||
// }
|
||||
}
|
||||
}
|
||||
else
|
||||
nlwarning("VSMngr:load: cannot open the file '%s'.", filename.c_str());
|
||||
}// init //
|
||||
|
||||
void CVisualSlotManager::TElementList::updateMaps()
|
||||
{
|
||||
SheetIdToIndexMap.clear();
|
||||
|
||||
for(uint i=0, len = Element.size(); i<len; ++i)
|
||||
{
|
||||
const TElement &e = Element[i];
|
||||
SheetIdToIndexMap[e.SheetId] = e.Index;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------
|
||||
// rightItem2Index :
|
||||
// Return the visual slot index from a sheet Id for items in right hand.
|
||||
// \todo GUIGUI : Use map for faster search for example
|
||||
//-----------------------------------------------
|
||||
uint32 CVisualSlotManager::rightItem2Index(const NLMISC::CSheetId &id)
|
||||
{
|
||||
if(SLOTTYPE::RIGHT_HAND_SLOT < _VisualSlot.size())
|
||||
{
|
||||
for(uint i=0; i<_VisualSlot[SLOTTYPE::RIGHT_HAND_SLOT].Element.size(); ++i)
|
||||
if(_VisualSlot[SLOTTYPE::RIGHT_HAND_SLOT].Element[i].SheetId == id)
|
||||
return _VisualSlot[SLOTTYPE::RIGHT_HAND_SLOT].Element[i].Index;
|
||||
}
|
||||
else
|
||||
nlwarning("VSMngr:rightItem2Index: Bad slot -> you probably need to rebuild the tab.");
|
||||
|
||||
// No Item
|
||||
return 0;
|
||||
return sheet2Index(id, SLOTTYPE::RIGHT_HAND_SLOT);
|
||||
}// rightItem2Index //
|
||||
|
||||
|
||||
//-----------------------------------------------
|
||||
// leftItem2Index :
|
||||
// Return the visual slot index from a sheet Id for items in left hand.
|
||||
// \todo GUIGUI : Use map for faster search for example
|
||||
//-----------------------------------------------
|
||||
uint32 CVisualSlotManager::leftItem2Index(const NLMISC::CSheetId &id)
|
||||
{
|
||||
if(SLOTTYPE::LEFT_HAND_SLOT < _VisualSlot.size())
|
||||
{
|
||||
for(uint i=0; i<_VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element.size(); ++i)
|
||||
if(_VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element[i].SheetId == id)
|
||||
return _VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element[i].Index;
|
||||
}
|
||||
else
|
||||
nlwarning("VSMngr:leftItem2Index: Bad slot -> you probably need to rebuild the tab.");
|
||||
|
||||
// No Item
|
||||
return 0;
|
||||
return sheet2Index(id, SLOTTYPE::LEFT_HAND_SLOT);
|
||||
}// leftItem2Index //
|
||||
|
||||
|
||||
//-----------------------------------------------
|
||||
// sheet2Index :
|
||||
// Return the visual index from a sheet Id and the visual slot.
|
||||
// \todo GUIGUI : Use map for faster search for example
|
||||
//-----------------------------------------------
|
||||
uint32 CVisualSlotManager::sheet2Index(const NLMISC::CSheetId &id, SLOTTYPE::EVisualSlot slot)
|
||||
{
|
||||
if((uint)slot < _VisualSlot.size())
|
||||
{
|
||||
for(uint i=0; i<_VisualSlot[slot].Element.size(); ++i)
|
||||
if(_VisualSlot[slot].Element[i].SheetId == id)
|
||||
return _VisualSlot[slot].Element[i].Index;
|
||||
const TElementList &el = _VisualSlot[slot];
|
||||
TElementList::SheetIdToIndexMapType::const_iterator it = el.SheetIdToIndexMap.find(id);
|
||||
if (it != el.SheetIdToIndexMap.end()) return it->second;
|
||||
}
|
||||
else
|
||||
nlwarning("VSMngr:sheet2Index: Bad slot '%d' -> you probably need to rebuild the tab.", (sint)slot);
|
||||
|
|
|
@ -71,11 +71,17 @@ public:
|
|||
// elements list for a visual slot.
|
||||
std::vector<TElement> Element;
|
||||
|
||||
// std::map to increase access speed
|
||||
typedef std::map<NLMISC::CSheetId, uint32> SheetIdToIndexMapType;
|
||||
SheetIdToIndexMapType SheetIdToIndexMap;
|
||||
|
||||
/// Load/Save the values using the serial system
|
||||
void serial(class NLMISC::IStream &s) throw(NLMISC::EStream)
|
||||
{
|
||||
s.serialCont(Element);
|
||||
}
|
||||
|
||||
void updateMaps();
|
||||
} TElementList;
|
||||
|
||||
typedef std::vector <TElementList> TVisualSlot;
|
||||
|
|
|
@ -906,7 +906,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName)
|
|||
{
|
||||
addSearchPath=true;
|
||||
for (uint32 i=0;i<varPtr->size();++i)
|
||||
CPath::addSearchPath(varPtr->asString(i).c_str(), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false);
|
||||
}
|
||||
loadForm2("aiaction", writeFilesDirectoryName+AISPackedActionSheetsFilename, _ActionSheets, true);
|
||||
}
|
||||
|
@ -918,7 +918,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName)
|
|||
{
|
||||
addSearchPath=true;
|
||||
for (uint32 i=0;i<varPtr->size();++i)
|
||||
CPath::addSearchPath(varPtr->asString(i).c_str(), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false);
|
||||
}
|
||||
loadForm("actionlist", writeFilesDirectoryName+AISPackedFightConfigSheetsFilename, _ActionListSheets, true);
|
||||
}
|
||||
|
@ -931,7 +931,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName)
|
|||
{
|
||||
addSearchPath=true;
|
||||
for (uint32 i=0;i<varPtr->size();++i)
|
||||
CPath::addSearchPath(varPtr->asString(i).c_str(), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false);
|
||||
}
|
||||
loadForm2("creature", writeFilesDirectoryName+AISPackedSheetsFilename, _Sheets, true);
|
||||
}
|
||||
|
@ -943,7 +943,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName)
|
|||
{
|
||||
addSearchPath=true;
|
||||
for (uint32 i=0;i<varPtr->size();++i)
|
||||
CPath::addSearchPath(varPtr->asString(i).c_str(), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false);
|
||||
}
|
||||
loadForm2("race_stats", writeFilesDirectoryName+AISPackedRaceStatsSheetsFilename, _RaceStatsSheets, true);
|
||||
}
|
||||
|
|
|
@ -83,7 +83,10 @@ CClientConfigDialog::CClientConfigDialog( QWidget *parent ) :
|
|||
CategoryStackedWidget->addWidget( new CSoundSettingsWidget( CategoryStackedWidget ) );
|
||||
CategoryStackedWidget->addWidget( new CSysInfoWidget( CategoryStackedWidget ) );
|
||||
CategoryStackedWidget->addWidget( new CSysInfoOpenGLWidget( CategoryStackedWidget ) );
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
CategoryStackedWidget->addWidget( new CSysInfoD3DWidget( CategoryStackedWidget ) );
|
||||
#endif
|
||||
|
||||
for( sint32 i = 0; i < CategoryStackedWidget->count(); i++ )
|
||||
{
|
||||
|
|
|
@ -249,7 +249,7 @@ int main(int argc, char *argv[])
|
|||
{
|
||||
for(uint i = 0; i < ClientCfg.PreDataPath.size(); ++i)
|
||||
{
|
||||
CPath::addSearchPath(ClientCfg.PreDataPath[i], true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(ClientCfg.PreDataPath[i]), true, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -390,7 +390,7 @@ int main()
|
|||
// add the search paths
|
||||
for (uint i=0; i<paths.size(); ++i)
|
||||
{
|
||||
CPath::addSearchPath(paths.asString(i), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(paths.asString(i)), true, false);
|
||||
}
|
||||
|
||||
// init ligo
|
||||
|
|
|
@ -145,7 +145,7 @@ void LoadCraftParts()
|
|||
void LoadCreatureFiles()
|
||||
{
|
||||
printf( "-- REGISTERING CREATURE FILES --\n" );
|
||||
CSString inputSheetPath = LEVEL_DESIGN_PATH + "leveldesign\\Game_elem\\Creature\\Fauna\\bestiary";
|
||||
CSString inputSheetPath = LEVEL_DESIGN_PATH + "leveldesign/Game_elem/Creature/Fauna/bestiary";
|
||||
CPath::addSearchPath( inputSheetPath, true, false );
|
||||
|
||||
vector<string> files;
|
||||
|
@ -1472,6 +1472,7 @@ void SetupDirectories()
|
|||
|
||||
data.readFromFile( "raw_material_generation.cfg" );
|
||||
|
||||
// beurk :s Use CConfigFile instead
|
||||
LEVEL_DESIGN_PATH = data.splitFrom( "LevelDesignPath = \"").splitTo( "\"" );
|
||||
TRANSLATION_PATH = data.splitFrom( "TranslationPath = \"" ).splitTo( "\"" );
|
||||
|
||||
|
|
|
@ -179,7 +179,7 @@ int main( int argc, char ** argv )
|
|||
sint i;
|
||||
for( i = 0; i< (sint)cvSheetPaths.size(); ++i)
|
||||
{
|
||||
sheetPaths.push_back( cvSheetPaths.asString(i) );
|
||||
sheetPaths.push_back(NLMISC::expandEnvironmentVariables(cvSheetPaths.asString(i)));
|
||||
}
|
||||
}
|
||||
catch(const EUnknownVar &)
|
||||
|
|
|
@ -108,7 +108,7 @@ int main(int argc, char* argv[])
|
|||
//
|
||||
for(uint k = 0; k < builderConfig.SearchPaths.size(); ++k)
|
||||
{
|
||||
CPath::addSearchPath(builderConfig.SearchPaths[k], true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(builderConfig.SearchPaths[k]), true, false);
|
||||
}
|
||||
CPath::remapExtension("dds", "tga", true);
|
||||
CPath::remapExtension("dds", "png", true);
|
||||
|
|
|
@ -83,7 +83,7 @@ bool init()
|
|||
// Define the root path that contains all data needed for the application.
|
||||
nlinfo("Adding search paths...");
|
||||
for(uint i = 0; i < AppCfg.DataPath.size(); i++)
|
||||
CPath::addSearchPath(AppCfg.DataPath[i], true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(AppCfg.DataPath[i]), true, false);
|
||||
|
||||
// Initialize Sheet IDs.
|
||||
nlinfo("Init SheetId...");
|
||||
|
|
|
@ -542,7 +542,6 @@ sint main( sint argc, char ** argv )
|
|||
|
||||
|
||||
// output begin skill.h file
|
||||
//if( ! fo.open( string( "r:/code/ryzom/src_v2/game_share/skills.h" ) ) )
|
||||
if( ! fo.open( srcDir + string( "skills.h" ) ) )
|
||||
{
|
||||
nlwarning(" Can't open file %s for writing", "skills.h" );
|
||||
|
@ -648,7 +647,6 @@ sint main( sint argc, char ** argv )
|
|||
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
// begin output skill.cpp file
|
||||
// if( ! fo.open( string( "r:/code/ryzom/src_v2/game_share/skills.cpp" ) ) )
|
||||
if( ! fo.open( srcDir + string( "skills.cpp" ) ) )
|
||||
{
|
||||
nlwarning(" Can't open file skills.cpp for writing");
|
||||
|
|
|
@ -3197,11 +3197,11 @@ uigcChatColor [CHAT]
|
|||
|
||||
// HASH_VALUE 4B01AC26C830BC29
|
||||
// INDEX 797
|
||||
uigcEnglish [ENGLISCH]
|
||||
uigcEnglish [ENGLISH]
|
||||
|
||||
// HASH_VALUE 4C5024185050140C
|
||||
// INDEX 798
|
||||
uigcFrancais [FRANZÖSISCH]
|
||||
uigcFrancais [FRANCAIS]
|
||||
|
||||
// HASH_VALUE 8D229C20C911A81F
|
||||
// INDEX 799
|
||||
|
@ -3209,11 +3209,11 @@ uigcDeutch [DEUTSCH]
|
|||
|
||||
// HASH_VALUE 0912144D9193DC2A
|
||||
// INDEX 800
|
||||
uigcRussian [RUSSISCH]
|
||||
uigcRussian [РУССКИЙ]
|
||||
|
||||
// HASH_VALUE CBC1A432CBD2FC37
|
||||
// INDEX 801
|
||||
uigcSpanish [SPANISCH]
|
||||
uigcSpanish [ESPANOL]
|
||||
|
||||
// HASH_VALUE D72E51D69923FABB
|
||||
// INDEX 802
|
||||
|
|
|
@ -3203,11 +3203,11 @@ uigcDeutch [DEUTSCH]
|
|||
|
||||
// HASH_VALUE 0912144D9193DC2A
|
||||
// INDEX 800
|
||||
uigcRussian [RUSSIAN]
|
||||
uigcRussian [РУССКИЙ]
|
||||
|
||||
// HASH_VALUE CBC1A432CBD2FC37
|
||||
// INDEX 801
|
||||
uigcSpanish [SPANISH]
|
||||
uigcSpanish [ESPANOL]
|
||||
|
||||
// HASH_VALUE D72E51D69923FABB
|
||||
// INDEX 802
|
||||
|
|
|
@ -3192,19 +3192,19 @@ uigcChatColor [COLORES DEL CHAT]
|
|||
|
||||
// HASH_VALUE 4B01AC26C830BC29
|
||||
// INDEX 797
|
||||
uigcEnglish [INGLÉS]
|
||||
uigcEnglish [ENGLISH]
|
||||
|
||||
// HASH_VALUE 4C5024185050140C
|
||||
// INDEX 798
|
||||
uigcFrancais [FRANCÉS]
|
||||
uigcFrancais [FRANCAIS]
|
||||
|
||||
// HASH_VALUE 8D229C20C911A81F
|
||||
// INDEX 799
|
||||
uigcDeutch [ALEMÁN]
|
||||
uigcDeutch [DEUTSCH]
|
||||
|
||||
// HASH_VALUE 0912144D9193DC2A
|
||||
// INDEX 800
|
||||
uigcRussian [RUSO]
|
||||
uigcRussian [РУССКИЙ]
|
||||
|
||||
// HASH_VALUE CBC1A432CBD2FC37
|
||||
// INDEX 801
|
||||
|
|
|
@ -3191,7 +3191,7 @@ uigcChatColor [CHAT]
|
|||
|
||||
// HASH_VALUE 4B01AC26C830BC29
|
||||
// INDEX 797
|
||||
uigcEnglish [ANGLAIS]
|
||||
uigcEnglish [ENGLISH]
|
||||
|
||||
// HASH_VALUE 4C5024185050140C
|
||||
// INDEX 798
|
||||
|
@ -3199,15 +3199,15 @@ uigcFrancais [FRANCAIS]
|
|||
|
||||
// HASH_VALUE 8D229C20C911A81F
|
||||
// INDEX 799
|
||||
uigcDeutch [ALLEMAND]
|
||||
uigcDeutch [DEUTSCH]
|
||||
|
||||
// HASH_VALUE 0912144D9193DC2A
|
||||
// INDEX 800
|
||||
uigcRussian [RUSSE]
|
||||
uigcRussian [РУССКИЙ]
|
||||
|
||||
// HASH_VALUE CBC1A432CBD2FC37
|
||||
// INDEX 801
|
||||
uigcSpanish [ESPAGNOL]
|
||||
uigcSpanish [ESPANOL]
|
||||
|
||||
// HASH_VALUE D72E51D69923FABB
|
||||
// INDEX 802
|
||||
|
|
|
@ -3193,15 +3193,15 @@ uigcChatColor [ЧАТ]
|
|||
|
||||
// HASH_VALUE 4B01AC26C830BC29
|
||||
// INDEX 797
|
||||
uigcEnglish [Английский]
|
||||
uigcEnglish [ENGLISH]
|
||||
|
||||
// HASH_VALUE 4C5024185050140C
|
||||
// INDEX 798
|
||||
uigcFrancais [Французский]
|
||||
uigcFrancais [FRANCAIS]
|
||||
|
||||
// HASH_VALUE 8D229C20C911A81F
|
||||
// INDEX 799
|
||||
uigcDeutch [Немецкий]
|
||||
uigcDeutch [DEUTSCH]
|
||||
|
||||
// HASH_VALUE 0912144D9193DC2A
|
||||
// INDEX 800
|
||||
|
@ -3209,7 +3209,7 @@ uigcRussian [РУССКИЙ]
|
|||
|
||||
// HASH_VALUE CBC1A432CBD2FC37
|
||||
// INDEX 801
|
||||
uigcSpanish [ИСПАНСКИЙ]
|
||||
uigcSpanish [ESPANOL]
|
||||
|
||||
/* OLD VALUE : [??? ????, ????? ????????? ???????? ? ????, ?????????? ????????????? ??????] */
|
||||
// HASH_VALUE D72E51D69923FABB
|
||||
|
|
|
@ -256,11 +256,11 @@ int extractBotNames(int argc, char *argv[])
|
|||
|
||||
for (uint i=0; i<paths.size(); ++i)
|
||||
{
|
||||
CPath::addSearchPath(paths.asString(i), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(paths.asString(i)), true, false);
|
||||
}
|
||||
for (uint i=0; i<pathNoRecurse.size(); ++i)
|
||||
{
|
||||
CPath::addSearchPath(pathNoRecurse.asString(i), false, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(pathNoRecurse.asString(i)), false, false);
|
||||
}
|
||||
|
||||
for (uint i=0; i<filtersVar.size(); ++i)
|
||||
|
@ -278,7 +278,7 @@ int extractBotNames(int argc, char *argv[])
|
|||
if (Creatures.empty())
|
||||
{
|
||||
for (uint i=0;i<georgesPaths.size();++i)
|
||||
CPath::addSearchPath(georgesPaths.asString(i).c_str(), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(georgesPaths.asString(i)), true, false);
|
||||
|
||||
loadForm("creature", PACKED_SHEETS_NAME, Creatures, true);
|
||||
}
|
||||
|
|
|
@ -356,19 +356,22 @@ int extractNewSheetNames(int argc, char *argv[])
|
|||
CConfigFile::CVar &paths = cf.getVar("Paths");
|
||||
CConfigFile::CVar &pathNoRecurse= cf.getVar("PathsNoRecurse");
|
||||
CConfigFile::CVar &ligoClassFile= cf.getVar("LigoClassFile");
|
||||
CConfigFile::CVar &leveldesignDataPathVar = cf.getVar("LeveldesignDataPath");
|
||||
|
||||
// parse path
|
||||
for (uint i=0; i<paths.size(); ++i)
|
||||
{
|
||||
CPath::addSearchPath(paths.asString(i), true, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(paths.asString(i)), true, false);
|
||||
}
|
||||
for (uint i=0; i<pathNoRecurse.size(); ++i)
|
||||
{
|
||||
CPath::addSearchPath(pathNoRecurse.asString(i), false, false);
|
||||
CPath::addSearchPath(NLMISC::expandEnvironmentVariables(pathNoRecurse.asString(i)), false, false);
|
||||
}
|
||||
|
||||
std::string leveldesignDataPath = NLMISC::expandEnvironmentVariables(leveldesignDataPathVar.asString());
|
||||
|
||||
// init ligo config once
|
||||
string ligoPath = CPath::lookup(ligoClassFile.asString(), true, true);
|
||||
string ligoPath = CPath::lookup(NLMISC::expandEnvironmentVariables(ligoClassFile.asString()), true, true);
|
||||
LigoConfig.readPrimitiveClass(ligoPath.c_str(), false);
|
||||
NLLIGO::Register();
|
||||
CPrimitiveContext::instance().CurrentLigoConfig = &LigoConfig;
|
||||
|
@ -382,10 +385,10 @@ int extractNewSheetNames(int argc, char *argv[])
|
|||
// 2nd is the Key column identifier.
|
||||
// 3rd is the sheet extension
|
||||
// 4th is the directory where to find new sheets
|
||||
"work/item_words_wk.txt", "item ID", "sitem", "l:/leveldesign/game_element/sitem",
|
||||
"work/creature_words_wk.txt", "creature ID", "creature", "l:/leveldesign/game_elem/creature/fauna", // take fauna only because other are special
|
||||
"work/sbrick_words_wk.txt", "sbrick ID", "sbrick", "l:/leveldesign/game_element/sbrick",
|
||||
"work/sphrase_words_wk.txt", "sphrase ID", "sphrase", "l:/leveldesign/game_element/sphrase",
|
||||
"work/item_words_wk.txt", "item ID", "sitem", "leveldesign/game_element/sitem",
|
||||
"work/creature_words_wk.txt", "creature ID", "creature", "leveldesign/game_elem/creature/fauna", // take fauna only because other are special
|
||||
"work/sbrick_words_wk.txt", "sbrick ID", "sbrick", "leveldesign/game_element/sbrick",
|
||||
"work/sphrase_words_wk.txt", "sphrase ID", "sphrase", "leveldesign/game_element/sphrase",
|
||||
};
|
||||
uint numSheetDefs= sizeof(sheetDefs) / (4*sizeof(sheetDefs[0]));
|
||||
|
||||
|
@ -394,7 +397,7 @@ int extractNewSheetNames(int argc, char *argv[])
|
|||
{
|
||||
CSheetWordListBuilder builder;
|
||||
builder.SheetExt= sheetDefs[i*4+2];
|
||||
builder.SheetPath= sheetDefs[i*4+3];
|
||||
builder.SheetPath= CPath::standardizePath(leveldesignDataPath) + sheetDefs[i*4+3];
|
||||
extractNewWords(sheetDefs[i*4+0], sheetDefs[i*4+1], builder);
|
||||
}
|
||||
|
||||
|
@ -403,7 +406,7 @@ int extractNewSheetNames(int argc, char *argv[])
|
|||
{
|
||||
// build place names
|
||||
CRegionPrimWordListBuilder builder;
|
||||
builder.PrimPath= "l:/primitives";
|
||||
builder.PrimPath= leveldesignDataPath;
|
||||
builder.PrimFilter.push_back("region_*.primitive");
|
||||
builder.PrimFilter.push_back("indoors_*.primitive");
|
||||
extractNewWords("work/place_words_wk.txt", "placeId", builder);
|
||||
|
|
Loading…
Reference in a new issue