Scripts: updated Bart's (thanks) vrml97 and x3d exporters, adding also doc link to the script's web page and commenting out two uneeded prints in each script.

This commit is contained in:
Willian Padovani Germano 2005-05-22 18:50:46 +00:00
parent 8510196eca
commit b7be4525bd
2 changed files with 136 additions and 145 deletions

@ -5,7 +5,7 @@ Blender: 235
Group: 'Export' Group: 'Export'
Submenu: 'All Objects...' all Submenu: 'All Objects...' all
Submenu: 'Selected Objects...' selected Submenu: 'Selected Objects...' selected
Tooltip: 'Export to VRML97 (VRML2) file format (.wrl)' Tooltip: 'Export to VRML97 file (.wrl)'
""" """
__author__ = ("Rick Kimball", "Ken Miller", "Steve Matthews", "Bart") __author__ = ("Rick Kimball", "Ken Miller", "Steve Matthews", "Bart")
@ -13,10 +13,10 @@ __url__ = ["blender", "elysiun",
"Author's (Rick) homepage, http://kimballsoftware.com/blender", "Author's (Rick) homepage, http://kimballsoftware.com/blender",
"Author's (Bart) homepage, http://www.neeneenee.de/vrml", "Author's (Bart) homepage, http://www.neeneenee.de/vrml",
"Complete online documentation, http://www.neeneenee.de/blender/x3d/exporting_web3d.html"] "Complete online documentation, http://www.neeneenee.de/blender/x3d/exporting_web3d.html"]
__version__ = "2005/04/09" __version__ = "2005/04/20"
__bpydoc__ = """\ __bpydoc__ = """\
This script exports to VRML97 format, which used to be called VRML2. This script exports to VRML97 format.
Usage: Usage:
@ -34,7 +34,7 @@ for each texture);<br>
# $Id$ # $Id$
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# VRML97 exporter for blender 2.33 or above # VRML97 exporter for blender 2.36 or above
# #
# ***** BEGIN GPL LICENSE BLOCK ***** # ***** BEGIN GPL LICENSE BLOCK *****
# #
@ -64,8 +64,12 @@ for each texture);<br>
import Blender import Blender
from Blender import Object, NMesh, Lamp, Draw, BGL, Image, Text from Blender import Object, NMesh, Lamp, Draw, BGL, Image, Text
from Blender.Scene import Render from Blender.Scene import Render
from os.path import exists, join try:
pytinst = 1 from os.path import exists, join
pytinst = 1
except:
print "No Python installed, for full features install Python (http://www.python.org/)."
pytinst = 0
import math import math
#################################### ####################################
@ -75,6 +79,7 @@ import math
scene = Blender.Scene.getCurrent() scene = Blender.Scene.getCurrent()
world = Blender.World.Get() world = Blender.World.Get()
worldmat = Blender.Texture.Get() worldmat = Blender.Texture.Get()
filename = Blender.Get('filename')
_safeOverwrite = True _safeOverwrite = True
radD=math.pi/180.0 radD=math.pi/180.0
ARG='' ARG=''
@ -109,6 +114,8 @@ class VRML2Export:
def __init__(self, filename): def __init__(self, filename):
#--- public you can change these --- #--- public you can change these ---
self.wire = 0
self.proto = 1
self.matonly = 0 self.matonly = 0
self.share = 0 self.share = 0
self.billnode = 0 self.billnode = 0
@ -123,7 +130,8 @@ class VRML2Export:
#--- class private don't touch --- #--- class private don't touch ---
self.texNames={} # dictionary of textureNames self.texNames={} # dictionary of textureNames
self.matNames={} # dictionary of materiaNames self.matNames={} # dictionary of materialNames
self.meshNames={} # dictionary of meshNames
self.indentLevel=0 # keeps track of current indenting self.indentLevel=0 # keeps track of current indenting
self.filename=filename self.filename=filename
self.file = open(filename, "w") self.file = open(filename, "w")
@ -147,6 +155,7 @@ class VRML2Export:
"Scene.001","Scene.002","Scene.003","Scene.004","Scene.005","Scene.06","Scene.013", "Scene.001","Scene.002","Scene.003","Scene.004","Scene.005","Scene.06","Scene.013",
"Scene.006","Scene.007","Scene.008","Scene.009","Scene.010","Scene.011","Scene.012", "Scene.006","Scene.007","Scene.008","Scene.009","Scene.010","Scene.011","Scene.012",
"World","World.000","World.001","World.002","World.003","World.004","World.005" ] "World","World.000","World.001","World.002","World.003","World.004","World.005" ]
self.namesFog=[ "","LINEAR","EXPONENTIAL","" ]
########################################################## ##########################################################
# Writing nodes routines # Writing nodes routines
@ -155,7 +164,9 @@ class VRML2Export:
def writeHeader(self): def writeHeader(self):
self.file.write("#VRML V2.0 utf8\n\n") self.file.write("#VRML V2.0 utf8\n\n")
self.file.write("# This file was authored with Blender (http://www.blender.org/)\n") self.file.write("# This file was authored with Blender (http://www.blender.org/)\n")
self.file.write("# Exported using VRML97 exporter v1.50\n\n") self.file.write("# Blender version %s\n" % Blender.Get('version'))
self.file.write("# Blender file %s\n" % filename)
self.file.write("# Exported using VRML97 exporter v1.50 (2005/04/20)\n\n")
def writeInline(self): def writeInline(self):
inlines = Blender.Scene.Get() inlines = Blender.Scene.Get()
@ -178,11 +189,18 @@ class VRML2Export:
for i in range(alltext): for i in range(alltext):
nametext = textEditor[i].getName() nametext = textEditor[i].getName()
nlines = textEditor[i].getNLines() nlines = textEditor[i].getNLines()
if (nametext == "web3d" or nametext == "web3d.js" or nametext == "web3d.txt") and (nlines != None): if (self.proto == 1):
nalllines = len(textEditor[i].asLines()) if (nametext == "proto" or nametext == "proto.js" or nametext == "proto.txt") and (nlines != None):
alllines = textEditor[i].asLines() nalllines = len(textEditor[i].asLines())
for j in range(nalllines): alllines = textEditor[i].asLines()
self.writeIndented(alllines[j] + "\n") for j in range(nalllines):
self.writeIndented(alllines[j] + "\n")
elif (self.proto == 0):
if (nametext == "route" or nametext == "route.js" or nametext == "route.txt") and (nlines != None):
nalllines = len(textEditor[i].asLines())
alllines = textEditor[i].asLines()
for j in range(nalllines):
self.writeIndented(alllines[j] + "\n")
self.writeIndented("\n") self.writeIndented("\n")
def writeViewpoint(self, thisObj): def writeViewpoint(self, thisObj):
@ -191,8 +209,6 @@ class VRML2Export:
lens = (360* (math.atan(ratio *16 / thisObj.data.getLens()) / 3.141593))*(3.141593/180) lens = (360* (math.atan(ratio *16 / thisObj.data.getLens()) / 3.141593))*(3.141593/180)
if lens > 3.14: if lens > 3.14:
lens = 3.14 lens = 3.14
self.writeIndented("DEF %s Viewpoint {\n" % (self.cleanStr(thisObj.name)), 1)
self.writeIndented("description \"%s\" \n" % (thisObj.name))
# get the camera location, subtract 90 degress from X to orient like VRML does # get the camera location, subtract 90 degress from X to orient like VRML does
loc = self.rotatePointForVRML(thisObj.loc) loc = self.rotatePointForVRML(thisObj.loc)
rot = [thisObj.RotX - 1.57, thisObj.RotY, thisObj.RotZ] rot = [thisObj.RotX - 1.57, thisObj.RotY, thisObj.RotZ]
@ -202,10 +218,10 @@ class VRML2Export:
Q1 = self.multiplyQuaternions(Q[0], Q[1]) Q1 = self.multiplyQuaternions(Q[0], Q[1])
Qf = self.multiplyQuaternions(Q1, Q[2]) Qf = self.multiplyQuaternions(Q1, Q[2])
angleAxis = self.quaternionToAngleAxis(Qf) angleAxis = self.quaternionToAngleAxis(Qf)
# write orientation statement self.writeIndented("DEF %s Viewpoint {\n" % (self.cleanStr(thisObj.name)), 1)
self.writeIndented("orientation %3.2f %3.2f %3.2f %3.2f\n" % (angleAxis[0], angleAxis[1], -angleAxis[2], angleAxis[3])) self.writeIndented("description \"%s\" \n" % (thisObj.name))
# write position statement
self.writeIndented("position %3.2f %3.2f %3.2f\n" % (loc[0], loc[1], loc[2])) self.writeIndented("position %3.2f %3.2f %3.2f\n" % (loc[0], loc[1], loc[2]))
self.writeIndented("orientation %3.2f %3.2f %3.2f %3.2f\n" % (angleAxis[0], angleAxis[1], -angleAxis[2], angleAxis[3]))
self.writeIndented("fieldOfView %.3f\n" % (lens)) self.writeIndented("fieldOfView %.3f\n" % (lens))
self.writeIndented("}\n", -1) self.writeIndented("}\n", -1)
self.writeIndented("\n") self.writeIndented("\n")
@ -218,18 +234,11 @@ class VRML2Export:
grd0, grd1, grd2 = grd[0], grd[1], grd[2] grd0, grd1, grd2 = grd[0], grd[1], grd[2]
else: else:
return return
if (mtype == 1): if (mtype == 1 or mtype == 2):
self.writeIndented("Fog {\n",1) self.writeIndented("Fog {\n",1)
self.writeIndented("fogType \"LINEAR\"\n") self.writeIndented("fogType \"%s\"\n" % self.namesFog[mtype])
self.writeIndented("color %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + "\n") self.writeIndented("color %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + "\n")
self.writeIndented("visibilityRange " + str(round(mparam[2],self.cp)) + "\n") self.writeIndented("visibilityRange %s\n" % round(mparam[2],self.cp))
self.writeIndented("}\n",-1)
self.writeIndented("\n")
elif (mtype == 2):
self.writeIndented("Fog {\n",1)
self.writeIndented("fogType \"EXPONENTIAL\"\n")
self.writeIndented("color %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + "\n")
self.writeIndented("visibilityRange " + str(round(mparam[2],self.cp)) + "\n")
self.writeIndented("}\n",-1) self.writeIndented("}\n",-1)
self.writeIndented("\n") self.writeIndented("\n")
else: else:
@ -255,7 +264,6 @@ class VRML2Export:
self.writeIndented(" \n") self.writeIndented(" \n")
def writeSpotLight(self, object, lamp): def writeSpotLight(self, object, lamp):
safeName = self.cleanStr(object.name)
if len(world) > 0: if len(world) > 0:
ambi = world[0].getAmb() ambi = world[0].getAmb()
ambientIntensity = ((float(ambi[0] + ambi[1] + ambi[2]))/3)/2.5 ambientIntensity = ((float(ambi[0] + ambi[1] + ambi[2]))/3)/2.5
@ -276,24 +284,19 @@ class VRML2Export:
location=self.rotVertex(om, (0,0,0)); location=self.rotVertex(om, (0,0,0));
radius = lamp.dist*math.cos(beamWidth) radius = lamp.dist*math.cos(beamWidth)
self.writeIndented("DEF %s SpotLight {\n" % safeName,1) self.writeIndented("DEF %s SpotLight {\n" % self.cleanStr(object.name),1)
self.writeIndented("radius %s\n" % (round(radius,self.cp))) self.writeIndented("radius %s\n" % (round(radius,self.cp)))
self.writeIndented("ambientIntensity %s\n" % (round(ambientIntensity,self.cp))) self.writeIndented("ambientIntensity %s\n" % (round(ambientIntensity,self.cp)))
self.writeIndented("intensity %s\n" % (round(intensity,self.cp))) self.writeIndented("intensity %s\n" % (round(intensity,self.cp)))
self.writeIndented("color %s %s %s\n" % (round(lamp.col[0],self.cp), self.writeIndented("color %s %s %s\n" % (round(lamp.col[0],self.cp), round(lamp.col[1],self.cp), round(lamp.col[2],self.cp)))
round(lamp.col[1],self.cp),
round(lamp.col[2],self.cp)))
self.writeIndented("beamWidth %s\n" % (round(beamWidth,self.cp))) self.writeIndented("beamWidth %s\n" % (round(beamWidth,self.cp)))
self.writeIndented("cutOffAngle %s\n" % (round(cutOffAngle,self.cp))) self.writeIndented("cutOffAngle %s\n" % (round(cutOffAngle,self.cp)))
self.writeIndented("direction %s %s %s\n" % (round(dx,3),round(dy,3),round(dz,3))) self.writeIndented("direction %s %s %s\n" % (round(dx,3),round(dy,3),round(dz,3)))
self.writeIndented("location %s %s %s\n" % (round(location[0],3), self.writeIndented("location %s %s %s\n" % (round(location[0],3), round(location[1],3), round(location[2],3)))
round(location[1],3),
round(location[2],3)))
self.writeIndented("}\n",-1) self.writeIndented("}\n",-1)
self.writeIndented("\n") self.writeIndented("\n")
def writeDirectionalLight(self, object, lamp): def writeDirectionalLight(self, object, lamp):
safeName = self.cleanStr(object.name)
if len(world) > 0: if len(world) > 0:
ambi = world[0].getAmb() ambi = world[0].getAmb()
ambientIntensity = ((float(ambi[0] + ambi[1] + ambi[2]))/3)/2.5 ambientIntensity = ((float(ambi[0] + ambi[1] + ambi[2]))/3)/2.5
@ -303,18 +306,15 @@ class VRML2Export:
intensity=min(lamp.energy/1.5, 1.0) intensity=min(lamp.energy/1.5, 1.0)
(dx,dy,dz)=self.computeDirection(object) (dx,dy,dz)=self.computeDirection(object)
self.writeIndented("DEF %s DirectionalLight {\n" % safeName,1) self.writeIndented("DEF %s DirectionalLight {\n" % self.cleanStr(object.name),1)
self.writeIndented("ambientIntensity %s\n" % (round(ambientIntensity,self.cp))) self.writeIndented("ambientIntensity %s\n" % (round(ambientIntensity,self.cp)))
self.writeIndented("color %s %s %s\n" % (round(lamp.col[0],self.cp), self.writeIndented("color %s %s %s\n" % (round(lamp.col[0],self.cp), round(lamp.col[1],self.cp), round(lamp.col[2],self.cp)))
round(lamp.col[1],self.cp),
round(lamp.col[2],self.cp)))
self.writeIndented("intensity %s\n" % (round(intensity,self.cp))) self.writeIndented("intensity %s\n" % (round(intensity,self.cp)))
self.writeIndented("direction %s %s %s\n" % (round(dx,4),round(dy,4),round(dz,4))) self.writeIndented("direction %s %s %s\n" % (round(dx,4),round(dy,4),round(dz,4)))
self.writeIndented("}\n",-1) self.writeIndented("}\n",-1)
self.writeIndented("\n") self.writeIndented("\n")
def writePointLight(self, object, lamp): def writePointLight(self, object, lamp):
safeName = self.cleanStr(object.name)
if len(world) > 0: if len(world) > 0:
ambi = world[0].getAmb() ambi = world[0].getAmb()
ambientIntensity = ((float(ambi[0] + ambi[1] + ambi[2]))/3)/2.5 ambientIntensity = ((float(ambi[0] + ambi[1] + ambi[2]))/3)/2.5
@ -325,15 +325,11 @@ class VRML2Export:
location=self.rotVertex(om, (0,0,0)); location=self.rotVertex(om, (0,0,0));
intensity=min(lamp.energy/1.5,1.0) intensity=min(lamp.energy/1.5,1.0)
radius = lamp.dist radius = lamp.dist
self.writeIndented("DEF %s PointLight {\n" % safeName,1) self.writeIndented("DEF %s PointLight {\n" % self.cleanStr(object.name),1)
self.writeIndented("ambientIntensity %s\n" % (round(ambientIntensity,self.cp))) self.writeIndented("ambientIntensity %s\n" % (round(ambientIntensity,self.cp)))
self.writeIndented("color %s %s %s\n" % (round(lamp.col[0],self.cp), self.writeIndented("color %s %s %s\n" % (round(lamp.col[0],self.cp), round(lamp.col[1],self.cp), round(lamp.col[2],self.cp)))
round(lamp.col[1],self.cp),
round(lamp.col[2],self.cp)))
self.writeIndented("intensity %s\n" % (round(intensity,self.cp))) self.writeIndented("intensity %s\n" % (round(intensity,self.cp)))
self.writeIndented("location %s %s %s\n" % (round(location[0],3), self.writeIndented("location %s %s %s\n" % (round(location[0],3), round(location[1],3), round(location[2],3)))
round(location[1],3),
round(location[2],3)))
self.writeIndented("radius %s\n" % radius ) self.writeIndented("radius %s\n" % radius )
self.writeIndented("}\n",-1) self.writeIndented("}\n",-1)
self.writeIndented("\n") self.writeIndented("\n")
@ -348,9 +344,7 @@ class VRML2Export:
location=self.rotVertex(om, (0,0,0)); location=self.rotVertex(om, (0,0,0));
self.writeIndented("%s {\n" % objectname,1) self.writeIndented("%s {\n" % objectname,1)
self.writeIndented("# direction %s %s %s\n" % (round(dx,3),round(dy,3),round(dz,3))) self.writeIndented("# direction %s %s %s\n" % (round(dx,3),round(dy,3),round(dz,3)))
self.writeIndented("# location %s %s %s\n" % (round(location[0],3), self.writeIndented("# location %s %s %s\n" % (round(location[0],3), round(location[1],3), round(location[2],3)))
round(location[1],3),
round(location[2],3)))
self.writeIndented("}\n",-1) self.writeIndented("}\n",-1)
self.writeIndented("\n") self.writeIndented("\n")
def createDef(self, name): def createDef(self, name):
@ -398,6 +392,7 @@ class VRML2Export:
vColors={} # 'multi':1 vColors={} # 'multi':1
meshName = self.cleanStr(object.name) meshName = self.cleanStr(object.name)
mesh=object.getData() mesh=object.getData()
meshME = self.cleanStr(mesh.name)
for face in mesh.faces: for face in mesh.faces:
if face.mode & Blender.NMesh.FaceModes['HALO'] and self.halonode == 0: if face.mode & Blender.NMesh.FaceModes['HALO'] and self.halonode == 0:
self.writeIndented("Billboard {\n",1) self.writeIndented("Billboard {\n",1)
@ -434,9 +429,7 @@ class VRML2Export:
om = object.getMatrix(); om = object.getMatrix();
location=self.rotVertex(om, (0,0,0)); location=self.rotVertex(om, (0,0,0));
self.writeIndented("Transform {\n",1) self.writeIndented("Transform {\n",1)
self.writeIndented("translation %s %s %s\n" % (round(location[0],3), self.writeIndented("translation %s %s %s\n" % (round(location[0],3), round(location[1],3), round(location[2],3)),1)
round(location[1],3),
round(location[2],3)),1)
self.writeIndented("children [\n") self.writeIndented("children [\n")
self.writeIndented("DEF %s Shape {\n" % meshName,1) self.writeIndented("DEF %s Shape {\n" % meshName,1)
@ -450,7 +443,7 @@ class VRML2Export:
# right now this script can only handle a single material per mesh. # right now this script can only handle a single material per mesh.
if len(maters) >= 1: if len(maters) >= 1:
mat=Blender.Material.Get(maters[0].name) mat=Blender.Material.Get(maters[0].name)
self.writeMaterial(mat, self.createDef(maters[0].name)) self.writeMaterial(mat, self.cleanStr(maters[0].name,''))
if len(maters) > 1: if len(maters) > 1:
print "Warning: mesh named %s has multiple materials" % meshName print "Warning: mesh named %s has multiple materials" % meshName
print "Warning: only one material per object handled" print "Warning: only one material per object handled"
@ -474,45 +467,54 @@ class VRML2Export:
if object.drawType == Blender.Object.DrawTypes.WIRE: if object.drawType == Blender.Object.DrawTypes.WIRE:
# user selected WIRE=2 on the Drawtype=Wire on (F9) Edit page # user selected WIRE=2 on the Drawtype=Wire on (F9) Edit page
ifStyle="IndexedLineSet" ifStyle="IndexedLineSet"
self.wire = 1
else: else:
# user selected BOUNDS=1, SOLID=3, SHARED=4, or TEXTURE=5 # user selected BOUNDS=1, SOLID=3, SHARED=4, or TEXTURE=5
ifStyle="IndexedFaceSet" ifStyle="IndexedFaceSet"
# look up mesh name, use it if available
if self.meshNames.has_key(meshME):
self.writeIndented("geometry %s {\n" % ifStyle, 1) self.writeIndented("geometry USE ME_%s\n" % meshME)
if object.drawType != Blender.Object.DrawTypes.WIRE: self.meshNames[meshME]+=1
if bTwoSided == 1: else:
self.writeIndented("solid FALSE\n") if int(mesh.users) > 1:
self.writeIndented("geometry DEF ME_%s %s {\n" % (meshME, ifStyle), 1)
self.meshNames[meshME]=1
else: else:
self.writeIndented("solid TRUE\n") self.writeIndented("geometry %s {\n" % ifStyle, 1)
if object.drawType != Blender.Object.DrawTypes.WIRE:
if bTwoSided == 1:
self.writeIndented("solid FALSE\n")
else:
self.writeIndented("solid TRUE\n")
#--- output coordinates #--- output coordinates
self.writeCoordinates(object, mesh, meshName) self.writeCoordinates(object, mesh, meshName)
if object.drawType != Blender.Object.DrawTypes.WIRE: if object.drawType != Blender.Object.DrawTypes.WIRE:
#--- output textureCoordinates if UV texture used #--- output textureCoordinates if UV texture used
if mesh.hasFaceUV(): if mesh.hasFaceUV():
if hasImageTexture == 1: if hasImageTexture == 1:
self.writeTextureCoordinates(mesh) self.writeTextureCoordinates(mesh)
elif self.matonly == 1 and self.share == 1: elif self.matonly == 1 and self.share == 1:
self.writeFaceColors(mesh) self.writeFaceColors(mesh)
for face in mesh.faces: for face in mesh.faces:
if face.smooth: if face.smooth:
issmooth=1 issmooth=1
if issmooth==1: if issmooth==1 and self.wire == 0:
creaseAngle=(mesh.getMaxSmoothAngle())*radD creaseAngle=(mesh.getMaxSmoothAngle())*radD
self.writeIndented("creaseAngle %s\n" % (round(creaseAngle,self.cp))) self.writeIndented("creaseAngle %s\n" % (round(creaseAngle,self.cp)))
#--- output vertexColors #--- output vertexColors
if self.share == 1 and self.matonly == 0: if self.share == 1 and self.matonly == 0:
self.writeVertexColors(mesh) self.writeVertexColors(mesh)
self.matonly = 0 #--- output closing braces
self.share = 0 self.writeIndented("}\n", -1)
#--- output closing braces
self.writeIndented("}\n", -1)
self.writeIndented("}\n", -1) self.writeIndented("}\n", -1)
self.writeIndented("]\n", -1) self.writeIndented("]\n", -1)
self.matonly = 0
self.share = 0
self.wire = 0
self.writeIndented("}\n", -1) self.writeIndented("}\n", -1)
if self.halonode == 1: if self.halonode == 1:
@ -547,10 +549,7 @@ class VRML2Export:
location=self.rotVertex(mm, (0,0,0)); location=self.rotVertex(mm, (0,0,0));
for vertex in meshVertexList: for vertex in meshVertexList:
v=self.rotVertex(mm, vertex); v=self.rotVertex(mm, vertex);
self.file.write("%s %s %s, " % self.file.write("%s %s %s, " % (round((v[0]-location[0]),self.vp), round((v[1]-location[1]),self.vp), round((v[2]-location[2]),self.vp) ))
(round((v[0]-location[0]),self.vp),
round((v[1]-location[1]),self.vp),
round((v[2]-location[2]),self.vp) ))
self.writeIndented("\n", 0) self.writeIndented("\n", 0)
self.writeIndented("]\n", -1) self.writeIndented("]\n", -1)
self.writeIndented("}\n", -1) self.writeIndented("}\n", -1)
@ -581,9 +580,7 @@ class VRML2Export:
self.writeIndented("texCoord TextureCoordinate {\n", 1) self.writeIndented("texCoord TextureCoordinate {\n", 1)
self.writeIndented("point [\n\t\t\t\t\t\t", 1) self.writeIndented("point [\n\t\t\t\t\t\t", 1)
for i in range(len(texCoordList)): for i in range(len(texCoordList)):
self.file.write("%s %s, " % self.file.write("%s %s, " % (round(texCoordList[i][0],self.tp), round(texCoordList[i][1],self.tp)))
(round(texCoordList[i][0],self.tp),
round(texCoordList[i][1],self.tp)))
self.writeIndented("\n", 0) self.writeIndented("\n", 0)
self.writeIndented("]\n", -1) self.writeIndented("]\n", -1)
self.writeIndented("}\n", -1) self.writeIndented("}\n", -1)
@ -634,7 +631,7 @@ class VRML2Export:
def writeMaterial(self, mat, matName): def writeMaterial(self, mat, matName):
# look up material name, use it if available # look up material name, use it if available
if self.matNames.has_key(matName): if self.matNames.has_key(matName):
self.writeIndented("material USE %s\n" % matName) self.writeIndented("material USE MA_%s\n" % matName)
self.matNames[matName]+=1 self.matNames[matName]+=1
return; return;
@ -656,25 +653,13 @@ class VRML2Export:
specB = (mat.specCol[2]+0.001)/(1.05/(mat.getSpec()+0.001)) specB = (mat.specCol[2]+0.001)/(1.05/(mat.getSpec()+0.001))
transp = 1-mat.alpha transp = 1-mat.alpha
self.writeIndented("material DEF %s Material {\n" % matName, 1) self.writeIndented("material DEF MA_%s Material {\n" % matName, 1)
self.writeIndented("diffuseColor %s %s %s" % self.writeIndented("diffuseColor %s %s %s\n" % (round(diffuseR,self.cp), round(diffuseG,self.cp), round(diffuseB,self.cp)))
(round(diffuseR,self.cp), round(diffuseG,self.cp), round(diffuseB,self.cp)) + self.writeIndented("ambientIntensity %s\n" % (round(ambient,self.cp)))
"\n") self.writeIndented("specularColor %s %s %s\n" % (round(specR,self.cp), round(specG,self.cp), round(specB,self.cp)))
self.writeIndented("ambientIntensity %s" % self.writeIndented("emissiveColor %s %s %s\n" % (round(emisR,self.cp), round(emisG,self.cp), round(emisB,self.cp)))
(round(ambient,self.cp))+ self.writeIndented("shininess %s\n" % (round(shininess,self.cp)))
"\n") self.writeIndented("transparency %s\n" % (round(transp,self.cp)))
self.writeIndented("specularColor %s %s %s" %
(round(specR,self.cp), round(specG,self.cp), round(specB,self.cp)) +
"\n" )
self.writeIndented("emissiveColor %s %s %s" %
(round(emisR,self.cp), round(emisG,self.cp), round(emisB,self.cp)) +
"\n" )
self.writeIndented("shininess %s" %
(round(shininess,self.cp)) +
"\n" )
self.writeIndented("transparency %s" %
(round(transp,self.cp)) +
"\n")
self.writeIndented("}\n",-1) self.writeIndented("}\n",-1)
def writeImageTexture(self, name): def writeImageTexture(self, name):
@ -706,56 +691,56 @@ class VRML2Export:
self.writeIndented("DEF %s Background {\n" % self.createDef(worldname),1) self.writeIndented("DEF %s Background {\n" % self.createDef(worldname),1)
# No Skytype - just Hor color # No Skytype - just Hor color
if blending == 0: if blending == 0:
self.writeIndented("groundColor %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + "\n") self.writeIndented("groundColor %s %s %s\n" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)))
self.writeIndented("skyColor %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + "\n") self.writeIndented("skyColor %s %s %s\n" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)))
# Blend Gradient # Blend Gradient
elif blending == 1: elif blending == 1:
self.writeIndented("groundColor [ %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + ",") self.writeIndented("groundColor [ %s %s %s, " % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)))
self.writeIndented("%s %s %s" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)) + " ]\n") self.writeIndented("%s %s %s ]\n" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)))
self.writeIndented("groundAngle [ 1.57, 1.57 ]\n") self.writeIndented("groundAngle [ 1.57, 1.57 ]\n")
self.writeIndented("skyColor [ %s %s %s" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)) + ",") self.writeIndented("skyColor [ %s %s %s, " % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)))
self.writeIndented("%s %s %s" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)) + " ]\n") self.writeIndented("%s %s %s ]\n" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)))
self.writeIndented("skyAngle [ 1.57, 1.57 ]\n") self.writeIndented("skyAngle [ 1.57, 1.57 ]\n")
# Blend+Real Gradient Inverse # Blend+Real Gradient Inverse
elif blending == 3: elif blending == 3:
self.writeIndented("groundColor [ %s %s %s" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)) + ", ") self.writeIndented("groundColor [ %s %s %s, " % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)))
self.writeIndented("%s %s %s" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)) + " ]\n") self.writeIndented("%s %s %s ]\n" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)))
self.writeIndented("groundAngle [ 1.57, 1.57 ]\n") self.writeIndented("groundAngle [ 1.57, 1.57 ]\n")
self.writeIndented("skyColor [ %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + ", ") self.writeIndented("skyColor [ %s %s %s, " % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)))
self.writeIndented("%s %s %s" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)) + " ]\n") self.writeIndented("%s %s %s ]\n" %(round(mix0,self.cp), round(mix1,self.cp), round(mix2,self.cp)))
self.writeIndented("skyAngle [ 1.57, 1.57 ]\n") self.writeIndented("skyAngle [ 1.57, 1.57 ]\n")
# Paper - just Zen Color # Paper - just Zen Color
elif blending == 4: elif blending == 4:
self.writeIndented("groundColor %s %s %s" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)) + "\n") self.writeIndented("groundColor %s %s %s\n" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)))
self.writeIndented("skyColor %s %s %s" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)) + "\n") self.writeIndented("skyColor %s %s %s\n" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)))
# Blend+Real+Paper - komplex gradient # Blend+Real+Paper - komplex gradient
elif blending == 7: elif blending == 7:
self.writeIndented("groundColor [ %s %s %s" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)) + ", ") self.writeIndented("groundColor [ %s %s %s, " % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)))
self.writeIndented("%s %s %s" %(round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + " ]\n") self.writeIndented("%s %s %s ]\n" %(round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)))
self.writeIndented("groundAngle [ 1.57, 1.57 ]\n") self.writeIndented("groundAngle [ 1.57, 1.57 ]\n")
self.writeIndented("skyColor [ %s %s %s" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)) + ",") self.writeIndented("skyColor [ %s %s %s, " % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)))
self.writeIndented("%s %s %s" %(round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + " ]\n") self.writeIndented("%s %s %s ]\n" %(round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)))
self.writeIndented("skyAngle [ 1.57, 1.57 ]\n") self.writeIndented("skyAngle [ 1.57, 1.57 ]\n")
# Any Other two colors # Any Other two colors
else: else:
self.writeIndented("groundColor %s %s %s" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)) + "\n") self.writeIndented("groundColor %s %s %s\n" % (round(grd0,self.cp), round(grd1,self.cp), round(grd2,self.cp)))
self.writeIndented("skyColor %s %s %s" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)) + "\n") self.writeIndented("skyColor %s %s %s\n" % (round(sky0,self.cp), round(sky1,self.cp), round(sky2,self.cp)))
alltexture = len(worldmat) alltexture = len(worldmat)
for i in range(alltexture): for i in range(alltexture):
namemat = worldmat[i].getName() namemat = worldmat[i].getName()
pic = worldmat[i].getImage() pic = worldmat[i].getImage()
if (namemat == "back") and (pic != None): if (namemat == "back") and (pic != None):
self.writeIndented("backUrl \"" + str(pic.getName()) + "\"\n") self.writeIndented("backUrl \"%s\"\n" % str(pic.getName()))
elif (namemat == "bottom") and (pic != None): elif (namemat == "bottom") and (pic != None):
self.writeIndented("bottomUrl \"" + str(pic.getName()) + "\"\n") self.writeIndented("bottomUrl \"%s\"\n" % str(pic.getName()))
elif (namemat == "front") and (pic != None): elif (namemat == "front") and (pic != None):
self.writeIndented("frontUrl \"" + str(pic.getName()) + "\"\n") self.writeIndented("frontUrl \"%s\"\n" % str(pic.getName()))
elif (namemat == "left") and (pic != None): elif (namemat == "left") and (pic != None):
self.writeIndented("leftUrl \"" + str(pic.getName()) + "\"\n") self.writeIndented("leftUrl \"%s\"\n" % str(pic.getName()))
elif (namemat == "right") and (pic != None): elif (namemat == "right") and (pic != None):
self.writeIndented("rightUrl \"" + str(pic.getName()) + "\"\n") self.writeIndented("rightUrl \"%s\"\n" % str(pic.getName()))
elif (namemat == "top") and (pic != None): elif (namemat == "top") and (pic != None):
self.writeIndented("topUrl \"" + str(pic.getName()) + "\"\n") self.writeIndented("topUrl \"%s\"\n" % str(pic.getName()))
self.writeIndented("}",-1) self.writeIndented("}",-1)
self.writeIndented("\n\n") self.writeIndented("\n\n")
@ -766,9 +751,11 @@ class VRML2Export:
def export(self, scene, world, worldmat): def export(self, scene, world, worldmat):
print "Info: starting VRML97 export to " + self.filename + "..." print "Info: starting VRML97 export to " + self.filename + "..."
self.writeHeader() self.writeHeader()
self.writeScript()
self.writeNavigationInfo(scene) self.writeNavigationInfo(scene)
self.writeBackground() self.writeBackground()
self.writeFog() self.writeFog()
self.proto = 0
allObj = [] allObj = []
if ARG == 'selected': if ARG == 'selected':
allObj = Blender.Object.GetSelected() allObj = Blender.Object.GetSelected()
@ -1033,7 +1020,7 @@ def select_file(filename):
if(result != 1): if(result != 1):
return return
if not filename.endswith('.wrl'): filename += '.wrl' if filename.find('.wrl', -4) < 0: filename += '.wrl'
wrlexport=VRML2Export(filename) wrlexport=VRML2Export(filename)
wrlexport.export(scene, world, worldmat) wrlexport.export(scene, world, worldmat)
@ -1060,6 +1047,6 @@ except:
if Blender.Get('version') < 235: if Blender.Get('version') < 235:
print "Warning: VRML97 export failed, wrong blender version!" print "Warning: VRML97 export failed, wrong blender version!"
print " You aren't running blender version 2.35 or greater" print " You aren't running blender version 2.35 or greater"
print " download a newer version from http://blender.org/" print " download a newer version from http://blender3d.org/"
else: else:
Blender.Window.FileSelector(select_file,"Export VRML97",createWRLPath()) Blender.Window.FileSelector(select_file,"Export VRML97",createWRLPath())

