Voici le script python d'export en couleur
Code:
#!BPY
"""
Name: 'Raydium Export (.tri format)'
Blender: 2.36"
Group: 'Export'
Tooltip: 'Export to .tri format with normals'
"""
#import rpdb2;
#rpdb2.start_embedded_debugger("test",True)
import Blender
from Blender import NMesh
class source:
def __init__(self,filename):
self.file=open(filename,"w")
def writeFaces(self):
scene=Blender.Scene.getCurrent()
self.file.write("1\n") #tri version
for object in scene.getChildren():
objtype=object.getType()
if objtype == "Mesh":
print "ok, it's a mesh"
mesh=object.getData()
vlist=mesh.verts
for face in mesh.faces:
if len(face)!=3:
print "ERROR: NOT A TRIANGLE ONLY MESH ! (select all vertices and use CTRL+T)"
for i in range(3): #triangles only ! (CTRL+T)
indx=vlist.index(face[i])
if(face.image):
u=face.uv[i][0]
v=face.uv[i][1]
self.file.write("%f %f %f %f %f %f %f %f %s\n" % (vlist[indx].co[0],vlist[indx].co[1],vlist[indx].co[2],vlist[indx].no[0],vlist[indx].no[1],vlist[indx].no[2],u,v,face.image.name))
else:
self.file.write("%f %f %f %f %f %f 0 0 rgb(%3.3f,%3.3f,%3.3f)\n" % (vlist[indx][0],vlist[indx][1],vlist[indx][2],vlist[indx].no[0],vlist[indx].no[1],vlist[indx].no[2],face.col[i].r/255.0,face.col[i].g/255.0,face.col[i].b/255.0))
# get the face normals
# self.file.write("GLfloat normals[%d][3] = {\n" % len(mesh.normals) )
# for normal in mesh.normals:
# self.file.write("{ %ff, %ff, %ff },\n" % (normal[0],normal[1],normal[2]))
# self.file.write("};\n\n")
# get the mesh colors
# if mesh.colors:
# self.file.write("char OBJ_HAVE_COLORS=1;\n")
# self.file.write("GLfloat colors[%d][3] = {\n" % len(mesh.colors) )
# for color in mesh.colors:
# self.file.write("{ %ff, %ff, %ff },\n" % (color[0],color[1],color[2]))
# self.file.write("};\n\n")
# else:
# self.file.write("char OBJ_HAVE_COLORS=0;\nGLfloat *colors;\n")
def close(self):
self.file.flush()
self.file.close()
def fs_callback(filename):
if filename.find('.tri', -4) <= 0: filename += '.tri'
obj=source(filename)
obj.writeFaces()
obj.close
print "Exported to %s. Textures must be .tga, uncompressed, origin NOT at lower-left.\n" % (filename)
#fs_callback("tt.tri")
Blender.Window.FileSelector(fs_callback, "Export Raydium Tri")
La modif est consiste juste a rajouter les couleurs des vertices dans le cas d'une face non texturée.
Pour importer il faut utiliser le code suivant:
Code:
#!BPY
"""
Name: 'Raydium Import (.tri format)'
blender: 2.31
Group: 'Import'
Tooltip: 'Import a .tri'
"""
#import rpdb2;
#rpdb2.start_embedded_debugger("test",True)
try:
import nt
os=nt
os.sep='\\'
except:
import posix
os=posix
os.sep='/'
import sys
import Blender
from Blender import NMesh
# This script will include .tri files (Raydium mesh files)
# Do not supports multitexturing yet.
# Python puxxor :)
def fileExists(f):
try:
file = open(f)
except IOError:
exists = 0
else:
exists = 1
return exists
class source:
def __init__(self,filename):
self.filename=filename
self.file=open(filename,"r")
def readFaces(self):
lines = self.file.readlines();
#p,f = os.path.split(self.filename)
#p,f = Blender.sys.splitext(self.filename)
p = Blender.sys.dirname(self.filename)
#f = Blender.sys.basename(self.filename)
os.chdir(p)
print "CWD is now %s" % (p)
scene=Blender.Scene.getCurrent()
mesh = Blender.NMesh.New()
n = 0
bvert = [0, 0, 0]
bu = [0, 0, 0]
bv = [0, 0, 0]
textures = []
textures_index = []
for line in lines:
words = line.split()
if len(words) == 1:
if float(words[0]) != 1.0:
print "ERROR ! must be a .tri version 1 ! use raydium_modler."
else:
vx = float(words[0])
vy = float(words[1])
vz = float(words[2])
nx = float(words[3])
ny = float(words[4])
nz = float(words[5])
bu[n] = float(words[6])
bv[n] = float(words[7])
vert=Blender.NMesh.Vert(vx,vy,vz)
bvert[n]=vert
mesh.verts.append(vert)
n = n + 1
if n == 3:
textured = 1
if words[8][0:4] == "rgb(":
textured = 0
# print words[8][4:-1].split(",")
couls=words[8][4:-1].split(",")
r= float(couls[0])*255
g= float(couls[1])*255
b= float(couls[2])*255
# r = float(words[8][
#print "Raydium rgb() material found.. ignoring !"
#else:
#print "textured face"
bface = Blender.NMesh.Face()
#bface.mode |= Blender.NMesh.FaceModes['TWOSIDE']
if textured == 1:
bface.mode |= Blender.NMesh.FaceModes['TEX']
bface.materialIndex=0
bface.v.append(bvert[0])
bface.v.append(bvert[1])
bface.v.append(bvert[2])
bface.uv.append( (bu[0], bv[0]) )
bface.uv.append( (bu[1], bv[1]) )
bface.uv.append( (bu[2], bv[2]) )
if textured ==0:
bface.mode &= ~Blender.NMesh.FaceModes['TEX']
for n in range(3):
col =NMesh.Col()
col.r=int(r)
col.g=int(g)
col.b=int(b)
col.a=255
bface.col.append(col)
if textured == 1:
found = -1
for t in range(len(textures)):
if textures[t] == words[8]:
found = textures_index[t]
if found == -1:
print "texture (%s)is not cached yet: loading" % (words[8])
if fileExists(words[8]) == 0:
print "Cannot access to %s" % (words[8])
sys.exit(3)
found = Blender.Image.Load(words[8])
textures.append(words[8])
textures_index.append(found)
bface.image = found
mesh.faces.append(bface)
n = 0
object = Blender.NMesh.PutRaw(mesh)
object.name = "tri"
print "end."
def close(self):
#self.file.flush()
self.file.close()
def importTRI(filename):
if filename.find('.tri', -4) <= 0: filename += '.tri'
obj=source(filename)
obj.readFaces()
obj.close
print "Imported."
def filesel_callback(filename):
test = importTRI(filename)
Blender.Window.FileSelector(filesel_callback, "Import TRI")
Les modifs etaient plus complete, et je n'ai jamais fait de python, alors n'hesite pas a y regarder à deux fois.
Les modifs n'ont lieu que si textured=0
D'apres ce que j'ai lui il faut affecter les valeurs UV avant les couleurs.
Bon tests.
J'aurais bien aimé y rajouter la transparence, mais elle ne sera pas lu par les texture raydium.
Bon maitenant je teste le deuxième viewport !
A+
ouille