forked from bartvdbraak/blender
e4f2b2be26
Engine is not stored in WorkSpaces. That defines the "context" engine, which is used for the entire UI. The engine used for the poll of nodes (add node menu, new nodes when "Use Nodes") is obtained from context. Introduce a ViewRender struct for viewport settings that are defined for workspaces and scene. This struct will be populated with the hand-picked settings that can be defined per workspace as per the 2.8 design. * use_scene_settings * properties editor: workshop + organize context path Use Scene Settings ================== For viewport drawing, Workspaces have an option to use the Scene render settings (F12) instead of the viewport settings. This way users can quickly preview the final render settings, engine and View Layer. This will affect all the editors in that workspace, and it will be clearly indicated in the top-bar. Properties Editor: Add Workspace and organize context path ========================================================== We now have the properties of: Scene, Scene > Layer, Scene > World, Workspace [Scene | Workspace] > Render Layer > Object [Scene | Workspace] > Render Layer > Object > Data (...) Reviewers: Campbell Barton, Julian Eisel Differential Revision: https://developer.blender.org/D2842
152 lines
4.1 KiB
Python
152 lines
4.1 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):
|
|
return context.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()
|
|
|
|
|