Но в ДэдСпейсе много чего вкусного можно найти и среди статиков - модели техники, кораблей, т.п. К сожалению, исходный скрипт для них не работает, так что пишу свой. Вернее переделываю существующий. Есть кое какие подвижки, но есть и проблемы.
Удалось вычленить массив вершин - они кодируются 3-мя флоатами. в отличии от скелетных моделей, между координатами отсутствуют двадцать байтовые пропуски (по всей видимости, скелетная привязка) Но не удается нормально импортировать массив полигонов. В скелетных моделях каждый полигон кодируется тремя короткими двухбайтовыми без знаковыми интами, каждый из которых является номером соответствующей вершины.
В статиках наблюдаем нечто странное:
массив фейсов начинается с 0x17F00. Первый треугольник (0 1 2) - нормальные индексы. Потом - нечто странное - ( 2 3 3) две вершины совпадают - то есть мы имеем фактически одно ребро из второй точки в третью. С точки зрения ДиректХ это бред.
У кого какие идеи?
Код: Выделить всё
UseTripleUVW=1
fname = getOpenFileName \
caption:"Open .geo from Mesh folder" \
types:"Dead Space 2 Mesh(*.geo)|*.geo" \
historyCategory:"DeadSpace2ObjectPresets"
f = fopen fname "rb"
gname = getOpenFileName \
caption:"Open .geo from MeshVolatile folder" \
types:"Dead Space 2 UV(*.geo)|*.geo" \
historyCategory:"DeadSpace2ObjectPresets"
g = fopen gname "rb"
--clearlistener()
fscale=100
indices = 0
Print ("################################################")
Print ("########### NEW FILE ########################")
Print ("################################################")
Print ("Geo name ")
Print(f)
Print ("UVW name ")
Print(g)
Print ("")
fseek g 0x0 #seek_end
LenghtUVWFile=ftell g
fseek g 0x0 #seek_set
fseek f 0x0 #seek_end
LenghtGeoFile=ftell f
Print("Lenght geometry file: 0x"+((bit.intAsHex(LenghtGeoFile))as string))
print("")
fseek f 0x0 #seek_set
--!!!!!!!!!!!!!!!!!!!! vertcount - количество вершин !!
--!!!!!!!!!!!!!!!!!!!! vertOff - смещенние массива вершин от начала файла !!
--!!!!!!!!!!!!!!!!!!!! faceoff - смещенние массива полигонов от начала файла !!
Face_array=#()
Vert_array=#()
UV_array=#()
fseek f 0x50 #seek_set
Print("Offset infoOff1: 0x"+((bit.intAsHex(ftell f))as string))
infoOff1=readlong f -- readlong - 4 byte ->integer
Print("infoOff1: 0x"+((bit.intAsHex(infoOff1))as string))
Print("")
fseek f 20 #seek_cur
Print("Offset infoOff2: 0x"+((bit.intAsHex(ftell f))as string))
infoOff2=readlong f
Print("infoOff2: 0x"+((bit.intAsHex(infoOff2))as string))
Print("")
fseek f (infoOff1 + 48) #seek_set
Print ("Offset faceInd (infoOff1+0x30): 0x"+((bit.intAsHex(ftell f))as string))
faceInd=readlong f
Print("faceInd: 0x"+((bit.intAsHex(faceInd))as string))
Print("")
fseek f 80 #seek_cur
Print ("Offset vertOff (faceInd+0x50): 0x"+((bit.intAsHex(ftell f))as string))
vertOff=readlong f
Print("vertOff: 0x"+((bit.intAsHex(vertOff))as string))
Print("")
Print ("Offset faceOff: 0x"+((bit.intAsHex(ftell f))as string))
faceOff=readlong f
Print("faceOff: 0x"+((bit.intAsHex(faceOff))as string))
Print("")
fseek f (infoOff2+20) #seek_set
Print ("Offset vertcount (infoOff2+0x14): 0x"+((bit.intAsHex(ftell f))as string))
vertcount=readlong f
Print("vertcount: 0x"+((bit.intAsHex(vertcount))as string))
Print("")
fseek f 12 #seek_cur
Print ("Offset face (vertcount+0xb): 0x"+((bit.intAsHex(ftell f))as string))
face=readlong f
Print ("face: 0x"+((bit.intAsHex(face))as string))
Print("")
fseek f 28 #seek_cur
Print ("Offset face2 (face+0x1C): 0x"+((bit.intAsHex(ftell f))as string))
face2=readlong f
Print ("face2: 0x"+((bit.intAsHex(ftell f))as string))
Print("")
fseek f vertOff #seek_set
Print ("!!!!!!!!! Offset Array Of VERTEX: 0x"+((bit.intAsHex(ftell f))as string)+" !!!!!!!!!")
changer = 1
for x = 1 to vertcount do(
if (((ftell f+32)<LenghtGeoFile) and ((ftell f+32)<faceoff)) do
(
--Print("Offset vertex: 0x"+((bit.intAsHex(ftell f))as string))
vx=readfloat f
vy=readfloat f
vz=readfloat f
--fseek f 84 #seek_cur
append Vert_array([vx,vy,vz] * fscale)
)
)
Print ("!!!!!!!!! END Offset Array Of VERTEX: 0x"+((bit.intAsHex(ftell f))as string)+" !!!!!!!!!")
/*
Print("vertcount")
Print(vertcount)
Print("LenghtUVWFile")
Print(LenghtUVWFile)
if((vertcount*12)<LenghtUVWFile) then (UseTripleUVW=1)
else (UseTripleUVW=0)
for u = 1 to vertcount do(
tu=readfloat g
tv=readfloat g
if(UseTripleUVW==1) then (tw=readfloat g)
append UV_array[tu,tv,0]
)
*/
fseek f faceoff #seek_set
Print ("!!!!!!!!! Offset Array Of FACE: 0x"+((bit.intAsHex(ftell f))as string)+" !!!!!!!!!")
if (face2 > faceInd) then (
indices = face2
)else(
indices = faceInd
)
if (faceInd > face) then (
indices = faceInd
)else(
indices = face
)
--for x = 1 to indices/3 do(
for x = 1 to indices*3 do(
if ((ftell f+6)<LenghtGeoFile) do (
-- readshort f #unsigned+1
fa=readshort f #unsigned+1
if(Vert_array.count<fa) do (exit)
-- readshort f #unsigned+1
fb=readshort f #unsigned+1
if(Vert_array.count<fb) do (exit)
-- readshort f #unsigned+1
fc=readshort f #unsigned+1
if(Vert_array.count<fc) do (exit)
Print ((fa as string)+" "+(fb as string)+" "+(fc as string))
append Face_array[fa,fb,fc]
)
)
Print ("!!!!!!!!! END Offset Array Of FACE: 0x"+((bit.intAsHex(ftell f))as string)+" !!!!!!!!!")
Print ("Number of face: "+( Face_array.count as string))
msh = mesh vertices:Vert_array faces:Face_array
/*msh.numTVerts = UV_array.count
buildTVFaces msh
for j = 1 to UV_array.count do setTVert msh j UV_array[j]
for j = 1 to Face_array.count do setTVFace msh j Face_array[j]
msh.name=filenameFromPath fname
//
Print ("Last Read @ 0x"+((bit.intAsHex(ftell f))as string))
gc()
fclose f
fclose g
http://www.sendspace.com/file/xa23cn
0203_playerarcheologisthelmet.geo - скелетная модель. На ней можно попробовать исходный скрипт.