Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Как узнать имена текстур из X Mesh?   Найти похожие ветки 

 
cyborg ©   (2005-06-29 09:59) [0]

Загружаю модель с помощтью D3DXLoadMeshFromX в ID3DXMesh.
Из него получаю материалы, но там без текстур

 _D3DMATERIAL9 = packed record
   Diffuse: TD3DColorValue;   { Diffuse color RGBA }
   Ambient: TD3DColorValue;   { Ambient color RGB }
   Specular: TD3DColorValue;  { Specular "shininess" }
   Emissive: TD3DColorValue;  { Emissive color RGB }
   Power: Single;             { Sharpness if specular highlight }
 end {_D3DMATERIAL9};

Чего-то не найду никак где там список текстур получить можно?


 
NailMan ©   (2005-06-29 10:11) [1]

При загрузке модели функцией D3DXLoadMeshFromX, последняя выдаем массив своих материалов D3DXMATERIAL(а не D3DMATERIAL9), в структуре которых и есть строка-ссылка на внешнюю текстуру.

typedef struct D3DXMATERIAL {
   D3DMATERIAL9 MatD3D;
   LPSTR pTextureFilename;
} D3DXMATERIAL;


ЗЫ: Код приведен для С, так как под рукой только SDK на работе валяется.


 
Sphinx ©   (2005-06-29 11:23) [2]

{==============================================================================
 добавить меш из файла формата .х
==============================================================================}

function TDXMeshList.AddFromFileX(const DataDir, FileName: String): Integer;
var
 FbuffMeshMaterials: ID3DXBuffer;        // буфер материалов
 dwNumItems, dwNumMaterials: Cardinal;
 FMaterials: array of TD3DXMATERIAL;     // массив данных материалов
 pFMaterials: Pointer;                   // нетипизированный указатель
 PACH: PChar;                            
