Надеюсь, не опоздал!
Простыня та-ды-дыщь:
Функция загрузки (она только составляет список имеющихся картинок в директории):
InputFolder имя директории
del_prev флаг - удалить ли уже прочитанную ранее инфу
возвращаемое значение - кол-во найденных (за этот вызов функции) файлов
Function InputDirRead%(InputFolder$,del_prev%=True)
If del_prev Then Delete Each tFILE
Local D%=ReadDir(InputFolder)
Local FileName$
Local FullFileName$
Local TotalC%=0
While True
FileName=NextFile(D)
If FileName="" Exit
FullFileName=InputFolder+"\"+FileName
If FileType(FullFileName)=1
Local EXT3$,EXT4$
;будем рассматривать лишь файлы с расширением длиной 3 и 4 символа
EXT4=Upper(Right(FileName,4))
EXT3=Upper(Right(FileName,3))
Local EXT$=""
;туто можно настроить поддеркжу форматов - сделано топорно, ибо под жёсткое ТЗ
If EXT3="BMP" Or EXT3="JPG" Or EXT3="PNG" Or EXT3="GIF"
EXT=EXT3
ElseIf EXT4="JPEG"
;меня бесит расширение JPEG, потому в информацию о файле пропишу его как JPG
EXT="JPG"
EndIf
;если расширение определено - информация о файле будет добавлена
If EXT<>""
Local F.tFILE=New tFILE
F\FullFileName=FullFileName
F\FileUEXT=EXT
F\FileShortName=FileName
F\ID=TotalC+1
TotalC=TotalC+1
EndIf
EndIf
Wend
CloseDir(D)
Return TotalC
End Function
Собственно экземпляр инфы о файле:
Type tFILE
Field FullFileName$;абсолютное (с именем папки, переданной в функцию загрузки) имя файла
Field FileUEXT$;расширение файла (в верхнем регистре)
Field FileShortName$;имя файла (с расширением)
Field ID%;индекс файла при чтении (после перемешивания первый прочитанный файл может оказаться в конце)
End Type
это тоже понадобиться (сюда мы потом переместим структуры для более удобной работы)
После работы - очищаем информацию
Function InputDirDeRead()
For f.tFILE=Each tFILE
Delete f
Next
Dim LIST(0)
End Function
Функция выгрузки считанной инфы в массив, для работы (перемешивание)
cnt -кол-во объектов (чтобы их не пересчитывать)
Function tFILE2LIST(cnt%)
Dim LIST(cnt)
Local i=1
For f.tFILE=Each tFILE
LIST(i)=f
i=i+1
Next
End Function
После выгрузки в массив, вызываем эту функцию для перемешивания содержимого
cnt -кол-во объектов
Function LISTrandomize(cnt%)
If cnt<2 Return
Local tmp.tFILE
Local factor%=cnt*2.0;количество перестановок - побирается на вкус; у меня - кол-во файлов х 2
Local A%=1;первый файл будет гарантировано участвовать в перемешивании
Local B%=Rand(1,cnt);практика показала, что 1-ый файл слишком часто оставался нетронутым
For i=1 To factor
;такая модель перестановок может (с уменьшающейся вероятностью вообще ничего не переставить)
; см подробнее: http://forum.boolean.name/showthread.php?t=15658
tmp=LIST(A)
LIST(A)=LIST(B)
LIST(B)=tmp
A%=Rand(1,cnt)
B%=Rand(1,cnt)
Next
End Function
Получить файл
I -индекс текущего файла
Function GetNextFile.tFILE(I%)
;думаешь: чо за тупая функция? просто у меня файл перед взятием его получал дополнительную информацию в свои поля
Return LIST(I)
End Function
Демо:
Dim LIST.tFILE(0)
Global TCnt=InputDirRead("Pic");загрузим информацию о файла в папке Pic
TCnt=TCnt+InputDirRead("Pic2",False);догрузим информацию из папки Pic2
;...
Global ReadIndx%=TCnt+1;текущий читаемый индекс
tFILE2LIST(TCnt);выгружаем информацию в массив (вернее - указатели* сохраняются в массив для удобства: удалять экземпляры нельзя пока)
;...
While True;некоторый цикл получения случайных картинок
If ReadIndx>TCnt;если уже перебрали весь список - перемешаем его заново и начнём сначала
LISTrandomize(TCnt)
ReadIndx=1
EndIf
Local file.tFILE=GetNextFile(ReadIndx);получить указатель* на структуру, содержащую информацию о файле
ReadIndx=ReadIndx+1
;...
Wend
InputDirDeRead();очистим
Собственно, выполнишь 15 итераций цикла из демки. На каждой итерации грузишь файл
Loadtexture(file\FullFileName)
и накладываешь на N-ый меш.
И да:
Нужно сделать так, что бы из папки брались картинки и рандомно применялись к моделям картин, причем если картинок больше чем нужно, брались наугад из них 15 без повторений, а если меньше, в случайном порядке повторялись.
Причем файлы картинок могут называться как угодно.
|
Причём повторяться (в случае "а если меньше") они будут минимальное число раз. Т.е. если у тебя 14 картинок (а мешей - 15), то повторений будет 2 (на двух мешах одна и та же текстура).
Ну - а у меша, сделать именованный полигон, с корректно выставленными uv координатами. Загрузить меш, раскопировать его на 15 объектов - всё очевидно.