io_scene_vrml2: move to contrib: T63750
This commit is contained in:
parent
fc73dfda8b
commit
1614612f83
|
@ -1,161 +0,0 @@
|
|||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8-80 compliant>
|
||||
|
||||
bl_info = {
|
||||
"name": "VRML2 (Virtual Reality Modeling Language)",
|
||||
"author": "Campbell Barton",
|
||||
"blender": (2, 74, 0),
|
||||
"location": "File > Export",
|
||||
"description": "Exports mesh objects to VRML2, supporting vertex and material colors",
|
||||
"warning": "",
|
||||
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
|
||||
"Scripts/Import-Export/VRML2",
|
||||
"support": 'OFFICIAL',
|
||||
"category": "Import-Export"}
|
||||
|
||||
if "bpy" in locals():
|
||||
import importlib
|
||||
if "export_vrml2" in locals():
|
||||
importlib.reload(export_vrml2)
|
||||
|
||||
|
||||
import os
|
||||
import bpy
|
||||
from bpy.props import (
|
||||
CollectionProperty,
|
||||
StringProperty,
|
||||
BoolProperty,
|
||||
EnumProperty,
|
||||
FloatProperty,
|
||||
)
|
||||
from bpy_extras.io_utils import (
|
||||
ExportHelper,
|
||||
orientation_helper,
|
||||
path_reference_mode,
|
||||
axis_conversion,
|
||||
)
|
||||
|
||||
|
||||
@orientation_helper(axis_forward='Z', axis_up='Y')
|
||||
class ExportVRML(bpy.types.Operator, ExportHelper):
|
||||
"""Export mesh objects as a VRML2, colors and texture coordinates"""
|
||||
bl_idname = "export_scene.vrml2"
|
||||
bl_label = "Export VRML2"
|
||||
|
||||
filename_ext = ".wrl"
|
||||
filter_glob: StringProperty(default="*.wrl", options={'HIDDEN'})
|
||||
|
||||
use_selection: BoolProperty(
|
||||
name="Selection Only",
|
||||
description="Export selected objects only",
|
||||
default=False,
|
||||
)
|
||||
|
||||
use_mesh_modifiers: BoolProperty(
|
||||
name="Apply Modifiers",
|
||||
description="Apply Modifiers to the exported mesh",
|
||||
default=True,
|
||||
)
|
||||
use_color: BoolProperty(
|
||||
name="Vertex Colors",
|
||||
description="Export the active vertex color layer",
|
||||
default=True,
|
||||
)
|
||||
color_type: EnumProperty(
|
||||
name='Color',
|
||||
items=(
|
||||
('VERTEX', "Vertex Color", ""),
|
||||
('MATERIAL', "Material Color", "")),
|
||||
)
|
||||
use_uv: BoolProperty(
|
||||
name="Texture/UVs",
|
||||
description="Export the active texture and UV coords",
|
||||
default=True,
|
||||
)
|
||||
|
||||
global_scale: FloatProperty(
|
||||
name="Scale",
|
||||
min=0.01, max=1000.0,
|
||||
default=1.0,
|
||||
)
|
||||
|
||||
path_mode = path_reference_mode
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
obj = context.active_object
|
||||
return (obj is not None) and obj.type == 'MESH'
|
||||
|
||||
def execute(self, context):
|
||||
from . import export_vrml2
|
||||
from mathutils import Matrix
|
||||
|
||||
keywords = self.as_keywords(ignore=("axis_forward",
|
||||
"axis_up",
|
||||
"global_scale",
|
||||
"check_existing",
|
||||
"filter_glob",
|
||||
))
|
||||
|
||||
global_matrix = axis_conversion(to_forward=self.axis_forward,
|
||||
to_up=self.axis_up,
|
||||
).to_4x4() * Matrix.Scale(self.global_scale, 4)
|
||||
keywords["global_matrix"] = global_matrix
|
||||
|
||||
filepath = self.filepath
|
||||
filepath = bpy.path.ensure_ext(filepath, self.filename_ext)
|
||||
|
||||
return export_vrml2.save(self, context, **keywords)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
layout.prop(self, "use_selection")
|
||||
layout.prop(self, "use_mesh_modifiers")
|
||||
|
||||
row = layout.row()
|
||||
row.prop(self, "use_uv")
|
||||
row.prop(self, "use_color")
|
||||
row = layout.row()
|
||||
row.active = self.use_color
|
||||
row.prop(self, "color_type")
|
||||
layout.prop(self, "axis_forward")
|
||||
layout.prop(self, "axis_up")
|
||||
layout.prop(self, "global_scale")
|
||||
layout.prop(self, "path_mode")
|
||||
|
||||
|
||||
def menu_func_export(self, context):
|
||||
self.layout.operator(ExportVRML.bl_idname, text="VRML2 (.wrl)")
|
||||
|
||||
|
||||
def register():
|
||||
bpy.utils.register_module(__name__)
|
||||
|
||||
bpy.types.TOPBAR_MT_file_export.append(menu_func_export)
|
||||
|
||||
|
||||
def unregister():
|
||||
bpy.utils.unregister_module(__name__)
|
||||
|
||||
bpy.types.TOPBAR_MT_file_export.remove(menu_func_export)
|
||||
|
||||
if __name__ == "__main__":
|
||||
register()
|
|
@ -1,262 +0,0 @@
|
|||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
import bpy_extras
|
||||
import bmesh
|
||||
import os
|
||||
from bpy_extras import object_utils
|
||||
|
||||
|
||||
def save_bmesh(fw, bm,
|
||||
use_color, color_type, material_colors,
|
||||
use_uv, uv_image,
|
||||
path_mode, copy_set):
|
||||
|
||||
base_src = os.path.dirname(bpy.data.filepath)
|
||||
base_dst = os.path.dirname(fw.__self__.name)
|
||||
|
||||
fw('Shape {\n')
|
||||
fw('\tappearance Appearance {\n')
|
||||
if use_uv:
|
||||
fw('\t\ttexture ImageTexture {\n')
|
||||
filepath = uv_image.filepath
|
||||
filepath_full = os.path.normpath(bpy.path.abspath(filepath, library=uv_image.library))
|
||||
filepath_ref = bpy_extras.io_utils.path_reference(filepath_full, base_src, base_dst, path_mode, "textures", copy_set, uv_image.library)
|
||||
filepath_base = os.path.basename(filepath_full)
|
||||
|
||||
images = [
|
||||
filepath_ref,
|
||||
filepath_base,
|
||||
]
|
||||
if path_mode != 'RELATIVE':
|
||||
images.append(filepath_full)
|
||||
|
||||
fw('\t\t\turl [ %s ]\n' % " ".join(['"%s"' % f for f in images]) )
|
||||
del images
|
||||
del filepath_ref, filepath_base, filepath_full, filepath
|
||||
fw('\t\t}\n') # end 'ImageTexture'
|
||||
else:
|
||||
fw('\t\tmaterial Material {\n')
|
||||
fw('\t\t}\n') # end 'Material'
|
||||
fw('\t}\n') # end 'Appearance'
|
||||
|
||||
fw('\tgeometry IndexedFaceSet {\n')
|
||||
fw('\t\tcoord Coordinate {\n')
|
||||
fw('\t\t\tpoint [ ')
|
||||
v = None
|
||||
for v in bm.verts:
|
||||
fw("%.6f %.6f %.6f " % v.co[:])
|
||||
del v
|
||||
fw(']\n') # end 'point[]'
|
||||
fw('\t\t}\n') # end 'Coordinate'
|
||||
|
||||
if use_color:
|
||||
if color_type == 'MATERIAL':
|
||||
fw('\t\tcolorPerVertex FALSE\n')
|
||||
fw('\t\tcolor Color {\n')
|
||||
fw('\t\t\tcolor [ ')
|
||||
c = None
|
||||
for c in material_colors:
|
||||
fw(c)
|
||||
del c
|
||||
fw(']\n') # end 'color[]'
|
||||
fw('\t\t}\n') # end 'Color'
|
||||
elif color_type == 'VERTEX':
|
||||
fw('\t\tcolorPerVertex TRUE\n')
|
||||
fw('\t\tcolor Color {\n')
|
||||
fw('\t\t\tcolor [ ')
|
||||
v = None
|
||||
c_none = "0.00 0.00 0.00 "
|
||||
color_layer = bm.loops.layers.color.active
|
||||
assert(color_layer is not None)
|
||||
for v in bm.verts:
|
||||
# weak, use first loops color
|
||||
try:
|
||||
l = v.link_loops[0]
|
||||
except:
|
||||
l = None
|
||||
fw(c_none if l is None else ("%.2f %.2f %.2f " % l[color_layer][:]))
|
||||
|
||||
del v
|
||||
fw(']\n') # end 'color[]'
|
||||
fw('\t\t}\n') # end 'Color'
|
||||
|
||||
# ---
|
||||
|
||||
if color_type == 'MATERIAL':
|
||||
fw('\t\tcolorIndex [ ')
|
||||
i = None
|
||||
for f in bm.faces:
|
||||
i = f.material_index
|
||||
if i >= len(material_colors):
|
||||
i = 0
|
||||
fw("%d " % i)
|
||||
del i
|
||||
fw(']\n') # end 'colorIndex[]'
|
||||
elif color_type == 'VERTEX':
|
||||
pass
|
||||
|
||||
if use_uv:
|
||||
fw('\t\ttexCoord TextureCoordinate {\n')
|
||||
fw('\t\t\tpoint [ ')
|
||||
v = None
|
||||
uv_layer = bm.loops.layers.uv.active
|
||||
assert(uv_layer is not None)
|
||||
for f in bm.faces:
|
||||
for l in f.loops:
|
||||
fw("%.4f %.4f " % l[uv_layer].uv[:])
|
||||
|
||||
del f
|
||||
fw(']\n') # end 'point[]'
|
||||
fw('\t\t}\n') # end 'TextureCoordinate'
|
||||
|
||||
# ---
|
||||
|
||||
fw('\t\ttexCoordIndex [ ')
|
||||
i = None
|
||||
for i in range(0, len(bm.faces) * 3, 3):
|
||||
fw("%d %d %d -1 " % (i, i + 1, i + 2))
|
||||
del i
|
||||
fw(']\n') # end 'coordIndex[]'
|
||||
|
||||
fw('\t\tcoordIndex [ ')
|
||||
f = fv = None
|
||||
for f in bm.faces:
|
||||
fv = f.verts[:]
|
||||
fw("%d %d %d -1 " % (fv[0].index, fv[1].index, fv[2].index))
|
||||
del f, fv
|
||||
fw(']\n') # end 'coordIndex[]'
|
||||
|
||||
fw('\t}\n') # end 'IndexedFaceSet'
|
||||
fw('}\n') # end 'Shape'
|
||||
|
||||
|
||||
def save_object(fw, global_matrix,
|
||||
depsgraph, scene, obj,
|
||||
use_mesh_modifiers,
|
||||
use_color, color_type,
|
||||
use_uv,
|
||||
path_mode, copy_set):
|
||||
|
||||
assert(obj.type == 'MESH')
|
||||
|
||||
if use_mesh_modifiers:
|
||||
is_editmode = (obj.mode == 'EDIT')
|
||||
if is_editmode:
|
||||
bpy.ops.object.editmode_toggle()
|
||||
|
||||
obj_eval = obj.evaluated_get(depsgraph)
|
||||
me = obj_eval.to_mesh()
|
||||
bm = bmesh.new()
|
||||
bm.from_mesh(me)
|
||||
obj_eval.to_mesh_clear()
|
||||
|
||||
if is_editmode:
|
||||
bpy.ops.object.editmode_toggle()
|
||||
else:
|
||||
me = obj.data
|
||||
if obj.mode == 'EDIT':
|
||||
bm_orig = bmesh.from_edit_mesh(me)
|
||||
bm = bm_orig.copy()
|
||||
else:
|
||||
bm = bmesh.new()
|
||||
bm.from_mesh(me)
|
||||
|
||||
# triangulate first so tessellation matches the view-port.
|
||||
bmesh.ops.triangulate(bm, faces=bm.faces)
|
||||
bm.transform(global_matrix * obj.matrix_world)
|
||||
|
||||
# default empty
|
||||
material_colors = []
|
||||
uv_image = None
|
||||
|
||||
if use_color:
|
||||
if color_type == 'VERTEX':
|
||||
if bm.loops.layers.color.active is None:
|
||||
# fallback to material
|
||||
color_type = 'MATERIAL'
|
||||
if color_type == 'MATERIAL':
|
||||
if not me.materials:
|
||||
use_color = False
|
||||
else:
|
||||
material_colors = [
|
||||
"%.2f %.2f %.2f " % (m.diffuse_color[:] if m else (1.0, 1.0, 1.0))
|
||||
for m in me.materials]
|
||||
assert(color_type in {'VERTEX', 'MATERIAL'})
|
||||
|
||||
if use_uv:
|
||||
if bm.loops.layers.uv.active is None:
|
||||
use_uv = False
|
||||
uv_image = object_utils.object_image_guess(obj, bm=bm)
|
||||
if uv_image is None:
|
||||
use_uv = False
|
||||
|
||||
save_bmesh(fw, bm,
|
||||
use_color, color_type, material_colors,
|
||||
use_uv, uv_image,
|
||||
path_mode, copy_set)
|
||||
|
||||
bm.free()
|
||||
|
||||
|
||||
def save(operator,
|
||||
context,
|
||||
filepath="",
|
||||
global_matrix=None,
|
||||
use_selection=False,
|
||||
use_mesh_modifiers=True,
|
||||
use_color=True,
|
||||
color_type='MATERIAL',
|
||||
use_uv=True,
|
||||
path_mode='AUTO'):
|
||||
|
||||
scene = context.scene
|
||||
depsgraph = context.evaluated_depsgraph_get()
|
||||
|
||||
# store files to copy
|
||||
copy_set = set()
|
||||
|
||||
file = open(filepath, 'w', encoding='utf-8')
|
||||
fw = file.write
|
||||
fw('#VRML V2.0 utf8\n')
|
||||
fw('#modeled using blender3d http://blender.org\n')
|
||||
|
||||
if use_selection:
|
||||
objects = context.selected_objects
|
||||
else:
|
||||
objects = scene.objects
|
||||
|
||||
for obj in objects:
|
||||
if obj.type == 'MESH':
|
||||
fw("\n# %r\n" % obj.name)
|
||||
save_object(fw, global_matrix,
|
||||
depsgraph, scene, obj,
|
||||
use_mesh_modifiers,
|
||||
use_color, color_type,
|
||||
use_uv,
|
||||
path_mode, copy_set)
|
||||
|
||||
file.close()
|
||||
|
||||
# copy all collected files.
|
||||
bpy_extras.io_utils.path_reference_copy(copy_set)
|
||||
|
||||
return {'FINISHED'}
|
Loading…
Reference in New Issue