forked from bartvdbraak/blender
ee36e75b85
This was already mixed a bit, but the dot belongs there.
153 lines
4.2 KiB
Python
153 lines
4.2 KiB
Python
#
|
|
# Copyright 2011-2013 Blender Foundation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
# XML exporter for generating test files, not intended for end users
|
|
|
|
import os
|
|
import xml.etree.ElementTree as etree
|
|
import xml.dom.minidom as dom
|
|
|
|
import bpy
|
|
from bpy_extras.io_utils import ExportHelper
|
|
from bpy.props import PointerProperty, StringProperty
|
|
|
|
def strip(root):
|
|
root.text = None
|
|
root.tail = None
|
|
|
|
for elem in root:
|
|
strip(elem)
|
|
|
|
def write(node, fname):
|
|
strip(node)
|
|
|
|
s = etree.tostring(node)
|
|
s = dom.parseString(s).toprettyxml()
|
|
|
|
f = open(fname, "w")
|
|
f.write(s)
|
|
|
|
class CyclesXMLSettings(bpy.types.PropertyGroup):
|
|
@classmethod
|
|
def register(cls):
|
|
bpy.types.Scene.cycles_xml = PointerProperty(
|
|
type=cls,
|
|
name="Cycles XML export Settings",
|
|
description="Cycles XML export settings")
|
|
cls.filepath = StringProperty(
|
|
name='Filepath',
|
|
description='Filepath for the .xml file',
|
|
maxlen=256,
|
|
default='',
|
|
subtype='FILE_PATH')
|
|
|
|
@classmethod
|
|
def unregister(cls):
|
|
del bpy.types.Scene.cycles_xml
|
|
|
|
# User Interface Drawing Code
|
|
class RenderButtonsPanel():
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "render"
|
|
|
|
@classmethod
|
|
def poll(self, context):
|
|
rd = context.scene.render
|
|
return rd.engine == 'CYCLES'
|
|
|
|
|
|
class PHYSICS_PT_fluid_export(RenderButtonsPanel, bpy.types.Panel):
|
|
bl_label = "Cycles XML Exporter"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
cycles = context.scene.cycles_xml
|
|
|
|
#layout.prop(cycles, "filepath")
|
|
layout.operator("export_mesh.cycles_xml")
|
|
|
|
|
|
# Export Operator
|
|
class ExportCyclesXML(bpy.types.Operator, ExportHelper):
|
|
bl_idname = "export_mesh.cycles_xml"
|
|
bl_label = "Export Cycles XML"
|
|
|
|
filename_ext = ".xml"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
return (context.active_object is not None)
|
|
|
|
def execute(self, context):
|
|
filepath = bpy.path.ensure_ext(self.filepath, ".xml")
|
|
|
|
# get mesh
|
|
scene = context.scene
|
|
object = context.active_object
|
|
|
|
if not object:
|
|
raise Exception("No active object")
|
|
|
|
mesh = object.to_mesh(scene, True, 'PREVIEW')
|
|
|
|
if not mesh:
|
|
raise Exception("No mesh data in active object")
|
|
|
|
# generate mesh node
|
|
nverts = ""
|
|
verts = ""
|
|
uvs = ""
|
|
P = ""
|
|
|
|
for v in mesh.vertices:
|
|
P += "%f %f %f " % (v.co[0], v.co[1], v.co[2])
|
|
|
|
verts_and_uvs = zip(mesh.tessfaces, mesh.tessface_uv_textures.active.data)
|
|
|
|
for f, uvf in verts_and_uvs:
|
|
vcount = len(f.vertices)
|
|
nverts += str(vcount) + " "
|
|
|
|
for v in f.vertices:
|
|
verts += str(v) + " "
|
|
|
|
uvs += str(uvf.uv1[0]) + " " + str(uvf.uv1[1]) + " "
|
|
uvs += str(uvf.uv2[0]) + " " + str(uvf.uv2[1]) + " "
|
|
uvs += str(uvf.uv3[0]) + " " + str(uvf.uv3[1]) + " "
|
|
if vcount==4:
|
|
uvs += " " + str(uvf.uv4[0]) + " " + str(uvf.uv4[1]) + " "
|
|
|
|
|
|
node = etree.Element('mesh', attrib={'nverts': nverts.strip(), 'verts': verts.strip(), 'P': P, 'UV' : uvs.strip()})
|
|
|
|
# write to file
|
|
write(node, filepath)
|
|
|
|
return {'FINISHED'}
|
|
|
|
def register():
|
|
bpy.utils.register_module(__name__)
|
|
|
|
def unregister():
|
|
bpy.utils.unregister_module(__name__)
|
|
|
|
if __name__ == "__main__":
|
|
register()
|
|
|
|
|