@ -5,7 +5,7 @@ Blender: 235
Group: 'Export' Group: 'Export'
Submenu: 'All Objects...' all Submenu: 'All Objects...' all
Submenu: 'Selected Objects...' selected Submenu: 'Selected Objects...' selected
Tooltip: 'Export to Extensible 3D file format (.x3d)' Tooltip: 'Export to Extensible 3D file (.x3d)'
""" """
__author__ = ("Bart") __author__ = ("Bart")
@ -16,7 +16,7 @@ __version__ = "2005/05/10"
__bpydoc__ = """\ __bpydoc__ = """\
This script exports to X3D file format. This script exports to X3D format.
Usage: Usage:
@ -64,8 +64,12 @@ for each texture);<br>
import Blender import Blender
from Blender import Object, NMesh, Lamp, Draw, BGL, Image, Text from Blender import Object, NMesh, Lamp, Draw, BGL, Image, Text
from Blender.Scene import Render from Blender.Scene import Render
from os.path import exists, join try:
pytinst = 1 from os.path import exists, join
pytinst = 1
except:
print "No Python installed, for full features install Python (http://www.python.org/)."
pytinst = 0
import math, sys, datetime import math, sys, datetime
#################################### ####################################
@ -1013,7 +1017,7 @@ def select_file(filename):
if(result != 1): if(result != 1):
return return
if not filename.endswith('.x3d'): filename += '.x3d' if filename.find('.x3d', -4) < 0: filename += '.x3d'
wrlexport=VRML2Export(filename) wrlexport=VRML2Export(filename)
wrlexport.export(scene, world, worldmat) wrlexport.export(scene, world, worldmat)