I have managed to convert the Rumble Rose YOBJ script to make it work for Wrestle Kingdom 2 model.However I want to code an application to support it without Blender.Right now I can extract the vertices,face datas without Blender.However the script stored the UV in a list that each element contains 3 2D-coordinates,which I don’t know how to handle that without Blender.However when print out the f variable in vertexuv function I get this:
# f = mesh.faces[m]
# f.uv = [v.uvco for v in f.verts]
# f.mat = uvlist[m][3]
# f : MFace (124 121 131)
# f.verts : Verts[124], verts[121], verts[131]
# f.uvs : [0.104508, 0.640587] [0.068599, 0.655649], [0.104508, 0.622436]
My understanding is that each face indices are mapped with approriate UVs coord.So based on the text I found I made my script to do this:
vt 0.104508 0.640587
vt 0.068599 0.655649
vt 0.104508 0.622436
f 124/1 121/2 131/3
That however did not work so I guess I am wrong.How can I export the uv if I have the facelists and the uvlists without Blender from this script?Any help will be appreciated.
#2011-11-06 Glogow Poland Mariusz Szkaradek
#2016-01-02 eatrawmeat391
#Wrestle Kingdom 2 (PS2) yobj importer,edit from Rumble Rose script
#press alt+p and select folder with yobj files (example: '...\1200.pac')
#IMPORT:
#-geometry with uv split per material
#-bones
import bpy,struct,os
import Blender
from Blender import *
from struct import *
import math
from math import *
from Blender.Mathutils import *
def create_object_name():
global model_id
ids = []
scene = bpy.data.scenes.active
for mat in Material.Get():
#print mat.name
try:
model_id = int(mat.name.split('-')[0])
ids.append(model_id)
except:pass
try:
model_id = max(ids)+1
except:
model_id = 0
def find_0():
s=''
while(True):
litera = struct.unpack('c',plik.read(1))[0]
if litera=='\x00':
break
else:
s+=litera
return s
def word(long):
s=''
for j in range(0,long):
lit = struct.unpack('c',plik.read(1))[0]
if ord(lit)!=0:
s+=lit
if len(s)>100000:
break
return s
def b(n):
return struct.unpack(n*'b', plik.read(n))
def B(n):
return struct.unpack(n*'B', plik.read(n))
def h(n):
return struct.unpack(n*'h', plik.read(n*2))
def H(n):
return struct.unpack(n*'H', plik.read(n*2))
def i(n):
return struct.unpack(n*'i', plik.read(n*4))
def f(n):
return struct.unpack(n*'f', plik.read(n*4))
def vertexuv():
for m in range(nMat):
#for m in range(nParts):
mesh.materials+=[Material.New()]
mesh.vertexUV = 1
mesh.faceUV = 1
for m in range(len(faceslist)):
for n in range(3):
uv_data = uvlist[m][n]
v_id = faceslist[m][n]
mesh.verts[v_id].uvco = Vector(uv_data)
f = mesh.faces[m]
f.uv = [v.uvco for v in f.verts]
f.mat = uvlist[m][3]
mesh.update()
def drawmesh(name):
global obj,mesh,scene
mesh = bpy.data.meshes.new(name)
mesh.verts.extend(vertexlist)
mesh.faces.extend(faceslist,ignoreDups=True,smooth =1)
scene = bpy.data.scenes.active
obj = scene.objects.new(mesh,name)
mesh.recalcNormals()
mesh.update()
Redraw()
def check_armature():
global armobj,newarm
armobj=None
newarm=None
scn = Scene.GetCurrent()
scene = bpy.data.scenes.active
for object in scene.objects:
if object.getType()=='Armature':
if object.name == 'armature':
scene.objects.unlink(object)
for object in bpy.data.objects:
if object.name == 'armature':
armobj = Blender.Object.Get('armature')
newarm = armobj.getData()
newarm.makeEditable()
for bone in newarm.bones.values():
del newarm.bones[bone.name]
newarm.update()
if armobj==None:
armobj = Blender.Object.New('Armature','armature')
if newarm==None:
newarm = Armature.New('armature')
armobj.link(newarm)
scn.link(armobj)
newarm.drawType = Armature.STICK
armobj.drawMode = Blender.Object.DrawModes.XRAY
def make_bone():
newarm.makeEditable()
for bone_id in range(len(bones)):
bonedata = bones[bone_id]
#bonename = str(bonedata[1][0])
bonename = bonedata[0]
eb = Armature.Editbone()
newarm.bones[bonename] = eb
newarm.update()
def make_bone_parent():
newarm.makeEditable()
for bone_id in range(len(bones)):
bonedata = bones[bone_id]
parent_id = bonedata[1]
bonename = bonedata[0]
if parent_id!=-1:
bone = newarm.bones[bonename]
#boneparent = newarm.bones[str(parent_id)]
boneparent = newarm.bones[bones[parent_id][0]]
bone.parent = boneparent
newarm.update()
def make_bone_position():
newarm.makeEditable()
for bone_id in range(len(bones)):
bonedata = bones[bone_id]
#bonename = str(bonedata[1][0])
bonename = bonedata[0]
pos = bonedata[2]
rot = bonedata[3]
rot = Euler(rot).toMatrix()
bone = newarm.bones[bonename]
if bone.parent:
bone.head = bone.parent.head+Vector(pos) * bone.parent.matrix
tempM = rot*bone.parent.matrix
bone.matrix = tempM
else:
bone.head = Vector(pos)
bone.matrix = rot
bvec = bone.tail- bone.head
bvec.normalize()
bone.tail = bone.head + 0.01 * bvec
newarm.update()
def skeleton():
check_armature()
make_bone()
make_bone_parent()
make_bone_position()
def parser():
global bones,vertexlist,faceslist,uvlist,nMat,nParts
print word(4)
offs = i(18);print offs
bones = []
plik.seek(offs[9]+8)
for a in range(offs[6]):
BoneName = word(16);print BoneName
tx = f(1)[0]
ty = f(1)[0]
tz = f(1)[0]
tw = f(1)[0]
rx = (f(1)[0] * 180) / pi
ry = (f(1)[0] * 180) / pi
rz = (f(1)[0] * 180) / pi
rw = f(1)[0]
parent = i(1)[0]
plik.seek(0xC,1)#seek_cur
qx = f(1)[0]
qy = f(1)[0]
qz = f(1)[0]
qw = f(1)[0]
bones.append([BoneName,parent,[tx,ty,tz],[rx,ry,rz]])
#tfm = (eulerangles rx ry rz) as matrix3
#append tarr [tx,ty,tz]
#append rarr tfm
#append qarr [qx,qy,qz,qw]
#append Barr BoneName
#append Parr parent
skeleton()
plik.seek(offs[8])
print plik.tell()
meshdata = []
for m in range(offs[5]):
back = plik.tell()
data = i(13);print m,data
pos = f(3)
meshdata.append([data,pos])
plik.seek(back+64)
#break
for m in range(offs[5]):
#for m in range(5):
print 'object-',m
vertexlist = []
faceslist = []
uvlist = []
data = meshdata[m][0]
plik.seek(data[8]+40)
back = plik.tell()
for n in range(data[12]):
vertexlist.append(f(3))
i(1)[0]
print plik.tell()
print i(4)
for n in range(data[12]):
f(4)
print plik.tell()
print i(4)
for n in range(data[11]):#weights
print n,f(4)
print plik.tell()
plik.seek(data[5]+8)
print plik.tell()
face_data = []
for n in range(data[3]):
f(8)
i(40)
var = i(4)#;print var
face_data.append(var)
#print plik.tell()
nMat = data[3]
for n in range(data[3]):#nMat
#faceslist = []
#uvlist = []
plik.seek(face_data[n][2]+8)
for k in range(face_data[n][1]):
k,i(4)
#back = plik.tell()
plik.seek(face_data[n][3]+8)
nParts = face_data[n][1]
for k in range(face_data[n][1]):#nParts
#print m,plik.tell()
var = B(32)#;print var
v1 = -1
v2 = -1
uv1 = -1
uv2 = -1
direct = -1
for l in range(var[16]):#nFaces
direct*=-1
#mesh.verts[m].uvco = Vector(uvlist[m])
uv3 = [f(1)[0],1-f(1)[0]]
l,
v3 = i(1)[0]
f(1)
#print v1,v2,v3
if v1!=-1 and v2!=-1:
if direct>0:
faceslist.append([v1,v2,v3])
uvlist.append([uv1,uv2,uv3,n])
#uvlist.append([uv1,uv2,uv3,k])
else:
faceslist.append([v1,v3,v2])
uvlist.append([uv1,uv3,uv2,n])
#uvlist.append([uv1,uv3,uv2,k])
v1=v2
uv1=uv2
v2=v3
uv2=uv3
drawmesh('model-'+str(m))
vertexuv()
Blender.Redraw()
print plik.tell()
def importer(filename):
global plik,dirname,basename,skala,nbBones
basename = sys.basename(filename)
print basename
dirname = sys.dirname(filename)
for file in os.listdir(dirname):
if file.split('.')[-1].lower()=='yobj':
plik = open(dirname+os.sep+file,'rb')
create_object_name()
parser()
Redraw()
plik.close()
Window.FileSelector (importer)
PS: The forums made me confirmed that I was not a robot when previewing the post.After previewing the post all of the texts were gone and this was very annoying.