Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Как узнать имена текстур из 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
14-1127485001
Lamer@fools.ua
2005-09-23 18:16
2005.11.13
Kyiv Mastak Party


3-1128342556
Prohodil Mimo
2005-10-03 16:29
2005.11.13
не получается загрузить JPG картинку из TStream в TImage


5-1109098399
olookin
2005-02-22 21:53
2005.11.13
Свойства self-made компонента - ничего не понимаю!


2-1130153617
Del_programmer
2005-10-24 15:33
2005.11.13
Работа с потоком


2-1129784806
SMATMP
2005-10-20 09:06
2005.11.13
LoadFromFile