Анализ файла .X - вызов для создания объекта перечисления завершается неудачно - PullRequest
0 голосов
/ 30 января 2012

Я пишу класс анализатора файлов .X для DirectX. Когда я пытаюсь разобрать большие файлы, вызов для создания объекта перечисления завершается неудачей.

Я думаю, что это из-за размера файла ... текущий класс работает с меньшими файлами, такими как tiger.x (31 КБ). Однако, когда я пытаюсь загрузить больший файл, такой как tiny.x (1500 КБ), вызов для создания объекта перечисления завершается неудачно ... вот выдержка из CXParser.cpp:

#include "CXParser.h"
#include "d3dx9xof.h"

BOOL CXParser::Parse(char *filename, void** data)
{
    LPD3DXFILE              pDXFile = NULL;
    LPD3DXFILEENUMOBJECT    pEnum = NULL;
    LPD3DXFILEDATA          pDataObj = NULL;
    SIZE_T                  nChildren = NULL;
    DWORD Depth = 0;


int iFileLength=0;
    HANDLE hFile=NULL;
    DWORD dwBytesRead=0;
    LPVOID fileBuffer = NULL;

    hFile = CreateFileA (filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    iFileLength = GetFileSize (hFile, NULL);
fileBuffer = malloc (iFileLength + 2) ;
        ReadFile(hFile, fileBuffer, iFileLength, &dwBytesRead, NULL);
    BeginParse(data);
    if(FAILED(D3DXFileCreate(&pDXFile)))
    {
        MessageBox(NULL, L"Could not Create DX File Interface Object", L"ERROR", MB_OK);
        return false;
    }

    if(FAILED(pDXFile->CreateEnumObject((LPVOID)filename, DXFILELOAD_FROMFILE, &pEnum)))
    {
        MessageBox(NULL, L"Could not Create DX Enumeration Object", L"ERROR", MB_OK);           pDXFile->Release();
        return false; // function exits here when loading large .X files

    }
    if(FAILED(pEnum->GetChildren(&nChildren)))
    {
        MessageBox(NULL, L"Could not Enumerate .X File", L"ERROR", MB_OK);
        return false;
    }

    for(SIZE_T index = 0; index < nChildren; index++)
    {
        if(SUCCEEDED(pEnum->GetChild(index, &pDataObj)))
        {
            if(!pDataObj->IsReference())
            {
                GetObjectName(pDataObj);
                ParseObject(pDataObj, Depth, NULL);
                pDataObj->Release();
            }
        }
    }
    EndParse(data);
    pEnum->Release();
    pDXFile->Release();

    return TRUE;
}

Мой вопрос такой:

Можно ли загрузить файл .X в буфер памяти перед анализом?

Кроме того, я заметил, что tiger.x и tiny.x имеют разное количество битов, зарезервированных для значений с плавающей запятой (заголовки различаются):

Заголовок

tiger.x: xof 0302txt 0064

Заголовок

tiny.x: xof 0303txt 0032

Вызывает ли это различие проблему при загрузке файла .X для перечисления?

1 Ответ

0 голосов
/ 30 января 2012

Если это модель tiny.x по умолчанию, я видел сбой при перечислении только из-за случайного указания неверного пути. Я добавил проверку пути к файлу перед перечислением (я использовал boost :: filesystem :: exist (path)).

Я рекомендую добавить такую ​​проверку, так как в приведенном выше примере кода такой явной проверки нет, поэтому ваша модель может иметь недопустимое имя, и, следовательно, ошибка может ввести в заблуждение.

...