cgfxFindImage.cpp
#include "cgfxShaderCommon.h"
#include "cgfxFindImage.h"
#include <maya/MStringArray.h>
#include <maya/MGlobal.h>
#include <maya/MFileObject.h>
#include <sys/types.h>
#include <sys/stat.h>
#ifdef _WIN32
#else
#       include <string.h>
#       define  MAX_PATH 1024
#endif
MString cgfxFindFile(const MString& name, const MString &searchpath)
{
        MString file = name;
        struct stat statBuf;
    char path[MAX_PATH];
    const char * psearchpath = searchpath.asChar();
        OutputDebugString("File = ");
        OutputDebugString(file.asChar());
        OutputDebugString("\n");
    
    if (stat(file.asChar(), &statBuf) == -1)
    {
        bool found = false;
            while (found == false && psearchpath < searchpath.asChar() + searchpath.length())
            {
            const char * endpath = strchr(psearchpath,';');
            if (endpath)
            {
                strncpy(path,psearchpath, endpath - psearchpath);
                path[endpath - psearchpath] = '\0';
            }
            else
            {
                strcpy(path,psearchpath);
            }
                
            psearchpath += strlen(path)+1;
                bool fullPath = (path[0] == '/' ||
                                                 path[0] == '\\');
                if (strlen(path) > 2)
                {
                        fullPath = fullPath ||
                                           (path[1] == ':' &&
                                                (path[2] == '/' ||
                                                 path[2] == '\\'));
                }
                        
                file = MString(path) + "/" + name;
            OutputDebugString("Try File = ");
            OutputDebugString(file.asChar());
            OutputDebugString("\n");
            if (stat(file.asChar(), &statBuf) != -1)
                found = true;
            else
                file = "";
            }
    }
        OutputDebugString("Returning: ");
        OutputDebugString(file.asChar());
        OutputDebugString("\n");
        return file;
}
MString cgfxFindFile(const MString& name, bool projectRelative)
{
        
        MString fileName;
        
    if (name.asChar() != NULL && strcmp(name.asChar(), ""))
    {
                
                
                static MString texturePath( ".");
                
                MString workspace;
                MStatus status = MGlobal::executeCommand(MString("workspace -q -rd;"),
                                                                                workspace);
                if ( status == MS::kSuccess)
                {
                        texturePath += ";";
                        texturePath += workspace;
                        texturePath += ";";
                        texturePath += workspace;
                        texturePath += "/textures;";
                        texturePath += workspace;
                        texturePath += "/images;";
                        texturePath += workspace;
                }
                
                char * cgfxPath = getenv("CGFX_TEXTURE_PATH");
                if (cgfxPath)
                {
                        texturePath += ";";
                        texturePath += cgfxPath;
                }
                else
                {
                        char * cgfxRoot = getenv("CGFX_ROOT");
                        if (cgfxRoot)
                        {
                                texturePath += ";";
                                texturePath += cgfxRoot;
                                texturePath += "/textures/2D;";
                                texturePath += cgfxRoot;
                                texturePath += "/textures/cubemaps;";
                                texturePath += cgfxRoot;
                                texturePath += "/textures/3D;";
                                texturePath += cgfxRoot;
                                texturePath += "/textures/rectangles;";
                                texturePath += cgfxRoot;
                                texturePath += "/CgFX_Textures;";
                                texturePath += cgfxRoot;
                                texturePath += "/CgFX";
                        }
                }
                OutputDebugString("CgFX texture path is: ");
                OutputDebugString(texturePath.asChar());
                OutputDebugString("\n");
            fileName = cgfxFindFile(name, texturePath);
        int hasFile = fileName.asChar() != NULL && strcmp(fileName.asChar(), "");
            if (hasFile == 0)
        {
            
            int idx = name.rindex('/');
            if (idx == -1)
                idx = name.rindex('\\');
            if (idx != -1)
            {
                MString filename = name.substring(idx+1,name.length()-1);
                fileName = cgfxFindFile(filename, texturePath);
                hasFile = fileName.asChar() != NULL && strcmp(fileName.asChar(), "");
            }
        }
            
                
                
                if( hasFile && projectRelative)
                {
                        if( fileName.length() > workspace.length() && 
                                workspace.length() > 0 &&
                                fileName.substring( 0, workspace.length() - 1) == workspace)
                                
                                
                                fileName = fileName.substring( workspace.length() + 1, fileName.length() - 1);
                }
        if (hasFile == 0)
                    OutputDebugString("Error: file not found.\n");
    }
    return fileName;
}
void    
cgfxGetFxIncludePath( const MString &fxFile, MStringArray &pathOptions )
{
        
        
        MString option;
        if (fxFile.length())
        {
                MFileObject fobject;
                fobject.setRawFullName( fxFile );
                option = MString("-I") + fobject.resolvedPath();                
                pathOptions.append( option );
        }
        
        
        
        char * cgfxRoot = getenv("CGFX_ROOT");
        if (cgfxRoot)
        {
                option = MString("-I") + MString(cgfxRoot);
                pathOptions.append( option );
                option = MString("-I") + MString(cgfxRoot) + MString("/CgFX");
                pathOptions.append( option );
        }
        
        char * mayaLocation = getenv("MAYA_LOCATION");
        if (mayaLocation)
        {
                MString mayaCgLocation(MString(mayaLocation) + MString("/bin/Cg/"));
                option = MString("-I") + mayaCgLocation;
                pathOptions.append( option );
        }
}