Форум: "Игры";
Текущий архив: 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.042 c