begin
 // первоначальный результат - провал
 FHRErrorCode := E_FAIL;
 // проверка существования файла
 if FileExists(DataDir + FileName) then
   FHRErrorCode := S_Ok;
 // загрузить в защищенной секции
 try
   // если файл существует
   if Succeeded(FHRErrorCode) then
     begin
       // увеличить количество элементов на единицу
       SetLength(FItemsArray, Length(FItemsArray) + 1);
       SetLength(FItemsNumMaterials, Length(FItemsNumMaterials) + 1);
       // обнулить переменную материалов
       dwNumMaterials := 0;
       // еще одна защищенная секция
       try
         // загружаем меш
         FHRErrorCode := D3DXLoadMeshFromX
                                (PAnsiChar(DataDir + FileName),          // имя файла меша
                                 D3DXMESH_MANAGED,                       // опции загрузки
                                 pFD3DDevice^,                           // устройство вывода D3D
                                 nil,                                    //
                                 @FbuffMeshMaterials,                    // буфер материалов
                                 nil,                                    //
                                 @dwNumMaterials,                        // количество материалов
                                 FItemsArray[Length(FItemsArray) - 1]);  // меш
         // запоминаем количество материалов в массив
         FItemsNumMaterials[Length(FItemsArray) - 1] := dwNumMaterials;
         // увеличиваем длинну массивов материалов и текстур
         SetLength(FItemsMaterials, Length(FItemsArray));
         SetLength(FItemsTexture, Length(FItemsArray));
         // получаем указатель на данные материалов
         if Assigned(FbuffMeshMaterials) then
           begin
             pFMaterials := FbuffMeshMaterials.GetBufferPointer;
             // устанавливаем размер массива материалов (локальный)
             SetLength(FMaterials, dwNumMaterials);
             // перемещаем данные из буфера в локальный массив материалов
             Move(pFMaterials^, FMaterials, SizeOf(pFMaterials^));
           end
         else
           dwNumMaterials := 0;
         // если материалов не нулевое количество
         if dwNumMaterials > 0 then
           begin
             // установить необходимую длинну массива материалов
             SetLength(FItemsMaterials[Length(FItemsArray) - 1], dwNumMaterials);
             // установить необходимую длинну массива текстур
             SetLength(FItemsTexture[Length(FItemsArray) - 1], dwNumMaterials);
             // пробежаться по всем материалам
             for dwNumItems := 0 to dwNumMaterials - 1 do
               begin
                 // скопировать данные материала
                 FItemsMaterials[Length(FItemsArray) - 1, dwNumItems] := FMaterials[dwNumItems].MatD3D;
                 FItemsMaterials[Length(FItemsArray) - 1, dwNumItems].Ambient := FItemsMaterials[Length(FItemsArray) - 1, dwNumItems].Diffuse;
                 // если для данного материала установлена текстура
                 if FMaterials[dwNumItems].pTextureFilename <> "" then
                   begin
                     // вычислить имя текстуры
                     PACH := PChar(DataDir + String(FMaterials[dwNumItems].pTextureFilename));
                     // создать текстуру
                     FHRErrorCode := D3DXCreateTextureFromFile
                                            (pFD3DDevice^,
                                             PACH,
                                             FItemsTexture[Length(FItemsArray) - 1, dwNumItems]);
                   end
                 else { if FMaterials[dwNumItems].pTextureFilename <> "" }
                   // если для материала нет текстуры
                   FItemsTexture[Length(FItemsArray) - 1, dwNumItems] := nil;
               end;
           end
         else { if dwNumMaterials > 0 }
           begin
             // естанавливаем один материал
             FItemsNumMaterials[Length(FItemsArray) - 1] := 1;
             SetLength(FItemsMaterials[Length(FItemsArray) - 1], 1);
             SetLength(FItemsTexture[Length(FItemsArray) - 1], 1);
             // заполняем данные материала
             FItemsMaterials[Length(FItemsArray) - 1, 0].Diffuse.r := 1.0;
             FItemsMaterials[Length(FItemsArray) - 1, 0].Diffuse.g := 1.0;
             FItemsMaterials[Length(FItemsArray) - 1, 0].Diffuse.b := 1.0;
             FItemsMaterials[Length(FItemsArray) - 1, 0].Diffuse.a := 1.0;
             FItemsMaterials[Length(FItemsArray) - 1, 0].Ambient := FItemsMaterials[Length(FItemsArray) - 1, 0].Diffuse;
             // устанавливаем пустую текстуру
             FItemsTexture[Length(FItemsArray) - 1, 0] := nil;
           end;
       except
         on EAbort do FHRErrorCode := E_Fail;                    // в случае любой ошибки
         on EOutOfMemory do FHRErrorCode := E_OUTOFMEMORY;       // если недостаточно памяти
         on EAccessViolation do FHRErrorCode := E_ACCESSDENIED;  // ошибка доступа к данным
       end;
       // если были ошибки - удаляем меш
       if (Failed(FHRErrorCode)) or (FItemsArray[Length(FItemsArray) - 1] = nil) then
         Delete(Length(FItemsArray) - 1);
     end; { if Succeeded(FHRErrorCode) }
 finally
   // при любом результате загрузки очищаем буфер
   FbuffMeshMaterials := nil;
 end;
 // если загрузка успешная - выдаем номер элемента, иначе "-1"
 if Succeeded(FHRErrorCode) then
   Result := Length(FItemsArray) - 1
 else
   Result := -1;
end;


 
Sphinx ©   (2005-06-29 11:23) [3]

Это только набросок, есть некоторые "шероховатости" но рабочий 100%


 
Sphinx ©   (2005-06-29 11:38) [4]

Одно но :)
Если на всю модель наложена единая текстура - она не будет перечисляться в списке текстур получаемом при загрузке модели :)



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.052 c
14-1130062668
Nikolay M.
2005-10-23 14:17
2005.11.13
Никому не нужны программы на 5 25 для Spectrum?


1-1129714837
Mamed
2005-10-19 13:40
2005.11.13
Perevod so Ci na paskal


2-1129801911
SMATMP
2005-10-20 13:51
2005.11.13
TImage.Bitmap


2-1129523457
bogdan
2005-10-17 08:30
2005.11.13
Задача по геометрии


2-1130050454
beglec
2005-10-23 10:54
2005.11.13
Можно ли узнать имя процедуры.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский