Cycles Test App:
authorThomas Dinges <blender@dingto.org>
Sun, 25 Dec 2011 13:34:18 +0000 (13:34 +0000)
committerThomas Dinges <blender@dingto.org>
Sun, 25 Dec 2011 13:34:18 +0000 (13:34 +0000)
* Added some new integrator parameters to the xml reading.
* Added ability to specify window width/height, if not set it uses film/camera width/height.
* Added back the xml exporter script from cycles branch, with modifications to hock up into the UI. To use it, copy the script into 2.61/scripts/startup.

Note: This is intended for developers for now, but the standalone Cycles app has potential to be used as benchmark for example.

intern/cycles/app/cycles_test.cpp
intern/cycles/app/cycles_xml.cpp
intern/cycles/app/io_export_cycles_xml.py [new file with mode: 0644]

index d162dbf12a9d794e5c93f4081b36aa1654fa6ebf..d9386f7514190822966ddef49378fd16f44baac5 100644 (file)
@@ -109,12 +109,15 @@ static void session_init()
        options.scene = NULL;
 }
 
-static void scene_init()
+static void scene_init(int width, int height)
 {
        options.scene = new Scene(options.scene_params);
        xml_read_file(options.scene, options.filepath.c_str());
-       options.width = options.scene->camera->width;
-       options.height = options.scene->camera->height;
+       
+       if (width == 0 || height == 0) {
+               options.width = options.scene->camera->width;
+               options.height = options.scene->camera->height;
+       }
 }
 
 static void session_exit()
@@ -194,8 +197,8 @@ static int files_parse(int argc, const char *argv[])
 
 static void options_parse(int argc, const char **argv)
 {
-       options.width= 1024;
-       options.height= 512;
+       options.width= 0;
+       options.height= 0;
        options.filepath = "";
        options.session = NULL;
        options.quiet = false;
@@ -234,6 +237,8 @@ static void options_parse(int argc, const char **argv)
                "--samples %d", &options.session_params.samples, "Number of samples to render",
                "--output %s", &options.session_params.output_path, "File path to write output image",
                "--threads %d", &options.session_params.threads, "CPU Rendering Threads",
+               "--width  %d", &options.width, "Window width in pixel",
+               "--height %d", &options.height, "Window height in pixel",
                "--help", &help, "Print help message",
                NULL);
        
@@ -287,7 +292,7 @@ static void options_parse(int argc, const char **argv)
        }
 
        /* load scene */
-       scene_init();
+       scene_init(options.width, options.height);
 }
 
 CCL_NAMESPACE_END
index 21b03b56b7a4ae040f8134a00779132a699aaae7..e29a73ec9e865cce427dac8690b452eb943eb139 100644 (file)
@@ -257,7 +257,18 @@ static void xml_read_integrator(const XMLReadState& state, pugi::xml_node node)
 
        xml_read_int(&integrator->min_bounce, node, "min_bounce");
        xml_read_int(&integrator->max_bounce, node, "max_bounce");
+       
+       xml_read_int(&integrator->max_diffuse_bounce, node, "max_diffuse_bounce");
+       xml_read_int(&integrator->max_glossy_bounce, node, "max_glossy_bounce");
+       xml_read_int(&integrator->max_transmission_bounce, node, "max_transmission_bounce");
+       
+       xml_read_int(&integrator->transparent_min_bounce, node, "transparent_min_bounce");
+       xml_read_int(&integrator->transparent_max_bounce, node, "transparent_max_bounce");
+       
+       xml_read_bool(&integrator->transparent_shadows, node, "transparent_shadows");
        xml_read_bool(&integrator->no_caustics, node, "no_caustics");
+       
+       xml_read_int(&integrator->seed, node, "seed");
 }
 
 /* Camera */
diff --git a/intern/cycles/app/io_export_cycles_xml.py b/intern/cycles/app/io_export_cycles_xml.py
new file mode 100644 (file)
index 0000000..2314d93
--- /dev/null
@@ -0,0 +1,143 @@
+#
+# Copyright 2011, Blender Foundation.
+#
+# 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.
+#
+
+# 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 != 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 = ""
+        P = ""
+
+        for v in mesh.vertices:
+            P += "%f %f %f  " % (v.co[0], v.co[1], v.co[2])
+
+        for i, f in enumerate(mesh.faces):
+            nverts += str(len(f.vertices)) + " "
+
+            for v in f.vertices:
+                verts += str(v) + " "
+            verts += " "
+
+        node = etree.Element('mesh', attrib={'nverts': nverts, 'verts': verts, 'P': P})
+        
+        # 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()
+