forked from bartvdbraak/blender
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:
parent
8510196eca
commit
b7be4525bd
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user