diff -Nru sunflow-0.07.2.svn396+dfsg/debian/changelog sunflow-0.07.2.svn396+dfsg/debian/changelog --- sunflow-0.07.2.svn396+dfsg/debian/changelog 2018-07-03 15:01:58.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/changelog 2019-09-03 16:25:01.000000000 +0000 @@ -1,3 +1,16 @@ +sunflow (0.07.2.svn396+dfsg-18) unstable; urgency=medium + + * Build-Depend on python3-all (Closes: #938599) + * Drop get-orig-source target from debian/rules + * Remove variables related to get-orig-source in debian/rules + * Drop build-dep on cdbs and use dh sequencer + * Update doc-base to for /usr/share/doc/libsunflow-java + * Use debhelper 12 + * Bump Standards-Version to 4.4.0 + * Convert Blender3D sunflow_export.py from Python 2 -> 3 + + -- tony mancill Tue, 03 Sep 2019 09:25:01 -0700 + sunflow (0.07.2.svn396+dfsg-17) unstable; urgency=medium * Team upload. diff -Nru sunflow-0.07.2.svn396+dfsg/debian/compat sunflow-0.07.2.svn396+dfsg/debian/compat --- sunflow-0.07.2.svn396+dfsg/debian/compat 2018-07-03 15:01:58.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/compat 2019-09-03 16:25:01.000000000 +0000 @@ -1 +1 @@ -10 +12 diff -Nru sunflow-0.07.2.svn396+dfsg/debian/control sunflow-0.07.2.svn396+dfsg/debian/control --- sunflow-0.07.2.svn396+dfsg/debian/control 2018-07-03 15:01:58.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/control 2019-09-03 16:25:01.000000000 +0000 @@ -6,14 +6,13 @@ tony mancill Build-Depends: ant, - cdbs (>= 0.4.90~), - debhelper (>= 10), + debhelper (>= 12), default-jdk, dh-python, - python (>= 2.6.6-3~) + python3-all Build-Depends-Indep: janino -Standards-Version: 4.1.4 +Standards-Version: 4.4.0 Homepage: http://sunflow.sourceforge.net/ Vcs-Git: https://salsa.debian.org/java-team/sunflow.git Vcs-Browser: https://salsa.debian.org/java-team/sunflow @@ -24,7 +23,7 @@ default-jre | java8-runtime, libsunflow-java, ${misc:Depends}, - ${python:Depends} + ${python3:Depends} Replaces: libsunflow-java (= 0.07.2.svn396+dfsg-2) Description: rendering system for photo-realistic image synthesis (GUI) diff -Nru sunflow-0.07.2.svn396+dfsg/debian/copyright sunflow-0.07.2.svn396+dfsg/debian/copyright --- sunflow-0.07.2.svn396+dfsg/debian/copyright 2018-07-03 15:01:58.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/copyright 2019-09-03 16:25:01.000000000 +0000 @@ -2,6 +2,9 @@ Upstream-Name: Sunflow - rendering system for photo-realistic image synthesis Upstream-Contact: Christopher Kulla Source: http://sunflow.sourceforge.net/ +Files-Excluded: + *.jar + *.class Files: * Copyright: 2003-2008, Christopher Kulla diff -Nru sunflow-0.07.2.svn396+dfsg/debian/libsunflow-java-doc.doc-base.javadoc sunflow-0.07.2.svn396+dfsg/debian/libsunflow-java-doc.doc-base.javadoc --- sunflow-0.07.2.svn396+dfsg/debian/libsunflow-java-doc.doc-base.javadoc 2018-07-03 15:01:58.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/libsunflow-java-doc.doc-base.javadoc 2019-09-03 16:25:01.000000000 +0000 @@ -5,6 +5,6 @@ Section: Programming Format: HTML -Index: /usr/share/doc/libsunflow-java-doc/api/index.html -Files: /usr/share/doc/libsunflow-java-doc/api/* +Index: /usr/share/doc/libsunflow-java/api/index.html +Files: /usr/share/doc/libsunflow-java/api/* diff -Nru sunflow-0.07.2.svn396+dfsg/debian/patches/40_python3 sunflow-0.07.2.svn396+dfsg/debian/patches/40_python3 --- sunflow-0.07.2.svn396+dfsg/debian/patches/40_python3 1970-01-01 00:00:00.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/patches/40_python3 2019-09-03 16:25:01.000000000 +0000 @@ -0,0 +1,4841 @@ +Description: run sunflow_export.py through 2to3-2.7 +Forwarded: no +Author: tony mancill + +--- a/exporters/blender/sunflow_export.py ++++ b/exporters/blender/sunflow_export.py +@@ -1,2417 +1,2417 @@ +-#!BPY +- +-""" +-Name: 'Sunflow Exporter 1.4.18 (.sc)...' +-Blender: 2.45 +-Group: 'Export' +-Tip: 'Export to a Sunflow Scene File' +- +-Version : 1.4.18 (January 2008) +-Author : R Lindsay (hayfever) / Christopher Kulla / MADCello / +- olivS / Eugene Reilly / Heavily Tessellated / Humfred +-Description : Export to Sunflow renderer http://sunflow.sourceforge.net/ +-Usage : See how to use the script at http://sunflow.sourceforge.net/phpbb2/viewtopic.php?t=125 +- +-***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +- +-***** END GPL LICENCE BLOCK ***** +-""" +- +-####### General Script Properties Section ####### +-################################################# +- +-## Imports ## +-import Blender, os, sys, time #, subprocess +- +-from Blender import Mathutils, Lamp, Object, Scene, Mesh, Material, Draw, BGL, Effect +-from math import * +- +-## Event numbers ## +-CHANGE_EXP = 1 +-NO_EVENT = 2 +-DOF_CAMERA = 3 +-SPHER_CAMERA = 4 +-FISH_CAMERA = 5 +-FILE_TYPE = 6 +-FILTER_EVENT = 7 +-CHANGE_AA = 8 +-CHANGE_SHAD = 9 +-CHANGE_CAM = 10 +-CHANGE_ACC = 11 +-CHANGE_LIGHT = 12 +-CHANGE_BCKGRD = 13 +-CHANGE_GI = 14 +-PHOTON_EVENT = 15 +-gPHOTON_EVENT = 16 +-FORCE_INSTANTGI = 17 +-FORCE_IRRCACHE = 18 +-FORCE_PATHTRACE = 19 +-FORCE_GLOBALS = 20 +-OVERRIDE_CAUSTICS = 21 +-OVERRIDE_GLOBALS = 22 +-OVERRIDE_GI = 23 +-EVENT_CAUSTICS = 24 +-IBL_EVENT = 25 +-EXP_EVT = 26 +-REND_EVT = 27 +-CONV_LAMP = 28 +-QUICK_OPT = 29 +-QUICK_OCC = 30 +-SUN_EVENT = 31 +-BCKGRD_EVENT = 32 +-CBCKGRD_EVENT = 33 +-LOCK_EVENT = 34 +-SET_PATH = 35 +-CHANGE_CFG = 36 +-SET_JAVAPATH = 37 +-SHADER_TYPE = 38 +-SHAD_OK = 39 +-EXPORT_ID = 40 +-DEFAULT_ID = 41 +-IP_COLOR = 42 +-BUCKET_EVENT = 43 +-IMPORT_ID = 44 +-FORCE_OCCLUSION = 45 +-FORCE_FAKEAMB = 46 +- +-## global vars ## +-global FILE, SCENE, IM_HEIGHT, IM_WIDTH, TEXTURES, OBJECTS, IBLLIGHT, LAYERS, SCREEN, SCENE +-global DOFDIST +-FILENAME = Blender.Get('filename').replace(".blend", ".sc") +-SCENE = Blender.Scene.GetCurrent() +-SFPATH = "" +-JAVAPATH = "" +- +-## start of export ## +-print "\n\n" +-print "blend2sunflow v1.4.18" +- +-## Default values of buttons ## +-def default_values(): +- global FILETYPE, MINAA, MAXAA, AASAMPLES, AAJITTER, DSAMPLES, IMGFILTER, IMGFILTERW, IMGFILTERH, BUCKETSIZE,\ +- BUCKETTYPE, REVERSE, DOF, DOFRADIUS, LENSSIDES, LENSROTATION, SPHERICALCAMERA, FISHEYECAMERA, IMP_BCKGRD,\ +- IMP_SUN, BCKGRD, BACKGROUND, SUN_TURB, SUN_SAMPLES, IBL, IBLLOCK, IBLSAMPLES, INFINITEPLANE, IPLANECOLOR,\ +- MESHLIGHTPOWER, LAMPPOWER, CONVLAMP, MEM, THREADS, CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE,\ +- PHOTONRADIUS, INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES, IRRCACHE, IRRSAMPLES, IRRTOLERANCE,\ +- IRRSPACEMIN, IRRSPACEMAX, USEGLOBALS, gPHOTONNUMBER, gPHOTONMAP, gPHOTONESTIMATE, gPHOTONRADIUS, PATHTRACE,\ +- PATHSAMPLES, VIEWCAUSTICS, VIEWGLOBALS, VIEWGI, OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST,\ +- SHADTYPE, QUICKOPT, IPR, EXP_ANIM, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, NOGI, NOCAUSTICS, QUICKOCC, QOCCDIST,\ +- NOGUI, SMALLMESH, IMGFILTERLIST, BUCKETTYPELIST, PHOTONMAPLIST, gPHOTONMAPLIST, FAKEAMB, FAMBSKY, FAMBGROUND +- +- FILETYPE = Draw.Create(1) +- +- # AA panel values +- MINAA = Draw.Create(0) +- MAXAA = Draw.Create(2) +- AASAMPLES = Draw.Create(1) +- AAJITTER = Draw.Create(0) +- DSAMPLES = Draw.Create(16) +- IMGFILTER = Draw.Create(1) +- IMGFILTERW = Draw.Create(1) +- IMGFILTERH = Draw.Create(1) +- BUCKETSIZE = Draw.Create(64) +- BUCKETTYPE = Draw.Create(1) +- REVERSE = Draw.Create(0) +- +- # Camera panel values +- DOF = Draw.Create(0) +- DOFRADIUS = Draw.Create(1.00) +- LENSSIDES = Draw.Create(6) +- LENSROTATION = Draw.Create(0.0) +- SPHERICALCAMERA = Draw.Create(0) +- FISHEYECAMERA = Draw.Create(0) +- +- # Background panel values +- IMP_BCKGRD = Draw.Create(1) +- IMP_SUN = Draw.Create(0) +- BCKGRD = Draw.Create(0.0, 0.0, 0.0) +- BACKGROUND = Draw.Create(0) +- SUN_TURB = Draw.Create(6.0) +- SUN_SAMPLES = Draw.Create(128) +- IBL = Draw.Create(0) +- IBLLOCK = Draw.Create(0) +- IBLSAMPLES = Draw.Create(16) +- INFINITEPLANE = Draw.Create(0) +- IPLANECOLOR= Draw.Create(1.0, 1.0, 1.0) +- +- # Light panel values +- MESHLIGHTPOWER = Draw.Create(100) +- LAMPPOWER = Draw.Create(100) +- CONVLAMP = Draw.Create(0) +- +- # Config panel values +- MEM = Draw.Create(1024) +- THREADS = Draw.Create(0) +- +- # GI/Caustic panel values +- CAUSTICS = Draw.Create(0) +- PHOTONNUMBER = Draw.Create(1000000) +- PHOTONMAP = Draw.Create(1) +- PHOTONESTIMATE = Draw.Create(100) +- PHOTONRADIUS = Draw.Create(0.5) +- INSTANTGI = Draw.Create(0) +- IGISAMPLES = Draw.Create(64) +- IGISETS = Draw.Create(1) +- IGIBIAS = Draw.Create(0.01) +- IGIBIASSAMPLES = Draw.Create(0) +- IRRCACHE = Draw.Create(0) +- IRRSAMPLES = Draw.Create(512) +- IRRTOLERANCE = Draw.Create(0.01) +- IRRSPACEMIN = Draw.Create(0.05) +- IRRSPACEMAX = Draw.Create(5.0) +- USEGLOBALS = Draw.Create(0) +- gPHOTONNUMBER = Draw.Create(1000000) +- gPHOTONMAP = Draw.Create(1) +- gPHOTONESTIMATE = Draw.Create(100) +- gPHOTONRADIUS = Draw.Create(0.5) +- PATHTRACE = Draw.Create(0) +- PATHSAMPLES = Draw.Create(32) +- VIEWCAUSTICS = Draw.Create(0) +- VIEWGLOBALS = Draw.Create(0) +- VIEWGI = Draw.Create(0) +- OCCLUSION = Draw.Create(0) +- OCCBRIGHT = Draw.Create(1.0, 1.0, 1.0) +- OCCDARK = Draw.Create(0.0, 0.0, 0.0) +- OCCSAMPLES = Draw.Create(32) +- OCCDIST = Draw.Create(3.0) +- FAKEAMB = Draw.Create(0) +- FAMBSKY = Draw.Create(1.0, 0.95, 0.65) +- FAMBGROUND = Draw.Create(0.5, 0.8, 1.0) +- +- # Shader panel values +- SHADTYPE = Draw.Create(1) +- +- # Render panel values +- QUICKOPT = Draw.Create(1) +- IPR = Draw.Create(0) +- EXP_ANIM = Draw.Create(0) +- DEPTH_DIFF = Draw.Create(1) +- DEPTH_REFL = Draw.Create(4) +- DEPTH_REFR = Draw.Create(4) +- NOGI = Draw.Create(0) +- NOCAUSTICS = Draw.Create(0) +- QUICKOCC = Draw.Create(0) +- QOCCDIST = Draw.Create(0.5) +- NOGUI = Draw.Create(0) +- SMALLMESH = Draw.Create(0) +- +- ## Lists ## +- IMGFILTERLIST = ["box", "gaussian", "mitchell", "triangle", "catmull-rom", "blackman-harris", "sinc", "lanczos"] +- BUCKETTYPELIST = ["hilbert", "spiral", "column", "row", "diagonal", "random"] +- FILETYPE +- PHOTONMAPLIST = ["kd"] +- gPHOTONMAPLIST = ["grid"] +- +-####### Script Settings Section ####### +-####################################### +- +-## Background and AA settings ## +-# Send background and AA values to Blender as IDs # +-def def_output(): +- global IM_HEIGHT, IM_WIDTH +- # Define Blender's values +- world = Blender.World.GetCurrent() +- horcol = world.getHor() +- horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] +- IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() +- IM_WIDTH = SCENE.getRenderingContext().imageSizeX() +- +- # Writes Scene properties +- SCENE.properties['SceneProp'] = "true" +- SCENE.properties['ImageWidth'] = IM_WIDTH +- SCENE.properties['ImageHeight'] = IM_HEIGHT +- SCENE.properties['MinAA'] = MINAA.val +- SCENE.properties['MaxAA'] = MAXAA.val +- SCENE.properties['Samples'] = AASAMPLES.val +- SCENE.properties['Filter'] = IMGFILTER.val +- if AAJITTER.val == 1: +- SCENE.properties['Jitter'] = "true" +- else: +- SCENE.properties['Jitter'] = "false" +- SCENE.properties['DepthDiff'] = DEPTH_DIFF.val +- SCENE.properties['DepthRefl'] = DEPTH_REFL.val +- SCENE.properties['DepthRefr'] = DEPTH_REFR.val +- if IMP_BCKGRD.val == 1: +- SCENE.properties['Blender Background'] = "true" +- SCENE.properties['HorizonColR'] = horcol0 +- SCENE.properties['HorizonColG'] = horcol1 +- SCENE.properties['HorizonColB'] = horcol2 +- else: +- SCENE.properties['Blender Background'] = "false" +- if BACKGROUND.val == 1: +- SCENE.properties['Script Background'] = "true" +- SCENE.properties['HorizonCol'] = BCKGRD.val +- else: +- SCENE.properties['Script Background'] = "false" +- SCENE.properties['Bucket Size'] = BUCKETSIZE.val +- SCENE.properties['Bucket Type'] = BUCKETTYPE.val +- if REVERSE == 1: +- SCENE.properties['Reverse Bucket'] = "true" +- else: +- SCENE.properties['Reverse Bucket'] = "false" +- +-# Import background and AA values from Blender IDs to script # +-def import_output(): +- global IM_HEIGHT, IM_WIDTH +- # Retrieve Blender's Scene ID values +- world = Blender.World.GetCurrent() +- horcol = world.getHor() +- horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] +- IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() +- IM_WIDTH = SCENE.getRenderingContext().imageSizeX() +- +- if SCENE.properties['SceneProp'] == "true": +- IM_WIDTH = SCENE.properties['ImageWidth'] +- IM_HEIGHT = SCENE.properties['ImageHeight'] +- MINAA.val = SCENE.properties['MinAA'] +- MAXAA.val = SCENE.properties['MaxAA'] +- AASAMPLES.val = SCENE.properties['Samples'] +- IMGFILTER.val = SCENE.properties['Filter'] +- DEPTH_DIFF.val = SCENE.properties['DepthDiff'] +- DEPTH_REFL.val = SCENE.properties['DepthRefl'] +- DEPTH_REFR.val = SCENE.properties['DepthRefr'] +- Draw.Redraw() +- if SCENE.properties['Jitter'] == "true": +- AAJITTER.val = 1 +- Draw.Redraw() +- else: +- AAJITTER.val = 0 +- Draw.Redraw() +- if SCENE.properties['Blender Background'] == "true": +- IMP_BCKGRD.val = 1 +- horcol0 = SCENE.properties['HorizonColR'] +- horcol1 = SCENE.properties['HorizonColG'] +- horcol2 = SCENE.properties['HorizonColB'] +- BACKGROUND.val = 0 +- Draw.Redraw() +- else: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if SCENE.properties['Script Background'] == "true": +- BACKGROUND.val = 1 +- BCKGRD.val = SCENE.properties['HorizonCol'][0], SCENE.properties['HorizonCol'][1], SCENE.properties['HorizonCol'][2] +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- else: +- BACKGROUND.val = 0 +- Draw.Redraw() +- BUCKETSIZE.val = SCENE.properties['Bucket Size'] +- BUCKETTYPE.val = SCENE.properties['Bucket Type'] +- if SCENE.properties['Reverse Bucket'] == "true": +- REVERSE.val = 1 +- Draw.Redraw() +- else: +- REVERSE.val = 0 +- Draw.Redraw() +- +-# Export background and AA values # +-def export_output(): +- print "o exporting output details..." +- FILE.write("image {\n") +- FILE.write("\tresolution %d %d\n" % (IM_WIDTH, IM_HEIGHT)) +- FILE.write("\taa %s %s\n" % (MINAA.val, MAXAA.val)) +- FILE.write("\tsamples %s\n" % AASAMPLES.val) +- FILE.write("\tfilter %s\n" % IMGFILTERLIST[IMGFILTER.val-1]) +- if AAJITTER == 1: +- FILE.write("\tjitter true\n") +- FILE.write("}") +- FILE.write("\n") +- +- print "o exporting trace-depths options..." +- FILE.write("trace-depths {\n") +- FILE.write("\tdiff %s \n" % DEPTH_DIFF) +- FILE.write("\trefl %s \n" % DEPTH_REFL) +- FILE.write("\trefr %s\n" % DEPTH_REFR) +- FILE.write("}") +- FILE.write("\n") +- if IMP_BCKGRD.val == 1: +- print "o exporting background..." +- world = Blender.World.GetCurrent() +- horcol = world.getHor() +- horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] +- FILE.write("background {\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (horcol0, horcol1, horcol2)) +- FILE.write("}") +- FILE.write("\n") +- elif BACKGROUND.val == 1: +- print "o creating background..." +- FILE.write("background {\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % BCKGRD.val) +- FILE.write("}") +- FILE.write("\n") +- if REVERSE.val == 0: +- FILE.write("\nbucket %s %s\n" % (BUCKETSIZE.val, BUCKETTYPELIST[BUCKETTYPE.val-1])) +- elif REVERSE.val == 1: +- FILE.write("\nbucket %s " % BUCKETSIZE.val) +- FILE.write("\"reverse %s\"\n" % BUCKETTYPELIST[BUCKETTYPE.val-1]) +- +-## Caustic and global illumination settings ## +-# Send GI and caustic values to Blender as IDs # +-def def_gi(): +- # Writes GI properties +- if CAUSTICS.val == 1: +- SCENE.properties['Caustics'] = "true" +- SCENE.properties['Caustics Photon Number'] = PHOTONNUMBER.val +- SCENE.properties['Caustics Photon Map'] = PHOTONMAP.val +- SCENE.properties['Caustics Photon Estimate'] = PHOTONESTIMATE.val +- SCENE.properties['Caustics Photon Radius'] = PHOTONRADIUS.val +- else: +- SCENE.properties['Caustics'] = "false" +- if INSTANTGI.val == 1: +- SCENE.properties['IGI'] = "true" +- SCENE.properties['IGI Samples'] = IGISAMPLES.val +- SCENE.properties['IGI Sets'] = IGISETS.val +- SCENE.properties['IGI Bias'] = IGIBIAS.val +- SCENE.properties['IGI Bias Samples'] = IGIBIASSAMPLES.val +- else: +- SCENE.properties['IGI'] = "false" +- if IRRCACHE.val == 1: +- SCENE.properties['IRR'] = "true" +- SCENE.properties['IRR Samples'] = IRRSAMPLES.val +- SCENE.properties['IRR Tolerance'] = IRRTOLERANCE.val +- SCENE.properties['IRR Space Min'] = IRRSPACEMIN.val +- SCENE.properties['IRR Space Max'] = IRRSPACEMAX.val +- else: +- SCENE.properties['IRR'] = "false" +- if USEGLOBALS.val == 1: +- SCENE.properties['Global Photon'] = "true" +- SCENE.properties['Global Photon Num'] = gPHOTONNUMBER.val +- SCENE.properties['Global Photon Map'] = gPHOTONMAP.val +- SCENE.properties['Global Photon Estimate'] = gPHOTONESTIMATE.val +- SCENE.properties['Global Photon Radius'] = gPHOTONRADIUS.val +- else: +- SCENE.properties['Global Photon'] = "false" +- if PATHTRACE.val == 1: +- SCENE.properties['Path Tracing'] = "true" +- SCENE.properties['Path Tracing Samples'] = PATHSAMPLES.val +- else: +- SCENE.properties['Path Tracing'] = "false" +- if OCCLUSION.val ==1: +- SCENE.properties['Global AO'] = "true" +- SCENE.properties['Global AO Bright'] = OCCBRIGHT.val +- SCENE.properties['Global AO Dark'] = OCCDARK.val +- SCENE.properties['Global AO Samples'] = OCCSAMPLES.val +- SCENE.properties['Global AO Distance'] = OCCDIST.val +- else: +- SCENE.properties['Global AO'] = "false" +- if FAKEAMB.val ==1: +- SCENE.properties['Fake Ambient Term'] = "true" +- SCENE.properties['Fake Ambient Term Sky'] = FAMBSKY.val +- SCENE.properties['Fake Ambient Term Ground'] = FAMBGROUND.val +- else: +- SCENE.properties['Fake Ambient Term'] = "false" +- if VIEWCAUSTICS.val == 1: +- SCENE.properties['View Caustics'] = "true" +- else: +- SCENE.properties['View Caustics'] = "false" +- if VIEWGLOBALS.val == 1: +- SCENE.properties['View Globals'] = "true" +- else: +- SCENE.properties['View Globals'] = "false" +- if VIEWGI.val == 1: +- SCENE.properties['View GI'] = "true" +- else: +- SCENE.properties['View GI'] = "false" +- +-# Import GI values from Blender IDs to script # +-def import_gi(): +- # Retrieve Blender's GI/Caustic ID values +- if SCENE.properties['SceneProp'] == "true": +- if SCENE.properties['Caustics'] == "true": +- CAUSTICS.val = 1 +- PHOTONNUMBER.val = SCENE.properties['Caustics Photon Number'] +- PHOTONMAP.val = SCENE.properties['Caustics Photon Map'] +- PHOTONESTIMATE.val = SCENE.properties['Caustics Photon Estimate'] +- PHOTONRADIUS.val = SCENE.properties['Caustics Photon Radius'] +- Draw.Redraw() +- else: +- CAUSTICS.val = 0 +- Draw.Redraw() +- if SCENE.properties['IGI'] == "true": +- INSTANTGI.val = 1 +- IGISAMPLES.val = SCENE.properties['IGI Samples'] +- IGISETS.val = SCENE.properties['IGI Sets'] +- IGIBIAS.val = SCENE.properties['IGI Bias'] +- IGIBIASSAMPLES.val = SCENE.properties['IGI Bias Samples'] +- Draw.Redraw() +- else: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if SCENE.properties['IRR'] == "true": +- IRRCACHE.val = 1 +- IRRSAMPLES.val = SCENE.properties['IRR Samples'] +- IRRTOLERANCE.val = SCENE.properties['IRR Tolerance'] +- IRRSPACEMIN.val = SCENE.properties['IRR Space Min'] +- IRRSPACEMAX.val = SCENE.properties['IRR Space Max'] +- Draw.Redraw() +- else: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if SCENE.properties['Global Photon'] == "true": +- USEGLOBALS.val = 1 +- gPHOTONNUMBER.val = SCENE.properties['Global Photon Num'] +- gPHOTONMAP.val = SCENE.properties['Global Photon Map'] +- gPHOTONESTIMATE.val = SCENE.properties['Global Photon Estimate'] +- gPHOTONRADIUS.val = SCENE.properties['Global Photon Radius'] +- Draw.Redraw() +- else: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if SCENE.properties['Path Tracing'] == "true": +- PATHTRACE.val = 1 +- PATHSAMPLES.val = SCENE.properties['Path Tracing Samples'] +- Draw.Redraw() +- else: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if SCENE.properties['Global AO'] == "true": +- OCCLUSION.val = 1 +- OCCBRIGHT.val = SCENE.properties['Global AO Bright'][0], SCENE.properties['Global AO Bright'][1], SCENE.properties['Global AO Bright'][2] +- OCCDARK.val = SCENE.properties['Global AO Dark'][0], SCENE.properties['Global AO Dark'][1], SCENE.properties['Global AO Dark'][2] +- OCCSAMPLES.val = SCENE.properties['Global AO Samples'] +- OCCDIST.val = SCENE.properties['Global AO Distance'] +- Draw.Redraw() +- else: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if SCENE.properties['Fake Ambient Term'] == "true": +- FAKEAMB.val = 1 +- FAMBSKY.val = SCENE.properties['Fake Ambient Term Sky'][0], SCENE.properties['Fake Ambient Term Sky'][1], SCENE.properties['Fake Ambient Term Sky'][2] +- FAMBGROUND.val = SCENE.properties['Fake Ambient Term Ground'][0], SCENE.properties['Fake Ambient Term Ground'][1], SCENE.properties['Fake Ambient Term Ground'][2] +- Draw.Redraw() +- else: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if SCENE.properties['View Caustics'] == "true": +- VIEWCAUSTICS.val = 1 +- Draw.Redraw() +- else: +- VIEWCAUSTICS.val = 0 +- Draw.Redraw() +- if SCENE.properties['View Globals'] == "true": +- VIEWGLOBALS.val = 1 +- Draw.Redraw() +- else: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if SCENE.properties['View GI'] == "true": +- VIEWGI.val = 1 +- Draw.Redraw() +- else: +- VIEWGI.val = 0 +- Draw.Redraw() +- +-# Export global illumination values # +-def export_gi(): +- #Caustic Settings +- if CAUSTICS.val == 1: +- print "o exporting caustic settings..." +- FILE.write("\nphotons {\n") +- FILE.write("\tcaustics %s" % PHOTONNUMBER.val) +- FILE.write(" %s " % PHOTONMAPLIST[PHOTONMAP.val-1]) +- FILE.write("%s %s\n" % (PHOTONESTIMATE.val, PHOTONRADIUS.val)) +- FILE.write("}\n") +- #Instant GI Settings +- if INSTANTGI.val == 1: +- print "o exporting Instant GI settings..." +- FILE.write("\ngi {\n") +- FILE.write("\ttype igi\n") +- FILE.write("\tsamples %s\n" % IGISAMPLES.val) +- FILE.write("\tsets %s\n" % IGISETS.val) +- FILE.write("\tb %s\n" % IGIBIAS.val) +- FILE.write("\tbias-samples %s\n" % IGIBIASSAMPLES.val) +- FILE.write("}\n") +- #Irradiance Cache GI Settings +- if IRRCACHE.val == 1: +- print "o exporting Irradiance Cache GI settings..." +- FILE.write("\ngi {\n") +- FILE.write("\ttype irr-cache\n") +- FILE.write("\tsamples %s\n" % IRRSAMPLES.val) +- FILE.write("\ttolerance %s\n" % IRRTOLERANCE.val) +- FILE.write("\tspacing %s %s\n" % (IRRSPACEMIN.val, IRRSPACEMAX.val)) +- if USEGLOBALS.val == 0: +- FILE.write("}\n") +- #No Path Tracing on Secondary Bounces in Irradiance Cache Settings +- else: +- FILE.write("\tglobal %s" % gPHOTONNUMBER.val) +- FILE.write(" %s " % gPHOTONMAPLIST[gPHOTONMAP.val-1]) +- FILE.write("%s %s\n" % (gPHOTONESTIMATE.val, gPHOTONRADIUS.val)) +- FILE.write("}\n") +- #Path Tracing GI Settings +- if PATHTRACE.val == 1: +- print "o exporting Path Tracing GI settings..." +- FILE.write("\ngi {\n") +- FILE.write("\ttype path\n") +- FILE.write("\tsamples %s\n" % PATHSAMPLES.val) +- FILE.write("}\n") +- #Ambient Occlusion GI Settings +- if OCCLUSION.val == 1: +- print "o exporting Ambient Occlusion GI settings..." +- FILE.write("\n\ngi {\n") +- FILE.write("\ttype ambocc\n") +- FILE.write("\tbright { \"sRGB nonlinear\" %s %s %s }\n" % OCCBRIGHT.val) +- FILE.write("\tdark { \"sRGB nonlinear\" %s %s %s }\n" % OCCDARK.val) +- FILE.write("\tsamples %s\n" % OCCSAMPLES.val) +- FILE.write("\tmaxdist %s\n}" % OCCDIST.val) +- #Fake Ambient Term GI Settings +- if FAKEAMB.val == 1: +- print "o exporting Fake Ambient Term GI settings..." +- FILE.write("\n\ngi {\n") +- FILE.write("\ttype fake\n") +- FILE.write("\tup 0 1 0\n") +- FILE.write("\tsky { \"sRGB nonlinear\" %s %s %s }\n" % FAMBSKY.val) +- FILE.write("\tground { \"sRGB nonlinear\" %s %s %s }\n" % FAMBGROUND.val) +- FILE.write("\n}") +- #View Overrides +- if VIEWCAUSTICS.val == 1: +- print "o exporting caustic override..." +- FILE.write("\nshader {\n") +- FILE.write("\tname debug_caustics\n") +- FILE.write("\ttype view-caustics\n") +- FILE.write("}\n") +- FILE.write("override debug_caustics false\n") +- if VIEWGLOBALS.val == 1: +- print "o exporting globals override..." +- FILE.write("\nshader {\n") +- FILE.write("\tname debug_globals\n") +- FILE.write("\ttype view-global\n") +- FILE.write("}\n") +- FILE.write("override debug_globals false\n") +- if VIEWGI.val == 1: +- print "o exporting irradiance override..." +- FILE.write("\nshader {\n") +- FILE.write("\tname debug_gi\n") +- FILE.write("\ttype view-irradiance\n") +- FILE.write("}\n") +- FILE.write("override debug_gi false\n") +- +-def export_shaders(): +- print "o exporting shaders..." +- +- #Infinite Plane +- if INFINITEPLANE.val == 1: +- FILE.write("\n\nshader {\n\tname iplane\n\ttype diffuse\n") +- FILE.write("\tdiff %s %s %s \n}" % IPLANECOLOR.val) +- # Add infinite plane object # +- FILE.write("\n\nobject {\n") +- FILE.write("\tshader iplane\n") +- FILE.write("\ttype plane\n") +- FILE.write("\tp 0 0 0\n") +- FILE.write("\tn 0 0 1\n}\n") +- +- # default shader +- FILE.write("\n\nshader {\n\tname def\n\ttype diffuse\n\tdiff 1 1 1\n}") +- materials = Blender.Material.get() +- +- for mat in materials: +- RGB = mat.getRGBCol() +- speccol = mat.getSpecCol() +- textures = mat.getTextures() +- flags = mat.getMode() +- +- if mat.users == 0: +- continue +- +- # UBER shader +- if mat.name.startswith("sfube"): +- textu = textures[0] +- textu2 = textures[2] +- print " o exporting uber shader "+mat.name+"..." +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype uber\n") +- +- # DIFF values +- FILE.write("\tdiff %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) +- if textures[0] <> None and textures[0].tex.getType() == "Image" and textu.tex.getImage() != None: +- colvalue = textu.colfac +- FILE.write("\tdiff.texture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tdiff.blend %s\n" % (colvalue * 1.0)) +- else: +- +- FILE.write("\tdiff.blend 0.0\n") +- +- # SPEC values +- FILE.write("\tspec %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) +- if textures[2] <> None and textures[2].tex.getType() == "Image" and textu2.tex.getImage() != None: +- cspvalue = textu2.varfac +- FILE.write("\tspec.texture \"" + textu2.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tspec.blend %s\n" % (cspvalue * 0.1)) +- else: +- FILE.write("\tspec.blend 0.0\n") +- FILE.write("\tglossy .1\n") +- FILE.write("\tsamples 4\n}") +- +- elif textures[0] <> None and textures[0].tex.getType() == "Image": +- textu = textures[0] +- # image texture without image !!?? +- if textu.tex.getImage() == None: +- print ("You material named " +mat.name+ " have an image texture with no image!") +- print ("replacing with default shader!") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype diffuse\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %s %s %s }\n}" % (1.0, 1.0, 1.0)) +- +- # ambocc texture shader +- elif mat.name.startswith("sfamb"): +- print " o exporting ambient occlusion texture shader "+mat.name+"..." +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype amb-occ\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) +- FILE.write("\tsamples 32\n") +- FILE.write("\tdist 3.0\n}") +- +- # diffuse texture shader +- elif mat.name.startswith("sfdif"): +- print " o exporting diffuse texture shader "+mat.name+"..." +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype diffuse\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") +- +- # phong texture shader +- elif mat.name.startswith("sfpho"): +- print " o exporting phong texture shader "+mat.name+"..." +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype phong\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) +- FILE.write("\tsamples 4\n}") +- +- # ward texture shader +- elif mat.name.startswith("sfwar"): +- print " o exporting ward texture shader "+mat.name+"..." +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype ward\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- speccol = mat.specCol +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) +- FILE.write("\trough .2 .01\n") +- FILE.write("\tsamples 4\n}") +- +- # shiny texture shader +- elif mat.name.startswith("sfshi"): +- print " o exporting shiny texture shader "+mat.name+"..." +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype shiny\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) +- +- # newcommers default diffuse texture shader +- else: +- print " o exporting diffuse texture shader "+mat.name+"..." +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype diffuse\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") +- +- else: +- +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- +- ## diffuse shader +- if mat.name.startswith("sfdif"): +- print " o exporting diffuse shader "+mat.name+"..." +- FILE.write("\ttype diffuse\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) +- +- ## shiny shader +- elif mat.name.startswith("sfshi"): +- print " o exporting shiny shader "+mat.name+"..." +- FILE.write("\ttype shiny\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0], RGB[1], RGB[2])) +- FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) +- +- ## amb-occ shader +- elif mat.name.startswith("sfamb"): +- print " o exporting ambient occlusion shader "+mat.name+"..." +- FILE.write("\ttype amb-occ\n") +- FILE.write("\tbright %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) +- FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) +- FILE.write("\tsamples 32\n") +- FILE.write("\tdist 3.0\n}") +- +- ## phong shader +- elif mat.name.startswith("sfpho"): +- print " o exporting phong shader "+ mat.name+"..." +- FILE.write("\ttype phong\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0],RGB[1],RGB[2])) +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) +- FILE.write("\tsamples 4\n}") +- +- ## ward shader +- elif mat.name.startswith("sfwar"): +- print " o exporting ward shader "+ mat.name+"..." +- FILE.write("\ttype ward\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) +- speccol = mat.specCol +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) +- FILE.write("\trough .2 .01\n") +- FILE.write("\tsamples 4\n}") +- +- ## reflection (mirror) shader +- elif mat.name.startswith("sfmir") and flags & Material.Modes['RAYMIRROR']: +- print " o exporting mirror shader "+mat.name+"..." +- FILE.write("\ttype mirror\n") +- FILE.write("\trefl { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(RGB[0],RGB[1],RGB[2])) +- +- ## glass shader +- elif mat.name.startswith("sfgla") and flags & Material.Modes['RAYTRANSP']: +- print " o exporting glass shader "+mat.name+"..." +- FILE.write("\ttype glass\n") +- FILE.write("\teta " + str(mat.getIOR()) + "\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) +- FILE.write("\tabsorbtion.distance 5.0\n") +- FILE.write("\tabsorbtion.color { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(speccol[0], speccol[1], speccol[2])) +- +- ## constant shader +- elif mat.name.startswith("sfcon"): +- print " o exporting constant shader "+mat.name+"..." +- FILE.write("\ttype constant\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) +- +- ## newcommers default diffuse shader +- else: +- print " o exporting default diffuse shader "+mat.name+"..." +- FILE.write("\ttype diffuse\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) +- +-## Export modifiers ## +-def export_modifiers(): +- print "o exporting modifiers..." +- +- materials = Blender.Material.get() +- modifs_list = [] +- +- for mat in materials: +- +- textures = mat.getTextures() +- flags = mat.getMode() +- +- if textures[1] <> None and textures[1].tex.getType() == "Image": +- textu = textures[1] +- Scale_value = str(textu.norfac * textu.mtNor*-0.001) +- +- if textu.tex.name.startswith("bump"): +- if textu.tex.getName() not in modifs_list: +- modifs_list.append (str(textu.tex.getName())) +- print " o exporting modifier "+str(textu.tex.getName())+"..." +- FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype bump\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tscale %s \n}\n" % Scale_value) +- +- elif textu.tex.name.startswith("normal"): +- if textu.tex.getName() not in modifs_list: +- modifs_list.append (str(textu.tex.getName())) +- print " o exporting modifier "+str(textu.tex.getName())+"..." +- FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype normalmap\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") +- else: +- pass +- +- if textures[3] <> None and textures[3].tex.getType() <> "Image": +- textu = textures[3] +- Scale_value = str(textu.norfac) +- if textu.tex.name.startswith("perlin"): +- if textu.tex.getName() not in modifs_list: +- modifs_list.append (str(textu.tex.getName())) +- print " o exporting modifier "+str(textu.tex.getName())+"..." +- FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype perlin\n") +- FILE.write("\tfunction 0\n") +- FILE.write("\tsize 1\n") +- FILE.write("\tscale %s\n}\n" % Scale_value) +- +- else: +- pass +- +-## Light settings ## +-# Send light values to Blender as IDs # +-def def_lights(): +- #Write light ID properties +- SCENE.properties['LightProp'] = "true" +- SCENE.properties['Lamp Multiplier'] = LAMPPOWER.val +- SCENE.properties['Meshlight Multiplier'] = MESHLIGHTPOWER.val +- SCENE.properties['Light Samples'] = DSAMPLES.val +- SCENE.properties['IBL Samples'] = IBLSAMPLES.val +- if IBL.val == 1: +- SCENE.properties['Image Based Light'] = "true" +- else: +- SCENE.properties['Image Based Light'] = "false" +- if IBLLOCK.val == 1: +- SCENE.properties['IBL Importance Sampling'] = "true" +- else: +- SCENE.properties['IBL Importance Sampling'] = "false" +- if CONVLAMP.val == 1: +- SCENE.properties['Convert Unsupported Lamps'] = "true" +- else: +- SCENE.properties['Convert Unsupported Lamps'] = "false" +- if IMP_SUN.val == 1: +- SCENE.properties['Sun Lamp'] = "true" +- else: +- SCENE.properties['Sun Lamp'] = "false" +- SCENE.properties['Sun Turbidity'] = SUN_TURB.val +- SCENE.properties['Sun Samples'] = SUN_SAMPLES.val +- #Infinite plane ID added here since it's mostly used with sun/sky +- if INFINITEPLANE.val == 1: +- SCENE.properties['Infinite Plane'] = "true" +- else: +- SCENE.properties['Infinite Plane'] = "false" +- SCENE.properties['Infinite Plane Color'] = IPLANECOLOR.val +- +-# Import light values from Blender IDs to script # +-def import_lights(): +- # Retrieve Blender's light ID values including IBL/LOCK +- if SCENE.properties['LightProp'] == "true": +- LAMPPOWER.val = SCENE.properties['Lamp Multiplier'] +- MESHLIGHTPOWER.val = SCENE.properties['Meshlight Multiplier'] +- DSAMPLES.val = SCENE.properties['Light Samples'] +- IBLSAMPLES.val = SCENE.properties['IBL Samples'] +- if SCENE.properties['Convert Unsupported Lamps'] == "true": +- CONVLAMP.val = 1 +- Draw.Redraw() +- else: +- CONVLAMP.val = 0 +- Draw.Redraw() +- if SCENE.properties['Image Based Light'] == "true": +- IBL.val = 1 +- Draw.Redraw() +- else: +- IBL.val = 0 +- Draw.Redraw() +- if SCENE.properties['IBL Importance Sampling'] == "true": +- IBLLOCK.val = 1 +- Draw.Redraw() +- else: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if SCENE.properties['Sun Lamp'] == "true": +- IMP_SUN.val = 1 +- Draw.Redraw() +- else: +- IMP_SUN.val = 0 +- Draw.Redraw() +- SUN_TURB.val = SCENE.properties['Sun Turbidity'] +- SUN_SAMPLES.val = SCENE.properties['Sun Samples'] +- #Infinite plane ID added here since it's mostly used with sun/sky +- if SCENE.properties['Infinite Plane'] == "true": +- INFINITEPLANE.val = 1 +- Draw.Redraw() +- else: +- INFINITEPLANE.val = 0 +- Draw.Redraw() +- IPLANECOLOR.val = SCENE.properties['Infinite Plane Color'][0], SCENE.properties['Infinite Plane Color'][1], SCENE.properties['Infinite Plane Color'][2], +- +-# Export light values # +-def export_lights(lmp): +- # only lamps type 0, 1 and 4 supported at the moment +- # lamp types are: 0 - Lamp, 1 - Sun, 2 - Spot, 3 - Hemi, 4 - Area +- # Spots are replaced by directional (cylinrical) lights: adjust dist as close as possible to the ground receiving the +- # cone of light if you want Radius as close as possible +- lamp = lmp.getData() +- +- red = lamp.col[0] +- green = lamp.col[1] +- blue = lamp.col[2] +- power = lamp.energy * LAMPPOWER.val +- objmatrix = lmp.matrix +- lampV = Mathutils.Vector([0, 0, 0, 1]) +- lampV = lampV * objmatrix +- dist = lamp.getDist() +- print "o exporting lamps" +- +- if lamp.type == 0: +- print " o exporting lamp "+lmp.name+"..." +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype point\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tpower %s\n" % (power)) +- FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("}") +- elif lamp.type == 1: +- if IMP_SUN.val == 1: +- print " o exporting sun-light "+lmp.name+"..." +- invmatrix = Mathutils.Matrix(lmp.getInverseMatrix()) +- FILE.write("\nlight {\n") +- FILE.write("\ttype sunsky\n") +- FILE.write("\tup 0 0 1\n") +- FILE.write("\teast 0 1 0\n") +- FILE.write("\tsundir %f %f %f\n" % (invmatrix[0][2], invmatrix[1][2], invmatrix[2][2])) +- FILE.write("\tturbidity %s\n" % SUN_TURB.val) +- FILE.write("\tsamples %s\n" % SUN_SAMPLES.val) +- FILE.write("}") +- else: +- print " o exporting lamp "+lmp.name+"..." +- # get the location of the lamp +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype point\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tpower %s\n" % (power)) +- FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("}") +- +- elif lamp.type == 4: +- print " o exporting area-light "+lmp.name+"..." +- xsize = lamp.areaSizeX * 0.5 +- if lamp.areaSizeY: +- # If rectangular area: +- print "o exporting rectangular area-light "+lmp.name+"..." +- ysize = lamp.areaSizeY * 0.5 +- else: +- # Else, square area: +- print "o exporting square area-light "+lmp.name+"..." +- ysize = xsize +- lampV0 = Mathutils.Vector([-xsize, ysize, 0, 1]) +- lampV1 = Mathutils.Vector([ xsize, ysize, 0, 1]) +- lampV2 = Mathutils.Vector([ xsize, -ysize, 0, 1]) +- lampV3 = Mathutils.Vector([-xsize, -ysize, 0, 1]) +- +- lampV0 = lampV0 * objmatrix +- lampV1 = lampV1 * objmatrix +- lampV2 = lampV2 * objmatrix +- lampV3 = lampV3 * objmatrix +- +- radiance = lamp.energy * MESHLIGHTPOWER.val +- +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype meshlight\n") +- FILE.write("\tname \"%s\"\n" % (lmp.name)) +- FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tradiance %s\n" % (radiance)) +- FILE.write("\tsamples %s\n" % DSAMPLES.val) +- FILE.write("\tpoints 4\n") +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV0[0], lampV0[1], lampV0[2])) +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV1[0], lampV1[1], lampV1[2])) +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV2[0], lampV2[1], lampV2[2])) +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV3[0], lampV3[1], lampV3[2])) +- FILE.write("\ttriangles 2\n") +- FILE.write("\t\t0 1 2\n") +- FILE.write("\t\t0 2 3\n") +- FILE.write("}") +- elif lamp.type == 2: +- print " o exporting spotlight "+lmp.name+"..." +- targetV = Mathutils.Vector([0, 0, -1, 1]) +- targetV = targetV * objmatrix +- angle = lamp.getSpotSize()*pi/360 +- radius = dist/cos(angle)*sin(angle) +- radiance = lamp.energy * LAMPPOWER.val +- +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype directional\n") +- FILE.write("\tsource %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tradius %s\n" % (radius)) +- FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("}") +- elif lamp.type == 3: +- print " o exporting spherical light "+lmp.name+"..." +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype spherical\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tradiance %s\n" % (power)) +- FILE.write("\tcenter %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("\tradius %s\n" % (dist)) +- FILE.write("\tsamples %s\n" % DSAMPLES.val) +- FILE.write("}") +- else: +- print "Unsupported type lamp detected" +- if CONVLAMP.val == 1: +- print " o exporting lamp "+lmp.name+"..." +- # get the rgb component for the lamp +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype point\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tpower %s\n" % (power)) +- FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("}") +- +-## Export of Image Based Lights ## +-def export_ibl(): +- global IBLLIGHT +- +- try: +- ibllighttext = Blender.Texture.Get("ibllight") +- if ibllighttext <> "": +- if ibllighttext.users > 0: +- if ibllighttext <> None and ibllighttext.getType() == "Image": +- IBLLIGHT = ibllighttext.getImage().getFilename() +- else: +- IBLLIGHT = "" +- else: +- IBLLIGHT = "" +- except: +- IBLLIGHT = "" +- +- if IBL == 1: +- if IBLLIGHT <> "": +- print "o exporting ibllight..." +- print " o using texture %s" % (IBLLIGHT) +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype ibl\n") +- FILE.write("\timage \"%s\"\n" % (IBLLIGHT)) +- FILE.write("\tcenter 1 0 0\n") +- FILE.write("\tup 0 0 1\n") +- if IBLLOCK == 1: +- FILE.write("\tlock false\n") # lock false means "use importance sampling" +- else: +- FILE.write("\tlock true\n") +- FILE.write("\tsamples %s\n" % IBLSAMPLES.val) +- FILE.write("}") +- +-## Camera settings ## +-# Send camera values to Blender as IDs # +-def def_camera(): +- CAMERA=SCENE.objects.camera +- # Writes Scene properties +- CAMERA.properties['CamProp'] = "true" +- CAMERA.properties['DOF Radius'] = DOFRADIUS.val +- CAMERA.properties['Lens Sides'] = LENSSIDES.val +- CAMERA.properties['Lens Rotation'] = LENSROTATION.val +- if DOF.val == 1: +- CAMERA.properties['DOF'] = "true" +- else: +- CAMERA.properties['DOF'] = "false" +- if SPHERICALCAMERA.val == 1: +- CAMERA.properties['Spherical Camera'] = "true" +- else: +- CAMERA.properties['Spherical Camera'] = "false" +- if FISHEYECAMERA.val == 1: +- CAMERA.properties['Fisheye Camera'] = "true" +- else: +- CAMERA.properties['Fisheye Camera'] = "false" +- +-# Import Background and AA values from Blender IDs to script # +-def import_camera(): +- CAMERA=SCENE.objects.camera +- if CAMERA.properties['CamProp'] == "true": +- DOFRADIUS.val = CAMERA.properties['DOF Radius'] +- LENSSIDES.val = CAMERA.properties['Lens Sides'] +- LENSROTATION.val = CAMERA.properties['Lens Rotation'] +- if CAMERA.properties['DOF'] == "true": +- DOF.val = 1 +- Draw.Redraw() +- else: +- DOF.val = 0 +- Draw.Redraw() +- if CAMERA.properties['Spherical Camera'] == "true": +- SPHERICALCAMERA.val = 1 +- Draw.Redraw() +- else: +- SPHERICALCAMERA.val = 0 +- Draw.Redraw() +- if CAMERA.properties['Fisheye Camera'] == "true": +- FISHEYECAMERA.val = 1 +- Draw.Redraw() +- else: +- FISHEYECAMERA.val = 0 +- Draw.Redraw() +- +-# Export camera values # +-def export_camera(cam): +- # get the camera +- camera = cam.getData() +- print "o exporting Camera "+camera.getName()+"..." +- +- # get the object matrix so we can calculate to and up +- objmatrix = cam.matrix +- eyeV = Mathutils.Vector([0, 0, 0, 1]) +- targetV = Mathutils.Vector([0, 0, -1, 1]) +- upV = Mathutils.Vector([0, 1, 0, 0]) +- +- eyeV = eyeV * objmatrix +- targetV = targetV * objmatrix +- upV = upV * objmatrix +- +- # get the fov value +- # image higher than wide? +- if IM_HEIGHT > IM_WIDTH: +- factor=float(IM_WIDTH) / float(IM_HEIGHT) +- # if the image is wider than high, or of equal height and width then: +- else: +- factor=1 +- # fov = 2*(degrees(atan((factor*16.0) / camera.lens))) #Same as below, just uses the python "degrees" instead: +- fov = 360.0 * atan((factor*16.0) / camera.lens) / pi +- DOFDIST=camera.dofDist +- +- FILE.write("\n\ncamera {\n") +- +- if DOF.val == 1: +- camtype = "thinlens" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- FILE.write("\tfov %s \n" % fov) +- FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) +- FILE.write("\tfdist %s \n" % DOFDIST) +- FILE.write("\tlensr %s \n" % DOFRADIUS) +- FILE.write("\tsides %s \n" % LENSSIDES) +- FILE.write("\trotation %s \n" % LENSROTATION) +- elif SPHERICALCAMERA.val == 1: +- camtype = "spherical" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- elif FISHEYECAMERA.val == 1: +- camtype = "fisheye" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- else: +- camtype = "pinhole" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- FILE.write("\tfov %s \n" % fov) +- FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) +- #To be uncommented when 0.07.3 is released +- #FILE.write("\tshift %.2f %.2f\n" % (camera.shiftX, camera.shiftY)) +- FILE.write("}") +- +-## Export method for meshes ## +-def export_geometry(obj): +- islight = obj.name.startswith("meshlight") +- isparticleob = obj.name.startswith("particleob") +- if islight: +- print "o exporting meshlight " + obj.name+"..." +- if isparticleob: +- print "o exporting particle object " + obj.name+"..." +- # get the mesh data +- if obj.getType() <> "Empty": +- mesh = Mesh.New(obj.name) # Note the "mesh.verts = None" at the end of this if. Used to clear the new mesh from memory +- mesh.getFromObject(obj, 0, 1) +- mesh.transform(obj.mat, 1) +- verts = mesh.verts +- faces = mesh.faces +- numverts = verts.__len__() +- +- if numverts > 0: +- if islight: +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype meshlight\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- if len(mesh.materials) >= 1: +- matrl = mesh.materials[0] +- FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (matrl.R, matrl.G, matrl.B)) +- else: +- FILE.write("\temit 1 1 1\n") +- FILE.write("\tradiance %s\n" % (MESHLIGHTPOWER.val)) +- FILE.write("\tsamples %s\n" % DSAMPLES.val) +- FILE.write("\tpoints %d\n" % (numverts)) +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) +- numtris = 0 +- for face in faces: +- num = len(face.verts) +- if num == 4: +- numtris = numtris + 2 +- elif num == 3: +- numtris = numtris + 1 +- FILE.write("\ttriangles %d\n" % (numtris)) +- allsmooth = True +- allflat = True +- for face in faces: +- num = len(face.verts) +- smooth = face.smooth <> 0 +- allsmooth &= smooth +- allflat &= not smooth +- if num == 4: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) +- elif num == 3: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- FILE.write("}") +- +- else: +- FILE.write("\n\nobject {\n") +- if len(mesh.materials) == 1: +- FILE.write("\tshader \"" + mesh.materials[0].name + ".shader\"\n") +- +- ##Check for and write modfiers## +- for mat in mesh.materials: +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu <> None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") +- elif textp <> None and (textp.tex.name.startswith("perlin")): +- FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") +- +- elif len(mesh.materials) > 1: +- FILE.write("\tshaders %d\n" % (len(mesh.materials))) +- +- for mat in mesh.materials: +- FILE.write("\t\t\"" + mat.name + ".shader\"\n") +- +- ##Check for and write modfiers## +- FILE.write("\tmodifiers %d\n" % (len(mesh.materials))) +- for mat in mesh.materials: +- +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu <> None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") +- elif textp <> None and (textp.tex.name.startswith("perlin")): +- FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") +- else: +- FILE.write("\t\t\"" + "None" + "\"\n") +- +- else: +- FILE.write("\tshader def\n") +- ##Particle object section. Works with Sunflow 0.07.3 and up. ## +- # Check if there are particles on the object # +- ob = Object.Get(obj.name) +- if len(ob.effects) <> 0: +- effect = ob.effects[0] +- particles = effect.getParticlesLoc() +- effects= Effect.Get() +- # Check that particles are points only (not static and not vectors) # +- if not effect.getFlag() & Effect.Flags.STATIC or not effect.getStype(): +- FILE.write("\ttype particles\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tpoints %d\n" % (len(particles))) +- for pt in particles: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (pt[0], pt[1], pt[2])) +- FILE.write("\tradius 0.05\n}\n") +- elif type(particles)==list: # Is it a strand or pair? +- if len(particles)>1: +- pointnum = ((len(particles)*effect.getLifetime())*3) +- print "o exporting hair object " + obj.name+"..." +- FILE.write("\ttype hair\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tsegments %d\n" % (effect.getLifetime()-1)) +- FILE.write("\twidth .01\n") +- FILE.write("\tpoints %d" % pointnum) +- for eff in effects: +- for p in eff.getParticlesLoc(): +- if type(p)==list: # Are we a strand or a pair, then add hair data. +- if len(p)>1: +- destData = str() +- for vect in p: +- for elem in vect: +- destData+=" "+str(elem) +- FILE.write("\t%s\n" % (destData)) +- FILE.write("}\n") +- elif isparticleob: +- FILE.write("\ttype particles\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tpoints %d\n" % (numverts)) +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) +- FILE.write("\tradius 0.05\n}\n") +- +- else: +- print "o exporting mesh " + obj.name+"..." +- FILE.write("\ttype generic-mesh\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tpoints %d\n" % (numverts)) +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) +- numtris = 0 +- for face in faces: +- num = len(face.verts) +- if num == 4: +- numtris = numtris + 2 +- elif num == 3: +- numtris = numtris + 1 +- FILE.write("\ttriangles %d\n" % (numtris)) +- allsmooth = True +- allflat = True +- for face in faces: +- num = len(face.verts) +- smooth = face.smooth <> 0 +- allsmooth &= smooth +- allflat &= not smooth +- if num == 4: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) +- elif num == 3: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- +- ## what kind of normals do we have? +- if not islight: +- if allflat: +- FILE.write("\tnormals none\n") +- elif allsmooth: +- FILE.write("\tnormals vertex\n") +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.no[0], vert.no[1], vert.no[2])) +- else: +- FILE.write("\tnormals facevarying\n") +- for face in faces: +- num = len(face.verts) +- if face.smooth <> 0: +- if num == 4: +- index0 = face.verts[0].index +- index1 = face.verts[1].index +- index2 = face.verts[2].index +- index3 = face.verts[3].index +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], +- verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], +- verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], +- verts[index2].no[0], verts[index2].no[1], verts[index2].no[2], +- verts[index3].no[0], verts[index3].no[1], verts[index3].no[2])) +- elif num == 3: +- index0 = face.verts[0].index +- index1 = face.verts[1].index +- index2 = face.verts[2].index +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], +- verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], +- verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) +- else: +- fnx = face.no[0] +- fny = face.no[1] +- fnz = face.no[2] +- if num == 4: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) +- elif num == 3: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) +- # Check for UVs # +- if mesh.faceUV <> 0: +- tx = 1 +- ty = 1 +- if len(mesh.materials) >= 1: +- if len(mesh.materials[0].getTextures()) >= 1: +- if mesh.materials[0].getTextures()[0] <> None: +- tx = mesh.materials[0].getTextures()[0].tex.repeat[0] +- ty = mesh.materials[0].getTextures()[0].tex.repeat[1] +- FILE.write("\tuvs facevarying\n") +- for face in faces: +- num = len(face.verts) +- if num == 4: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[2][0], ty * face.uv[2][1], tx * face.uv[3][0], ty * face.uv[3][1])) +- elif num == 3: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) +- else: +- FILE.write("\tuvs none\n") +- +- # Check for multiple materials on the mesh (face indices) # +- if len(mesh.materials) > 1: +- FILE.write("\tface_shaders\n") +- for face in faces: +- num = len(face.verts) +- if num == 4: +- FILE.write("\t\t%d\n" % (face.mat)) +- FILE.write("\t\t%d\n" % (face.mat)) +- elif num == 3: +- FILE.write("\t\t%d\n" % (face.mat)) +- FILE.write("}\n") +- # This clears the data from the new mesh created. # +- mesh.verts = None +- +- # Look for Instances/Dupligroups # +- if obj.getType() == "Empty": +- ob = Object.Get(obj.name) +- dupe_obs = ob.DupObjects +- dupmatrix = Mathutils.Matrix(ob.getMatrix()) +- group = ob.DupGroup +- if group <> "None": +- for dupe_ob, dup_matrix in dupe_obs: +- dupobmesh = Mesh.Get(dupe_ob.name) +- instancematrix = ob.getMatrix() +- print "o exporting instances of " + dupe_ob.name+"..." +- FILE.write("\n\ninstance {\n") +- FILE.write("\tname %s_%s \n" % (obj.name, dupe_ob.name)) +- FILE.write("\tgeometry %s \n" % dupe_ob.name) +- FILE.write("\ttransform col %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s \n" % (instancematrix[0][0], instancematrix[0][1], instancematrix[0][2], instancematrix[0][3], instancematrix[1][0], instancematrix[1][1], instancematrix[1][2], instancematrix[1][3], instancematrix[2][0], instancematrix[2][1], instancematrix[2][2], instancematrix[2][3], instancematrix[3][0], instancematrix[3][1], instancematrix[3][2], instancematrix[3][3])) +- if len(dupobmesh.materials) == 1: +- FILE.write("\tshader \"" + dupobmesh.materials[0].name + ".shader\"\n") +- +- ##Check for and write modfiers## +- for mat in dupobmesh.materials: +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu <> None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") +- elif textp <> None and (textp.tex.name.startswith("perlin")): +- FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") +- +- elif len(dupobmesh.materials) > 1: +- FILE.write("\tshaders %d\n" % (len(dupobmesh.materials))) +- +- for mat in dupobmesh.materials: +- FILE.write("\t\t\"" + mat.name + ".shader\"\n") +- +- ##Check for and write modfiers## +- FILE.write("\tmodifiers %d\n" % (len(dupobmesh.materials))) +- for mat in dupobmesh.materials: +- +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu <> None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") +- elif textp <> None and (textp.tex.name.startswith("perlin")): +- FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") +- else: +- FILE.write("\t\t\"" + "None" + "\"\n") +- +- else: +- FILE.write("\tshader def\n") +- FILE.write("}\n") +- +-## Main export method ## +-def exportfile(filename): +- global FILE, SCENE, IM_HEIGHT, IM_WIDTH, TEXTURES, OBJECTS, LAYERS, IBLLIGHT, EXP_ANIM, fname, destname +- global PATH +- +- SCENE = Blender.Scene.GetCurrent() +- IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) +- IM_WIDTH = SCENE.getRenderingContext().imageSizeX() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) +- TEXTURES = Blender.Texture.Get() +- +- LAYERS = SCENE.getLayers() +- STARTFRAME = SCENE.getRenderingContext().startFrame() +- ENDFRAME = SCENE.getRenderingContext().endFrame() +- CTX = SCENE.getRenderingContext() +- orig_frame = CTX.currentFrame() +- +- if not filename.endswith(".sc"): +- filename = filename + ".sc" +- fname = filename +- destname = fname.replace(".sc", "") +- +- ANIM = EXP_ANIM.val +- +- if ANIM == 1: +- base = os.path.splitext(os.path.basename(filename))[0] +- FILE = open(filename.replace(".sc", ".java"), "wb") +- FILE.write(""" +-public void build() { +- parse("%s" + ".settings.sc"); +- parse("%s" + "." + getCurrentFrame() + ".sc"); +-} +-""" % (base, base)) +- +- FILE.close() +- FILE = open(filename.replace(".sc", ".settings.sc"), "wb") +- export_output() +- export_gi() +- FILE.close() +- else: +- STARTFRAME = ENDFRAME = orig_frame +- +- for cntr in range(STARTFRAME, ENDFRAME + 1): +- filename = fname +- +- CTX.currentFrame(cntr) +- SCENE.makeCurrent() +- OBJECTS = SCENE.objects +- +- if ANIM == 1: +- filename = filename.replace(".sc", ".%d.sc" % (CTX.currentFrame())) +- +- print "Exporting to: %s" % (filename) +- +- FILE = open(filename, 'wb') +- +- if ANIM == 0: +- export_output() +- export_gi() +- +- export_shaders() +- export_modifiers() +- export_ibl() +- export_camera(SCENE.objects.camera) +- for object in OBJECTS: +- if object.users > 1 and object.layers[0] in LAYERS: +- if object.getType() == 'Lamp': +- export_lights(object) +- if object.getType() == 'Mesh' or object.getType() == 'Surf': +- if object.name.startswith("meshlight"): +- export_geometry(object) +- +- if ANIM == 0: +- FILE.write("\n\ninclude \"%s\"\n" % (os.path.basename(filename).replace(".sc", ".geo.sc"))) +- FILE.close() +- ## open geo file +- filename = filename.replace(".sc", ".geo.sc") +- print "Exporting geometry to: %s" % (filename) +- FILE = open(filename, 'wb') +- +- for object in OBJECTS: +- if object.users > 1 and object.layers[0] in LAYERS: +- if object.getType() == 'Mesh' or object.getType() == 'Surf': +- if not object.name.startswith("meshlight"): +- export_geometry(object) +- +- for object in OBJECTS: +- if object.users > 1 and object.layers[0] in LAYERS: +- if object.getType() == 'Empty': +- export_geometry(object) +- FILE.close() +- +- if ANIM == 1: +- CTX.currentFrame(orig_frame) +- SCENE.makeCurrent() +- +- print "Export finished." +- +-if __name__ == '__main__': +- Blender.Window.FileSelector(exportfile, "Export .sc", Blender.sys.makename(ext=".sc")) +- +-## Global event handler ## +-def event(evt, val): +- if evt == Draw.ESCKEY: +- print "quitting exporter..." +- Draw.Exit() +- +-## Writing of the SF config file ## +-def setpath(SFPATH): +- datadir=Blender.Get("datadir") +- # create 'path2sf.cfg in the .blend/bpydata directory +- f = open(datadir + '/path2sf.cfg', 'w') +- f.write(str(SFPATH)+"\n") +- f.write(str(MEM)+"\n") +- f.write(str(THREADS)+"\n") +- f.close() +- +-def setjavapath(JAVAPATH): +- datadir=Blender.Get("datadir") +- f = open(datadir + '/path2sf.cfg', 'a') +- f.write(str(JAVAPATH)) +- f.close() +- +-## Render to Sunflow from inside the script ## +-# Send render values to Blender as IDs # +-def def_render(): +- # Writes render setting properties +- SCENE.properties['RenderProp'] = "true" +- SCENE.properties['File Type'] = FILETYPE.val +- SCENE.properties['Quick Option'] = QUICKOPT.val +- SCENE.properties['Quick AO Distance'] = QOCCDIST.val +- if NOGUI.val == 1: +- SCENE.properties['-nogui'] = "true" +- else: +- SCENE.properties['-nogui'] = "false" +- if SMALLMESH.val == 1: +- SCENE.properties['-smallmesh'] = "true" +- else: +- SCENE.properties['-smallmesh'] = "false" +- if NOGI.val == 1: +- SCENE.properties['-nogi'] = "true" +- else: +- SCENE.properties['-nogi'] = "false" +- if NOCAUSTICS.val == 1: +- SCENE.properties['-nocaustics'] = "true" +- else: +- SCENE.properties['-nocaustics'] = "false" +- if QUICKOCC.val == 1: +- SCENE.properties['-quick_ambocc'] = "true" +- else: +- SCENE.properties['-quick_ambocc'] = "false" +- if IPR.val == 1: +- SCENE.properties['-ipr'] = "true" +- else: +- SCENE.properties['-ipr'] = "false" +- if EXP_ANIM.val == 1: +- SCENE.properties['animation'] = "true" +- else: +- SCENE.properties['animation'] = "false" +- +-# Import render values from Blender IDs to script # +-def import_render(): +- global EXP_ANIM +- if SCENE.properties['RenderProp'] == "true": +- FILETYPE.val = SCENE.properties['File Type'] +- QUICKOPT.val = SCENE.properties['Quick Option'] +- QOCCDIST.val = SCENE.properties['Quick AO Distance'] +- if SCENE.properties['-nogui'] == "true": +- NOGUI.val = 1 +- Draw.Redraw() +- else: +- NOGUI.val = 0 +- Draw.Redraw() +- if SCENE.properties['-smallmesh'] == "true": +- SMALLMESH.val = 1 +- Draw.Redraw() +- else: +- SMALLMESH.val = 0 +- Draw.Redraw() +- if SCENE.properties['-nogi'] == "true": +- NOGI.val = 1 +- Draw.Redraw() +- else: +- NOGI.val = 0 +- Draw.Redraw() +- if SCENE.properties['-nocaustics'] == "true": +- NOCAUSTICS.val = 1 +- Draw.Redraw() +- else: +- NOCAUSTICS.val = 0 +- Draw.Redraw() +- if SCENE.properties['-quick_ambocc'] == "true": +- QUICKOCC.val = 1 +- Draw.Redraw() +- else: +- QUICKOCC.val = 0 +- Draw.Redraw() +- if SCENE.properties['-ipr'] == "true": +- IPR.val = 1 +- Draw.Redraw() +- else: +- IPR.val = 0 +- Draw.Redraw() +- if SCENE.properties['animation'] == "true": +- EXP_ANIM.val = 1 +- Draw.Redraw() +- else: +- EXP_ANIM.val = 0 +- Draw.Redraw() +- +-# Export render values # +-def render(): +- global COMMAND, memory, threads, sfpath, trial, javapath, fname, destname, STARTFRAME, ENDFRAME +- #exportfile(fname) +- destname = fname.replace(".sc", "") +- STARTFRAME = SCENE.getRenderingContext().startFrame() +- ENDFRAME = SCENE.getRenderingContext().endFrame() +- # Get blenders 'bpydata' directory: +- datadir=Blender.Get("datadir") +- # Check existence of SF config file: +- trial=os.path.exists(datadir+'/path2sf.cfg') +- # Continue rendering if file exists: +- if trial == True: +- print "True" +- # open 'path2sf.cfg' +- f = open(datadir + '/path2sf.cfg', 'r+') +- lines = f.readlines() +- # Remove EOL: +- lines[0]=lines[0].rstrip("\n") +- lines[1]=lines[1].rstrip("\n") +- lines[2]=lines[2].rstrip("\n") +- lines[3]=lines[3].rstrip("\n") +- # Allocate values to variables: +- sfdir = lines[0] +- memory = lines[1] +- threads = lines[2] +- javadir = lines[3] +- f.close() +- +- # base command for executing SF: +- EXEC="%sjava -server -Xmx%sM -jar \"%ssunflow.jar\"" % (javadir, memory, sfdir) +- #print EXEC +- +- # Building the options to be passed to SF: +- if NOGUI == 1: +- option1="-nogui " +- else: +- option1="" +- option2="-threads %s " % THREADS +- if SMALLMESH == 1: +- option3="-smallmesh " +- else: +- option3="" +- if NOGI == 1: +- option4="-nogi " +- else: +- option4="" +- if NOCAUSTICS == 1: +- option5="-nocaustics " +- else: +- option5="" +- if QUICKOPT.val == 1: +- option6="" +- if QUICKOPT.val == 2: +- option6="-quick_uvs " +- elif QUICKOPT.val == 3: +- option6="-quick_normals " +- elif QUICKOPT.val == 4: +- option6="-quick_id " +- elif QUICKOPT.val == 5: +- option6="-quick_prims " +- elif QUICKOPT.val == 6: +- option6="-quick_gray " +- elif QUICKOPT.val == 7: +- option6="-quick_wire -aa 2 3 -filter mitchell " +- if QUICKOCC == 1: +- option7="-quick_ambocc %s " % (QOCCDIST) +- else: +- option7="" +- if IPR == 1: +- option8="-ipr " +- else: +- option8="" +- print option6 +- +- if FILETYPE == 1: +- ext="png" +- elif FILETYPE == 2: +- ext="tga" +- elif FILETYPE == 3: +- ext="hdr" +- elif FILETYPE == 4: +- ext="exr" +- elif FILETYPE == 5: +- ext="igi" +- +- # Definition of the command to render the scene: +- if EXP_ANIM.val == 0: +- COMMAND="%s %s%s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option1, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) +- print COMMAND +- if EXP_ANIM.val == 1: +- COMMAND="%s -anim %s %s -o \"%s.#.%s\" \"%s.java\"" % (EXEC, STARTFRAME, ENDFRAME, destname, ext, destname) +- print COMMAND +- if FILETYPE != 1: +- COMMAND="%s -nogui %s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) +- print COMMAND +- # Execute the command: +- pid=os.system(COMMAND) +- #pid = subprocess.Popen(args=COMMAND, shell=True) +- +-####### GUI button event handler ####### +-######################################## +- +-def buttonEvent(evt): +- global FILE, SCREEN, SETPATH, SETJAVAPATH, FILENAME, SCENE +- +- ## Common events: +- if evt == EXP_EVT: +- Blender.Window.FileSelector(exportfile, "Export .sc", FILENAME) +- +- ## Config file events +- if evt == SET_PATH: +- Blender.Window.FileSelector(setpath, "SET SF PATH", SFPATH) +- setpath(SFPATH) +- if evt == SET_JAVAPATH: +- Blender.Window.FileSelector(setjavapath, "SET JAVA PATH", JAVAPATH) +- setjavapath(JAVAPATH) +- if evt == REND_EVT: +- render() +- +- ## Setting exclusive buttons rules: +- if evt == DOF_CAMERA: +- if DOF.val == 1: +- if SPHERICALCAMERA.val == 1: +- SPHERICALCAMERA.val = 0 +- Draw.Redraw() +- elif FISHEYECAMERA.val == 1: +- FISHEYECAMERA.val = 0 +- Draw.Redraw() +- if evt == SPHER_CAMERA: +- if SPHERICALCAMERA.val == 1: +- if DOF.val == 1: +- DOF.val = 0 +- Draw.Redraw() +- elif FISHEYECAMERA.val == 1: +- FISHEYECAMERA.val = 0 +- Draw.Redraw() +- if evt == FISH_CAMERA: +- if FISHEYECAMERA.val == 1: +- if DOF.val == 1: +- DOF.val = 0 +- Draw.Redraw() +- elif SPHERICALCAMERA.val == 1: +- SPHERICALCAMERA.val = 0 +- Draw.Redraw() +- if evt == FILTER_EVENT: +- Draw.Redraw() +- if evt == BUCKET_EVENT: +- Draw.Redraw() +- if evt == FORCE_INSTANTGI: +- if INSTANTGI.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_IRRCACHE: +- if IRRCACHE.val == 1: +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if IRRCACHE.val == 0: +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if evt == FORCE_PATHTRACE: +- if PATHTRACE.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_OCCLUSION: +- if OCCLUSION.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_FAKEAMB: +- if FAKEAMB.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_GLOBALS: +- if USEGLOBALS.val == 1: +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if IRRCACHE.val == 0: +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 0: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if evt == EVENT_CAUSTICS: +- if CAUSTICS.val == 0: +- if VIEWCAUSTICS.val == 1: +- VIEWCAUSTICS.val = 0 +- Draw.Redraw() +- if evt == OVERRIDE_CAUSTICS: +- if CAUSTICS.val == 0: +- if VIEWCAUSTICS.val == 1: +- VIEWCAUSTICS.val = 0 +- Draw.Redraw() +- if evt == OVERRIDE_GLOBALS: +- if USEGLOBALS.val == 0: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == OVERRIDE_GI: +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if evt == IBL_EVENT: +- if IBL.val == 0: +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if IMP_SUN.val == 1: +- IMP_SUN.val = 0 +- Draw.Redraw() +- if IMP_BCKGRD.val == 1: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if BACKGROUND.val == 1: +- BACKGROUND.val = 0 +- Draw.Redraw() +- if evt == LOCK_EVENT: +- if IBL.val == 0: +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == SUN_EVENT: +- if IMP_BCKGRD.val == 1: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if BACKGROUND.val == 1: +- BACKGROUND.val = 0 +- Draw.Redraw() +- if IBL.val == 1: +- IBL.val = 0 +- Draw.Redraw() +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == BCKGRD_EVENT: +- if IMP_SUN.val == 1: +- IMP_SUN.val = 0 +- Draw.Redraw() +- if IBL.val == 1: +- IBL.val = 0 +- Draw.Redraw() +- if BACKGROUND.val == 1: +- BACKGROUND.val = 0 +- Draw.Redraw() +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == CBCKGRD_EVENT: +- if IMP_SUN.val == 1: +- IMP_SUN.val = 0 +- Draw.Redraw() +- if IBL.val == 1: +- IBL.val = 0 +- Draw.Redraw() +- if IMP_BCKGRD.val == 1: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == QUICK_OPT: +- if QUICKOCC.val == 1: +- QUICKOCC.val = 0 +- Draw.Redraw() +- if evt == QUICK_OCC: +- QUICKOPT.val = 1 +- Draw.Redraw(0) +- +- ## Rules for displaying the different panels: +- if evt == CHANGE_AA: +- SCREEN=0 +- Draw.Redraw() +- return +- if evt == CHANGE_CAM: +- SCREEN=2 +- Draw.Redraw() +- return +- if evt == CHANGE_BCKGRD: +- SCREEN=3 +- Draw.Redraw() +- return +- if evt == CHANGE_LIGHT: +- SCREEN=4 +- Draw.Redraw() +- return +- if evt == CHANGE_GI: +- SCREEN=5 +- Draw.Redraw() +- return +- if evt == CHANGE_SHAD: +- SCREEN=6 +- Draw.Redraw() +- return +- if evt == CHANGE_EXP: +- SCREEN=7 +- Draw.Redraw() +- return +- if evt == CHANGE_CFG: +- SCREEN=8 +- Draw.Redraw() +- return +- # Go back to config panel if user tries to render without configuring SF: +- if evt == REND_EVT and trial == False: +- SCREEN=8 +- Draw.Redraw() +- return +- if evt == SHAD_OK: +- Draw.Redraw() +- return +- # Events for the import and export of ID values and setting of default values +- if evt == EXPORT_ID: +- print " o Sending script settings to .blend..." +- def_output() +- def_gi() +- def_lights() +- def_camera() +- def_render() +- print " o Finished sending settings." +- return +- if evt == DEFAULT_ID: +- default_values() +- print " o Default settings restored." +- return +- if evt == IMPORT_ID: +- try: +- if SCENE.properties['SceneProp'] == "true": +- print " o Script settings found in .blend, importing to script..." +- import_output() +- import_gi() +- import_lights() +- import_camera() +- import_render() +- except: +- print " o No script settings in .blend, using defaults." +- default_values() +- return +- +-# Same as the IMPORT_ID event, but needed it to be a function so we can load it on script start up # +-def auto_import(): +- default_values() +- try: +- if SCENE.properties['SceneProp'] == "true": +- print " o Script settings found in .blend, importing to script..." +- import_output() +- import_gi() +- import_lights() +- import_camera() +- import_render() +- except: +- print " o No script settings in .blend, using defaults." +- default_values() +- return +- +-####### Draw GUI Section ####### +-################################ +- +-## Draws the individual panels ## +-def drawGUI(): +- global SCREEN +- if SCREEN==0: +- drawAA() +- if SCREEN==2: +- drawCamera() +- if SCREEN==3: +- drawBackground() +- if SCREEN==4: +- drawLights() +- if SCREEN==5: +- drawGI() +- if SCREEN==6: +- drawShad() +- if SCREEN==7: +- drawRender() +- if SCREEN==8: +- drawConfig() +- +-## Draw AA options ## +-def drawAA(): +- global MINAA, MAXAA, AASAMPLES, AAJITTER, IMGFILTERW, IMGFILTERH, IMGFILTER +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("AA:") +- col=100; line=145; MINAA=Draw.Number("Min AA", 2, col, line, 120, 18, MINAA.val, -4, 5); +- col=230; MAXAA=Draw.Number("Max AA", 2, col, line, 120, 18, MAXAA.val, -4, 5) +- col=100; line=125; AASAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, AASAMPLES.val, 0, 32) +- col=230; AAJITTER=Draw.Toggle("AA Jitter", 2, col, line, 120, 18, AAJITTER.val, "Use jitter for anti-aliasing") +- col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Image Filter:") +- col=100; line=100; IMGFILTER=Draw.Menu("%tImage Filter|box|gaussian|mitchell|triangle|catmull-rom|blackman-harris|sinc|lanczos", FILTER_EVENT, col, line, 120, 18, IMGFILTER.val) +- +- drawButtons() +- +-## Draw camera options ## +-def drawCamera(): +- global DOF, DOFRADIUS, SPHERICALCAMERA, FISHEYECAMERA, LENSSIDES, LENSROTATION +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Camera:") +- col=100; line=145; DOF=Draw.Toggle("DOF", DOF_CAMERA, col, line, 120, 18, DOF.val, "Turn on depth of field") +- col=225; DOFRADIUS=Draw.Number("Radius", 2, col, line, 120, 18, DOFRADIUS.val, 0.001, 9.999) +- col=100; line=125; BGL.glRasterPos2i(col, line); Draw.Text("Bokeh shape -->") +- col=225; line=120; LENSSIDES=Draw.Number("Sides", 2, col, line, 120, 18, LENSSIDES.val, 2, 8) +- col=350; LENSROTATION=Draw.Number("Rotation", 2, col, line, 120, 18, LENSROTATION.val, 0.0, 360.0) +- col=100; line=95; SPHERICALCAMERA=Draw.Toggle("Spherical", SPHER_CAMERA, col, line, 120, 18, SPHERICALCAMERA.val, "Use the sperical camera type") +- col=100; line=70; FISHEYECAMERA=Draw.Toggle("Fisheye", FISH_CAMERA, col, line, 120, 18, FISHEYECAMERA.val, "Use the fisheye camera type") +- +- drawButtons() +- +-## Draw Background options ## +-def drawBackground(): +- global IMP_BCKGRD, IMP_SUN, BACKGROUND, BCKGRD, IBL, IBLLOCK, IBLSAMPLES, SUN_TURB, SUN_SAMPLES, INFINITEPLANE, IPLANECOLOR +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Simple background:") +- col=10; line=200; IMP_BCKGRD=Draw.Toggle("Import World", BCKGRD_EVENT, col, line, 120, 18, IMP_BCKGRD.val, "Set World's Horizon color as background") +- col=10; line=175; BACKGROUND=Draw.Toggle("Create Background", CBCKGRD_EVENT, col, line, 120, 18, BACKGROUND.val, "Define a background color") +- col=135; BCKGRD=Draw.ColorPicker(2, 135, 175, 30, 18, BCKGRD.val, "New background color") +- col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("High Dynamic Range Illumination (Please set a texture named 'ibllight', lower case):") +- col=10; line=125; IBL=Draw.Toggle("Image Based Light", IBL_EVENT, col, line, 140, 18, IBL.val, "Use IBL/hdr type light") +- col=160; IBLLOCK=Draw.Toggle("Importance Sampling", LOCK_EVENT, col, line, 130, 18, IBLLOCK.val, "Use importance sampling (lock false), IBL must be on") +- col=300; IBLSAMPLES=Draw.Number("Samples", 2, col, line, 100, 18, IBLSAMPLES.val, 1, 1024) +- col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Sunsky:") +- col=10; line=75; IMP_SUN=Draw.Toggle("Import Sun", SUN_EVENT, col, line, 120, 18, IMP_SUN.val, "Import existing Sun") +- col=140; line=75; SUN_TURB=Draw.Number("Turbidity", 2, col, line, 120, 18, SUN_TURB.val, 0.0, 32.0) +- col=270; SUN_SAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, SUN_SAMPLES.val, 1, 10000) +- col=400; INFINITEPLANE=Draw.Toggle("Infinite Plane", 2, col, line, 90, 18, INFINITEPLANE.val, "Use an infinite plane in the scene") +- col=500; IPLANECOLOR=Draw.ColorPicker(2, 495, 75, 30, 18, IPLANECOLOR.val, "Infinite plane color") +- +- drawButtons() +- +-## Draw light options ## +-def drawLights(): +- global MESHLIGHTPOWER, LAMPPOWER, DSAMPLES, CONVLAMP +- col=10; line=205; BGL.glRasterPos2i(col, line); Draw.Text("Global Options:") +- col=10; line=180; BGL.glRasterPos2i(col, line); Draw.Text("Meshlight:") +- col=110; line=175; MESHLIGHTPOWER=Draw.Number("Power", 2, col, line, 200, 18, MESHLIGHTPOWER.val, 1, 10000) +- col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("Light:") +- col=110; line=150; LAMPPOWER=Draw.Number("Power", 2, col, line, 200, 18, LAMPPOWER.val, 1, 10000) +- col=10; line=130; BGL.glRasterPos2i(col, line); Draw.Text("Lightserver:") +- col=110; line=125; DSAMPLES=Draw.Number("Direct Samples", 2, col, line, 200, 18, DSAMPLES.val, 0, 1024) +- col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Unknown lamps:") +- col=10; line = 75; CONVLAMP=Draw.Toggle("Convert lamps", 2, col, line, 140, 18, CONVLAMP.val, "Convert unsupported lamps into point light") +- +- drawButtons() +- +-## Draw Shader options ## +-def drawShad(): +- global SHADTYPE, SHADOK +- col=10; line=400; BGL.glRasterPos2i(col, line); Draw.Text("Specific instructions for exporting shaders:") +- col=10; line=375; BGL.glRasterPos2i(col, line); Draw.Text("For exporting bump and normal maps, have the second texture slot (slot 1) name") +- col=10; line=350; BGL.glRasterPos2i(col, line); Draw.Text("begin with bump or normal. Controlled with the Map To Nor button and Nor slider.") +- col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Regarding Textures: Diffuse, shiny, ambocc, phong, and ward materials will") +- col=10; line=300; BGL.glRasterPos2i(col, line); Draw.Text("use textures as the diffuse channel if the texture is in the first texture slot.") +- col=10; line=275; SHADTYPE=Draw.Menu("%tSelect shader|Uber|Diffuse|Shiny|AO|Phong|Ward|Mirror|Glass|Constant", SHADER_TYPE, col, line, 85, 18, SHADTYPE.val) +- col=100; SHADOK=Draw.Button("OK", SHAD_OK, col, line, 30, 18, "Print on screen instructions") +- if SHADTYPE == 1: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Uber: shader name should start with 'sfube' - imports Blender's Col and Spe RGB") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("values") +- col=10; line=200; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 0: diffuse texture(Mapto Col value), else Col RGB values") +- col=10; line=175; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the diffuse texture is controlled by the Map Input Col slider") +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 2: specular texture(Mapto Var value), else Spe RGB values") +- col=10; line=125; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the specular texture is controlled by the Map Input Var slider") +- if SHADTYPE == 2: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Diffuse: shader name should start with 'sfdif' - imports Blender's Col RGB values") +- if SHADTYPE == 3: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Shiny: shader name sould start with 'sfshi' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("RayMirr values") +- if SHADTYPE == 4: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ambient Occlusion: shader name sould start with 'sfamb' - imports Blender's") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Col RGB (Bright) and Spe RGB (Dark) values") +- if SHADTYPE == 5: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Phong: shader name sould start with 'sfpho' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values, as well as the spec's hard value") +- if SHADTYPE == 6: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ward: shader name sould start with 'sfwar' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values") +- if SHADTYPE == 7: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Mirror: shader name sould start with 'sfmir' - imports Blender's Col RGB values,") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Ray Mir button must be on") +- if SHADTYPE == 8: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Glass: shader name sould start with 'sfgla' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("IOR values, Ray Transp button must be on") +- if SHADTYPE == 9: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Constant: shader name should start with 'sfcon' - imports Blender's Col RGB values") +- +- drawButtons() +- +-## Draw export and render options settings ## +-def drawRender(): +- global EXPORT, RENDER, SMALLMESH, NOGI, NOGUI, NOCAUSTICS, QUICKUV, QUICKNORM, QUICKID, QUICKPRIMS, QUICKGRAY, QUICKWIRE, QUICKOCC, QOCCDIST, FILETYPE, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, QUICKOPT, EXP_ANIM, IPR, BUCKETSIZE, BUCKETTYPE, REVERSE +- col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Rendering actions:") +- col=10; line=300; EXPORT=Draw.Button("Export .sc", EXP_EVT, col, line, 140, 18, "Export the scene to .sc file") +- col=160; RENDER=Draw.Button("Render exported", REND_EVT, col, line, 130, 18, "Render it (Export a .sc file first)") +- col=300; FILETYPE=Draw.Menu("%tFile type|png|tga|hdr|exr|igi", FILE_TYPE, col, line, 85, 18, FILETYPE.val) +- col=10; line=280; BGL.glRasterPos2i(col, line); Draw.Text("Max raytrace depths:") +- col=10; line=255; DEPTH_DIFF=Draw.Number("Diffuse Depth", 2, col, line, 125, 18, DEPTH_DIFF.val, 1, 100) +- col=150; DEPTH_REFL=Draw.Number("Reflection Depth", 2, col, line, 125, 18, DEPTH_REFL.val, 1, 100) +- col=290; DEPTH_REFR=Draw.Number("Refraction Depth", 2, col, line, 125, 18, DEPTH_REFR.val, 1, 100) +- col=10; line=240; BGL.glRasterPos2i(col, line); Draw.Text("Bucket Order:") +- col=10; line=215; BUCKETSIZE=Draw.Number("Bucket Size", 2, col, line, 125, 18, BUCKETSIZE.val, 8, 64) +- col=150; BUCKETTYPE=Draw.Menu("%tBucket Order|hilbert (default)|spiral|column|row|diagonal|random", BUCKET_EVENT, col, line, 125, 18, BUCKETTYPE.val) +- col=290; REVERSE=Draw.Toggle("Reverse Order", 2, col, line, 125, 18, REVERSE.val, "Use reverse bucket order") +- col=10; line=195; BGL.glRasterPos2i(col, line); Draw.Text("Rendering options:") +- col=10; line=170; SMALLMESH=Draw.Toggle("Small mesh", 2, col, line, 85, 18, SMALLMESH.val, "Load triangle meshes using triangles optimized for memory use") +- col=100; NOGI=Draw.Toggle("No GI", 2, col, line, 85, 18, NOGI.val, "Disable any global illumination engines in the scene") +- col=190; NOCAUSTICS=Draw.Toggle("No Caustics", 2, col, line, 85, 18, NOCAUSTICS.val, "Disable any caustic engine in the scene") +- col=280; NOGUI=Draw.Toggle("No GUI", 2, col, line, 85, 18, NOGUI.val, "Don't open the frame showing rendering progress") +- col=370; IPR=Draw.Toggle("IPR", 2, col, line, 85, 18, IPR.val, "Render using progressive algorithm") +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Quick override options:") +- col=10; line=125; QUICKOPT=Draw.Menu("%tQuick option|None|Quick UVs|Quick Normals|Quick ID|Quick Primitives|Quick Gray|Quick Wire", QUICK_OPT, col, line, 100, 18, QUICKOPT.val) +- col=10; line=100; QUICKOCC=Draw.Toggle("Quick Amb Occ", QUICK_OCC, col, line, 85, 18, QUICKOCC.val, "Applies ambient occlusion to the scene with specified maximum distance") +- col=100; QOCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, QOCCDIST.val, 0.00, 1000.00) +- col=10; line=75; EXP_ANIM=Draw.Toggle("Export As Animation", 2, col, line, 140, 18, EXP_ANIM.val, "Export the scene as animation") +- +- drawButtons() +- +-## Draw the SF configuration settings ## +-def drawConfig(): +- global SET_PATH, THREADS, MEM, SET_JAVAPATH +- col=10; line = 315; BGL.glRasterPos2i(col, line); Draw.Text("ID properties for script settings:") +- col= 10; line = 285; Draw.Button("Send Script Settings", EXPORT_ID, col, line, 140,18, "Send script settings to the .blend") +- col= 155; Draw.Button("Restore Default Settings", DEFAULT_ID, col, line, 140,18, "Use script defaults") +- col= 300; Draw.Button("Reload ID Settings", IMPORT_ID, col, line, 140,18, "Reload ID properties from .blend") +- col=10; line = 255; BGL.glRasterPos2i(col, line); Draw.Text("Settings needed to render directly from the script:") +- col=155; line = 230; BGL.glRasterPos2i(col, line); Draw.Text("(threads=0 means auto-detect)") +- col=10; line = 225; THREADS=Draw.Number("Threads", 2, col, line, 140, 18, THREADS.val, 0, 8) +- col=10; line = 200; MEM=Draw.Number("Memory (MB)", 2, col, line, 140, 18, MEM.val, 256, 4096) +- col= 10; line = 175; Draw.Button("Save SF Path & Settings", SET_PATH, col, line, 140,18) +- col= 10; line = 150; Draw.Button("Save Java Path", SET_JAVAPATH, col, line, 140,18) +- col=155; line = 155; BGL.glRasterPos2i(col, line); Draw.Text("Set Java path after Sunflow path") +- # Get blenders 'bpydata' directory: +- datadir=Blender.Get("datadir") +- # Check if the config file exists: +- trial=os.path.exists(datadir+'/path2sf.cfg') +- # If config file exists, retrieve existing values: +- if trial == 1: +- # open 'path2sf.cfg' +- f = open(datadir + '/path2sf.cfg', 'r+') +- sfdir = f.readline() +- memory = f.readline() +- threads = f.readline() +- javadir = f.readline() +- col=10; line = 130; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow path: %s" % sfdir) +- col=10; line = 110; BGL.glRasterPos2i(col, line); Draw.Text("Memory: %s MB" % memory) +- col=10; line = 90; BGL.glRasterPos2i(col, line); Draw.Text("Threads: %s" % threads) +- col=10; line = 70; BGL.glRasterPos2i(col, line); Draw.Text("Java path: %s" % javadir) +- f.close() +- # If config file doesn't exist, issue a warning: +- if trial == 0: +- col=10; line = 105; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow is not configured yet - set Memory, Number of Threads and Path to sunflow.jar") +- +- drawButtons() +- +-## Draw caustic and global illumination settings ## +-def drawGI(): +- global CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE, PHOTONRADIUS +- global INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES +- global IRRCACHE, IRRSAMPLES, IRRTOLERANCE, IRRSPACEMIN, IRRSPACEMAX +- global gPHOTONNUMBER, gPHOTONESTIMATE, gPHOTONRADIUS, gPHOTONMAP, USEGLOBALS +- global PATHTRACE, PATHSAMPLES +- global VIEWCAUSTICS, VIEWGLOBALS, VIEWGI +- global OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST +- global FAKEAMB, FAMBSKY, FAMBGROUND +- +- # GI/Caustics part # +- col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Caustics and Global Illumination") +- #Caustics# +- col=10; line=300; CAUSTICS=Draw.Toggle("Caustics", EVENT_CAUSTICS, col, line, 85, 18, CAUSTICS.val, "Turn on caustics in the scene") +- col=100; PHOTONNUMBER=Draw.Number("Photons", 2, col, line, 125, 18, PHOTONNUMBER.val, 0, 5000000) +- col=230; PHOTONMAP=Draw.Menu("%tCaustics Photon Map|kd", PHOTON_EVENT, col, line, 60, 18, PHOTONMAP.val) +- col=295; PHOTONESTIMATE=Draw.Number("Photon Estim.", 2, col, line, 125, 18, PHOTONESTIMATE.val, 0, 1000) +- col=425; PHOTONRADIUS=Draw.Number("Photon Radius", 2, col, line, 125, 18, PHOTONRADIUS.val, 0.00, 10.00) +- #Instant GI# +- col=10; line=275; INSTANTGI=Draw.Toggle("Instant GI", FORCE_INSTANTGI, col, line, 85, 18, INSTANTGI.val, "Enable Instant GI for GI in the scene") +- col=100; IGISAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IGISAMPLES.val, 0, 1024) +- col=230; IGISETS=Draw.Number("Number of Sets", 2, col, line, 125, 18, IGISETS.val, 1.0, 100.0) +- col=100; line=250; IGIBIAS=Draw.Number("Bias", 2, col, line, 125, 18, IGIBIAS.val, 0.000, 1.000) +- col=230; IGIBIASSAMPLES=Draw.Number("Bias Samples", 2, col, line, 125, 18, IGIBIASSAMPLES.val, 0, 64) +- #Irradiance Caching# +- col=10; line=225; IRRCACHE=Draw.Toggle("Irr. Cache", FORCE_IRRCACHE, col, line, 85, 18, IRRCACHE.val, "Enable Irradiance Caching for GI in the scene") +- col=100; IRRSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IRRSAMPLES.val, 0, 1024) +- col=230; IRRTOLERANCE=Draw.Number("Tolerance", 2, col, line, 125, 18, IRRTOLERANCE.val, 0.0, 0.10) +- col=100; line=200; IRRSPACEMIN=Draw.Number("Min. Space", 2, col, line, 125, 18, IRRSPACEMIN.val, 0.00, 10.00) +- col=230; IRRSPACEMAX=Draw.Number("Max. Space", 2, col, line, 125, 18, IRRSPACEMAX.val, 0.00, 10.00) +- col=10; line=175; USEGLOBALS=Draw.Toggle("Use Globals", FORCE_GLOBALS, col, line, 85, 18, USEGLOBALS.val, "Use global photons instead of path tracing for Irr. Cache secondary bounces") +- col=100; gPHOTONNUMBER=Draw.Number("Glob. Phot.", 2, col, line, 125, 18, gPHOTONNUMBER.val, 0, 5000000) +- col=230; gPHOTONMAP=Draw.Menu("%tGlobal Photon Map|grid", gPHOTON_EVENT, col, line, 60, 18, gPHOTONMAP.val) +- col=295; gPHOTONESTIMATE=Draw.Number("Global Estim.", 2, col, line, 125, 18, gPHOTONESTIMATE.val, 0, 1000) +- col=425; gPHOTONRADIUS=Draw.Number("Global Radius", 2, col, line, 125, 18, gPHOTONRADIUS.val, 0.00, 10.00) +- #Path Tracing# +- col=10; line=150; PATHTRACE=Draw.Toggle("Path Tracing", FORCE_PATHTRACE, col, line, 85, 18, PATHTRACE.val, "Enable Path Tracing for GI in the scene") +- col=100; PATHSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, PATHSAMPLES.val, 0, 1024) +- #AO# +- col=10; line=125; OCCLUSION=Draw.Toggle("Amb Occ", FORCE_OCCLUSION, col, line, 85, 18, OCCLUSION.val, "Turn on ambient occlusion for the whole scene") +- col=100; OCCBRIGHT=Draw.ColorPicker(2, 100, 125, 30, 18, OCCBRIGHT.val, "Ambient Occlusion bright color") +- col=135; OCCDARK=Draw.ColorPicker(2, 135, 125, 30, 18, OCCDARK.val, "Ambient Occlusion dark color") +- col=170; OCCSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, OCCSAMPLES.val, 0, 256) +- col=300; OCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, OCCDIST.val, -1.0, 150.0) +- #Fake Ambient Term# +- col=10; line=100; FAKEAMB=Draw.Toggle("Fake Amb", FORCE_FAKEAMB, col, line, 85, 18, FAKEAMB.val, "Turn on Fake Ambient Term for the scene") +- col=100; FAMBSKY=Draw.ColorPicker(2, 100, 100, 30, 18, FAMBSKY.val, "Fake Ambient Term sky color") +- col=135; FAMBGROUND=Draw.ColorPicker(2, 135, 100, 30, 18, FAMBGROUND.val, "Fake Ambient Term ground color") +- #Overrides# +- col=100; line=75; VIEWCAUSTICS=Draw.Toggle("Just Caustics", OVERRIDE_CAUSTICS, col, line, 85, 18, VIEWCAUSTICS.val, "Render only the caustic photons in the scene (Caustics must be on)") +- col=190; VIEWGLOBALS=Draw.Toggle("Just Globals", OVERRIDE_GLOBALS, col, line, 85, 18, VIEWGLOBALS.val, "Render only the global photons in the scene (Use Globals must be on)") +- col=280; VIEWGI=Draw.Toggle("Just GI", OVERRIDE_GI, col, line, 85, 18, VIEWGI.val, "Render only the gi components in the scene (A GI engine must be selected)") +- drawButtons() +- +-## Draw the bottom bar of buttons in the interface ## +-def drawButtons(): +- Draw.Button("Configure SF", CHANGE_CFG, 20, 10, 90, 50) +- Draw.Button("AA", CHANGE_AA, 115 , 40, 90, 20) +- Draw.Button("Camera", CHANGE_CAM, 210, 40, 90, 20) +- Draw.Button("Light", CHANGE_LIGHT, 305, 40, 90, 20) +- Draw.Button("Caustics/GI", CHANGE_GI, 115, 10, 90, 20) +- Draw.Button("Shader Info", CHANGE_SHAD, 210, 10, 90, 20) +- Draw.Button("Background", CHANGE_BCKGRD,305, 10, 90, 20) +- Draw.Button("Render settings", CHANGE_EXP, 400, 10, 90, 50) +- +-####### Script Startup Section ####### +-###################################### +- +-SCREEN=7 +-auto_import() +-Draw.Register(drawGUI, event, buttonEvent) +- ++#!BPY ++ ++""" ++Name: 'Sunflow Exporter 1.4.18 (.sc)...' ++Blender: 2.45 ++Group: 'Export' ++Tip: 'Export to a Sunflow Scene File' ++ ++Version : 1.4.18 (January 2008) ++Author : R Lindsay (hayfever) / Christopher Kulla / MADCello / ++ olivS / Eugene Reilly / Heavily Tessellated / Humfred ++Description : Export to Sunflow renderer http://sunflow.sourceforge.net/ ++Usage : See how to use the script at http://sunflow.sourceforge.net/phpbb2/viewtopic.php?t=125 ++ ++***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++***** END GPL LICENCE BLOCK ***** ++""" ++ ++####### General Script Properties Section ####### ++################################################# ++ ++## Imports ## ++import Blender, os, sys, time #, subprocess ++ ++from Blender import Mathutils, Lamp, Object, Scene, Mesh, Material, Draw, BGL, Effect ++from math import * ++ ++## Event numbers ## ++CHANGE_EXP = 1 ++NO_EVENT = 2 ++DOF_CAMERA = 3 ++SPHER_CAMERA = 4 ++FISH_CAMERA = 5 ++FILE_TYPE = 6 ++FILTER_EVENT = 7 ++CHANGE_AA = 8 ++CHANGE_SHAD = 9 ++CHANGE_CAM = 10 ++CHANGE_ACC = 11 ++CHANGE_LIGHT = 12 ++CHANGE_BCKGRD = 13 ++CHANGE_GI = 14 ++PHOTON_EVENT = 15 ++gPHOTON_EVENT = 16 ++FORCE_INSTANTGI = 17 ++FORCE_IRRCACHE = 18 ++FORCE_PATHTRACE = 19 ++FORCE_GLOBALS = 20 ++OVERRIDE_CAUSTICS = 21 ++OVERRIDE_GLOBALS = 22 ++OVERRIDE_GI = 23 ++EVENT_CAUSTICS = 24 ++IBL_EVENT = 25 ++EXP_EVT = 26 ++REND_EVT = 27 ++CONV_LAMP = 28 ++QUICK_OPT = 29 ++QUICK_OCC = 30 ++SUN_EVENT = 31 ++BCKGRD_EVENT = 32 ++CBCKGRD_EVENT = 33 ++LOCK_EVENT = 34 ++SET_PATH = 35 ++CHANGE_CFG = 36 ++SET_JAVAPATH = 37 ++SHADER_TYPE = 38 ++SHAD_OK = 39 ++EXPORT_ID = 40 ++DEFAULT_ID = 41 ++IP_COLOR = 42 ++BUCKET_EVENT = 43 ++IMPORT_ID = 44 ++FORCE_OCCLUSION = 45 ++FORCE_FAKEAMB = 46 ++ ++## global vars ## ++global FILE, SCENE, IM_HEIGHT, IM_WIDTH, TEXTURES, OBJECTS, IBLLIGHT, LAYERS, SCREEN, SCENE ++global DOFDIST ++FILENAME = Blender.Get('filename').replace(".blend", ".sc") ++SCENE = Blender.Scene.GetCurrent() ++SFPATH = "" ++JAVAPATH = "" ++ ++## start of export ## ++print("\n\n") ++print("blend2sunflow v1.4.18") ++ ++## Default values of buttons ## ++def default_values(): ++ global FILETYPE, MINAA, MAXAA, AASAMPLES, AAJITTER, DSAMPLES, IMGFILTER, IMGFILTERW, IMGFILTERH, BUCKETSIZE,\ ++ BUCKETTYPE, REVERSE, DOF, DOFRADIUS, LENSSIDES, LENSROTATION, SPHERICALCAMERA, FISHEYECAMERA, IMP_BCKGRD,\ ++ IMP_SUN, BCKGRD, BACKGROUND, SUN_TURB, SUN_SAMPLES, IBL, IBLLOCK, IBLSAMPLES, INFINITEPLANE, IPLANECOLOR,\ ++ MESHLIGHTPOWER, LAMPPOWER, CONVLAMP, MEM, THREADS, CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE,\ ++ PHOTONRADIUS, INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES, IRRCACHE, IRRSAMPLES, IRRTOLERANCE,\ ++ IRRSPACEMIN, IRRSPACEMAX, USEGLOBALS, gPHOTONNUMBER, gPHOTONMAP, gPHOTONESTIMATE, gPHOTONRADIUS, PATHTRACE,\ ++ PATHSAMPLES, VIEWCAUSTICS, VIEWGLOBALS, VIEWGI, OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST,\ ++ SHADTYPE, QUICKOPT, IPR, EXP_ANIM, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, NOGI, NOCAUSTICS, QUICKOCC, QOCCDIST,\ ++ NOGUI, SMALLMESH, IMGFILTERLIST, BUCKETTYPELIST, PHOTONMAPLIST, gPHOTONMAPLIST, FAKEAMB, FAMBSKY, FAMBGROUND ++ ++ FILETYPE = Draw.Create(1) ++ ++ # AA panel values ++ MINAA = Draw.Create(0) ++ MAXAA = Draw.Create(2) ++ AASAMPLES = Draw.Create(1) ++ AAJITTER = Draw.Create(0) ++ DSAMPLES = Draw.Create(16) ++ IMGFILTER = Draw.Create(1) ++ IMGFILTERW = Draw.Create(1) ++ IMGFILTERH = Draw.Create(1) ++ BUCKETSIZE = Draw.Create(64) ++ BUCKETTYPE = Draw.Create(1) ++ REVERSE = Draw.Create(0) ++ ++ # Camera panel values ++ DOF = Draw.Create(0) ++ DOFRADIUS = Draw.Create(1.00) ++ LENSSIDES = Draw.Create(6) ++ LENSROTATION = Draw.Create(0.0) ++ SPHERICALCAMERA = Draw.Create(0) ++ FISHEYECAMERA = Draw.Create(0) ++ ++ # Background panel values ++ IMP_BCKGRD = Draw.Create(1) ++ IMP_SUN = Draw.Create(0) ++ BCKGRD = Draw.Create(0.0, 0.0, 0.0) ++ BACKGROUND = Draw.Create(0) ++ SUN_TURB = Draw.Create(6.0) ++ SUN_SAMPLES = Draw.Create(128) ++ IBL = Draw.Create(0) ++ IBLLOCK = Draw.Create(0) ++ IBLSAMPLES = Draw.Create(16) ++ INFINITEPLANE = Draw.Create(0) ++ IPLANECOLOR= Draw.Create(1.0, 1.0, 1.0) ++ ++ # Light panel values ++ MESHLIGHTPOWER = Draw.Create(100) ++ LAMPPOWER = Draw.Create(100) ++ CONVLAMP = Draw.Create(0) ++ ++ # Config panel values ++ MEM = Draw.Create(1024) ++ THREADS = Draw.Create(0) ++ ++ # GI/Caustic panel values ++ CAUSTICS = Draw.Create(0) ++ PHOTONNUMBER = Draw.Create(1000000) ++ PHOTONMAP = Draw.Create(1) ++ PHOTONESTIMATE = Draw.Create(100) ++ PHOTONRADIUS = Draw.Create(0.5) ++ INSTANTGI = Draw.Create(0) ++ IGISAMPLES = Draw.Create(64) ++ IGISETS = Draw.Create(1) ++ IGIBIAS = Draw.Create(0.01) ++ IGIBIASSAMPLES = Draw.Create(0) ++ IRRCACHE = Draw.Create(0) ++ IRRSAMPLES = Draw.Create(512) ++ IRRTOLERANCE = Draw.Create(0.01) ++ IRRSPACEMIN = Draw.Create(0.05) ++ IRRSPACEMAX = Draw.Create(5.0) ++ USEGLOBALS = Draw.Create(0) ++ gPHOTONNUMBER = Draw.Create(1000000) ++ gPHOTONMAP = Draw.Create(1) ++ gPHOTONESTIMATE = Draw.Create(100) ++ gPHOTONRADIUS = Draw.Create(0.5) ++ PATHTRACE = Draw.Create(0) ++ PATHSAMPLES = Draw.Create(32) ++ VIEWCAUSTICS = Draw.Create(0) ++ VIEWGLOBALS = Draw.Create(0) ++ VIEWGI = Draw.Create(0) ++ OCCLUSION = Draw.Create(0) ++ OCCBRIGHT = Draw.Create(1.0, 1.0, 1.0) ++ OCCDARK = Draw.Create(0.0, 0.0, 0.0) ++ OCCSAMPLES = Draw.Create(32) ++ OCCDIST = Draw.Create(3.0) ++ FAKEAMB = Draw.Create(0) ++ FAMBSKY = Draw.Create(1.0, 0.95, 0.65) ++ FAMBGROUND = Draw.Create(0.5, 0.8, 1.0) ++ ++ # Shader panel values ++ SHADTYPE = Draw.Create(1) ++ ++ # Render panel values ++ QUICKOPT = Draw.Create(1) ++ IPR = Draw.Create(0) ++ EXP_ANIM = Draw.Create(0) ++ DEPTH_DIFF = Draw.Create(1) ++ DEPTH_REFL = Draw.Create(4) ++ DEPTH_REFR = Draw.Create(4) ++ NOGI = Draw.Create(0) ++ NOCAUSTICS = Draw.Create(0) ++ QUICKOCC = Draw.Create(0) ++ QOCCDIST = Draw.Create(0.5) ++ NOGUI = Draw.Create(0) ++ SMALLMESH = Draw.Create(0) ++ ++ ## Lists ## ++ IMGFILTERLIST = ["box", "gaussian", "mitchell", "triangle", "catmull-rom", "blackman-harris", "sinc", "lanczos"] ++ BUCKETTYPELIST = ["hilbert", "spiral", "column", "row", "diagonal", "random"] ++ FILETYPE ++ PHOTONMAPLIST = ["kd"] ++ gPHOTONMAPLIST = ["grid"] ++ ++####### Script Settings Section ####### ++####################################### ++ ++## Background and AA settings ## ++# Send background and AA values to Blender as IDs # ++def def_output(): ++ global IM_HEIGHT, IM_WIDTH ++ # Define Blender's values ++ world = Blender.World.GetCurrent() ++ horcol = world.getHor() ++ horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] ++ IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() ++ IM_WIDTH = SCENE.getRenderingContext().imageSizeX() ++ ++ # Writes Scene properties ++ SCENE.properties['SceneProp'] = "true" ++ SCENE.properties['ImageWidth'] = IM_WIDTH ++ SCENE.properties['ImageHeight'] = IM_HEIGHT ++ SCENE.properties['MinAA'] = MINAA.val ++ SCENE.properties['MaxAA'] = MAXAA.val ++ SCENE.properties['Samples'] = AASAMPLES.val ++ SCENE.properties['Filter'] = IMGFILTER.val ++ if AAJITTER.val == 1: ++ SCENE.properties['Jitter'] = "true" ++ else: ++ SCENE.properties['Jitter'] = "false" ++ SCENE.properties['DepthDiff'] = DEPTH_DIFF.val ++ SCENE.properties['DepthRefl'] = DEPTH_REFL.val ++ SCENE.properties['DepthRefr'] = DEPTH_REFR.val ++ if IMP_BCKGRD.val == 1: ++ SCENE.properties['Blender Background'] = "true" ++ SCENE.properties['HorizonColR'] = horcol0 ++ SCENE.properties['HorizonColG'] = horcol1 ++ SCENE.properties['HorizonColB'] = horcol2 ++ else: ++ SCENE.properties['Blender Background'] = "false" ++ if BACKGROUND.val == 1: ++ SCENE.properties['Script Background'] = "true" ++ SCENE.properties['HorizonCol'] = BCKGRD.val ++ else: ++ SCENE.properties['Script Background'] = "false" ++ SCENE.properties['Bucket Size'] = BUCKETSIZE.val ++ SCENE.properties['Bucket Type'] = BUCKETTYPE.val ++ if REVERSE == 1: ++ SCENE.properties['Reverse Bucket'] = "true" ++ else: ++ SCENE.properties['Reverse Bucket'] = "false" ++ ++# Import background and AA values from Blender IDs to script # ++def import_output(): ++ global IM_HEIGHT, IM_WIDTH ++ # Retrieve Blender's Scene ID values ++ world = Blender.World.GetCurrent() ++ horcol = world.getHor() ++ horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] ++ IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() ++ IM_WIDTH = SCENE.getRenderingContext().imageSizeX() ++ ++ if SCENE.properties['SceneProp'] == "true": ++ IM_WIDTH = SCENE.properties['ImageWidth'] ++ IM_HEIGHT = SCENE.properties['ImageHeight'] ++ MINAA.val = SCENE.properties['MinAA'] ++ MAXAA.val = SCENE.properties['MaxAA'] ++ AASAMPLES.val = SCENE.properties['Samples'] ++ IMGFILTER.val = SCENE.properties['Filter'] ++ DEPTH_DIFF.val = SCENE.properties['DepthDiff'] ++ DEPTH_REFL.val = SCENE.properties['DepthRefl'] ++ DEPTH_REFR.val = SCENE.properties['DepthRefr'] ++ Draw.Redraw() ++ if SCENE.properties['Jitter'] == "true": ++ AAJITTER.val = 1 ++ Draw.Redraw() ++ else: ++ AAJITTER.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Blender Background'] == "true": ++ IMP_BCKGRD.val = 1 ++ horcol0 = SCENE.properties['HorizonColR'] ++ horcol1 = SCENE.properties['HorizonColG'] ++ horcol2 = SCENE.properties['HorizonColB'] ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ else: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Script Background'] == "true": ++ BACKGROUND.val = 1 ++ BCKGRD.val = SCENE.properties['HorizonCol'][0], SCENE.properties['HorizonCol'][1], SCENE.properties['HorizonCol'][2] ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ else: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ BUCKETSIZE.val = SCENE.properties['Bucket Size'] ++ BUCKETTYPE.val = SCENE.properties['Bucket Type'] ++ if SCENE.properties['Reverse Bucket'] == "true": ++ REVERSE.val = 1 ++ Draw.Redraw() ++ else: ++ REVERSE.val = 0 ++ Draw.Redraw() ++ ++# Export background and AA values # ++def export_output(): ++ print("o exporting output details...") ++ FILE.write("image {\n") ++ FILE.write("\tresolution %d %d\n" % (IM_WIDTH, IM_HEIGHT)) ++ FILE.write("\taa %s %s\n" % (MINAA.val, MAXAA.val)) ++ FILE.write("\tsamples %s\n" % AASAMPLES.val) ++ FILE.write("\tfilter %s\n" % IMGFILTERLIST[IMGFILTER.val-1]) ++ if AAJITTER == 1: ++ FILE.write("\tjitter true\n") ++ FILE.write("}") ++ FILE.write("\n") ++ ++ print("o exporting trace-depths options...") ++ FILE.write("trace-depths {\n") ++ FILE.write("\tdiff %s \n" % DEPTH_DIFF) ++ FILE.write("\trefl %s \n" % DEPTH_REFL) ++ FILE.write("\trefr %s\n" % DEPTH_REFR) ++ FILE.write("}") ++ FILE.write("\n") ++ if IMP_BCKGRD.val == 1: ++ print("o exporting background...") ++ world = Blender.World.GetCurrent() ++ horcol = world.getHor() ++ horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] ++ FILE.write("background {\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (horcol0, horcol1, horcol2)) ++ FILE.write("}") ++ FILE.write("\n") ++ elif BACKGROUND.val == 1: ++ print("o creating background...") ++ FILE.write("background {\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % BCKGRD.val) ++ FILE.write("}") ++ FILE.write("\n") ++ if REVERSE.val == 0: ++ FILE.write("\nbucket %s %s\n" % (BUCKETSIZE.val, BUCKETTYPELIST[BUCKETTYPE.val-1])) ++ elif REVERSE.val == 1: ++ FILE.write("\nbucket %s " % BUCKETSIZE.val) ++ FILE.write("\"reverse %s\"\n" % BUCKETTYPELIST[BUCKETTYPE.val-1]) ++ ++## Caustic and global illumination settings ## ++# Send GI and caustic values to Blender as IDs # ++def def_gi(): ++ # Writes GI properties ++ if CAUSTICS.val == 1: ++ SCENE.properties['Caustics'] = "true" ++ SCENE.properties['Caustics Photon Number'] = PHOTONNUMBER.val ++ SCENE.properties['Caustics Photon Map'] = PHOTONMAP.val ++ SCENE.properties['Caustics Photon Estimate'] = PHOTONESTIMATE.val ++ SCENE.properties['Caustics Photon Radius'] = PHOTONRADIUS.val ++ else: ++ SCENE.properties['Caustics'] = "false" ++ if INSTANTGI.val == 1: ++ SCENE.properties['IGI'] = "true" ++ SCENE.properties['IGI Samples'] = IGISAMPLES.val ++ SCENE.properties['IGI Sets'] = IGISETS.val ++ SCENE.properties['IGI Bias'] = IGIBIAS.val ++ SCENE.properties['IGI Bias Samples'] = IGIBIASSAMPLES.val ++ else: ++ SCENE.properties['IGI'] = "false" ++ if IRRCACHE.val == 1: ++ SCENE.properties['IRR'] = "true" ++ SCENE.properties['IRR Samples'] = IRRSAMPLES.val ++ SCENE.properties['IRR Tolerance'] = IRRTOLERANCE.val ++ SCENE.properties['IRR Space Min'] = IRRSPACEMIN.val ++ SCENE.properties['IRR Space Max'] = IRRSPACEMAX.val ++ else: ++ SCENE.properties['IRR'] = "false" ++ if USEGLOBALS.val == 1: ++ SCENE.properties['Global Photon'] = "true" ++ SCENE.properties['Global Photon Num'] = gPHOTONNUMBER.val ++ SCENE.properties['Global Photon Map'] = gPHOTONMAP.val ++ SCENE.properties['Global Photon Estimate'] = gPHOTONESTIMATE.val ++ SCENE.properties['Global Photon Radius'] = gPHOTONRADIUS.val ++ else: ++ SCENE.properties['Global Photon'] = "false" ++ if PATHTRACE.val == 1: ++ SCENE.properties['Path Tracing'] = "true" ++ SCENE.properties['Path Tracing Samples'] = PATHSAMPLES.val ++ else: ++ SCENE.properties['Path Tracing'] = "false" ++ if OCCLUSION.val ==1: ++ SCENE.properties['Global AO'] = "true" ++ SCENE.properties['Global AO Bright'] = OCCBRIGHT.val ++ SCENE.properties['Global AO Dark'] = OCCDARK.val ++ SCENE.properties['Global AO Samples'] = OCCSAMPLES.val ++ SCENE.properties['Global AO Distance'] = OCCDIST.val ++ else: ++ SCENE.properties['Global AO'] = "false" ++ if FAKEAMB.val ==1: ++ SCENE.properties['Fake Ambient Term'] = "true" ++ SCENE.properties['Fake Ambient Term Sky'] = FAMBSKY.val ++ SCENE.properties['Fake Ambient Term Ground'] = FAMBGROUND.val ++ else: ++ SCENE.properties['Fake Ambient Term'] = "false" ++ if VIEWCAUSTICS.val == 1: ++ SCENE.properties['View Caustics'] = "true" ++ else: ++ SCENE.properties['View Caustics'] = "false" ++ if VIEWGLOBALS.val == 1: ++ SCENE.properties['View Globals'] = "true" ++ else: ++ SCENE.properties['View Globals'] = "false" ++ if VIEWGI.val == 1: ++ SCENE.properties['View GI'] = "true" ++ else: ++ SCENE.properties['View GI'] = "false" ++ ++# Import GI values from Blender IDs to script # ++def import_gi(): ++ # Retrieve Blender's GI/Caustic ID values ++ if SCENE.properties['SceneProp'] == "true": ++ if SCENE.properties['Caustics'] == "true": ++ CAUSTICS.val = 1 ++ PHOTONNUMBER.val = SCENE.properties['Caustics Photon Number'] ++ PHOTONMAP.val = SCENE.properties['Caustics Photon Map'] ++ PHOTONESTIMATE.val = SCENE.properties['Caustics Photon Estimate'] ++ PHOTONRADIUS.val = SCENE.properties['Caustics Photon Radius'] ++ Draw.Redraw() ++ else: ++ CAUSTICS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['IGI'] == "true": ++ INSTANTGI.val = 1 ++ IGISAMPLES.val = SCENE.properties['IGI Samples'] ++ IGISETS.val = SCENE.properties['IGI Sets'] ++ IGIBIAS.val = SCENE.properties['IGI Bias'] ++ IGIBIASSAMPLES.val = SCENE.properties['IGI Bias Samples'] ++ Draw.Redraw() ++ else: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['IRR'] == "true": ++ IRRCACHE.val = 1 ++ IRRSAMPLES.val = SCENE.properties['IRR Samples'] ++ IRRTOLERANCE.val = SCENE.properties['IRR Tolerance'] ++ IRRSPACEMIN.val = SCENE.properties['IRR Space Min'] ++ IRRSPACEMAX.val = SCENE.properties['IRR Space Max'] ++ Draw.Redraw() ++ else: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Global Photon'] == "true": ++ USEGLOBALS.val = 1 ++ gPHOTONNUMBER.val = SCENE.properties['Global Photon Num'] ++ gPHOTONMAP.val = SCENE.properties['Global Photon Map'] ++ gPHOTONESTIMATE.val = SCENE.properties['Global Photon Estimate'] ++ gPHOTONRADIUS.val = SCENE.properties['Global Photon Radius'] ++ Draw.Redraw() ++ else: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Path Tracing'] == "true": ++ PATHTRACE.val = 1 ++ PATHSAMPLES.val = SCENE.properties['Path Tracing Samples'] ++ Draw.Redraw() ++ else: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Global AO'] == "true": ++ OCCLUSION.val = 1 ++ OCCBRIGHT.val = SCENE.properties['Global AO Bright'][0], SCENE.properties['Global AO Bright'][1], SCENE.properties['Global AO Bright'][2] ++ OCCDARK.val = SCENE.properties['Global AO Dark'][0], SCENE.properties['Global AO Dark'][1], SCENE.properties['Global AO Dark'][2] ++ OCCSAMPLES.val = SCENE.properties['Global AO Samples'] ++ OCCDIST.val = SCENE.properties['Global AO Distance'] ++ Draw.Redraw() ++ else: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Fake Ambient Term'] == "true": ++ FAKEAMB.val = 1 ++ FAMBSKY.val = SCENE.properties['Fake Ambient Term Sky'][0], SCENE.properties['Fake Ambient Term Sky'][1], SCENE.properties['Fake Ambient Term Sky'][2] ++ FAMBGROUND.val = SCENE.properties['Fake Ambient Term Ground'][0], SCENE.properties['Fake Ambient Term Ground'][1], SCENE.properties['Fake Ambient Term Ground'][2] ++ Draw.Redraw() ++ else: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['View Caustics'] == "true": ++ VIEWCAUSTICS.val = 1 ++ Draw.Redraw() ++ else: ++ VIEWCAUSTICS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['View Globals'] == "true": ++ VIEWGLOBALS.val = 1 ++ Draw.Redraw() ++ else: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['View GI'] == "true": ++ VIEWGI.val = 1 ++ Draw.Redraw() ++ else: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ ++# Export global illumination values # ++def export_gi(): ++ #Caustic Settings ++ if CAUSTICS.val == 1: ++ print("o exporting caustic settings...") ++ FILE.write("\nphotons {\n") ++ FILE.write("\tcaustics %s" % PHOTONNUMBER.val) ++ FILE.write(" %s " % PHOTONMAPLIST[PHOTONMAP.val-1]) ++ FILE.write("%s %s\n" % (PHOTONESTIMATE.val, PHOTONRADIUS.val)) ++ FILE.write("}\n") ++ #Instant GI Settings ++ if INSTANTGI.val == 1: ++ print("o exporting Instant GI settings...") ++ FILE.write("\ngi {\n") ++ FILE.write("\ttype igi\n") ++ FILE.write("\tsamples %s\n" % IGISAMPLES.val) ++ FILE.write("\tsets %s\n" % IGISETS.val) ++ FILE.write("\tb %s\n" % IGIBIAS.val) ++ FILE.write("\tbias-samples %s\n" % IGIBIASSAMPLES.val) ++ FILE.write("}\n") ++ #Irradiance Cache GI Settings ++ if IRRCACHE.val == 1: ++ print("o exporting Irradiance Cache GI settings...") ++ FILE.write("\ngi {\n") ++ FILE.write("\ttype irr-cache\n") ++ FILE.write("\tsamples %s\n" % IRRSAMPLES.val) ++ FILE.write("\ttolerance %s\n" % IRRTOLERANCE.val) ++ FILE.write("\tspacing %s %s\n" % (IRRSPACEMIN.val, IRRSPACEMAX.val)) ++ if USEGLOBALS.val == 0: ++ FILE.write("}\n") ++ #No Path Tracing on Secondary Bounces in Irradiance Cache Settings ++ else: ++ FILE.write("\tglobal %s" % gPHOTONNUMBER.val) ++ FILE.write(" %s " % gPHOTONMAPLIST[gPHOTONMAP.val-1]) ++ FILE.write("%s %s\n" % (gPHOTONESTIMATE.val, gPHOTONRADIUS.val)) ++ FILE.write("}\n") ++ #Path Tracing GI Settings ++ if PATHTRACE.val == 1: ++ print("o exporting Path Tracing GI settings...") ++ FILE.write("\ngi {\n") ++ FILE.write("\ttype path\n") ++ FILE.write("\tsamples %s\n" % PATHSAMPLES.val) ++ FILE.write("}\n") ++ #Ambient Occlusion GI Settings ++ if OCCLUSION.val == 1: ++ print("o exporting Ambient Occlusion GI settings...") ++ FILE.write("\n\ngi {\n") ++ FILE.write("\ttype ambocc\n") ++ FILE.write("\tbright { \"sRGB nonlinear\" %s %s %s }\n" % OCCBRIGHT.val) ++ FILE.write("\tdark { \"sRGB nonlinear\" %s %s %s }\n" % OCCDARK.val) ++ FILE.write("\tsamples %s\n" % OCCSAMPLES.val) ++ FILE.write("\tmaxdist %s\n}" % OCCDIST.val) ++ #Fake Ambient Term GI Settings ++ if FAKEAMB.val == 1: ++ print("o exporting Fake Ambient Term GI settings...") ++ FILE.write("\n\ngi {\n") ++ FILE.write("\ttype fake\n") ++ FILE.write("\tup 0 1 0\n") ++ FILE.write("\tsky { \"sRGB nonlinear\" %s %s %s }\n" % FAMBSKY.val) ++ FILE.write("\tground { \"sRGB nonlinear\" %s %s %s }\n" % FAMBGROUND.val) ++ FILE.write("\n}") ++ #View Overrides ++ if VIEWCAUSTICS.val == 1: ++ print("o exporting caustic override...") ++ FILE.write("\nshader {\n") ++ FILE.write("\tname debug_caustics\n") ++ FILE.write("\ttype view-caustics\n") ++ FILE.write("}\n") ++ FILE.write("override debug_caustics false\n") ++ if VIEWGLOBALS.val == 1: ++ print("o exporting globals override...") ++ FILE.write("\nshader {\n") ++ FILE.write("\tname debug_globals\n") ++ FILE.write("\ttype view-global\n") ++ FILE.write("}\n") ++ FILE.write("override debug_globals false\n") ++ if VIEWGI.val == 1: ++ print("o exporting irradiance override...") ++ FILE.write("\nshader {\n") ++ FILE.write("\tname debug_gi\n") ++ FILE.write("\ttype view-irradiance\n") ++ FILE.write("}\n") ++ FILE.write("override debug_gi false\n") ++ ++def export_shaders(): ++ print("o exporting shaders...") ++ ++ #Infinite Plane ++ if INFINITEPLANE.val == 1: ++ FILE.write("\n\nshader {\n\tname iplane\n\ttype diffuse\n") ++ FILE.write("\tdiff %s %s %s \n}" % IPLANECOLOR.val) ++ # Add infinite plane object # ++ FILE.write("\n\nobject {\n") ++ FILE.write("\tshader iplane\n") ++ FILE.write("\ttype plane\n") ++ FILE.write("\tp 0 0 0\n") ++ FILE.write("\tn 0 0 1\n}\n") ++ ++ # default shader ++ FILE.write("\n\nshader {\n\tname def\n\ttype diffuse\n\tdiff 1 1 1\n}") ++ materials = Blender.Material.get() ++ ++ for mat in materials: ++ RGB = mat.getRGBCol() ++ speccol = mat.getSpecCol() ++ textures = mat.getTextures() ++ flags = mat.getMode() ++ ++ if mat.users == 0: ++ continue ++ ++ # UBER shader ++ if mat.name.startswith("sfube"): ++ textu = textures[0] ++ textu2 = textures[2] ++ print(" o exporting uber shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype uber\n") ++ ++ # DIFF values ++ FILE.write("\tdiff %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) ++ if textures[0] != None and textures[0].tex.getType() == "Image" and textu.tex.getImage() != None: ++ colvalue = textu.colfac ++ FILE.write("\tdiff.texture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tdiff.blend %s\n" % (colvalue * 1.0)) ++ else: ++ ++ FILE.write("\tdiff.blend 0.0\n") ++ ++ # SPEC values ++ FILE.write("\tspec %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) ++ if textures[2] != None and textures[2].tex.getType() == "Image" and textu2.tex.getImage() != None: ++ cspvalue = textu2.varfac ++ FILE.write("\tspec.texture \"" + textu2.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tspec.blend %s\n" % (cspvalue * 0.1)) ++ else: ++ FILE.write("\tspec.blend 0.0\n") ++ FILE.write("\tglossy .1\n") ++ FILE.write("\tsamples 4\n}") ++ ++ elif textures[0] != None and textures[0].tex.getType() == "Image": ++ textu = textures[0] ++ # image texture without image !!?? ++ if textu.tex.getImage() == None: ++ print(("You material named " +mat.name+ " have an image texture with no image!")) ++ print ("replacing with default shader!") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %s %s %s }\n}" % (1.0, 1.0, 1.0)) ++ ++ # ambocc texture shader ++ elif mat.name.startswith("sfamb"): ++ print(" o exporting ambient occlusion texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype amb-occ\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) ++ FILE.write("\tsamples 32\n") ++ FILE.write("\tdist 3.0\n}") ++ ++ # diffuse texture shader ++ elif mat.name.startswith("sfdif"): ++ print(" o exporting diffuse texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") ++ ++ # phong texture shader ++ elif mat.name.startswith("sfpho"): ++ print(" o exporting phong texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype phong\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) ++ FILE.write("\tsamples 4\n}") ++ ++ # ward texture shader ++ elif mat.name.startswith("sfwar"): ++ print(" o exporting ward texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype ward\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ speccol = mat.specCol ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) ++ FILE.write("\trough .2 .01\n") ++ FILE.write("\tsamples 4\n}") ++ ++ # shiny texture shader ++ elif mat.name.startswith("sfshi"): ++ print(" o exporting shiny texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype shiny\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) ++ ++ # newcommers default diffuse texture shader ++ else: ++ print(" o exporting diffuse texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") ++ ++ else: ++ ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ ++ ## diffuse shader ++ if mat.name.startswith("sfdif"): ++ print(" o exporting diffuse shader "+mat.name+"...") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) ++ ++ ## shiny shader ++ elif mat.name.startswith("sfshi"): ++ print(" o exporting shiny shader "+mat.name+"...") ++ FILE.write("\ttype shiny\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0], RGB[1], RGB[2])) ++ FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) ++ ++ ## amb-occ shader ++ elif mat.name.startswith("sfamb"): ++ print(" o exporting ambient occlusion shader "+mat.name+"...") ++ FILE.write("\ttype amb-occ\n") ++ FILE.write("\tbright %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) ++ FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) ++ FILE.write("\tsamples 32\n") ++ FILE.write("\tdist 3.0\n}") ++ ++ ## phong shader ++ elif mat.name.startswith("sfpho"): ++ print(" o exporting phong shader "+ mat.name+"...") ++ FILE.write("\ttype phong\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0],RGB[1],RGB[2])) ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) ++ FILE.write("\tsamples 4\n}") ++ ++ ## ward shader ++ elif mat.name.startswith("sfwar"): ++ print(" o exporting ward shader "+ mat.name+"...") ++ FILE.write("\ttype ward\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) ++ speccol = mat.specCol ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) ++ FILE.write("\trough .2 .01\n") ++ FILE.write("\tsamples 4\n}") ++ ++ ## reflection (mirror) shader ++ elif mat.name.startswith("sfmir") and flags & Material.Modes['RAYMIRROR']: ++ print(" o exporting mirror shader "+mat.name+"...") ++ FILE.write("\ttype mirror\n") ++ FILE.write("\trefl { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(RGB[0],RGB[1],RGB[2])) ++ ++ ## glass shader ++ elif mat.name.startswith("sfgla") and flags & Material.Modes['RAYTRANSP']: ++ print(" o exporting glass shader "+mat.name+"...") ++ FILE.write("\ttype glass\n") ++ FILE.write("\teta " + str(mat.getIOR()) + "\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) ++ FILE.write("\tabsorbtion.distance 5.0\n") ++ FILE.write("\tabsorbtion.color { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(speccol[0], speccol[1], speccol[2])) ++ ++ ## constant shader ++ elif mat.name.startswith("sfcon"): ++ print(" o exporting constant shader "+mat.name+"...") ++ FILE.write("\ttype constant\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) ++ ++ ## newcommers default diffuse shader ++ else: ++ print(" o exporting default diffuse shader "+mat.name+"...") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) ++ ++## Export modifiers ## ++def export_modifiers(): ++ print("o exporting modifiers...") ++ ++ materials = Blender.Material.get() ++ modifs_list = [] ++ ++ for mat in materials: ++ ++ textures = mat.getTextures() ++ flags = mat.getMode() ++ ++ if textures[1] != None and textures[1].tex.getType() == "Image": ++ textu = textures[1] ++ Scale_value = str(textu.norfac * textu.mtNor*-0.001) ++ ++ if textu.tex.name.startswith("bump"): ++ if textu.tex.getName() not in modifs_list: ++ modifs_list.append (str(textu.tex.getName())) ++ print(" o exporting modifier "+str(textu.tex.getName())+"...") ++ FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype bump\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tscale %s \n}\n" % Scale_value) ++ ++ elif textu.tex.name.startswith("normal"): ++ if textu.tex.getName() not in modifs_list: ++ modifs_list.append (str(textu.tex.getName())) ++ print(" o exporting modifier "+str(textu.tex.getName())+"...") ++ FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype normalmap\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") ++ else: ++ pass ++ ++ if textures[3] != None and textures[3].tex.getType() != "Image": ++ textu = textures[3] ++ Scale_value = str(textu.norfac) ++ if textu.tex.name.startswith("perlin"): ++ if textu.tex.getName() not in modifs_list: ++ modifs_list.append (str(textu.tex.getName())) ++ print(" o exporting modifier "+str(textu.tex.getName())+"...") ++ FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype perlin\n") ++ FILE.write("\tfunction 0\n") ++ FILE.write("\tsize 1\n") ++ FILE.write("\tscale %s\n}\n" % Scale_value) ++ ++ else: ++ pass ++ ++## Light settings ## ++# Send light values to Blender as IDs # ++def def_lights(): ++ #Write light ID properties ++ SCENE.properties['LightProp'] = "true" ++ SCENE.properties['Lamp Multiplier'] = LAMPPOWER.val ++ SCENE.properties['Meshlight Multiplier'] = MESHLIGHTPOWER.val ++ SCENE.properties['Light Samples'] = DSAMPLES.val ++ SCENE.properties['IBL Samples'] = IBLSAMPLES.val ++ if IBL.val == 1: ++ SCENE.properties['Image Based Light'] = "true" ++ else: ++ SCENE.properties['Image Based Light'] = "false" ++ if IBLLOCK.val == 1: ++ SCENE.properties['IBL Importance Sampling'] = "true" ++ else: ++ SCENE.properties['IBL Importance Sampling'] = "false" ++ if CONVLAMP.val == 1: ++ SCENE.properties['Convert Unsupported Lamps'] = "true" ++ else: ++ SCENE.properties['Convert Unsupported Lamps'] = "false" ++ if IMP_SUN.val == 1: ++ SCENE.properties['Sun Lamp'] = "true" ++ else: ++ SCENE.properties['Sun Lamp'] = "false" ++ SCENE.properties['Sun Turbidity'] = SUN_TURB.val ++ SCENE.properties['Sun Samples'] = SUN_SAMPLES.val ++ #Infinite plane ID added here since it's mostly used with sun/sky ++ if INFINITEPLANE.val == 1: ++ SCENE.properties['Infinite Plane'] = "true" ++ else: ++ SCENE.properties['Infinite Plane'] = "false" ++ SCENE.properties['Infinite Plane Color'] = IPLANECOLOR.val ++ ++# Import light values from Blender IDs to script # ++def import_lights(): ++ # Retrieve Blender's light ID values including IBL/LOCK ++ if SCENE.properties['LightProp'] == "true": ++ LAMPPOWER.val = SCENE.properties['Lamp Multiplier'] ++ MESHLIGHTPOWER.val = SCENE.properties['Meshlight Multiplier'] ++ DSAMPLES.val = SCENE.properties['Light Samples'] ++ IBLSAMPLES.val = SCENE.properties['IBL Samples'] ++ if SCENE.properties['Convert Unsupported Lamps'] == "true": ++ CONVLAMP.val = 1 ++ Draw.Redraw() ++ else: ++ CONVLAMP.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Image Based Light'] == "true": ++ IBL.val = 1 ++ Draw.Redraw() ++ else: ++ IBL.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['IBL Importance Sampling'] == "true": ++ IBLLOCK.val = 1 ++ Draw.Redraw() ++ else: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Sun Lamp'] == "true": ++ IMP_SUN.val = 1 ++ Draw.Redraw() ++ else: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ SUN_TURB.val = SCENE.properties['Sun Turbidity'] ++ SUN_SAMPLES.val = SCENE.properties['Sun Samples'] ++ #Infinite plane ID added here since it's mostly used with sun/sky ++ if SCENE.properties['Infinite Plane'] == "true": ++ INFINITEPLANE.val = 1 ++ Draw.Redraw() ++ else: ++ INFINITEPLANE.val = 0 ++ Draw.Redraw() ++ IPLANECOLOR.val = SCENE.properties['Infinite Plane Color'][0], SCENE.properties['Infinite Plane Color'][1], SCENE.properties['Infinite Plane Color'][2], ++ ++# Export light values # ++def export_lights(lmp): ++ # only lamps type 0, 1 and 4 supported at the moment ++ # lamp types are: 0 - Lamp, 1 - Sun, 2 - Spot, 3 - Hemi, 4 - Area ++ # Spots are replaced by directional (cylinrical) lights: adjust dist as close as possible to the ground receiving the ++ # cone of light if you want Radius as close as possible ++ lamp = lmp.getData() ++ ++ red = lamp.col[0] ++ green = lamp.col[1] ++ blue = lamp.col[2] ++ power = lamp.energy * LAMPPOWER.val ++ objmatrix = lmp.matrix ++ lampV = Mathutils.Vector([0, 0, 0, 1]) ++ lampV = lampV * objmatrix ++ dist = lamp.getDist() ++ print("o exporting lamps") ++ ++ if lamp.type == 0: ++ print(" o exporting lamp "+lmp.name+"...") ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype point\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tpower %s\n" % (power)) ++ FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("}") ++ elif lamp.type == 1: ++ if IMP_SUN.val == 1: ++ print(" o exporting sun-light "+lmp.name+"...") ++ invmatrix = Mathutils.Matrix(lmp.getInverseMatrix()) ++ FILE.write("\nlight {\n") ++ FILE.write("\ttype sunsky\n") ++ FILE.write("\tup 0 0 1\n") ++ FILE.write("\teast 0 1 0\n") ++ FILE.write("\tsundir %f %f %f\n" % (invmatrix[0][2], invmatrix[1][2], invmatrix[2][2])) ++ FILE.write("\tturbidity %s\n" % SUN_TURB.val) ++ FILE.write("\tsamples %s\n" % SUN_SAMPLES.val) ++ FILE.write("}") ++ else: ++ print(" o exporting lamp "+lmp.name+"...") ++ # get the location of the lamp ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype point\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tpower %s\n" % (power)) ++ FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("}") ++ ++ elif lamp.type == 4: ++ print(" o exporting area-light "+lmp.name+"...") ++ xsize = lamp.areaSizeX * 0.5 ++ if lamp.areaSizeY: ++ # If rectangular area: ++ print("o exporting rectangular area-light "+lmp.name+"...") ++ ysize = lamp.areaSizeY * 0.5 ++ else: ++ # Else, square area: ++ print("o exporting square area-light "+lmp.name+"...") ++ ysize = xsize ++ lampV0 = Mathutils.Vector([-xsize, ysize, 0, 1]) ++ lampV1 = Mathutils.Vector([ xsize, ysize, 0, 1]) ++ lampV2 = Mathutils.Vector([ xsize, -ysize, 0, 1]) ++ lampV3 = Mathutils.Vector([-xsize, -ysize, 0, 1]) ++ ++ lampV0 = lampV0 * objmatrix ++ lampV1 = lampV1 * objmatrix ++ lampV2 = lampV2 * objmatrix ++ lampV3 = lampV3 * objmatrix ++ ++ radiance = lamp.energy * MESHLIGHTPOWER.val ++ ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype meshlight\n") ++ FILE.write("\tname \"%s\"\n" % (lmp.name)) ++ FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tradiance %s\n" % (radiance)) ++ FILE.write("\tsamples %s\n" % DSAMPLES.val) ++ FILE.write("\tpoints 4\n") ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV0[0], lampV0[1], lampV0[2])) ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV1[0], lampV1[1], lampV1[2])) ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV2[0], lampV2[1], lampV2[2])) ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV3[0], lampV3[1], lampV3[2])) ++ FILE.write("\ttriangles 2\n") ++ FILE.write("\t\t0 1 2\n") ++ FILE.write("\t\t0 2 3\n") ++ FILE.write("}") ++ elif lamp.type == 2: ++ print(" o exporting spotlight "+lmp.name+"...") ++ targetV = Mathutils.Vector([0, 0, -1, 1]) ++ targetV = targetV * objmatrix ++ angle = lamp.getSpotSize()*pi/360 ++ radius = dist/cos(angle)*sin(angle) ++ radiance = lamp.energy * LAMPPOWER.val ++ ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype directional\n") ++ FILE.write("\tsource %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tradius %s\n" % (radius)) ++ FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("}") ++ elif lamp.type == 3: ++ print(" o exporting spherical light "+lmp.name+"...") ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype spherical\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tradiance %s\n" % (power)) ++ FILE.write("\tcenter %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("\tradius %s\n" % (dist)) ++ FILE.write("\tsamples %s\n" % DSAMPLES.val) ++ FILE.write("}") ++ else: ++ print("Unsupported type lamp detected") ++ if CONVLAMP.val == 1: ++ print(" o exporting lamp "+lmp.name+"...") ++ # get the rgb component for the lamp ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype point\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tpower %s\n" % (power)) ++ FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("}") ++ ++## Export of Image Based Lights ## ++def export_ibl(): ++ global IBLLIGHT ++ ++ try: ++ ibllighttext = Blender.Texture.Get("ibllight") ++ if ibllighttext != "": ++ if ibllighttext.users > 0: ++ if ibllighttext != None and ibllighttext.getType() == "Image": ++ IBLLIGHT = ibllighttext.getImage().getFilename() ++ else: ++ IBLLIGHT = "" ++ else: ++ IBLLIGHT = "" ++ except: ++ IBLLIGHT = "" ++ ++ if IBL == 1: ++ if IBLLIGHT != "": ++ print("o exporting ibllight...") ++ print(" o using texture %s" % (IBLLIGHT)) ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype ibl\n") ++ FILE.write("\timage \"%s\"\n" % (IBLLIGHT)) ++ FILE.write("\tcenter 1 0 0\n") ++ FILE.write("\tup 0 0 1\n") ++ if IBLLOCK == 1: ++ FILE.write("\tlock false\n") # lock false means "use importance sampling" ++ else: ++ FILE.write("\tlock true\n") ++ FILE.write("\tsamples %s\n" % IBLSAMPLES.val) ++ FILE.write("}") ++ ++## Camera settings ## ++# Send camera values to Blender as IDs # ++def def_camera(): ++ CAMERA=SCENE.objects.camera ++ # Writes Scene properties ++ CAMERA.properties['CamProp'] = "true" ++ CAMERA.properties['DOF Radius'] = DOFRADIUS.val ++ CAMERA.properties['Lens Sides'] = LENSSIDES.val ++ CAMERA.properties['Lens Rotation'] = LENSROTATION.val ++ if DOF.val == 1: ++ CAMERA.properties['DOF'] = "true" ++ else: ++ CAMERA.properties['DOF'] = "false" ++ if SPHERICALCAMERA.val == 1: ++ CAMERA.properties['Spherical Camera'] = "true" ++ else: ++ CAMERA.properties['Spherical Camera'] = "false" ++ if FISHEYECAMERA.val == 1: ++ CAMERA.properties['Fisheye Camera'] = "true" ++ else: ++ CAMERA.properties['Fisheye Camera'] = "false" ++ ++# Import Background and AA values from Blender IDs to script # ++def import_camera(): ++ CAMERA=SCENE.objects.camera ++ if CAMERA.properties['CamProp'] == "true": ++ DOFRADIUS.val = CAMERA.properties['DOF Radius'] ++ LENSSIDES.val = CAMERA.properties['Lens Sides'] ++ LENSROTATION.val = CAMERA.properties['Lens Rotation'] ++ if CAMERA.properties['DOF'] == "true": ++ DOF.val = 1 ++ Draw.Redraw() ++ else: ++ DOF.val = 0 ++ Draw.Redraw() ++ if CAMERA.properties['Spherical Camera'] == "true": ++ SPHERICALCAMERA.val = 1 ++ Draw.Redraw() ++ else: ++ SPHERICALCAMERA.val = 0 ++ Draw.Redraw() ++ if CAMERA.properties['Fisheye Camera'] == "true": ++ FISHEYECAMERA.val = 1 ++ Draw.Redraw() ++ else: ++ FISHEYECAMERA.val = 0 ++ Draw.Redraw() ++ ++# Export camera values # ++def export_camera(cam): ++ # get the camera ++ camera = cam.getData() ++ print("o exporting Camera "+camera.getName()+"...") ++ ++ # get the object matrix so we can calculate to and up ++ objmatrix = cam.matrix ++ eyeV = Mathutils.Vector([0, 0, 0, 1]) ++ targetV = Mathutils.Vector([0, 0, -1, 1]) ++ upV = Mathutils.Vector([0, 1, 0, 0]) ++ ++ eyeV = eyeV * objmatrix ++ targetV = targetV * objmatrix ++ upV = upV * objmatrix ++ ++ # get the fov value ++ # image higher than wide? ++ if IM_HEIGHT > IM_WIDTH: ++ factor=float(IM_WIDTH) / float(IM_HEIGHT) ++ # if the image is wider than high, or of equal height and width then: ++ else: ++ factor=1 ++ # fov = 2*(degrees(atan((factor*16.0) / camera.lens))) #Same as below, just uses the python "degrees" instead: ++ fov = 360.0 * atan((factor*16.0) / camera.lens) / pi ++ DOFDIST=camera.dofDist ++ ++ FILE.write("\n\ncamera {\n") ++ ++ if DOF.val == 1: ++ camtype = "thinlens" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ FILE.write("\tfov %s \n" % fov) ++ FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) ++ FILE.write("\tfdist %s \n" % DOFDIST) ++ FILE.write("\tlensr %s \n" % DOFRADIUS) ++ FILE.write("\tsides %s \n" % LENSSIDES) ++ FILE.write("\trotation %s \n" % LENSROTATION) ++ elif SPHERICALCAMERA.val == 1: ++ camtype = "spherical" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ elif FISHEYECAMERA.val == 1: ++ camtype = "fisheye" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ else: ++ camtype = "pinhole" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ FILE.write("\tfov %s \n" % fov) ++ FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) ++ #To be uncommented when 0.07.3 is released ++ #FILE.write("\tshift %.2f %.2f\n" % (camera.shiftX, camera.shiftY)) ++ FILE.write("}") ++ ++## Export method for meshes ## ++def export_geometry(obj): ++ islight = obj.name.startswith("meshlight") ++ isparticleob = obj.name.startswith("particleob") ++ if islight: ++ print("o exporting meshlight " + obj.name+"...") ++ if isparticleob: ++ print("o exporting particle object " + obj.name+"...") ++ # get the mesh data ++ if obj.getType() != "Empty": ++ mesh = Mesh.New(obj.name) # Note the "mesh.verts = None" at the end of this if. Used to clear the new mesh from memory ++ mesh.getFromObject(obj, 0, 1) ++ mesh.transform(obj.mat, 1) ++ verts = mesh.verts ++ faces = mesh.faces ++ numverts = verts.__len__() ++ ++ if numverts > 0: ++ if islight: ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype meshlight\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ if len(mesh.materials) >= 1: ++ matrl = mesh.materials[0] ++ FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (matrl.R, matrl.G, matrl.B)) ++ else: ++ FILE.write("\temit 1 1 1\n") ++ FILE.write("\tradiance %s\n" % (MESHLIGHTPOWER.val)) ++ FILE.write("\tsamples %s\n" % DSAMPLES.val) ++ FILE.write("\tpoints %d\n" % (numverts)) ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) ++ numtris = 0 ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ numtris = numtris + 2 ++ elif num == 3: ++ numtris = numtris + 1 ++ FILE.write("\ttriangles %d\n" % (numtris)) ++ allsmooth = True ++ allflat = True ++ for face in faces: ++ num = len(face.verts) ++ smooth = face.smooth != 0 ++ allsmooth &= smooth ++ allflat &= not smooth ++ if num == 4: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) ++ elif num == 3: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ FILE.write("}") ++ ++ else: ++ FILE.write("\n\nobject {\n") ++ if len(mesh.materials) == 1: ++ FILE.write("\tshader \"" + mesh.materials[0].name + ".shader\"\n") ++ ++ ##Check for and write modfiers## ++ for mat in mesh.materials: ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") ++ ++ elif len(mesh.materials) > 1: ++ FILE.write("\tshaders %d\n" % (len(mesh.materials))) ++ ++ for mat in mesh.materials: ++ FILE.write("\t\t\"" + mat.name + ".shader\"\n") ++ ++ ##Check for and write modfiers## ++ FILE.write("\tmodifiers %d\n" % (len(mesh.materials))) ++ for mat in mesh.materials: ++ ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") ++ else: ++ FILE.write("\t\t\"" + "None" + "\"\n") ++ ++ else: ++ FILE.write("\tshader def\n") ++ ##Particle object section. Works with Sunflow 0.07.3 and up. ## ++ # Check if there are particles on the object # ++ ob = Object.Get(obj.name) ++ if len(ob.effects) != 0: ++ effect = ob.effects[0] ++ particles = effect.getParticlesLoc() ++ effects= Effect.Get() ++ # Check that particles are points only (not static and not vectors) # ++ if not effect.getFlag() & Effect.Flags.STATIC or not effect.getStype(): ++ FILE.write("\ttype particles\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tpoints %d\n" % (len(particles))) ++ for pt in particles: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (pt[0], pt[1], pt[2])) ++ FILE.write("\tradius 0.05\n}\n") ++ elif type(particles)==list: # Is it a strand or pair? ++ if len(particles)>1: ++ pointnum = ((len(particles)*effect.getLifetime())*3) ++ print("o exporting hair object " + obj.name+"...") ++ FILE.write("\ttype hair\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tsegments %d\n" % (effect.getLifetime()-1)) ++ FILE.write("\twidth .01\n") ++ FILE.write("\tpoints %d" % pointnum) ++ for eff in effects: ++ for p in eff.getParticlesLoc(): ++ if type(p)==list: # Are we a strand or a pair, then add hair data. ++ if len(p)>1: ++ destData = str() ++ for vect in p: ++ for elem in vect: ++ destData+=" "+str(elem) ++ FILE.write("\t%s\n" % (destData)) ++ FILE.write("}\n") ++ elif isparticleob: ++ FILE.write("\ttype particles\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tpoints %d\n" % (numverts)) ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) ++ FILE.write("\tradius 0.05\n}\n") ++ ++ else: ++ print("o exporting mesh " + obj.name+"...") ++ FILE.write("\ttype generic-mesh\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tpoints %d\n" % (numverts)) ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) ++ numtris = 0 ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ numtris = numtris + 2 ++ elif num == 3: ++ numtris = numtris + 1 ++ FILE.write("\ttriangles %d\n" % (numtris)) ++ allsmooth = True ++ allflat = True ++ for face in faces: ++ num = len(face.verts) ++ smooth = face.smooth != 0 ++ allsmooth &= smooth ++ allflat &= not smooth ++ if num == 4: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) ++ elif num == 3: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ ++ ## what kind of normals do we have? ++ if not islight: ++ if allflat: ++ FILE.write("\tnormals none\n") ++ elif allsmooth: ++ FILE.write("\tnormals vertex\n") ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.no[0], vert.no[1], vert.no[2])) ++ else: ++ FILE.write("\tnormals facevarying\n") ++ for face in faces: ++ num = len(face.verts) ++ if face.smooth != 0: ++ if num == 4: ++ index0 = face.verts[0].index ++ index1 = face.verts[1].index ++ index2 = face.verts[2].index ++ index3 = face.verts[3].index ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], ++ verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], ++ verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], ++ verts[index2].no[0], verts[index2].no[1], verts[index2].no[2], ++ verts[index3].no[0], verts[index3].no[1], verts[index3].no[2])) ++ elif num == 3: ++ index0 = face.verts[0].index ++ index1 = face.verts[1].index ++ index2 = face.verts[2].index ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], ++ verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], ++ verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) ++ else: ++ fnx = face.no[0] ++ fny = face.no[1] ++ fnz = face.no[2] ++ if num == 4: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) ++ elif num == 3: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) ++ # Check for UVs # ++ if mesh.faceUV != 0: ++ tx = 1 ++ ty = 1 ++ if len(mesh.materials) >= 1: ++ if len(mesh.materials[0].getTextures()) >= 1: ++ if mesh.materials[0].getTextures()[0] != None: ++ tx = mesh.materials[0].getTextures()[0].tex.repeat[0] ++ ty = mesh.materials[0].getTextures()[0].tex.repeat[1] ++ FILE.write("\tuvs facevarying\n") ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[2][0], ty * face.uv[2][1], tx * face.uv[3][0], ty * face.uv[3][1])) ++ elif num == 3: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) ++ else: ++ FILE.write("\tuvs none\n") ++ ++ # Check for multiple materials on the mesh (face indices) # ++ if len(mesh.materials) > 1: ++ FILE.write("\tface_shaders\n") ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ FILE.write("\t\t%d\n" % (face.mat)) ++ FILE.write("\t\t%d\n" % (face.mat)) ++ elif num == 3: ++ FILE.write("\t\t%d\n" % (face.mat)) ++ FILE.write("}\n") ++ # This clears the data from the new mesh created. # ++ mesh.verts = None ++ ++ # Look for Instances/Dupligroups # ++ if obj.getType() == "Empty": ++ ob = Object.Get(obj.name) ++ dupe_obs = ob.DupObjects ++ dupmatrix = Mathutils.Matrix(ob.getMatrix()) ++ group = ob.DupGroup ++ if group != "None": ++ for dupe_ob, dup_matrix in dupe_obs: ++ dupobmesh = Mesh.Get(dupe_ob.name) ++ instancematrix = ob.getMatrix() ++ print("o exporting instances of " + dupe_ob.name+"...") ++ FILE.write("\n\ninstance {\n") ++ FILE.write("\tname %s_%s \n" % (obj.name, dupe_ob.name)) ++ FILE.write("\tgeometry %s \n" % dupe_ob.name) ++ FILE.write("\ttransform col %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s \n" % (instancematrix[0][0], instancematrix[0][1], instancematrix[0][2], instancematrix[0][3], instancematrix[1][0], instancematrix[1][1], instancematrix[1][2], instancematrix[1][3], instancematrix[2][0], instancematrix[2][1], instancematrix[2][2], instancematrix[2][3], instancematrix[3][0], instancematrix[3][1], instancematrix[3][2], instancematrix[3][3])) ++ if len(dupobmesh.materials) == 1: ++ FILE.write("\tshader \"" + dupobmesh.materials[0].name + ".shader\"\n") ++ ++ ##Check for and write modfiers## ++ for mat in dupobmesh.materials: ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") ++ ++ elif len(dupobmesh.materials) > 1: ++ FILE.write("\tshaders %d\n" % (len(dupobmesh.materials))) ++ ++ for mat in dupobmesh.materials: ++ FILE.write("\t\t\"" + mat.name + ".shader\"\n") ++ ++ ##Check for and write modfiers## ++ FILE.write("\tmodifiers %d\n" % (len(dupobmesh.materials))) ++ for mat in dupobmesh.materials: ++ ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") ++ else: ++ FILE.write("\t\t\"" + "None" + "\"\n") ++ ++ else: ++ FILE.write("\tshader def\n") ++ FILE.write("}\n") ++ ++## Main export method ## ++def exportfile(filename): ++ global FILE, SCENE, IM_HEIGHT, IM_WIDTH, TEXTURES, OBJECTS, LAYERS, IBLLIGHT, EXP_ANIM, fname, destname ++ global PATH ++ ++ SCENE = Blender.Scene.GetCurrent() ++ IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) ++ IM_WIDTH = SCENE.getRenderingContext().imageSizeX() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) ++ TEXTURES = Blender.Texture.Get() ++ ++ LAYERS = SCENE.getLayers() ++ STARTFRAME = SCENE.getRenderingContext().startFrame() ++ ENDFRAME = SCENE.getRenderingContext().endFrame() ++ CTX = SCENE.getRenderingContext() ++ orig_frame = CTX.currentFrame() ++ ++ if not filename.endswith(".sc"): ++ filename = filename + ".sc" ++ fname = filename ++ destname = fname.replace(".sc", "") ++ ++ ANIM = EXP_ANIM.val ++ ++ if ANIM == 1: ++ base = os.path.splitext(os.path.basename(filename))[0] ++ FILE = open(filename.replace(".sc", ".java"), "wb") ++ FILE.write(""" ++public void build() { ++ parse("%s" + ".settings.sc"); ++ parse("%s" + "." + getCurrentFrame() + ".sc"); ++} ++""" % (base, base)) ++ ++ FILE.close() ++ FILE = open(filename.replace(".sc", ".settings.sc"), "wb") ++ export_output() ++ export_gi() ++ FILE.close() ++ else: ++ STARTFRAME = ENDFRAME = orig_frame ++ ++ for cntr in range(STARTFRAME, ENDFRAME + 1): ++ filename = fname ++ ++ CTX.currentFrame(cntr) ++ SCENE.makeCurrent() ++ OBJECTS = SCENE.objects ++ ++ if ANIM == 1: ++ filename = filename.replace(".sc", ".%d.sc" % (CTX.currentFrame())) ++ ++ print("Exporting to: %s" % (filename)) ++ ++ FILE = open(filename, 'wb') ++ ++ if ANIM == 0: ++ export_output() ++ export_gi() ++ ++ export_shaders() ++ export_modifiers() ++ export_ibl() ++ export_camera(SCENE.objects.camera) ++ for object in OBJECTS: ++ if object.users > 1 and object.layers[0] in LAYERS: ++ if object.getType() == 'Lamp': ++ export_lights(object) ++ if object.getType() == 'Mesh' or object.getType() == 'Surf': ++ if object.name.startswith("meshlight"): ++ export_geometry(object) ++ ++ if ANIM == 0: ++ FILE.write("\n\ninclude \"%s\"\n" % (os.path.basename(filename).replace(".sc", ".geo.sc"))) ++ FILE.close() ++ ## open geo file ++ filename = filename.replace(".sc", ".geo.sc") ++ print("Exporting geometry to: %s" % (filename)) ++ FILE = open(filename, 'wb') ++ ++ for object in OBJECTS: ++ if object.users > 1 and object.layers[0] in LAYERS: ++ if object.getType() == 'Mesh' or object.getType() == 'Surf': ++ if not object.name.startswith("meshlight"): ++ export_geometry(object) ++ ++ for object in OBJECTS: ++ if object.users > 1 and object.layers[0] in LAYERS: ++ if object.getType() == 'Empty': ++ export_geometry(object) ++ FILE.close() ++ ++ if ANIM == 1: ++ CTX.currentFrame(orig_frame) ++ SCENE.makeCurrent() ++ ++ print("Export finished.") ++ ++if __name__ == '__main__': ++ Blender.Window.FileSelector(exportfile, "Export .sc", Blender.sys.makename(ext=".sc")) ++ ++## Global event handler ## ++def event(evt, val): ++ if evt == Draw.ESCKEY: ++ print("quitting exporter...") ++ Draw.Exit() ++ ++## Writing of the SF config file ## ++def setpath(SFPATH): ++ datadir=Blender.Get("datadir") ++ # create 'path2sf.cfg in the .blend/bpydata directory ++ f = open(datadir + '/path2sf.cfg', 'w') ++ f.write(str(SFPATH)+"\n") ++ f.write(str(MEM)+"\n") ++ f.write(str(THREADS)+"\n") ++ f.close() ++ ++def setjavapath(JAVAPATH): ++ datadir=Blender.Get("datadir") ++ f = open(datadir + '/path2sf.cfg', 'a') ++ f.write(str(JAVAPATH)) ++ f.close() ++ ++## Render to Sunflow from inside the script ## ++# Send render values to Blender as IDs # ++def def_render(): ++ # Writes render setting properties ++ SCENE.properties['RenderProp'] = "true" ++ SCENE.properties['File Type'] = FILETYPE.val ++ SCENE.properties['Quick Option'] = QUICKOPT.val ++ SCENE.properties['Quick AO Distance'] = QOCCDIST.val ++ if NOGUI.val == 1: ++ SCENE.properties['-nogui'] = "true" ++ else: ++ SCENE.properties['-nogui'] = "false" ++ if SMALLMESH.val == 1: ++ SCENE.properties['-smallmesh'] = "true" ++ else: ++ SCENE.properties['-smallmesh'] = "false" ++ if NOGI.val == 1: ++ SCENE.properties['-nogi'] = "true" ++ else: ++ SCENE.properties['-nogi'] = "false" ++ if NOCAUSTICS.val == 1: ++ SCENE.properties['-nocaustics'] = "true" ++ else: ++ SCENE.properties['-nocaustics'] = "false" ++ if QUICKOCC.val == 1: ++ SCENE.properties['-quick_ambocc'] = "true" ++ else: ++ SCENE.properties['-quick_ambocc'] = "false" ++ if IPR.val == 1: ++ SCENE.properties['-ipr'] = "true" ++ else: ++ SCENE.properties['-ipr'] = "false" ++ if EXP_ANIM.val == 1: ++ SCENE.properties['animation'] = "true" ++ else: ++ SCENE.properties['animation'] = "false" ++ ++# Import render values from Blender IDs to script # ++def import_render(): ++ global EXP_ANIM ++ if SCENE.properties['RenderProp'] == "true": ++ FILETYPE.val = SCENE.properties['File Type'] ++ QUICKOPT.val = SCENE.properties['Quick Option'] ++ QOCCDIST.val = SCENE.properties['Quick AO Distance'] ++ if SCENE.properties['-nogui'] == "true": ++ NOGUI.val = 1 ++ Draw.Redraw() ++ else: ++ NOGUI.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-smallmesh'] == "true": ++ SMALLMESH.val = 1 ++ Draw.Redraw() ++ else: ++ SMALLMESH.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-nogi'] == "true": ++ NOGI.val = 1 ++ Draw.Redraw() ++ else: ++ NOGI.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-nocaustics'] == "true": ++ NOCAUSTICS.val = 1 ++ Draw.Redraw() ++ else: ++ NOCAUSTICS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-quick_ambocc'] == "true": ++ QUICKOCC.val = 1 ++ Draw.Redraw() ++ else: ++ QUICKOCC.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-ipr'] == "true": ++ IPR.val = 1 ++ Draw.Redraw() ++ else: ++ IPR.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['animation'] == "true": ++ EXP_ANIM.val = 1 ++ Draw.Redraw() ++ else: ++ EXP_ANIM.val = 0 ++ Draw.Redraw() ++ ++# Export render values # ++def render(): ++ global COMMAND, memory, threads, sfpath, trial, javapath, fname, destname, STARTFRAME, ENDFRAME ++ #exportfile(fname) ++ destname = fname.replace(".sc", "") ++ STARTFRAME = SCENE.getRenderingContext().startFrame() ++ ENDFRAME = SCENE.getRenderingContext().endFrame() ++ # Get blenders 'bpydata' directory: ++ datadir=Blender.Get("datadir") ++ # Check existence of SF config file: ++ trial=os.path.exists(datadir+'/path2sf.cfg') ++ # Continue rendering if file exists: ++ if trial == True: ++ print("True") ++ # open 'path2sf.cfg' ++ f = open(datadir + '/path2sf.cfg', 'r+') ++ lines = f.readlines() ++ # Remove EOL: ++ lines[0]=lines[0].rstrip("\n") ++ lines[1]=lines[1].rstrip("\n") ++ lines[2]=lines[2].rstrip("\n") ++ lines[3]=lines[3].rstrip("\n") ++ # Allocate values to variables: ++ sfdir = lines[0] ++ memory = lines[1] ++ threads = lines[2] ++ javadir = lines[3] ++ f.close() ++ ++ # base command for executing SF: ++ EXEC="%sjava -server -Xmx%sM -jar \"%ssunflow.jar\"" % (javadir, memory, sfdir) ++ #print EXEC ++ ++ # Building the options to be passed to SF: ++ if NOGUI == 1: ++ option1="-nogui " ++ else: ++ option1="" ++ option2="-threads %s " % THREADS ++ if SMALLMESH == 1: ++ option3="-smallmesh " ++ else: ++ option3="" ++ if NOGI == 1: ++ option4="-nogi " ++ else: ++ option4="" ++ if NOCAUSTICS == 1: ++ option5="-nocaustics " ++ else: ++ option5="" ++ if QUICKOPT.val == 1: ++ option6="" ++ if QUICKOPT.val == 2: ++ option6="-quick_uvs " ++ elif QUICKOPT.val == 3: ++ option6="-quick_normals " ++ elif QUICKOPT.val == 4: ++ option6="-quick_id " ++ elif QUICKOPT.val == 5: ++ option6="-quick_prims " ++ elif QUICKOPT.val == 6: ++ option6="-quick_gray " ++ elif QUICKOPT.val == 7: ++ option6="-quick_wire -aa 2 3 -filter mitchell " ++ if QUICKOCC == 1: ++ option7="-quick_ambocc %s " % (QOCCDIST) ++ else: ++ option7="" ++ if IPR == 1: ++ option8="-ipr " ++ else: ++ option8="" ++ print(option6) ++ ++ if FILETYPE == 1: ++ ext="png" ++ elif FILETYPE == 2: ++ ext="tga" ++ elif FILETYPE == 3: ++ ext="hdr" ++ elif FILETYPE == 4: ++ ext="exr" ++ elif FILETYPE == 5: ++ ext="igi" ++ ++ # Definition of the command to render the scene: ++ if EXP_ANIM.val == 0: ++ COMMAND="%s %s%s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option1, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) ++ print(COMMAND) ++ if EXP_ANIM.val == 1: ++ COMMAND="%s -anim %s %s -o \"%s.#.%s\" \"%s.java\"" % (EXEC, STARTFRAME, ENDFRAME, destname, ext, destname) ++ print(COMMAND) ++ if FILETYPE != 1: ++ COMMAND="%s -nogui %s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) ++ print(COMMAND) ++ # Execute the command: ++ pid=os.system(COMMAND) ++ #pid = subprocess.Popen(args=COMMAND, shell=True) ++ ++####### GUI button event handler ####### ++######################################## ++ ++def buttonEvent(evt): ++ global FILE, SCREEN, SETPATH, SETJAVAPATH, FILENAME, SCENE ++ ++ ## Common events: ++ if evt == EXP_EVT: ++ Blender.Window.FileSelector(exportfile, "Export .sc", FILENAME) ++ ++ ## Config file events ++ if evt == SET_PATH: ++ Blender.Window.FileSelector(setpath, "SET SF PATH", SFPATH) ++ setpath(SFPATH) ++ if evt == SET_JAVAPATH: ++ Blender.Window.FileSelector(setjavapath, "SET JAVA PATH", JAVAPATH) ++ setjavapath(JAVAPATH) ++ if evt == REND_EVT: ++ render() ++ ++ ## Setting exclusive buttons rules: ++ if evt == DOF_CAMERA: ++ if DOF.val == 1: ++ if SPHERICALCAMERA.val == 1: ++ SPHERICALCAMERA.val = 0 ++ Draw.Redraw() ++ elif FISHEYECAMERA.val == 1: ++ FISHEYECAMERA.val = 0 ++ Draw.Redraw() ++ if evt == SPHER_CAMERA: ++ if SPHERICALCAMERA.val == 1: ++ if DOF.val == 1: ++ DOF.val = 0 ++ Draw.Redraw() ++ elif FISHEYECAMERA.val == 1: ++ FISHEYECAMERA.val = 0 ++ Draw.Redraw() ++ if evt == FISH_CAMERA: ++ if FISHEYECAMERA.val == 1: ++ if DOF.val == 1: ++ DOF.val = 0 ++ Draw.Redraw() ++ elif SPHERICALCAMERA.val == 1: ++ SPHERICALCAMERA.val = 0 ++ Draw.Redraw() ++ if evt == FILTER_EVENT: ++ Draw.Redraw() ++ if evt == BUCKET_EVENT: ++ Draw.Redraw() ++ if evt == FORCE_INSTANTGI: ++ if INSTANTGI.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_IRRCACHE: ++ if IRRCACHE.val == 1: ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if IRRCACHE.val == 0: ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_PATHTRACE: ++ if PATHTRACE.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_OCCLUSION: ++ if OCCLUSION.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_FAKEAMB: ++ if FAKEAMB.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_GLOBALS: ++ if USEGLOBALS.val == 1: ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if IRRCACHE.val == 0: ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 0: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if evt == EVENT_CAUSTICS: ++ if CAUSTICS.val == 0: ++ if VIEWCAUSTICS.val == 1: ++ VIEWCAUSTICS.val = 0 ++ Draw.Redraw() ++ if evt == OVERRIDE_CAUSTICS: ++ if CAUSTICS.val == 0: ++ if VIEWCAUSTICS.val == 1: ++ VIEWCAUSTICS.val = 0 ++ Draw.Redraw() ++ if evt == OVERRIDE_GLOBALS: ++ if USEGLOBALS.val == 0: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == OVERRIDE_GI: ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if evt == IBL_EVENT: ++ if IBL.val == 0: ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if IMP_SUN.val == 1: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ if IMP_BCKGRD.val == 1: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if BACKGROUND.val == 1: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ if evt == LOCK_EVENT: ++ if IBL.val == 0: ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == SUN_EVENT: ++ if IMP_BCKGRD.val == 1: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if BACKGROUND.val == 1: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ if IBL.val == 1: ++ IBL.val = 0 ++ Draw.Redraw() ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == BCKGRD_EVENT: ++ if IMP_SUN.val == 1: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ if IBL.val == 1: ++ IBL.val = 0 ++ Draw.Redraw() ++ if BACKGROUND.val == 1: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == CBCKGRD_EVENT: ++ if IMP_SUN.val == 1: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ if IBL.val == 1: ++ IBL.val = 0 ++ Draw.Redraw() ++ if IMP_BCKGRD.val == 1: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == QUICK_OPT: ++ if QUICKOCC.val == 1: ++ QUICKOCC.val = 0 ++ Draw.Redraw() ++ if evt == QUICK_OCC: ++ QUICKOPT.val = 1 ++ Draw.Redraw(0) ++ ++ ## Rules for displaying the different panels: ++ if evt == CHANGE_AA: ++ SCREEN=0 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_CAM: ++ SCREEN=2 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_BCKGRD: ++ SCREEN=3 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_LIGHT: ++ SCREEN=4 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_GI: ++ SCREEN=5 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_SHAD: ++ SCREEN=6 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_EXP: ++ SCREEN=7 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_CFG: ++ SCREEN=8 ++ Draw.Redraw() ++ return ++ # Go back to config panel if user tries to render without configuring SF: ++ if evt == REND_EVT and trial == False: ++ SCREEN=8 ++ Draw.Redraw() ++ return ++ if evt == SHAD_OK: ++ Draw.Redraw() ++ return ++ # Events for the import and export of ID values and setting of default values ++ if evt == EXPORT_ID: ++ print(" o Sending script settings to .blend...") ++ def_output() ++ def_gi() ++ def_lights() ++ def_camera() ++ def_render() ++ print(" o Finished sending settings.") ++ return ++ if evt == DEFAULT_ID: ++ default_values() ++ print(" o Default settings restored.") ++ return ++ if evt == IMPORT_ID: ++ try: ++ if SCENE.properties['SceneProp'] == "true": ++ print(" o Script settings found in .blend, importing to script...") ++ import_output() ++ import_gi() ++ import_lights() ++ import_camera() ++ import_render() ++ except: ++ print(" o No script settings in .blend, using defaults.") ++ default_values() ++ return ++ ++# Same as the IMPORT_ID event, but needed it to be a function so we can load it on script start up # ++def auto_import(): ++ default_values() ++ try: ++ if SCENE.properties['SceneProp'] == "true": ++ print(" o Script settings found in .blend, importing to script...") ++ import_output() ++ import_gi() ++ import_lights() ++ import_camera() ++ import_render() ++ except: ++ print(" o No script settings in .blend, using defaults.") ++ default_values() ++ return ++ ++####### Draw GUI Section ####### ++################################ ++ ++## Draws the individual panels ## ++def drawGUI(): ++ global SCREEN ++ if SCREEN==0: ++ drawAA() ++ if SCREEN==2: ++ drawCamera() ++ if SCREEN==3: ++ drawBackground() ++ if SCREEN==4: ++ drawLights() ++ if SCREEN==5: ++ drawGI() ++ if SCREEN==6: ++ drawShad() ++ if SCREEN==7: ++ drawRender() ++ if SCREEN==8: ++ drawConfig() ++ ++## Draw AA options ## ++def drawAA(): ++ global MINAA, MAXAA, AASAMPLES, AAJITTER, IMGFILTERW, IMGFILTERH, IMGFILTER ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("AA:") ++ col=100; line=145; MINAA=Draw.Number("Min AA", 2, col, line, 120, 18, MINAA.val, -4, 5); ++ col=230; MAXAA=Draw.Number("Max AA", 2, col, line, 120, 18, MAXAA.val, -4, 5) ++ col=100; line=125; AASAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, AASAMPLES.val, 0, 32) ++ col=230; AAJITTER=Draw.Toggle("AA Jitter", 2, col, line, 120, 18, AAJITTER.val, "Use jitter for anti-aliasing") ++ col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Image Filter:") ++ col=100; line=100; IMGFILTER=Draw.Menu("%tImage Filter|box|gaussian|mitchell|triangle|catmull-rom|blackman-harris|sinc|lanczos", FILTER_EVENT, col, line, 120, 18, IMGFILTER.val) ++ ++ drawButtons() ++ ++## Draw camera options ## ++def drawCamera(): ++ global DOF, DOFRADIUS, SPHERICALCAMERA, FISHEYECAMERA, LENSSIDES, LENSROTATION ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Camera:") ++ col=100; line=145; DOF=Draw.Toggle("DOF", DOF_CAMERA, col, line, 120, 18, DOF.val, "Turn on depth of field") ++ col=225; DOFRADIUS=Draw.Number("Radius", 2, col, line, 120, 18, DOFRADIUS.val, 0.001, 9.999) ++ col=100; line=125; BGL.glRasterPos2i(col, line); Draw.Text("Bokeh shape -->") ++ col=225; line=120; LENSSIDES=Draw.Number("Sides", 2, col, line, 120, 18, LENSSIDES.val, 2, 8) ++ col=350; LENSROTATION=Draw.Number("Rotation", 2, col, line, 120, 18, LENSROTATION.val, 0.0, 360.0) ++ col=100; line=95; SPHERICALCAMERA=Draw.Toggle("Spherical", SPHER_CAMERA, col, line, 120, 18, SPHERICALCAMERA.val, "Use the sperical camera type") ++ col=100; line=70; FISHEYECAMERA=Draw.Toggle("Fisheye", FISH_CAMERA, col, line, 120, 18, FISHEYECAMERA.val, "Use the fisheye camera type") ++ ++ drawButtons() ++ ++## Draw Background options ## ++def drawBackground(): ++ global IMP_BCKGRD, IMP_SUN, BACKGROUND, BCKGRD, IBL, IBLLOCK, IBLSAMPLES, SUN_TURB, SUN_SAMPLES, INFINITEPLANE, IPLANECOLOR ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Simple background:") ++ col=10; line=200; IMP_BCKGRD=Draw.Toggle("Import World", BCKGRD_EVENT, col, line, 120, 18, IMP_BCKGRD.val, "Set World's Horizon color as background") ++ col=10; line=175; BACKGROUND=Draw.Toggle("Create Background", CBCKGRD_EVENT, col, line, 120, 18, BACKGROUND.val, "Define a background color") ++ col=135; BCKGRD=Draw.ColorPicker(2, 135, 175, 30, 18, BCKGRD.val, "New background color") ++ col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("High Dynamic Range Illumination (Please set a texture named 'ibllight', lower case):") ++ col=10; line=125; IBL=Draw.Toggle("Image Based Light", IBL_EVENT, col, line, 140, 18, IBL.val, "Use IBL/hdr type light") ++ col=160; IBLLOCK=Draw.Toggle("Importance Sampling", LOCK_EVENT, col, line, 130, 18, IBLLOCK.val, "Use importance sampling (lock false), IBL must be on") ++ col=300; IBLSAMPLES=Draw.Number("Samples", 2, col, line, 100, 18, IBLSAMPLES.val, 1, 1024) ++ col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Sunsky:") ++ col=10; line=75; IMP_SUN=Draw.Toggle("Import Sun", SUN_EVENT, col, line, 120, 18, IMP_SUN.val, "Import existing Sun") ++ col=140; line=75; SUN_TURB=Draw.Number("Turbidity", 2, col, line, 120, 18, SUN_TURB.val, 0.0, 32.0) ++ col=270; SUN_SAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, SUN_SAMPLES.val, 1, 10000) ++ col=400; INFINITEPLANE=Draw.Toggle("Infinite Plane", 2, col, line, 90, 18, INFINITEPLANE.val, "Use an infinite plane in the scene") ++ col=500; IPLANECOLOR=Draw.ColorPicker(2, 495, 75, 30, 18, IPLANECOLOR.val, "Infinite plane color") ++ ++ drawButtons() ++ ++## Draw light options ## ++def drawLights(): ++ global MESHLIGHTPOWER, LAMPPOWER, DSAMPLES, CONVLAMP ++ col=10; line=205; BGL.glRasterPos2i(col, line); Draw.Text("Global Options:") ++ col=10; line=180; BGL.glRasterPos2i(col, line); Draw.Text("Meshlight:") ++ col=110; line=175; MESHLIGHTPOWER=Draw.Number("Power", 2, col, line, 200, 18, MESHLIGHTPOWER.val, 1, 10000) ++ col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("Light:") ++ col=110; line=150; LAMPPOWER=Draw.Number("Power", 2, col, line, 200, 18, LAMPPOWER.val, 1, 10000) ++ col=10; line=130; BGL.glRasterPos2i(col, line); Draw.Text("Lightserver:") ++ col=110; line=125; DSAMPLES=Draw.Number("Direct Samples", 2, col, line, 200, 18, DSAMPLES.val, 0, 1024) ++ col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Unknown lamps:") ++ col=10; line = 75; CONVLAMP=Draw.Toggle("Convert lamps", 2, col, line, 140, 18, CONVLAMP.val, "Convert unsupported lamps into point light") ++ ++ drawButtons() ++ ++## Draw Shader options ## ++def drawShad(): ++ global SHADTYPE, SHADOK ++ col=10; line=400; BGL.glRasterPos2i(col, line); Draw.Text("Specific instructions for exporting shaders:") ++ col=10; line=375; BGL.glRasterPos2i(col, line); Draw.Text("For exporting bump and normal maps, have the second texture slot (slot 1) name") ++ col=10; line=350; BGL.glRasterPos2i(col, line); Draw.Text("begin with bump or normal. Controlled with the Map To Nor button and Nor slider.") ++ col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Regarding Textures: Diffuse, shiny, ambocc, phong, and ward materials will") ++ col=10; line=300; BGL.glRasterPos2i(col, line); Draw.Text("use textures as the diffuse channel if the texture is in the first texture slot.") ++ col=10; line=275; SHADTYPE=Draw.Menu("%tSelect shader|Uber|Diffuse|Shiny|AO|Phong|Ward|Mirror|Glass|Constant", SHADER_TYPE, col, line, 85, 18, SHADTYPE.val) ++ col=100; SHADOK=Draw.Button("OK", SHAD_OK, col, line, 30, 18, "Print on screen instructions") ++ if SHADTYPE == 1: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Uber: shader name should start with 'sfube' - imports Blender's Col and Spe RGB") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("values") ++ col=10; line=200; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 0: diffuse texture(Mapto Col value), else Col RGB values") ++ col=10; line=175; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the diffuse texture is controlled by the Map Input Col slider") ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 2: specular texture(Mapto Var value), else Spe RGB values") ++ col=10; line=125; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the specular texture is controlled by the Map Input Var slider") ++ if SHADTYPE == 2: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Diffuse: shader name should start with 'sfdif' - imports Blender's Col RGB values") ++ if SHADTYPE == 3: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Shiny: shader name sould start with 'sfshi' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("RayMirr values") ++ if SHADTYPE == 4: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ambient Occlusion: shader name sould start with 'sfamb' - imports Blender's") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Col RGB (Bright) and Spe RGB (Dark) values") ++ if SHADTYPE == 5: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Phong: shader name sould start with 'sfpho' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values, as well as the spec's hard value") ++ if SHADTYPE == 6: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ward: shader name sould start with 'sfwar' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values") ++ if SHADTYPE == 7: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Mirror: shader name sould start with 'sfmir' - imports Blender's Col RGB values,") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Ray Mir button must be on") ++ if SHADTYPE == 8: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Glass: shader name sould start with 'sfgla' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("IOR values, Ray Transp button must be on") ++ if SHADTYPE == 9: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Constant: shader name should start with 'sfcon' - imports Blender's Col RGB values") ++ ++ drawButtons() ++ ++## Draw export and render options settings ## ++def drawRender(): ++ global EXPORT, RENDER, SMALLMESH, NOGI, NOGUI, NOCAUSTICS, QUICKUV, QUICKNORM, QUICKID, QUICKPRIMS, QUICKGRAY, QUICKWIRE, QUICKOCC, QOCCDIST, FILETYPE, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, QUICKOPT, EXP_ANIM, IPR, BUCKETSIZE, BUCKETTYPE, REVERSE ++ col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Rendering actions:") ++ col=10; line=300; EXPORT=Draw.Button("Export .sc", EXP_EVT, col, line, 140, 18, "Export the scene to .sc file") ++ col=160; RENDER=Draw.Button("Render exported", REND_EVT, col, line, 130, 18, "Render it (Export a .sc file first)") ++ col=300; FILETYPE=Draw.Menu("%tFile type|png|tga|hdr|exr|igi", FILE_TYPE, col, line, 85, 18, FILETYPE.val) ++ col=10; line=280; BGL.glRasterPos2i(col, line); Draw.Text("Max raytrace depths:") ++ col=10; line=255; DEPTH_DIFF=Draw.Number("Diffuse Depth", 2, col, line, 125, 18, DEPTH_DIFF.val, 1, 100) ++ col=150; DEPTH_REFL=Draw.Number("Reflection Depth", 2, col, line, 125, 18, DEPTH_REFL.val, 1, 100) ++ col=290; DEPTH_REFR=Draw.Number("Refraction Depth", 2, col, line, 125, 18, DEPTH_REFR.val, 1, 100) ++ col=10; line=240; BGL.glRasterPos2i(col, line); Draw.Text("Bucket Order:") ++ col=10; line=215; BUCKETSIZE=Draw.Number("Bucket Size", 2, col, line, 125, 18, BUCKETSIZE.val, 8, 64) ++ col=150; BUCKETTYPE=Draw.Menu("%tBucket Order|hilbert (default)|spiral|column|row|diagonal|random", BUCKET_EVENT, col, line, 125, 18, BUCKETTYPE.val) ++ col=290; REVERSE=Draw.Toggle("Reverse Order", 2, col, line, 125, 18, REVERSE.val, "Use reverse bucket order") ++ col=10; line=195; BGL.glRasterPos2i(col, line); Draw.Text("Rendering options:") ++ col=10; line=170; SMALLMESH=Draw.Toggle("Small mesh", 2, col, line, 85, 18, SMALLMESH.val, "Load triangle meshes using triangles optimized for memory use") ++ col=100; NOGI=Draw.Toggle("No GI", 2, col, line, 85, 18, NOGI.val, "Disable any global illumination engines in the scene") ++ col=190; NOCAUSTICS=Draw.Toggle("No Caustics", 2, col, line, 85, 18, NOCAUSTICS.val, "Disable any caustic engine in the scene") ++ col=280; NOGUI=Draw.Toggle("No GUI", 2, col, line, 85, 18, NOGUI.val, "Don't open the frame showing rendering progress") ++ col=370; IPR=Draw.Toggle("IPR", 2, col, line, 85, 18, IPR.val, "Render using progressive algorithm") ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Quick override options:") ++ col=10; line=125; QUICKOPT=Draw.Menu("%tQuick option|None|Quick UVs|Quick Normals|Quick ID|Quick Primitives|Quick Gray|Quick Wire", QUICK_OPT, col, line, 100, 18, QUICKOPT.val) ++ col=10; line=100; QUICKOCC=Draw.Toggle("Quick Amb Occ", QUICK_OCC, col, line, 85, 18, QUICKOCC.val, "Applies ambient occlusion to the scene with specified maximum distance") ++ col=100; QOCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, QOCCDIST.val, 0.00, 1000.00) ++ col=10; line=75; EXP_ANIM=Draw.Toggle("Export As Animation", 2, col, line, 140, 18, EXP_ANIM.val, "Export the scene as animation") ++ ++ drawButtons() ++ ++## Draw the SF configuration settings ## ++def drawConfig(): ++ global SET_PATH, THREADS, MEM, SET_JAVAPATH ++ col=10; line = 315; BGL.glRasterPos2i(col, line); Draw.Text("ID properties for script settings:") ++ col= 10; line = 285; Draw.Button("Send Script Settings", EXPORT_ID, col, line, 140,18, "Send script settings to the .blend") ++ col= 155; Draw.Button("Restore Default Settings", DEFAULT_ID, col, line, 140,18, "Use script defaults") ++ col= 300; Draw.Button("Reload ID Settings", IMPORT_ID, col, line, 140,18, "Reload ID properties from .blend") ++ col=10; line = 255; BGL.glRasterPos2i(col, line); Draw.Text("Settings needed to render directly from the script:") ++ col=155; line = 230; BGL.glRasterPos2i(col, line); Draw.Text("(threads=0 means auto-detect)") ++ col=10; line = 225; THREADS=Draw.Number("Threads", 2, col, line, 140, 18, THREADS.val, 0, 8) ++ col=10; line = 200; MEM=Draw.Number("Memory (MB)", 2, col, line, 140, 18, MEM.val, 256, 4096) ++ col= 10; line = 175; Draw.Button("Save SF Path & Settings", SET_PATH, col, line, 140,18) ++ col= 10; line = 150; Draw.Button("Save Java Path", SET_JAVAPATH, col, line, 140,18) ++ col=155; line = 155; BGL.glRasterPos2i(col, line); Draw.Text("Set Java path after Sunflow path") ++ # Get blenders 'bpydata' directory: ++ datadir=Blender.Get("datadir") ++ # Check if the config file exists: ++ trial=os.path.exists(datadir+'/path2sf.cfg') ++ # If config file exists, retrieve existing values: ++ if trial == 1: ++ # open 'path2sf.cfg' ++ f = open(datadir + '/path2sf.cfg', 'r+') ++ sfdir = f.readline() ++ memory = f.readline() ++ threads = f.readline() ++ javadir = f.readline() ++ col=10; line = 130; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow path: %s" % sfdir) ++ col=10; line = 110; BGL.glRasterPos2i(col, line); Draw.Text("Memory: %s MB" % memory) ++ col=10; line = 90; BGL.glRasterPos2i(col, line); Draw.Text("Threads: %s" % threads) ++ col=10; line = 70; BGL.glRasterPos2i(col, line); Draw.Text("Java path: %s" % javadir) ++ f.close() ++ # If config file doesn't exist, issue a warning: ++ if trial == 0: ++ col=10; line = 105; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow is not configured yet - set Memory, Number of Threads and Path to sunflow.jar") ++ ++ drawButtons() ++ ++## Draw caustic and global illumination settings ## ++def drawGI(): ++ global CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE, PHOTONRADIUS ++ global INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES ++ global IRRCACHE, IRRSAMPLES, IRRTOLERANCE, IRRSPACEMIN, IRRSPACEMAX ++ global gPHOTONNUMBER, gPHOTONESTIMATE, gPHOTONRADIUS, gPHOTONMAP, USEGLOBALS ++ global PATHTRACE, PATHSAMPLES ++ global VIEWCAUSTICS, VIEWGLOBALS, VIEWGI ++ global OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST ++ global FAKEAMB, FAMBSKY, FAMBGROUND ++ ++ # GI/Caustics part # ++ col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Caustics and Global Illumination") ++ #Caustics# ++ col=10; line=300; CAUSTICS=Draw.Toggle("Caustics", EVENT_CAUSTICS, col, line, 85, 18, CAUSTICS.val, "Turn on caustics in the scene") ++ col=100; PHOTONNUMBER=Draw.Number("Photons", 2, col, line, 125, 18, PHOTONNUMBER.val, 0, 5000000) ++ col=230; PHOTONMAP=Draw.Menu("%tCaustics Photon Map|kd", PHOTON_EVENT, col, line, 60, 18, PHOTONMAP.val) ++ col=295; PHOTONESTIMATE=Draw.Number("Photon Estim.", 2, col, line, 125, 18, PHOTONESTIMATE.val, 0, 1000) ++ col=425; PHOTONRADIUS=Draw.Number("Photon Radius", 2, col, line, 125, 18, PHOTONRADIUS.val, 0.00, 10.00) ++ #Instant GI# ++ col=10; line=275; INSTANTGI=Draw.Toggle("Instant GI", FORCE_INSTANTGI, col, line, 85, 18, INSTANTGI.val, "Enable Instant GI for GI in the scene") ++ col=100; IGISAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IGISAMPLES.val, 0, 1024) ++ col=230; IGISETS=Draw.Number("Number of Sets", 2, col, line, 125, 18, IGISETS.val, 1.0, 100.0) ++ col=100; line=250; IGIBIAS=Draw.Number("Bias", 2, col, line, 125, 18, IGIBIAS.val, 0.000, 1.000) ++ col=230; IGIBIASSAMPLES=Draw.Number("Bias Samples", 2, col, line, 125, 18, IGIBIASSAMPLES.val, 0, 64) ++ #Irradiance Caching# ++ col=10; line=225; IRRCACHE=Draw.Toggle("Irr. Cache", FORCE_IRRCACHE, col, line, 85, 18, IRRCACHE.val, "Enable Irradiance Caching for GI in the scene") ++ col=100; IRRSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IRRSAMPLES.val, 0, 1024) ++ col=230; IRRTOLERANCE=Draw.Number("Tolerance", 2, col, line, 125, 18, IRRTOLERANCE.val, 0.0, 0.10) ++ col=100; line=200; IRRSPACEMIN=Draw.Number("Min. Space", 2, col, line, 125, 18, IRRSPACEMIN.val, 0.00, 10.00) ++ col=230; IRRSPACEMAX=Draw.Number("Max. Space", 2, col, line, 125, 18, IRRSPACEMAX.val, 0.00, 10.00) ++ col=10; line=175; USEGLOBALS=Draw.Toggle("Use Globals", FORCE_GLOBALS, col, line, 85, 18, USEGLOBALS.val, "Use global photons instead of path tracing for Irr. Cache secondary bounces") ++ col=100; gPHOTONNUMBER=Draw.Number("Glob. Phot.", 2, col, line, 125, 18, gPHOTONNUMBER.val, 0, 5000000) ++ col=230; gPHOTONMAP=Draw.Menu("%tGlobal Photon Map|grid", gPHOTON_EVENT, col, line, 60, 18, gPHOTONMAP.val) ++ col=295; gPHOTONESTIMATE=Draw.Number("Global Estim.", 2, col, line, 125, 18, gPHOTONESTIMATE.val, 0, 1000) ++ col=425; gPHOTONRADIUS=Draw.Number("Global Radius", 2, col, line, 125, 18, gPHOTONRADIUS.val, 0.00, 10.00) ++ #Path Tracing# ++ col=10; line=150; PATHTRACE=Draw.Toggle("Path Tracing", FORCE_PATHTRACE, col, line, 85, 18, PATHTRACE.val, "Enable Path Tracing for GI in the scene") ++ col=100; PATHSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, PATHSAMPLES.val, 0, 1024) ++ #AO# ++ col=10; line=125; OCCLUSION=Draw.Toggle("Amb Occ", FORCE_OCCLUSION, col, line, 85, 18, OCCLUSION.val, "Turn on ambient occlusion for the whole scene") ++ col=100; OCCBRIGHT=Draw.ColorPicker(2, 100, 125, 30, 18, OCCBRIGHT.val, "Ambient Occlusion bright color") ++ col=135; OCCDARK=Draw.ColorPicker(2, 135, 125, 30, 18, OCCDARK.val, "Ambient Occlusion dark color") ++ col=170; OCCSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, OCCSAMPLES.val, 0, 256) ++ col=300; OCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, OCCDIST.val, -1.0, 150.0) ++ #Fake Ambient Term# ++ col=10; line=100; FAKEAMB=Draw.Toggle("Fake Amb", FORCE_FAKEAMB, col, line, 85, 18, FAKEAMB.val, "Turn on Fake Ambient Term for the scene") ++ col=100; FAMBSKY=Draw.ColorPicker(2, 100, 100, 30, 18, FAMBSKY.val, "Fake Ambient Term sky color") ++ col=135; FAMBGROUND=Draw.ColorPicker(2, 135, 100, 30, 18, FAMBGROUND.val, "Fake Ambient Term ground color") ++ #Overrides# ++ col=100; line=75; VIEWCAUSTICS=Draw.Toggle("Just Caustics", OVERRIDE_CAUSTICS, col, line, 85, 18, VIEWCAUSTICS.val, "Render only the caustic photons in the scene (Caustics must be on)") ++ col=190; VIEWGLOBALS=Draw.Toggle("Just Globals", OVERRIDE_GLOBALS, col, line, 85, 18, VIEWGLOBALS.val, "Render only the global photons in the scene (Use Globals must be on)") ++ col=280; VIEWGI=Draw.Toggle("Just GI", OVERRIDE_GI, col, line, 85, 18, VIEWGI.val, "Render only the gi components in the scene (A GI engine must be selected)") ++ drawButtons() ++ ++## Draw the bottom bar of buttons in the interface ## ++def drawButtons(): ++ Draw.Button("Configure SF", CHANGE_CFG, 20, 10, 90, 50) ++ Draw.Button("AA", CHANGE_AA, 115 , 40, 90, 20) ++ Draw.Button("Camera", CHANGE_CAM, 210, 40, 90, 20) ++ Draw.Button("Light", CHANGE_LIGHT, 305, 40, 90, 20) ++ Draw.Button("Caustics/GI", CHANGE_GI, 115, 10, 90, 20) ++ Draw.Button("Shader Info", CHANGE_SHAD, 210, 10, 90, 20) ++ Draw.Button("Background", CHANGE_BCKGRD,305, 10, 90, 20) ++ Draw.Button("Render settings", CHANGE_EXP, 400, 10, 90, 50) ++ ++####### Script Startup Section ####### ++###################################### ++ ++SCREEN=7 ++auto_import() ++Draw.Register(drawGUI, event, buttonEvent) ++ diff -Nru sunflow-0.07.2.svn396+dfsg/debian/patches/50_python_consistent_indentation sunflow-0.07.2.svn396+dfsg/debian/patches/50_python_consistent_indentation --- sunflow-0.07.2.svn396+dfsg/debian/patches/50_python_consistent_indentation 1970-01-01 00:00:00.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/patches/50_python_consistent_indentation 2019-09-03 16:25:01.000000000 +0000 @@ -0,0 +1,4493 @@ +Description: Use consistent indentation in sunflow_export.py +Forwarded: no +Author: tony mancill + +--- a/exporters/blender/sunflow_export.py ++++ b/exporters/blender/sunflow_export.py +@@ -8,7 +8,7 @@ + + Version : 1.4.18 (January 2008) + Author : R Lindsay (hayfever) / Christopher Kulla / MADCello / +- olivS / Eugene Reilly / Heavily Tessellated / Humfred ++ olivS / Eugene Reilly / Heavily Tessellated / Humfred + Description : Export to Sunflow renderer http://sunflow.sourceforge.net/ + Usage : See how to use the script at http://sunflow.sourceforge.net/phpbb2/viewtopic.php?t=125 + +@@ -102,119 +102,119 @@ + + ## Default values of buttons ## + def default_values(): +- global FILETYPE, MINAA, MAXAA, AASAMPLES, AAJITTER, DSAMPLES, IMGFILTER, IMGFILTERW, IMGFILTERH, BUCKETSIZE,\ +- BUCKETTYPE, REVERSE, DOF, DOFRADIUS, LENSSIDES, LENSROTATION, SPHERICALCAMERA, FISHEYECAMERA, IMP_BCKGRD,\ +- IMP_SUN, BCKGRD, BACKGROUND, SUN_TURB, SUN_SAMPLES, IBL, IBLLOCK, IBLSAMPLES, INFINITEPLANE, IPLANECOLOR,\ +- MESHLIGHTPOWER, LAMPPOWER, CONVLAMP, MEM, THREADS, CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE,\ +- PHOTONRADIUS, INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES, IRRCACHE, IRRSAMPLES, IRRTOLERANCE,\ +- IRRSPACEMIN, IRRSPACEMAX, USEGLOBALS, gPHOTONNUMBER, gPHOTONMAP, gPHOTONESTIMATE, gPHOTONRADIUS, PATHTRACE,\ +- PATHSAMPLES, VIEWCAUSTICS, VIEWGLOBALS, VIEWGI, OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST,\ +- SHADTYPE, QUICKOPT, IPR, EXP_ANIM, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, NOGI, NOCAUSTICS, QUICKOCC, QOCCDIST,\ +- NOGUI, SMALLMESH, IMGFILTERLIST, BUCKETTYPELIST, PHOTONMAPLIST, gPHOTONMAPLIST, FAKEAMB, FAMBSKY, FAMBGROUND +- +- FILETYPE = Draw.Create(1) +- +- # AA panel values +- MINAA = Draw.Create(0) +- MAXAA = Draw.Create(2) +- AASAMPLES = Draw.Create(1) +- AAJITTER = Draw.Create(0) +- DSAMPLES = Draw.Create(16) +- IMGFILTER = Draw.Create(1) +- IMGFILTERW = Draw.Create(1) +- IMGFILTERH = Draw.Create(1) +- BUCKETSIZE = Draw.Create(64) +- BUCKETTYPE = Draw.Create(1) +- REVERSE = Draw.Create(0) +- +- # Camera panel values +- DOF = Draw.Create(0) +- DOFRADIUS = Draw.Create(1.00) +- LENSSIDES = Draw.Create(6) +- LENSROTATION = Draw.Create(0.0) +- SPHERICALCAMERA = Draw.Create(0) +- FISHEYECAMERA = Draw.Create(0) +- +- # Background panel values +- IMP_BCKGRD = Draw.Create(1) +- IMP_SUN = Draw.Create(0) +- BCKGRD = Draw.Create(0.0, 0.0, 0.0) +- BACKGROUND = Draw.Create(0) +- SUN_TURB = Draw.Create(6.0) +- SUN_SAMPLES = Draw.Create(128) +- IBL = Draw.Create(0) +- IBLLOCK = Draw.Create(0) +- IBLSAMPLES = Draw.Create(16) +- INFINITEPLANE = Draw.Create(0) +- IPLANECOLOR= Draw.Create(1.0, 1.0, 1.0) +- +- # Light panel values +- MESHLIGHTPOWER = Draw.Create(100) +- LAMPPOWER = Draw.Create(100) +- CONVLAMP = Draw.Create(0) +- +- # Config panel values +- MEM = Draw.Create(1024) +- THREADS = Draw.Create(0) +- +- # GI/Caustic panel values +- CAUSTICS = Draw.Create(0) +- PHOTONNUMBER = Draw.Create(1000000) +- PHOTONMAP = Draw.Create(1) +- PHOTONESTIMATE = Draw.Create(100) +- PHOTONRADIUS = Draw.Create(0.5) +- INSTANTGI = Draw.Create(0) +- IGISAMPLES = Draw.Create(64) +- IGISETS = Draw.Create(1) +- IGIBIAS = Draw.Create(0.01) +- IGIBIASSAMPLES = Draw.Create(0) +- IRRCACHE = Draw.Create(0) +- IRRSAMPLES = Draw.Create(512) +- IRRTOLERANCE = Draw.Create(0.01) +- IRRSPACEMIN = Draw.Create(0.05) +- IRRSPACEMAX = Draw.Create(5.0) +- USEGLOBALS = Draw.Create(0) +- gPHOTONNUMBER = Draw.Create(1000000) +- gPHOTONMAP = Draw.Create(1) +- gPHOTONESTIMATE = Draw.Create(100) +- gPHOTONRADIUS = Draw.Create(0.5) +- PATHTRACE = Draw.Create(0) +- PATHSAMPLES = Draw.Create(32) +- VIEWCAUSTICS = Draw.Create(0) +- VIEWGLOBALS = Draw.Create(0) +- VIEWGI = Draw.Create(0) +- OCCLUSION = Draw.Create(0) +- OCCBRIGHT = Draw.Create(1.0, 1.0, 1.0) +- OCCDARK = Draw.Create(0.0, 0.0, 0.0) +- OCCSAMPLES = Draw.Create(32) +- OCCDIST = Draw.Create(3.0) +- FAKEAMB = Draw.Create(0) +- FAMBSKY = Draw.Create(1.0, 0.95, 0.65) +- FAMBGROUND = Draw.Create(0.5, 0.8, 1.0) +- +- # Shader panel values +- SHADTYPE = Draw.Create(1) +- +- # Render panel values +- QUICKOPT = Draw.Create(1) +- IPR = Draw.Create(0) +- EXP_ANIM = Draw.Create(0) +- DEPTH_DIFF = Draw.Create(1) +- DEPTH_REFL = Draw.Create(4) +- DEPTH_REFR = Draw.Create(4) +- NOGI = Draw.Create(0) +- NOCAUSTICS = Draw.Create(0) +- QUICKOCC = Draw.Create(0) +- QOCCDIST = Draw.Create(0.5) +- NOGUI = Draw.Create(0) +- SMALLMESH = Draw.Create(0) +- +- ## Lists ## +- IMGFILTERLIST = ["box", "gaussian", "mitchell", "triangle", "catmull-rom", "blackman-harris", "sinc", "lanczos"] +- BUCKETTYPELIST = ["hilbert", "spiral", "column", "row", "diagonal", "random"] +- FILETYPE +- PHOTONMAPLIST = ["kd"] +- gPHOTONMAPLIST = ["grid"] ++ global FILETYPE, MINAA, MAXAA, AASAMPLES, AAJITTER, DSAMPLES, IMGFILTER, IMGFILTERW, IMGFILTERH, BUCKETSIZE,\ ++ BUCKETTYPE, REVERSE, DOF, DOFRADIUS, LENSSIDES, LENSROTATION, SPHERICALCAMERA, FISHEYECAMERA, IMP_BCKGRD,\ ++ IMP_SUN, BCKGRD, BACKGROUND, SUN_TURB, SUN_SAMPLES, IBL, IBLLOCK, IBLSAMPLES, INFINITEPLANE, IPLANECOLOR,\ ++ MESHLIGHTPOWER, LAMPPOWER, CONVLAMP, MEM, THREADS, CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE,\ ++ PHOTONRADIUS, INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES, IRRCACHE, IRRSAMPLES, IRRTOLERANCE,\ ++ IRRSPACEMIN, IRRSPACEMAX, USEGLOBALS, gPHOTONNUMBER, gPHOTONMAP, gPHOTONESTIMATE, gPHOTONRADIUS, PATHTRACE,\ ++ PATHSAMPLES, VIEWCAUSTICS, VIEWGLOBALS, VIEWGI, OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST,\ ++ SHADTYPE, QUICKOPT, IPR, EXP_ANIM, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, NOGI, NOCAUSTICS, QUICKOCC, QOCCDIST,\ ++ NOGUI, SMALLMESH, IMGFILTERLIST, BUCKETTYPELIST, PHOTONMAPLIST, gPHOTONMAPLIST, FAKEAMB, FAMBSKY, FAMBGROUND ++ ++ FILETYPE = Draw.Create(1) ++ ++ # AA panel values ++ MINAA = Draw.Create(0) ++ MAXAA = Draw.Create(2) ++ AASAMPLES = Draw.Create(1) ++ AAJITTER = Draw.Create(0) ++ DSAMPLES = Draw.Create(16) ++ IMGFILTER = Draw.Create(1) ++ IMGFILTERW = Draw.Create(1) ++ IMGFILTERH = Draw.Create(1) ++ BUCKETSIZE = Draw.Create(64) ++ BUCKETTYPE = Draw.Create(1) ++ REVERSE = Draw.Create(0) ++ ++ # Camera panel values ++ DOF = Draw.Create(0) ++ DOFRADIUS = Draw.Create(1.00) ++ LENSSIDES = Draw.Create(6) ++ LENSROTATION = Draw.Create(0.0) ++ SPHERICALCAMERA = Draw.Create(0) ++ FISHEYECAMERA = Draw.Create(0) ++ ++ # Background panel values ++ IMP_BCKGRD = Draw.Create(1) ++ IMP_SUN = Draw.Create(0) ++ BCKGRD = Draw.Create(0.0, 0.0, 0.0) ++ BACKGROUND = Draw.Create(0) ++ SUN_TURB = Draw.Create(6.0) ++ SUN_SAMPLES = Draw.Create(128) ++ IBL = Draw.Create(0) ++ IBLLOCK = Draw.Create(0) ++ IBLSAMPLES = Draw.Create(16) ++ INFINITEPLANE = Draw.Create(0) ++ IPLANECOLOR= Draw.Create(1.0, 1.0, 1.0) ++ ++ # Light panel values ++ MESHLIGHTPOWER = Draw.Create(100) ++ LAMPPOWER = Draw.Create(100) ++ CONVLAMP = Draw.Create(0) ++ ++ # Config panel values ++ MEM = Draw.Create(1024) ++ THREADS = Draw.Create(0) ++ ++ # GI/Caustic panel values ++ CAUSTICS = Draw.Create(0) ++ PHOTONNUMBER = Draw.Create(1000000) ++ PHOTONMAP = Draw.Create(1) ++ PHOTONESTIMATE = Draw.Create(100) ++ PHOTONRADIUS = Draw.Create(0.5) ++ INSTANTGI = Draw.Create(0) ++ IGISAMPLES = Draw.Create(64) ++ IGISETS = Draw.Create(1) ++ IGIBIAS = Draw.Create(0.01) ++ IGIBIASSAMPLES = Draw.Create(0) ++ IRRCACHE = Draw.Create(0) ++ IRRSAMPLES = Draw.Create(512) ++ IRRTOLERANCE = Draw.Create(0.01) ++ IRRSPACEMIN = Draw.Create(0.05) ++ IRRSPACEMAX = Draw.Create(5.0) ++ USEGLOBALS = Draw.Create(0) ++ gPHOTONNUMBER = Draw.Create(1000000) ++ gPHOTONMAP = Draw.Create(1) ++ gPHOTONESTIMATE = Draw.Create(100) ++ gPHOTONRADIUS = Draw.Create(0.5) ++ PATHTRACE = Draw.Create(0) ++ PATHSAMPLES = Draw.Create(32) ++ VIEWCAUSTICS = Draw.Create(0) ++ VIEWGLOBALS = Draw.Create(0) ++ VIEWGI = Draw.Create(0) ++ OCCLUSION = Draw.Create(0) ++ OCCBRIGHT = Draw.Create(1.0, 1.0, 1.0) ++ OCCDARK = Draw.Create(0.0, 0.0, 0.0) ++ OCCSAMPLES = Draw.Create(32) ++ OCCDIST = Draw.Create(3.0) ++ FAKEAMB = Draw.Create(0) ++ FAMBSKY = Draw.Create(1.0, 0.95, 0.65) ++ FAMBGROUND = Draw.Create(0.5, 0.8, 1.0) ++ ++ # Shader panel values ++ SHADTYPE = Draw.Create(1) ++ ++ # Render panel values ++ QUICKOPT = Draw.Create(1) ++ IPR = Draw.Create(0) ++ EXP_ANIM = Draw.Create(0) ++ DEPTH_DIFF = Draw.Create(1) ++ DEPTH_REFL = Draw.Create(4) ++ DEPTH_REFR = Draw.Create(4) ++ NOGI = Draw.Create(0) ++ NOCAUSTICS = Draw.Create(0) ++ QUICKOCC = Draw.Create(0) ++ QOCCDIST = Draw.Create(0.5) ++ NOGUI = Draw.Create(0) ++ SMALLMESH = Draw.Create(0) ++ ++ ## Lists ## ++ IMGFILTERLIST = ["box", "gaussian", "mitchell", "triangle", "catmull-rom", "blackman-harris", "sinc", "lanczos"] ++ BUCKETTYPELIST = ["hilbert", "spiral", "column", "row", "diagonal", "random"] ++ FILETYPE ++ PHOTONMAPLIST = ["kd"] ++ gPHOTONMAPLIST = ["grid"] + + ####### Script Settings Section ####### + ####################################### +@@ -222,2191 +222,2191 @@ + ## Background and AA settings ## + # Send background and AA values to Blender as IDs # + def def_output(): +- global IM_HEIGHT, IM_WIDTH +- # Define Blender's values +- world = Blender.World.GetCurrent() +- horcol = world.getHor() +- horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] +- IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() +- IM_WIDTH = SCENE.getRenderingContext().imageSizeX() +- +- # Writes Scene properties +- SCENE.properties['SceneProp'] = "true" +- SCENE.properties['ImageWidth'] = IM_WIDTH +- SCENE.properties['ImageHeight'] = IM_HEIGHT +- SCENE.properties['MinAA'] = MINAA.val +- SCENE.properties['MaxAA'] = MAXAA.val +- SCENE.properties['Samples'] = AASAMPLES.val +- SCENE.properties['Filter'] = IMGFILTER.val +- if AAJITTER.val == 1: +- SCENE.properties['Jitter'] = "true" +- else: +- SCENE.properties['Jitter'] = "false" +- SCENE.properties['DepthDiff'] = DEPTH_DIFF.val +- SCENE.properties['DepthRefl'] = DEPTH_REFL.val +- SCENE.properties['DepthRefr'] = DEPTH_REFR.val +- if IMP_BCKGRD.val == 1: +- SCENE.properties['Blender Background'] = "true" +- SCENE.properties['HorizonColR'] = horcol0 +- SCENE.properties['HorizonColG'] = horcol1 +- SCENE.properties['HorizonColB'] = horcol2 +- else: +- SCENE.properties['Blender Background'] = "false" +- if BACKGROUND.val == 1: +- SCENE.properties['Script Background'] = "true" +- SCENE.properties['HorizonCol'] = BCKGRD.val +- else: +- SCENE.properties['Script Background'] = "false" +- SCENE.properties['Bucket Size'] = BUCKETSIZE.val +- SCENE.properties['Bucket Type'] = BUCKETTYPE.val +- if REVERSE == 1: +- SCENE.properties['Reverse Bucket'] = "true" +- else: +- SCENE.properties['Reverse Bucket'] = "false" ++ global IM_HEIGHT, IM_WIDTH ++ # Define Blender's values ++ world = Blender.World.GetCurrent() ++ horcol = world.getHor() ++ horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] ++ IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() ++ IM_WIDTH = SCENE.getRenderingContext().imageSizeX() ++ ++ # Writes Scene properties ++ SCENE.properties['SceneProp'] = "true" ++ SCENE.properties['ImageWidth'] = IM_WIDTH ++ SCENE.properties['ImageHeight'] = IM_HEIGHT ++ SCENE.properties['MinAA'] = MINAA.val ++ SCENE.properties['MaxAA'] = MAXAA.val ++ SCENE.properties['Samples'] = AASAMPLES.val ++ SCENE.properties['Filter'] = IMGFILTER.val ++ if AAJITTER.val == 1: ++ SCENE.properties['Jitter'] = "true" ++ else: ++ SCENE.properties['Jitter'] = "false" ++ SCENE.properties['DepthDiff'] = DEPTH_DIFF.val ++ SCENE.properties['DepthRefl'] = DEPTH_REFL.val ++ SCENE.properties['DepthRefr'] = DEPTH_REFR.val ++ if IMP_BCKGRD.val == 1: ++ SCENE.properties['Blender Background'] = "true" ++ SCENE.properties['HorizonColR'] = horcol0 ++ SCENE.properties['HorizonColG'] = horcol1 ++ SCENE.properties['HorizonColB'] = horcol2 ++ else: ++ SCENE.properties['Blender Background'] = "false" ++ if BACKGROUND.val == 1: ++ SCENE.properties['Script Background'] = "true" ++ SCENE.properties['HorizonCol'] = BCKGRD.val ++ else: ++ SCENE.properties['Script Background'] = "false" ++ SCENE.properties['Bucket Size'] = BUCKETSIZE.val ++ SCENE.properties['Bucket Type'] = BUCKETTYPE.val ++ if REVERSE == 1: ++ SCENE.properties['Reverse Bucket'] = "true" ++ else: ++ SCENE.properties['Reverse Bucket'] = "false" + + # Import background and AA values from Blender IDs to script # + def import_output(): +- global IM_HEIGHT, IM_WIDTH +- # Retrieve Blender's Scene ID values +- world = Blender.World.GetCurrent() +- horcol = world.getHor() +- horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] +- IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() +- IM_WIDTH = SCENE.getRenderingContext().imageSizeX() +- +- if SCENE.properties['SceneProp'] == "true": +- IM_WIDTH = SCENE.properties['ImageWidth'] +- IM_HEIGHT = SCENE.properties['ImageHeight'] +- MINAA.val = SCENE.properties['MinAA'] +- MAXAA.val = SCENE.properties['MaxAA'] +- AASAMPLES.val = SCENE.properties['Samples'] +- IMGFILTER.val = SCENE.properties['Filter'] +- DEPTH_DIFF.val = SCENE.properties['DepthDiff'] +- DEPTH_REFL.val = SCENE.properties['DepthRefl'] +- DEPTH_REFR.val = SCENE.properties['DepthRefr'] +- Draw.Redraw() +- if SCENE.properties['Jitter'] == "true": +- AAJITTER.val = 1 +- Draw.Redraw() +- else: +- AAJITTER.val = 0 +- Draw.Redraw() +- if SCENE.properties['Blender Background'] == "true": +- IMP_BCKGRD.val = 1 +- horcol0 = SCENE.properties['HorizonColR'] +- horcol1 = SCENE.properties['HorizonColG'] +- horcol2 = SCENE.properties['HorizonColB'] +- BACKGROUND.val = 0 +- Draw.Redraw() +- else: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if SCENE.properties['Script Background'] == "true": +- BACKGROUND.val = 1 +- BCKGRD.val = SCENE.properties['HorizonCol'][0], SCENE.properties['HorizonCol'][1], SCENE.properties['HorizonCol'][2] +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- else: +- BACKGROUND.val = 0 +- Draw.Redraw() +- BUCKETSIZE.val = SCENE.properties['Bucket Size'] +- BUCKETTYPE.val = SCENE.properties['Bucket Type'] +- if SCENE.properties['Reverse Bucket'] == "true": +- REVERSE.val = 1 +- Draw.Redraw() +- else: +- REVERSE.val = 0 +- Draw.Redraw() ++ global IM_HEIGHT, IM_WIDTH ++ # Retrieve Blender's Scene ID values ++ world = Blender.World.GetCurrent() ++ horcol = world.getHor() ++ horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] ++ IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() ++ IM_WIDTH = SCENE.getRenderingContext().imageSizeX() ++ ++ if SCENE.properties['SceneProp'] == "true": ++ IM_WIDTH = SCENE.properties['ImageWidth'] ++ IM_HEIGHT = SCENE.properties['ImageHeight'] ++ MINAA.val = SCENE.properties['MinAA'] ++ MAXAA.val = SCENE.properties['MaxAA'] ++ AASAMPLES.val = SCENE.properties['Samples'] ++ IMGFILTER.val = SCENE.properties['Filter'] ++ DEPTH_DIFF.val = SCENE.properties['DepthDiff'] ++ DEPTH_REFL.val = SCENE.properties['DepthRefl'] ++ DEPTH_REFR.val = SCENE.properties['DepthRefr'] ++ Draw.Redraw() ++ if SCENE.properties['Jitter'] == "true": ++ AAJITTER.val = 1 ++ Draw.Redraw() ++ else: ++ AAJITTER.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Blender Background'] == "true": ++ IMP_BCKGRD.val = 1 ++ horcol0 = SCENE.properties['HorizonColR'] ++ horcol1 = SCENE.properties['HorizonColG'] ++ horcol2 = SCENE.properties['HorizonColB'] ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ else: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Script Background'] == "true": ++ BACKGROUND.val = 1 ++ BCKGRD.val = SCENE.properties['HorizonCol'][0], SCENE.properties['HorizonCol'][1], SCENE.properties['HorizonCol'][2] ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ else: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ BUCKETSIZE.val = SCENE.properties['Bucket Size'] ++ BUCKETTYPE.val = SCENE.properties['Bucket Type'] ++ if SCENE.properties['Reverse Bucket'] == "true": ++ REVERSE.val = 1 ++ Draw.Redraw() ++ else: ++ REVERSE.val = 0 ++ Draw.Redraw() + + # Export background and AA values # + def export_output(): +- print("o exporting output details...") +- FILE.write("image {\n") +- FILE.write("\tresolution %d %d\n" % (IM_WIDTH, IM_HEIGHT)) +- FILE.write("\taa %s %s\n" % (MINAA.val, MAXAA.val)) +- FILE.write("\tsamples %s\n" % AASAMPLES.val) +- FILE.write("\tfilter %s\n" % IMGFILTERLIST[IMGFILTER.val-1]) +- if AAJITTER == 1: +- FILE.write("\tjitter true\n") +- FILE.write("}") +- FILE.write("\n") +- +- print("o exporting trace-depths options...") +- FILE.write("trace-depths {\n") +- FILE.write("\tdiff %s \n" % DEPTH_DIFF) +- FILE.write("\trefl %s \n" % DEPTH_REFL) +- FILE.write("\trefr %s\n" % DEPTH_REFR) +- FILE.write("}") +- FILE.write("\n") +- if IMP_BCKGRD.val == 1: +- print("o exporting background...") +- world = Blender.World.GetCurrent() +- horcol = world.getHor() +- horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] +- FILE.write("background {\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (horcol0, horcol1, horcol2)) +- FILE.write("}") +- FILE.write("\n") +- elif BACKGROUND.val == 1: +- print("o creating background...") +- FILE.write("background {\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % BCKGRD.val) +- FILE.write("}") +- FILE.write("\n") +- if REVERSE.val == 0: +- FILE.write("\nbucket %s %s\n" % (BUCKETSIZE.val, BUCKETTYPELIST[BUCKETTYPE.val-1])) +- elif REVERSE.val == 1: +- FILE.write("\nbucket %s " % BUCKETSIZE.val) +- FILE.write("\"reverse %s\"\n" % BUCKETTYPELIST[BUCKETTYPE.val-1]) ++ print("o exporting output details...") ++ FILE.write("image {\n") ++ FILE.write("\tresolution %d %d\n" % (IM_WIDTH, IM_HEIGHT)) ++ FILE.write("\taa %s %s\n" % (MINAA.val, MAXAA.val)) ++ FILE.write("\tsamples %s\n" % AASAMPLES.val) ++ FILE.write("\tfilter %s\n" % IMGFILTERLIST[IMGFILTER.val-1]) ++ if AAJITTER == 1: ++ FILE.write("\tjitter true\n") ++ FILE.write("}") ++ FILE.write("\n") ++ ++ print("o exporting trace-depths options...") ++ FILE.write("trace-depths {\n") ++ FILE.write("\tdiff %s \n" % DEPTH_DIFF) ++ FILE.write("\trefl %s \n" % DEPTH_REFL) ++ FILE.write("\trefr %s\n" % DEPTH_REFR) ++ FILE.write("}") ++ FILE.write("\n") ++ if IMP_BCKGRD.val == 1: ++ print("o exporting background...") ++ world = Blender.World.GetCurrent() ++ horcol = world.getHor() ++ horcol0, horcol1, horcol2 = horcol[0], horcol[1], horcol[2] ++ FILE.write("background {\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (horcol0, horcol1, horcol2)) ++ FILE.write("}") ++ FILE.write("\n") ++ elif BACKGROUND.val == 1: ++ print("o creating background...") ++ FILE.write("background {\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % BCKGRD.val) ++ FILE.write("}") ++ FILE.write("\n") ++ if REVERSE.val == 0: ++ FILE.write("\nbucket %s %s\n" % (BUCKETSIZE.val, BUCKETTYPELIST[BUCKETTYPE.val-1])) ++ elif REVERSE.val == 1: ++ FILE.write("\nbucket %s " % BUCKETSIZE.val) ++ FILE.write("\"reverse %s\"\n" % BUCKETTYPELIST[BUCKETTYPE.val-1]) + + ## Caustic and global illumination settings ## + # Send GI and caustic values to Blender as IDs # + def def_gi(): +- # Writes GI properties +- if CAUSTICS.val == 1: +- SCENE.properties['Caustics'] = "true" +- SCENE.properties['Caustics Photon Number'] = PHOTONNUMBER.val +- SCENE.properties['Caustics Photon Map'] = PHOTONMAP.val +- SCENE.properties['Caustics Photon Estimate'] = PHOTONESTIMATE.val +- SCENE.properties['Caustics Photon Radius'] = PHOTONRADIUS.val +- else: +- SCENE.properties['Caustics'] = "false" +- if INSTANTGI.val == 1: +- SCENE.properties['IGI'] = "true" +- SCENE.properties['IGI Samples'] = IGISAMPLES.val +- SCENE.properties['IGI Sets'] = IGISETS.val +- SCENE.properties['IGI Bias'] = IGIBIAS.val +- SCENE.properties['IGI Bias Samples'] = IGIBIASSAMPLES.val +- else: +- SCENE.properties['IGI'] = "false" +- if IRRCACHE.val == 1: +- SCENE.properties['IRR'] = "true" +- SCENE.properties['IRR Samples'] = IRRSAMPLES.val +- SCENE.properties['IRR Tolerance'] = IRRTOLERANCE.val +- SCENE.properties['IRR Space Min'] = IRRSPACEMIN.val +- SCENE.properties['IRR Space Max'] = IRRSPACEMAX.val +- else: +- SCENE.properties['IRR'] = "false" +- if USEGLOBALS.val == 1: +- SCENE.properties['Global Photon'] = "true" +- SCENE.properties['Global Photon Num'] = gPHOTONNUMBER.val +- SCENE.properties['Global Photon Map'] = gPHOTONMAP.val +- SCENE.properties['Global Photon Estimate'] = gPHOTONESTIMATE.val +- SCENE.properties['Global Photon Radius'] = gPHOTONRADIUS.val +- else: +- SCENE.properties['Global Photon'] = "false" +- if PATHTRACE.val == 1: +- SCENE.properties['Path Tracing'] = "true" +- SCENE.properties['Path Tracing Samples'] = PATHSAMPLES.val +- else: +- SCENE.properties['Path Tracing'] = "false" +- if OCCLUSION.val ==1: +- SCENE.properties['Global AO'] = "true" +- SCENE.properties['Global AO Bright'] = OCCBRIGHT.val +- SCENE.properties['Global AO Dark'] = OCCDARK.val +- SCENE.properties['Global AO Samples'] = OCCSAMPLES.val +- SCENE.properties['Global AO Distance'] = OCCDIST.val +- else: +- SCENE.properties['Global AO'] = "false" +- if FAKEAMB.val ==1: +- SCENE.properties['Fake Ambient Term'] = "true" +- SCENE.properties['Fake Ambient Term Sky'] = FAMBSKY.val +- SCENE.properties['Fake Ambient Term Ground'] = FAMBGROUND.val +- else: +- SCENE.properties['Fake Ambient Term'] = "false" +- if VIEWCAUSTICS.val == 1: +- SCENE.properties['View Caustics'] = "true" +- else: +- SCENE.properties['View Caustics'] = "false" +- if VIEWGLOBALS.val == 1: +- SCENE.properties['View Globals'] = "true" +- else: +- SCENE.properties['View Globals'] = "false" +- if VIEWGI.val == 1: +- SCENE.properties['View GI'] = "true" +- else: +- SCENE.properties['View GI'] = "false" ++ # Writes GI properties ++ if CAUSTICS.val == 1: ++ SCENE.properties['Caustics'] = "true" ++ SCENE.properties['Caustics Photon Number'] = PHOTONNUMBER.val ++ SCENE.properties['Caustics Photon Map'] = PHOTONMAP.val ++ SCENE.properties['Caustics Photon Estimate'] = PHOTONESTIMATE.val ++ SCENE.properties['Caustics Photon Radius'] = PHOTONRADIUS.val ++ else: ++ SCENE.properties['Caustics'] = "false" ++ if INSTANTGI.val == 1: ++ SCENE.properties['IGI'] = "true" ++ SCENE.properties['IGI Samples'] = IGISAMPLES.val ++ SCENE.properties['IGI Sets'] = IGISETS.val ++ SCENE.properties['IGI Bias'] = IGIBIAS.val ++ SCENE.properties['IGI Bias Samples'] = IGIBIASSAMPLES.val ++ else: ++ SCENE.properties['IGI'] = "false" ++ if IRRCACHE.val == 1: ++ SCENE.properties['IRR'] = "true" ++ SCENE.properties['IRR Samples'] = IRRSAMPLES.val ++ SCENE.properties['IRR Tolerance'] = IRRTOLERANCE.val ++ SCENE.properties['IRR Space Min'] = IRRSPACEMIN.val ++ SCENE.properties['IRR Space Max'] = IRRSPACEMAX.val ++ else: ++ SCENE.properties['IRR'] = "false" ++ if USEGLOBALS.val == 1: ++ SCENE.properties['Global Photon'] = "true" ++ SCENE.properties['Global Photon Num'] = gPHOTONNUMBER.val ++ SCENE.properties['Global Photon Map'] = gPHOTONMAP.val ++ SCENE.properties['Global Photon Estimate'] = gPHOTONESTIMATE.val ++ SCENE.properties['Global Photon Radius'] = gPHOTONRADIUS.val ++ else: ++ SCENE.properties['Global Photon'] = "false" ++ if PATHTRACE.val == 1: ++ SCENE.properties['Path Tracing'] = "true" ++ SCENE.properties['Path Tracing Samples'] = PATHSAMPLES.val ++ else: ++ SCENE.properties['Path Tracing'] = "false" ++ if OCCLUSION.val ==1: ++ SCENE.properties['Global AO'] = "true" ++ SCENE.properties['Global AO Bright'] = OCCBRIGHT.val ++ SCENE.properties['Global AO Dark'] = OCCDARK.val ++ SCENE.properties['Global AO Samples'] = OCCSAMPLES.val ++ SCENE.properties['Global AO Distance'] = OCCDIST.val ++ else: ++ SCENE.properties['Global AO'] = "false" ++ if FAKEAMB.val ==1: ++ SCENE.properties['Fake Ambient Term'] = "true" ++ SCENE.properties['Fake Ambient Term Sky'] = FAMBSKY.val ++ SCENE.properties['Fake Ambient Term Ground'] = FAMBGROUND.val ++ else: ++ SCENE.properties['Fake Ambient Term'] = "false" ++ if VIEWCAUSTICS.val == 1: ++ SCENE.properties['View Caustics'] = "true" ++ else: ++ SCENE.properties['View Caustics'] = "false" ++ if VIEWGLOBALS.val == 1: ++ SCENE.properties['View Globals'] = "true" ++ else: ++ SCENE.properties['View Globals'] = "false" ++ if VIEWGI.val == 1: ++ SCENE.properties['View GI'] = "true" ++ else: ++ SCENE.properties['View GI'] = "false" + + # Import GI values from Blender IDs to script # + def import_gi(): +- # Retrieve Blender's GI/Caustic ID values +- if SCENE.properties['SceneProp'] == "true": +- if SCENE.properties['Caustics'] == "true": +- CAUSTICS.val = 1 +- PHOTONNUMBER.val = SCENE.properties['Caustics Photon Number'] +- PHOTONMAP.val = SCENE.properties['Caustics Photon Map'] +- PHOTONESTIMATE.val = SCENE.properties['Caustics Photon Estimate'] +- PHOTONRADIUS.val = SCENE.properties['Caustics Photon Radius'] +- Draw.Redraw() +- else: +- CAUSTICS.val = 0 +- Draw.Redraw() +- if SCENE.properties['IGI'] == "true": +- INSTANTGI.val = 1 +- IGISAMPLES.val = SCENE.properties['IGI Samples'] +- IGISETS.val = SCENE.properties['IGI Sets'] +- IGIBIAS.val = SCENE.properties['IGI Bias'] +- IGIBIASSAMPLES.val = SCENE.properties['IGI Bias Samples'] +- Draw.Redraw() +- else: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if SCENE.properties['IRR'] == "true": +- IRRCACHE.val = 1 +- IRRSAMPLES.val = SCENE.properties['IRR Samples'] +- IRRTOLERANCE.val = SCENE.properties['IRR Tolerance'] +- IRRSPACEMIN.val = SCENE.properties['IRR Space Min'] +- IRRSPACEMAX.val = SCENE.properties['IRR Space Max'] +- Draw.Redraw() +- else: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if SCENE.properties['Global Photon'] == "true": +- USEGLOBALS.val = 1 +- gPHOTONNUMBER.val = SCENE.properties['Global Photon Num'] +- gPHOTONMAP.val = SCENE.properties['Global Photon Map'] +- gPHOTONESTIMATE.val = SCENE.properties['Global Photon Estimate'] +- gPHOTONRADIUS.val = SCENE.properties['Global Photon Radius'] +- Draw.Redraw() +- else: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if SCENE.properties['Path Tracing'] == "true": +- PATHTRACE.val = 1 +- PATHSAMPLES.val = SCENE.properties['Path Tracing Samples'] +- Draw.Redraw() +- else: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if SCENE.properties['Global AO'] == "true": +- OCCLUSION.val = 1 +- OCCBRIGHT.val = SCENE.properties['Global AO Bright'][0], SCENE.properties['Global AO Bright'][1], SCENE.properties['Global AO Bright'][2] +- OCCDARK.val = SCENE.properties['Global AO Dark'][0], SCENE.properties['Global AO Dark'][1], SCENE.properties['Global AO Dark'][2] +- OCCSAMPLES.val = SCENE.properties['Global AO Samples'] +- OCCDIST.val = SCENE.properties['Global AO Distance'] +- Draw.Redraw() +- else: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if SCENE.properties['Fake Ambient Term'] == "true": +- FAKEAMB.val = 1 +- FAMBSKY.val = SCENE.properties['Fake Ambient Term Sky'][0], SCENE.properties['Fake Ambient Term Sky'][1], SCENE.properties['Fake Ambient Term Sky'][2] +- FAMBGROUND.val = SCENE.properties['Fake Ambient Term Ground'][0], SCENE.properties['Fake Ambient Term Ground'][1], SCENE.properties['Fake Ambient Term Ground'][2] +- Draw.Redraw() +- else: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if SCENE.properties['View Caustics'] == "true": +- VIEWCAUSTICS.val = 1 +- Draw.Redraw() +- else: +- VIEWCAUSTICS.val = 0 +- Draw.Redraw() +- if SCENE.properties['View Globals'] == "true": +- VIEWGLOBALS.val = 1 +- Draw.Redraw() +- else: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if SCENE.properties['View GI'] == "true": +- VIEWGI.val = 1 +- Draw.Redraw() +- else: +- VIEWGI.val = 0 +- Draw.Redraw() ++ # Retrieve Blender's GI/Caustic ID values ++ if SCENE.properties['SceneProp'] == "true": ++ if SCENE.properties['Caustics'] == "true": ++ CAUSTICS.val = 1 ++ PHOTONNUMBER.val = SCENE.properties['Caustics Photon Number'] ++ PHOTONMAP.val = SCENE.properties['Caustics Photon Map'] ++ PHOTONESTIMATE.val = SCENE.properties['Caustics Photon Estimate'] ++ PHOTONRADIUS.val = SCENE.properties['Caustics Photon Radius'] ++ Draw.Redraw() ++ else: ++ CAUSTICS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['IGI'] == "true": ++ INSTANTGI.val = 1 ++ IGISAMPLES.val = SCENE.properties['IGI Samples'] ++ IGISETS.val = SCENE.properties['IGI Sets'] ++ IGIBIAS.val = SCENE.properties['IGI Bias'] ++ IGIBIASSAMPLES.val = SCENE.properties['IGI Bias Samples'] ++ Draw.Redraw() ++ else: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['IRR'] == "true": ++ IRRCACHE.val = 1 ++ IRRSAMPLES.val = SCENE.properties['IRR Samples'] ++ IRRTOLERANCE.val = SCENE.properties['IRR Tolerance'] ++ IRRSPACEMIN.val = SCENE.properties['IRR Space Min'] ++ IRRSPACEMAX.val = SCENE.properties['IRR Space Max'] ++ Draw.Redraw() ++ else: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Global Photon'] == "true": ++ USEGLOBALS.val = 1 ++ gPHOTONNUMBER.val = SCENE.properties['Global Photon Num'] ++ gPHOTONMAP.val = SCENE.properties['Global Photon Map'] ++ gPHOTONESTIMATE.val = SCENE.properties['Global Photon Estimate'] ++ gPHOTONRADIUS.val = SCENE.properties['Global Photon Radius'] ++ Draw.Redraw() ++ else: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Path Tracing'] == "true": ++ PATHTRACE.val = 1 ++ PATHSAMPLES.val = SCENE.properties['Path Tracing Samples'] ++ Draw.Redraw() ++ else: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Global AO'] == "true": ++ OCCLUSION.val = 1 ++ OCCBRIGHT.val = SCENE.properties['Global AO Bright'][0], SCENE.properties['Global AO Bright'][1], SCENE.properties['Global AO Bright'][2] ++ OCCDARK.val = SCENE.properties['Global AO Dark'][0], SCENE.properties['Global AO Dark'][1], SCENE.properties['Global AO Dark'][2] ++ OCCSAMPLES.val = SCENE.properties['Global AO Samples'] ++ OCCDIST.val = SCENE.properties['Global AO Distance'] ++ Draw.Redraw() ++ else: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Fake Ambient Term'] == "true": ++ FAKEAMB.val = 1 ++ FAMBSKY.val = SCENE.properties['Fake Ambient Term Sky'][0], SCENE.properties['Fake Ambient Term Sky'][1], SCENE.properties['Fake Ambient Term Sky'][2] ++ FAMBGROUND.val = SCENE.properties['Fake Ambient Term Ground'][0], SCENE.properties['Fake Ambient Term Ground'][1], SCENE.properties['Fake Ambient Term Ground'][2] ++ Draw.Redraw() ++ else: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['View Caustics'] == "true": ++ VIEWCAUSTICS.val = 1 ++ Draw.Redraw() ++ else: ++ VIEWCAUSTICS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['View Globals'] == "true": ++ VIEWGLOBALS.val = 1 ++ Draw.Redraw() ++ else: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['View GI'] == "true": ++ VIEWGI.val = 1 ++ Draw.Redraw() ++ else: ++ VIEWGI.val = 0 ++ Draw.Redraw() + + # Export global illumination values # + def export_gi(): +- #Caustic Settings +- if CAUSTICS.val == 1: +- print("o exporting caustic settings...") +- FILE.write("\nphotons {\n") +- FILE.write("\tcaustics %s" % PHOTONNUMBER.val) +- FILE.write(" %s " % PHOTONMAPLIST[PHOTONMAP.val-1]) +- FILE.write("%s %s\n" % (PHOTONESTIMATE.val, PHOTONRADIUS.val)) +- FILE.write("}\n") +- #Instant GI Settings +- if INSTANTGI.val == 1: +- print("o exporting Instant GI settings...") +- FILE.write("\ngi {\n") +- FILE.write("\ttype igi\n") +- FILE.write("\tsamples %s\n" % IGISAMPLES.val) +- FILE.write("\tsets %s\n" % IGISETS.val) +- FILE.write("\tb %s\n" % IGIBIAS.val) +- FILE.write("\tbias-samples %s\n" % IGIBIASSAMPLES.val) +- FILE.write("}\n") +- #Irradiance Cache GI Settings +- if IRRCACHE.val == 1: +- print("o exporting Irradiance Cache GI settings...") +- FILE.write("\ngi {\n") +- FILE.write("\ttype irr-cache\n") +- FILE.write("\tsamples %s\n" % IRRSAMPLES.val) +- FILE.write("\ttolerance %s\n" % IRRTOLERANCE.val) +- FILE.write("\tspacing %s %s\n" % (IRRSPACEMIN.val, IRRSPACEMAX.val)) +- if USEGLOBALS.val == 0: +- FILE.write("}\n") +- #No Path Tracing on Secondary Bounces in Irradiance Cache Settings +- else: +- FILE.write("\tglobal %s" % gPHOTONNUMBER.val) +- FILE.write(" %s " % gPHOTONMAPLIST[gPHOTONMAP.val-1]) +- FILE.write("%s %s\n" % (gPHOTONESTIMATE.val, gPHOTONRADIUS.val)) +- FILE.write("}\n") +- #Path Tracing GI Settings +- if PATHTRACE.val == 1: +- print("o exporting Path Tracing GI settings...") +- FILE.write("\ngi {\n") +- FILE.write("\ttype path\n") +- FILE.write("\tsamples %s\n" % PATHSAMPLES.val) +- FILE.write("}\n") +- #Ambient Occlusion GI Settings +- if OCCLUSION.val == 1: +- print("o exporting Ambient Occlusion GI settings...") +- FILE.write("\n\ngi {\n") +- FILE.write("\ttype ambocc\n") +- FILE.write("\tbright { \"sRGB nonlinear\" %s %s %s }\n" % OCCBRIGHT.val) +- FILE.write("\tdark { \"sRGB nonlinear\" %s %s %s }\n" % OCCDARK.val) +- FILE.write("\tsamples %s\n" % OCCSAMPLES.val) +- FILE.write("\tmaxdist %s\n}" % OCCDIST.val) +- #Fake Ambient Term GI Settings +- if FAKEAMB.val == 1: +- print("o exporting Fake Ambient Term GI settings...") +- FILE.write("\n\ngi {\n") +- FILE.write("\ttype fake\n") +- FILE.write("\tup 0 1 0\n") +- FILE.write("\tsky { \"sRGB nonlinear\" %s %s %s }\n" % FAMBSKY.val) +- FILE.write("\tground { \"sRGB nonlinear\" %s %s %s }\n" % FAMBGROUND.val) +- FILE.write("\n}") +- #View Overrides +- if VIEWCAUSTICS.val == 1: +- print("o exporting caustic override...") +- FILE.write("\nshader {\n") +- FILE.write("\tname debug_caustics\n") +- FILE.write("\ttype view-caustics\n") +- FILE.write("}\n") +- FILE.write("override debug_caustics false\n") +- if VIEWGLOBALS.val == 1: +- print("o exporting globals override...") +- FILE.write("\nshader {\n") +- FILE.write("\tname debug_globals\n") +- FILE.write("\ttype view-global\n") +- FILE.write("}\n") +- FILE.write("override debug_globals false\n") +- if VIEWGI.val == 1: +- print("o exporting irradiance override...") +- FILE.write("\nshader {\n") +- FILE.write("\tname debug_gi\n") +- FILE.write("\ttype view-irradiance\n") +- FILE.write("}\n") +- FILE.write("override debug_gi false\n") ++ #Caustic Settings ++ if CAUSTICS.val == 1: ++ print("o exporting caustic settings...") ++ FILE.write("\nphotons {\n") ++ FILE.write("\tcaustics %s" % PHOTONNUMBER.val) ++ FILE.write(" %s " % PHOTONMAPLIST[PHOTONMAP.val-1]) ++ FILE.write("%s %s\n" % (PHOTONESTIMATE.val, PHOTONRADIUS.val)) ++ FILE.write("}\n") ++ #Instant GI Settings ++ if INSTANTGI.val == 1: ++ print("o exporting Instant GI settings...") ++ FILE.write("\ngi {\n") ++ FILE.write("\ttype igi\n") ++ FILE.write("\tsamples %s\n" % IGISAMPLES.val) ++ FILE.write("\tsets %s\n" % IGISETS.val) ++ FILE.write("\tb %s\n" % IGIBIAS.val) ++ FILE.write("\tbias-samples %s\n" % IGIBIASSAMPLES.val) ++ FILE.write("}\n") ++ #Irradiance Cache GI Settings ++ if IRRCACHE.val == 1: ++ print("o exporting Irradiance Cache GI settings...") ++ FILE.write("\ngi {\n") ++ FILE.write("\ttype irr-cache\n") ++ FILE.write("\tsamples %s\n" % IRRSAMPLES.val) ++ FILE.write("\ttolerance %s\n" % IRRTOLERANCE.val) ++ FILE.write("\tspacing %s %s\n" % (IRRSPACEMIN.val, IRRSPACEMAX.val)) ++ if USEGLOBALS.val == 0: ++ FILE.write("}\n") ++ #No Path Tracing on Secondary Bounces in Irradiance Cache Settings ++ else: ++ FILE.write("\tglobal %s" % gPHOTONNUMBER.val) ++ FILE.write(" %s " % gPHOTONMAPLIST[gPHOTONMAP.val-1]) ++ FILE.write("%s %s\n" % (gPHOTONESTIMATE.val, gPHOTONRADIUS.val)) ++ FILE.write("}\n") ++ #Path Tracing GI Settings ++ if PATHTRACE.val == 1: ++ print("o exporting Path Tracing GI settings...") ++ FILE.write("\ngi {\n") ++ FILE.write("\ttype path\n") ++ FILE.write("\tsamples %s\n" % PATHSAMPLES.val) ++ FILE.write("}\n") ++ #Ambient Occlusion GI Settings ++ if OCCLUSION.val == 1: ++ print("o exporting Ambient Occlusion GI settings...") ++ FILE.write("\n\ngi {\n") ++ FILE.write("\ttype ambocc\n") ++ FILE.write("\tbright { \"sRGB nonlinear\" %s %s %s }\n" % OCCBRIGHT.val) ++ FILE.write("\tdark { \"sRGB nonlinear\" %s %s %s }\n" % OCCDARK.val) ++ FILE.write("\tsamples %s\n" % OCCSAMPLES.val) ++ FILE.write("\tmaxdist %s\n}" % OCCDIST.val) ++ #Fake Ambient Term GI Settings ++ if FAKEAMB.val == 1: ++ print("o exporting Fake Ambient Term GI settings...") ++ FILE.write("\n\ngi {\n") ++ FILE.write("\ttype fake\n") ++ FILE.write("\tup 0 1 0\n") ++ FILE.write("\tsky { \"sRGB nonlinear\" %s %s %s }\n" % FAMBSKY.val) ++ FILE.write("\tground { \"sRGB nonlinear\" %s %s %s }\n" % FAMBGROUND.val) ++ FILE.write("\n}") ++ #View Overrides ++ if VIEWCAUSTICS.val == 1: ++ print("o exporting caustic override...") ++ FILE.write("\nshader {\n") ++ FILE.write("\tname debug_caustics\n") ++ FILE.write("\ttype view-caustics\n") ++ FILE.write("}\n") ++ FILE.write("override debug_caustics false\n") ++ if VIEWGLOBALS.val == 1: ++ print("o exporting globals override...") ++ FILE.write("\nshader {\n") ++ FILE.write("\tname debug_globals\n") ++ FILE.write("\ttype view-global\n") ++ FILE.write("}\n") ++ FILE.write("override debug_globals false\n") ++ if VIEWGI.val == 1: ++ print("o exporting irradiance override...") ++ FILE.write("\nshader {\n") ++ FILE.write("\tname debug_gi\n") ++ FILE.write("\ttype view-irradiance\n") ++ FILE.write("}\n") ++ FILE.write("override debug_gi false\n") + + def export_shaders(): +- print("o exporting shaders...") ++ print("o exporting shaders...") + +- #Infinite Plane +- if INFINITEPLANE.val == 1: +- FILE.write("\n\nshader {\n\tname iplane\n\ttype diffuse\n") +- FILE.write("\tdiff %s %s %s \n}" % IPLANECOLOR.val) +- # Add infinite plane object # +- FILE.write("\n\nobject {\n") +- FILE.write("\tshader iplane\n") +- FILE.write("\ttype plane\n") +- FILE.write("\tp 0 0 0\n") +- FILE.write("\tn 0 0 1\n}\n") +- +- # default shader +- FILE.write("\n\nshader {\n\tname def\n\ttype diffuse\n\tdiff 1 1 1\n}") +- materials = Blender.Material.get() +- +- for mat in materials: +- RGB = mat.getRGBCol() +- speccol = mat.getSpecCol() +- textures = mat.getTextures() +- flags = mat.getMode() +- +- if mat.users == 0: +- continue +- +- # UBER shader +- if mat.name.startswith("sfube"): +- textu = textures[0] +- textu2 = textures[2] +- print(" o exporting uber shader "+mat.name+"...") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype uber\n") +- +- # DIFF values +- FILE.write("\tdiff %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) +- if textures[0] != None and textures[0].tex.getType() == "Image" and textu.tex.getImage() != None: +- colvalue = textu.colfac +- FILE.write("\tdiff.texture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tdiff.blend %s\n" % (colvalue * 1.0)) +- else: +- +- FILE.write("\tdiff.blend 0.0\n") +- +- # SPEC values +- FILE.write("\tspec %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) +- if textures[2] != None and textures[2].tex.getType() == "Image" and textu2.tex.getImage() != None: +- cspvalue = textu2.varfac +- FILE.write("\tspec.texture \"" + textu2.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tspec.blend %s\n" % (cspvalue * 0.1)) +- else: +- FILE.write("\tspec.blend 0.0\n") +- FILE.write("\tglossy .1\n") +- FILE.write("\tsamples 4\n}") +- +- elif textures[0] != None and textures[0].tex.getType() == "Image": +- textu = textures[0] +- # image texture without image !!?? +- if textu.tex.getImage() == None: +- print(("You material named " +mat.name+ " have an image texture with no image!")) +- print ("replacing with default shader!") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype diffuse\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %s %s %s }\n}" % (1.0, 1.0, 1.0)) +- +- # ambocc texture shader +- elif mat.name.startswith("sfamb"): +- print(" o exporting ambient occlusion texture shader "+mat.name+"...") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype amb-occ\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) +- FILE.write("\tsamples 32\n") +- FILE.write("\tdist 3.0\n}") +- +- # diffuse texture shader +- elif mat.name.startswith("sfdif"): +- print(" o exporting diffuse texture shader "+mat.name+"...") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype diffuse\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") +- +- # phong texture shader +- elif mat.name.startswith("sfpho"): +- print(" o exporting phong texture shader "+mat.name+"...") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype phong\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) +- FILE.write("\tsamples 4\n}") +- +- # ward texture shader +- elif mat.name.startswith("sfwar"): +- print(" o exporting ward texture shader "+mat.name+"...") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype ward\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- speccol = mat.specCol +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) +- FILE.write("\trough .2 .01\n") +- FILE.write("\tsamples 4\n}") +- +- # shiny texture shader +- elif mat.name.startswith("sfshi"): +- print(" o exporting shiny texture shader "+mat.name+"...") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype shiny\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) +- +- # newcommers default diffuse texture shader +- else: +- print(" o exporting diffuse texture shader "+mat.name+"...") +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- FILE.write("\ttype diffuse\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") +- +- else: +- +- FILE.write("\n\nshader {\n") +- FILE.write("\tname \""+mat.name+".shader\"\n") +- +- ## diffuse shader +- if mat.name.startswith("sfdif"): +- print(" o exporting diffuse shader "+mat.name+"...") +- FILE.write("\ttype diffuse\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) +- +- ## shiny shader +- elif mat.name.startswith("sfshi"): +- print(" o exporting shiny shader "+mat.name+"...") +- FILE.write("\ttype shiny\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0], RGB[1], RGB[2])) +- FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) +- +- ## amb-occ shader +- elif mat.name.startswith("sfamb"): +- print(" o exporting ambient occlusion shader "+mat.name+"...") +- FILE.write("\ttype amb-occ\n") +- FILE.write("\tbright %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) +- FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) +- FILE.write("\tsamples 32\n") +- FILE.write("\tdist 3.0\n}") +- +- ## phong shader +- elif mat.name.startswith("sfpho"): +- print(" o exporting phong shader "+ mat.name+"...") +- FILE.write("\ttype phong\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0],RGB[1],RGB[2])) +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) +- FILE.write("\tsamples 4\n}") +- +- ## ward shader +- elif mat.name.startswith("sfwar"): +- print(" o exporting ward shader "+ mat.name+"...") +- FILE.write("\ttype ward\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) +- speccol = mat.specCol +- FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) +- FILE.write("\trough .2 .01\n") +- FILE.write("\tsamples 4\n}") +- +- ## reflection (mirror) shader +- elif mat.name.startswith("sfmir") and flags & Material.Modes['RAYMIRROR']: +- print(" o exporting mirror shader "+mat.name+"...") +- FILE.write("\ttype mirror\n") +- FILE.write("\trefl { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(RGB[0],RGB[1],RGB[2])) +- +- ## glass shader +- elif mat.name.startswith("sfgla") and flags & Material.Modes['RAYTRANSP']: +- print(" o exporting glass shader "+mat.name+"...") +- FILE.write("\ttype glass\n") +- FILE.write("\teta " + str(mat.getIOR()) + "\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) +- FILE.write("\tabsorbtion.distance 5.0\n") +- FILE.write("\tabsorbtion.color { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(speccol[0], speccol[1], speccol[2])) +- +- ## constant shader +- elif mat.name.startswith("sfcon"): +- print(" o exporting constant shader "+mat.name+"...") +- FILE.write("\ttype constant\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) +- +- ## newcommers default diffuse shader +- else: +- print(" o exporting default diffuse shader "+mat.name+"...") +- FILE.write("\ttype diffuse\n") +- FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) ++ #Infinite Plane ++ if INFINITEPLANE.val == 1: ++ FILE.write("\n\nshader {\n\tname iplane\n\ttype diffuse\n") ++ FILE.write("\tdiff %s %s %s \n}" % IPLANECOLOR.val) ++ # Add infinite plane object # ++ FILE.write("\n\nobject {\n") ++ FILE.write("\tshader iplane\n") ++ FILE.write("\ttype plane\n") ++ FILE.write("\tp 0 0 0\n") ++ FILE.write("\tn 0 0 1\n}\n") ++ ++ # default shader ++ FILE.write("\n\nshader {\n\tname def\n\ttype diffuse\n\tdiff 1 1 1\n}") ++ materials = Blender.Material.get() ++ ++ for mat in materials: ++ RGB = mat.getRGBCol() ++ speccol = mat.getSpecCol() ++ textures = mat.getTextures() ++ flags = mat.getMode() ++ ++ if mat.users == 0: ++ continue ++ ++ # UBER shader ++ if mat.name.startswith("sfube"): ++ textu = textures[0] ++ textu2 = textures[2] ++ print(" o exporting uber shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype uber\n") ++ ++ # DIFF values ++ FILE.write("\tdiff %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) ++ if textures[0] != None and textures[0].tex.getType() == "Image" and textu.tex.getImage() != None: ++ colvalue = textu.colfac ++ FILE.write("\tdiff.texture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tdiff.blend %s\n" % (colvalue * 1.0)) ++ else: ++ ++ FILE.write("\tdiff.blend 0.0\n") ++ ++ # SPEC values ++ FILE.write("\tspec %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) ++ if textures[2] != None and textures[2].tex.getType() == "Image" and textu2.tex.getImage() != None: ++ cspvalue = textu2.varfac ++ FILE.write("\tspec.texture \"" + textu2.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tspec.blend %s\n" % (cspvalue * 0.1)) ++ else: ++ FILE.write("\tspec.blend 0.0\n") ++ FILE.write("\tglossy .1\n") ++ FILE.write("\tsamples 4\n}") ++ ++ elif textures[0] != None and textures[0].tex.getType() == "Image": ++ textu = textures[0] ++ # image texture without image !!?? ++ if textu.tex.getImage() == None: ++ print(("You material named " +mat.name+ " have an image texture with no image!")) ++ print ("replacing with default shader!") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %s %s %s }\n}" % (1.0, 1.0, 1.0)) ++ ++ # ambocc texture shader ++ elif mat.name.startswith("sfamb"): ++ print(" o exporting ambient occlusion texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype amb-occ\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) ++ FILE.write("\tsamples 32\n") ++ FILE.write("\tdist 3.0\n}") ++ ++ # diffuse texture shader ++ elif mat.name.startswith("sfdif"): ++ print(" o exporting diffuse texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") ++ ++ # phong texture shader ++ elif mat.name.startswith("sfpho"): ++ print(" o exporting phong texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype phong\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) ++ FILE.write("\tsamples 4\n}") ++ ++ # ward texture shader ++ elif mat.name.startswith("sfwar"): ++ print(" o exporting ward texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype ward\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ speccol = mat.specCol ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) ++ FILE.write("\trough .2 .01\n") ++ FILE.write("\tsamples 4\n}") ++ ++ # shiny texture shader ++ elif mat.name.startswith("sfshi"): ++ print(" o exporting shiny texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype shiny\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) ++ ++ # newcommers default diffuse texture shader ++ else: ++ print(" o exporting diffuse texture shader "+mat.name+"...") ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") ++ ++ else: ++ ++ FILE.write("\n\nshader {\n") ++ FILE.write("\tname \""+mat.name+".shader\"\n") ++ ++ ## diffuse shader ++ if mat.name.startswith("sfdif"): ++ print(" o exporting diffuse shader "+mat.name+"...") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) ++ ++ ## shiny shader ++ elif mat.name.startswith("sfshi"): ++ print(" o exporting shiny shader "+mat.name+"...") ++ FILE.write("\ttype shiny\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0], RGB[1], RGB[2])) ++ FILE.write("\trefl %.2f\n}" % mat.getRayMirr()) ++ ++ ## amb-occ shader ++ elif mat.name.startswith("sfamb"): ++ print(" o exporting ambient occlusion shader "+mat.name+"...") ++ FILE.write("\ttype amb-occ\n") ++ FILE.write("\tbright %.3f %.3f %.3f\n" % (RGB[0], RGB[1], RGB[2])) ++ FILE.write("\tdark %.3f %.3f %.3f\n" % (speccol[0], speccol[1], speccol[2])) ++ FILE.write("\tsamples 32\n") ++ FILE.write("\tdist 3.0\n}") ++ ++ ## phong shader ++ elif mat.name.startswith("sfpho"): ++ print(" o exporting phong shader "+ mat.name+"...") ++ FILE.write("\ttype phong\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (RGB[0],RGB[1],RGB[2])) ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f } %s\n" %(speccol[0], speccol[1], speccol[2], mat.hard)) ++ FILE.write("\tsamples 4\n}") ++ ++ ## ward shader ++ elif mat.name.startswith("sfwar"): ++ print(" o exporting ward shader "+ mat.name+"...") ++ FILE.write("\ttype ward\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) ++ speccol = mat.specCol ++ FILE.write("\tspec { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(speccol[0], speccol[1], speccol[2])) ++ FILE.write("\trough .2 .01\n") ++ FILE.write("\tsamples 4\n}") ++ ++ ## reflection (mirror) shader ++ elif mat.name.startswith("sfmir") and flags & Material.Modes['RAYMIRROR']: ++ print(" o exporting mirror shader "+mat.name+"...") ++ FILE.write("\ttype mirror\n") ++ FILE.write("\trefl { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(RGB[0],RGB[1],RGB[2])) ++ ++ ## glass shader ++ elif mat.name.startswith("sfgla") and flags & Material.Modes['RAYTRANSP']: ++ print(" o exporting glass shader "+mat.name+"...") ++ FILE.write("\ttype glass\n") ++ FILE.write("\teta " + str(mat.getIOR()) + "\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" %(RGB[0],RGB[1],RGB[2])) ++ FILE.write("\tabsorbtion.distance 5.0\n") ++ FILE.write("\tabsorbtion.color { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" %(speccol[0], speccol[1], speccol[2])) ++ ++ ## constant shader ++ elif mat.name.startswith("sfcon"): ++ print(" o exporting constant shader "+mat.name+"...") ++ FILE.write("\ttype constant\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) ++ ++ ## newcommers default diffuse shader ++ else: ++ print(" o exporting default diffuse shader "+mat.name+"...") ++ FILE.write("\ttype diffuse\n") ++ FILE.write("\tdiff { \"sRGB nonlinear\" %.3f %.3f %.3f }\n}" % (RGB[0], RGB[1], RGB[2])) + + ## Export modifiers ## + def export_modifiers(): +- print("o exporting modifiers...") ++ print("o exporting modifiers...") + +- materials = Blender.Material.get() +- modifs_list = [] ++ materials = Blender.Material.get() ++ modifs_list = [] + +- for mat in materials: ++ for mat in materials: + +- textures = mat.getTextures() +- flags = mat.getMode() +- +- if textures[1] != None and textures[1].tex.getType() == "Image": +- textu = textures[1] +- Scale_value = str(textu.norfac * textu.mtNor*-0.001) +- +- if textu.tex.name.startswith("bump"): +- if textu.tex.getName() not in modifs_list: +- modifs_list.append (str(textu.tex.getName())) +- print(" o exporting modifier "+str(textu.tex.getName())+"...") +- FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype bump\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") +- FILE.write("\tscale %s \n}\n" % Scale_value) +- +- elif textu.tex.name.startswith("normal"): +- if textu.tex.getName() not in modifs_list: +- modifs_list.append (str(textu.tex.getName())) +- print(" o exporting modifier "+str(textu.tex.getName())+"...") +- FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype normalmap\n") +- FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") +- else: +- pass +- +- if textures[3] != None and textures[3].tex.getType() != "Image": +- textu = textures[3] +- Scale_value = str(textu.norfac) +- if textu.tex.name.startswith("perlin"): +- if textu.tex.getName() not in modifs_list: +- modifs_list.append (str(textu.tex.getName())) +- print(" o exporting modifier "+str(textu.tex.getName())+"...") +- FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype perlin\n") +- FILE.write("\tfunction 0\n") +- FILE.write("\tsize 1\n") +- FILE.write("\tscale %s\n}\n" % Scale_value) ++ textures = mat.getTextures() ++ flags = mat.getMode() ++ ++ if textures[1] != None and textures[1].tex.getType() == "Image": ++ textu = textures[1] ++ Scale_value = str(textu.norfac * textu.mtNor*-0.001) ++ ++ if textu.tex.name.startswith("bump"): ++ if textu.tex.getName() not in modifs_list: ++ modifs_list.append (str(textu.tex.getName())) ++ print(" o exporting modifier "+str(textu.tex.getName())+"...") ++ FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype bump\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n") ++ FILE.write("\tscale %s \n}\n" % Scale_value) ++ ++ elif textu.tex.name.startswith("normal"): ++ if textu.tex.getName() not in modifs_list: ++ modifs_list.append (str(textu.tex.getName())) ++ print(" o exporting modifier "+str(textu.tex.getName())+"...") ++ FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype normalmap\n") ++ FILE.write("\ttexture \"" + textu.tex.getImage().getFilename() + "\"\n}") ++ else: ++ pass ++ ++ if textures[3] != None and textures[3].tex.getType() != "Image": ++ textu = textures[3] ++ Scale_value = str(textu.norfac) ++ if textu.tex.name.startswith("perlin"): ++ if textu.tex.getName() not in modifs_list: ++ modifs_list.append (str(textu.tex.getName())) ++ print(" o exporting modifier "+str(textu.tex.getName())+"...") ++ FILE.write("\n\nmodifier {\n\tname "+str(textu.tex.getName())+"\n\ttype perlin\n") ++ FILE.write("\tfunction 0\n") ++ FILE.write("\tsize 1\n") ++ FILE.write("\tscale %s\n}\n" % Scale_value) + +- else: +- pass ++ else: ++ pass + + ## Light settings ## + # Send light values to Blender as IDs # + def def_lights(): +- #Write light ID properties +- SCENE.properties['LightProp'] = "true" +- SCENE.properties['Lamp Multiplier'] = LAMPPOWER.val +- SCENE.properties['Meshlight Multiplier'] = MESHLIGHTPOWER.val +- SCENE.properties['Light Samples'] = DSAMPLES.val +- SCENE.properties['IBL Samples'] = IBLSAMPLES.val +- if IBL.val == 1: +- SCENE.properties['Image Based Light'] = "true" +- else: +- SCENE.properties['Image Based Light'] = "false" +- if IBLLOCK.val == 1: +- SCENE.properties['IBL Importance Sampling'] = "true" +- else: +- SCENE.properties['IBL Importance Sampling'] = "false" +- if CONVLAMP.val == 1: +- SCENE.properties['Convert Unsupported Lamps'] = "true" +- else: +- SCENE.properties['Convert Unsupported Lamps'] = "false" +- if IMP_SUN.val == 1: +- SCENE.properties['Sun Lamp'] = "true" +- else: +- SCENE.properties['Sun Lamp'] = "false" +- SCENE.properties['Sun Turbidity'] = SUN_TURB.val +- SCENE.properties['Sun Samples'] = SUN_SAMPLES.val +- #Infinite plane ID added here since it's mostly used with sun/sky +- if INFINITEPLANE.val == 1: +- SCENE.properties['Infinite Plane'] = "true" +- else: +- SCENE.properties['Infinite Plane'] = "false" +- SCENE.properties['Infinite Plane Color'] = IPLANECOLOR.val ++ #Write light ID properties ++ SCENE.properties['LightProp'] = "true" ++ SCENE.properties['Lamp Multiplier'] = LAMPPOWER.val ++ SCENE.properties['Meshlight Multiplier'] = MESHLIGHTPOWER.val ++ SCENE.properties['Light Samples'] = DSAMPLES.val ++ SCENE.properties['IBL Samples'] = IBLSAMPLES.val ++ if IBL.val == 1: ++ SCENE.properties['Image Based Light'] = "true" ++ else: ++ SCENE.properties['Image Based Light'] = "false" ++ if IBLLOCK.val == 1: ++ SCENE.properties['IBL Importance Sampling'] = "true" ++ else: ++ SCENE.properties['IBL Importance Sampling'] = "false" ++ if CONVLAMP.val == 1: ++ SCENE.properties['Convert Unsupported Lamps'] = "true" ++ else: ++ SCENE.properties['Convert Unsupported Lamps'] = "false" ++ if IMP_SUN.val == 1: ++ SCENE.properties['Sun Lamp'] = "true" ++ else: ++ SCENE.properties['Sun Lamp'] = "false" ++ SCENE.properties['Sun Turbidity'] = SUN_TURB.val ++ SCENE.properties['Sun Samples'] = SUN_SAMPLES.val ++ #Infinite plane ID added here since it's mostly used with sun/sky ++ if INFINITEPLANE.val == 1: ++ SCENE.properties['Infinite Plane'] = "true" ++ else: ++ SCENE.properties['Infinite Plane'] = "false" ++ SCENE.properties['Infinite Plane Color'] = IPLANECOLOR.val + + # Import light values from Blender IDs to script # + def import_lights(): +- # Retrieve Blender's light ID values including IBL/LOCK +- if SCENE.properties['LightProp'] == "true": +- LAMPPOWER.val = SCENE.properties['Lamp Multiplier'] +- MESHLIGHTPOWER.val = SCENE.properties['Meshlight Multiplier'] +- DSAMPLES.val = SCENE.properties['Light Samples'] +- IBLSAMPLES.val = SCENE.properties['IBL Samples'] +- if SCENE.properties['Convert Unsupported Lamps'] == "true": +- CONVLAMP.val = 1 +- Draw.Redraw() +- else: +- CONVLAMP.val = 0 +- Draw.Redraw() +- if SCENE.properties['Image Based Light'] == "true": +- IBL.val = 1 +- Draw.Redraw() +- else: +- IBL.val = 0 +- Draw.Redraw() +- if SCENE.properties['IBL Importance Sampling'] == "true": +- IBLLOCK.val = 1 +- Draw.Redraw() +- else: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if SCENE.properties['Sun Lamp'] == "true": +- IMP_SUN.val = 1 +- Draw.Redraw() +- else: +- IMP_SUN.val = 0 +- Draw.Redraw() +- SUN_TURB.val = SCENE.properties['Sun Turbidity'] +- SUN_SAMPLES.val = SCENE.properties['Sun Samples'] +- #Infinite plane ID added here since it's mostly used with sun/sky +- if SCENE.properties['Infinite Plane'] == "true": +- INFINITEPLANE.val = 1 +- Draw.Redraw() +- else: +- INFINITEPLANE.val = 0 +- Draw.Redraw() +- IPLANECOLOR.val = SCENE.properties['Infinite Plane Color'][0], SCENE.properties['Infinite Plane Color'][1], SCENE.properties['Infinite Plane Color'][2], ++ # Retrieve Blender's light ID values including IBL/LOCK ++ if SCENE.properties['LightProp'] == "true": ++ LAMPPOWER.val = SCENE.properties['Lamp Multiplier'] ++ MESHLIGHTPOWER.val = SCENE.properties['Meshlight Multiplier'] ++ DSAMPLES.val = SCENE.properties['Light Samples'] ++ IBLSAMPLES.val = SCENE.properties['IBL Samples'] ++ if SCENE.properties['Convert Unsupported Lamps'] == "true": ++ CONVLAMP.val = 1 ++ Draw.Redraw() ++ else: ++ CONVLAMP.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Image Based Light'] == "true": ++ IBL.val = 1 ++ Draw.Redraw() ++ else: ++ IBL.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['IBL Importance Sampling'] == "true": ++ IBLLOCK.val = 1 ++ Draw.Redraw() ++ else: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['Sun Lamp'] == "true": ++ IMP_SUN.val = 1 ++ Draw.Redraw() ++ else: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ SUN_TURB.val = SCENE.properties['Sun Turbidity'] ++ SUN_SAMPLES.val = SCENE.properties['Sun Samples'] ++ #Infinite plane ID added here since it's mostly used with sun/sky ++ if SCENE.properties['Infinite Plane'] == "true": ++ INFINITEPLANE.val = 1 ++ Draw.Redraw() ++ else: ++ INFINITEPLANE.val = 0 ++ Draw.Redraw() ++ IPLANECOLOR.val = SCENE.properties['Infinite Plane Color'][0], SCENE.properties['Infinite Plane Color'][1], SCENE.properties['Infinite Plane Color'][2], + + # Export light values # + def export_lights(lmp): +- # only lamps type 0, 1 and 4 supported at the moment +- # lamp types are: 0 - Lamp, 1 - Sun, 2 - Spot, 3 - Hemi, 4 - Area +- # Spots are replaced by directional (cylinrical) lights: adjust dist as close as possible to the ground receiving the +- # cone of light if you want Radius as close as possible +- lamp = lmp.getData() +- +- red = lamp.col[0] +- green = lamp.col[1] +- blue = lamp.col[2] +- power = lamp.energy * LAMPPOWER.val +- objmatrix = lmp.matrix +- lampV = Mathutils.Vector([0, 0, 0, 1]) +- lampV = lampV * objmatrix +- dist = lamp.getDist() +- print("o exporting lamps") +- +- if lamp.type == 0: +- print(" o exporting lamp "+lmp.name+"...") +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype point\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tpower %s\n" % (power)) +- FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("}") +- elif lamp.type == 1: +- if IMP_SUN.val == 1: +- print(" o exporting sun-light "+lmp.name+"...") +- invmatrix = Mathutils.Matrix(lmp.getInverseMatrix()) +- FILE.write("\nlight {\n") +- FILE.write("\ttype sunsky\n") +- FILE.write("\tup 0 0 1\n") +- FILE.write("\teast 0 1 0\n") +- FILE.write("\tsundir %f %f %f\n" % (invmatrix[0][2], invmatrix[1][2], invmatrix[2][2])) +- FILE.write("\tturbidity %s\n" % SUN_TURB.val) +- FILE.write("\tsamples %s\n" % SUN_SAMPLES.val) +- FILE.write("}") +- else: +- print(" o exporting lamp "+lmp.name+"...") +- # get the location of the lamp +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype point\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tpower %s\n" % (power)) +- FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("}") +- +- elif lamp.type == 4: +- print(" o exporting area-light "+lmp.name+"...") +- xsize = lamp.areaSizeX * 0.5 +- if lamp.areaSizeY: +- # If rectangular area: +- print("o exporting rectangular area-light "+lmp.name+"...") +- ysize = lamp.areaSizeY * 0.5 +- else: +- # Else, square area: +- print("o exporting square area-light "+lmp.name+"...") +- ysize = xsize +- lampV0 = Mathutils.Vector([-xsize, ysize, 0, 1]) +- lampV1 = Mathutils.Vector([ xsize, ysize, 0, 1]) +- lampV2 = Mathutils.Vector([ xsize, -ysize, 0, 1]) +- lampV3 = Mathutils.Vector([-xsize, -ysize, 0, 1]) +- +- lampV0 = lampV0 * objmatrix +- lampV1 = lampV1 * objmatrix +- lampV2 = lampV2 * objmatrix +- lampV3 = lampV3 * objmatrix +- +- radiance = lamp.energy * MESHLIGHTPOWER.val +- +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype meshlight\n") +- FILE.write("\tname \"%s\"\n" % (lmp.name)) +- FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tradiance %s\n" % (radiance)) +- FILE.write("\tsamples %s\n" % DSAMPLES.val) +- FILE.write("\tpoints 4\n") +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV0[0], lampV0[1], lampV0[2])) +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV1[0], lampV1[1], lampV1[2])) +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV2[0], lampV2[1], lampV2[2])) +- FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV3[0], lampV3[1], lampV3[2])) +- FILE.write("\ttriangles 2\n") +- FILE.write("\t\t0 1 2\n") +- FILE.write("\t\t0 2 3\n") +- FILE.write("}") +- elif lamp.type == 2: +- print(" o exporting spotlight "+lmp.name+"...") +- targetV = Mathutils.Vector([0, 0, -1, 1]) +- targetV = targetV * objmatrix +- angle = lamp.getSpotSize()*pi/360 +- radius = dist/cos(angle)*sin(angle) +- radiance = lamp.energy * LAMPPOWER.val +- +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype directional\n") +- FILE.write("\tsource %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tradius %s\n" % (radius)) +- FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("}") +- elif lamp.type == 3: +- print(" o exporting spherical light "+lmp.name+"...") +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype spherical\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tradiance %s\n" % (power)) +- FILE.write("\tcenter %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("\tradius %s\n" % (dist)) +- FILE.write("\tsamples %s\n" % DSAMPLES.val) +- FILE.write("}") +- else: +- print("Unsupported type lamp detected") +- if CONVLAMP.val == 1: +- print(" o exporting lamp "+lmp.name+"...") +- # get the rgb component for the lamp +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype point\n") +- FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) +- FILE.write("\tpower %s\n" % (power)) +- FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) +- FILE.write("}") ++ # only lamps type 0, 1 and 4 supported at the moment ++ # lamp types are: 0 - Lamp, 1 - Sun, 2 - Spot, 3 - Hemi, 4 - Area ++ # Spots are replaced by directional (cylinrical) lights: adjust dist as close as possible to the ground receiving the ++ # cone of light if you want Radius as close as possible ++ lamp = lmp.getData() ++ ++ red = lamp.col[0] ++ green = lamp.col[1] ++ blue = lamp.col[2] ++ power = lamp.energy * LAMPPOWER.val ++ objmatrix = lmp.matrix ++ lampV = Mathutils.Vector([0, 0, 0, 1]) ++ lampV = lampV * objmatrix ++ dist = lamp.getDist() ++ print("o exporting lamps") ++ ++ if lamp.type == 0: ++ print(" o exporting lamp "+lmp.name+"...") ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype point\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tpower %s\n" % (power)) ++ FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("}") ++ elif lamp.type == 1: ++ if IMP_SUN.val == 1: ++ print(" o exporting sun-light "+lmp.name+"...") ++ invmatrix = Mathutils.Matrix(lmp.getInverseMatrix()) ++ FILE.write("\nlight {\n") ++ FILE.write("\ttype sunsky\n") ++ FILE.write("\tup 0 0 1\n") ++ FILE.write("\teast 0 1 0\n") ++ FILE.write("\tsundir %f %f %f\n" % (invmatrix[0][2], invmatrix[1][2], invmatrix[2][2])) ++ FILE.write("\tturbidity %s\n" % SUN_TURB.val) ++ FILE.write("\tsamples %s\n" % SUN_SAMPLES.val) ++ FILE.write("}") ++ else: ++ print(" o exporting lamp "+lmp.name+"...") ++ # get the location of the lamp ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype point\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tpower %s\n" % (power)) ++ FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("}") ++ ++ elif lamp.type == 4: ++ print(" o exporting area-light "+lmp.name+"...") ++ xsize = lamp.areaSizeX * 0.5 ++ if lamp.areaSizeY: ++ # If rectangular area: ++ print("o exporting rectangular area-light "+lmp.name+"...") ++ ysize = lamp.areaSizeY * 0.5 ++ else: ++ # Else, square area: ++ print("o exporting square area-light "+lmp.name+"...") ++ ysize = xsize ++ lampV0 = Mathutils.Vector([-xsize, ysize, 0, 1]) ++ lampV1 = Mathutils.Vector([ xsize, ysize, 0, 1]) ++ lampV2 = Mathutils.Vector([ xsize, -ysize, 0, 1]) ++ lampV3 = Mathutils.Vector([-xsize, -ysize, 0, 1]) ++ ++ lampV0 = lampV0 * objmatrix ++ lampV1 = lampV1 * objmatrix ++ lampV2 = lampV2 * objmatrix ++ lampV3 = lampV3 * objmatrix ++ ++ radiance = lamp.energy * MESHLIGHTPOWER.val ++ ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype meshlight\n") ++ FILE.write("\tname \"%s\"\n" % (lmp.name)) ++ FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tradiance %s\n" % (radiance)) ++ FILE.write("\tsamples %s\n" % DSAMPLES.val) ++ FILE.write("\tpoints 4\n") ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV0[0], lampV0[1], lampV0[2])) ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV1[0], lampV1[1], lampV1[2])) ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV2[0], lampV2[1], lampV2[2])) ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (lampV3[0], lampV3[1], lampV3[2])) ++ FILE.write("\ttriangles 2\n") ++ FILE.write("\t\t0 1 2\n") ++ FILE.write("\t\t0 2 3\n") ++ FILE.write("}") ++ elif lamp.type == 2: ++ print(" o exporting spotlight "+lmp.name+"...") ++ targetV = Mathutils.Vector([0, 0, -1, 1]) ++ targetV = targetV * objmatrix ++ angle = lamp.getSpotSize()*pi/360 ++ radius = dist/cos(angle)*sin(angle) ++ radiance = lamp.energy * LAMPPOWER.val ++ ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype directional\n") ++ FILE.write("\tsource %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tradius %s\n" % (radius)) ++ FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("}") ++ elif lamp.type == 3: ++ print(" o exporting spherical light "+lmp.name+"...") ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype spherical\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tradiance %s\n" % (power)) ++ FILE.write("\tcenter %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("\tradius %s\n" % (dist)) ++ FILE.write("\tsamples %s\n" % DSAMPLES.val) ++ FILE.write("}") ++ else: ++ print("Unsupported type lamp detected") ++ if CONVLAMP.val == 1: ++ print(" o exporting lamp "+lmp.name+"...") ++ # get the rgb component for the lamp ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype point\n") ++ FILE.write("\tcolor { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (red, green, blue)) ++ FILE.write("\tpower %s\n" % (power)) ++ FILE.write("\tp %.6f %.6f %.6f\n" % (lampV[0], lampV[1], lampV[2])) ++ FILE.write("}") + + ## Export of Image Based Lights ## + def export_ibl(): +- global IBLLIGHT ++ global IBLLIGHT + +- try: +- ibllighttext = Blender.Texture.Get("ibllight") +- if ibllighttext != "": +- if ibllighttext.users > 0: +- if ibllighttext != None and ibllighttext.getType() == "Image": +- IBLLIGHT = ibllighttext.getImage().getFilename() +- else: +- IBLLIGHT = "" +- else: +- IBLLIGHT = "" +- except: +- IBLLIGHT = "" +- +- if IBL == 1: +- if IBLLIGHT != "": +- print("o exporting ibllight...") +- print(" o using texture %s" % (IBLLIGHT)) +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype ibl\n") +- FILE.write("\timage \"%s\"\n" % (IBLLIGHT)) +- FILE.write("\tcenter 1 0 0\n") +- FILE.write("\tup 0 0 1\n") +- if IBLLOCK == 1: +- FILE.write("\tlock false\n") # lock false means "use importance sampling" +- else: +- FILE.write("\tlock true\n") +- FILE.write("\tsamples %s\n" % IBLSAMPLES.val) +- FILE.write("}") ++ try: ++ ibllighttext = Blender.Texture.Get("ibllight") ++ if ibllighttext != "": ++ if ibllighttext.users > 0: ++ if ibllighttext != None and ibllighttext.getType() == "Image": ++ IBLLIGHT = ibllighttext.getImage().getFilename() ++ else: ++ IBLLIGHT = "" ++ else: ++ IBLLIGHT = "" ++ except: ++ IBLLIGHT = "" ++ ++ if IBL == 1: ++ if IBLLIGHT != "": ++ print("o exporting ibllight...") ++ print(" o using texture %s" % (IBLLIGHT)) ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype ibl\n") ++ FILE.write("\timage \"%s\"\n" % (IBLLIGHT)) ++ FILE.write("\tcenter 1 0 0\n") ++ FILE.write("\tup 0 0 1\n") ++ if IBLLOCK == 1: ++ FILE.write("\tlock false\n") # lock false means "use importance sampling" ++ else: ++ FILE.write("\tlock true\n") ++ FILE.write("\tsamples %s\n" % IBLSAMPLES.val) ++ FILE.write("}") + + ## Camera settings ## + # Send camera values to Blender as IDs # + def def_camera(): +- CAMERA=SCENE.objects.camera +- # Writes Scene properties +- CAMERA.properties['CamProp'] = "true" +- CAMERA.properties['DOF Radius'] = DOFRADIUS.val +- CAMERA.properties['Lens Sides'] = LENSSIDES.val +- CAMERA.properties['Lens Rotation'] = LENSROTATION.val +- if DOF.val == 1: +- CAMERA.properties['DOF'] = "true" +- else: +- CAMERA.properties['DOF'] = "false" +- if SPHERICALCAMERA.val == 1: +- CAMERA.properties['Spherical Camera'] = "true" +- else: +- CAMERA.properties['Spherical Camera'] = "false" +- if FISHEYECAMERA.val == 1: +- CAMERA.properties['Fisheye Camera'] = "true" +- else: +- CAMERA.properties['Fisheye Camera'] = "false" ++ CAMERA=SCENE.objects.camera ++ # Writes Scene properties ++ CAMERA.properties['CamProp'] = "true" ++ CAMERA.properties['DOF Radius'] = DOFRADIUS.val ++ CAMERA.properties['Lens Sides'] = LENSSIDES.val ++ CAMERA.properties['Lens Rotation'] = LENSROTATION.val ++ if DOF.val == 1: ++ CAMERA.properties['DOF'] = "true" ++ else: ++ CAMERA.properties['DOF'] = "false" ++ if SPHERICALCAMERA.val == 1: ++ CAMERA.properties['Spherical Camera'] = "true" ++ else: ++ CAMERA.properties['Spherical Camera'] = "false" ++ if FISHEYECAMERA.val == 1: ++ CAMERA.properties['Fisheye Camera'] = "true" ++ else: ++ CAMERA.properties['Fisheye Camera'] = "false" + + # Import Background and AA values from Blender IDs to script # + def import_camera(): +- CAMERA=SCENE.objects.camera +- if CAMERA.properties['CamProp'] == "true": +- DOFRADIUS.val = CAMERA.properties['DOF Radius'] +- LENSSIDES.val = CAMERA.properties['Lens Sides'] +- LENSROTATION.val = CAMERA.properties['Lens Rotation'] +- if CAMERA.properties['DOF'] == "true": +- DOF.val = 1 +- Draw.Redraw() +- else: +- DOF.val = 0 +- Draw.Redraw() +- if CAMERA.properties['Spherical Camera'] == "true": +- SPHERICALCAMERA.val = 1 +- Draw.Redraw() +- else: +- SPHERICALCAMERA.val = 0 +- Draw.Redraw() +- if CAMERA.properties['Fisheye Camera'] == "true": +- FISHEYECAMERA.val = 1 +- Draw.Redraw() +- else: +- FISHEYECAMERA.val = 0 +- Draw.Redraw() ++ CAMERA=SCENE.objects.camera ++ if CAMERA.properties['CamProp'] == "true": ++ DOFRADIUS.val = CAMERA.properties['DOF Radius'] ++ LENSSIDES.val = CAMERA.properties['Lens Sides'] ++ LENSROTATION.val = CAMERA.properties['Lens Rotation'] ++ if CAMERA.properties['DOF'] == "true": ++ DOF.val = 1 ++ Draw.Redraw() ++ else: ++ DOF.val = 0 ++ Draw.Redraw() ++ if CAMERA.properties['Spherical Camera'] == "true": ++ SPHERICALCAMERA.val = 1 ++ Draw.Redraw() ++ else: ++ SPHERICALCAMERA.val = 0 ++ Draw.Redraw() ++ if CAMERA.properties['Fisheye Camera'] == "true": ++ FISHEYECAMERA.val = 1 ++ Draw.Redraw() ++ else: ++ FISHEYECAMERA.val = 0 ++ Draw.Redraw() + + # Export camera values # + def export_camera(cam): +- # get the camera +- camera = cam.getData() +- print("o exporting Camera "+camera.getName()+"...") +- +- # get the object matrix so we can calculate to and up +- objmatrix = cam.matrix +- eyeV = Mathutils.Vector([0, 0, 0, 1]) +- targetV = Mathutils.Vector([0, 0, -1, 1]) +- upV = Mathutils.Vector([0, 1, 0, 0]) +- +- eyeV = eyeV * objmatrix +- targetV = targetV * objmatrix +- upV = upV * objmatrix +- +- # get the fov value +- # image higher than wide? +- if IM_HEIGHT > IM_WIDTH: +- factor=float(IM_WIDTH) / float(IM_HEIGHT) +- # if the image is wider than high, or of equal height and width then: +- else: +- factor=1 +- # fov = 2*(degrees(atan((factor*16.0) / camera.lens))) #Same as below, just uses the python "degrees" instead: +- fov = 360.0 * atan((factor*16.0) / camera.lens) / pi +- DOFDIST=camera.dofDist +- +- FILE.write("\n\ncamera {\n") +- +- if DOF.val == 1: +- camtype = "thinlens" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- FILE.write("\tfov %s \n" % fov) +- FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) +- FILE.write("\tfdist %s \n" % DOFDIST) +- FILE.write("\tlensr %s \n" % DOFRADIUS) +- FILE.write("\tsides %s \n" % LENSSIDES) +- FILE.write("\trotation %s \n" % LENSROTATION) +- elif SPHERICALCAMERA.val == 1: +- camtype = "spherical" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- elif FISHEYECAMERA.val == 1: +- camtype = "fisheye" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- else: +- camtype = "pinhole" +- FILE.write("\ttype %s\n" % camtype) +- FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) +- FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) +- FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) +- FILE.write("\tfov %s \n" % fov) +- FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) +- #To be uncommented when 0.07.3 is released +- #FILE.write("\tshift %.2f %.2f\n" % (camera.shiftX, camera.shiftY)) +- FILE.write("}") ++ # get the camera ++ camera = cam.getData() ++ print("o exporting Camera "+camera.getName()+"...") ++ ++ # get the object matrix so we can calculate to and up ++ objmatrix = cam.matrix ++ eyeV = Mathutils.Vector([0, 0, 0, 1]) ++ targetV = Mathutils.Vector([0, 0, -1, 1]) ++ upV = Mathutils.Vector([0, 1, 0, 0]) ++ ++ eyeV = eyeV * objmatrix ++ targetV = targetV * objmatrix ++ upV = upV * objmatrix ++ ++ # get the fov value ++ # image higher than wide? ++ if IM_HEIGHT > IM_WIDTH: ++ factor=float(IM_WIDTH) / float(IM_HEIGHT) ++ # if the image is wider than high, or of equal height and width then: ++ else: ++ factor=1 ++ # fov = 2*(degrees(atan((factor*16.0) / camera.lens))) #Same as below, just uses the python "degrees" instead: ++ fov = 360.0 * atan((factor*16.0) / camera.lens) / pi ++ DOFDIST=camera.dofDist ++ ++ FILE.write("\n\ncamera {\n") ++ ++ if DOF.val == 1: ++ camtype = "thinlens" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ FILE.write("\tfov %s \n" % fov) ++ FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) ++ FILE.write("\tfdist %s \n" % DOFDIST) ++ FILE.write("\tlensr %s \n" % DOFRADIUS) ++ FILE.write("\tsides %s \n" % LENSSIDES) ++ FILE.write("\trotation %s \n" % LENSROTATION) ++ elif SPHERICALCAMERA.val == 1: ++ camtype = "spherical" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ elif FISHEYECAMERA.val == 1: ++ camtype = "fisheye" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ else: ++ camtype = "pinhole" ++ FILE.write("\ttype %s\n" % camtype) ++ FILE.write("\teye %.6f %.6f %.6f\n" % (eyeV[0], eyeV[1], eyeV[2])) ++ FILE.write("\ttarget %.6f %.6f %.6f\n" % (targetV[0], targetV[1], targetV[2])) ++ FILE.write("\tup %.6f %.6f %.6f\n" % (upV[0], upV[1], upV[2])) ++ FILE.write("\tfov %s \n" % fov) ++ FILE.write("\taspect %s \n" % (1.0 * IM_WIDTH / IM_HEIGHT)) ++ #To be uncommented when 0.07.3 is released ++ #FILE.write("\tshift %.2f %.2f\n" % (camera.shiftX, camera.shiftY)) ++ FILE.write("}") + + ## Export method for meshes ## + def export_geometry(obj): +- islight = obj.name.startswith("meshlight") +- isparticleob = obj.name.startswith("particleob") +- if islight: +- print("o exporting meshlight " + obj.name+"...") +- if isparticleob: +- print("o exporting particle object " + obj.name+"...") +- # get the mesh data +- if obj.getType() != "Empty": +- mesh = Mesh.New(obj.name) # Note the "mesh.verts = None" at the end of this if. Used to clear the new mesh from memory +- mesh.getFromObject(obj, 0, 1) +- mesh.transform(obj.mat, 1) +- verts = mesh.verts +- faces = mesh.faces +- numverts = verts.__len__() +- +- if numverts > 0: +- if islight: +- FILE.write("\n\nlight {\n") +- FILE.write("\ttype meshlight\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- if len(mesh.materials) >= 1: +- matrl = mesh.materials[0] +- FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (matrl.R, matrl.G, matrl.B)) +- else: +- FILE.write("\temit 1 1 1\n") +- FILE.write("\tradiance %s\n" % (MESHLIGHTPOWER.val)) +- FILE.write("\tsamples %s\n" % DSAMPLES.val) +- FILE.write("\tpoints %d\n" % (numverts)) +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) +- numtris = 0 +- for face in faces: +- num = len(face.verts) +- if num == 4: +- numtris = numtris + 2 +- elif num == 3: +- numtris = numtris + 1 +- FILE.write("\ttriangles %d\n" % (numtris)) +- allsmooth = True +- allflat = True +- for face in faces: +- num = len(face.verts) +- smooth = face.smooth != 0 +- allsmooth &= smooth +- allflat &= not smooth +- if num == 4: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) +- elif num == 3: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- FILE.write("}") ++ islight = obj.name.startswith("meshlight") ++ isparticleob = obj.name.startswith("particleob") ++ if islight: ++ print("o exporting meshlight " + obj.name+"...") ++ if isparticleob: ++ print("o exporting particle object " + obj.name+"...") ++ # get the mesh data ++ if obj.getType() != "Empty": ++ mesh = Mesh.New(obj.name) # Note the "mesh.verts = None" at the end of this if. Used to clear the new mesh from memory ++ mesh.getFromObject(obj, 0, 1) ++ mesh.transform(obj.mat, 1) ++ verts = mesh.verts ++ faces = mesh.faces ++ numverts = verts.__len__() ++ ++ if numverts > 0: ++ if islight: ++ FILE.write("\n\nlight {\n") ++ FILE.write("\ttype meshlight\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ if len(mesh.materials) >= 1: ++ matrl = mesh.materials[0] ++ FILE.write("\temit { \"sRGB nonlinear\" %.3f %.3f %.3f }\n" % (matrl.R, matrl.G, matrl.B)) ++ else: ++ FILE.write("\temit 1 1 1\n") ++ FILE.write("\tradiance %s\n" % (MESHLIGHTPOWER.val)) ++ FILE.write("\tsamples %s\n" % DSAMPLES.val) ++ FILE.write("\tpoints %d\n" % (numverts)) ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) ++ numtris = 0 ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ numtris = numtris + 2 ++ elif num == 3: ++ numtris = numtris + 1 ++ FILE.write("\ttriangles %d\n" % (numtris)) ++ allsmooth = True ++ allflat = True ++ for face in faces: ++ num = len(face.verts) ++ smooth = face.smooth != 0 ++ allsmooth &= smooth ++ allflat &= not smooth ++ if num == 4: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) ++ elif num == 3: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ FILE.write("}") + +- else: +- FILE.write("\n\nobject {\n") +- if len(mesh.materials) == 1: +- FILE.write("\tshader \"" + mesh.materials[0].name + ".shader\"\n") +- +- ##Check for and write modfiers## +- for mat in mesh.materials: +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") +- elif textp != None and (textp.tex.name.startswith("perlin")): +- FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") +- +- elif len(mesh.materials) > 1: +- FILE.write("\tshaders %d\n" % (len(mesh.materials))) +- +- for mat in mesh.materials: +- FILE.write("\t\t\"" + mat.name + ".shader\"\n") +- +- ##Check for and write modfiers## +- FILE.write("\tmodifiers %d\n" % (len(mesh.materials))) +- for mat in mesh.materials: +- +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") +- elif textp != None and (textp.tex.name.startswith("perlin")): +- FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") +- else: +- FILE.write("\t\t\"" + "None" + "\"\n") ++ else: ++ FILE.write("\n\nobject {\n") ++ if len(mesh.materials) == 1: ++ FILE.write("\tshader \"" + mesh.materials[0].name + ".shader\"\n") + +- else: +- FILE.write("\tshader def\n") +- ##Particle object section. Works with Sunflow 0.07.3 and up. ## +- # Check if there are particles on the object # +- ob = Object.Get(obj.name) +- if len(ob.effects) != 0: +- effect = ob.effects[0] +- particles = effect.getParticlesLoc() +- effects= Effect.Get() +- # Check that particles are points only (not static and not vectors) # +- if not effect.getFlag() & Effect.Flags.STATIC or not effect.getStype(): +- FILE.write("\ttype particles\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tpoints %d\n" % (len(particles))) +- for pt in particles: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (pt[0], pt[1], pt[2])) +- FILE.write("\tradius 0.05\n}\n") +- elif type(particles)==list: # Is it a strand or pair? +- if len(particles)>1: +- pointnum = ((len(particles)*effect.getLifetime())*3) +- print("o exporting hair object " + obj.name+"...") +- FILE.write("\ttype hair\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tsegments %d\n" % (effect.getLifetime()-1)) +- FILE.write("\twidth .01\n") +- FILE.write("\tpoints %d" % pointnum) +- for eff in effects: +- for p in eff.getParticlesLoc(): +- if type(p)==list: # Are we a strand or a pair, then add hair data. +- if len(p)>1: +- destData = str() +- for vect in p: +- for elem in vect: +- destData+=" "+str(elem) +- FILE.write("\t%s\n" % (destData)) +- FILE.write("}\n") +- elif isparticleob: +- FILE.write("\ttype particles\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tpoints %d\n" % (numverts)) +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) +- FILE.write("\tradius 0.05\n}\n") ++ ##Check for and write modfiers## ++ for mat in mesh.materials: ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") ++ ++ elif len(mesh.materials) > 1: ++ FILE.write("\tshaders %d\n" % (len(mesh.materials))) ++ ++ for mat in mesh.materials: ++ FILE.write("\t\t\"" + mat.name + ".shader\"\n") ++ ++ ##Check for and write modfiers## ++ FILE.write("\tmodifiers %d\n" % (len(mesh.materials))) ++ for mat in mesh.materials: ++ ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") ++ else: ++ FILE.write("\t\t\"" + "None" + "\"\n") + ++ else: ++ FILE.write("\tshader def\n") ++ ##Particle object section. Works with Sunflow 0.07.3 and up. ## ++ # Check if there are particles on the object # ++ ob = Object.Get(obj.name) ++ if len(ob.effects) != 0: ++ effect = ob.effects[0] ++ particles = effect.getParticlesLoc() ++ effects= Effect.Get() ++ # Check that particles are points only (not static and not vectors) # ++ if not effect.getFlag() & Effect.Flags.STATIC or not effect.getStype(): ++ FILE.write("\ttype particles\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tpoints %d\n" % (len(particles))) ++ for pt in particles: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (pt[0], pt[1], pt[2])) ++ FILE.write("\tradius 0.05\n}\n") ++ elif type(particles)==list: # Is it a strand or pair? ++ if len(particles)>1: ++ pointnum = ((len(particles)*effect.getLifetime())*3) ++ print("o exporting hair object " + obj.name+"...") ++ FILE.write("\ttype hair\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tsegments %d\n" % (effect.getLifetime()-1)) ++ FILE.write("\twidth .01\n") ++ FILE.write("\tpoints %d" % pointnum) ++ for eff in effects: ++ for p in eff.getParticlesLoc(): ++ if type(p)==list: # Are we a strand or a pair, then add hair data. ++ if len(p)>1: ++ destData = str() ++ for vect in p: ++ for elem in vect: ++ destData+=" "+str(elem) ++ FILE.write("\t%s\n" % (destData)) ++ FILE.write("}\n") ++ elif isparticleob: ++ FILE.write("\ttype particles\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tpoints %d\n" % (numverts)) ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) ++ FILE.write("\tradius 0.05\n}\n") ++ ++ else: ++ print("o exporting mesh " + obj.name+"...") ++ FILE.write("\ttype generic-mesh\n") ++ FILE.write("\tname \"" + obj.name + "\"\n") ++ FILE.write("\tpoints %d\n" % (numverts)) ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) ++ numtris = 0 ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ numtris = numtris + 2 ++ elif num == 3: ++ numtris = numtris + 1 ++ FILE.write("\ttriangles %d\n" % (numtris)) ++ allsmooth = True ++ allflat = True ++ for face in faces: ++ num = len(face.verts) ++ smooth = face.smooth != 0 ++ allsmooth &= smooth ++ allflat &= not smooth ++ if num == 4: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) ++ elif num == 3: ++ FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) ++ ++ ## what kind of normals do we have? ++ if not islight: ++ if allflat: ++ FILE.write("\tnormals none\n") ++ elif allsmooth: ++ FILE.write("\tnormals vertex\n") ++ for vert in verts: ++ FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.no[0], vert.no[1], vert.no[2])) ++ else: ++ FILE.write("\tnormals facevarying\n") ++ for face in faces: ++ num = len(face.verts) ++ if face.smooth != 0: ++ if num == 4: ++ index0 = face.verts[0].index ++ index1 = face.verts[1].index ++ index2 = face.verts[2].index ++ index3 = face.verts[3].index ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], ++ verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], ++ verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], ++ verts[index2].no[0], verts[index2].no[1], verts[index2].no[2], ++ verts[index3].no[0], verts[index3].no[1], verts[index3].no[2])) ++ elif num == 3: ++ index0 = face.verts[0].index ++ index1 = face.verts[1].index ++ index2 = face.verts[2].index ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], ++ verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], ++ verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) + else: +- print("o exporting mesh " + obj.name+"...") +- FILE.write("\ttype generic-mesh\n") +- FILE.write("\tname \"" + obj.name + "\"\n") +- FILE.write("\tpoints %d\n" % (numverts)) +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.co[0], vert.co[1], vert.co[2])) +- numtris = 0 +- for face in faces: +- num = len(face.verts) +- if num == 4: +- numtris = numtris + 2 +- elif num == 3: +- numtris = numtris + 1 +- FILE.write("\ttriangles %d\n" % (numtris)) +- allsmooth = True +- allflat = True +- for face in faces: +- num = len(face.verts) +- smooth = face.smooth != 0 +- allsmooth &= smooth +- allflat &= not smooth +- if num == 4: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[2].index, face.verts[3].index)) +- elif num == 3: +- FILE.write("\t\t%d %d %d\n" % (face.verts[0].index, face.verts[1].index, face.verts[2].index)) +- +- ## what kind of normals do we have? +- if not islight: +- if allflat: +- FILE.write("\tnormals none\n") +- elif allsmooth: +- FILE.write("\tnormals vertex\n") +- for vert in verts: +- FILE.write("\t\t%.6f %.6f %.6f\n" % (vert.no[0], vert.no[1], vert.no[2])) +- else: +- FILE.write("\tnormals facevarying\n") +- for face in faces: +- num = len(face.verts) +- if face.smooth != 0: +- if num == 4: +- index0 = face.verts[0].index +- index1 = face.verts[1].index +- index2 = face.verts[2].index +- index3 = face.verts[3].index +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], +- verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], +- verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], +- verts[index2].no[0], verts[index2].no[1], verts[index2].no[2], +- verts[index3].no[0], verts[index3].no[1], verts[index3].no[2])) +- elif num == 3: +- index0 = face.verts[0].index +- index1 = face.verts[1].index +- index2 = face.verts[2].index +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (verts[index0].no[0], verts[index0].no[1], verts[index0].no[2], +- verts[index1].no[0], verts[index1].no[1], verts[index1].no[2], +- verts[index2].no[0], verts[index2].no[1], verts[index2].no[2])) +- else: +- fnx = face.no[0] +- fny = face.no[1] +- fnz = face.no[2] +- if num == 4: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) +- elif num == 3: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) +- # Check for UVs # +- if mesh.faceUV != 0: +- tx = 1 +- ty = 1 +- if len(mesh.materials) >= 1: +- if len(mesh.materials[0].getTextures()) >= 1: +- if mesh.materials[0].getTextures()[0] != None: +- tx = mesh.materials[0].getTextures()[0].tex.repeat[0] +- ty = mesh.materials[0].getTextures()[0].tex.repeat[1] +- FILE.write("\tuvs facevarying\n") +- for face in faces: +- num = len(face.verts) +- if num == 4: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[2][0], ty * face.uv[2][1], tx * face.uv[3][0], ty * face.uv[3][1])) +- elif num == 3: +- FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) +- else: +- FILE.write("\tuvs none\n") +- +- # Check for multiple materials on the mesh (face indices) # +- if len(mesh.materials) > 1: +- FILE.write("\tface_shaders\n") +- for face in faces: +- num = len(face.verts) +- if num == 4: +- FILE.write("\t\t%d\n" % (face.mat)) +- FILE.write("\t\t%d\n" % (face.mat)) +- elif num == 3: +- FILE.write("\t\t%d\n" % (face.mat)) +- FILE.write("}\n") +- # This clears the data from the new mesh created. # +- mesh.verts = None ++ fnx = face.no[0] ++ fny = face.no[1] ++ fnz = face.no[2] ++ if num == 4: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) ++ elif num == 3: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f %.6f\n" % (fnx, fny, fnz, fnx, fny, fnz, fnx, fny, fnz)) ++ # Check for UVs # ++ if mesh.faceUV != 0: ++ tx = 1 ++ ty = 1 ++ if len(mesh.materials) >= 1: ++ if len(mesh.materials[0].getTextures()) >= 1: ++ if mesh.materials[0].getTextures()[0] != None: ++ tx = mesh.materials[0].getTextures()[0].tex.repeat[0] ++ ty = mesh.materials[0].getTextures()[0].tex.repeat[1] ++ FILE.write("\tuvs facevarying\n") ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[2][0], ty * face.uv[2][1], tx * face.uv[3][0], ty * face.uv[3][1])) ++ elif num == 3: ++ FILE.write("\t\t%.6f %.6f %.6f %.6f %.6f %.6f\n" % (tx * face.uv[0][0], ty * face.uv[0][1], tx * face.uv[1][0], ty * face.uv[1][1], tx * face.uv[2][0], ty * face.uv[2][1])) ++ else: ++ FILE.write("\tuvs none\n") + +- # Look for Instances/Dupligroups # +- if obj.getType() == "Empty": +- ob = Object.Get(obj.name) +- dupe_obs = ob.DupObjects +- dupmatrix = Mathutils.Matrix(ob.getMatrix()) +- group = ob.DupGroup +- if group != "None": +- for dupe_ob, dup_matrix in dupe_obs: +- dupobmesh = Mesh.Get(dupe_ob.name) +- instancematrix = ob.getMatrix() +- print("o exporting instances of " + dupe_ob.name+"...") +- FILE.write("\n\ninstance {\n") +- FILE.write("\tname %s_%s \n" % (obj.name, dupe_ob.name)) +- FILE.write("\tgeometry %s \n" % dupe_ob.name) +- FILE.write("\ttransform col %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s \n" % (instancematrix[0][0], instancematrix[0][1], instancematrix[0][2], instancematrix[0][3], instancematrix[1][0], instancematrix[1][1], instancematrix[1][2], instancematrix[1][3], instancematrix[2][0], instancematrix[2][1], instancematrix[2][2], instancematrix[2][3], instancematrix[3][0], instancematrix[3][1], instancematrix[3][2], instancematrix[3][3])) +- if len(dupobmesh.materials) == 1: +- FILE.write("\tshader \"" + dupobmesh.materials[0].name + ".shader\"\n") +- +- ##Check for and write modfiers## +- for mat in dupobmesh.materials: +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") +- elif textp != None and (textp.tex.name.startswith("perlin")): +- FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") +- +- elif len(dupobmesh.materials) > 1: +- FILE.write("\tshaders %d\n" % (len(dupobmesh.materials))) +- +- for mat in dupobmesh.materials: +- FILE.write("\t\t\"" + mat.name + ".shader\"\n") +- +- ##Check for and write modfiers## +- FILE.write("\tmodifiers %d\n" % (len(dupobmesh.materials))) +- for mat in dupobmesh.materials: +- +- textures = mat.getTextures() +- textu = textures[1] +- textp = textures[3] +- if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): +- FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") +- elif textp != None and (textp.tex.name.startswith("perlin")): +- FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") +- else: +- FILE.write("\t\t\"" + "None" + "\"\n") ++ # Check for multiple materials on the mesh (face indices) # ++ if len(mesh.materials) > 1: ++ FILE.write("\tface_shaders\n") ++ for face in faces: ++ num = len(face.verts) ++ if num == 4: ++ FILE.write("\t\t%d\n" % (face.mat)) ++ FILE.write("\t\t%d\n" % (face.mat)) ++ elif num == 3: ++ FILE.write("\t\t%d\n" % (face.mat)) ++ FILE.write("}\n") ++ # This clears the data from the new mesh created. # ++ mesh.verts = None ++ ++ # Look for Instances/Dupligroups # ++ if obj.getType() == "Empty": ++ ob = Object.Get(obj.name) ++ dupe_obs = ob.DupObjects ++ dupmatrix = Mathutils.Matrix(ob.getMatrix()) ++ group = ob.DupGroup ++ if group != "None": ++ for dupe_ob, dup_matrix in dupe_obs: ++ dupobmesh = Mesh.Get(dupe_ob.name) ++ instancematrix = ob.getMatrix() ++ print("o exporting instances of " + dupe_ob.name+"...") ++ FILE.write("\n\ninstance {\n") ++ FILE.write("\tname %s_%s \n" % (obj.name, dupe_ob.name)) ++ FILE.write("\tgeometry %s \n" % dupe_ob.name) ++ FILE.write("\ttransform col %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s \n" % (instancematrix[0][0], instancematrix[0][1], instancematrix[0][2], instancematrix[0][3], instancematrix[1][0], instancematrix[1][1], instancematrix[1][2], instancematrix[1][3], instancematrix[2][0], instancematrix[2][1], instancematrix[2][2], instancematrix[2][3], instancematrix[3][0], instancematrix[3][1], instancematrix[3][2], instancematrix[3][3])) ++ if len(dupobmesh.materials) == 1: ++ FILE.write("\tshader \"" + dupobmesh.materials[0].name + ".shader\"\n") ++ ++ ##Check for and write modfiers## ++ for mat in dupobmesh.materials: ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\tmodifier \"" + str(textu.tex.getName()) + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\tmodifier \"" + str(textp.tex.getName()) + "\"\n") ++ ++ elif len(dupobmesh.materials) > 1: ++ FILE.write("\tshaders %d\n" % (len(dupobmesh.materials))) ++ ++ for mat in dupobmesh.materials: ++ FILE.write("\t\t\"" + mat.name + ".shader\"\n") ++ ++ ##Check for and write modfiers## ++ FILE.write("\tmodifiers %d\n" % (len(dupobmesh.materials))) ++ for mat in dupobmesh.materials: ++ ++ textures = mat.getTextures() ++ textu = textures[1] ++ textp = textures[3] ++ if textu != None and (textu.tex.name.startswith("bump") or textu.tex.name.startswith("normal")): ++ FILE.write("\t\t\"" + textu.tex.getName() + "\"\n") ++ elif textp != None and (textp.tex.name.startswith("perlin")): ++ FILE.write("\t\t\"" + textp.tex.getName() + "\"\n") ++ else: ++ FILE.write("\t\t\"" + "None" + "\"\n") + +- else: +- FILE.write("\tshader def\n") +- FILE.write("}\n") ++ else: ++ FILE.write("\tshader def\n") ++ FILE.write("}\n") + + ## Main export method ## + def exportfile(filename): +- global FILE, SCENE, IM_HEIGHT, IM_WIDTH, TEXTURES, OBJECTS, LAYERS, IBLLIGHT, EXP_ANIM, fname, destname +- global PATH ++ global FILE, SCENE, IM_HEIGHT, IM_WIDTH, TEXTURES, OBJECTS, LAYERS, IBLLIGHT, EXP_ANIM, fname, destname ++ global PATH + +- SCENE = Blender.Scene.GetCurrent() +- IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) +- IM_WIDTH = SCENE.getRenderingContext().imageSizeX() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) +- TEXTURES = Blender.Texture.Get() +- +- LAYERS = SCENE.getLayers() +- STARTFRAME = SCENE.getRenderingContext().startFrame() +- ENDFRAME = SCENE.getRenderingContext().endFrame() +- CTX = SCENE.getRenderingContext() +- orig_frame = CTX.currentFrame() +- +- if not filename.endswith(".sc"): +- filename = filename + ".sc" +- fname = filename +- destname = fname.replace(".sc", "") +- +- ANIM = EXP_ANIM.val +- +- if ANIM == 1: +- base = os.path.splitext(os.path.basename(filename))[0] +- FILE = open(filename.replace(".sc", ".java"), "wb") +- FILE.write(""" ++ SCENE = Blender.Scene.GetCurrent() ++ IM_HEIGHT = SCENE.getRenderingContext().imageSizeY() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) ++ IM_WIDTH = SCENE.getRenderingContext().imageSizeX() * (SCENE.getRenderingContext().getRenderWinSize() / 100.0) ++ TEXTURES = Blender.Texture.Get() ++ ++ LAYERS = SCENE.getLayers() ++ STARTFRAME = SCENE.getRenderingContext().startFrame() ++ ENDFRAME = SCENE.getRenderingContext().endFrame() ++ CTX = SCENE.getRenderingContext() ++ orig_frame = CTX.currentFrame() ++ ++ if not filename.endswith(".sc"): ++ filename = filename + ".sc" ++ fname = filename ++ destname = fname.replace(".sc", "") ++ ++ ANIM = EXP_ANIM.val ++ ++ if ANIM == 1: ++ base = os.path.splitext(os.path.basename(filename))[0] ++ FILE = open(filename.replace(".sc", ".java"), "wb") ++ FILE.write(""" + public void build() { +- parse("%s" + ".settings.sc"); +- parse("%s" + "." + getCurrentFrame() + ".sc"); ++parse("%s" + ".settings.sc"); ++parse("%s" + "." + getCurrentFrame() + ".sc"); + } + """ % (base, base)) + +- FILE.close() +- FILE = open(filename.replace(".sc", ".settings.sc"), "wb") +- export_output() +- export_gi() +- FILE.close() +- else: +- STARTFRAME = ENDFRAME = orig_frame +- +- for cntr in range(STARTFRAME, ENDFRAME + 1): +- filename = fname +- +- CTX.currentFrame(cntr) +- SCENE.makeCurrent() +- OBJECTS = SCENE.objects +- +- if ANIM == 1: +- filename = filename.replace(".sc", ".%d.sc" % (CTX.currentFrame())) +- +- print("Exporting to: %s" % (filename)) +- +- FILE = open(filename, 'wb') +- +- if ANIM == 0: +- export_output() +- export_gi() +- +- export_shaders() +- export_modifiers() +- export_ibl() +- export_camera(SCENE.objects.camera) +- for object in OBJECTS: +- if object.users > 1 and object.layers[0] in LAYERS: +- if object.getType() == 'Lamp': +- export_lights(object) +- if object.getType() == 'Mesh' or object.getType() == 'Surf': +- if object.name.startswith("meshlight"): +- export_geometry(object) +- +- if ANIM == 0: +- FILE.write("\n\ninclude \"%s\"\n" % (os.path.basename(filename).replace(".sc", ".geo.sc"))) +- FILE.close() +- ## open geo file +- filename = filename.replace(".sc", ".geo.sc") +- print("Exporting geometry to: %s" % (filename)) +- FILE = open(filename, 'wb') +- +- for object in OBJECTS: +- if object.users > 1 and object.layers[0] in LAYERS: +- if object.getType() == 'Mesh' or object.getType() == 'Surf': +- if not object.name.startswith("meshlight"): +- export_geometry(object) +- +- for object in OBJECTS: +- if object.users > 1 and object.layers[0] in LAYERS: +- if object.getType() == 'Empty': +- export_geometry(object) +- FILE.close() +- +- if ANIM == 1: +- CTX.currentFrame(orig_frame) +- SCENE.makeCurrent() ++ FILE.close() ++ FILE = open(filename.replace(".sc", ".settings.sc"), "wb") ++ export_output() ++ export_gi() ++ FILE.close() ++ else: ++ STARTFRAME = ENDFRAME = orig_frame ++ ++ for cntr in range(STARTFRAME, ENDFRAME + 1): ++ filename = fname ++ ++ CTX.currentFrame(cntr) ++ SCENE.makeCurrent() ++ OBJECTS = SCENE.objects ++ ++ if ANIM == 1: ++ filename = filename.replace(".sc", ".%d.sc" % (CTX.currentFrame())) ++ ++ print("Exporting to: %s" % (filename)) ++ ++ FILE = open(filename, 'wb') ++ ++ if ANIM == 0: ++ export_output() ++ export_gi() ++ ++ export_shaders() ++ export_modifiers() ++ export_ibl() ++ export_camera(SCENE.objects.camera) ++ for object in OBJECTS: ++ if object.users > 1 and object.layers[0] in LAYERS: ++ if object.getType() == 'Lamp': ++ export_lights(object) ++ if object.getType() == 'Mesh' or object.getType() == 'Surf': ++ if object.name.startswith("meshlight"): ++ export_geometry(object) ++ ++ if ANIM == 0: ++ FILE.write("\n\ninclude \"%s\"\n" % (os.path.basename(filename).replace(".sc", ".geo.sc"))) ++ FILE.close() ++ ## open geo file ++ filename = filename.replace(".sc", ".geo.sc") ++ print("Exporting geometry to: %s" % (filename)) ++ FILE = open(filename, 'wb') ++ ++ for object in OBJECTS: ++ if object.users > 1 and object.layers[0] in LAYERS: ++ if object.getType() == 'Mesh' or object.getType() == 'Surf': ++ if not object.name.startswith("meshlight"): ++ export_geometry(object) ++ ++ for object in OBJECTS: ++ if object.users > 1 and object.layers[0] in LAYERS: ++ if object.getType() == 'Empty': ++ export_geometry(object) ++ FILE.close() ++ ++ if ANIM == 1: ++ CTX.currentFrame(orig_frame) ++ SCENE.makeCurrent() + +- print("Export finished.") ++ print("Export finished.") + + if __name__ == '__main__': +- Blender.Window.FileSelector(exportfile, "Export .sc", Blender.sys.makename(ext=".sc")) ++ Blender.Window.FileSelector(exportfile, "Export .sc", Blender.sys.makename(ext=".sc")) + + ## Global event handler ## + def event(evt, val): +- if evt == Draw.ESCKEY: +- print("quitting exporter...") +- Draw.Exit() ++ if evt == Draw.ESCKEY: ++ print("quitting exporter...") ++ Draw.Exit() + + ## Writing of the SF config file ## + def setpath(SFPATH): +- datadir=Blender.Get("datadir") +- # create 'path2sf.cfg in the .blend/bpydata directory +- f = open(datadir + '/path2sf.cfg', 'w') +- f.write(str(SFPATH)+"\n") +- f.write(str(MEM)+"\n") +- f.write(str(THREADS)+"\n") +- f.close() ++ datadir=Blender.Get("datadir") ++ # create 'path2sf.cfg in the .blend/bpydata directory ++ f = open(datadir + '/path2sf.cfg', 'w') ++ f.write(str(SFPATH)+"\n") ++ f.write(str(MEM)+"\n") ++ f.write(str(THREADS)+"\n") ++ f.close() + + def setjavapath(JAVAPATH): +- datadir=Blender.Get("datadir") +- f = open(datadir + '/path2sf.cfg', 'a') +- f.write(str(JAVAPATH)) +- f.close() ++ datadir=Blender.Get("datadir") ++ f = open(datadir + '/path2sf.cfg', 'a') ++ f.write(str(JAVAPATH)) ++ f.close() + + ## Render to Sunflow from inside the script ## + # Send render values to Blender as IDs # + def def_render(): +- # Writes render setting properties +- SCENE.properties['RenderProp'] = "true" +- SCENE.properties['File Type'] = FILETYPE.val +- SCENE.properties['Quick Option'] = QUICKOPT.val +- SCENE.properties['Quick AO Distance'] = QOCCDIST.val +- if NOGUI.val == 1: +- SCENE.properties['-nogui'] = "true" +- else: +- SCENE.properties['-nogui'] = "false" +- if SMALLMESH.val == 1: +- SCENE.properties['-smallmesh'] = "true" +- else: +- SCENE.properties['-smallmesh'] = "false" +- if NOGI.val == 1: +- SCENE.properties['-nogi'] = "true" +- else: +- SCENE.properties['-nogi'] = "false" +- if NOCAUSTICS.val == 1: +- SCENE.properties['-nocaustics'] = "true" +- else: +- SCENE.properties['-nocaustics'] = "false" +- if QUICKOCC.val == 1: +- SCENE.properties['-quick_ambocc'] = "true" +- else: +- SCENE.properties['-quick_ambocc'] = "false" +- if IPR.val == 1: +- SCENE.properties['-ipr'] = "true" +- else: +- SCENE.properties['-ipr'] = "false" +- if EXP_ANIM.val == 1: +- SCENE.properties['animation'] = "true" +- else: +- SCENE.properties['animation'] = "false" ++ # Writes render setting properties ++ SCENE.properties['RenderProp'] = "true" ++ SCENE.properties['File Type'] = FILETYPE.val ++ SCENE.properties['Quick Option'] = QUICKOPT.val ++ SCENE.properties['Quick AO Distance'] = QOCCDIST.val ++ if NOGUI.val == 1: ++ SCENE.properties['-nogui'] = "true" ++ else: ++ SCENE.properties['-nogui'] = "false" ++ if SMALLMESH.val == 1: ++ SCENE.properties['-smallmesh'] = "true" ++ else: ++ SCENE.properties['-smallmesh'] = "false" ++ if NOGI.val == 1: ++ SCENE.properties['-nogi'] = "true" ++ else: ++ SCENE.properties['-nogi'] = "false" ++ if NOCAUSTICS.val == 1: ++ SCENE.properties['-nocaustics'] = "true" ++ else: ++ SCENE.properties['-nocaustics'] = "false" ++ if QUICKOCC.val == 1: ++ SCENE.properties['-quick_ambocc'] = "true" ++ else: ++ SCENE.properties['-quick_ambocc'] = "false" ++ if IPR.val == 1: ++ SCENE.properties['-ipr'] = "true" ++ else: ++ SCENE.properties['-ipr'] = "false" ++ if EXP_ANIM.val == 1: ++ SCENE.properties['animation'] = "true" ++ else: ++ SCENE.properties['animation'] = "false" + + # Import render values from Blender IDs to script # + def import_render(): +- global EXP_ANIM +- if SCENE.properties['RenderProp'] == "true": +- FILETYPE.val = SCENE.properties['File Type'] +- QUICKOPT.val = SCENE.properties['Quick Option'] +- QOCCDIST.val = SCENE.properties['Quick AO Distance'] +- if SCENE.properties['-nogui'] == "true": +- NOGUI.val = 1 +- Draw.Redraw() +- else: +- NOGUI.val = 0 +- Draw.Redraw() +- if SCENE.properties['-smallmesh'] == "true": +- SMALLMESH.val = 1 +- Draw.Redraw() +- else: +- SMALLMESH.val = 0 +- Draw.Redraw() +- if SCENE.properties['-nogi'] == "true": +- NOGI.val = 1 +- Draw.Redraw() +- else: +- NOGI.val = 0 +- Draw.Redraw() +- if SCENE.properties['-nocaustics'] == "true": +- NOCAUSTICS.val = 1 +- Draw.Redraw() +- else: +- NOCAUSTICS.val = 0 +- Draw.Redraw() +- if SCENE.properties['-quick_ambocc'] == "true": +- QUICKOCC.val = 1 +- Draw.Redraw() +- else: +- QUICKOCC.val = 0 +- Draw.Redraw() +- if SCENE.properties['-ipr'] == "true": +- IPR.val = 1 +- Draw.Redraw() +- else: +- IPR.val = 0 +- Draw.Redraw() +- if SCENE.properties['animation'] == "true": +- EXP_ANIM.val = 1 +- Draw.Redraw() +- else: +- EXP_ANIM.val = 0 +- Draw.Redraw() ++ global EXP_ANIM ++ if SCENE.properties['RenderProp'] == "true": ++ FILETYPE.val = SCENE.properties['File Type'] ++ QUICKOPT.val = SCENE.properties['Quick Option'] ++ QOCCDIST.val = SCENE.properties['Quick AO Distance'] ++ if SCENE.properties['-nogui'] == "true": ++ NOGUI.val = 1 ++ Draw.Redraw() ++ else: ++ NOGUI.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-smallmesh'] == "true": ++ SMALLMESH.val = 1 ++ Draw.Redraw() ++ else: ++ SMALLMESH.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-nogi'] == "true": ++ NOGI.val = 1 ++ Draw.Redraw() ++ else: ++ NOGI.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-nocaustics'] == "true": ++ NOCAUSTICS.val = 1 ++ Draw.Redraw() ++ else: ++ NOCAUSTICS.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-quick_ambocc'] == "true": ++ QUICKOCC.val = 1 ++ Draw.Redraw() ++ else: ++ QUICKOCC.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['-ipr'] == "true": ++ IPR.val = 1 ++ Draw.Redraw() ++ else: ++ IPR.val = 0 ++ Draw.Redraw() ++ if SCENE.properties['animation'] == "true": ++ EXP_ANIM.val = 1 ++ Draw.Redraw() ++ else: ++ EXP_ANIM.val = 0 ++ Draw.Redraw() + + # Export render values # + def render(): +- global COMMAND, memory, threads, sfpath, trial, javapath, fname, destname, STARTFRAME, ENDFRAME +- #exportfile(fname) +- destname = fname.replace(".sc", "") +- STARTFRAME = SCENE.getRenderingContext().startFrame() +- ENDFRAME = SCENE.getRenderingContext().endFrame() +- # Get blenders 'bpydata' directory: +- datadir=Blender.Get("datadir") +- # Check existence of SF config file: +- trial=os.path.exists(datadir+'/path2sf.cfg') +- # Continue rendering if file exists: +- if trial == True: +- print("True") +- # open 'path2sf.cfg' +- f = open(datadir + '/path2sf.cfg', 'r+') +- lines = f.readlines() +- # Remove EOL: +- lines[0]=lines[0].rstrip("\n") +- lines[1]=lines[1].rstrip("\n") +- lines[2]=lines[2].rstrip("\n") +- lines[3]=lines[3].rstrip("\n") +- # Allocate values to variables: +- sfdir = lines[0] +- memory = lines[1] +- threads = lines[2] +- javadir = lines[3] +- f.close() +- +- # base command for executing SF: +- EXEC="%sjava -server -Xmx%sM -jar \"%ssunflow.jar\"" % (javadir, memory, sfdir) +- #print EXEC +- +- # Building the options to be passed to SF: +- if NOGUI == 1: +- option1="-nogui " +- else: +- option1="" +- option2="-threads %s " % THREADS +- if SMALLMESH == 1: +- option3="-smallmesh " +- else: +- option3="" +- if NOGI == 1: +- option4="-nogi " +- else: +- option4="" +- if NOCAUSTICS == 1: +- option5="-nocaustics " +- else: +- option5="" +- if QUICKOPT.val == 1: +- option6="" +- if QUICKOPT.val == 2: +- option6="-quick_uvs " +- elif QUICKOPT.val == 3: +- option6="-quick_normals " +- elif QUICKOPT.val == 4: +- option6="-quick_id " +- elif QUICKOPT.val == 5: +- option6="-quick_prims " +- elif QUICKOPT.val == 6: +- option6="-quick_gray " +- elif QUICKOPT.val == 7: +- option6="-quick_wire -aa 2 3 -filter mitchell " +- if QUICKOCC == 1: +- option7="-quick_ambocc %s " % (QOCCDIST) +- else: +- option7="" +- if IPR == 1: +- option8="-ipr " +- else: +- option8="" +- print(option6) +- +- if FILETYPE == 1: +- ext="png" +- elif FILETYPE == 2: +- ext="tga" +- elif FILETYPE == 3: +- ext="hdr" +- elif FILETYPE == 4: +- ext="exr" +- elif FILETYPE == 5: +- ext="igi" +- +- # Definition of the command to render the scene: +- if EXP_ANIM.val == 0: +- COMMAND="%s %s%s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option1, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) +- print(COMMAND) +- if EXP_ANIM.val == 1: +- COMMAND="%s -anim %s %s -o \"%s.#.%s\" \"%s.java\"" % (EXEC, STARTFRAME, ENDFRAME, destname, ext, destname) +- print(COMMAND) +- if FILETYPE != 1: +- COMMAND="%s -nogui %s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) +- print(COMMAND) +- # Execute the command: +- pid=os.system(COMMAND) +- #pid = subprocess.Popen(args=COMMAND, shell=True) ++ global COMMAND, memory, threads, sfpath, trial, javapath, fname, destname, STARTFRAME, ENDFRAME ++ #exportfile(fname) ++ destname = fname.replace(".sc", "") ++ STARTFRAME = SCENE.getRenderingContext().startFrame() ++ ENDFRAME = SCENE.getRenderingContext().endFrame() ++ # Get blenders 'bpydata' directory: ++ datadir=Blender.Get("datadir") ++ # Check existence of SF config file: ++ trial=os.path.exists(datadir+'/path2sf.cfg') ++ # Continue rendering if file exists: ++ if trial == True: ++ print("True") ++ # open 'path2sf.cfg' ++ f = open(datadir + '/path2sf.cfg', 'r+') ++ lines = f.readlines() ++ # Remove EOL: ++ lines[0]=lines[0].rstrip("\n") ++ lines[1]=lines[1].rstrip("\n") ++ lines[2]=lines[2].rstrip("\n") ++ lines[3]=lines[3].rstrip("\n") ++ # Allocate values to variables: ++ sfdir = lines[0] ++ memory = lines[1] ++ threads = lines[2] ++ javadir = lines[3] ++ f.close() ++ ++ # base command for executing SF: ++ EXEC="%sjava -server -Xmx%sM -jar \"%ssunflow.jar\"" % (javadir, memory, sfdir) ++ #print EXEC ++ ++ # Building the options to be passed to SF: ++ if NOGUI == 1: ++ option1="-nogui " ++ else: ++ option1="" ++ option2="-threads %s " % THREADS ++ if SMALLMESH == 1: ++ option3="-smallmesh " ++ else: ++ option3="" ++ if NOGI == 1: ++ option4="-nogi " ++ else: ++ option4="" ++ if NOCAUSTICS == 1: ++ option5="-nocaustics " ++ else: ++ option5="" ++ if QUICKOPT.val == 1: ++ option6="" ++ if QUICKOPT.val == 2: ++ option6="-quick_uvs " ++ elif QUICKOPT.val == 3: ++ option6="-quick_normals " ++ elif QUICKOPT.val == 4: ++ option6="-quick_id " ++ elif QUICKOPT.val == 5: ++ option6="-quick_prims " ++ elif QUICKOPT.val == 6: ++ option6="-quick_gray " ++ elif QUICKOPT.val == 7: ++ option6="-quick_wire -aa 2 3 -filter mitchell " ++ if QUICKOCC == 1: ++ option7="-quick_ambocc %s " % (QOCCDIST) ++ else: ++ option7="" ++ if IPR == 1: ++ option8="-ipr " ++ else: ++ option8="" ++ print(option6) ++ ++ if FILETYPE == 1: ++ ext="png" ++ elif FILETYPE == 2: ++ ext="tga" ++ elif FILETYPE == 3: ++ ext="hdr" ++ elif FILETYPE == 4: ++ ext="exr" ++ elif FILETYPE == 5: ++ ext="igi" ++ ++ # Definition of the command to render the scene: ++ if EXP_ANIM.val == 0: ++ COMMAND="%s %s%s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option1, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) ++ print(COMMAND) ++ if EXP_ANIM.val == 1: ++ COMMAND="%s -anim %s %s -o \"%s.#.%s\" \"%s.java\"" % (EXEC, STARTFRAME, ENDFRAME, destname, ext, destname) ++ print(COMMAND) ++ if FILETYPE != 1: ++ COMMAND="%s -nogui %s%s%s%s%s%s%s -o \"%s.%s\" \"%s\"" % (EXEC, option2, option3, option4, option5, option6, option7, option8, destname, ext, fname) ++ print(COMMAND) ++ # Execute the command: ++ pid=os.system(COMMAND) ++ #pid = subprocess.Popen(args=COMMAND, shell=True) + + ####### GUI button event handler ####### + ######################################## + + def buttonEvent(evt): +- global FILE, SCREEN, SETPATH, SETJAVAPATH, FILENAME, SCENE ++ global FILE, SCREEN, SETPATH, SETJAVAPATH, FILENAME, SCENE + +- ## Common events: +- if evt == EXP_EVT: +- Blender.Window.FileSelector(exportfile, "Export .sc", FILENAME) +- +- ## Config file events +- if evt == SET_PATH: +- Blender.Window.FileSelector(setpath, "SET SF PATH", SFPATH) +- setpath(SFPATH) +- if evt == SET_JAVAPATH: +- Blender.Window.FileSelector(setjavapath, "SET JAVA PATH", JAVAPATH) +- setjavapath(JAVAPATH) +- if evt == REND_EVT: +- render() +- +- ## Setting exclusive buttons rules: +- if evt == DOF_CAMERA: +- if DOF.val == 1: +- if SPHERICALCAMERA.val == 1: +- SPHERICALCAMERA.val = 0 +- Draw.Redraw() +- elif FISHEYECAMERA.val == 1: +- FISHEYECAMERA.val = 0 +- Draw.Redraw() +- if evt == SPHER_CAMERA: +- if SPHERICALCAMERA.val == 1: +- if DOF.val == 1: +- DOF.val = 0 +- Draw.Redraw() +- elif FISHEYECAMERA.val == 1: +- FISHEYECAMERA.val = 0 +- Draw.Redraw() +- if evt == FISH_CAMERA: +- if FISHEYECAMERA.val == 1: +- if DOF.val == 1: +- DOF.val = 0 +- Draw.Redraw() +- elif SPHERICALCAMERA.val == 1: +- SPHERICALCAMERA.val = 0 +- Draw.Redraw() +- if evt == FILTER_EVENT: +- Draw.Redraw() +- if evt == BUCKET_EVENT: +- Draw.Redraw() +- if evt == FORCE_INSTANTGI: +- if INSTANTGI.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_IRRCACHE: +- if IRRCACHE.val == 1: +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if IRRCACHE.val == 0: +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if evt == FORCE_PATHTRACE: +- if PATHTRACE.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_OCCLUSION: +- if OCCLUSION.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if FAKEAMB.val == 1: +- FAKEAMB.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_FAKEAMB: +- if FAKEAMB.val == 1: +- if IRRCACHE.val == 1: +- IRRCACHE.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if OCCLUSION.val == 1: +- OCCLUSION.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == FORCE_GLOBALS: +- if USEGLOBALS.val == 1: +- if PATHTRACE.val == 1: +- PATHTRACE.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 1: +- INSTANTGI.val = 0 +- Draw.Redraw() +- if IRRCACHE.val == 0: +- if USEGLOBALS.val == 1: +- USEGLOBALS.val = 0 +- Draw.Redraw() +- if USEGLOBALS.val == 0: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if evt == EVENT_CAUSTICS: +- if CAUSTICS.val == 0: +- if VIEWCAUSTICS.val == 1: +- VIEWCAUSTICS.val = 0 +- Draw.Redraw() +- if evt == OVERRIDE_CAUSTICS: +- if CAUSTICS.val == 0: +- if VIEWCAUSTICS.val == 1: +- VIEWCAUSTICS.val = 0 +- Draw.Redraw() +- if evt == OVERRIDE_GLOBALS: +- if USEGLOBALS.val == 0: +- if VIEWGLOBALS.val == 1: +- VIEWGLOBALS.val = 0 +- Draw.Redraw() +- if evt == OVERRIDE_GI: +- if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: +- if VIEWGI.val == 1: +- VIEWGI.val = 0 +- Draw.Redraw() +- if evt == IBL_EVENT: +- if IBL.val == 0: +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if IMP_SUN.val == 1: +- IMP_SUN.val = 0 +- Draw.Redraw() +- if IMP_BCKGRD.val == 1: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if BACKGROUND.val == 1: +- BACKGROUND.val = 0 +- Draw.Redraw() +- if evt == LOCK_EVENT: +- if IBL.val == 0: +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == SUN_EVENT: +- if IMP_BCKGRD.val == 1: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if BACKGROUND.val == 1: +- BACKGROUND.val = 0 +- Draw.Redraw() +- if IBL.val == 1: +- IBL.val = 0 +- Draw.Redraw() +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == BCKGRD_EVENT: +- if IMP_SUN.val == 1: +- IMP_SUN.val = 0 +- Draw.Redraw() +- if IBL.val == 1: +- IBL.val = 0 +- Draw.Redraw() +- if BACKGROUND.val == 1: +- BACKGROUND.val = 0 +- Draw.Redraw() +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == CBCKGRD_EVENT: +- if IMP_SUN.val == 1: +- IMP_SUN.val = 0 +- Draw.Redraw() +- if IBL.val == 1: +- IBL.val = 0 +- Draw.Redraw() +- if IMP_BCKGRD.val == 1: +- IMP_BCKGRD.val = 0 +- Draw.Redraw() +- if IBLLOCK.val == 1: +- IBLLOCK.val = 0 +- Draw.Redraw() +- if evt == QUICK_OPT: +- if QUICKOCC.val == 1: +- QUICKOCC.val = 0 +- Draw.Redraw() +- if evt == QUICK_OCC: +- QUICKOPT.val = 1 +- Draw.Redraw(0) +- +- ## Rules for displaying the different panels: +- if evt == CHANGE_AA: +- SCREEN=0 +- Draw.Redraw() +- return +- if evt == CHANGE_CAM: +- SCREEN=2 +- Draw.Redraw() +- return +- if evt == CHANGE_BCKGRD: +- SCREEN=3 +- Draw.Redraw() +- return +- if evt == CHANGE_LIGHT: +- SCREEN=4 +- Draw.Redraw() +- return +- if evt == CHANGE_GI: +- SCREEN=5 +- Draw.Redraw() +- return +- if evt == CHANGE_SHAD: +- SCREEN=6 +- Draw.Redraw() +- return +- if evt == CHANGE_EXP: +- SCREEN=7 +- Draw.Redraw() +- return +- if evt == CHANGE_CFG: +- SCREEN=8 +- Draw.Redraw() +- return +- # Go back to config panel if user tries to render without configuring SF: +- if evt == REND_EVT and trial == False: +- SCREEN=8 +- Draw.Redraw() +- return +- if evt == SHAD_OK: +- Draw.Redraw() +- return +- # Events for the import and export of ID values and setting of default values +- if evt == EXPORT_ID: +- print(" o Sending script settings to .blend...") +- def_output() +- def_gi() +- def_lights() +- def_camera() +- def_render() +- print(" o Finished sending settings.") +- return +- if evt == DEFAULT_ID: +- default_values() +- print(" o Default settings restored.") +- return +- if evt == IMPORT_ID: +- try: +- if SCENE.properties['SceneProp'] == "true": +- print(" o Script settings found in .blend, importing to script...") +- import_output() +- import_gi() +- import_lights() +- import_camera() +- import_render() +- except: +- print(" o No script settings in .blend, using defaults.") +- default_values() +- return ++ ## Common events: ++ if evt == EXP_EVT: ++ Blender.Window.FileSelector(exportfile, "Export .sc", FILENAME) ++ ++ ## Config file events ++ if evt == SET_PATH: ++ Blender.Window.FileSelector(setpath, "SET SF PATH", SFPATH) ++ setpath(SFPATH) ++ if evt == SET_JAVAPATH: ++ Blender.Window.FileSelector(setjavapath, "SET JAVA PATH", JAVAPATH) ++ setjavapath(JAVAPATH) ++ if evt == REND_EVT: ++ render() ++ ++ ## Setting exclusive buttons rules: ++ if evt == DOF_CAMERA: ++ if DOF.val == 1: ++ if SPHERICALCAMERA.val == 1: ++ SPHERICALCAMERA.val = 0 ++ Draw.Redraw() ++ elif FISHEYECAMERA.val == 1: ++ FISHEYECAMERA.val = 0 ++ Draw.Redraw() ++ if evt == SPHER_CAMERA: ++ if SPHERICALCAMERA.val == 1: ++ if DOF.val == 1: ++ DOF.val = 0 ++ Draw.Redraw() ++ elif FISHEYECAMERA.val == 1: ++ FISHEYECAMERA.val = 0 ++ Draw.Redraw() ++ if evt == FISH_CAMERA: ++ if FISHEYECAMERA.val == 1: ++ if DOF.val == 1: ++ DOF.val = 0 ++ Draw.Redraw() ++ elif SPHERICALCAMERA.val == 1: ++ SPHERICALCAMERA.val = 0 ++ Draw.Redraw() ++ if evt == FILTER_EVENT: ++ Draw.Redraw() ++ if evt == BUCKET_EVENT: ++ Draw.Redraw() ++ if evt == FORCE_INSTANTGI: ++ if INSTANTGI.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_IRRCACHE: ++ if IRRCACHE.val == 1: ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if IRRCACHE.val == 0: ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_PATHTRACE: ++ if PATHTRACE.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_OCCLUSION: ++ if OCCLUSION.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if FAKEAMB.val == 1: ++ FAKEAMB.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_FAKEAMB: ++ if FAKEAMB.val == 1: ++ if IRRCACHE.val == 1: ++ IRRCACHE.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if OCCLUSION.val == 1: ++ OCCLUSION.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1 or PATHTRACE.val == 1 or OCCLUSION.val == 1 or FAKEAMB.val == 1: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == FORCE_GLOBALS: ++ if USEGLOBALS.val == 1: ++ if PATHTRACE.val == 1: ++ PATHTRACE.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 1: ++ INSTANTGI.val = 0 ++ Draw.Redraw() ++ if IRRCACHE.val == 0: ++ if USEGLOBALS.val == 1: ++ USEGLOBALS.val = 0 ++ Draw.Redraw() ++ if USEGLOBALS.val == 0: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if evt == EVENT_CAUSTICS: ++ if CAUSTICS.val == 0: ++ if VIEWCAUSTICS.val == 1: ++ VIEWCAUSTICS.val = 0 ++ Draw.Redraw() ++ if evt == OVERRIDE_CAUSTICS: ++ if CAUSTICS.val == 0: ++ if VIEWCAUSTICS.val == 1: ++ VIEWCAUSTICS.val = 0 ++ Draw.Redraw() ++ if evt == OVERRIDE_GLOBALS: ++ if USEGLOBALS.val == 0: ++ if VIEWGLOBALS.val == 1: ++ VIEWGLOBALS.val = 0 ++ Draw.Redraw() ++ if evt == OVERRIDE_GI: ++ if INSTANTGI.val == 0 and IRRCACHE.val == 0 and PATHTRACE.val == 0 and OCCLUSION.val == 0 and FAKEAMB.val == 0: ++ if VIEWGI.val == 1: ++ VIEWGI.val = 0 ++ Draw.Redraw() ++ if evt == IBL_EVENT: ++ if IBL.val == 0: ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if IMP_SUN.val == 1: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ if IMP_BCKGRD.val == 1: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if BACKGROUND.val == 1: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ if evt == LOCK_EVENT: ++ if IBL.val == 0: ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == SUN_EVENT: ++ if IMP_BCKGRD.val == 1: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if BACKGROUND.val == 1: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ if IBL.val == 1: ++ IBL.val = 0 ++ Draw.Redraw() ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == BCKGRD_EVENT: ++ if IMP_SUN.val == 1: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ if IBL.val == 1: ++ IBL.val = 0 ++ Draw.Redraw() ++ if BACKGROUND.val == 1: ++ BACKGROUND.val = 0 ++ Draw.Redraw() ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == CBCKGRD_EVENT: ++ if IMP_SUN.val == 1: ++ IMP_SUN.val = 0 ++ Draw.Redraw() ++ if IBL.val == 1: ++ IBL.val = 0 ++ Draw.Redraw() ++ if IMP_BCKGRD.val == 1: ++ IMP_BCKGRD.val = 0 ++ Draw.Redraw() ++ if IBLLOCK.val == 1: ++ IBLLOCK.val = 0 ++ Draw.Redraw() ++ if evt == QUICK_OPT: ++ if QUICKOCC.val == 1: ++ QUICKOCC.val = 0 ++ Draw.Redraw() ++ if evt == QUICK_OCC: ++ QUICKOPT.val = 1 ++ Draw.Redraw(0) ++ ++ ## Rules for displaying the different panels: ++ if evt == CHANGE_AA: ++ SCREEN=0 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_CAM: ++ SCREEN=2 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_BCKGRD: ++ SCREEN=3 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_LIGHT: ++ SCREEN=4 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_GI: ++ SCREEN=5 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_SHAD: ++ SCREEN=6 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_EXP: ++ SCREEN=7 ++ Draw.Redraw() ++ return ++ if evt == CHANGE_CFG: ++ SCREEN=8 ++ Draw.Redraw() ++ return ++ # Go back to config panel if user tries to render without configuring SF: ++ if evt == REND_EVT and trial == False: ++ SCREEN=8 ++ Draw.Redraw() ++ return ++ if evt == SHAD_OK: ++ Draw.Redraw() ++ return ++ # Events for the import and export of ID values and setting of default values ++ if evt == EXPORT_ID: ++ print(" o Sending script settings to .blend...") ++ def_output() ++ def_gi() ++ def_lights() ++ def_camera() ++ def_render() ++ print(" o Finished sending settings.") ++ return ++ if evt == DEFAULT_ID: ++ default_values() ++ print(" o Default settings restored.") ++ return ++ if evt == IMPORT_ID: ++ try: ++ if SCENE.properties['SceneProp'] == "true": ++ print(" o Script settings found in .blend, importing to script...") ++ import_output() ++ import_gi() ++ import_lights() ++ import_camera() ++ import_render() ++ except: ++ print(" o No script settings in .blend, using defaults.") ++ default_values() ++ return + + # Same as the IMPORT_ID event, but needed it to be a function so we can load it on script start up # + def auto_import(): +- default_values() +- try: +- if SCENE.properties['SceneProp'] == "true": +- print(" o Script settings found in .blend, importing to script...") +- import_output() +- import_gi() +- import_lights() +- import_camera() +- import_render() +- except: +- print(" o No script settings in .blend, using defaults.") +- default_values() +- return ++ default_values() ++ try: ++ if SCENE.properties['SceneProp'] == "true": ++ print(" o Script settings found in .blend, importing to script...") ++ import_output() ++ import_gi() ++ import_lights() ++ import_camera() ++ import_render() ++ except: ++ print(" o No script settings in .blend, using defaults.") ++ default_values() ++ return + + ####### Draw GUI Section ####### + ################################ + + ## Draws the individual panels ## + def drawGUI(): +- global SCREEN +- if SCREEN==0: +- drawAA() +- if SCREEN==2: +- drawCamera() +- if SCREEN==3: +- drawBackground() +- if SCREEN==4: +- drawLights() +- if SCREEN==5: +- drawGI() +- if SCREEN==6: +- drawShad() +- if SCREEN==7: +- drawRender() +- if SCREEN==8: +- drawConfig() ++ global SCREEN ++ if SCREEN==0: ++ drawAA() ++ if SCREEN==2: ++ drawCamera() ++ if SCREEN==3: ++ drawBackground() ++ if SCREEN==4: ++ drawLights() ++ if SCREEN==5: ++ drawGI() ++ if SCREEN==6: ++ drawShad() ++ if SCREEN==7: ++ drawRender() ++ if SCREEN==8: ++ drawConfig() + + ## Draw AA options ## + def drawAA(): +- global MINAA, MAXAA, AASAMPLES, AAJITTER, IMGFILTERW, IMGFILTERH, IMGFILTER +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("AA:") +- col=100; line=145; MINAA=Draw.Number("Min AA", 2, col, line, 120, 18, MINAA.val, -4, 5); +- col=230; MAXAA=Draw.Number("Max AA", 2, col, line, 120, 18, MAXAA.val, -4, 5) +- col=100; line=125; AASAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, AASAMPLES.val, 0, 32) +- col=230; AAJITTER=Draw.Toggle("AA Jitter", 2, col, line, 120, 18, AAJITTER.val, "Use jitter for anti-aliasing") +- col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Image Filter:") +- col=100; line=100; IMGFILTER=Draw.Menu("%tImage Filter|box|gaussian|mitchell|triangle|catmull-rom|blackman-harris|sinc|lanczos", FILTER_EVENT, col, line, 120, 18, IMGFILTER.val) ++ global MINAA, MAXAA, AASAMPLES, AAJITTER, IMGFILTERW, IMGFILTERH, IMGFILTER ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("AA:") ++ col=100; line=145; MINAA=Draw.Number("Min AA", 2, col, line, 120, 18, MINAA.val, -4, 5); ++ col=230; MAXAA=Draw.Number("Max AA", 2, col, line, 120, 18, MAXAA.val, -4, 5) ++ col=100; line=125; AASAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, AASAMPLES.val, 0, 32) ++ col=230; AAJITTER=Draw.Toggle("AA Jitter", 2, col, line, 120, 18, AAJITTER.val, "Use jitter for anti-aliasing") ++ col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Image Filter:") ++ col=100; line=100; IMGFILTER=Draw.Menu("%tImage Filter|box|gaussian|mitchell|triangle|catmull-rom|blackman-harris|sinc|lanczos", FILTER_EVENT, col, line, 120, 18, IMGFILTER.val) + +- drawButtons() ++ drawButtons() + + ## Draw camera options ## + def drawCamera(): +- global DOF, DOFRADIUS, SPHERICALCAMERA, FISHEYECAMERA, LENSSIDES, LENSROTATION +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Camera:") +- col=100; line=145; DOF=Draw.Toggle("DOF", DOF_CAMERA, col, line, 120, 18, DOF.val, "Turn on depth of field") +- col=225; DOFRADIUS=Draw.Number("Radius", 2, col, line, 120, 18, DOFRADIUS.val, 0.001, 9.999) +- col=100; line=125; BGL.glRasterPos2i(col, line); Draw.Text("Bokeh shape -->") +- col=225; line=120; LENSSIDES=Draw.Number("Sides", 2, col, line, 120, 18, LENSSIDES.val, 2, 8) +- col=350; LENSROTATION=Draw.Number("Rotation", 2, col, line, 120, 18, LENSROTATION.val, 0.0, 360.0) +- col=100; line=95; SPHERICALCAMERA=Draw.Toggle("Spherical", SPHER_CAMERA, col, line, 120, 18, SPHERICALCAMERA.val, "Use the sperical camera type") +- col=100; line=70; FISHEYECAMERA=Draw.Toggle("Fisheye", FISH_CAMERA, col, line, 120, 18, FISHEYECAMERA.val, "Use the fisheye camera type") ++ global DOF, DOFRADIUS, SPHERICALCAMERA, FISHEYECAMERA, LENSSIDES, LENSROTATION ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Camera:") ++ col=100; line=145; DOF=Draw.Toggle("DOF", DOF_CAMERA, col, line, 120, 18, DOF.val, "Turn on depth of field") ++ col=225; DOFRADIUS=Draw.Number("Radius", 2, col, line, 120, 18, DOFRADIUS.val, 0.001, 9.999) ++ col=100; line=125; BGL.glRasterPos2i(col, line); Draw.Text("Bokeh shape -->") ++ col=225; line=120; LENSSIDES=Draw.Number("Sides", 2, col, line, 120, 18, LENSSIDES.val, 2, 8) ++ col=350; LENSROTATION=Draw.Number("Rotation", 2, col, line, 120, 18, LENSROTATION.val, 0.0, 360.0) ++ col=100; line=95; SPHERICALCAMERA=Draw.Toggle("Spherical", SPHER_CAMERA, col, line, 120, 18, SPHERICALCAMERA.val, "Use the sperical camera type") ++ col=100; line=70; FISHEYECAMERA=Draw.Toggle("Fisheye", FISH_CAMERA, col, line, 120, 18, FISHEYECAMERA.val, "Use the fisheye camera type") + +- drawButtons() ++ drawButtons() + + ## Draw Background options ## + def drawBackground(): +- global IMP_BCKGRD, IMP_SUN, BACKGROUND, BCKGRD, IBL, IBLLOCK, IBLSAMPLES, SUN_TURB, SUN_SAMPLES, INFINITEPLANE, IPLANECOLOR +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Simple background:") +- col=10; line=200; IMP_BCKGRD=Draw.Toggle("Import World", BCKGRD_EVENT, col, line, 120, 18, IMP_BCKGRD.val, "Set World's Horizon color as background") +- col=10; line=175; BACKGROUND=Draw.Toggle("Create Background", CBCKGRD_EVENT, col, line, 120, 18, BACKGROUND.val, "Define a background color") +- col=135; BCKGRD=Draw.ColorPicker(2, 135, 175, 30, 18, BCKGRD.val, "New background color") +- col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("High Dynamic Range Illumination (Please set a texture named 'ibllight', lower case):") +- col=10; line=125; IBL=Draw.Toggle("Image Based Light", IBL_EVENT, col, line, 140, 18, IBL.val, "Use IBL/hdr type light") +- col=160; IBLLOCK=Draw.Toggle("Importance Sampling", LOCK_EVENT, col, line, 130, 18, IBLLOCK.val, "Use importance sampling (lock false), IBL must be on") +- col=300; IBLSAMPLES=Draw.Number("Samples", 2, col, line, 100, 18, IBLSAMPLES.val, 1, 1024) +- col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Sunsky:") +- col=10; line=75; IMP_SUN=Draw.Toggle("Import Sun", SUN_EVENT, col, line, 120, 18, IMP_SUN.val, "Import existing Sun") +- col=140; line=75; SUN_TURB=Draw.Number("Turbidity", 2, col, line, 120, 18, SUN_TURB.val, 0.0, 32.0) +- col=270; SUN_SAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, SUN_SAMPLES.val, 1, 10000) +- col=400; INFINITEPLANE=Draw.Toggle("Infinite Plane", 2, col, line, 90, 18, INFINITEPLANE.val, "Use an infinite plane in the scene") +- col=500; IPLANECOLOR=Draw.ColorPicker(2, 495, 75, 30, 18, IPLANECOLOR.val, "Infinite plane color") ++ global IMP_BCKGRD, IMP_SUN, BACKGROUND, BCKGRD, IBL, IBLLOCK, IBLSAMPLES, SUN_TURB, SUN_SAMPLES, INFINITEPLANE, IPLANECOLOR ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Simple background:") ++ col=10; line=200; IMP_BCKGRD=Draw.Toggle("Import World", BCKGRD_EVENT, col, line, 120, 18, IMP_BCKGRD.val, "Set World's Horizon color as background") ++ col=10; line=175; BACKGROUND=Draw.Toggle("Create Background", CBCKGRD_EVENT, col, line, 120, 18, BACKGROUND.val, "Define a background color") ++ col=135; BCKGRD=Draw.ColorPicker(2, 135, 175, 30, 18, BCKGRD.val, "New background color") ++ col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("High Dynamic Range Illumination (Please set a texture named 'ibllight', lower case):") ++ col=10; line=125; IBL=Draw.Toggle("Image Based Light", IBL_EVENT, col, line, 140, 18, IBL.val, "Use IBL/hdr type light") ++ col=160; IBLLOCK=Draw.Toggle("Importance Sampling", LOCK_EVENT, col, line, 130, 18, IBLLOCK.val, "Use importance sampling (lock false), IBL must be on") ++ col=300; IBLSAMPLES=Draw.Number("Samples", 2, col, line, 100, 18, IBLSAMPLES.val, 1, 1024) ++ col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Sunsky:") ++ col=10; line=75; IMP_SUN=Draw.Toggle("Import Sun", SUN_EVENT, col, line, 120, 18, IMP_SUN.val, "Import existing Sun") ++ col=140; line=75; SUN_TURB=Draw.Number("Turbidity", 2, col, line, 120, 18, SUN_TURB.val, 0.0, 32.0) ++ col=270; SUN_SAMPLES=Draw.Number("Samples", 2, col, line, 120, 18, SUN_SAMPLES.val, 1, 10000) ++ col=400; INFINITEPLANE=Draw.Toggle("Infinite Plane", 2, col, line, 90, 18, INFINITEPLANE.val, "Use an infinite plane in the scene") ++ col=500; IPLANECOLOR=Draw.ColorPicker(2, 495, 75, 30, 18, IPLANECOLOR.val, "Infinite plane color") + +- drawButtons() ++ drawButtons() + + ## Draw light options ## + def drawLights(): +- global MESHLIGHTPOWER, LAMPPOWER, DSAMPLES, CONVLAMP +- col=10; line=205; BGL.glRasterPos2i(col, line); Draw.Text("Global Options:") +- col=10; line=180; BGL.glRasterPos2i(col, line); Draw.Text("Meshlight:") +- col=110; line=175; MESHLIGHTPOWER=Draw.Number("Power", 2, col, line, 200, 18, MESHLIGHTPOWER.val, 1, 10000) +- col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("Light:") +- col=110; line=150; LAMPPOWER=Draw.Number("Power", 2, col, line, 200, 18, LAMPPOWER.val, 1, 10000) +- col=10; line=130; BGL.glRasterPos2i(col, line); Draw.Text("Lightserver:") +- col=110; line=125; DSAMPLES=Draw.Number("Direct Samples", 2, col, line, 200, 18, DSAMPLES.val, 0, 1024) +- col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Unknown lamps:") +- col=10; line = 75; CONVLAMP=Draw.Toggle("Convert lamps", 2, col, line, 140, 18, CONVLAMP.val, "Convert unsupported lamps into point light") ++ global MESHLIGHTPOWER, LAMPPOWER, DSAMPLES, CONVLAMP ++ col=10; line=205; BGL.glRasterPos2i(col, line); Draw.Text("Global Options:") ++ col=10; line=180; BGL.glRasterPos2i(col, line); Draw.Text("Meshlight:") ++ col=110; line=175; MESHLIGHTPOWER=Draw.Number("Power", 2, col, line, 200, 18, MESHLIGHTPOWER.val, 1, 10000) ++ col=10; line=155; BGL.glRasterPos2i(col, line); Draw.Text("Light:") ++ col=110; line=150; LAMPPOWER=Draw.Number("Power", 2, col, line, 200, 18, LAMPPOWER.val, 1, 10000) ++ col=10; line=130; BGL.glRasterPos2i(col, line); Draw.Text("Lightserver:") ++ col=110; line=125; DSAMPLES=Draw.Number("Direct Samples", 2, col, line, 200, 18, DSAMPLES.val, 0, 1024) ++ col=10; line=105; BGL.glRasterPos2i(col, line); Draw.Text("Unknown lamps:") ++ col=10; line = 75; CONVLAMP=Draw.Toggle("Convert lamps", 2, col, line, 140, 18, CONVLAMP.val, "Convert unsupported lamps into point light") + +- drawButtons() ++ drawButtons() + + ## Draw Shader options ## + def drawShad(): +- global SHADTYPE, SHADOK +- col=10; line=400; BGL.glRasterPos2i(col, line); Draw.Text("Specific instructions for exporting shaders:") +- col=10; line=375; BGL.glRasterPos2i(col, line); Draw.Text("For exporting bump and normal maps, have the second texture slot (slot 1) name") +- col=10; line=350; BGL.glRasterPos2i(col, line); Draw.Text("begin with bump or normal. Controlled with the Map To Nor button and Nor slider.") +- col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Regarding Textures: Diffuse, shiny, ambocc, phong, and ward materials will") +- col=10; line=300; BGL.glRasterPos2i(col, line); Draw.Text("use textures as the diffuse channel if the texture is in the first texture slot.") +- col=10; line=275; SHADTYPE=Draw.Menu("%tSelect shader|Uber|Diffuse|Shiny|AO|Phong|Ward|Mirror|Glass|Constant", SHADER_TYPE, col, line, 85, 18, SHADTYPE.val) +- col=100; SHADOK=Draw.Button("OK", SHAD_OK, col, line, 30, 18, "Print on screen instructions") +- if SHADTYPE == 1: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Uber: shader name should start with 'sfube' - imports Blender's Col and Spe RGB") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("values") +- col=10; line=200; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 0: diffuse texture(Mapto Col value), else Col RGB values") +- col=10; line=175; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the diffuse texture is controlled by the Map Input Col slider") +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 2: specular texture(Mapto Var value), else Spe RGB values") +- col=10; line=125; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the specular texture is controlled by the Map Input Var slider") +- if SHADTYPE == 2: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Diffuse: shader name should start with 'sfdif' - imports Blender's Col RGB values") +- if SHADTYPE == 3: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Shiny: shader name sould start with 'sfshi' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("RayMirr values") +- if SHADTYPE == 4: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ambient Occlusion: shader name sould start with 'sfamb' - imports Blender's") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Col RGB (Bright) and Spe RGB (Dark) values") +- if SHADTYPE == 5: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Phong: shader name sould start with 'sfpho' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values, as well as the spec's hard value") +- if SHADTYPE == 6: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ward: shader name sould start with 'sfwar' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values") +- if SHADTYPE == 7: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Mirror: shader name sould start with 'sfmir' - imports Blender's Col RGB values,") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Ray Mir button must be on") +- if SHADTYPE == 8: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Glass: shader name sould start with 'sfgla' - imports Blender's Col RGB and") +- col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("IOR values, Ray Transp button must be on") +- if SHADTYPE == 9: +- col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Constant: shader name should start with 'sfcon' - imports Blender's Col RGB values") ++ global SHADTYPE, SHADOK ++ col=10; line=400; BGL.glRasterPos2i(col, line); Draw.Text("Specific instructions for exporting shaders:") ++ col=10; line=375; BGL.glRasterPos2i(col, line); Draw.Text("For exporting bump and normal maps, have the second texture slot (slot 1) name") ++ col=10; line=350; BGL.glRasterPos2i(col, line); Draw.Text("begin with bump or normal. Controlled with the Map To Nor button and Nor slider.") ++ col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Regarding Textures: Diffuse, shiny, ambocc, phong, and ward materials will") ++ col=10; line=300; BGL.glRasterPos2i(col, line); Draw.Text("use textures as the diffuse channel if the texture is in the first texture slot.") ++ col=10; line=275; SHADTYPE=Draw.Menu("%tSelect shader|Uber|Diffuse|Shiny|AO|Phong|Ward|Mirror|Glass|Constant", SHADER_TYPE, col, line, 85, 18, SHADTYPE.val) ++ col=100; SHADOK=Draw.Button("OK", SHAD_OK, col, line, 30, 18, "Print on screen instructions") ++ if SHADTYPE == 1: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Uber: shader name should start with 'sfube' - imports Blender's Col and Spe RGB") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("values") ++ col=10; line=200; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 0: diffuse texture(Mapto Col value), else Col RGB values") ++ col=10; line=175; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the diffuse texture is controlled by the Map Input Col slider") ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("\t\tIF Texture Slot 2: specular texture(Mapto Var value), else Spe RGB values") ++ col=10; line=125; BGL.glRasterPos2i(col, line); Draw.Text("\t\tThe blend factor for the specular texture is controlled by the Map Input Var slider") ++ if SHADTYPE == 2: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Diffuse: shader name should start with 'sfdif' - imports Blender's Col RGB values") ++ if SHADTYPE == 3: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Shiny: shader name sould start with 'sfshi' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("RayMirr values") ++ if SHADTYPE == 4: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ambient Occlusion: shader name sould start with 'sfamb' - imports Blender's") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Col RGB (Bright) and Spe RGB (Dark) values") ++ if SHADTYPE == 5: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Phong: shader name sould start with 'sfpho' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values, as well as the spec's hard value") ++ if SHADTYPE == 6: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Ward: shader name sould start with 'sfwar' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Spe RGB values") ++ if SHADTYPE == 7: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Mirror: shader name sould start with 'sfmir' - imports Blender's Col RGB values,") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("Ray Mir button must be on") ++ if SHADTYPE == 8: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Glass: shader name sould start with 'sfgla' - imports Blender's Col RGB and") ++ col=10; line=225; BGL.glRasterPos2i(col, line); Draw.Text("IOR values, Ray Transp button must be on") ++ if SHADTYPE == 9: ++ col=10; line=250; BGL.glRasterPos2i(col, line); Draw.Text("Constant: shader name should start with 'sfcon' - imports Blender's Col RGB values") + +- drawButtons() ++ drawButtons() + + ## Draw export and render options settings ## + def drawRender(): +- global EXPORT, RENDER, SMALLMESH, NOGI, NOGUI, NOCAUSTICS, QUICKUV, QUICKNORM, QUICKID, QUICKPRIMS, QUICKGRAY, QUICKWIRE, QUICKOCC, QOCCDIST, FILETYPE, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, QUICKOPT, EXP_ANIM, IPR, BUCKETSIZE, BUCKETTYPE, REVERSE +- col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Rendering actions:") +- col=10; line=300; EXPORT=Draw.Button("Export .sc", EXP_EVT, col, line, 140, 18, "Export the scene to .sc file") +- col=160; RENDER=Draw.Button("Render exported", REND_EVT, col, line, 130, 18, "Render it (Export a .sc file first)") +- col=300; FILETYPE=Draw.Menu("%tFile type|png|tga|hdr|exr|igi", FILE_TYPE, col, line, 85, 18, FILETYPE.val) +- col=10; line=280; BGL.glRasterPos2i(col, line); Draw.Text("Max raytrace depths:") +- col=10; line=255; DEPTH_DIFF=Draw.Number("Diffuse Depth", 2, col, line, 125, 18, DEPTH_DIFF.val, 1, 100) +- col=150; DEPTH_REFL=Draw.Number("Reflection Depth", 2, col, line, 125, 18, DEPTH_REFL.val, 1, 100) +- col=290; DEPTH_REFR=Draw.Number("Refraction Depth", 2, col, line, 125, 18, DEPTH_REFR.val, 1, 100) +- col=10; line=240; BGL.glRasterPos2i(col, line); Draw.Text("Bucket Order:") +- col=10; line=215; BUCKETSIZE=Draw.Number("Bucket Size", 2, col, line, 125, 18, BUCKETSIZE.val, 8, 64) +- col=150; BUCKETTYPE=Draw.Menu("%tBucket Order|hilbert (default)|spiral|column|row|diagonal|random", BUCKET_EVENT, col, line, 125, 18, BUCKETTYPE.val) +- col=290; REVERSE=Draw.Toggle("Reverse Order", 2, col, line, 125, 18, REVERSE.val, "Use reverse bucket order") +- col=10; line=195; BGL.glRasterPos2i(col, line); Draw.Text("Rendering options:") +- col=10; line=170; SMALLMESH=Draw.Toggle("Small mesh", 2, col, line, 85, 18, SMALLMESH.val, "Load triangle meshes using triangles optimized for memory use") +- col=100; NOGI=Draw.Toggle("No GI", 2, col, line, 85, 18, NOGI.val, "Disable any global illumination engines in the scene") +- col=190; NOCAUSTICS=Draw.Toggle("No Caustics", 2, col, line, 85, 18, NOCAUSTICS.val, "Disable any caustic engine in the scene") +- col=280; NOGUI=Draw.Toggle("No GUI", 2, col, line, 85, 18, NOGUI.val, "Don't open the frame showing rendering progress") +- col=370; IPR=Draw.Toggle("IPR", 2, col, line, 85, 18, IPR.val, "Render using progressive algorithm") +- col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Quick override options:") +- col=10; line=125; QUICKOPT=Draw.Menu("%tQuick option|None|Quick UVs|Quick Normals|Quick ID|Quick Primitives|Quick Gray|Quick Wire", QUICK_OPT, col, line, 100, 18, QUICKOPT.val) +- col=10; line=100; QUICKOCC=Draw.Toggle("Quick Amb Occ", QUICK_OCC, col, line, 85, 18, QUICKOCC.val, "Applies ambient occlusion to the scene with specified maximum distance") +- col=100; QOCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, QOCCDIST.val, 0.00, 1000.00) +- col=10; line=75; EXP_ANIM=Draw.Toggle("Export As Animation", 2, col, line, 140, 18, EXP_ANIM.val, "Export the scene as animation") ++ global EXPORT, RENDER, SMALLMESH, NOGI, NOGUI, NOCAUSTICS, QUICKUV, QUICKNORM, QUICKID, QUICKPRIMS, QUICKGRAY, QUICKWIRE, QUICKOCC, QOCCDIST, FILETYPE, DEPTH_DIFF, DEPTH_REFL, DEPTH_REFR, QUICKOPT, EXP_ANIM, IPR, BUCKETSIZE, BUCKETTYPE, REVERSE ++ col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Rendering actions:") ++ col=10; line=300; EXPORT=Draw.Button("Export .sc", EXP_EVT, col, line, 140, 18, "Export the scene to .sc file") ++ col=160; RENDER=Draw.Button("Render exported", REND_EVT, col, line, 130, 18, "Render it (Export a .sc file first)") ++ col=300; FILETYPE=Draw.Menu("%tFile type|png|tga|hdr|exr|igi", FILE_TYPE, col, line, 85, 18, FILETYPE.val) ++ col=10; line=280; BGL.glRasterPos2i(col, line); Draw.Text("Max raytrace depths:") ++ col=10; line=255; DEPTH_DIFF=Draw.Number("Diffuse Depth", 2, col, line, 125, 18, DEPTH_DIFF.val, 1, 100) ++ col=150; DEPTH_REFL=Draw.Number("Reflection Depth", 2, col, line, 125, 18, DEPTH_REFL.val, 1, 100) ++ col=290; DEPTH_REFR=Draw.Number("Refraction Depth", 2, col, line, 125, 18, DEPTH_REFR.val, 1, 100) ++ col=10; line=240; BGL.glRasterPos2i(col, line); Draw.Text("Bucket Order:") ++ col=10; line=215; BUCKETSIZE=Draw.Number("Bucket Size", 2, col, line, 125, 18, BUCKETSIZE.val, 8, 64) ++ col=150; BUCKETTYPE=Draw.Menu("%tBucket Order|hilbert (default)|spiral|column|row|diagonal|random", BUCKET_EVENT, col, line, 125, 18, BUCKETTYPE.val) ++ col=290; REVERSE=Draw.Toggle("Reverse Order", 2, col, line, 125, 18, REVERSE.val, "Use reverse bucket order") ++ col=10; line=195; BGL.glRasterPos2i(col, line); Draw.Text("Rendering options:") ++ col=10; line=170; SMALLMESH=Draw.Toggle("Small mesh", 2, col, line, 85, 18, SMALLMESH.val, "Load triangle meshes using triangles optimized for memory use") ++ col=100; NOGI=Draw.Toggle("No GI", 2, col, line, 85, 18, NOGI.val, "Disable any global illumination engines in the scene") ++ col=190; NOCAUSTICS=Draw.Toggle("No Caustics", 2, col, line, 85, 18, NOCAUSTICS.val, "Disable any caustic engine in the scene") ++ col=280; NOGUI=Draw.Toggle("No GUI", 2, col, line, 85, 18, NOGUI.val, "Don't open the frame showing rendering progress") ++ col=370; IPR=Draw.Toggle("IPR", 2, col, line, 85, 18, IPR.val, "Render using progressive algorithm") ++ col=10; line=150; BGL.glRasterPos2i(col, line); Draw.Text("Quick override options:") ++ col=10; line=125; QUICKOPT=Draw.Menu("%tQuick option|None|Quick UVs|Quick Normals|Quick ID|Quick Primitives|Quick Gray|Quick Wire", QUICK_OPT, col, line, 100, 18, QUICKOPT.val) ++ col=10; line=100; QUICKOCC=Draw.Toggle("Quick Amb Occ", QUICK_OCC, col, line, 85, 18, QUICKOCC.val, "Applies ambient occlusion to the scene with specified maximum distance") ++ col=100; QOCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, QOCCDIST.val, 0.00, 1000.00) ++ col=10; line=75; EXP_ANIM=Draw.Toggle("Export As Animation", 2, col, line, 140, 18, EXP_ANIM.val, "Export the scene as animation") + +- drawButtons() ++ drawButtons() + + ## Draw the SF configuration settings ## + def drawConfig(): +- global SET_PATH, THREADS, MEM, SET_JAVAPATH +- col=10; line = 315; BGL.glRasterPos2i(col, line); Draw.Text("ID properties for script settings:") +- col= 10; line = 285; Draw.Button("Send Script Settings", EXPORT_ID, col, line, 140,18, "Send script settings to the .blend") +- col= 155; Draw.Button("Restore Default Settings", DEFAULT_ID, col, line, 140,18, "Use script defaults") +- col= 300; Draw.Button("Reload ID Settings", IMPORT_ID, col, line, 140,18, "Reload ID properties from .blend") +- col=10; line = 255; BGL.glRasterPos2i(col, line); Draw.Text("Settings needed to render directly from the script:") +- col=155; line = 230; BGL.glRasterPos2i(col, line); Draw.Text("(threads=0 means auto-detect)") +- col=10; line = 225; THREADS=Draw.Number("Threads", 2, col, line, 140, 18, THREADS.val, 0, 8) +- col=10; line = 200; MEM=Draw.Number("Memory (MB)", 2, col, line, 140, 18, MEM.val, 256, 4096) +- col= 10; line = 175; Draw.Button("Save SF Path & Settings", SET_PATH, col, line, 140,18) +- col= 10; line = 150; Draw.Button("Save Java Path", SET_JAVAPATH, col, line, 140,18) +- col=155; line = 155; BGL.glRasterPos2i(col, line); Draw.Text("Set Java path after Sunflow path") +- # Get blenders 'bpydata' directory: +- datadir=Blender.Get("datadir") +- # Check if the config file exists: +- trial=os.path.exists(datadir+'/path2sf.cfg') +- # If config file exists, retrieve existing values: +- if trial == 1: +- # open 'path2sf.cfg' +- f = open(datadir + '/path2sf.cfg', 'r+') +- sfdir = f.readline() +- memory = f.readline() +- threads = f.readline() +- javadir = f.readline() +- col=10; line = 130; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow path: %s" % sfdir) +- col=10; line = 110; BGL.glRasterPos2i(col, line); Draw.Text("Memory: %s MB" % memory) +- col=10; line = 90; BGL.glRasterPos2i(col, line); Draw.Text("Threads: %s" % threads) +- col=10; line = 70; BGL.glRasterPos2i(col, line); Draw.Text("Java path: %s" % javadir) +- f.close() +- # If config file doesn't exist, issue a warning: +- if trial == 0: +- col=10; line = 105; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow is not configured yet - set Memory, Number of Threads and Path to sunflow.jar") ++ global SET_PATH, THREADS, MEM, SET_JAVAPATH ++ col=10; line = 315; BGL.glRasterPos2i(col, line); Draw.Text("ID properties for script settings:") ++ col= 10; line = 285; Draw.Button("Send Script Settings", EXPORT_ID, col, line, 140,18, "Send script settings to the .blend") ++ col= 155; Draw.Button("Restore Default Settings", DEFAULT_ID, col, line, 140,18, "Use script defaults") ++ col= 300; Draw.Button("Reload ID Settings", IMPORT_ID, col, line, 140,18, "Reload ID properties from .blend") ++ col=10; line = 255; BGL.glRasterPos2i(col, line); Draw.Text("Settings needed to render directly from the script:") ++ col=155; line = 230; BGL.glRasterPos2i(col, line); Draw.Text("(threads=0 means auto-detect)") ++ col=10; line = 225; THREADS=Draw.Number("Threads", 2, col, line, 140, 18, THREADS.val, 0, 8) ++ col=10; line = 200; MEM=Draw.Number("Memory (MB)", 2, col, line, 140, 18, MEM.val, 256, 4096) ++ col= 10; line = 175; Draw.Button("Save SF Path & Settings", SET_PATH, col, line, 140,18) ++ col= 10; line = 150; Draw.Button("Save Java Path", SET_JAVAPATH, col, line, 140,18) ++ col=155; line = 155; BGL.glRasterPos2i(col, line); Draw.Text("Set Java path after Sunflow path") ++ # Get blenders 'bpydata' directory: ++ datadir=Blender.Get("datadir") ++ # Check if the config file exists: ++ trial=os.path.exists(datadir+'/path2sf.cfg') ++ # If config file exists, retrieve existing values: ++ if trial == 1: ++ # open 'path2sf.cfg' ++ f = open(datadir + '/path2sf.cfg', 'r+') ++ sfdir = f.readline() ++ memory = f.readline() ++ threads = f.readline() ++ javadir = f.readline() ++ col=10; line = 130; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow path: %s" % sfdir) ++ col=10; line = 110; BGL.glRasterPos2i(col, line); Draw.Text("Memory: %s MB" % memory) ++ col=10; line = 90; BGL.glRasterPos2i(col, line); Draw.Text("Threads: %s" % threads) ++ col=10; line = 70; BGL.glRasterPos2i(col, line); Draw.Text("Java path: %s" % javadir) ++ f.close() ++ # If config file doesn't exist, issue a warning: ++ if trial == 0: ++ col=10; line = 105; BGL.glRasterPos2i(col, line); Draw.Text("Sunflow is not configured yet - set Memory, Number of Threads and Path to sunflow.jar") + +- drawButtons() ++ drawButtons() + + ## Draw caustic and global illumination settings ## + def drawGI(): +- global CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE, PHOTONRADIUS +- global INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES +- global IRRCACHE, IRRSAMPLES, IRRTOLERANCE, IRRSPACEMIN, IRRSPACEMAX +- global gPHOTONNUMBER, gPHOTONESTIMATE, gPHOTONRADIUS, gPHOTONMAP, USEGLOBALS +- global PATHTRACE, PATHSAMPLES +- global VIEWCAUSTICS, VIEWGLOBALS, VIEWGI +- global OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST +- global FAKEAMB, FAMBSKY, FAMBGROUND +- +- # GI/Caustics part # +- col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Caustics and Global Illumination") +- #Caustics# +- col=10; line=300; CAUSTICS=Draw.Toggle("Caustics", EVENT_CAUSTICS, col, line, 85, 18, CAUSTICS.val, "Turn on caustics in the scene") +- col=100; PHOTONNUMBER=Draw.Number("Photons", 2, col, line, 125, 18, PHOTONNUMBER.val, 0, 5000000) +- col=230; PHOTONMAP=Draw.Menu("%tCaustics Photon Map|kd", PHOTON_EVENT, col, line, 60, 18, PHOTONMAP.val) +- col=295; PHOTONESTIMATE=Draw.Number("Photon Estim.", 2, col, line, 125, 18, PHOTONESTIMATE.val, 0, 1000) +- col=425; PHOTONRADIUS=Draw.Number("Photon Radius", 2, col, line, 125, 18, PHOTONRADIUS.val, 0.00, 10.00) +- #Instant GI# +- col=10; line=275; INSTANTGI=Draw.Toggle("Instant GI", FORCE_INSTANTGI, col, line, 85, 18, INSTANTGI.val, "Enable Instant GI for GI in the scene") +- col=100; IGISAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IGISAMPLES.val, 0, 1024) +- col=230; IGISETS=Draw.Number("Number of Sets", 2, col, line, 125, 18, IGISETS.val, 1.0, 100.0) +- col=100; line=250; IGIBIAS=Draw.Number("Bias", 2, col, line, 125, 18, IGIBIAS.val, 0.000, 1.000) +- col=230; IGIBIASSAMPLES=Draw.Number("Bias Samples", 2, col, line, 125, 18, IGIBIASSAMPLES.val, 0, 64) +- #Irradiance Caching# +- col=10; line=225; IRRCACHE=Draw.Toggle("Irr. Cache", FORCE_IRRCACHE, col, line, 85, 18, IRRCACHE.val, "Enable Irradiance Caching for GI in the scene") +- col=100; IRRSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IRRSAMPLES.val, 0, 1024) +- col=230; IRRTOLERANCE=Draw.Number("Tolerance", 2, col, line, 125, 18, IRRTOLERANCE.val, 0.0, 0.10) +- col=100; line=200; IRRSPACEMIN=Draw.Number("Min. Space", 2, col, line, 125, 18, IRRSPACEMIN.val, 0.00, 10.00) +- col=230; IRRSPACEMAX=Draw.Number("Max. Space", 2, col, line, 125, 18, IRRSPACEMAX.val, 0.00, 10.00) +- col=10; line=175; USEGLOBALS=Draw.Toggle("Use Globals", FORCE_GLOBALS, col, line, 85, 18, USEGLOBALS.val, "Use global photons instead of path tracing for Irr. Cache secondary bounces") +- col=100; gPHOTONNUMBER=Draw.Number("Glob. Phot.", 2, col, line, 125, 18, gPHOTONNUMBER.val, 0, 5000000) +- col=230; gPHOTONMAP=Draw.Menu("%tGlobal Photon Map|grid", gPHOTON_EVENT, col, line, 60, 18, gPHOTONMAP.val) +- col=295; gPHOTONESTIMATE=Draw.Number("Global Estim.", 2, col, line, 125, 18, gPHOTONESTIMATE.val, 0, 1000) +- col=425; gPHOTONRADIUS=Draw.Number("Global Radius", 2, col, line, 125, 18, gPHOTONRADIUS.val, 0.00, 10.00) +- #Path Tracing# +- col=10; line=150; PATHTRACE=Draw.Toggle("Path Tracing", FORCE_PATHTRACE, col, line, 85, 18, PATHTRACE.val, "Enable Path Tracing for GI in the scene") +- col=100; PATHSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, PATHSAMPLES.val, 0, 1024) +- #AO# +- col=10; line=125; OCCLUSION=Draw.Toggle("Amb Occ", FORCE_OCCLUSION, col, line, 85, 18, OCCLUSION.val, "Turn on ambient occlusion for the whole scene") +- col=100; OCCBRIGHT=Draw.ColorPicker(2, 100, 125, 30, 18, OCCBRIGHT.val, "Ambient Occlusion bright color") +- col=135; OCCDARK=Draw.ColorPicker(2, 135, 125, 30, 18, OCCDARK.val, "Ambient Occlusion dark color") +- col=170; OCCSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, OCCSAMPLES.val, 0, 256) +- col=300; OCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, OCCDIST.val, -1.0, 150.0) +- #Fake Ambient Term# +- col=10; line=100; FAKEAMB=Draw.Toggle("Fake Amb", FORCE_FAKEAMB, col, line, 85, 18, FAKEAMB.val, "Turn on Fake Ambient Term for the scene") +- col=100; FAMBSKY=Draw.ColorPicker(2, 100, 100, 30, 18, FAMBSKY.val, "Fake Ambient Term sky color") +- col=135; FAMBGROUND=Draw.ColorPicker(2, 135, 100, 30, 18, FAMBGROUND.val, "Fake Ambient Term ground color") +- #Overrides# +- col=100; line=75; VIEWCAUSTICS=Draw.Toggle("Just Caustics", OVERRIDE_CAUSTICS, col, line, 85, 18, VIEWCAUSTICS.val, "Render only the caustic photons in the scene (Caustics must be on)") +- col=190; VIEWGLOBALS=Draw.Toggle("Just Globals", OVERRIDE_GLOBALS, col, line, 85, 18, VIEWGLOBALS.val, "Render only the global photons in the scene (Use Globals must be on)") +- col=280; VIEWGI=Draw.Toggle("Just GI", OVERRIDE_GI, col, line, 85, 18, VIEWGI.val, "Render only the gi components in the scene (A GI engine must be selected)") +- drawButtons() ++ global CAUSTICS, PHOTONNUMBER, PHOTONMAP, PHOTONESTIMATE, PHOTONRADIUS ++ global INSTANTGI, IGISAMPLES, IGISETS, IGIBIAS, IGIBIASSAMPLES ++ global IRRCACHE, IRRSAMPLES, IRRTOLERANCE, IRRSPACEMIN, IRRSPACEMAX ++ global gPHOTONNUMBER, gPHOTONESTIMATE, gPHOTONRADIUS, gPHOTONMAP, USEGLOBALS ++ global PATHTRACE, PATHSAMPLES ++ global VIEWCAUSTICS, VIEWGLOBALS, VIEWGI ++ global OCCLUSION, OCCBRIGHT, OCCDARK, OCCSAMPLES, OCCDIST ++ global FAKEAMB, FAMBSKY, FAMBGROUND ++ ++ # GI/Caustics part # ++ col=10; line=325; BGL.glRasterPos2i(col, line); Draw.Text("Caustics and Global Illumination") ++ #Caustics# ++ col=10; line=300; CAUSTICS=Draw.Toggle("Caustics", EVENT_CAUSTICS, col, line, 85, 18, CAUSTICS.val, "Turn on caustics in the scene") ++ col=100; PHOTONNUMBER=Draw.Number("Photons", 2, col, line, 125, 18, PHOTONNUMBER.val, 0, 5000000) ++ col=230; PHOTONMAP=Draw.Menu("%tCaustics Photon Map|kd", PHOTON_EVENT, col, line, 60, 18, PHOTONMAP.val) ++ col=295; PHOTONESTIMATE=Draw.Number("Photon Estim.", 2, col, line, 125, 18, PHOTONESTIMATE.val, 0, 1000) ++ col=425; PHOTONRADIUS=Draw.Number("Photon Radius", 2, col, line, 125, 18, PHOTONRADIUS.val, 0.00, 10.00) ++ #Instant GI# ++ col=10; line=275; INSTANTGI=Draw.Toggle("Instant GI", FORCE_INSTANTGI, col, line, 85, 18, INSTANTGI.val, "Enable Instant GI for GI in the scene") ++ col=100; IGISAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IGISAMPLES.val, 0, 1024) ++ col=230; IGISETS=Draw.Number("Number of Sets", 2, col, line, 125, 18, IGISETS.val, 1.0, 100.0) ++ col=100; line=250; IGIBIAS=Draw.Number("Bias", 2, col, line, 125, 18, IGIBIAS.val, 0.000, 1.000) ++ col=230; IGIBIASSAMPLES=Draw.Number("Bias Samples", 2, col, line, 125, 18, IGIBIASSAMPLES.val, 0, 64) ++ #Irradiance Caching# ++ col=10; line=225; IRRCACHE=Draw.Toggle("Irr. Cache", FORCE_IRRCACHE, col, line, 85, 18, IRRCACHE.val, "Enable Irradiance Caching for GI in the scene") ++ col=100; IRRSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, IRRSAMPLES.val, 0, 1024) ++ col=230; IRRTOLERANCE=Draw.Number("Tolerance", 2, col, line, 125, 18, IRRTOLERANCE.val, 0.0, 0.10) ++ col=100; line=200; IRRSPACEMIN=Draw.Number("Min. Space", 2, col, line, 125, 18, IRRSPACEMIN.val, 0.00, 10.00) ++ col=230; IRRSPACEMAX=Draw.Number("Max. Space", 2, col, line, 125, 18, IRRSPACEMAX.val, 0.00, 10.00) ++ col=10; line=175; USEGLOBALS=Draw.Toggle("Use Globals", FORCE_GLOBALS, col, line, 85, 18, USEGLOBALS.val, "Use global photons instead of path tracing for Irr. Cache secondary bounces") ++ col=100; gPHOTONNUMBER=Draw.Number("Glob. Phot.", 2, col, line, 125, 18, gPHOTONNUMBER.val, 0, 5000000) ++ col=230; gPHOTONMAP=Draw.Menu("%tGlobal Photon Map|grid", gPHOTON_EVENT, col, line, 60, 18, gPHOTONMAP.val) ++ col=295; gPHOTONESTIMATE=Draw.Number("Global Estim.", 2, col, line, 125, 18, gPHOTONESTIMATE.val, 0, 1000) ++ col=425; gPHOTONRADIUS=Draw.Number("Global Radius", 2, col, line, 125, 18, gPHOTONRADIUS.val, 0.00, 10.00) ++ #Path Tracing# ++ col=10; line=150; PATHTRACE=Draw.Toggle("Path Tracing", FORCE_PATHTRACE, col, line, 85, 18, PATHTRACE.val, "Enable Path Tracing for GI in the scene") ++ col=100; PATHSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, PATHSAMPLES.val, 0, 1024) ++ #AO# ++ col=10; line=125; OCCLUSION=Draw.Toggle("Amb Occ", FORCE_OCCLUSION, col, line, 85, 18, OCCLUSION.val, "Turn on ambient occlusion for the whole scene") ++ col=100; OCCBRIGHT=Draw.ColorPicker(2, 100, 125, 30, 18, OCCBRIGHT.val, "Ambient Occlusion bright color") ++ col=135; OCCDARK=Draw.ColorPicker(2, 135, 125, 30, 18, OCCDARK.val, "Ambient Occlusion dark color") ++ col=170; OCCSAMPLES=Draw.Number("Samples", 2, col, line, 125, 18, OCCSAMPLES.val, 0, 256) ++ col=300; OCCDIST=Draw.Number("Distance", 2, col, line, 125, 18, OCCDIST.val, -1.0, 150.0) ++ #Fake Ambient Term# ++ col=10; line=100; FAKEAMB=Draw.Toggle("Fake Amb", FORCE_FAKEAMB, col, line, 85, 18, FAKEAMB.val, "Turn on Fake Ambient Term for the scene") ++ col=100; FAMBSKY=Draw.ColorPicker(2, 100, 100, 30, 18, FAMBSKY.val, "Fake Ambient Term sky color") ++ col=135; FAMBGROUND=Draw.ColorPicker(2, 135, 100, 30, 18, FAMBGROUND.val, "Fake Ambient Term ground color") ++ #Overrides# ++ col=100; line=75; VIEWCAUSTICS=Draw.Toggle("Just Caustics", OVERRIDE_CAUSTICS, col, line, 85, 18, VIEWCAUSTICS.val, "Render only the caustic photons in the scene (Caustics must be on)") ++ col=190; VIEWGLOBALS=Draw.Toggle("Just Globals", OVERRIDE_GLOBALS, col, line, 85, 18, VIEWGLOBALS.val, "Render only the global photons in the scene (Use Globals must be on)") ++ col=280; VIEWGI=Draw.Toggle("Just GI", OVERRIDE_GI, col, line, 85, 18, VIEWGI.val, "Render only the gi components in the scene (A GI engine must be selected)") ++ drawButtons() + + ## Draw the bottom bar of buttons in the interface ## + def drawButtons(): +- Draw.Button("Configure SF", CHANGE_CFG, 20, 10, 90, 50) +- Draw.Button("AA", CHANGE_AA, 115 , 40, 90, 20) +- Draw.Button("Camera", CHANGE_CAM, 210, 40, 90, 20) +- Draw.Button("Light", CHANGE_LIGHT, 305, 40, 90, 20) +- Draw.Button("Caustics/GI", CHANGE_GI, 115, 10, 90, 20) +- Draw.Button("Shader Info", CHANGE_SHAD, 210, 10, 90, 20) +- Draw.Button("Background", CHANGE_BCKGRD,305, 10, 90, 20) +- Draw.Button("Render settings", CHANGE_EXP, 400, 10, 90, 50) ++ Draw.Button("Configure SF", CHANGE_CFG, 20, 10, 90, 50) ++ Draw.Button("AA", CHANGE_AA, 115 , 40, 90, 20) ++ Draw.Button("Camera", CHANGE_CAM, 210, 40, 90, 20) ++ Draw.Button("Light", CHANGE_LIGHT, 305, 40, 90, 20) ++ Draw.Button("Caustics/GI", CHANGE_GI, 115, 10, 90, 20) ++ Draw.Button("Shader Info", CHANGE_SHAD, 210, 10, 90, 20) ++ Draw.Button("Background", CHANGE_BCKGRD,305, 10, 90, 20) ++ Draw.Button("Render settings", CHANGE_EXP, 400, 10, 90, 50) + + ####### Script Startup Section ####### + ###################################### +@@ -2414,4 +2414,3 @@ + SCREEN=7 + auto_import() + Draw.Register(drawGUI, event, buttonEvent) +- diff -Nru sunflow-0.07.2.svn396+dfsg/debian/patches/series sunflow-0.07.2.svn396+dfsg/debian/patches/series --- sunflow-0.07.2.svn396+dfsg/debian/patches/series 2018-07-03 15:01:58.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/patches/series 2019-09-03 16:25:01.000000000 +0000 @@ -1,3 +1,5 @@ 10_to_use_system_janino 20_split 30_sweethome3d +40_python3 +50_python_consistent_indentation diff -Nru sunflow-0.07.2.svn396+dfsg/debian/rules sunflow-0.07.2.svn396+dfsg/debian/rules --- sunflow-0.07.2.svn396+dfsg/debian/rules 2018-07-03 15:01:58.000000000 +0000 +++ sunflow-0.07.2.svn396+dfsg/debian/rules 2019-09-03 16:25:01.000000000 +0000 @@ -1,22 +1,21 @@ #!/usr/bin/make -f -include /usr/share/cdbs/1/rules/debhelper.mk -include /usr/share/cdbs/1/class/ant.mk - -NAME := sunflow -VERSION := $(shell dpkg-parsechangelog| sed -n '/^Version/{s/Version: \(.*\)-[0-9]*$$/\1/;s/+dfsg//p}') -SVNREV := $(shell echo $(VERSION)|sed -n 's/.*svn\([0-9]*\)/\1/p') -TMPDIR := $(NAME)-$(VERSION) -TAR := ../$(NAME)_$(VERSION)+dfsg.orig.tar.gz +include /usr/share/dpkg/pkg-info.mk +UPSTREAM_VERSION = $(shell echo $(DEB_VERSION_UPSTREAM) | sed -e 's/.dfsg$$//') JAVA_HOME := /usr/lib/jvm/default-java -DEB_JARS := janino -DEB_ANT_BUILD_TARGET = jars javadoc +%: + dh $@ --buildsystem=ant -UPSTREAM_VERSION = $(shell echo $(DEB_UPSTREAM_VERSION) | sed -e 's/.dfsg$$//') +override_dh_auto_build: + dh_auto_build + pod2man --center='SUNFLOW DOCUMENTATION' \ + --release=$(UPSTREAM_VERSION) \ + debian/sunflow.pod -o debian/sunflow.1 -install/libsunflow-java:: +override_dh_auto_install: + #install/libsunflow-java:: # If case to avoid build failure when resuming the build # at the install step if [ ! -f release/sunflow-$(UPSTREAM_VERSION).jar ] ; then \ @@ -26,7 +25,7 @@ dh_link -plibsunflow-java usr/share/java/sunflow-$(UPSTREAM_VERSION).jar \ usr/share/java/sunflow.jar -install/sunflow:: + #install/sunflow:: # If case to avoid build failure when resuming the build # at the install step if [ ! -f release/sunflowGUI-$(UPSTREAM_VERSION).jar ] ; then \ @@ -57,27 +56,8 @@ debian/sunflow/usr/share/icons/hicolor/scalable/apps # Not using python-distutils.mk, calling manually - dh_python2 /usr/share/blender/scripts/sunflow + dh_python3 /usr/share/blender/scripts/sunflow -install/libsunflow-java-doc:: # Javadoc mv release/javadoc release/api dh_installdocs -plibsunflow-java-doc release/api - -build/sunflow:: - pod2man --center='SUNFLOW DOCUMENTATION' \ - --release=$(UPSTREAM_VERSION) \ - debian/sunflow.pod -o debian/sunflow.1 - -clean:: - rm -f debian/sunflow.1 - -get-orig-source: - mkdir $(TMPDIR) - -rm $(TAR) - svn export --force -r $(SVNREV) https://$(NAME).svn.sourceforge.net/svnroot/$(NAME)/trunk $(TMPDIR) - echo "The following files will not be included in Debian tarball:" - cd $(TMPDIR) && find . \( -name '*.class' -o -name '*.jar' \) -print - ZIP=--best tar --exclude-vcs --exclude *.jar --exclude *.class -zcf $(TAR) $(TMPDIR) - rm -rf $(TMPDIR) -