Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-06-01 16:10:30 +0400
committerTon Roosendaal <ton@blender.org>2009-06-01 16:10:30 +0400
commit7c4fccd6847fe2743708f9b8b54d0e62193d7244 (patch)
tree2412c5dc712c9e982aefe88d116fb7104c52c5c9 /source/blender
parent0e02fef8b498a7a2905dc8b341f6bebfc3a1e167 (diff)
2.5
Cleanup commit: - Yafray removed. Also did cmake/scons files, but didn't compile with it, so test would be appreciated :) - Removed old crap from Windows release dir, should be checked on further by windows release builder later.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/CMakeLists.txt4
-rw-r--r--source/blender/Makefile2
-rw-r--r--source/blender/SConscript3
-rw-r--r--source/blender/render/CMakeLists.txt7
-rw-r--r--source/blender/render/SConscript5
-rw-r--r--source/blender/render/intern/source/Makefile1
-rw-r--r--source/blender/render/intern/source/convertblender.c28
-rw-r--r--source/blender/render/intern/source/pipeline.c76
-rw-r--r--source/blender/yafray/CMakeLists.txt35
-rw-r--r--source/blender/yafray/Makefile31
-rw-r--r--source/blender/yafray/SConscript9
-rw-r--r--source/blender/yafray/YafRay_Api.h15
-rw-r--r--source/blender/yafray/intern/Makefile43
-rw-r--r--source/blender/yafray/intern/api.cpp14
-rw-r--r--source/blender/yafray/intern/export_File.cpp2060
-rw-r--r--source/blender/yafray/intern/export_File.h34
-rw-r--r--source/blender/yafray/intern/export_Plugin.cpp1990
-rw-r--r--source/blender/yafray/intern/export_Plugin.h78
-rw-r--r--source/blender/yafray/intern/yafexternal.cpp155
-rw-r--r--source/blender/yafray/intern/yafexternal.h186
-rw-r--r--source/blender/yafray/intern/yafray_Render.cpp239
-rw-r--r--source/blender/yafray/intern/yafray_Render.h110
22 files changed, 2 insertions, 5123 deletions
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index 9ec9efa6a8d..344d51db248 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -41,7 +41,3 @@ ENDIF(WITH_QUICKTIME)
IF(WITH_PYTHON)
SUBDIRS(python)
ENDIF(WITH_PYTHON)
-
-IF(WITH_YAFRAY)
- SUBDIRS(yafray)
-ENDIF(WITH_YAFRAY)
diff --git a/source/blender/Makefile b/source/blender/Makefile
index b8809c87213..64eb1a2614b 100644
--- a/source/blender/Makefile
+++ b/source/blender/Makefile
@@ -32,7 +32,7 @@ include nan_definitions.mk
DIRS = windowmanager editors blenloader readblenfile
DIRS += avi imbuf render radiosity blenlib blenkernel blenpluginapi
-DIRS += makesdna makesrna yafray
+DIRS += makesdna makesrna
DIRS += python nodes gpu
DIRS += blenfont
diff --git a/source/blender/SConscript b/source/blender/SConscript
index f8b7fd358fe..691fbf9b494 100644
--- a/source/blender/SConscript
+++ b/source/blender/SConscript
@@ -25,9 +25,6 @@ SConscript(['avi/SConscript',
if env['WITH_BF_PYTHON']:
SConscript(['python/SConscript'])
-if env['WITH_BF_YAFRAY']:
- SConscript(['yafray/SConscript'])
-
if env['WITH_BF_DDS']:
SConscript (['imbuf/intern/dds/SConscript'])
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 5465600d22b..8ba7dc123e7 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -29,14 +29,9 @@ FILE(GLOB SRC intern/source/*.c)
SET(INC
intern/include ../../../intern/guardedalloc ../blenlib ../makesdna
extern/include ../blenkernel ../radiosity/extern/include ../imbuf
- ../quicktime ../include ../../kernel/gen_messaging ../yafray ../blenloader
+ ../quicktime ../include ../../kernel/gen_messaging ../blenloader
)
-IF(NOT WITH_YAFRAY)
- ADD_DEFINITIONS(-DDISABLE_YAFRAY)
-ENDIF(NOT WITH_YAFRAY)
-
-
IF(WITH_OPENEXR)
ADD_DEFINITIONS(-DWITH_OPENEXR)
ENDIF(WITH_OPENEXR)
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index c3fdc632ce4..173f5db8482 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -10,11 +10,6 @@ incs += ' ../include ../blenloader'
defs = []
-if env['WITH_BF_YAFRAY']:
- incs += ' ../yafray'
-else:
- defs.append('DISABLE_YAFRAY')
-
if env['WITH_BF_QUICKTIME']:
defs.append('WITH_QUICKTIME')
incs += ' ../quicktime ' + env['BF_QUICKTIME_INC']
diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile
index eb12c7637f7..22680b26338 100644
--- a/source/blender/render/intern/source/Makefile
+++ b/source/blender/render/intern/source/Makefile
@@ -45,7 +45,6 @@ CPPFLAGS += -I../../../imbuf
CPPFLAGS += -I../../../makesdna
CPPFLAGS += -I../../../blenkernel
CPPFLAGS += -I../../../quicktime
-CPPFLAGS += -I../../../yafray
CPPFLAGS += -I../../../../kernel/gen_messaging
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
# not very neat: the rest of blender..
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 4ca7244e976..6bc88f7499b 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -114,18 +114,6 @@
#include "zbuf.h"
#include "sunsky.h"
-#ifndef DISABLE_YAFRAY /* disable yafray */
-
-#include "YafRay_Api.h"
-
-/* yafray: Identity transform 'hack' removed, exporter now transforms vertices back to world.
- * Same is true for lamp coords & vec.
- * Duplicated data objects & dupliframe/duplivert objects are only stored once,
- * only the matrix is stored for all others, in yafray these objects are instances of the original.
- * The main changes are in RE_Database_FromScene().
- */
-
-#endif /* disable yafray */
/* 10 times larger than normal epsilon, test it on default nurbs sphere with ray_transp (for quad detection) */
/* or for checking vertex normal flips */
@@ -3468,22 +3456,6 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
}
else lar->ray_totsamp= 0;
-#ifndef DISABLE_YAFRAY
- /* yafray: photonlight and other params */
- if (re->r.renderer==R_YAFRAY) {
- lar->YF_numphotons = la->YF_numphotons;
- lar->YF_numsearch = la->YF_numsearch;
- lar->YF_phdepth = la->YF_phdepth;
- lar->YF_useqmc = la->YF_useqmc;
- lar->YF_causticblur = la->YF_causticblur;
- lar->YF_ltradius = la->YF_ltradius;
- lar->YF_bufsize = la->YF_bufsize;
- lar->YF_glowint = la->YF_glowint;
- lar->YF_glowofs = la->YF_glowofs;
- lar->YF_glowtype = la->YF_glowtype;
- }
-#endif /* disable yafray */
-
lar->spotsi= la->spotsize;
if(lar->mode & LA_HALO) {
if(lar->spotsi>170.0) lar->spotsi= 170.0;
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index cc2cf290795..2d6e03f95c2 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -63,12 +63,6 @@
#include "RE_pipeline.h"
#include "radio.h"
-#ifndef DISABLE_YAFRAY
-/* yafray: include for yafray export/render */
-#include "YafRay_Api.h"
-
-#endif /* disable yafray */
-
/* internal */
#include "render_types.h"
#include "renderpipeline.h"
@@ -2209,69 +2203,6 @@ static void do_render_composite_fields_blur_3d(Render *re)
re->display_draw(re->ddh, re->result, NULL);
}
-#ifndef DISABLE_YAFRAY
-/* yafray: main yafray render/export call */
-static void yafrayRender(Render *re)
-{
- RE_FreeRenderResult(re->result);
- re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
-
- // need this too, for aspect/ortho/etc info
- RE_SetCamera(re, re->scene->camera);
-
- // switch must be done before prepareScene()
- if (!re->r.YFexportxml)
- YAF_switchFile();
- else
- YAF_switchPlugin();
-
- printf("Starting scene conversion.\n");
- RE_Database_FromScene(re, re->scene, 1);
- printf("Scene conversion done.\n");
-
- re->i.starttime = PIL_check_seconds_timer();
-
- YAF_exportScene(re);
-
- /* also needed for yafray border render, straight copy from do_render_fields_blur_3d() */
- /* when border render, check if we have to insert it in black */
- if(re->result) {
- if(re->r.mode & R_BORDER) {
- if((re->r.mode & R_CROP)==0) {
- RenderResult *rres;
-
- /* sub-rect for merge call later on */
- re->result->tilerect= re->disprect;
-
- /* this copying sequence could become function? */
- re->disprect.xmin= re->disprect.ymin= 0;
- re->disprect.xmax= re->winx;
- re->disprect.ymax= re->winy;
- re->rectx= re->winx;
- re->recty= re->winy;
-
- rres= new_render_result(re, &re->disprect, 0, RR_USEMEM);
-
- merge_render_result(rres, re->result);
- RE_FreeRenderResult(re->result);
- re->result= rres;
-
- re->display_init(re->dih, re->result);
- re->display_draw(re->ddh, re->result, NULL);
- }
- }
- }
-
- re->i.lastframetime = PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(re->sdh, &re->i);
-
- RE_Database_Free(re);
-}
-
-
-
-#endif /* disable yafray */
-
static void renderresult_stampinfo(Scene *scene)
{
RenderResult rres;
@@ -2300,14 +2231,7 @@ static void do_render_all_options(Render *re)
}
else {
-#ifndef DISABLE_YAFRAY
- if(re->r.renderer==R_YAFRAY)
- yafrayRender(re);
- else
- do_render_composite_fields_blur_3d(re);
-#else
do_render_composite_fields_blur_3d(re);
-#endif
}
/* for UI only */
diff --git a/source/blender/yafray/CMakeLists.txt b/source/blender/yafray/CMakeLists.txt
deleted file mode 100644
index 897b7754166..00000000000
--- a/source/blender/yafray/CMakeLists.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-# $Id$
-# ***** 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.
-#
-# The Original Code is Copyright (C) 2006, Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Jacques Beaurain.
-#
-# ***** END GPL LICENSE BLOCK *****
-
-FILE(GLOB SRC intern/*.cpp)
-
-SET(INC
- ../../../intern/guardedalloc ../blenlib ../makesdna ../blenkernel
- ../imbuf ../include ../render/extern/include ../render/intern/include
-)
-
-BLENDERLIB(bf_yafray "${SRC}" "${INC}")
-#env.BlenderLib ( 'bf_yafray', sources, Split(incs), [], libtype=['blender','player'], priority=[5, 190] )
diff --git a/source/blender/yafray/Makefile b/source/blender/yafray/Makefile
deleted file mode 100644
index 690ba441bf0..00000000000
--- a/source/blender/yafray/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/yafray
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/yafray/SConscript b/source/blender/yafray/SConscript
deleted file mode 100644
index 13af7732c94..00000000000
--- a/source/blender/yafray/SConscript
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/python
-Import ('env')
-
-sources = env.Glob('intern/*.cpp')
-
-incs = '#/intern/guardedalloc ../blenlib ../makesdna ../blenkernel'
-incs += ' ../imbuf ../editors/include ../render/extern/include ../render/intern/include'
-
-env.BlenderLib ( 'bf_yafray', sources, Split(incs), [], libtype=['core'], priority=[205] )
diff --git a/source/blender/yafray/YafRay_Api.h b/source/blender/yafray/YafRay_Api.h
deleted file mode 100644
index a05e9752a1a..00000000000
--- a/source/blender/yafray/YafRay_Api.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef __YAFRAY_API_H
-#define __YAFRAY_API_H
-
-/* C interface for Blender */
-#ifdef __cplusplus
-extern "C" {
-#endif
- void YAF_switchPlugin();
- void YAF_switchFile();
- int YAF_exportScene(Render* re);
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/source/blender/yafray/intern/Makefile b/source/blender/yafray/intern/Makefile
deleted file mode 100644
index cf4779c2f96..00000000000
--- a/source/blender/yafray/intern/Makefile
+++ /dev/null
@@ -1,43 +0,0 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = yafrayexport
-DIR = $(OCGDIR)/blender/yafray
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../render/intern/include
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../include
-CPPFLAGS += -I..
diff --git a/source/blender/yafray/intern/api.cpp b/source/blender/yafray/intern/api.cpp
deleted file mode 100644
index 0cb1c6fafdf..00000000000
--- a/source/blender/yafray/intern/api.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "export_File.h"
-#include "export_Plugin.h"
-
-static yafrayFileRender_t byfile;
-static yafrayPluginRender_t byplugin;
-
-yafrayRender_t *YAFBLEND = &byplugin;
-
-extern "C"
-{
- void YAF_switchPlugin() { YAFBLEND = &byplugin; }
- void YAF_switchFile() { YAFBLEND = &byfile; }
- int YAF_exportScene(Render* re) { return (int)YAFBLEND->exportScene(re); }
-}
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
deleted file mode 100644
index 831c1e93307..00000000000
--- a/source/blender/yafray/intern/export_File.cpp
+++ /dev/null
@@ -1,2060 +0,0 @@
-#include "export_File.h"
-
-#include <math.h>
-
-#include <cstring>
-
-using namespace std;
-
-static string command_path = "";
-
-#ifdef WIN32
-#define WIN32_SKIP_HKEY_PROTECTION
-#include "BLI_winstuff.h"
-
-#ifndef FILE_MAXDIR
-#define FILE_MAXDIR 160
-#endif
-
-#ifndef FILE_MAXFILE
-#define FILE_MAXFILE 80
-#endif
-
-
-static string find_path()
-{
- HKEY hkey;
- DWORD dwType, dwSize;
-
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\YafRay Team\\YafRay",0,KEY_READ,&hkey)==ERROR_SUCCESS)
- {
- dwType = REG_EXPAND_SZ;
- dwSize = MAX_PATH;
- DWORD dwStat;
-
- char *pInstallDir=new char[MAX_PATH];
-
- dwStat=RegQueryValueEx(hkey, TEXT("InstallDir"),
- NULL, NULL,(LPBYTE)pInstallDir, &dwSize);
-
- if (dwStat == NO_ERROR)
- {
- string res=pInstallDir;
- delete [] pInstallDir;
- return res;
- }
- else
- cout << "Couldn't READ \'InstallDir\' value. Is yafray correctly installed?\n";
- delete [] pInstallDir;
-
- RegCloseKey(hkey);
- }
- else
- cout << "Couldn't FIND registry key for yafray, is it installed?\n";
-
- return string("");
-
-}
-
-static int createDir(char* name)
-{
- if (BLI_exists(name))
- return 2; //exists
- if (CreateDirectory((LPCTSTR)(name), NULL)) {
- cout << "Directory: " << name << " created\n";
- return 1; // created
- }
- else {
- cout << "Could not create directory: " << name << endl;
- return 0; // fail
- }
-}
-
-extern "C" { extern char bprogname[]; }
-
-// add drive character if not in path string, using blender executable location as reference
-// later added note: doesn't make much sense actually,
-// the intended file might not be located on the same drive as where blender is located...
-static void addDrive(string &path)
-{
- int sp = path.find_first_of(":");
- if (sp==-1) {
- string blpath = bprogname;
- sp = blpath.find_first_of(":");
- if (sp!=-1) path = blpath.substr(0, sp+1) + path;
- }
-}
-
-#else
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-static string unixYafrayPath()
-{
- static const char *alternative[]=
- {
- "/usr/local/bin/",
- "/usr/bin/",
- "/bin/",
- NULL
- };
-
- for(int i=0;alternative[i]!=NULL;++i)
- {
- string fp=string(alternative[i])+"yafray";
- struct stat st;
- if(stat(fp.c_str(),&st)<0) continue;
- if(st.st_mode&S_IXOTH) return alternative[i];
- }
- return "";
-}
-
-#endif
-
-#ifdef WIN32
-#define MAXPATHLEN MAX_PATH
-#else
-#include <sys/param.h>
-#endif
-static void adjustPath(string &path)
-{
- // if relative, expand to full path
- char cpath[MAXPATHLEN];
- strcpy(cpath, path.c_str());
- BLI_convertstringcode(cpath, G.sce);
- path = cpath;
-#ifdef WIN32
- // add drive char if not there
- addDrive(path);
-#endif
-}
-
-bool yafrayFileRender_t::initExport()
-{
- xmlpath = "";
- bool dir_failed = false;
- // try the user setting setting first, export dir must be set and exist
- if (strlen(U.yfexportdir)==0)
- {
- cout << "No export directory set in user defaults!" << endl;
- char* temp = getenv("TEMP");
- // if no envar, use /tmp
- xmlpath = temp ? temp : "/tmp";
- cout << "Will try TEMP instead: " << xmlpath << endl;
- // no fail here, but might fail when opening file...
- }
- else
- {
- xmlpath = U.yfexportdir;
- adjustPath(xmlpath); // possibly relative
- cout << "YFexport path is: " << xmlpath << endl;
- // check if it exists
- if (!BLI_exists(const_cast<char*>(xmlpath.c_str()))) {
- cout << "YafRay temporary xml export directory:\n" << U.yfexportdir << "\ndoes not exist!\n";
-#ifdef WIN32
- // try to create it
- cout << "Trying to create...\n";
- if (createDir(const_cast<char*>(xmlpath.c_str()))==0) dir_failed=true; else dir_failed=false;
-#else
- dir_failed = true;
-#endif
- }
- }
-
-#ifdef WIN32
- // for windows try to get the path to the yafray binary from the registry, only done once
- if (command_path=="")
- {
- char path[FILE_MAXDIR+FILE_MAXFILE];
- string yafray_path = find_path();
- if (yafray_path=="")
- {
- // error already printed in find_path()
- clearAll();
- return false;
- }
- GetShortPathName((LPCTSTR)(yafray_path.c_str()), path, FILE_MAXDIR+FILE_MAXFILE);
- command_path = string(path) + "\\";
- cout << "Yafray found at : " << command_path << endl;
- }
- // if no export dir set, or could not create, try to create one in the yafray dir, unless it already exists
- if (dir_failed)
- {
- string ybdir = command_path + "YBtest";
- if (createDir(const_cast<char*>(ybdir.c_str()))==0) dir_failed=true; else dir_failed=false;
- xmlpath = ybdir;
- }
-#else
- if (command_path=="")
- {
- command_path = unixYafrayPath();
- if (command_path.size()) cout << "Yafray found at : " << command_path << endl;
- }
-#endif
-
- // for all
- if (dir_failed) return false;
-
-#ifdef WIN32
- string DLM = "\\";
-#else
- string DLM = "/";
-#endif
- // remove trailing slash if needed
- if (xmlpath.find_last_of(DLM)!=(xmlpath.length()-1)) xmlpath += DLM;
-
- imgout = xmlpath + "YBtest.tga";
- xmlpath += "YBtest.xml";
- xmlfile.open(xmlpath.c_str());
- if (xmlfile.fail())
- {
- cout << "Could not open file\n";
- return false;
- }
- ostr << setiosflags(ios::showpoint | ios::fixed);
- xmlfile << "<scene>\n\n";
- return true;
-}
-
-bool yafrayFileRender_t::writeRender()
-{
- // finally export render block
- ostr.str("");
- ostr << "<render camera_name=\"MAINCAM\"\n";
- ostr << "\traydepth=\"" << re->r.YF_raydepth << "\" gamma=\"" << re->r.YF_gamma << "\" exposure=\"" << re->r.YF_exposure << "\"\n";
-
- if(re->r.YF_AA) {
- ostr << "\tAA_passes=\"" << re->r.YF_AApasses << "\" AA_minsamples=\"" << re->r.YF_AAsamples << "\"\n";
- ostr << "\tAA_pixelwidth=\"" << re->r.YF_AApixelsize << "\" AA_threshold=\"" << re->r.YF_AAthreshold << "\"\n";
- }
- else {
- // removed the default AA settings for midquality GI, better leave it to user
- if ((re->r.mode & R_OSA) && (re->r.osa)) {
- int passes = (re->r.osa & 3)==0 ? (re->r.osa >> 2) : 1;
- int minsamples=(re->r.osa & 3)==0 ? 4 : re->r.osa;
- ostr << "\tAA_passes=\"" << passes << "\" AA_minsamples=\"" << minsamples << "\"\n";
- }
- else ostr << "\tAA_passes=\"0\" AA_minsamples=\"1\"\n";
- ostr << "\tAA_pixelwidth=\"1.5\" AA_threshold=\"0.05\" bias=\"" << re->r.YF_raybias
- << "\" clamp_rgb=\"" << ((re->r.YF_clamprgb==0) ? "on" : "off") << "\"\n";
- }
-
- World *world = re->scene->world;
- if (world) ostr << "\tbackground_name=\"world_background\"\n";
-
- // alpha channel render when RGBA button enabled
- if (re->r.planes==R_PLANES32) ostr << "\n\tsave_alpha=\"on\"";
- ostr << " >\n";
-
- // basic fog
- if (world && (world->mode & WO_MIST)) {
- float fd = world->mistdist;
- if (fd>0) fd=1.f/fd; else fd=1;
- ostr << "\t<fog_density value=\"" << fd << "\" />\n";
- ostr << "\t<fog_color r=\"" << world->horr << "\" g=\"" << world->horg << "\" b=\"" << world->horb << "\" />\n";
- }
- ostr << "\t<outfile value=\"" << imgout << "\" />\n";
-
- ostr << "</render>\n\n";
- xmlfile << ostr.str();
- return true;
-}
-
-bool yafrayFileRender_t::finishExport()
-{
- xmlfile << "</scene>\n";
- xmlfile.close();
-
- // file exported, now render
- if (executeYafray(xmlpath))
- displayImage();
- else
- {
- cout << "Could not execute yafray. Is it in path?" << endl;
- return false;
- }
- return true;
-}
-
-// displays the image rendered with xml export
-// Now loads rendered image into blender renderbuf.
-void yafrayFileRender_t::displayImage()
-{
- // although it is possible to load the image using blender,
- // maybe it is best to just do a read here, for now the yafray output is always a raw tga anyway
-
- FILE* fp = fopen(imgout.c_str(), "rb");
- if (fp==NULL) {
- cout << "YAF_displayImage(): Could not open image file\n";
- return;
- }
-
- unsigned char header[18];
- fread(&header, 1, 18, fp);
- unsigned short width = (unsigned short)(header[12] + (header[13]<<8));
- unsigned short height = (unsigned short)(header[14] + (header[15]<<8));
- // don't do anything if resolution doesn't match that of rectot
- if ((width!=re->winx) || (height!=re->winy)) {
- cout << "Wrong image width/height: " << width << "/" << height <<
- " expected " << re->winx << "/" << re->winy << endl;
- fclose(fp);
- fp = NULL;
- return;
- }
- unsigned char byte_per_pix = (unsigned char)(header[16]>>3);
- // read past any id (none in this case though)
- unsigned int idlen = (unsigned int)header[0];
- if (idlen) fseek(fp, idlen, SEEK_CUR);
-
- /* XXX how to get the image from Blender and write to it. This call doesn't allow to change buffer rects */
- RenderResult rres;
- RE_GetResultImage(re, &rres);
- // rres.rectx, rres.recty is width/height
- // rres.rectf is float buffer, scanlines starting in bottom
- // rres.rectz is zbuffer, available when associated pass is set
-
- // read data directly into buffer, picture is upside down
- const float btf = 1.f/255.f;
- if (re->r.mode & R_BORDER) {
- // border render, yafray is full size render, blender at this point only wants the region
- unsigned int xs = (unsigned int)(re->r.border.xmin * re->winx),
- ys = (unsigned int)((1.f-re->r.border.ymax) * re->winy);
- for (unsigned short y=0; y<height; y++) {
- for (unsigned short x=0; x<width; x++) {
- char r = fgetc(fp);
- char g = fgetc(fp);
- char b = fgetc(fp);
- char a = (byte_per_pix==4) ? fgetc(fp) : 255;
- int bx = x-xs, by = y-ys;
- if ((bx >= 0) && (bx < (int)re->rectx) && (by >= 0) && (by < re->recty)) {
- float* bpt = (float*)rres.rectf + ((bx + (((re->recty-1) - by)*re->rectx)) << 2);
- bpt[2] = (float)r * btf;
- bpt[1] = (float)g * btf;
- bpt[0] = (float)b * btf;
- bpt[3] = (float)a * btf;
- bpt += 4;
- }
- }
- }
- }
- else {
- for (unsigned short y=0; y<height; y++) {
- float* bpt = (float*)rres.rectf + ((((height-1)-y)*width) << 2);
- for (unsigned short x=0; x<width; x++) {
- bpt[2] = ((float)fgetc(fp) * btf);
- bpt[1] = ((float)fgetc(fp) * btf);
- bpt[0] = ((float)fgetc(fp) * btf);
- bpt[3] = (byte_per_pix==4) ? ((float)fgetc(fp) * btf) : 1.f;
- bpt += 4;
- }
- }
- }
-
- fclose(fp);
- fp = NULL;
-
- // based on another assumption of ogl errors on my system, forgot to actually draw it...
- re->result->renlay = render_get_active_layer(re, re->result);
- re->display_draw(re->ddh, re->result, NULL);
-
-}
-
-static string noise2string(short nbtype)
-{
- switch (nbtype) {
- case TEX_BLENDER:
- return "blender";
- case TEX_STDPERLIN:
- return "stdperlin";
- case TEX_VORONOI_F1:
- return "voronoi_f1";
- case TEX_VORONOI_F2:
- return "voronoi_f2";
- case TEX_VORONOI_F3:
- return "voronoi_f3";
- case TEX_VORONOI_F4:
- return "voronoi_f4";
- case TEX_VORONOI_F2F1:
- return "voronoi_f2f1";
- case TEX_VORONOI_CRACKLE:
- return "voronoi_crackle";
- case TEX_CELLNOISE:
- return "cellnoise";
- default:
- case TEX_NEWPERLIN:
- return "newperlin";
- }
-}
-
-void yafrayFileRender_t::writeTextures()
-{
- // used to keep track of images already written
- // (to avoid duplicates if also in imagetex for material TexFace texture)
- set<Image*> dupimg;
-
- for (map<string, MTex*>::const_iterator blendtex=used_textures.begin();
- blendtex!=used_textures.end();++blendtex) {
- MTex* mtex = blendtex->second;
- Tex* tex = mtex->tex;
-
- float nsz = tex->noisesize;
- if (nsz!=0.f) nsz=1.f/nsz;
-
- // noisebasis type
- string ntype = noise2string(tex->noisebasis);
- string ts, hardnoise=(tex->noisetype==TEX_NOISESOFT) ? "off" : "on";
-
- switch (tex->type) {
- case TEX_STUCCI:
- // stucci is clouds as bump, only difference is an extra parameter to handle wall in/out
- // turbulence value is not used, so for large values will not match well
- case TEX_CLOUDS: {
- ostr.str("");
- ostr << "<shader type=\"clouds\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t<attributes>\n";
- ostr << "\t\t<size value=\"" << nsz << "\" />\n";
- ostr << "\t\t<hard value=\"" << hardnoise << "\" />\n";
- if (tex->type==TEX_STUCCI) {
- if (tex->stype==1)
- ts = "positive";
- else if (tex->stype==2)
- ts = "negative";
- else ts = "none";
- ostr << "\t\t<bias value=\"" << ts << "\" />\n";
- ostr << "\t\t<depth value=\"0\" />\n"; // for stucci always 0
- }
- else ostr << "\t\t<depth value=\"" << tex->noisedepth << "\" />\n";
- ostr << "\t\t<color_type value=\"" << tex->stype << "\" />\n";
- ostr << "\t\t<noise_type value=\"" << ntype << "\" />\n";
- ostr << "\t</attributes>\n</shader >\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_WOOD: {
- ostr.str("");
- ostr << "<shader type=\"wood\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t\t<attributes>\n";
- // blender does not use depth value for wood, always 0
- ostr << "\t\t<depth value=\"0\" />\n";
- float turb = (tex->stype<2) ? 0.0 : tex->turbul;
- ostr << "\t\t<turbulence value=\"" << turb << "\" />\n";
- ostr << "\t\t<size value=\"" << nsz << "\" />\n";
- ostr << "\t\t<hard value=\"" << hardnoise << "\" />\n";
- ts = (tex->stype & 1) ? "rings" : "bands"; //stype 1&3 ringtype
- ostr << "\t\t<wood_type value=\"" << ts << "\" />\n";
- ostr << "\t\t<noise_type value=\"" << ntype << "\" />\n";
- // shape parameter, for some reason noisebasis2 is used...
- ts = "sin";
- if (tex->noisebasis2==1) ts="saw"; else if (tex->noisebasis2==2) ts="tri";
- ostr << "\t\t<shape value=\"" << ts << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_MARBLE: {
- ostr.str("");
- ostr << "<shader type=\"marble\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t<attributes>\n";
- ostr << "\t\t<depth value=\"" << tex->noisedepth << "\" />\n";
- ostr << "\t\t<turbulence value=\"" << tex->turbul << "\" />\n";
- ostr << "\t\t<size value=\"" << nsz << "\" />\n";
- ostr << "\t\t<hard value=\"" << hardnoise << "\" />\n";
- ostr << "\t\t<sharpness value=\"" << (float)(1<<tex->stype) << "\" />\n";
- ostr << "\t\t<noise_type value=\"" << ntype << "\" />\n";
- ts = "sin";
- if (tex->noisebasis2==1) ts="saw"; else if (tex->noisebasis2==2) ts="tri";
- ostr << "\t\t<shape value=\"" << ts << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_VORONOI: {
- ostr.str("");
- ostr << "<shader type=\"voronoi\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t<attributes>\n";
- ts = "int";
- if (tex->vn_coltype==1)
- ts = "col1";
- else if (tex->vn_coltype==2)
- ts = "col2";
- else if (tex->vn_coltype==3)
- ts = "col3";
- ostr << "\t\t<color_type value=\"" << ts << "\" />\n";
- ostr << "\t\t<weight1 value=\"" << tex->vn_w1 << "\" />\n";
- ostr << "\t\t<weight2 value=\"" << tex->vn_w2 << "\" />\n";
- ostr << "\t\t<weight3 value=\"" << tex->vn_w3 << "\" />\n";
- ostr << "\t\t<weight4 value=\"" << tex->vn_w4 << "\" />\n";
- ostr << "\t\t<mk_exponent value=\"" << tex->vn_mexp << "\" />\n";
- ostr << "\t\t<intensity value=\"" << tex->ns_outscale << "\" />\n";
- ostr << "\t\t<size value=\"" << nsz << "\" />\n";
- ts = "actual";
- if (tex->vn_distm==TEX_DISTANCE_SQUARED)
- ts = "squared";
- else if (tex->vn_distm==TEX_MANHATTAN)
- ts = "manhattan";
- else if (tex->vn_distm==TEX_CHEBYCHEV)
- ts = "chebychev";
- else if (tex->vn_distm==TEX_MINKOVSKY_HALF)
- ts = "minkovsky_half";
- else if (tex->vn_distm==TEX_MINKOVSKY_FOUR)
- ts = "minkovsky_four";
- else if (tex->vn_distm==TEX_MINKOVSKY)
- ts = "minkovsky";
- ostr << "\t\t<distance_metric value=\"" << ts << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_MUSGRAVE: {
- ostr.str("");
- ostr << "<shader type=\"musgrave\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t<attributes>\n";
- switch (tex->stype) {
- case TEX_MFRACTAL:
- ts = "multifractal";
- break;
- case TEX_RIDGEDMF:
- ts = "ridgedmf";
- break;
- case TEX_HYBRIDMF:
- ts = "hybridmf";
- break;
- case TEX_HTERRAIN:
- ts = "heteroterrain";
- break;
- default:
- case TEX_FBM:
- ts = "fBm";
- }
- ostr << "\t\t<musgrave_type value=\"" << ts << "\" />\n";
- ostr << "\t\t<noise_type value=\"" << ntype << "\" />\n";
- ostr << "\t\t<H value=\"" << tex->mg_H << "\" />\n";
- ostr << "\t\t<lacunarity value=\"" << tex->mg_lacunarity << "\" />\n";
- ostr << "\t\t<octaves value=\"" << tex->mg_octaves << "\" />\n";
- if ((tex->stype==TEX_HTERRAIN) || (tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF)) {
- ostr << "\t\t<offset value=\"" << tex->mg_offset << "\" />\n";
- if ((tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF))
- ostr << "\t\t<gain value=\"" << tex->mg_gain << "\" />\n";
- }
- ostr << "\t\t<size value=\"" << nsz << "\" />\n";
- ostr << "\t\t<intensity value=\"" << tex->ns_outscale << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_DISTNOISE: {
- ostr.str("");
- ostr << "<shader type=\"distorted_noise\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t<attributes>\n";
- ostr << "\t\t<distort value=\"" << tex->dist_amount << "\" />\n";
- ostr << "\t\t<size value=\"" << nsz << "\" />\n";
- ostr << "\t\t<noise_type1 value=\"" << ntype << "\" />\n";
- ostr << "\t\t<noise_type2 value=\"" << noise2string(tex->noisebasis2) << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_BLEND: {
- ostr.str("");
- ostr << "<shader type=\"gradient\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t<attributes>\n";
- switch (tex->stype) {
- case 1: ts="quadratic"; break;
- case 2: ts="cubic"; break;
- case 3: ts="diagonal"; break;
- case 4: ts="sphere"; break;
- case 5: ts="halo"; break;
- default:
- case 0: ts="linear"; break;
- }
- ostr << "\t\t<gradient_type value=\"" << ts << "\" />\n";
- if (tex->flag & TEX_FLIPBLEND) ts="on"; else ts="off";
- ostr << "\t\t<flip_xy value=\"" << ts << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_NOISE: {
- ostr.str("");
- ostr << "<shader type=\"random_noise\" name=\"" << blendtex->first << "\" >\n";
- ostr << "\t<attributes>\n";
- ostr << "\t\t<depth value=\"" << tex->noisedepth << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- break;
- }
- case TEX_IMAGE: {
- Image* ima = tex->ima;
- if (ima) {
- // remember image to avoid duplicates later if also in imagetex
- // (formerly done by removing from imagetex, but need image/material link)
- dupimg.insert(ima);
- ostr.str("");
- // use image name instead of texname here
- ostr << "<shader type=\"image\" name=\"" << ima->id.name << "\" >\n";
- ostr << "\t<attributes>\n";
- string texpath(ima->name);
- adjustPath(texpath);
- ostr << "\t\t<filename value=\"" << texpath << "\" />\n";
- ostr << "\t\t<interpolate value=\"" << ((tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- }
- break;
- }
- default:
- cout << "Unsupported texture type\n";
- }
-
- // colorbands
- if (tex->flag & TEX_COLORBAND) {
- ColorBand* cb = tex->coba;
- if (cb) {
- ostr.str("");
- ostr << "<shader type=\"colorband\" name=\"" << blendtex->first + "_coba" << "\" >\n";
- ostr << "\t<attributes>\n";
- ostr << "\t\t<input value=\"" << blendtex->first << "\" />\n";
- ostr << "\t</attributes>\n";
- for (int i=0;i<cb->tot;i++) {
- ostr << "\t<modulator value=\"" << cb->data[i].pos << "\" >\n";
- ostr << "\t\t<color r=\"" << cb->data[i].r << "\"" <<
- " g=\"" << cb->data[i].g << "\"" <<
- " b=\"" << cb->data[i].b << "\"" <<
- " a=\"" << cb->data[i].a << "\" />\n";
- ostr << "\t</modulator>\n";
- }
- ostr << "</shader>\n\n";
- xmlfile << ostr.str();
- }
- }
-
- }
-
- // If used, textures for the material 'TexFace' case
- if (!imagetex.empty()) {
- for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin();
- imgtex!=imagetex.end();++imgtex)
- {
- // skip if already written above
- Image* ima = imgtex->first;
- if (dupimg.find(ima)==dupimg.end()) {
- ostr.str("");
- ostr << "<shader type=\"image\" name=\"" << ima->id.name << "\" >\n";
- ostr << "\t<attributes>\n";
- string texpath(ima->name);
- adjustPath(texpath);
- ostr << "\t\t<filename value=\"" << texpath << "\" />\n";
- ostr << "\t</attributes>\n</shader>\n\n";
- xmlfile << ostr.str();
- }
- }
- }
-
-}
-
-void yafrayFileRender_t::writeShader(const string &shader_name, Material* matr, const string &facetexname)
-{
- // if material has ramps, export colorbands first
- if (matr->mode & (MA_RAMP_COL|MA_RAMP_SPEC))
- {
- // both colorbands without input shader
- ColorBand* cb = matr->ramp_col;
- if ((matr->mode & MA_RAMP_COL) && (cb!=NULL))
- {
- ostr.str("");
- ostr << "<shader type=\"colorband\" name=\"" << shader_name+"_difframp" << "\" >\n";
- ostr << "\t<attributes>\n\t</attributes>\n";
- for (int i=0;i<cb->tot;i++) {
- ostr << "\t<modulator value=\"" << cb->data[i].pos << "\" >\n";
- ostr << "\t\t<color r=\"" << cb->data[i].r << "\"" <<
- " g=\"" << cb->data[i].g << "\"" <<
- " b=\"" << cb->data[i].b << "\"" <<
- " a=\"" << cb->data[i].a << "\" />\n";
- ostr << "\t</modulator>\n";
- }
- ostr << "</shader>\n\n";
- xmlfile << ostr.str();
- }
- cb = matr->ramp_spec;
- if ((matr->mode & MA_RAMP_SPEC) && (cb!=NULL))
- {
- ostr.str("");
- ostr << "<shader type=\"colorband\" name=\"" << shader_name+"_specramp" << "\" >\n";
- ostr << "\t<attributes>\n\t</attributes>\n";
- for (int i=0;i<cb->tot;i++) {
- ostr << "\t<modulator value=\"" << cb->data[i].pos << "\" >\n";
- ostr << "\t\t<color r=\"" << cb->data[i].r << "\"" <<
- " g=\"" << cb->data[i].g << "\"" <<
- " b=\"" << cb->data[i].b << "\"" <<
- " a=\"" << cb->data[i].a << "\" />\n";
- ostr << "\t</modulator>\n";
- }
- ostr << "</shader>\n\n";
- xmlfile << ostr.str();
- }
- }
-
- ostr.str("");
- ostr << "<shader type=\"blendershader\" name=\"" << shader_name << "\" >\n";
- ostr << "\t<attributes>\n";
- ostr << "\t\t<color r=\"" << matr->r << "\" g=\"" << matr->g << "\" b=\"" << matr->b << "\" />\n";
- float sr=matr->specr, sg=matr->specg, sb=matr->specb;
- if (matr->spec_shader==MA_SPEC_WARDISO) {
- // ........
- sr /= M_PI;
- sg /= M_PI;
- sb /= M_PI;
- }
- ostr << "\t\t<specular_color r=\"" << sr << "\" g=\"" << sg << "\" b=\"" << sb << "\" />\n";
- ostr << "\t\t<mirror_color r=\"" << matr->mirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n";
- ostr << "\t\t<diffuse_reflect value=\"" << matr->ref << "\" />\n";
- ostr << "\t\t<specular_amount value=\"" << matr->spec << "\" />\n";
- ostr << "\t\t<alpha value=\"" << matr->alpha << "\" />\n";
- // if no GI used, the GIpower parameter is not always initialized, so in that case ignore it
- float bg_mult = (re->r.GImethod==0) ? 1 : re->r.GIpower;
- ostr << "\t\t<emit value=\"" << (matr->emit * bg_mult) << "\" />\n";
-
- // reflection/refraction
- if ( (matr->mode & MA_RAYMIRROR) || (matr->mode & MA_RAYTRANSP) )
- ostr << "\t\t<IOR value=\"" << matr->ang << "\" />\n";
-
- if (matr->mode & MA_RAYMIRROR)
- {
- // Sofar yafray's min_refle parameter (which misleadingly actually controls fresnel reflection offset)
- // has been mapped to Blender's ray_mirror parameter.
- // This causes it be be misinterpreted and misused as a reflection amount control however.
- // Besides that, it also causes extra complications for the yafray Blendershader.
- // So added an actual amount of reflection parameter instead, and another
- // extra parameter 'frsOfs' to actually control fresnel offset (re-uses Blender fresnel_mir_i param).
- ostr << "\t\t<reflect value=\"on\" />\n";
- ostr << "\t\t<reflect_amount value=\""<< matr->ray_mirror << "\" />\n";
- float fo = 1.f-(matr->fresnel_mir_i-1.f)*0.25f; // blender param range [1,5], also here reversed (1 in Blender -> no fresnel)
- ostr << "\t\t<fresnel_offset value=\""<< fo << "\" />\n";
-
- // for backward compatibility, also add old 'reflected' parameter, copy of mirror_color
- ostr << "\t\t<reflected r=\"" << matr->mirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n";
- // same for 'min_refle' param. Instead of the ray_mirror parameter that was used before, since now
- // the parameter's function is taken over by the fresnel offset parameter, use that instead.
- ostr << "\t\t<min_refle value=\"" << fo << "\" />\n";
-
- }
-
- if (matr->mode & MA_RAYTRANSP)
- {
- ostr << "\t\t<refract value=\"on\" />\n";
- ostr << "\t\t<transmit_filter value=\"" << matr->filter << "\" />\n";
- // tir on by default
- ostr << "\t\t<tir value=\"on\" />\n";
-
- // transmit absorption color
- // to make things easier(?) for user it now specifies the actual color at 1 unit / YF_dscale of distance
- const float maxlog = -log(1e-38);
- float ar = (matr->YF_ar>0) ? -log(matr->YF_ar) : maxlog;
- float ag = (matr->YF_ag>0) ? -log(matr->YF_ag) : maxlog;
- float ab = (matr->YF_ab>0) ? -log(matr->YF_ab) : maxlog;
- float sc = matr->YF_dscale;
- if (sc!=0.f) sc=1.f/sc;
- ostr << "\t\t<absorption r=\"" << ar*sc << "\" g=\"" << ag*sc << "\" b=\"" << ab*sc << "\" />\n";
- // dispersion
- ostr << "\t\t<dispersion_power value=\"" << matr->YF_dpwr << "\" />\n";
- ostr << "\t\t<dispersion_samples value=\"" << matr->YF_dsmp << "\" />\n";
- ostr << "\t\t<dispersion_jitter value=\"" << (matr->YF_djit ? "on" : "off") << "\" />\n";
-
- // for backward compatibility, also add old 'transmitted' parameter, copy of 'color' * (1-alpha)
- float na = 1.f-matr->alpha;
- ostr << "\t\t<transmitted r=\"" << matr->r*na << "\" g=\"" << matr->g*na << "\" b=\"" << matr->b*na << "\" />\n";
- }
-
- string Mmode = "";
- if (matr->mode & MA_TRACEBLE) Mmode += "traceable";
- if (matr->mode & MA_SHADOW) Mmode += " shadow";
- if (matr->mode & MA_SHLESS) Mmode += " shadeless";
- if (matr->mode & MA_VERTEXCOL) Mmode += " vcol_light";
- if (matr->mode & MA_VERTEXCOLP) Mmode += " vcol_paint";
- if (matr->mode & MA_ZTRA) Mmode += " ztransp";
- if (matr->mode & MA_ONLYSHADOW) Mmode += " onlyshadow";
- if (Mmode!="") ostr << "\t\t<matmodes value=\"" << Mmode << "\" />\n";
-
- // diffuse & specular brdf, lambert/cooktorr defaults
- // diffuse
- if (matr->diff_shader==MA_DIFF_ORENNAYAR) {
- ostr << "\t\t<diffuse_brdf value=\"oren_nayar\" />\n";
- ostr << "\t\t<roughness value=\"" << matr->roughness << "\" />\n";
- }
- else if (matr->diff_shader==MA_DIFF_TOON) {
- ostr << "\t\t<diffuse_brdf value=\"toon\" />\n";
- ostr << "\t\t<toondiffuse_size value=\"" << matr->param[0] << "\" />\n";
- ostr << "\t\t<toondiffuse_smooth value=\"" << matr->param[1] << "\" />\n";
- }
- else if (matr->diff_shader==MA_DIFF_MINNAERT) {
- ostr << "\t\t<diffuse_brdf value=\"minnaert\" />\n";
- ostr << "\t\t<darkening value=\"" << matr->darkness << "\" />\n";
- }
- else ostr << "\t\t<diffuse_brdf value=\"lambert\" />\n";
- // specular
- if (matr->spec_shader==MA_SPEC_PHONG) {
- ostr << "\t\t<specular_brdf value=\"phong\" />\n";
- ostr << "\t\t<hard value=\"" << matr->har << "\" />\n";
- }
- else if (matr->spec_shader==MA_SPEC_BLINN) {
- ostr << "\t\t<specular_brdf value=\"blinn\" />\n";
- ostr << "\t\t<blinn_ior value=\"" << matr->refrac << "\" />\n";
- ostr << "\t\t<hard value=\"" << matr->har << "\" />\n";
- }
- else if (matr->spec_shader==MA_SPEC_TOON) {
- ostr << "\t\t<specular_brdf value=\"toon\" />\n";
- ostr << "\t\t<toonspecular_size value=\"" << matr->param[2] << "\" />\n";
- ostr << "\t\t<toonspecular_smooth value=\"" << matr->param[3] << "\" />\n";
- }
- else if (matr->spec_shader==MA_SPEC_WARDISO) {
- ostr << "\t\t<specular_brdf value=\"ward\" />\n";
- ostr << "\t\t<u_roughness value=\"" << matr->rms << "\" />\n";
- ostr << "\t\t<v_roughness value=\"" << matr->rms << "\" />\n";
- }
- else {
- ostr << "\t\t<specular_brdf value=\"blender_cooktorr\" />\n";
- ostr << "\t\t<hard value=\"" << matr->har << "\" />\n";
- }
-
- // ramps, if used
- if (matr->mode & (MA_RAMP_COL|MA_RAMP_SPEC))
- {
- const string rm_blend[9] = {"mix", "add", "mul", "sub", "screen", "divide", "difference", "darken", "lighten"};
- const string rm_mode[4] = {"shader", "energy", "normal", "result"};
- // diffuse
- if ((matr->mode & MA_RAMP_COL) && (matr->ramp_col!=NULL))
- {
- ostr << "\t\t<diffuse_ramp value=\"" << shader_name+"_difframp" << "\" />\n";
- ostr << "\t\t<diffuse_ramp_mode value=\"" << rm_mode[(int)matr->rampin_col] << "\" />\n";
- ostr << "\t\t<diffuse_ramp_blend value=\"" << rm_blend[(int)matr->rampblend_col] << "\" />\n";
- ostr << "\t\t<diffuse_ramp_factor value=\"" << matr->rampfac_col << "\" />\n";
- }
- // specular
- if ((matr->mode & MA_RAMP_SPEC) && (matr->ramp_spec!=NULL)) {
- ostr << "\t\t<specular_ramp value=\"" << shader_name+"_specramp" << "\" />\n";
- ostr << "\t\t<specular_ramp_mode value=\"" << rm_mode[(int)matr->rampin_spec] << "\" />\n";
- ostr << "\t\t<specular_ramp_blend value=\"" << rm_blend[(int)matr->rampblend_spec] << "\" />\n";
- ostr << "\t\t<specular_ramp_factor value=\"" << matr->rampfac_spec << "\" />\n";
- }
- }
-
- ostr << "\t</attributes>\n";
- xmlfile << ostr.str();
-
- // modulators
- // first modulator is the texture of the face, if used (TexFace mode)
- if (facetexname.length()!=0) {
- ostr.str("");
- ostr << "\t<modulator>\n";
- ostr << "\t\t<input value=\"" << facetexname << "\" />\n";
- ostr << "\t\t<color value=\"1\" />\n";
- ostr << "\t</modulator>\n";
- xmlfile << ostr.str();
- }
-
- for (int m2=0;m2<MAX_MTEX;m2++) {
-
- if (matr->septex & (1<<m2)) continue;// all active channels
-
- // ignore null mtex
- MTex* mtex = matr->mtex[m2];
- if (mtex==NULL) continue;
-
- // ignore null tex
- Tex* tex = mtex->tex;
- if (tex==NULL) continue;
-
- map<string, MTex*>::const_iterator mtexL = used_textures.find(string(tex->id.name));
- if (mtexL!=used_textures.end()) {
-
- ostr.str("");
- ostr << "\t<modulator>\n";
- // when no facetex used, shader_name is created from original material name
- if (facetexname.length()!=0)
- ostr << "\t\t<input value=\"" << matr->id.name << "_map" << m2 << "\" />\n";
- else
- ostr << "\t\t<input value=\"" << shader_name << "_map" << m2 << "\" />\n";
-
- // blendtype, would have been nice if the order would have been the same as for ramps...
- const string blendtype[MTEX_NUM_BLENDTYPES] = {"mix", "mul", "add", "sub", "divide", "darken", "difference", "lighten", "screen", "hue", "sat", "val", "color"};
- ostr << "\t\t<mode value=\"" << blendtype[(int)mtex->blendtype] << "\" />\n";
-
- // texture color (for use with MUL and/or no_rgb etc..)
- ostr << "\t\t<texcol r=\"" << mtex->r << "\" g=\"" << mtex->g << "\" b=\"" << mtex->b << "\" />\n";
-
- // texture contrast, brightness & color adjustment
- ostr << "\t\t<filtercolor r=\"" << tex->rfac << "\" g=\"" << tex->gfac << "\" b=\"" << tex->bfac << "\" />\n";
- ostr << "\t\t<contrast value=\"" << tex->contrast << "\" />\n";
- ostr << "\t\t<brightness value=\"" << tex->bright << "\" />\n";
-
- // all texture flags now are switches, having the value 1 or -1 (negative option)
- // the negative option only used for the intensity modulation options.
-
- // material (diffuse) color, amount controlled by colfac (see below)
- if (mtex->mapto & MAP_COL)
- ostr << "\t\t<color value=\"1\" />\n";
-
- // bumpmapping
- if ((mtex->mapto & MAP_NORM) || (mtex->maptoneg & MAP_NORM)) {
- // for yafray, bump factor is negated (unless tex is stucci, not affected by 'Neg')
- // scaled down quite a bit
- float nf = mtex->norfac;
- if (tex->type!=TEX_STUCCI) nf *= -1.f;
- if (mtex->maptoneg & MAP_NORM) nf *= -1.f;
- ostr << "\t\t<normal value=\"" << (nf/60.f) << "\" />\n";
-
- }
-
- // all blender texture modulation as switches, either 1 or -1 (negative state of button)
- // Csp, specular color modulation
- if (mtex->mapto & MAP_COLSPEC)
- ostr << "\t\t<colspec value=\"1\" />\n";
-
- // CMir, mirror color modulation
- if (mtex->mapto & MAP_COLMIR)
- ostr << "\t\t<colmir value=\"1\" />\n";
-
- // Ref, diffuse reflection amount modulation
- if ((mtex->mapto & MAP_REF) || (mtex->maptoneg & MAP_REF)) {
- int t = 1;
- if (mtex->maptoneg & MAP_REF) t = -1;
- ostr << "\t\t<difref value=\"" << t << "\" />\n";
- }
-
- // Spec, specular amount mod
- if ((mtex->mapto & MAP_SPEC) || (mtex->maptoneg & MAP_SPEC)) {
- int t = 1;
- if (mtex->maptoneg & MAP_SPEC) t = -1;
- ostr << "\t\t<specular value=\"" << t << "\" />\n";
- }
-
- // hardness modulation
- if ((mtex->mapto & MAP_HAR) || (mtex->maptoneg & MAP_HAR)) {
- int t = 1;
- if (mtex->maptoneg & MAP_HAR) t = -1;
- ostr << "\t\t<hard value=\"" << t << "\" />\n";
- }
-
- // alpha modulation
- if ((mtex->mapto & MAP_ALPHA) || (mtex->maptoneg & MAP_ALPHA)) {
- int t = 1;
- if (mtex->maptoneg & MAP_ALPHA) t = -1;
- ostr << "\t\t<alpha value=\"" << t << "\" />\n";
- }
-
- // emit modulation
- if ((mtex->mapto & MAP_EMIT) || (mtex->maptoneg & MAP_EMIT)) {
- int t = 1;
- if (mtex->maptoneg & MAP_EMIT) t = -1;
- ostr << "\t\t<emit value=\"" << t << "\" />\n";
- }
-
- // raymir modulation
- if ((mtex->mapto & MAP_RAYMIRR) || (mtex->maptoneg & MAP_RAYMIRR)) {
- int t = 1;
- if (mtex->maptoneg & MAP_RAYMIRR) t = -1;
- ostr << "\t\t<raymir value=\"" << t << "\" />\n";
- }
-
- // texture flag, combination of strings
- string ts = "";
- if (mtex->texflag & (MTEX_RGBTOINT | MTEX_STENCIL | MTEX_NEGATIVE)) {
- if (mtex->texflag & MTEX_RGBTOINT) ts += "no_rgb ";
- if (mtex->texflag & MTEX_STENCIL) ts += "stencil ";
- if (mtex->texflag & MTEX_NEGATIVE) ts += "negative";
- ostr << "\t\t<texflag value=\"" << ts << "\" />\n";
- }
-
- // colfac, controls amount of color modulation
- ostr << "\t\t<colfac value=\"" << mtex->colfac << "\" />\n";
-
- // def_var
- ostr << "\t\t<def_var value=\"" << mtex->def_var << "\" />\n";
-
- //varfac
- ostr << "\t\t<varfac value=\"" << mtex->varfac << "\" />\n";
-
- if ((tex->imaflag & (TEX_CALCALPHA | TEX_USEALPHA)) || (tex->flag & TEX_NEGALPHA)) {
- ts = "";
- if (tex->imaflag & TEX_CALCALPHA) ts += "calc_alpha ";
- if (tex->imaflag & TEX_USEALPHA) ts += "use_alpha ";
- if (tex->flag & TEX_NEGALPHA) ts += "neg_alpha";
- ostr << "\t\t<alpha_flag value=\"" << ts << "\" />\n";
- }
-
- // image as normalmap flag
- if (tex->imaflag & TEX_NORMALMAP) ostr << "\t\t<normalmap value=\"on\" />\n";
-
- ostr << "\t</modulator>\n";
- xmlfile << ostr.str();
-
- }
- }
- xmlfile << "</shader>\n\n";
-
-}
-
-
-// write all materials & modulators
-void yafrayFileRender_t::writeMaterialsAndModulators()
-{
- // shaders/mappers for regular texture (or non-texture) mode
- // In case material has texface mode, and all faces have an image texture,
- // this shader will not be used, but still be written
- for (map<string, Material*>::const_iterator blendmat=used_materials.begin();
- blendmat!=used_materials.end();++blendmat)
- {
-
- Material* matr = blendmat->second;
-
- // mapper(s)
- for (int m=0;m<MAX_MTEX;m++)
- {
-
- if (matr->septex & (1<<m)) continue;// all active channels
-
- // ignore null mtex
- MTex* mtex = matr->mtex[m];
- if (mtex==NULL) continue;
- // ignore null tex
- Tex* tex = mtex->tex;
- if (tex==NULL) continue;
-
- map<string, MTex*>::const_iterator mtexL = used_textures.find(string(tex->id.name));
- if (mtexL!=used_textures.end()) {
- ostr.str("");
- ostr << "<shader type=\"blendermapper\" name=\"" << blendmat->first + "_map" << m <<"\"";
- if ((mtex->texco & TEXCO_OBJECT) || (mtex->texco & TEXCO_REFL) || (mtex->texco & TEXCO_NORM))
- {
- // For object, reflection & normal mapping, add the object matrix to the modulator,
- // as in LF script, use camera matrix if no object specified.
- // In this case this means the inverse of that matrix
- float texmat[4][4], itexmat[4][4];
- if ((mtex->texco & TEXCO_OBJECT) && (mtex->object))
- MTC_Mat4CpyMat4(texmat, mtex->object->obmat);
- else // also for refl. map
- MTC_Mat4CpyMat4(texmat, maincam_obj->obmat);
- MTC_Mat4Invert(itexmat, texmat);
- ostr << "\n\t\tm00=\"" << itexmat[0][0] << "\" m01=\"" << itexmat[1][0]
- << "\" m02=\"" << itexmat[2][0] << "\" m03=\"" << itexmat[3][0] << "\"\n";
- ostr << "\t\tm10=\"" << itexmat[0][1] << "\" m11=\"" << itexmat[1][1]
- << "\" m12=\"" << itexmat[2][1] << "\" m13=\"" << itexmat[3][1] << "\"\n";
- ostr << "\t\tm20=\"" << itexmat[0][2] << "\" m21=\"" << itexmat[1][2]
- << "\" m22=\"" << itexmat[2][2] << "\" m23=\"" << itexmat[3][2] << "\"\n";
- ostr << "\t\tm30=\"" << itexmat[0][3] << "\" m31=\"" << itexmat[1][3]
- << "\" m32=\"" << itexmat[2][3] << "\" m33=\"" << itexmat[3][3] << "\">\n";
- }
- else ostr << ">\n";
- ostr << "\t<attributes>\n";
-
- // use image name instead of texname when texture is image
- if ((tex->type==TEX_IMAGE) && tex->ima)
- ostr << "\t\t<input value=\"" << tex->ima->id.name << "\" />\n";
- else if ((tex->flag & TEX_COLORBAND) & (tex->coba!=NULL))
- ostr << "\t\t<input value=\"" << mtexL->first + "_coba" << "\" />\n";
- else
- ostr << "\t\t<input value=\"" << mtexL->first << "\" />\n";
-
- // texture size
- ostr << "\t\t<sizex value=\"" << mtex->size[0] << "\" />\n";
- ostr << "\t\t<sizey value=\"" << mtex->size[1] << "\" />\n";
- ostr << "\t\t<sizez value=\"" << mtex->size[2] << "\" />\n";
-
- // texture offset
- ostr << "\t\t<ofsx value=\"" << mtex->ofs[0] << "\" />\n";
- ostr << "\t\t<ofsy value=\"" << mtex->ofs[1] << "\" />\n";
- ostr << "\t\t<ofsz value=\"" << mtex->ofs[2] << "\" />\n";
-
- // texture coordinates, have to disable 'sticky' in Blender
- if (mtex->texco & TEXCO_UV)
- ostr << "\t\t<texco value=\"uv\" />\n";
- else if ((mtex->texco & TEXCO_GLOB) || (mtex->texco & TEXCO_OBJECT))
- // object mode is also set as global, but the object matrix was specified above with <modulator..>
- ostr << "\t\t<texco value=\"global\" />\n";
- else if ((mtex->texco & TEXCO_ORCO) || (mtex->texco & TEXCO_STRAND))
- // orco flag now used for 'strand'-mapping as well, see mesh code
- ostr << "\t\t<texco value=\"orco\" />\n";
- else if (mtex->texco & TEXCO_WINDOW)
- ostr << "\t\t<texco value=\"window\" />\n";
- else if (mtex->texco & TEXCO_NORM)
- ostr << "\t\t<texco value=\"normal\" />\n";
- else if (mtex->texco & TEXCO_REFL)
- ostr << "\t\t<texco value=\"reflect\" />\n";
-
- // texture projection axes, both image & procedural
- string proj = "nxyz"; // 'n' for 'none'
- ostr << "\t\t<proj_x value=\"" << proj[mtex->projx] << "\" />\n";
- ostr << "\t\t<proj_y value=\"" << proj[mtex->projy] << "\" />\n";
- ostr << "\t\t<proj_z value=\"" << proj[mtex->projz] << "\" />\n";
-
- // texture mapping parameters only relevant to image type
- if (tex->type==TEX_IMAGE) {
- if (mtex->mapping==MTEX_FLAT)
- ostr << "\t\t<mapping value=\"flat\" />\n";
- else if (mtex->mapping==MTEX_CUBE)
- ostr << "\t\t<mapping value=\"cube\" />\n";
- else if (mtex->mapping==MTEX_TUBE)
- ostr << "\t\t<mapping value=\"tube\" />\n";
- else if (mtex->mapping==MTEX_SPHERE)
- ostr << "\t\t<mapping value=\"sphere\" />\n";
-
- // repeat
- ostr << "\t\t<xrepeat value=\"" << tex->xrepeat << "\" />\n";
- ostr << "\t\t<yrepeat value=\"" << tex->yrepeat << "\" />\n";
-
- // clipping
- if (tex->extend==TEX_EXTEND)
- ostr << "\t\t<clipping value=\"extend\" />\n";
- else if (tex->extend==TEX_CLIP)
- ostr << "\t\t<clipping value=\"clip\" />\n";
- else if (tex->extend==TEX_CLIPCUBE)
- ostr << "\t\t<clipping value=\"clipcube\" />\n";
- else if (tex->extend==TEX_CHECKER) {
- ostr << "\t\t<clipping value=\"checker\" />\n";
- string ts = "";
- if (tex->flag & TEX_CHECKER_ODD) ts += "odd";
- if (tex->flag & TEX_CHECKER_EVEN) ts += " even";
- ostr << "\t\t<checker_mode value=\"" << ts << "\" />\n";
- ostr << "\t\t<checker_dist value=\"" << tex->checkerdist << "\" />\n";
- }
- else
- ostr << "\t\t<clipping value=\"repeat\" />\n";
-
- // crop min/max
- ostr << "\t\t<cropmin_x value=\"" << tex->cropxmin << "\" />\n";
- ostr << "\t\t<cropmin_y value=\"" << tex->cropymin << "\" />\n";
- ostr << "\t\t<cropmax_x value=\"" << tex->cropxmax << "\" />\n";
- ostr << "\t\t<cropmax_y value=\"" << tex->cropymax << "\" />\n";
-
- // rot90 flag
- string ts = "off";
- if (tex->imaflag & TEX_IMAROT) ts = "on";
- ostr << "\t\t<rot90 value=\"" << ts << "\" />\n";
- }
-
- ostr << "\t</attributes>\n";
- ostr << "</shader>\n\n";
-
- xmlfile << ostr.str();
- }
- }
-
- // shader + modulators
- writeShader(blendmat->first, matr);
-
- }
-
- // write the mappers & shaders for the TexFace case
- if (!imagetex.empty()) {
- // Yafray doesn't have per-face-textures, only per-face-shaders,
- // so create as many mappers/shaders as the images used by the object
- int snum = 0;
- for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin();
- imgtex!=imagetex.end();++imgtex)
- {
-
- for (set<Material*>::const_iterator imgmat=imgtex->second.begin();
- imgmat!=imgtex->second.end();++imgmat)
- {
- Material* matr = *imgmat;
- // mapper
- ostr.str("");
- ostr << "<shader type=\"blendermapper\" name=\"" << string(matr->id.name) + "_ftmap" << snum << "\" >\n";
- ostr << "\t<attributes>\n";
- ostr << "\t\t<input value=\"" << imgtex->first->id.name << "\" />\n";
- // all yafray default settings, except for texco, so no need to set others
- ostr << "\t\t<texco value=\"uv\" />\n";
- ostr << "\t</attributes>\n";
- ostr << "</shader>\n\n";
- xmlfile << ostr.str();
-
- // shader, remember name, used later when writing per-face-shaders
- ostr.str("");
- ostr << matr->id.name << "_ftsha" << snum;
- string shader_name = ostr.str();
- imgtex_shader[string(matr->id.name) + string(imgtex->first->id.name)] = shader_name;
-
- ostr.str("");
- ostr << matr->id.name << "_ftmap" << snum++;
- writeShader(shader_name, matr, ostr.str());
- }
-
- }
- }
-
-}
-
-
-void yafrayFileRender_t::writeObject(Object* obj, ObjectRen *obr, const vector<VlakRen*> &VLR_list, const float obmat[4][4])
-{
- ostr.str("");
- // transform first (not necessarily actual obj->obmat, can be duplivert see below)
- ostr << "<transform m00=\"" << obmat[0][0] << "\" m01=\"" << obmat[1][0]
- << "\" m02=\"" << obmat[2][0] << "\" m03=\"" << obmat[3][0] << "\"\n";
- ostr << " m10=\"" << obmat[0][1] << "\" m11=\"" << obmat[1][1]
- << "\" m12=\"" << obmat[2][1] << "\" m13=\"" << obmat[3][1] << "\"\n";
- ostr << " m20=\"" << obmat[0][2] << "\" m21=\"" << obmat[1][2]
- << "\" m22=\"" << obmat[2][2] << "\" m23=\"" << obmat[3][2] << "\"\n";
- ostr << " m30=\"" << obmat[0][3] << "\" m31=\"" << obmat[1][3]
- << "\" m32=\"" << obmat[2][3] << "\" m33=\"" << obmat[3][3] << "\">\n";
- xmlfile << ostr.str();
-
- ostr.str("");
-
- // using the ObjectRen database, contruct a new name if object has a parent.
- // This is done to prevent name clashes (group/library link related)
- string obname(obj->id.name);
- // previous implementation, keep around, in case this is still useful
- //if (obj->id.flag & (LIB_EXTERN|LIB_INDIRECT))obname = "lib_" + obname;
- ObjectRen *obren;
- for (obren = static_cast<ObjectRen*>(re->objecttable.first);
- obren; obren=static_cast<ObjectRen*>(obren->next))
- {
- Object *db_ob = obren->ob, *db_par = obren->par;
- if (db_ob==obj)
- if ((db_ob!=NULL) && (db_par!=NULL)) {
- obname += "_" + string(db_par->id.name);
- break;
- }
- }
-
- ostr << "<object name=\"" << obname << "\"";
- // Yafray still needs default shader name in object def.,
- // since we write a shader with every face, simply use the material of the first face.
- // If this is an empty string, assume default material.
- VlakRen* face0 = VLR_list[0];
- Material* face0mat = face0->mat;
- string matname(face0mat->id.name);
- // use name in imgtex_shader list if 'TexFace' enabled for this material
- if (face0mat->mode & MA_FACETEXTURE) {
- MTFace* tface = RE_vlakren_get_tface(obr, face0, obr->actmtface, NULL, 0);
- if (tface) {
- Image* fimg = (Image*)tface->tpage;
- if (fimg) matname = imgtex_shader[string(face0mat->id.name) + string(fimg->id.name)];
- }
- }
- bool shadow = face0mat->mode & MA_TRACEBLE;
- ostr <<" shadow=\""<< (shadow ? "on" : "off" ) << "\" ";
- bool caus = (((face0mat->mode & MA_RAYTRANSP) | (face0->mat->mode & MA_RAYMIRROR))!=0);
- if (caus) ostr << "caus_IOR=\"" << face0mat->ang << "\"";
- if (matname.length()==0) matname = "blender_default";
- ostr << " shader_name=\"" << matname << "\" >\n";
- ostr << "\t<attributes>\n";
- if (caus)
- {
- float tr = 1.0-face0mat->alpha;
- ostr << "\t\t<caus_tcolor r=\"" << face0mat->r*tr
- << "\" g=\"" << face0mat->g*tr
- << "\" b=\"" << face0mat->b*tr << "\" />\n";
- tr = face0mat->ray_mirror;
- ostr << "\t\t<caus_rcolor r=\"" << face0mat->mirr*tr
- << "\" g=\"" << face0mat->mirg*tr
- << "\" b=\"" << face0mat->mirb*tr << "\" />\n";
- }
- ostr << "\t</attributes>\n";
- xmlfile << ostr.str();
-
- // Export orco coords test.
- // Previously was done by checking orco pointer, however this can be non-null but still not initialized.
- // Test the rendermaterial texco flag instead.
- // update2: bug #3193 it seems it has changed again with the introduction of static 'hair' particles,
- // now it uses the vert pointer again as an extra test to make sure there are orco coords available
- int has_orco = 0;
- if (face0mat->texco & TEXCO_STRAND)
- has_orco = 1;
- else
- has_orco = (((face0mat->texco & TEXCO_ORCO)!=0) && (face0->v1->orco!=NULL)) ? 2 : 0;
-
- string has_orco_st = has_orco ? "on" : "off";
-
- // smooth shading if enabled
- bool no_auto = true; //in case non-mesh, or mesh has no autosmooth
- if (obj->type==OB_MESH) {
- Mesh* mesh = (Mesh*)obj->data;
- if (mesh->flag & ME_AUTOSMOOTH) {
- no_auto = false;
- ostr.str("");
- ostr << "\t<mesh autosmooth=\"" << mesh->smoothresh << "\" has_orco=\"" << has_orco_st << "\" >\n";
- xmlfile << ostr.str();
- }
- }
- // this for non-mesh as well
- if (no_auto) {
- // If AutoSmooth not used, since yafray currently cannot specify if a face is smooth
- // or flat shaded, the smooth flag of the first face is used to determine
- // the shading for the whole mesh
- if (face0->flag & ME_SMOOTH)
- xmlfile << "\t<mesh autosmooth=\"180\" has_orco=\"" << has_orco_st << "\" >\n";
- else
- xmlfile << "\t<mesh autosmooth=\"0.1\" has_orco=\"" << has_orco_st << "\" >\n"; //0 shows artefacts
- }
-
- // now all vertices
- map<VertRen*, int> vert_idx; // for removing duplicate verts and creating an index list
- int vidx = 0; // vertex index counter
-
- // vertices, transformed back to world
- xmlfile << "\t\t<points>\n";
-
- // for deformed objects, object->imat is no longer valid,
- // so have to create inverse render matrix ourselves here
- float mat[4][4], imat[4][4];
- MTC_Mat4MulMat4(mat, obj->obmat, re->viewmat);
- MTC_Mat4Invert(imat, mat);
-
- for (vector<VlakRen*>::const_iterator fci=VLR_list.begin();
- fci!=VLR_list.end();++fci)
- {
- VlakRen* vlr = *fci;
- VertRen* ver;
- float* orco;
- float tvec[3];
- ostr.str("");
- if (vert_idx.find(vlr->v1)==vert_idx.end()) {
- vert_idx[vlr->v1] = vidx++;
- ver = vlr->v1;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1) {
- ostr << "\t\t\t<p x=\"" << ver->accum
- << "\" y=\"" << ver->accum
- << "\" z=\"" << ver->accum << "\" />\n";
- }
- else if (has_orco==2) {
- orco = ver->orco;
- ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
- }
- }
- if (vert_idx.find(vlr->v2)==vert_idx.end()) {
- vert_idx[vlr->v2] = vidx++;
- ver = vlr->v2;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1) {
- ostr << "\t\t\t<p x=\"" << ver->accum
- << "\" y=\"" << ver->accum
- << "\" z=\"" << ver->accum << "\" />\n";
- }
- else if (has_orco==2) {
- orco = ver->orco;
- ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
- }
- }
- if (vert_idx.find(vlr->v3)==vert_idx.end()) {
- vert_idx[vlr->v3] = vidx++;
- ver = vlr->v3;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1) {
- ostr << "\t\t\t<p x=\"" << ver->accum
- << "\" y=\"" << ver->accum
- << "\" z=\"" << ver->accum << "\" />\n";
- }
- else if (has_orco==2) {
- orco = ver->orco;
- ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
- }
- }
- if ((vlr->v4) && (vert_idx.find(vlr->v4)==vert_idx.end())) {
- vert_idx[vlr->v4] = vidx++;
- ver = vlr->v4;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1) {
- ostr << "\t\t\t<p x=\"" << ver->accum
- << "\" y=\"" << ver->accum
- << "\" z=\"" << ver->accum << "\" />\n";
- }
- else if (has_orco==2) {
- orco = ver->orco;
- ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
- }
- }
- xmlfile << ostr.str();
- }
- xmlfile << "\t\t</points>\n";
-
- // all faces using the index list created above
- xmlfile << "\t\t<faces>\n";
- for (vector<VlakRen*>::const_iterator fci2=VLR_list.begin();
- fci2!=VLR_list.end();++fci2)
- {
- VlakRen* vlr = *fci2;
- Material* fmat = vlr->mat;
- bool EXPORT_VCOL = ((fmat->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))!=0);
- string fmatname(fmat->id.name);
- // use name in imgtex_shader list if 'TexFace' enabled for this face material
- if (fmat->mode & MA_FACETEXTURE) {
- MTFace* tface = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
- if (tface) {
- Image* fimg = (Image*)tface->tpage;
- if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)];
- }
- }
- else if (fmatname.length()==0) fmatname = "blender_default";
-
- int idx1 = vert_idx.find(vlr->v1)->second;
- int idx2 = vert_idx.find(vlr->v2)->second;
- int idx3 = vert_idx.find(vlr->v3)->second;
- // make sure the indices point to the vertices when orco coords exported
- if (has_orco) { idx1*=2; idx2*=2; idx3*=2; }
-
- ostr.str("");
- ostr << "\t\t\t<f a=\"" << idx1 << "\" b=\"" << idx2 << "\" c=\"" << idx3 << "\"";
-
- // triangle uv and vcol indices
- int ui1=0, ui2=1, ui3=2;
- if (vlr->flag & R_DIVIDE_24) {
- ui3++;
- if (vlr->flag & R_FACE_SPLIT) { ui1++; ui2++; }
- }
- else if (vlr->flag & R_FACE_SPLIT) { ui2++; ui3++; }
-
- MTFace* uvc = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0); // possible uvcoords (v upside down)
- if (uvc) {
- ostr << " u_a=\"" << uvc->uv[ui1][0] << "\" v_a=\"" << 1-uvc->uv[ui1][1] << "\""
- << " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
- << " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
- }
-
- MCol *mcol= RE_vlakren_get_mcol(obr, vlr, obr->actmcol, NULL, 0);
-
- // since Blender seems to need vcols when uvs are used, for yafray only export when the material actually uses vcols
- if ((EXPORT_VCOL) && mcol) {
- // vertex colors
- unsigned char* pt = reinterpret_cast<unsigned char*>(&mcol[ui1]);
- ostr << " vcol_a_r=\"" << (float)pt[3]/255.f << "\" vcol_a_g=\"" << (float)pt[2]/255.f
- << "\" vcol_a_b=\"" << (float)pt[1]/255.f << "\"";
- pt = reinterpret_cast<unsigned char*>(&mcol[ui2]);
- ostr << " vcol_b_r=\"" << (float)pt[3]/255.f << "\" vcol_b_g=\"" << (float)pt[2]/255.f
- << "\" vcol_b_b=\"" << (float)pt[1]/255.f << "\"";
- pt = reinterpret_cast<unsigned char*>(&mcol[ui3]);
- ostr << " vcol_c_r=\"" << (float)pt[3]/255.f << "\" vcol_c_g=\"" << (float)pt[2]/255.f
- << "\" vcol_c_b=\"" << (float)pt[1]/255.f << "\"";
- }
- ostr << " shader_name=\"" << fmatname << "\" />\n";
-
- if (vlr->v4) {
-
- idx1 = vert_idx.find(vlr->v3)->second;
- idx2 = vert_idx.find(vlr->v4)->second;
- idx3 = vert_idx.find(vlr->v1)->second;
-
- // make sure the indices point to the vertices when orco coords exported
- if (has_orco) { idx1*=2; idx2*=2; idx3*=2; }
-
- ostr << "\t\t\t<f a=\"" << idx1 << "\" b=\"" << idx2 << "\" c=\"" << idx3 << "\"";
-
- // increment uv & vcol indices
- ui1 = (ui1+2) & 3;
- ui2 = (ui2+2) & 3;
- ui3 = (ui3+2) & 3;
-
- if (uvc) {
- ostr << " u_a=\"" << uvc->uv[ui1][0] << "\" v_a=\"" << 1-uvc->uv[ui1][1] << "\""
- << " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
- << " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
- }
- if ((EXPORT_VCOL) && mcol) {
- // vertex colors
- unsigned char* pt = reinterpret_cast<unsigned char*>(&mcol[ui1]);
- ostr << " vcol_a_r=\"" << (float)pt[3]/255.f << "\" vcol_a_g=\"" << (float)pt[2]/255.f
- << "\" vcol_a_b=\"" << (float)pt[1]/255.f << "\"";
- pt = reinterpret_cast<unsigned char*>(&mcol[ui2]);
- ostr << " vcol_b_r=\"" << (float)pt[3]/255.f << "\" vcol_b_g=\"" << (float)pt[2]/255.f
- << "\" vcol_b_b=\"" << (float)pt[1]/255.f << "\"";
- pt = reinterpret_cast<unsigned char*>(&mcol[ui3]);
- ostr << " vcol_c_r=\"" << (float)pt[3]/255.f << "\" vcol_c_g=\"" << (float)pt[2]/255.f
- << "\" vcol_c_b=\"" << (float)pt[1]/255.f << "\"";
- }
- ostr << " shader_name=\"" << fmatname << "\" />\n";
-
- }
- xmlfile << ostr.str();
- }
- xmlfile << "\t\t</faces>\n\t</mesh>\n</object>\n</transform>\n\n";
-}
-
-
-// write all objects
-void yafrayFileRender_t::writeAllObjects()
-{
-
- // first all objects except dupliverts (and main instance object for dups)
- for (map<Object*, yafrayObjectRen >::const_iterator obi=all_objects.begin();
- obi!=all_objects.end(); ++obi)
- {
- // skip main duplivert object if in dupliMtx_list, written later
- Object* obj = obi->first;
- if (dupliMtx_list.find(string(obj->id.name))!=dupliMtx_list.end()) continue;
- writeObject(obj, obi->second.obr, obi->second.faces, obj->obmat);
- }
-
- // Now all duplivert objects (if any) as instances of main object
- // The original object has been included in the VlakRen renderlist above (see convertBlenderScene.c)
- // but is written here which all other duplis are instances of.
- float obmat[4][4], cmat[4][4], imat[4][4], nmat[4][4];
- for (map<string, vector<float> >::const_iterator dupMtx=dupliMtx_list.begin();
- dupMtx!=dupliMtx_list.end();++dupMtx) {
-
- // original inverse matrix, not actual matrix of object, but first duplivert.
-
- for (int i=0;i<4;i++)
- for (int j=0;j<4;j++)
- obmat[i][j] = dupMtx->second[(i<<2)+j];
-
- MTC_Mat4Invert(imat, obmat);
-
- // first object written as normal (but with transform of first duplivert)
- Object* obj = dup_srcob[dupMtx->first];
- writeObject(obj, all_objects[obj].obr, all_objects[obj].faces, obmat);
-
- // all others instances of first
- for (unsigned int curmtx=16;curmtx<dupMtx->second.size();curmtx+=16) { // number of 4x4 matrices
-
- // new mtx
- for (int i=0;i<4;i++)
- for (int j=0;j<4;j++)
- nmat[i][j] = dupMtx->second[curmtx+(i<<2)+j];
-
- MTC_Mat4MulMat4(cmat, imat, nmat); // transform with respect to original = inverse_original * new
-
- ostr.str("");
- // yafray matrix = transpose of Blender
- ostr << "<transform m00=\"" << cmat[0][0] << "\" m01=\"" << cmat[1][0]
- << "\" m02=\"" << cmat[2][0] << "\" m03=\"" << cmat[3][0] << "\"\n";
- ostr << " m10=\"" << cmat[0][1] << "\" m11=\"" << cmat[1][1]
- << "\" m12=\"" << cmat[2][1] << "\" m13=\"" << cmat[3][1] << "\"\n";
- ostr << " m20=\"" << cmat[0][2] << "\" m21=\"" << cmat[1][2]
- << "\" m22=\"" << cmat[2][2] << "\" m23=\"" << cmat[3][2] << "\"\n";
- ostr << " m30=\"" << cmat[0][3] << "\" m31=\"" << cmat[1][3]
- << "\" m32=\"" << cmat[2][3] << "\" m33=\"" << cmat[3][3] << "\">\n";
- xmlfile << ostr.str();
-
- // new name from original
- ostr.str("");
- ostr << "<object name=\"" << obj->id.name << "_dup" << (curmtx>>4) << "\" original=\"" << obj->id.name << "\" >\n";
- xmlfile << ostr.str();
- xmlfile << "\t<attributes>\n\t</attributes>\n\t<null/>\n</object>\n</transform>\n\n";
-
- }
-
- }
-
-}
-
-void yafrayFileRender_t::writeAreaLamp(LampRen* lamp, int num, float iview[4][4])
-{
- if (lamp->area_shape!=LA_AREA_SQUARE) return;
- float *a=lamp->area[0], *b=lamp->area[1], *c=lamp->area[2], *d=lamp->area[3];
- float power=lamp->energy;
-
- ostr.str("");
- string md = "off";
- // if no GI used, the GIphotons flag can still be set, so only use when 'full' selected
- if ((re->r.GImethod==2) && (re->r.GIphotons)) { md="on"; power*=re->r.GIpower; }
- ostr << "<light type=\"arealight\" name=\"LAMP" << num+1 << "\" dummy=\""<< md << "\" power=\"" << power << "\" ";
- // samples not used for GI with photons, can still be exported, is ignored
- int psm=0, sm = lamp->ray_totsamp;
- if (sm>=25) psm = sm/5;
- ostr << "samples=\"" << sm << "\" psamples=\"" << psm << "\" ";
- ostr << ">\n";
-
- // transform area lamp coords back to world
- float lpco[4][3];
- MTC_cp3Float(a, lpco[0]);
- MTC_Mat4MulVecfl(iview, lpco[0]);
- MTC_cp3Float(b, lpco[1]);
- MTC_Mat4MulVecfl(iview, lpco[1]);
- MTC_cp3Float(c, lpco[2]);
- MTC_Mat4MulVecfl(iview, lpco[2]);
- MTC_cp3Float(d, lpco[3]);
- MTC_Mat4MulVecfl(iview, lpco[3]);
- ostr << "\t<a x=\""<< lpco[0][0] <<"\" y=\""<< lpco[0][1] <<"\" z=\"" << lpco[0][2] <<"\" />\n";
- ostr << "\t<b x=\""<< lpco[1][0] <<"\" y=\""<< lpco[1][1] <<"\" z=\"" << lpco[1][2] <<"\" />\n";
- ostr << "\t<c x=\""<< lpco[2][0] <<"\" y=\""<< lpco[2][1] <<"\" z=\"" << lpco[2][2] <<"\" />\n";
- ostr << "\t<d x=\""<< lpco[3][0] <<"\" y=\""<< lpco[3][1] <<"\" z=\"" << lpco[3][2] <<"\" />\n";
-
- ostr << "\t<color r=\"" << lamp->r << "\" g=\"" << lamp->g << "\" b=\"" << lamp->b << "\" />\n";
- ostr << "</light>\n\n";
- xmlfile << ostr.str();
-}
-
-void yafrayFileRender_t::writeLamps()
-{
- GroupObject *go;
- int i=0;
-
- // inverse viewmatrix needed for back2world transform
- float iview[4][4];
- // re->viewinv != inv.re->viewmat because of possible ortho mode (see convertBlenderScene.c)
- // have to invert it here
- MTC_Mat4Invert(iview, re->viewmat);
-
- // all lamps
- for(go=(GroupObject *)re->lights.first; go; go= go->next, i++) {
- LampRen* lamp = (LampRen *)go->lampren;
-
- ostr.str("");
-
- if (lamp->type==LA_AREA) { writeAreaLamp(lamp, i, iview); continue; }
-
- // TODO: add decay setting in yafray
- ostr << "<light type=\"";
- bool is_softL=false, is_sphereL=false;
- if (lamp->type==LA_LOCAL) {
- if (lamp->mode & LA_YF_SOFT) {
- // shadowmapped omnidirectional light
- ostr << "softlight\"";
- is_softL = true;
- }
- else if ((lamp->mode & LA_SHAD_RAY) && (lamp->YF_ltradius>0.0)) {
- // area sphere, only when ray shadows enabled and radius>0.0
- ostr << "spherelight\"";
- is_sphereL = true;
- }
- else ostr << "pointlight\"";
- ostr << " glow_intensity=\"" << lamp->YF_glowint << "\" glow_offset=\"" << lamp->YF_glowofs
- << "\" glow_type=\"" << lamp->YF_glowtype << "\"";
- }
- else if (lamp->type==LA_SPOT)
- ostr << "spotlight\"";
- else if ((lamp->type==LA_SUN) || (lamp->type==LA_HEMI)) // hemi exported as sun
- ostr << "sunlight\"";
- else if (lamp->type==LA_YF_PHOTON)
- ostr << "photonlight\"";
- else {
- // possibly unknown type, ignore
- cout << "Unknown Blender lamp type: " << lamp->type << endl;
- continue;
- }
-
- //no name available here, create one
- ostr << " name=\"LAMP" << i+1;
- // color already premultiplied by energy, so only need distance here
- float pwr = 1; // default for sun/hemi, distance irrelevant
- if ((lamp->type!=LA_SUN) && (lamp->type!=LA_HEMI)) {
- if (lamp->mode & LA_SPHERE) {
- // best approx. as used in LFexport script (LF d.f.m. 4pi?)
- pwr = lamp->dist*(lamp->dist+1)*(0.25/M_PI);
- //decay = 2;
- }
- else {
- pwr = lamp->dist;
- //decay = 1;
- }
- }
-
- if (is_sphereL) {
- // 'dummy' mode for spherelight when used with gpm
- string md = "off";
- // if no GI used, the GIphotons flag can still be set, so only use when 'full' selected
- if ((re->r.GImethod==2) && (re->r.GIphotons)) { md="on"; pwr*=re->r.GIpower; }
- ostr << "\" power=\"" << pwr << "\" dummy=\"" << md << "\"";
- }
- else ostr << "\" power=\"" << pwr << "\"";
-
- // cast_shadows flag not used with softlight, spherelight or photonlight
- if ((!is_softL) && (!is_sphereL) && (lamp->type!=LA_YF_PHOTON)) {
- string lpmode="off";
- // Blender hemilights exported as sunlights which might have shadow flag set
- // should have cast_shadows set to off (reported by varuag)
- if (lamp->type!=LA_HEMI) {
- if (re->r.mode & R_SHADOW) {
- // old bug was here since the yafray lamp settings panel was added,
- // blender spotlight shadbuf flag should be ignored, since it is not in the panel anymore
- if (lamp->mode & LA_SHAD_RAY) lpmode="on";
- }
- }
- ostr << " cast_shadows=\"" << lpmode << "\"";
- }
-
-
- // spot specific stuff
- bool has_halo = ((lamp->type==LA_SPOT) && (lamp->mode & LA_HALO) && (lamp->haint>0.0));
- if (lamp->type==LA_SPOT) {
- // conversion already changed spotsize to cosine of half angle
- float ld = 1-lamp->spotsi; //convert back to blender slider setting
- if (ld!=0) ld = 1.f/ld;
- ostr << " size=\"" << acos(lamp->spotsi)*180.0/M_PI << "\""
- << " blend=\"" << lamp->spotbl*ld << "\""
- << " beam_falloff=\"2\""; // no Blender equivalent (yet)
- // halo params
- if (has_halo) {
- ostr << "\n\thalo=\"on\" " << "res=\"" << lamp->YF_bufsize << "\"\n";
- int hsmp = ((12-lamp->shadhalostep)*16)/12;
- hsmp = (hsmp+1)*16; // makes range (16, 272) for halostep(12, 0), good enough?
- // halo 'samples' now 'stepsize'
- // convert from old integer samples value to some reasonable stepsize
- ostr << "\tstepsize=\"" << (1.0/sqrt((float)hsmp)) << "\" shadow_samples=\"" << (lamp->samp*lamp->samp) << "\"\n";
- ostr << "\thalo_blur=\"0\" shadow_blur=\"" << (lamp->soft*0.01f) << "\"\n";
- ostr << "\tfog_density=\"" << (lamp->haint*0.2f) << "\"";
- }
- }
- else if (is_softL) {
- // softlight
- ostr << " res=\"" << lamp->YF_bufsize << "\""
- << " radius=\"" << lamp->soft << "\""
- << " bias=\"" << lamp->bias << "\"";
- }
- else if (is_sphereL) {
- // spherelight
- int psm=0, sm = lamp->ray_samp*lamp->ray_samp;
- if (sm>=25) psm = sm/5;
- ostr << " radius=\"" << lamp->YF_ltradius << "\""
- << " samples=\"" << sm << "\""
- << " psamples=\"" << psm << "\""
- << " qmc_method=\"1\"";
- }
- else if (lamp->type==LA_YF_PHOTON) {
- string qmc="off";
- if (lamp->YF_useqmc) qmc="on";
- ostr << "\n\tphotons=\"" << lamp->YF_numphotons << "\""
- << " search=\"" << lamp->YF_numsearch << "\""
- << " depth=\"" << lamp->YF_phdepth << "\""
- << " use_QMC=\"" << qmc << "\""
- << " angle=\"" << acos(lamp->spotsi)*180.0/M_PI << "\"";
- float cl = lamp->YF_causticblur/sqrt((float)lamp->YF_numsearch);
- ostr << "\n\tfixedradius=\"" << lamp->YF_causticblur << "\" cluster=\"" << cl << "\"";
- }
- ostr << " >\n";
-
- // transform lamp co & vec back to world
- float lpco[3], lpvec[3];
- MTC_cp3Float(lamp->co, lpco);
- MTC_Mat4MulVecfl(iview, lpco);
- MTC_cp3Float(lamp->vec, lpvec);
- MTC_Mat4Mul3Vecfl(iview, lpvec);
-
- // position, (==-blendir for sun/hemi)
- if ((lamp->type==LA_SUN) || (lamp->type==LA_HEMI))
- ostr << "\t<from x=\"" << -lpvec[0] << "\" y=\"" << -lpvec[1] << "\" z=\"" << -lpvec[2] << "\" />\n";
- else
- ostr << "\t<from x=\"" << lpco[0] << "\" y=\"" << lpco[1] << "\" z=\"" << lpco[2] << "\" />\n";
- // 'to' for spot/photonlight, already calculated by Blender
- if ((lamp->type==LA_SPOT) || (lamp->type==LA_YF_PHOTON)) {
- ostr << "\t<to x=\"" << lpco[0] + lpvec[0]
- << "\" y=\"" << lpco[1] + lpvec[1]
- << "\" z=\"" << lpco[2] + lpvec[2] << "\" />\n";
- if (has_halo) ostr << "\t<fog r=\"1\" g=\"1\" b=\"1\" />\n";
- }
-
- // color
- // rgb in LampRen is premultiplied by energy, power is compensated for that above
- ostr << "\t<color r=\"" << lamp->r << "\" g=\"" << lamp->g << "\" b=\"" << lamp->b << "\" />\n";
- ostr << "</light>\n\n";
- xmlfile << ostr.str();
- }
-}
-
-// write main camera
-void yafrayFileRender_t::writeCamera()
-{
- // here Global used again
- ostr.str("");
- ostr << "<camera name=\"MAINCAM\" ";
- if (re->r.mode & R_ORTHO)
- ostr << "type=\"ortho\"";
- else
- ostr << "type=\"perspective\"";
-
- // render resolution including the percentage buttons
- ostr << " resx=\"" << re->winx << "\" resy=\"" << re->winy << "\"";
-
- float f_aspect = 1;
- if ((re->winx * re->r.xasp) <= (re->winy * re->r.yasp))
- f_aspect = float(re->winx * re->r.xasp) / float(re->winy * re->r.yasp);
- ostr << "\n\tfocal=\"" << mainCamLens/(f_aspect*32.f);
- // bug #4532, when field rendering is enabled, ycor is doubled
- if (re->r.mode & R_FIELDS)
- ostr << "\" aspect_ratio=\"" << (re->ycor * 0.5f) << "\"";
- else
- ostr << "\" aspect_ratio=\"" << re->ycor << "\"";
-
-
- // dof params, only valid for real camera
- float fdist = 1; // only changes for ortho
- if (maincam_obj->type==OB_CAMERA) {
- Camera* cam = (Camera*)maincam_obj->data;
- if (re->r.mode & R_ORTHO) fdist = cam->ortho_scale*(mainCamLens/32.f);
- ostr << "\n\tdof_distance=\"" << cam->YF_dofdist << "\"";
- ostr << " aperture=\"" << cam->YF_aperture << "\"";
- string st = "on";
- if (cam->flag & CAM_YF_NO_QMC) st = "off";
- ostr << " use_qmc=\"" << st << "\"";
- // bokeh params
- st = "disk1";
- if (cam->YF_bkhtype==1)
- st = "disk2";
- else if (cam->YF_bkhtype==2)
- st = "triangle";
- else if (cam->YF_bkhtype==3)
- st = "square";
- else if (cam->YF_bkhtype==4)
- st = "pentagon";
- else if (cam->YF_bkhtype==5)
- st = "hexagon";
- else if (cam->YF_bkhtype==6)
- st = "ring";
- ostr << "\n\tbokeh_type=\"" << st << "\"";
- st = "uniform";
- if (cam->YF_bkhbias==1)
- st = "center";
- else if (cam->YF_bkhbias==2)
- st = "edge";
- ostr << " bokeh_bias=\"" << st << "\"";
- ostr << " bokeh_rotation=\"" << cam->YF_bkhrot << "\"";
- }
-
- ostr << " >\n";
- xmlfile << ostr.str();
-
- ostr.str("");
- ostr << "\t<from x=\"" << maincam_obj->obmat[3][0] << "\""
- << " y=\"" << maincam_obj->obmat[3][1] << "\""
- << " z=\"" << maincam_obj->obmat[3][2] << "\" />\n";
- ostr << "\t<to x=\"" << maincam_obj->obmat[3][0] - fdist * re->viewmat[0][2]
- << "\" y=\"" << maincam_obj->obmat[3][1] - fdist * re->viewmat[1][2]
- << "\" z=\"" << maincam_obj->obmat[3][2] - fdist * re->viewmat[2][2] << "\" />\n";
- ostr << "\t<up x=\"" << maincam_obj->obmat[3][0] + re->viewmat[0][1]
- << "\" y=\"" << maincam_obj->obmat[3][1] + re->viewmat[1][1]
- << "\" z=\"" << maincam_obj->obmat[3][2] + re->viewmat[2][1] << "\" />\n";
- xmlfile << ostr.str();
-
- xmlfile << "</camera>\n\n";
-}
-
-void yafrayFileRender_t::writeHemilight()
-{
- World *world = re->scene->world;
- bool fromAO = false;
- if (re->r.GIquality==6){
- // use Blender AO params is possible
- if (world==NULL) return;
- if ((world->mode & WO_AMB_OCC)==0) {
- // no AO, use default GIquality
- cout << "No ambient occlusion enabled\nUsing defaults of 25 samples & infinite distance instead" << endl;
- }
- else fromAO = true;
- }
- ostr.str("");
- if (re->r.GIcache) {
- ostr << "<light type=\"pathlight\" name=\"path_LT\" power=\"" << re->r.GIpower << "\" mode=\"occlusion\"";
- ostr << "\n\tcache=\"on\" use_QMC=\"on\" threshold=\"" << re->r.GIrefinement << "\" "
- << "cache_size=\"" << ((2.0/float(re->winx))*re->r.GIpixelspersample) << "\"";
- ostr << "\n\tshadow_threshold=\"" << (1.0-re->r.GIshadowquality) << "\" grid=\"82\" search=\"35\"";
- ostr << "\n\tignore_bumpnormals=\"" << (re->r.YF_nobump ? "on" : "off") << "\"";
- if (fromAO) {
- // for AO, with cache, using range of 32*1 to 32*16 seems good enough
- ostr << "\n\tsamples=\"" << 32*world->aosamp << "\" maxdistance=\"" << world->aodist << "\" >\n";
- }
- else {
- switch (re->r.GIquality)
- {
- case 1 : ostr << " samples=\"128\" >\n"; break;
- case 2 : ostr << " samples=\"256\" >\n"; break;
- case 3 : ostr << " samples=\"512\" >\n"; break;
- case 4 : ostr << " samples=\"1024\" >\n"; break;
- case 5 : ostr << " samples=\"2048\" >\n"; break;
- default: ostr << " samples=\"256\" >\n";
- }
- }
- }
- else {
- ostr << "<light type=\"hemilight\" name=\"hemi_LT\" power=\"" << re->r.GIpower << "\"";
- if (fromAO) {
- // use minimum of 4 samples for lowest sample setting, single sample way too noisy
- ostr << "\n\tsamples=\"" << 3 + world->aosamp*world->aosamp
- << "\" maxdistance=\"" << world->aodist
- << "\" use_QMC=\"" << ((world->aomode & WO_AORNDSMP) ? "off" : "on") << "\" >\n";
- }
- else {
- switch (re->r.GIquality)
- {
- case 1 :
- case 2 : ostr << " samples=\"16\" >\n"; break;
- case 3 : ostr << " samples=\"36\" >\n"; break;
- case 4 : ostr << " samples=\"64\" >\n"; break;
- case 5 : ostr << " samples=\"128\" >\n"; break;
- default: ostr << " samples=\"25\" >\n";
- }
- }
- }
- ostr << "</light>\n\n";
- xmlfile << ostr.str();
-}
-
-void yafrayFileRender_t::writePathlight()
-{
- ostr.str("");
- if (re->r.GIphotons)
- {
- ostr << "<light type=\"globalphotonlight\" name=\"gpm\" photons=\"" << re->r.GIphotoncount << "\"" << endl;
- ostr << "\tradius=\"" << re->r.GIphotonradius << "\" depth=\"" << ((re->r.GIdepth>2) ? (re->r.GIdepth-1) : 1)
- << "\" caus_depth=\"" << re->r.GIcausdepth << "\" search=\"" << re->r.GImixphotons << "\" >"<<endl;
- ostr << "</light>"<<endl;
- }
- ostr << "<light type=\"pathlight\" name=\"path_LT\" power=\"" << re->r.GIindirpower << "\"";
- ostr << " depth=\"" << ((re->r.GIphotons) ? 1 : re->r.GIdepth) << "\" caus_depth=\"" << re->r.GIcausdepth <<"\"\n";
- if (re->r.GIdirect && re->r.GIphotons) ostr << "direct=\"on\"" << endl;
- if (re->r.GIcache && !(re->r.GIdirect && re->r.GIphotons))
- {
- switch (re->r.GIquality)
- {
- case 1 : ostr << " samples=\"128\" \n"; break;
- case 2 : ostr << " samples=\"256\" \n"; break;
- case 3 : ostr << " samples=\"512\" \n"; break;
- case 4 : ostr << " samples=\"1024\" \n"; break;
- case 5 : ostr << " samples=\"2048\" \n"; break;
- default: ostr << " samples=\"512\" \n";
- }
- ostr << " cache=\"on\" use_QMC=\"on\" threshold=\"" << re->r.GIrefinement << "\"" << endl;
- ostr << "\tignore_bumpnormals=\"" << (re->r.YF_nobump ? "on" : "off") << "\"\n";
- float sbase = 2.0/float(re->winx);
- ostr << "\tcache_size=\"" << sbase*re->r.GIpixelspersample << "\" shadow_threshold=\"" <<
- 1.0-re->r.GIshadowquality << "\" grid=\"82\" search=\"35\" >\n";
- }
- else
- {
- switch (re->r.GIquality)
- {
- case 1 : ostr << " samples=\"16\" >\n"; break;
- case 2 : ostr << " samples=\"36\" >\n"; break;
- case 3 : ostr << " samples=\"64\" >\n"; break;
- case 4 : ostr << " samples=\"128\" >\n"; break;
- case 5 : ostr << " samples=\"256\" >\n"; break;
- default: ostr << " samples=\"25\" >\n";
- }
- }
- ostr << "</light>\n\n";
- xmlfile << ostr.str();
-}
-
-bool yafrayFileRender_t::writeWorld()
-{
- World *world = re->scene->world;
- if (re->r.GIquality!=0) {
- if (re->r.GImethod==1) {
- if (world==NULL) cout << "WARNING: need world background for skydome!\n";
- writeHemilight();
- }
- else if (re->r.GImethod==2) writePathlight();
- }
-
- if (world==NULL) return false;
-
- for (int i=0;i<MAX_MTEX;i++) {
- MTex* wtex = world->mtex[i];
- if (!wtex) continue;
- Image* wimg = wtex->tex->ima;
- // now always exports if image used as world texture (and 'Hori' mapping enabled)
- if ((wtex->tex->type==TEX_IMAGE) && (wimg!=NULL) && (wtex->mapto & WOMAP_HORIZ)) {
- string wt_path = wimg->name;
- adjustPath(wt_path);
- ostr.str("");
- ostr << "<background type=\"image\" name=\"world_background\" ";
- // exposure_adjust not restricted to integer range anymore
- ostr << "exposure_adjust=\"" << wtex->tex->bright-1.f << "\"";
- if (wtex->texco & TEXCO_ANGMAP)
- ostr << " mapping=\"probe\" >\n";
- else if (wtex->texco & TEXCO_H_SPHEREMAP) // in yafray full sphere
- ostr << " mapping=\"sphere\" >\n";
- else // assume 'tube' for anything else
- ostr << " mapping=\"tube\" >\n";
- ostr << "\t<filename value=\"" << wt_path << "\" />\n";
- ostr << "\t<interpolate value=\"" << ((wtex->tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n";
- if (wtex->tex->filtersize>1.f) ostr << "\t<prefilter value=\"on\" />\n";
- ostr << "</background>\n\n";
- xmlfile << ostr.str();
- return true;
- }
- }
-
- ostr.str("");
- ostr << "<background type=\"constant\" name=\"world_background\" >\n";
- // if no GI used, the GIpower parameter is not always initialized, so in that case ignore it
- // (have to change method to init yafray vars in Blender)
- float bg_mult = (re->r.GImethod==0) ? 1 : re->r.GIpower;
- ostr << "\t<color r=\"" << (world->horr * bg_mult) <<
- "\" g=\"" << (world->horg * bg_mult) <<
- "\" b=\"" << (world->horb * bg_mult) << "\" />\n";
- ostr << "</background>\n\n";
- xmlfile << ostr.str();
-
- return true;
-}
-
-bool yafrayFileRender_t::executeYafray(const string &xmlpath)
-{
- ostr.str("");
- if (re->r.mode & R_BORDER) {
- ostr << command_path << "yafray -c " << re->r.threads
- << " -r " << (2.f*re->r.border.xmin - 1.f)
- << ":" << (2.f*re->r.border.xmax - 1.f)
- << ":" << (2.f*re->r.border.ymin - 1.f)
- << ":" << (2.f*re->r.border.ymax - 1.f)
- << " \"" << xmlpath << "\"";
- }
- else
- ostr << command_path << "yafray -c " << re->r.threads << " \"" << xmlpath << "\"";
-
- string command = ostr.str();
- cout << "COMMAND: " << command << endl;
-#ifndef WIN32
- sigset_t yaf,old;
- sigemptyset(&yaf);
- sigaddset(&yaf, SIGVTALRM);
- sigprocmask(SIG_BLOCK, &yaf, &old);
- int ret=system(command.c_str());
- sigprocmask(SIG_SETMASK, &old, NULL);
- if (WIFEXITED(ret))
- {
- if (WEXITSTATUS(ret)) cout<<"Executed -"<<command<<"-"<<endl;
- switch (WEXITSTATUS(ret))
- {
- case 0: cout << "Yafray completed successfully\n"; return true;
- case 127: cout << "Yafray not found\n"; return false;
- case 126: cout << "Yafray: permission denied\n"; return false;
- default: cout << "Yafray exited with errors\n"; return false;
- }
- }
- else if (WIFSIGNALED(ret))
- cout << "Yafray crashed\n";
- else
- cout << "Unknown error\n";
- return false;
-#else
- int ret=system(command.c_str());
- return ret==0;
-#endif
-
-}
diff --git a/source/blender/yafray/intern/export_File.h b/source/blender/yafray/intern/export_File.h
deleted file mode 100644
index 0eb1bfec1ed..00000000000
--- a/source/blender/yafray/intern/export_File.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef __EXPORT_FILE_H
-#define __EXPORT_FILE_H
-
-#include"yafray_Render.h"
-
-class yafrayFileRender_t : public yafrayRender_t
-{
- public:
- virtual ~yafrayFileRender_t() {}
- protected:
- std::string imgout;
- std::ofstream xmlfile;
- std::string xmlpath;
- std::ostringstream ostr;
-
- void displayImage();
- bool executeYafray(const std::string &xmlpath);
- virtual void writeTextures();
- virtual void writeShader(const std::string &shader_name, Material* matr, const std::string &facetexname="");
- virtual void writeMaterialsAndModulators();
- virtual void writeObject(Object* obj, ObjectRen *obr, const std::vector<VlakRen*> &VLR_list, const float obmat[4][4]);
- virtual void writeAllObjects();
- virtual void writeAreaLamp(LampRen* lamp, int num, float iview[4][4]);
- virtual void writeLamps();
- virtual void writeCamera();
- virtual void writeHemilight();
- virtual void writePathlight();
- virtual bool writeWorld();
- virtual bool writeRender();
- virtual bool initExport();
- virtual bool finishExport();
-};
-
-#endif
diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp
deleted file mode 100644
index 9d537f18667..00000000000
--- a/source/blender/yafray/intern/export_Plugin.cpp
+++ /dev/null
@@ -1,1990 +0,0 @@
-#include "export_Plugin.h"
-
-#include <math.h>
-
-#include <cstring>
-
-using namespace std;
-
-
-#ifdef WIN32
-#define WIN32_SKIP_HKEY_PROTECTION
-#include "BLI_winstuff.h"
-
-#ifndef FILE_MAXDIR
-#define FILE_MAXDIR 160
-#endif
-
-#ifndef FILE_MAXFILE
-#define FILE_MAXFILE 80
-#endif
-
-
-static string find_path()
-{
- HKEY hkey;
- DWORD dwType, dwSize;
-
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\YafRay Team\\YafRay",0,KEY_READ,&hkey)==ERROR_SUCCESS)
- {
- dwType = REG_EXPAND_SZ;
- dwSize = MAX_PATH;
- DWORD dwStat;
-
- char *pInstallDir=new char[MAX_PATH];
-
- dwStat=RegQueryValueEx(hkey, TEXT("InstallDir"),
- NULL, NULL,(LPBYTE)pInstallDir, &dwSize);
-
- if (dwStat == NO_ERROR)
- {
- string res=pInstallDir;
- delete [] pInstallDir;
- return res;
- }
- else
- cout << "Couldn't READ \'InstallDir\' value. Is yafray correctly installed?\n";
- delete [] pInstallDir;
-
- RegCloseKey(hkey);
- }
- else
- cout << "Couldn't FIND registry key for yafray, is it installed?\n";
-
- return string("");
-
-}
-
-static int createDir(char* name)
-{
- if (BLI_exists(name))
- return 2; //exists
- if (CreateDirectory((LPCTSTR)(name), NULL)) {
- cout << "Directory: " << name << " created\n";
- return 1; // created
- }
- else {
- cout << "Could not create directory: " << name << endl;
- return 0; // fail
- }
-}
-
-extern "C" { extern char bprogname[]; }
-
-// add drive character if not in path string, using blender executable location as reference
-static void addDrive(string &path)
-{
- size_t sp = path.find_first_of(":");
- if (sp==-1) {
- string blpath = bprogname;
- sp = blpath.find_first_of(":");
- if (sp!=-1) path = blpath.substr(0, sp+1) + path;
- }
-}
-
-#else
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#endif
-
-static string YafrayPath()
-{
-#ifdef WIN32
- string path=find_path();
- return path;
-#else
- static const char *alternative[]=
- {
- "/usr/local/lib/",
-#ifdef __x86_64__
- "/usr/lib64/",
-#endif
- "/usr/lib/",
- NULL
- };
-
- for(int i=0;alternative[i]!=NULL;++i)
- {
- string fp = string(alternative[i]) + "libyafrayplugin.so";
- struct stat st;
- if (stat(fp.c_str(), &st)<0) continue;
- if (st.st_mode & S_IROTH) return fp;
- }
- return "";
-#endif
-}
-
-static string YafrayPluginPath()
-{
-#ifdef WIN32
- return find_path()+"\\plugins";
-#else
- static const char *alternative[]=
- {
- "/usr/local/lib/yafray",
-#ifdef __x86_64__
- "/usr/lib64/yafray",
-#endif
- "/usr/lib/yafray",
- NULL
- };
-
- for(int i=0;alternative[i]!=NULL;++i)
- {
- struct stat st;
- if (stat(alternative[i], &st)<0) continue;
- if (S_ISDIR(st.st_mode) && (st.st_mode & S_IXOTH)) return alternative[i];
- }
- return "";
-#endif
-}
-
-
-
-yafrayPluginRender_t::~yafrayPluginRender_t()
-{
- if (yafrayGate!=NULL) delete yafrayGate;
- if (handle!=NULL) PIL_dynlib_close(handle);
-#ifdef WIN32
- if (corehandle!=NULL) PIL_dynlib_close(corehandle);
-#endif
-}
-
-bool yafrayPluginRender_t::initExport()
-{
- // bug #1897: when forcing render without yafray present, handle can be valid,
- // but find_symbol might have failed, trying second time will crash.
- // So make sure plugin loaded correctly and only get handle once.
- if ((!plugin_loaded) || (handle==NULL))
- {
- string location = YafrayPath();
-#ifdef WIN32
- /* Win 32 loader cannot find needed libs in yafray dir, so we have to load them
- * by hand. This could be fixed using setdlldirectory function, but it is not
- * available in all win32 versions
- */
- corehandle = PIL_dynlib_open((char *)(location + "\\yafraycore.dll").c_str());
- if (corehandle==NULL)
- {
- char *err = PIL_dynlib_get_error_as_string(corehandle);
- if (err) cerr << "Error loading yafray plugin: " << err << endl;
- else cerr << "Error loading yafray plugin: Unknown." << endl;
- return false;
- }
- location += "\\yafrayplugin.dll";
-#endif
-
- if (handle==NULL) {
- handle = PIL_dynlib_open((char *)location.c_str());
- if (handle==NULL)
- {
- cerr << "Error loading yafray plugin: " << PIL_dynlib_get_error_as_string(handle) << endl;
- return false;
- }
- }
- yafray::yafrayConstructor *constructor;
- constructor = (yafray::yafrayConstructor *)PIL_dynlib_find_symbol(handle, (char*)YAFRAY_SYMBOL);
- if (constructor==NULL)
- {
- cerr << "Error loading yafray plugin: " << PIL_dynlib_get_error_as_string(handle) << endl;
- return false;
- }
- yafrayGate = constructor(re->r.threads, YafrayPluginPath());
-
- cout << "YafRay plugin loaded" << endl;
- plugin_loaded = true;
- }
-
- return true;
-}
-
-bool yafrayPluginRender_t::writeRender()
-{
- yafray::paramMap_t params;
- params["camera_name"]=yafray::parameter_t("MAINCAM");
- params["raydepth"]=yafray::parameter_t((float)re->r.YF_raydepth);
- params["gamma"]=yafray::parameter_t(re->r.YF_gamma);
- params["exposure"]=yafray::parameter_t(re->r.YF_exposure);
- if (re->r.YF_AA)
- {
- params["AA_passes"] = yafray::parameter_t((int)re->r.YF_AApasses);
- params["AA_minsamples"] = yafray::parameter_t(re->r.YF_AAsamples);
- params["AA_pixelwidth"] = yafray::parameter_t(re->r.YF_AApixelsize);
- params["AA_threshold"] = yafray::parameter_t(re->r.YF_AAthreshold);
- }
- else
- {
- // removed the default AA settings for midquality GI, better leave it to user
- if ((re->r.mode & R_OSA) && (re->r.osa))
- {
- params["AA_passes"] = yafray::parameter_t((re->r.osa & 3)==0 ? (re->r.osa >> 2) : 1);
- params["AA_minsamples"] = yafray::parameter_t((re->r.osa & 3)==0 ? 4 : re->r.osa);
- }
- else
- {
- params["AA_passes"] = yafray::parameter_t(0);
- params["AA_minsamples"] = yafray::parameter_t(1);
- }
- params["AA_pixelwidth"] = yafray::parameter_t(1.5);
- params["AA_threshold"] = yafray::parameter_t(0.05f);
- }
- if (re->r.mode & R_BORDER)
- {
- params["border_xmin"] = yafray::parameter_t(2.f*re->r.border.xmin - 1.f);
- params["border_xmax"] = yafray::parameter_t(2.f*re->r.border.xmax - 1.f);
- params["border_ymin"] = yafray::parameter_t(2.f*re->r.border.ymin - 1.f);
- params["border_ymax"] = yafray::parameter_t(2.f*re->r.border.ymax - 1.f);
- }
- if (hasworld) {
- World *world = re->scene->world;
- if (world->mode & WO_MIST) {
- // basic fog
- float fd = world->mistdist;
- if (fd>0) fd=1.f/fd; else fd=1;
- params["fog_density"] = yafray::parameter_t(fd);
- params["fog_color"] = yafray::parameter_t(yafray::color_t(world->horr, world->horg, world->horb));
- }
- params["background_name"] = yafray::parameter_t("world_background");
- }
- params["bias"] = yafray::parameter_t(re->r.YF_raybias);
- params["clamp_rgb"] = yafray::parameter_t((re->r.YF_clamprgb==0) ? "on" : "off");
- // lynx request
- params["threads"] = yafray::parameter_t((int)re->r.threads);
- blenderYafrayOutput_t output(re);
- yafrayGate->render(params, output);
- cout << "render finished" << endl;
- yafrayGate->clear();
- return true;
-}
-
-bool yafrayPluginRender_t::finishExport()
-{
- return true;
-}
-
-
-// displayImage() not for plugin, see putPixel() below
-
-#ifdef WIN32
-#define MAXPATHLEN MAX_PATH
-#else
-#include <sys/param.h>
-#endif
-static void adjustPath(string &path)
-{
- // if relative, expand to full path
- char cpath[MAXPATHLEN];
- strcpy(cpath, path.c_str());
- BLI_convertstringcode(cpath, G.sce);
- path = cpath;
-#ifdef WIN32
- // add drive char if not there
- addDrive(path);
-#endif
-}
-
-
-static string noise2string(short nbtype)
-{
- switch (nbtype) {
- case TEX_BLENDER:
- return "blender";
- case TEX_STDPERLIN:
- return "stdperlin";
- case TEX_VORONOI_F1:
- return "voronoi_f1";
- case TEX_VORONOI_F2:
- return "voronoi_f2";
- case TEX_VORONOI_F3:
- return "voronoi_f3";
- case TEX_VORONOI_F4:
- return "voronoi_f4";
- case TEX_VORONOI_F2F1:
- return "voronoi_f2f1";
- case TEX_VORONOI_CRACKLE:
- return "voronoi_crackle";
- case TEX_CELLNOISE:
- return "cellnoise";
- default:
- case TEX_NEWPERLIN:
- return "newperlin";
- }
-}
-
-void yafrayPluginRender_t::writeTextures()
-{
- // used to keep track of images already written
- // (to avoid duplicates if also in imagetex for material TexFace texture)
- set<Image*> dupimg;
-
- yafray::paramMap_t params;
- list<yafray::paramMap_t> lparams;
- for (map<string, MTex*>::const_iterator blendtex=used_textures.begin();
- blendtex!=used_textures.end();++blendtex)
- {
- lparams.clear();
- params.clear();
-
- MTex* mtex = blendtex->second;
- Tex* tex = mtex->tex;
- // name is image name instead of texture name when type is image (see TEX_IMAGE case below)
- // (done because of possible combinations of 'TexFace' images and regular image textures, to avoid duplicates)
- if (tex->type!=TEX_IMAGE) params["name"] = yafray::parameter_t(blendtex->first);
-
- float nsz = tex->noisesize;
- if (nsz!=0.f) nsz=1.f/nsz;
-
- // noisebasis type
- string ntype = noise2string(tex->noisebasis);
- string ts, hardnoise=(tex->noisetype==TEX_NOISESOFT) ? "off" : "on";
-
- switch (tex->type) {
- case TEX_STUCCI:
- // stucci is clouds as bump, only difference is an extra parameter to handle wall in/out
- // turbulence value is not used, so for large values will not match well
- case TEX_CLOUDS: {
- params["type"] = yafray::parameter_t("clouds");
- params["size"] = yafray::parameter_t(nsz);
- params["hard"] = yafray::parameter_t(hardnoise);
- if (tex->type==TEX_STUCCI) {
- if (tex->stype==1)
- ts = "positive";
- else if (tex->stype==2)
- ts = "negative";
- else ts = "none";
- params["bias"] = yafray::parameter_t(ts);
- params["depth"] = yafray::parameter_t(0); // for stucci always 0
- }
- else params["depth"] = yafray::parameter_t(tex->noisedepth);
- params["color_type"] = yafray::parameter_t(tex->stype);
- params["noise_type"] = yafray::parameter_t(ntype);
- break;
- }
- case TEX_WOOD:
- {
- params["type"] = yafray::parameter_t("wood");
- // blender does not use depth value for wood, always 0
- params["depth"] = yafray::parameter_t(0);
- float turb = (tex->stype<2) ? 0.0 : tex->turbul;
- params["turbulence"] = yafray::parameter_t(turb);
- params["size"] = yafray::parameter_t(nsz);
- params["hard"] = yafray::parameter_t(hardnoise);
- ts = (tex->stype & 1) ? "rings" : "bands"; //stype 1&3 ringtype
- params["wood_type"] = yafray::parameter_t(ts);
- params["noise_type"] = yafray::parameter_t(ntype);
- // shape parameter, for some reason noisebasis2 is used...
- ts = "sin";
- if (tex->noisebasis2==1) ts="saw"; else if (tex->noisebasis2==2) ts="tri";
- params["shape"] = yafray::parameter_t(ts);
- break;
- }
- case TEX_MARBLE:
- {
- params["type"] = yafray::parameter_t("marble");
- params["depth"] = yafray::parameter_t(tex->noisedepth);
- params["turbulence"] = yafray::parameter_t(tex->turbul);
- params["size"] = yafray::parameter_t(nsz);
- params["hard"] = yafray::parameter_t(hardnoise);
- params["sharpness"] = yafray::parameter_t((float)(1<<tex->stype));
- params["noise_type"] = yafray::parameter_t(ntype);
- ts = "sin";
- if (tex->noisebasis2==1) ts="saw"; else if (tex->noisebasis2==2) ts="tri";
- params["shape"] = yafray::parameter_t(ts);
- break;
- }
- case TEX_VORONOI:
- {
- params["type"] = yafray::parameter_t("voronoi");
- ts = "int";
- if (tex->vn_coltype==1)
- ts = "col1";
- else if (tex->vn_coltype==2)
- ts = "col2";
- else if (tex->vn_coltype==3)
- ts = "col3";
- params["color_type"] = yafray::parameter_t(ts);
- params["weight1"] = yafray::parameter_t(tex->vn_w1);
- params["weight2"] = yafray::parameter_t(tex->vn_w2);
- params["weight3"] = yafray::parameter_t(tex->vn_w3);
- params["weight4"] = yafray::parameter_t(tex->vn_w4);
- params["mk_exponent"] = yafray::parameter_t(tex->vn_mexp);
- params["intensity"] = yafray::parameter_t(tex->ns_outscale);
- params["size"] = yafray::parameter_t(nsz);
- ts = "actual";
- if (tex->vn_distm==TEX_DISTANCE_SQUARED)
- ts = "squared";
- else if (tex->vn_distm==TEX_MANHATTAN)
- ts = "manhattan";
- else if (tex->vn_distm==TEX_CHEBYCHEV)
- ts = "chebychev";
- else if (tex->vn_distm==TEX_MINKOVSKY_HALF)
- ts = "minkovsky_half";
- else if (tex->vn_distm==TEX_MINKOVSKY_FOUR)
- ts = "minkovsky_four";
- else if (tex->vn_distm==TEX_MINKOVSKY)
- ts = "minkovsky";
- params["distance_metric"] = yafray::parameter_t(ts);
- break;
- }
- case TEX_MUSGRAVE:
- {
- params["type"] = yafray::parameter_t("musgrave");
- switch (tex->stype) {
- case TEX_MFRACTAL:
- ts = "multifractal";
- break;
- case TEX_RIDGEDMF:
- ts = "ridgedmf";
- break;
- case TEX_HYBRIDMF:
- ts = "hybridmf";
- break;
- case TEX_HTERRAIN:
- ts = "heteroterrain";
- break;
- default:
- case TEX_FBM:
- ts = "fBm";
- }
- params["musgrave_type"] = yafray::parameter_t(ts);
- params["noise_type"] = yafray::parameter_t(ntype);
- params["H"] = yafray::parameter_t(tex->mg_H);
- params["lacunarity"] = yafray::parameter_t(tex->mg_lacunarity);
- params["octaves"] = yafray::parameter_t(tex->mg_octaves);
- if ((tex->stype==TEX_HTERRAIN) || (tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF)) {
- params["offset"] = yafray::parameter_t(tex->mg_offset);
- if ((tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF))
- params["gain"] = yafray::parameter_t(tex->mg_gain);
- }
- params["size"] = yafray::parameter_t(nsz);
- params["intensity"] = yafray::parameter_t(tex->ns_outscale);
- break;
- }
- case TEX_DISTNOISE:
- {
- params["type"] = yafray::parameter_t("distorted_noise");
- params["distort"] = yafray::parameter_t(tex->dist_amount);
- params["size"] = yafray::parameter_t(nsz);
- params["noise_type1"] = yafray::parameter_t(ntype);
- params["noise_type2"] = yafray::parameter_t(noise2string(tex->noisebasis2));
- break;
- }
- case TEX_BLEND:
- {
- params["type"] = yafray::parameter_t("gradient");
- switch (tex->stype) {
- case 1: ts="quadratic"; break;
- case 2: ts="cubic"; break;
- case 3: ts="diagonal"; break;
- case 4: ts="sphere"; break;
- case 5: ts="halo"; break;
- default:
- case 0: ts="linear"; break;
- }
- params["gradient_type"] = yafray::parameter_t(ts);
- if (tex->flag & TEX_FLIPBLEND) ts="on"; else ts="off";
- params["flip_xy"] = yafray::parameter_t(ts);
- break;
- }
- case TEX_NOISE:
- {
- params["type"] = yafray::parameter_t("random_noise");
- params["depth"] = yafray::parameter_t(tex->noisedepth);
- break;
- }
- case TEX_IMAGE:
- {
- Image* ima = tex->ima;
- if (ima) {
- // remember image to avoid duplicates later if also in imagetex
- // (formerly done by removing from imagetex, but need image/material link)
- dupimg.insert(ima);
- params["type"] = yafray::parameter_t("image");
- params["name"] = yafray::parameter_t(ima->id.name);
- string texpath = ima->name;
- adjustPath(texpath);
- params["filename"] = yafray::parameter_t(texpath);
- params["interpolate"] = yafray::parameter_t((tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none");
- }
- break;
- }
- default:
- cout << "Unsupported texture type\n";
- }
- yafrayGate->addShader(params, lparams);
-
- // colorbands
- if (tex->flag & TEX_COLORBAND)
- {
- ColorBand* cb = tex->coba;
- if (cb)
- {
- lparams.clear();
- params.clear();
- params["type"] = yafray::parameter_t("colorband");
- params["name"] = yafray::parameter_t(blendtex->first + "_coba");
- params["input"] = yafray::parameter_t(blendtex->first);
- for (int i=0;i<cb->tot;i++)
- {
- yafray::paramMap_t mparams;
- mparams["value"] = yafray::parameter_t(cb->data[i].pos);
- mparams["color"] = yafray::parameter_t(yafray::colorA_t(cb->data[i].r,
- cb->data[i].g,
- cb->data[i].b,
- cb->data[i].a));
- lparams.push_back(mparams);
- }
- yafrayGate->addShader(params, lparams);
- }
- }
-
- }
-
- // If used, textures for the material 'TexFace' case
- if (!imagetex.empty()) {
- for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin();
- imgtex!=imagetex.end();++imgtex)
- {
- // skip if already written above
- if (dupimg.find(imgtex->first)==dupimg.end()) {
- lparams.clear();
- params.clear();
- params["name"] = yafray::parameter_t(imgtex->first->id.name);
- params["type"] = yafray::parameter_t("image");
- string texpath(imgtex->first->name);
- adjustPath(texpath);
- params["filename"] = yafray::parameter_t(texpath);
- yafrayGate->addShader(params, lparams);
- }
- }
- }
-
-}
-
-
-void yafrayPluginRender_t::writeShader(const string &shader_name, Material* matr, const string &facetexname)
-{
- yafray::paramMap_t params;
- list<yafray::paramMap_t> lparams;
-
- // if material has ramps, export colorbands first
- if (matr->mode & (MA_RAMP_COL|MA_RAMP_SPEC))
- {
- // both colorbands without input shader
- ColorBand* cb = matr->ramp_col;
- if ((matr->mode & MA_RAMP_COL) && (cb!=NULL))
- {
- params["type"] = yafray::parameter_t("colorband");
- params["name"] = yafray::parameter_t(shader_name+"_difframp");
- for (int i=0;i<cb->tot;i++) {
- yafray::paramMap_t mparams;
- mparams["value"] = yafray::parameter_t(cb->data[i].pos);
- mparams["color"] = yafray::parameter_t(yafray::colorA_t(cb->data[i].r, cb->data[i].g, cb->data[i].b, cb->data[i].a));
- lparams.push_back(mparams);
- }
- yafrayGate->addShader(params, lparams);
- }
- cb = matr->ramp_spec;
- if ((matr->mode & MA_RAMP_SPEC) && (cb!=NULL))
- {
- lparams.clear();
- params.clear();
- params["type"] = yafray::parameter_t("colorband");
- params["name"] = yafray::parameter_t(shader_name+"_specramp");
- for (int i=0;i<cb->tot;i++) {
- yafray::paramMap_t mparams;
- mparams["value"] = yafray::parameter_t(cb->data[i].pos);
- mparams["color"] = yafray::parameter_t(yafray::colorA_t(cb->data[i].r, cb->data[i].g, cb->data[i].b, cb->data[i].a));
- lparams.push_back(mparams);
- }
- yafrayGate->addShader(params, lparams);
- }
- lparams.clear();
- params.clear();
- }
-
- params["type"] = yafray::parameter_t("blendershader");
- params["name"] = yafray::parameter_t(shader_name);
- params["color"] = yafray::parameter_t(yafray::color_t(matr->r, matr->g, matr->b));
- float sr=matr->specr, sg=matr->specg, sb=matr->specb;
- if (matr->spec_shader==MA_SPEC_WARDISO) {
- // ........
- sr /= M_PI;
- sg /= M_PI;
- sb /= M_PI;
- }
- params["specular_color"] = yafray::parameter_t(yafray::color_t(sr, sg, sb));
- params["mirror_color"] = yafray::parameter_t(yafray::color_t(matr->mirr, matr->mirg, matr->mirb));
- params["diffuse_reflect"] = yafray::parameter_t(matr->ref);
- params["specular_amount"] = yafray::parameter_t(matr->spec);
- params["alpha"] = yafray::parameter_t(matr->alpha);
-
- // if no GI used, the GIpower parameter is not always initialized, so in that case ignore it
- float bg_mult = (re->r.GImethod==0) ? 1 : re->r.GIpower;
- params["emit"]=yafray::parameter_t(matr->emit*bg_mult);
-
- // reflection/refraction
- if ( (matr->mode & MA_RAYMIRROR) || (matr->mode & MA_RAYTRANSP) )
- params["IOR"] = yafray::parameter_t(matr->ang);
-
- if (matr->mode & MA_RAYMIRROR)
- {
- // Sofar yafray's min_refle parameter (which misleadingly actually controls fresnel reflection offset)
- // has been mapped to Blender's ray_mirror parameter.
- // This causes it be be misinterpreted and misused as a reflection amount control however.
- // Besides that, it also causes extra complications for the yafray Blendershader.
- // So added an actual amount of reflection parameter instead, and another
- // extra parameter 'frsOfs' to actually control fresnel offset (re-uses Blender fresnel_mir_i param).
- params["reflect"] = yafray::parameter_t("on");
- params["reflect_amount"] = yafray::parameter_t(matr->ray_mirror);
- float fo = 1.f-(matr->fresnel_mir_i-1.f)*0.25f; // blender param range [1,5], also here reversed (1 in Blender -> no fresnel)
- params["fresnel_offset"] = yafray::parameter_t(fo);
-
- // for backward compatibility, also add old 'reflected' parameter, copy of mirror_color
- params["reflected"] = yafray::parameter_t(yafray::color_t(matr->mirr, matr->mirg, matr->mirb));
- // same for 'min_refle' param. Instead of the ray_mirror parameter that was used before, since now
- // the parameter's function is taken over by the fresnel offset parameter, use that instead.
- params["min_refle"] = yafray::parameter_t(fo);
-
- }
-
- if (matr->mode & MA_RAYTRANSP)
- {
- params["refract"] = yafray::parameter_t("on");
- params["transmit_filter"] = yafray::parameter_t(matr->filter);
- // tir on by default
- params["tir"] = yafray::parameter_t("on");
-
- // transmit absorption color
- // to make things easier(?) for user it now specifies the actual color at 1 unit / YF_dscale of distance
- const float maxlog = -log(1e-38);
- float ar = (matr->YF_ar>0) ? -log(matr->YF_ar) : maxlog;
- float ag = (matr->YF_ag>0) ? -log(matr->YF_ag) : maxlog;
- float ab = (matr->YF_ab>0) ? -log(matr->YF_ab) : maxlog;
- float sc = matr->YF_dscale;
- if (sc!=0.f) sc=1.f/sc;
- params["absorption"] = yafray::parameter_t(yafray::color_t(ar*sc, ag*sc, ab*sc));
- // dispersion
- params["dispersion_power"] = yafray::parameter_t(matr->YF_dpwr);
- params["dispersion_samples"] = yafray::parameter_t(matr->YF_dsmp);
- params["dispersion_jitter"] = yafray::parameter_t(matr->YF_djit ? "on" : "off");
-
- // for backward compatibility, also add old 'transmitted' parameter, copy of 'color' * (1-alpha)
- float na = 1.f-matr->alpha;
- params["transmitted"] = yafray::parameter_t(yafray::color_t(matr->r*na, matr->g*na, matr->b*na));
- }
-
- string Mmode = "";
- if (matr->mode & MA_TRACEBLE) Mmode += "traceable";
- if (matr->mode & MA_SHADOW) Mmode += " shadow";
- if (matr->mode & MA_SHLESS) Mmode += " shadeless";
- if (matr->mode & MA_VERTEXCOL) Mmode += " vcol_light";
- if (matr->mode & MA_VERTEXCOLP) Mmode += " vcol_paint";
- if (matr->mode & MA_ZTRA) Mmode += " ztransp";
- if (matr->mode & MA_ONLYSHADOW) Mmode += " onlyshadow";
- if (Mmode!="") params["matmodes"] = yafray::parameter_t(Mmode);
-
- // diffuse & specular brdf, lambert/cooktorr defaults
- // diffuse
- if (matr->diff_shader==MA_DIFF_ORENNAYAR) {
- params["diffuse_brdf"] = yafray::parameter_t("oren_nayar");
- params["roughness"] = yafray::parameter_t(matr->roughness);
- }
- else if (matr->diff_shader==MA_DIFF_TOON) {
- params["diffuse_brdf"] = yafray::parameter_t("toon");
- params["toondiffuse_size"] = yafray::parameter_t(matr->param[0]);
- params["toondiffuse_smooth"] = yafray::parameter_t(matr->param[1]);
- }
- else if (matr->diff_shader==MA_DIFF_MINNAERT) {
- params["diffuse_brdf"] = yafray::parameter_t("minnaert");
- params["darkening"] = yafray::parameter_t(matr->darkness);
- }
- else params["diffuse_brdf"] = yafray::parameter_t("lambert");
- // specular
- if (matr->spec_shader==MA_SPEC_PHONG) {
- params["specular_brdf"] = yafray::parameter_t("phong");
- params["hard"] = yafray::parameter_t(matr->har);
- }
- else if (matr->spec_shader==MA_SPEC_BLINN) {
- params["specular_brdf"] = yafray::parameter_t("blinn");
- params["blinn_ior"] = yafray::parameter_t(matr->refrac);
- params["hard"] = yafray::parameter_t(matr->har);
- }
- else if (matr->spec_shader==MA_SPEC_TOON) {
- params["specular_brdf"] = yafray::parameter_t("toon");
- params["toonspecular_size"] = yafray::parameter_t(matr->param[2]);
- params["toonspecular_smooth"] = yafray::parameter_t(matr->param[3]);
- }
- else if (matr->spec_shader==MA_SPEC_WARDISO) {
- params["specular_brdf"] = yafray::parameter_t("ward");
- params["u_roughness"] = yafray::parameter_t(matr->rms);
- params["v_roughness"] = yafray::parameter_t(matr->rms);
- }
- else {
- params["specular_brdf"] = yafray::parameter_t("blender_cooktorr");
- params["hard"] = yafray::parameter_t(matr->har);
- }
-
- // ramps, if used
- if (matr->mode & (MA_RAMP_COL|MA_RAMP_SPEC))
- {
- const string rm_blend[9] = {"mix", "add", "mul", "sub", "screen", "divide", "difference", "darken", "lighten"};
- const string rm_mode[4] = {"shader", "energy", "normal", "result"};
- // diffuse
- if ((matr->mode & MA_RAMP_COL) && (matr->ramp_col!=NULL))
- {
- params["diffuse_ramp"] = yafray::parameter_t(shader_name+"_difframp");
- params["diffuse_ramp_mode"] = yafray::parameter_t(rm_mode[(int)matr->rampin_col]);
- params["diffuse_ramp_blend"] = yafray::parameter_t(rm_blend[(int)matr->rampblend_col]);
- params["diffuse_ramp_factor"] = yafray::parameter_t(matr->rampfac_col);
- }
- // specular
- if ((matr->mode & MA_RAMP_SPEC) && (matr->ramp_spec!=NULL)) {
- params["specular_ramp"] = yafray::parameter_t(shader_name+"_specramp");
- params["specular_ramp_mode"] = yafray::parameter_t(rm_mode[(int)matr->rampin_spec]);
- params["specular_ramp_blend"] = yafray::parameter_t(rm_blend[(int)matr->rampblend_spec]);
- params["specular_ramp_factor"] = yafray::parameter_t(matr->rampfac_spec);
- }
- }
-
- // modulators
- // first modulator is the texture of the face, if used (TexFace mode)
- if (facetexname.length()!=0) {
- yafray::paramMap_t mparams;
- mparams["input"] = yafray::parameter_t(facetexname);
- mparams["color"] = yafray::parameter_t(1);
- lparams.push_back(mparams);
- }
-
- for (int m2=0;m2<MAX_MTEX;m2++)
- {
- if (matr->septex & (1<<m2)) continue;// all active channels
- // ignore null mtex
- MTex* mtex = matr->mtex[m2];
- if (mtex==NULL) continue;
- // ignore null tex
- Tex* tex = mtex->tex;
- if (tex==NULL) continue;
-
- map<string, MTex*>::const_iterator mtexL = used_textures.find(string(tex->id.name));
- if (mtexL!=used_textures.end())
- {
- yafray::paramMap_t mparams;
- // when no facetex used, shader_name is created from original material name
- char temp[32];
- sprintf(temp,"_map%d", m2);
- if (facetexname.length()!=0)
- mparams["input"] = yafray::parameter_t(string(matr->id.name) + string(temp));
- else
- mparams["input"] = yafray::parameter_t(shader_name + temp);
-
- // blendtype, would have been nice if the order would have been the same as for ramps...
- const string blendtype[MTEX_NUM_BLENDTYPES] = {"mix", "mul", "add", "sub", "divide", "darken", "difference", "lighten", "screen", "hue", "sat", "val", "color"};
- mparams["mode"] = yafray::parameter_t(blendtype[(int)mtex->blendtype]);
-
- // texture color (for use with MUL and/or no_rgb etc..)
- mparams["texcol"]=yafray::parameter_t(yafray::color_t(mtex->r,mtex->g,mtex->b));
- // texture contrast, brightness & color adjustment
- mparams["filtercolor"]=yafray::parameter_t(yafray::color_t(tex->rfac,tex->gfac,tex->bfac));
- mparams["contrast"]=yafray::parameter_t(tex->contrast);
- mparams["brightness"]=yafray::parameter_t(tex->bright);
- // all texture flags now are switches, having the value 1 or -1 (negative option)
- // the negative option only used for the intensity modulation options.
-
- // material (diffuse) color, amount controlled by colfac (see below)
- if (mtex->mapto & MAP_COL)
- mparams["color"]=yafray::parameter_t(1.0);
- // bumpmapping
- if ((mtex->mapto & MAP_NORM) || (mtex->maptoneg & MAP_NORM))
- {
- // for yafray, bump factor is negated (unless tex is stucci, not affected by 'Neg')
- // scaled down quite a bit
- float nf = mtex->norfac;
- if (tex->type!=TEX_STUCCI) nf *= -1.f;
- if (mtex->maptoneg & MAP_NORM) nf *= -1.f;
- mparams["normal"] = yafray::parameter_t(nf/60.f);
- }
-
- // all blender texture modulation as switches, either 1 or -1 (negative state of button)
- // Csp, specular color modulation
- if (mtex->mapto & MAP_COLSPEC)
- mparams["colspec"] = yafray::parameter_t(1.0);
- // CMir, mirror color modulation
- if (mtex->mapto & MAP_COLMIR)
- mparams["colmir"] = yafray::parameter_t(1.0);
-
- // Ref, diffuse reflection amount modulation
- if ((mtex->mapto & MAP_REF) || (mtex->maptoneg & MAP_REF))
- {
- int t = 1;
- if (mtex->maptoneg & MAP_REF) t = -1;
- mparams["difref"] = yafray::parameter_t(t);
- }
-
- // Spec, specular amount mod
- if ((mtex->mapto & MAP_SPEC) || (mtex->maptoneg & MAP_SPEC))
- {
- int t = 1;
- if (mtex->maptoneg & MAP_SPEC) t = -1;
- mparams["specular"] = yafray::parameter_t(t);
- }
-
- // hardness modulation
- if ((mtex->mapto & MAP_HAR) || (mtex->maptoneg & MAP_HAR))
- {
- int t = 1;
- if (mtex->maptoneg & MAP_HAR) t = -1;
- mparams["hard"] = yafray::parameter_t(t);
- }
-
- // alpha modulation
- if ((mtex->mapto & MAP_ALPHA) || (mtex->maptoneg & MAP_ALPHA))
- {
- int t = 1;
- if (mtex->maptoneg & MAP_ALPHA) t = -1;
- mparams["alpha"] = yafray::parameter_t(t);
- }
-
- // emit modulation
- if ((mtex->mapto & MAP_EMIT) || (mtex->maptoneg & MAP_EMIT)) {
- int t = 1;
- if (mtex->maptoneg & MAP_EMIT) t = -1;
- mparams["emit"] = yafray::parameter_t(t);
- }
-
- // raymir modulation
- if ((mtex->mapto & MAP_RAYMIRR) || (mtex->maptoneg & MAP_RAYMIRR)) {
- int t = 1;
- if (mtex->maptoneg & MAP_RAYMIRR) t = -1;
- mparams["raymir"] = yafray::parameter_t(t);
- }
-
- // texture flag, combination of strings
- string ts;
- if (mtex->texflag & (MTEX_RGBTOINT | MTEX_STENCIL | MTEX_NEGATIVE)) {
- ts = "";
- if (mtex->texflag & MTEX_RGBTOINT) ts += "no_rgb ";
- if (mtex->texflag & MTEX_STENCIL) ts += "stencil ";
- if (mtex->texflag & MTEX_NEGATIVE) ts += "negative";
- mparams["texflag"]=yafray::parameter_t(ts);
- }
-
- // colfac, controls amount of color modulation
- mparams["colfac"]=yafray::parameter_t(mtex->colfac);
- // def_var
- mparams["def_var"]=yafray::parameter_t(mtex->def_var);
- //varfac
- mparams["varfac"]=yafray::parameter_t(mtex->varfac);
-
- if ((tex->imaflag & (TEX_CALCALPHA | TEX_USEALPHA)) || (tex->flag & TEX_NEGALPHA))
- {
- ts = "";
- if (tex->imaflag & TEX_CALCALPHA) ts += "calc_alpha ";
- if (tex->imaflag & TEX_USEALPHA) ts += "use_alpha ";
- if (tex->flag & TEX_NEGALPHA) ts += "neg_alpha";
- mparams["alpha_flag"] = yafray::parameter_t(ts);
- }
-
- // image as normalmap flag
- if (tex->imaflag & TEX_NORMALMAP) mparams["normalmap"] = yafray::parameter_t("on");
-
- lparams.push_back(mparams);
- }
- }
- yafrayGate->addShader(params, lparams);
-
-}
-
-// write all materials & modulators
-void yafrayPluginRender_t::writeMaterialsAndModulators()
-{
- // shaders/mappers for regular texture (or non-texture) mode
- // In case material has texface mode, and all faces have an image texture,
- // this shader will not be used, but still be written
- yafray::paramMap_t params;
- list<yafray::paramMap_t> lparams;
- for (map<string, Material*>::const_iterator blendmat=used_materials.begin();
- blendmat!=used_materials.end();++blendmat)
- {
- Material* matr = blendmat->second;
- // mapper(s)
- for (int m=0;m<MAX_MTEX;m++)
- {
- if (matr->septex & (1<<m)) continue;// all active channels
- // ignore null mtex
- MTex* mtex = matr->mtex[m];
- if (mtex==NULL) continue;
- // ignore null tex
- Tex* tex = mtex->tex;
- if (tex==NULL) continue;
-
- map<string, MTex*>::const_iterator mtexL = used_textures.find(string(tex->id.name));
- if (mtexL!=used_textures.end())
- {
- params.clear(); //!!!
- lparams.clear();
- char temp[32];
- sprintf(temp, "_map%d", m);
- params["type"] = yafray::parameter_t("blendermapper");
- params["name"] = yafray::parameter_t(blendmat->first + string(temp));
- if ((mtex->texco & TEXCO_OBJECT) || (mtex->texco & TEXCO_REFL) || (mtex->texco & TEXCO_NORM))
- {
- // For object, reflection & normal mapping, add the object matrix to the modulator,
- // as in LF script, use camera matrix if no object specified.
- // In this case this means the inverse of that matrix
- float texmat[4][4], itexmat[4][4];
- if ((mtex->texco & TEXCO_OBJECT) && (mtex->object))
- MTC_Mat4CpyMat4(texmat, mtex->object->obmat);
- else // also for refl. map
- MTC_Mat4CpyMat4(texmat, maincam_obj->obmat);
- MTC_Mat4Invert(itexmat, texmat);
-#define flp yafray::parameter_t
- params["m00"]=flp(itexmat[0][0]); params["m01"]=flp(itexmat[1][0]);
- params["m02"]=flp(itexmat[2][0]); params["m03"]=flp(itexmat[3][0]);
- params["m10"]=flp(itexmat[0][1]); params["m11"]=flp(itexmat[1][1]);
- params["m12"]=flp(itexmat[2][1]); params["m13"]=flp(itexmat[3][1]);
- params["m20"]=flp(itexmat[0][2]); params["m21"]=flp(itexmat[1][2]);
- params["m22"]=flp(itexmat[2][2]); params["m23"]=flp(itexmat[3][2]);
- params["m30"]=flp(itexmat[0][3]); params["m31"]=flp(itexmat[1][3]);
- params["m32"]=flp(itexmat[2][3]); params["m33"]=flp(itexmat[3][3]);
-#undef flp
- }
- // use image name instead of texname when texture is image
- if ((tex->type==TEX_IMAGE) && tex->ima)
- params["input"] = yafray::parameter_t(tex->ima->id.name);
- else if ((tex->flag & TEX_COLORBAND) & (tex->coba!=NULL))
- params["input"] = yafray::parameter_t(mtexL->first + "_coba");
- else
- params["input"] = yafray::parameter_t(mtexL->first);
-
- // texture size
- params["sizex"] = yafray::parameter_t(mtex->size[0]);
- params["sizey"] = yafray::parameter_t(mtex->size[1]);
- params["sizez"] = yafray::parameter_t(mtex->size[2]);
-
- // texture offset
- params["ofsx"] = yafray::parameter_t(mtex->ofs[0]);
- params["ofsy"] = yafray::parameter_t(mtex->ofs[1]);
- params["ofsz"] = yafray::parameter_t(mtex->ofs[2]);
-
- // texture coordinates, have to disable 'sticky' in Blender
- if (mtex->texco & TEXCO_UV)
- params["texco"] = yafray::parameter_t("uv");
- else if ((mtex->texco & TEXCO_GLOB) || (mtex->texco & TEXCO_OBJECT))
- // object mode is also set as global, but the object matrix
- // was specified above with <modulator..>
- params["texco"] = yafray::parameter_t("global");
- else if ((mtex->texco & TEXCO_ORCO) || (mtex->texco & TEXCO_STRAND))
- // orco flag now used for 'strand'-mapping as well, see mesh code
- params["texco"] = yafray::parameter_t("orco");
- else if (mtex->texco & TEXCO_WINDOW)
- params["texco"] = yafray::parameter_t("window");
- else if (mtex->texco & TEXCO_NORM)
- params["texco"] = yafray::parameter_t("normal");
- else if (mtex->texco & TEXCO_REFL)
- params["texco"] = yafray::parameter_t("reflect");
-
- // texture projection axes, both image & procedural
- string proj = "nxyz"; // 'n' for 'none'
- params["proj_x"] = yafray::parameter_t(string(1,proj[mtex->projx]));
- params["proj_y"] = yafray::parameter_t(string(1,proj[mtex->projy]));
- params["proj_z"] = yafray::parameter_t(string(1,proj[mtex->projz]));
-
- // texture mapping parameters only relevant to image type
- if (tex->type==TEX_IMAGE)
- {
- if (mtex->mapping==MTEX_FLAT)
- params["mapping"] = yafray::parameter_t("flat");
- else if (mtex->mapping==MTEX_CUBE)
- params["mapping"] = yafray::parameter_t("cube");
- else if (mtex->mapping==MTEX_TUBE)
- params["mapping"] = yafray::parameter_t("tube");
- else if (mtex->mapping==MTEX_SPHERE)
- params["mapping"] = yafray::parameter_t("sphere");
-
- // repeat
- params["xrepeat"] = yafray::parameter_t(tex->xrepeat);
- params["yrepeat"] = yafray::parameter_t(tex->yrepeat);
-
- // clipping
- if (tex->extend==TEX_EXTEND)
- params["clipping"] = yafray::parameter_t("extend");
- else if (tex->extend==TEX_CLIP)
- params["clipping"] = yafray::parameter_t("clip");
- else if (tex->extend==TEX_CLIPCUBE)
- params["clipping"] = yafray::parameter_t("clipcube");
- else if (tex->extend==TEX_CHECKER) {
- params["clipping"] = yafray::parameter_t("checker");
- string ts = "";
- if (tex->flag & TEX_CHECKER_ODD) ts += "odd";
- if (tex->flag & TEX_CHECKER_EVEN) ts += " even";
- params["checker_mode"] = yafray::parameter_t(ts);
- params["checker_dist"] = yafray::parameter_t(tex->checkerdist);
- }
- else
- params["clipping"] = yafray::parameter_t("repeat");
-
- // crop min/max
- params["cropmin_x"] = yafray::parameter_t(tex->cropxmin);
- params["cropmin_y"] = yafray::parameter_t(tex->cropymin);
- params["cropmax_x"] = yafray::parameter_t(tex->cropxmax);
- params["cropmax_y"] = yafray::parameter_t(tex->cropymax);
-
- // rot90 flag
- if (tex->imaflag & TEX_IMAROT)
- params["rot90"] = yafray::parameter_t("on");
- else
- params["rot90"] = yafray::parameter_t("off");
- }
- yafrayGate->addShader(params, lparams);
- }
- }
-
- // shader + modulators
- writeShader(blendmat->first, matr);
-
- }
-
- // write the mappers & shaders for the TexFace case
- if (!imagetex.empty()) {
- // Yafray doesn't have per-face-textures, only per-face-shaders,
- // so create as many mappers/shaders as the images used by the object
- params.clear();
- lparams.clear();
- int snum = 0;
- for (map<Image*, set<Material*> >::const_iterator imgtex=imagetex.begin();
- imgtex!=imagetex.end();++imgtex)
- {
-
- for (set<Material*>::const_iterator imgmat=imgtex->second.begin();
- imgmat!=imgtex->second.end();++imgmat)
- {
- Material* matr = *imgmat;
- // mapper
- params["type"] = yafray::parameter_t("blendermapper");
- char temp[32];
- sprintf(temp, "_ftmap%d", snum);
- params["name"] = yafray::parameter_t(string(matr->id.name) + string(temp));
- params["input"] = yafray::parameter_t(imgtex->first->id.name);
- // all yafray default settings, except for texco, so no need to set others
- params["texco"] = yafray::parameter_t("uv");
- yafrayGate->addShader(params, lparams);
-
- // shader, remember name, used later when writing per-face-shaders
- sprintf(temp, "_ftsha%d", snum);
- string shader_name = string(matr->id.name) + string(temp);
- imgtex_shader[string(matr->id.name) + string(imgtex->first->id.name)] = shader_name;
-
- sprintf(temp, "_ftmap%d", snum++);
- string facetexname = string(matr->id.name) + string(temp);
- writeShader(shader_name, matr, facetexname);
- }
-
- }
- }
-
-}
-
-void yafrayPluginRender_t::genUVcoords(vector<yafray::GFLOAT> &uvcoords, ObjectRen *obr, VlakRen *vlr, MTFace* uvc, bool comple)
-{
- if (uvc)
- {
- // tri uv split indices
- int ui1=0, ui2=1, ui3=2;
- if (vlr->flag & R_DIVIDE_24) {
- ui3++;
- if (vlr->flag & R_FACE_SPLIT) { ui1++; ui2++; }
- }
- else if (vlr->flag & R_FACE_SPLIT) { ui2++; ui3++; }
- if (comple) {
- ui1 = (ui1+2) & 3;
- ui2 = (ui2+2) & 3;
- ui3 = (ui3+2) & 3;
- }
- uvcoords.push_back(uvc->uv[ui1][0]); uvcoords.push_back(1-uvc->uv[ui1][1]);
- uvcoords.push_back(uvc->uv[ui2][0]); uvcoords.push_back(1-uvc->uv[ui2][1]);
- uvcoords.push_back(uvc->uv[ui3][0]); uvcoords.push_back(1-uvc->uv[ui3][1]);
- }
- else
- {
- uvcoords.push_back(0); uvcoords.push_back(0);
- uvcoords.push_back(0); uvcoords.push_back(0);
- uvcoords.push_back(0); uvcoords.push_back(0);
- }
-}
-
-void yafrayPluginRender_t::genVcol(vector<yafray::CFLOAT> &vcol, ObjectRen *obr, VlakRen *vlr, bool comple)
-{
- MCol *mcol= RE_vlakren_get_mcol(obr, vlr, obr->actmcol, NULL, 0);
-
- if (mcol)
- {
- // tri vcol split indices
- int ui1=0, ui2=1, ui3=2;
- if (vlr->flag & R_DIVIDE_24) {
- ui3++;
- if (vlr->flag & R_FACE_SPLIT) { ui1++; ui2++; }
- }
- else if (vlr->flag & R_FACE_SPLIT) { ui2++; ui3++; }
- if (comple) {
- ui1 = (ui1+2) & 3;
- ui2 = (ui2+2) & 3;
- ui3 = (ui3+2) & 3;
- }
- unsigned char* pt = reinterpret_cast<unsigned char*>(&mcol[ui1]);
- vcol.push_back((float)pt[3]/255.f); vcol.push_back((float)pt[2]/255.f); vcol.push_back((float)pt[1]/255.f);
- pt = reinterpret_cast<unsigned char*>(&mcol[ui2]);
- vcol.push_back((float)pt[3]/255.f); vcol.push_back((float)pt[2]/255.f); vcol.push_back((float)pt[1]/255.f);
- pt = reinterpret_cast<unsigned char*>(&mcol[ui3]);
- vcol.push_back((float)pt[3]/255.f); vcol.push_back((float)pt[2]/255.f); vcol.push_back((float)pt[1]/255.f);
- }
- else
- {
- vcol.push_back(0); vcol.push_back(0); vcol.push_back(0);
- vcol.push_back(0); vcol.push_back(0); vcol.push_back(0);
- vcol.push_back(0); vcol.push_back(0); vcol.push_back(0);
- }
-}
-
-void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,vector<int> &faceshader,
- vector<yafray::GFLOAT> &uvcoords,vector<yafray::CFLOAT> &vcol,
- map<VertRen*, int> &vert_idx,ObjectRen *obr,VlakRen *vlr,
- int has_orco,bool has_uv)
-{
- Material* fmat = vlr->mat;
- bool EXPORT_VCOL = ((fmat->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))!=0);
- string fmatname(fmat->id.name);
- // use name in imgtex_shader list if 'TexFace' enabled for this face material
- if (fmat->mode & MA_FACETEXTURE) {
- MTFace* tface = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
- if (tface) {
- Image* fimg = (Image*)tface->tpage;
- if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)];
- }
- }
- else if (fmatname.length()==0) fmatname = "blender_default";
- bool newmat=true;
- for(unsigned int i=0;i<shaders.size();++i)
- if(shaders[i]==fmatname)
- {
- newmat=false;
- faceshader.push_back(i);
- break;
- }
- if(newmat)
- {
- shaders.push_back(fmatname);
- faceshader.push_back(shaders.size()-1);
- }
-
- MTFace* uvc = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0); // possible uvcoords (v upside down)
- int idx1, idx2, idx3;
-
- idx1 = vert_idx.find(vlr->v1)->second;
- idx2 = vert_idx.find(vlr->v2)->second;
- idx3 = vert_idx.find(vlr->v3)->second;
-
- // make sure the indices point to the vertices when orco coords exported
- if (has_orco) { idx1*=2; idx2*=2; idx3*=2; }
-
- faces.push_back(idx1); faces.push_back(idx2); faces.push_back(idx3);
-
- if(has_uv) genUVcoords(uvcoords, obr, vlr, uvc);
- if (EXPORT_VCOL) genVcol(vcol, obr, vlr);
-}
-
-void yafrayPluginRender_t::genCompleFace(vector<int> &faces,/*vector<string> &shaders,*/vector<int> &faceshader,
- vector<yafray::GFLOAT> &uvcoords,vector<yafray::CFLOAT> &vcol,
- map<VertRen*, int> &vert_idx,ObjectRen *obr,VlakRen *vlr,
- int has_orco,bool has_uv)
-{
- Material* fmat = vlr->mat;
- bool EXPORT_VCOL = ((fmat->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))!=0);
-
- faceshader.push_back(faceshader.back());
- MTFace* uvc = RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0); // possible uvcoords (v upside down)
- int idx1, idx2, idx3;
- idx1 = vert_idx.find(vlr->v3)->second;
- idx2 = vert_idx.find(vlr->v4)->second;
- idx3 = vert_idx.find(vlr->v1)->second;
-
- // make sure the indices point to the vertices when orco coords exported
- if (has_orco) { idx1*=2; idx2*=2; idx3*=2; }
-
- faces.push_back(idx1); faces.push_back(idx2); faces.push_back(idx3);
-
- if (has_uv) genUVcoords(uvcoords, obr, vlr, uvc, true);
- if (EXPORT_VCOL) genVcol(vcol, obr, vlr, true);
-}
-
-void yafrayPluginRender_t::genVertices(vector<yafray::point3d_t> &verts, int &vidx,
- map<VertRen*, int> &vert_idx, ObjectRen *obr, VlakRen* vlr, int has_orco, Object* obj)
-{
- VertRen* ver;
- float tvec[3]; // for back2world transform
-
- // for deformed objects, object->imat is no longer valid,
- // so have to create inverse render matrix ourselves here
- float mat[4][4], imat[4][4];
- MTC_Mat4MulMat4(mat, obj->obmat, re->viewmat);
- MTC_Mat4Invert(imat, mat);
-
- if (vert_idx.find(vlr->v1)==vert_idx.end())
- {
- vert_idx[vlr->v1] = vidx++;
- ver = vlr->v1;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- verts.push_back(yafray::point3d_t(tvec[0], tvec[1], tvec[2]));
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1)
- verts.push_back(yafray::point3d_t(ver->accum));
- else if (has_orco==2)
- verts.push_back(yafray::point3d_t(ver->orco[0], ver->orco[1], ver->orco[2]));
- }
- if (vert_idx.find(vlr->v2)==vert_idx.end())
- {
- vert_idx[vlr->v2] = vidx++;
- ver = vlr->v2;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- verts.push_back(yafray::point3d_t(tvec[0], tvec[1], tvec[2]));
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1)
- verts.push_back(yafray::point3d_t(ver->accum));
- else if (has_orco==2)
- verts.push_back(yafray::point3d_t(ver->orco[0], ver->orco[1], ver->orco[2]));
- }
- if (vert_idx.find(vlr->v3)==vert_idx.end())
- {
- vert_idx[vlr->v3] = vidx++;
- ver = vlr->v3;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- verts.push_back(yafray::point3d_t(tvec[0], tvec[1], tvec[2]));
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1)
- verts.push_back(yafray::point3d_t(ver->accum));
- else if (has_orco==2)
- verts.push_back(yafray::point3d_t(ver->orco[0], ver->orco[1], ver->orco[2]));
- }
- if ((vlr->v4) && (vert_idx.find(vlr->v4)==vert_idx.end()))
- {
- vert_idx[vlr->v4] = vidx++;
- ver = vlr->v4;
- MTC_cp3Float(ver->co, tvec);
- MTC_Mat4MulVecfl(imat, tvec);
- verts.push_back(yafray::point3d_t(tvec[0], tvec[1], tvec[2]));
- // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
- if (has_orco==1)
- verts.push_back(yafray::point3d_t(ver->accum));
- else if (has_orco==2)
- verts.push_back(yafray::point3d_t(ver->orco[0], ver->orco[1], ver->orco[2]));
- }
-}
-
-void yafrayPluginRender_t::writeObject(Object* obj, ObjectRen *obr, const vector<VlakRen*> &VLR_list, const float obmat[4][4])
-{
- float mtr[4*4];
- mtr[0*4+0]=obmat[0][0]; mtr[0*4+1]=obmat[1][0]; mtr[0*4+2]=obmat[2][0]; mtr[0*4+3]=obmat[3][0];
- mtr[1*4+0]=obmat[0][1]; mtr[1*4+1]=obmat[1][1]; mtr[1*4+2]=obmat[2][1]; mtr[1*4+3]=obmat[3][1];
- mtr[2*4+0]=obmat[0][2]; mtr[2*4+1]=obmat[1][2]; mtr[2*4+2]=obmat[2][2]; mtr[2*4+3]=obmat[3][2];
- mtr[3*4+0]=obmat[0][3]; mtr[3*4+1]=obmat[1][3]; mtr[3*4+2]=obmat[2][3]; mtr[3*4+3]=obmat[3][3];
- yafrayGate->transformPush(mtr);
-
- VlakRen* face0 = VLR_list[0];
- Material* face0mat = face0->mat;
-
- bool castShadows = face0mat->mode & MA_TRACEBLE;
- float caus_IOR=1.0;
- yafray::color_t caus_tcolor(0.0, 0.0, 0.0), caus_rcolor(0.0, 0.0, 0.0);
- bool caus = (((face0->mat->mode & MA_RAYTRANSP) | (face0->mat->mode & MA_RAYMIRROR))!=0);
- if (caus) {
- caus_IOR = face0mat->ang;
- float tr = 1.0-face0mat->alpha;
- caus_tcolor.set(face0mat->r*tr, face0mat->g*tr, face0mat->b*tr);
- tr = face0mat->ray_mirror;
- caus_rcolor.set(face0mat->mirr*tr, face0mat->mirg*tr, face0mat->mirb*tr);
- }
-
- // Export orco coords test.
- // Previously was done by checking orco pointer, however this can be non-null but still not initialized.
- // Test the rendermaterial texco flag instead.
- // update2: bug #3193 it seems it has changed again with the introduction of static 'hair' particles,
- // now it uses the vert pointer again as an extra test to make sure there are orco coords available
- int has_orco = 0;
- if (face0mat->texco & TEXCO_STRAND)
- has_orco = 1;
- else
- has_orco = (((face0mat->texco & TEXCO_ORCO)!=0) && (face0->v1->orco!=NULL)) ? 2 : 0;
-
- bool no_auto = true; //in case non-mesh, or mesh has no autosmooth
- float sm_angle = 0.1f;
- if (obj->type==OB_MESH)
- {
- Mesh* mesh = (Mesh*)obj->data;
- if (mesh->flag & ME_AUTOSMOOTH) {
- sm_angle = mesh->smoothresh;
- no_auto = false;
- }
- }
- // this for non-mesh as well
- if (no_auto) {
- // no per face smooth flag in yafray, if AutoSmooth not used,
- // use smooth flag of the first face instead
- if (face0->flag & ME_SMOOTH) sm_angle=180;
- }
- vector<yafray::point3d_t> verts;
- vector<yafray::CFLOAT> vcol;
- // now all vertices
- map<VertRen*, int> vert_idx; // for removing duplicate verts and creating an index list
- int vidx = 0; // vertex index counter
- bool has_uv=false;
- for (vector<VlakRen*>::const_iterator fci=VLR_list.begin();
- fci!=VLR_list.end();++fci)
- {
- VlakRen* vlr = *fci;
- genVertices(verts, vidx, vert_idx, obr, vlr, has_orco, obj);
- if(RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0)) has_uv=true;
- }
- // all faces using the index list created above
- vector<int> faces;
- vector<string> shaders;
- vector<int> faceshader;
- vector<yafray::GFLOAT> uvcoords;
- for (vector<VlakRen*>::const_iterator fci2=VLR_list.begin();
- fci2!=VLR_list.end();++fci2)
- {
- VlakRen* vlr = *fci2;
- genFace(faces, shaders, faceshader, uvcoords, vcol, vert_idx, obr, vlr, has_orco, has_uv);
- if (vlr->v4)
- genCompleFace(faces, faceshader, uvcoords, vcol, vert_idx, obr, vlr, has_orco, has_uv);
- }
-
- // using the ObjectRen database, contruct a new name if object has a parent.
- // This is done to prevent name clashes (group/library link related)
- string obname(obj->id.name);
- // previous implementation, keep around, in case this is still useful
- //if (obj->id.flag & (LIB_EXTERN|LIB_INDIRECT))obname = "lib_" + obname;
- ObjectRen *obren;
- for (obren = static_cast<ObjectRen*>(re->objecttable.first);
- obren; obren=static_cast<ObjectRen*>(obren->next))
- {
- Object *db_ob = obren->ob, *db_par = obren->par;
- if (db_ob==obj)
- if ((db_ob!=NULL) && (db_par!=NULL)) {
- obname += "_" + string(db_par->id.name);
- break;
- }
- }
-
- yafrayGate->addObject_trimesh(obname, verts, faces, uvcoords, vcol,
- shaders, faceshader, sm_angle, castShadows, true, true, caus, has_orco,
- caus_rcolor, caus_tcolor, caus_IOR);
- yafrayGate->transformPop();
-}
-
-
-// write all objects
-void yafrayPluginRender_t::writeAllObjects()
-{
- // first all objects except dupliverts (and main instance object for dups)
- for (map<Object*, yafrayObjectRen >::const_iterator obi=all_objects.begin();
- obi!=all_objects.end(); ++obi)
- {
- // skip main duplivert object if in dupliMtx_list, written later
- Object* obj = obi->first;
- if (dupliMtx_list.find(string(obj->id.name))!=dupliMtx_list.end()) continue;
- writeObject(obj, obi->second.obr, obi->second.faces, obj->obmat);
- }
-
- // Now all duplivert objects (if any) as instances of main object
- // The original object has been included in the VlakRen renderlist above (see convertBlenderScene.c)
- // but is written here which all other duplis are instances of.
- float obmat[4][4], cmat[4][4], imat[4][4], nmat[4][4];
- for (map<string, vector<float> >::const_iterator dupMtx=dupliMtx_list.begin();
- dupMtx!=dupliMtx_list.end();++dupMtx) {
-
- // original inverse matrix, not actual matrix of object, but first duplivert.
- for (int i=0;i<4;i++)
- for (int j=0;j<4;j++)
- obmat[i][j] = dupMtx->second[(i<<2)+j];
- MTC_Mat4Invert(imat, obmat);
-
- // first object written as normal (but with transform of first duplivert)
- Object* obj = dup_srcob[dupMtx->first];
- writeObject(obj, all_objects[obj].obr, all_objects[obj].faces, obmat);
-
- // all others instances of first
- for (unsigned int curmtx=16;curmtx<dupMtx->second.size();curmtx+=16)
- { // number of 4x4 matrices
- // new mtx
- for (int i=0;i<4;i++)
- for (int j=0;j<4;j++)
- nmat[i][j] = dupMtx->second[curmtx+(i<<2)+j];
-
- MTC_Mat4MulMat4(cmat, imat, nmat); // transform with respect to original = inverse_original * new
-
- float mtr[4*4];
- mtr[0*4+0]=cmat[0][0]; mtr[0*4+1]=cmat[1][0]; mtr[0*4+2]=cmat[2][0]; mtr[0*4+3]=cmat[3][0];
- mtr[1*4+0]=cmat[0][1]; mtr[1*4+1]=cmat[1][1]; mtr[1*4+2]=cmat[2][1]; mtr[1*4+3]=cmat[3][1];
- mtr[2*4+0]=cmat[0][2]; mtr[2*4+1]=cmat[1][2]; mtr[2*4+2]=cmat[2][2]; mtr[2*4+3]=cmat[3][2];
- mtr[3*4+0]=cmat[0][3]; mtr[3*4+1]=cmat[1][3]; mtr[3*4+2]=cmat[2][3]; mtr[3*4+3]=cmat[3][3];
- yafrayGate->transformPush(mtr);
-
- // new name from original
- string name=(obj->id.name);
- char temp[16];
- sprintf(temp,"_dup%d",(curmtx>>4));
- name+=temp;
- yafrayGate->addObject_reference(name,obj->id.name);
- yafrayGate->transformPop();
- }
-
- }
-}
-
-void yafrayPluginRender_t::writeAreaLamp(LampRen* lamp, int num, float iview[4][4])
-{
- yafray::paramMap_t params;
-
- if (lamp->area_shape!=LA_AREA_SQUARE) return;
- float *a=lamp->area[0], *b=lamp->area[1], *c=lamp->area[2], *d=lamp->area[3];
- float power=lamp->energy;
-
- string md = "off";
- // if no GI used, the GIphotons flag can still be set, so only use when 'full' selected
- if ((re->r.GImethod==2) && (re->r.GIphotons)) { md="on"; power*=re->r.GIpower; }
- params["type"]=yafray::parameter_t("arealight");
- char temp[16];
- sprintf(temp,"LAMP%d",num+1);
- params["name"]=yafray::parameter_t(temp);
- params["dummy"]=yafray::parameter_t(md);
- params["power"]=yafray::parameter_t(power);
- // samples not used for GI with photons, can still be exported, is ignored
- int psm=0, sm = lamp->ray_totsamp;
- if (sm>=25) psm = sm/5;
- params["samples"]=yafray::parameter_t(sm);
- params["psamples"]=yafray::parameter_t(psm);
-
- // transform area lamp coords back to world
- float lpco[4][3];
- MTC_cp3Float(a, lpco[0]);
- MTC_Mat4MulVecfl(iview, lpco[0]);
- MTC_cp3Float(b, lpco[1]);
- MTC_Mat4MulVecfl(iview, lpco[1]);
- MTC_cp3Float(c, lpco[2]);
- MTC_Mat4MulVecfl(iview, lpco[2]);
- MTC_cp3Float(d, lpco[3]);
- MTC_Mat4MulVecfl(iview, lpco[3]);
- params["a"] = yafray::parameter_t(yafray::point3d_t(lpco[0][0], lpco[0][1], lpco[0][2]));
- params["b"] = yafray::parameter_t(yafray::point3d_t(lpco[1][0], lpco[1][1], lpco[1][2]));
- params["c"] = yafray::parameter_t(yafray::point3d_t(lpco[2][0], lpco[2][1], lpco[2][2]));
- params["d"] = yafray::parameter_t(yafray::point3d_t(lpco[3][0], lpco[3][1], lpco[3][2]));
-
- params["color"]=yafray::parameter_t(yafray::color_t(lamp->r,lamp->g,lamp->b));
- yafrayGate->addLight(params);
-}
-
-void yafrayPluginRender_t::writeLamps()
-{
- GroupObject *go;
- int i=0;
-
- // inver viewmatrix needed for back2world transform
- float iview[4][4];
- // re->viewinv != inv.re->viewmat because of possible ortho mode (see convertBlenderScene.c)
- // have to invert it here
- MTC_Mat4Invert(iview, re->viewmat);
-
- // all lamps
- for(go=(GroupObject *)re->lights.first; go; go= go->next, i++)
- {
- LampRen* lamp = (LampRen *)go->lampren;
-
- yafray::paramMap_t params;
- string type="";
-
- if (lamp->type==LA_AREA) { writeAreaLamp(lamp, i, iview); continue; }
-
- // TODO: add decay setting in yafray
- bool is_softL=false, is_sphereL=false;
- if (lamp->type==LA_LOCAL) {
- if (lamp->mode & LA_YF_SOFT) {
- // shadowmapped omnidirectional light
- params["type"] = yafray::parameter_t("softlight");
- is_softL = true;
- }
- else if ((lamp->mode & LA_SHAD_RAY) && (lamp->YF_ltradius>0.0)) {
- // area sphere, only when ray shadows enabled and radius>0.0
- params["type"] = yafray::parameter_t("spherelight");
- is_sphereL = true;
- }
- else params["type"] = yafray::parameter_t("pointlight");
- params["glow_intensity"] = yafray::parameter_t(lamp->YF_glowint);
- params["glow_offset"] = yafray::parameter_t(lamp->YF_glowofs);
- params["glow_type"] = yafray::parameter_t(lamp->YF_glowtype);
- }
- else if (lamp->type==LA_SPOT)
- params["type"] = yafray::parameter_t("spotlight");
- else if ((lamp->type==LA_SUN) || (lamp->type==LA_HEMI)) // hemi exported as sun
- params["type"] = yafray::parameter_t("sunlight");
- else if (lamp->type==LA_YF_PHOTON)
- params["type"] = yafray::parameter_t("photonlight");
- else {
- // possibly unknown type, ignore
- cout << "Unknown Blender lamp type: " << lamp->type << endl;
- continue;
- }
-
- //no name available here, create one
- char temp[16];
- sprintf(temp,"LAMP%d",i+1);
- params["name"] = yafray::parameter_t(temp);
-
- // color already premultiplied by energy, so only need distance here
- float pwr = 1; // default for sun/hemi, distance irrelevant
- if ((lamp->type!=LA_SUN) && (lamp->type!=LA_HEMI)) {
- if (lamp->mode & LA_SPHERE) {
- // best approx. as used in LFexport script (LF d.f.m. 4pi?)
- pwr = lamp->dist*(lamp->dist+1)*(0.25/M_PI);
- //decay = 2;
- }
- else {
- pwr = lamp->dist;
- //decay = 1;
- }
- }
-
- if (is_sphereL) {
- // 'dummy' mode for spherelight when used with gpm
- string md = "off";
- // if no GI used, the GIphotons flag can still be set, so only use when 'full' selected
- if ((re->r.GImethod==2) && (re->r.GIphotons)) { md="on"; pwr*=re->r.GIpower; }
- params["power"] = yafray::parameter_t(pwr);
- params["dummy"] = yafray::parameter_t(md);
- }
- else params["power"] = yafray::parameter_t(pwr);
-
- // cast_shadows flag not used with softlight, spherelight or photonlight
- if ((!is_softL) && (!is_sphereL) && (lamp->type!=LA_YF_PHOTON)) {
- string lpmode="off";
- // Blender hemilights exported as sunlights which might have shadow flag set
- // should have cast_shadows set to off (reported by varuag)
- if (lamp->type!=LA_HEMI) {
- if (re->r.mode & R_SHADOW) {
- // old bug was here since the yafray lamp settings panel was added,
- // blender spotlight shadbuf flag should be ignored, since it is not in the panel anymore
- if (lamp->mode & LA_SHAD_RAY) lpmode="on";
- }
- }
- params["cast_shadows"] = yafray::parameter_t(lpmode);
- }
-
- // spot specific stuff
- bool has_halo = ((lamp->type==LA_SPOT) && (lamp->mode & LA_HALO) && (lamp->haint>0.0));
- if (lamp->type==LA_SPOT) {
- // conversion already changed spotsize to cosine of half angle
- float ld = 1-lamp->spotsi; //convert back to blender slider setting
- if (ld!=0) ld = 1.f/ld;
- params["size"] = yafray::parameter_t(acos(lamp->spotsi)*180.0/M_PI);
- params["blend"] = yafray::parameter_t(lamp->spotbl*ld);
- params["beam_falloff"] = yafray::parameter_t(2.0);
- // halo params
- if (has_halo) {
- params["halo"] = yafray::parameter_t("on");
- params["res"] = yafray::parameter_t(lamp->YF_bufsize);
- int hsmp = ((12-lamp->shadhalostep)*16)/12;
- hsmp = (hsmp+1)*16; // makes range (16, 272) for halostep(12, 0), good enough?
- // halo 'samples' now 'stepsize'
- // convert from old integer samples value to some reasonable stepsize
- params["stepsize"] = yafray::parameter_t(1.0/sqrt((float)hsmp));
- params["shadow_samples"] = yafray::parameter_t(lamp->samp*lamp->samp);
- params["halo_blur"] = yafray::parameter_t(0.0);
- params["shadow_blur"] = yafray::parameter_t(lamp->soft*0.01f);
- params["fog_density"] = yafray::parameter_t(lamp->haint*0.2f);
- }
- }
- else if (is_softL) {
- // softlight
- params["res"] = yafray::parameter_t(lamp->YF_bufsize);
- params["radius"] = yafray::parameter_t(lamp->soft);
- params["bias"] = yafray::parameter_t(lamp->bias);
- }
- else if (is_sphereL) {
- // spherelight
- int psm=0, sm = lamp->ray_samp*lamp->ray_samp;
- if (sm>=25) psm = sm/5;
- params["radius"] = yafray::parameter_t(lamp->YF_ltradius);
- params["samples"] = yafray::parameter_t(sm);
- params["psamples"] = yafray::parameter_t(psm);
- params["qmc_method"] = yafray::parameter_t(1);
- }
- else if (lamp->type==LA_YF_PHOTON) {
- string qmc="off";
- if (lamp->YF_useqmc) qmc="on";
- params["photons"] = yafray::parameter_t(lamp->YF_numphotons);
- params["search"] = yafray::parameter_t(lamp->YF_numsearch);
- params["depth"] = yafray::parameter_t(lamp->YF_phdepth);
- params["use_QMC"] = yafray::parameter_t(qmc);
- params["angle"] = yafray::parameter_t(acos(lamp->spotsi)*180.0/M_PI);
- float cl = lamp->YF_causticblur/sqrt((float)lamp->YF_numsearch);
- params["fixedradius"] = yafray::parameter_t(lamp->YF_causticblur);
- params["cluster"] = yafray::parameter_t(cl);
- }
-
- // transform lamp co & vec back to world
- float lpco[3], lpvec[3];
- MTC_cp3Float(lamp->co, lpco);
- MTC_Mat4MulVecfl(iview, lpco);
- MTC_cp3Float(lamp->vec, lpvec);
- MTC_Mat4Mul3Vecfl(iview, lpvec);
-
- // position, (==-blendir for sun/hemi)
- if ((lamp->type==LA_SUN) || (lamp->type==LA_HEMI))
- params["from"] = yafray::parameter_t(yafray::point3d_t(-lpvec[0], -lpvec[1], -lpvec[2]));
- else
- params["from"] = yafray::parameter_t(yafray::point3d_t(lpco[0], lpco[1], lpco[2]));
- // 'to' for spot/photonlight, already calculated by Blender
- if ((lamp->type==LA_SPOT) || (lamp->type==LA_YF_PHOTON)) {
- params["to"] = yafray::parameter_t(yafray::point3d_t(lpco[0] + lpvec[0],
- lpco[1] + lpvec[1],
- lpco[2] + lpvec[2]));
- if (has_halo) params["fog"] = yafray::parameter_t(yafray::color_t(1.0, 1.0, 1.0));
- }
-
- // color
- // rgb in LampRen is premultiplied by energy, power is compensated for that above
- params["color"] = yafray::parameter_t(yafray::color_t(lamp->r, lamp->g, lamp->b));
- yafrayGate->addLight(params);
- }
-}
-
-// write main camera
-void yafrayPluginRender_t::writeCamera()
-{
- yafray::paramMap_t params;
- params["name"]=yafray::parameter_t("MAINCAM");
- if (re->r.mode & R_ORTHO)
- params["type"] = yafray::parameter_t("ortho");
- else
- params["type"] = yafray::parameter_t("perspective");
-
- params["resx"] = yafray::parameter_t(re->winx);
- params["resy"] = yafray::parameter_t(re->winy);
-
- float f_aspect = 1;
- if ((re->winx * re->r.xasp) <= (re->winy * re->r.yasp))
- f_aspect = float(re->winx * re->r.xasp) / float(re->winy * re->r.yasp);
- params["focal"] = yafray::parameter_t(mainCamLens/(f_aspect*32.f));
- // bug #4532, when field rendering is enabled, ycor is doubled
- if (re->r.mode & R_FIELDS)
- params["aspect_ratio"] = yafray::parameter_t(re->ycor * 0.5f);
- else
- params["aspect_ratio"] = yafray::parameter_t(re->ycor);
-
- // dof params, only valid for real camera
- float fdist = 1; // only changes for ortho
- if (maincam_obj->type==OB_CAMERA) {
- Camera* cam = (Camera*)maincam_obj->data;
- if (re->r.mode & R_ORTHO) fdist = cam->ortho_scale*(mainCamLens/32.f);
- params["dof_distance"] = yafray::parameter_t(cam->YF_dofdist);
- params["aperture"] = yafray::parameter_t(cam->YF_aperture);
- if (cam->flag & CAM_YF_NO_QMC)
- params["use_qmc"] = yafray::parameter_t("off");
- else
- params["use_qmc"] = yafray::parameter_t("on");
- // bokeh params
- string st = "disk1";
- if (cam->YF_bkhtype==1)
- st = "disk2";
- else if (cam->YF_bkhtype==2)
- st = "triangle";
- else if (cam->YF_bkhtype==3)
- st = "square";
- else if (cam->YF_bkhtype==4)
- st = "pentagon";
- else if (cam->YF_bkhtype==5)
- st = "hexagon";
- else if (cam->YF_bkhtype==6)
- st = "ring";
- params["bokeh_type"] = yafray::parameter_t(st);
- st = "uniform";
- if (cam->YF_bkhbias==1)
- st = "center";
- else if (cam->YF_bkhbias==2)
- st = "edge";
- params["bokeh_bias"] = yafray::parameter_t(st);
- params["bokeh_rotation"] = yafray::parameter_t(cam->YF_bkhrot);
- }
-
- params["from"]=yafray::parameter_t(
- yafray::point3d_t(maincam_obj->obmat[3][0], maincam_obj->obmat[3][1], maincam_obj->obmat[3][2]));
- params["to"]=yafray::parameter_t(
- yafray::point3d_t(maincam_obj->obmat[3][0] - fdist * re->viewmat[0][2],
- maincam_obj->obmat[3][1] - fdist * re->viewmat[1][2],
- maincam_obj->obmat[3][2] - fdist * re->viewmat[2][2]));
- params["up"]=yafray::parameter_t(
- yafray::point3d_t(maincam_obj->obmat[3][0] + re->viewmat[0][1],
- maincam_obj->obmat[3][1] + re->viewmat[1][1],
- maincam_obj->obmat[3][2] + re->viewmat[2][1]));
-
- yafrayGate->addCamera(params);
-}
-
-void yafrayPluginRender_t::writeHemilight()
-{
- yafray::paramMap_t params;
- World *world = re->scene->world;
- bool fromAO = false;
- if (re->r.GIquality==6){
- // use Blender AO params is possible
- if (world==NULL) return;
- if ((world->mode & WO_AMB_OCC)==0) {
- // no AO, use default GIquality
- cout << "[Warning]: Can't use AO parameters\nNo ambient occlusion enabled, using default values instead" << endl;
- }
- else fromAO = true;
- }
- if (re->r.GIcache) {
- params["type"] = yafray::parameter_t("pathlight");
- params["name"] = yafray::parameter_t("path_LT");
- params["power"] = yafray::parameter_t(re->r.GIpower);
- params["mode"] = yafray::parameter_t("occlusion");
- params["ignore_bumpnormals"] = yafray::parameter_t(re->r.YF_nobump ? "on" : "off");
- if (fromAO) {
- // for AO, with cache, using range of 32*1 to 32*16 seems good enough
- params["samples"] = yafray::parameter_t(32*world->aosamp);
- params["maxdistance"] = yafray::parameter_t(world->aodist);
- }
- else {
- switch (re->r.GIquality)
- {
- case 1 : params["samples"] = yafray::parameter_t(128); break;
- case 2 : params["samples"] = yafray::parameter_t(256); break;
- case 3 : params["samples"] = yafray::parameter_t(512); break;
- case 4 : params["samples"] = yafray::parameter_t(1024); break;
- case 5 : params["samples"] = yafray::parameter_t(2048); break;
- default: params["samples"] = yafray::parameter_t(256);
- }
- }
- params["cache"] = yafray::parameter_t("on");
- params["use_QMC"] = yafray::parameter_t("on");
- params["threshold"] = yafray::parameter_t(re->r.GIrefinement);
- params["cache_size"] = yafray::parameter_t((2.0/float(re->winx))*re->r.GIpixelspersample);
- params["shadow_threshold"] = yafray::parameter_t(1.0 - re->r.GIshadowquality);
- params["grid"] = yafray::parameter_t(82);
- params["search"] = yafray::parameter_t(35);
- }
- else {
- params["type"] = yafray::parameter_t("hemilight");
- params["name"] = yafray::parameter_t("hemi_LT");
- params["power"] = yafray::parameter_t(re->r.GIpower);
- if (fromAO) {
- // use minimum of 4 samples for lowest sample setting, single sample way too noisy
- params["samples"] = yafray::parameter_t(3 + world->aosamp*world->aosamp);
- params["maxdistance"] = yafray::parameter_t(world->aodist);
- params["use_QMC"] = yafray::parameter_t((world->aomode & WO_AORNDSMP) ? "off" : "on");
- }
- else {
- switch (re->r.GIquality)
- {
- case 1 :
- case 2 : params["samples"]=yafray::parameter_t(16); break;
- case 3 : params["samples"]=yafray::parameter_t(36); break;
- case 4 : params["samples"]=yafray::parameter_t(64); break;
- case 5 : params["samples"]=yafray::parameter_t(128); break;
- default: params["samples"]=yafray::parameter_t(25);
- }
- }
- }
- yafrayGate->addLight(params);
-}
-
-void yafrayPluginRender_t::writePathlight()
-{
- if (re->r.GIphotons)
- {
- yafray::paramMap_t params;
- params["type"] = yafray::parameter_t("globalphotonlight");
- params["name"] = yafray::parameter_t("gpm");
- params["photons"] = yafray::parameter_t(re->r.GIphotoncount);
- params["radius"] = yafray::parameter_t(re->r.GIphotonradius);
- params["depth"] = yafray::parameter_t(((re->r.GIdepth>2) ? (re->r.GIdepth-1) : 1));
- params["caus_depth"] = yafray::parameter_t(re->r.GIcausdepth);
- params["search"] = yafray::parameter_t(re->r.GImixphotons);
- yafrayGate->addLight(params);
- }
- yafray::paramMap_t params;
- params["type"] = yafray::parameter_t("pathlight");
- params["name"] = yafray::parameter_t("path_LT");
- params["power"] = yafray::parameter_t(re->r.GIindirpower);
- params["depth"] = yafray::parameter_t(((re->r.GIphotons) ? 1 : re->r.GIdepth));
- params["caus_depth"] = yafray::parameter_t(re->r.GIcausdepth);
- if (re->r.GIdirect && re->r.GIphotons) params["direct"] = yafray::parameter_t("on");
- if (re->r.GIcache && !(re->r.GIdirect && re->r.GIphotons))
- {
- switch (re->r.GIquality)
- {
- case 1 : params["samples"] = yafray::parameter_t(128); break;
- case 2 : params["samples"] = yafray::parameter_t(256); break;
- case 3 : params["samples"] = yafray::parameter_t(512); break;
- case 4 : params["samples"] = yafray::parameter_t(1024); break;
- case 5 : params["samples"] = yafray::parameter_t(2048); break;
- default: params["samples"] = yafray::parameter_t(256);
- }
- params["cache"] = yafray::parameter_t("on");
- params["use_QMC"] = yafray::parameter_t("on");
- params["threshold"] = yafray::parameter_t(re->r.GIrefinement);
- params["cache_size"] = yafray::parameter_t((2.0/float(re->recty))*re->r.GIpixelspersample);
- params["shadow_threshold"] = yafray::parameter_t(1.0 - re->r.GIshadowquality);
- params["grid"] = yafray::parameter_t(82);
- params["search"] = yafray::parameter_t(35);
- params["ignore_bumpnormals"] = yafray::parameter_t(re->r.YF_nobump ? "on" : "off");
- }
- else
- {
- switch (re->r.GIquality)
- {
- case 1 : params["samples"] = yafray::parameter_t(16); break;
- case 2 : params["samples"] = yafray::parameter_t(36); break;
- case 3 : params["samples"] = yafray::parameter_t(64); break;
- case 4 : params["samples"] = yafray::parameter_t(128); break;
- case 5 : params["samples"] = yafray::parameter_t(256); break;
- default: params["samples"] = yafray::parameter_t(25);
- }
- }
- yafrayGate->addLight(params);
-}
-
-bool yafrayPluginRender_t::writeWorld()
-{
- World *world = re->scene->world;
- if (re->r.GIquality!=0) {
- if (re->r.GImethod==1) {
- if (world==NULL) cout << "WARNING: need world background for skydome!\n";
- writeHemilight();
- }
- else if (re->r.GImethod==2) writePathlight();
- }
- if (world==NULL) return false;
-
- yafray::paramMap_t params;
- for (int i=0;i<MAX_MTEX;i++) {
- MTex* wtex = world->mtex[i];
- if (!wtex) continue;
- Image* wimg = wtex->tex->ima;
- // now always exports if image used as world texture (and 'Hori' mapping enabled)
- if ((wtex->tex->type==TEX_IMAGE) && (wimg!=NULL) && (wtex->mapto & WOMAP_HORIZ)) {
- string wt_path = wimg->name;
- adjustPath(wt_path);
- params["type"] = yafray::parameter_t("image");
- params["name"] = yafray::parameter_t("world_background");
- // exposure_adjust not restricted to integer range anymore
- params["exposure_adjust"] = yafray::parameter_t(wtex->tex->bright-1.f);
- if (wtex->texco & TEXCO_ANGMAP)
- params["mapping"] = yafray::parameter_t("probe");
- else if (wtex->texco & TEXCO_H_SPHEREMAP) // in yafray full sphere
- params["mapping"] = yafray::parameter_t("sphere");
- else // assume 'tube' for anything else
- params["mapping"] = yafray::parameter_t("tube");
- params["filename"] = yafray::parameter_t(wt_path);
- params["interpolate"] = yafray::parameter_t((wtex->tex->imaflag & TEX_INTERPOL) ? "bilinear" : "none");
- if (wtex->tex->filtersize>1.f) params["prefilter"] = yafray::parameter_t("on");
- yafrayGate->addBackground(params);
- return true;
- }
- }
-
- params.clear();
- params["type"] = yafray::parameter_t("constant");
- params["name"] = yafray::parameter_t("world_background");
- // if no GI used, the GIpower parameter is not always initialized, so in that case ignore it
- // (have to change method to init yafray vars in Blender)
- float bg_mult = (re->r.GImethod==0) ? 1 : re->r.GIpower;
- params["color"]=yafray::parameter_t(yafray::color_t(world->horr * bg_mult,
- world->horg * bg_mult,
- world->horb * bg_mult));
- yafrayGate->addBackground(params);
- return true;
-}
-
-bool blenderYafrayOutput_t::putPixel(int x, int y, const yafray::color_t &c,
- yafray::CFLOAT alpha, yafray::PFLOAT depth)
-{
- // XXX how to get the image from Blender and write to it. This call doesn't allow to change buffer rects
- RenderResult rres;
- RE_GetResultImage(re, &rres);
- // rres.rectx, rres.recty is width/height
- // rres.rectf is float buffer, scanlines starting in bottom
- // rres.rectz is zbuffer, available when associated pass is set
-
- const unsigned int maxy = rres.recty-1;
-
- if (re->r.mode & R_BORDER) {
- // border render, blender renderwin is size of border region,
- // but yafray returns coords relative to full resolution
- x -= int(re->r.border.xmin * re->winx);
- y -= int((1.f-re->r.border.ymax) * re->winy);
- if ((x >= 0) && (x < re->rectx) && (y >= 0) && (y < re->recty))
- {
- const unsigned int px = rres.rectx*(maxy - y);
- // rgba
- float* fpt = rres.rectf + ((px + x) << 2);
- *fpt++ = c.R;
- *fpt++ = c.G;
- *fpt++ = c.B;
- *fpt = alpha;
- // depth values
- if (rres.rectz) rres.rectz[px + x] = depth;
- // to simplify things a bit, just do complete redraw here...
- out++;
- if ((out==4096) || ((x+y*re->rectx) == ((re->rectx-1)+(re->recty-1)*re->rectx))) {
- re->result->renlay = render_get_active_layer(re, re->result);
- re->display_draw(re->ddh, re->result, NULL);
- out = 0;
- }
- }
- if (re->test_break(re->tbh)) return false;
- return true;
- }
-
- const unsigned int px = (maxy - y)*rres.rectx;
-
- // rgba
- float* fpt = rres.rectf + ((px + x) << 2);
- *fpt++ = c.R;
- *fpt++ = c.G;
- *fpt++ = c.B;
- *fpt = alpha;
-
- // depth values
- if (rres.rectz) rres.rectz[px + x] = depth;
-
- // attempt to optimize drawing, by only drawing the tile currently rendered by yafray,
- // and not the entire display every time (blender has to to do float->char conversion),
- // but since the tile is not actually known, it has to be calculated from the coords.
- // not sure if it really makes all that much difference at all... unless rendering really large pictures
- // (renderwin.c also had to be adapted for this)
- // tile start & end coords
- const int txs = x & 0xffffffc0, tys = y & 0xffffffc0;
- int txe = txs + 63, tye = tys + 63;
- // tile border clip
- if (txe >= rres.rectx) txe = rres.rectx-1;
- if (tye >= rres.recty) tye = maxy;
- // draw tile if last pixel reached
- if ((y*rres.rectx + x) == (tye*rres.rectx + txe)) {
- re->result->renlay = render_get_active_layer(re, re->result);
- // note: ymin/ymax swapped here, img. upside down!
- rcti rt = {txs, txe+1, maxy-tye, ((tys==0) ? maxy : (rres.recty-tys))}; // !!! tys can be zero
- re->display_draw(re->ddh, re->result, &rt);
- }
-
- if (re->test_break(re->tbh)) return false;
- return true;
-}
diff --git a/source/blender/yafray/intern/export_Plugin.h b/source/blender/yafray/intern/export_Plugin.h
deleted file mode 100644
index 660271daf96..00000000000
--- a/source/blender/yafray/intern/export_Plugin.h
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef __EXPORT_PLUGIN_H
-#define __EXPORT_PLUGIN_H
-
-#include"yafray_Render.h"
-#include"yafexternal.h"
-extern "C"
-{
-#include"PIL_dynlib.h"
-}
-
-class yafrayPluginRender_t : public yafrayRender_t
-{
- public:
- yafrayPluginRender_t()
- {
- plugin_loaded = false;
- handle=NULL;
-#ifdef WIN32
- corehandle=NULL;
-#endif
- yafrayGate=NULL;
- }
- virtual ~yafrayPluginRender_t();
- protected:
- bool plugin_loaded;
- std::string imgout;
- PILdynlib *handle;
-#ifdef WIN32
- PILdynlib *corehandle;
-#endif
-
- yafray::yafrayInterface_t *yafrayGate;
-
- void displayImage();
- virtual void writeTextures();
- virtual void writeShader(const std::string &shader_name, Material* matr, const std::string &facetexname="");
- virtual void writeMaterialsAndModulators();
- virtual void writeObject(Object* obj, ObjectRen *obr,
- const std::vector<VlakRen*> &VLR_list, const float obmat[4][4]);
- virtual void writeAllObjects();
- virtual void writeAreaLamp(LampRen* lamp, int num, float iview[4][4]);
- virtual void writeLamps();
- virtual void writeCamera();
- virtual void writeHemilight();
- virtual void writePathlight();
- virtual bool writeWorld();
- virtual bool writeRender();
- virtual bool initExport();
- virtual bool finishExport();
-
- void genUVcoords(std::vector<yafray::GFLOAT> &uvcoords,ObjectRen *obr,VlakRen *vlr,MTFace* uvc, bool comple=false);
- void genVcol(std::vector<yafray::CFLOAT> &vcol, ObjectRen *obr, VlakRen *vlr, bool comple=false);
- void genFace(std::vector<int> &faces,std::vector<std::string> &shaders,std::vector<int> &faceshader,
- std::vector<yafray::GFLOAT> &uvcoords,std::vector<yafray::CFLOAT> &vcol,
- std::map<VertRen*, int> &vert_idx,ObjectRen *obr,VlakRen *vlr,
- int has_orco,bool has_uv);
- void genCompleFace(std::vector<int> &faces,/*std::vector<std::string> &shaders,*/std::vector<int> &faceshader,
- std::vector<yafray::GFLOAT> &uvcoords,std::vector<yafray::CFLOAT> &vcol,
- std::map<VertRen*, int> &vert_idx,ObjectRen *obr, VlakRen *vlr,
- int has_orco,bool has_uv);
- void genVertices(std::vector<yafray::point3d_t> &verts, int &vidx,
- std::map<VertRen*, int> &vert_idx, ObjectRen *obr, VlakRen* vlr, int has_orco, Object* obj);
-};
-
-class blenderYafrayOutput_t : public yafray::colorOutput_t
-{
- public:
- blenderYafrayOutput_t(Render* re):out(0) { this->re = re; }
- virtual ~blenderYafrayOutput_t() {}
- virtual bool putPixel(int x, int y, const yafray::color_t &c,
- yafray::CFLOAT alpha=0, yafray::PFLOAT depth=0);
- virtual void flush() {}
- protected:
- Render* re;
- int out;
-};
-
-#endif
diff --git a/source/blender/yafray/intern/yafexternal.cpp b/source/blender/yafray/intern/yafexternal.cpp
deleted file mode 100644
index 97d43cbaf5a..00000000000
--- a/source/blender/yafray/intern/yafexternal.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-#include "yafexternal.h"
-#include <iostream>
-namespace yafray {
-
-parameter_t::parameter_t(const std::string &s):type(TYPE_STRING),used(false),str(s)
-{
-}
-
-parameter_t::parameter_t(float f):type(TYPE_FLOAT),used(false),fnum(f)
-{
-}
-
-parameter_t::parameter_t(const colorA_t &c):type(TYPE_COLOR),used(false)
- ,C(c)
-{
-}
-
-parameter_t::parameter_t(const point3d_t &p):type(TYPE_POINT),used(false),P(p)
-{
-}
-
-parameter_t::parameter_t():type(TYPE_NONE),used(false)
-{
-}
-
-parameter_t::~parameter_t()
-{
-}
-
-paramMap_t::paramMap_t()
-{
-}
-
-paramMap_t::~paramMap_t()
-{
-}
-
-bool paramMap_t::getParam(const std::string &name,const std::string *&s)
-{
- if(includes(name,TYPE_STRING))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- s=&(i->second.getStr());
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::getParam(const std::string &name,bool &b)
-{
- std::string str;
- if(includes(name,TYPE_STRING))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- str=i->second.getStr();
- if(str=="on") b=true;
- else if(str=="off") b=false;
- else return false;
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::getParam(const std::string &name,float &f)
-{
- if(includes(name,TYPE_FLOAT))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- f=i->second.getFnum();
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::getParam(const std::string &name,double &f)
-{
- if(includes(name,TYPE_FLOAT))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- f=i->second.getFnum();
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::getParam(const std::string &name,int &in)
-{
- if(includes(name,TYPE_FLOAT))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- in=(int)(i->second.getFnum());
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::getParam(const std::string &name,point3d_t &p)
-{
- if(includes(name,TYPE_POINT))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- p=i->second.getP();
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::getParam(const std::string &name,color_t &c)
-{
- if(includes(name,TYPE_COLOR))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- c=i->second.getC();
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::getParam(const std::string &name,colorA_t &c)
-{
- if(includes(name,TYPE_COLOR))
- {
- std::map<std::string,parameter_t>::iterator i=dicc.find(name);
- c=i->second.getAC();
- }
- else return false;
- return true;
-}
-
-bool paramMap_t::includes(const std::string &label,int type)const
-{
- std::map<std::string,parameter_t>::const_iterator i=dicc.find(label);
- if(i==dicc.end()) return false;
- if((*i).second.type!=type) return false;
- return true;
-}
-
-void paramMap_t::checkUnused(const std::string &env)const
-{
- for(std::map<std::string,parameter_t>::const_iterator i=dicc.begin();i!=dicc.end();++i)
- if(!( (*i).second.used ))
- std::cout<<"[WARNING]:Unused param "<<(*i).first<<" in "<<env<<"\n";
-}
-
-parameter_t & paramMap_t::operator [] (const std::string &key)
-{
- return dicc[key];
-}
-
-void paramMap_t::clear()
-{
- dicc.clear();
-}
-
-}
diff --git a/source/blender/yafray/intern/yafexternal.h b/source/blender/yafray/intern/yafexternal.h
deleted file mode 100644
index 7130bd55466..00000000000
--- a/source/blender/yafray/intern/yafexternal.h
+++ /dev/null
@@ -1,186 +0,0 @@
-#ifndef __YAFINTERFACE_H
-#define __YAFINTERFACE_H
-
-#include<vector>
-#include<string>
-#include<list>
-#include<map>
-
-namespace yafray
-{
-
-typedef float PFLOAT;
-typedef float GFLOAT;
-typedef float CFLOAT;
-
-class point3d_t
-{
- public:
- point3d_t() { x = y = z = 0; }
- point3d_t(PFLOAT ix) { x = y = z = ix; }
- point3d_t(PFLOAT ix, PFLOAT iy, PFLOAT iz=0) { x=ix; y=iy; z=iz; }
- point3d_t(const point3d_t &s) { x=s.x; y=s.y; z=s.z; }
- void set(PFLOAT ix, PFLOAT iy, PFLOAT iz=0) { x=ix; y=iy; z=iz; }
- point3d_t& operator= (const point3d_t &s) { x=s.x; y=s.y; z=s.z; return *this; }
- ~point3d_t() {};
- PFLOAT x,y,z;
-};
-
-class color_t
-{
- public:
- color_t() {R=G=B=0;};
- color_t(CFLOAT r,CFLOAT g,CFLOAT b) {R=r;G=g;B=b;};
- ~color_t() {};
- void set(CFLOAT r,CFLOAT g,CFLOAT b) {R=r;G=g;B=b;};
-
- CFLOAT R,G,B;
-};
-
-class colorA_t : public color_t
-{
- public:
- colorA_t() { A=1; }
- colorA_t(const color_t &c):color_t(c) { A=1; }
- colorA_t(CFLOAT r, CFLOAT g, CFLOAT b, CFLOAT a=0):color_t(r,g,b) {A=a;}
- ~colorA_t() {};
- void set(CFLOAT r, CFLOAT g, CFLOAT b, CFLOAT a=0) {color_t::set(r,g,b);A=a; };
-
- protected:
- CFLOAT A;
-};
-
-#define TYPE_FLOAT 0
-#define TYPE_STRING 1
-#define TYPE_POINT 2
-#define TYPE_COLOR 3
-#define TYPE_NONE -1
-
-class parameter_t
-{
- public:
- parameter_t(const std::string &s);
- parameter_t(float f);
- parameter_t(const colorA_t &c);
- parameter_t(const point3d_t &p);
- parameter_t();
- ~parameter_t();
-
- const std::string &getStr() {used=true;return str;};
- float &getFnum() {used=true;return fnum;};
- const point3d_t &getP() {used=true;return P;};
- const color_t &getC() {used=true;return C;};
- const colorA_t &getAC() {used=true;return C;};
- int type;
- bool used;
- protected:
- std::string str;
- float fnum;
- point3d_t P;
- colorA_t C;
-};
-
-class paramMap_t
-{
- public:
- paramMap_t();
- virtual bool getParam(const std::string &name,const std::string *&s);
- virtual bool getParam(const std::string &name,bool &b);
- virtual bool getParam(const std::string &name,float &f);
- virtual bool getParam(const std::string &name,double &f);
- virtual bool getParam(const std::string &name,int &i);
- virtual bool getParam(const std::string &name,point3d_t &p);
- virtual bool getParam(const std::string &name,color_t &c);
- virtual bool getParam(const std::string &name,colorA_t &c);
- virtual bool includes(const std::string &label,int type)const;
- virtual void checkUnused(const std::string &env)const;
- virtual parameter_t & operator [] (const std::string &key);
- virtual void clear();
- virtual ~paramMap_t();
- protected:
- std::map<std::string,parameter_t> dicc;
-};
-
-class light_t;
-class shader_t;
-class texture_t;
-class filter_t;
-class background_t;
-
-class renderEnvironment_t
-{
- public:
- typedef light_t * light_factory_t(paramMap_t &,renderEnvironment_t &);
- typedef shader_t *shader_factory_t(paramMap_t &,std::list<paramMap_t> &,
- renderEnvironment_t &);
- typedef texture_t *texture_factory_t(paramMap_t &,renderEnvironment_t &);
- typedef filter_t *filter_factory_t(paramMap_t &,renderEnvironment_t &);
- typedef background_t *background_factory_t(paramMap_t &,renderEnvironment_t &);
-
- virtual shader_t *getShader(const std::string name)const=0;
- virtual texture_t *getTexture(const std::string name)const=0;
-
- virtual void repeatFirstPass()=0;
-
- virtual void registerFactory(const std::string &name,light_factory_t *f)=0;
- virtual void registerFactory(const std::string &name,shader_factory_t *f)=0;
- virtual void registerFactory(const std::string &name,texture_factory_t *f)=0;
- virtual void registerFactory(const std::string &name,filter_factory_t *f)=0;
- virtual void registerFactory(const std::string &name,background_factory_t *f)=0;
-
- renderEnvironment_t() {};
- virtual ~renderEnvironment_t() {};
-
-};
-
-class colorOutput_t
-{
- public:
- virtual ~colorOutput_t() {};
- virtual bool putPixel(int x, int y,const color_t &c,
- CFLOAT alpha=0,PFLOAT depth=0)=0;
- virtual void flush()=0;
-};
-
-class yafrayInterface_t : public renderEnvironment_t
-{
- public:
- virtual void transformPush(float *m)=0;
- virtual void transformPop()=0;
- virtual void addObject_trimesh(const std::string &name,
- std::vector<point3d_t> &verts, const std::vector<int> &faces,
- std::vector<GFLOAT> &uvcoords, std::vector<CFLOAT> &vcol,
- const std::vector<std::string> &shaders,const std::vector<int> &faceshader,
- float sm_angle,bool castShadows,bool useR,bool receiveR,bool caus,bool has_orco,
- const color_t &caus_rcolor,const color_t &caus_tcolor,float caus_IOR)=0;
-
- virtual void addObject_reference(const std::string &name,const std::string &original)=0;
- // lights
- virtual void addLight(paramMap_t &p)=0;
- // textures
- virtual void addTexture(paramMap_t &p)=0;
- // shaders
- virtual void addShader(paramMap_t &p,std::list<paramMap_t> &modulators)=0;
- // filters
- virtual void addFilter(paramMap_t &p)=0;
- // backgrounds
- virtual void addBackground(paramMap_t &p)=0;
- //camera
- virtual void addCamera(paramMap_t &p)=0;
- //render
- virtual void render(paramMap_t &p)=0;
- //render
- virtual void render(paramMap_t &p,colorOutput_t &output)=0;
-
- virtual void clear()=0;
-
- virtual ~yafrayInterface_t() {};
-};
-
-typedef yafrayInterface_t * yafrayConstructor(int,const std::string &);
-
-}
-
-#define YAFRAY_SYMBOL "getYafray"
-
-#endif
diff --git a/source/blender/yafray/intern/yafray_Render.cpp b/source/blender/yafray/intern/yafray_Render.cpp
deleted file mode 100644
index d0006786507..00000000000
--- a/source/blender/yafray/intern/yafray_Render.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-//----------------------------------------------------------------------------------------------------
-// YafRay export
-//
-// For anyone else looking at this, this was designed for a tabspacing of 2 (YafRay/Jandro standard :)
-//----------------------------------------------------------------------------------------------------
-
-#include "yafray_Render.h"
-
-#include <math.h>
-
-#include <cstring>
-
-using namespace std;
-
-void yafrayRender_t::clearAll()
-{
- all_objects.clear();
- used_materials.clear();
- used_textures.clear();
- dupliMtx_list.clear();
- dup_srcob.clear();
- objectData.clear();
- imagetex.clear();
- imgtex_shader.clear();
-}
-
-bool yafrayRender_t::exportScene(Render* re)
-{
- this->re = re;
-
- // get camera first, no checking should be necessary, all done by Blender
- maincam_obj = re->scene->camera;
-
- // use fixed lens for objects functioning as temporary camera (ctrl-0)
- mainCamLens = 35.0;
- if (maincam_obj->type==OB_CAMERA) mainCamLens=((Camera*)maincam_obj->data)->lens;
-
- // recreate the scene as object data, as well as sorting the material & textures, ignoring duplicates
- if (!getAllMatTexObs())
- {
- // error found, clear for next call
- clearAll();
- return false;
- }
-
- if (!initExport())
- {
- G.afbreek = 1;
- clearAll();
- return false;
- }
-
- // start actual data export
- writeTextures();
- writeMaterialsAndModulators();
- writeAllObjects();
- writeLamps();
- hasworld = writeWorld();
- writeCamera();
- writeRender();
-
- // clear for next call, before render to free some memory
- clearAll();
-
- if (!finishExport())
- {
- G.afbreek = 1; //stop render and anim if doing so
- return false;
- }
- else return true;
-}
-
-// gets all unique face materials & textures,
-// and sorts the facelist rejecting anything that is not a quad or tri,
-// as well as associating them again with the original Object.
-bool yafrayRender_t::getAllMatTexObs()
-{
- ObjectInstanceRen *obi;
- ObjectRen *obr;
- VlakRen* vlr;
- float mat[4][4];
-
- // convert blender object instances to dupli matrices
- for(obi=(ObjectInstanceRen*)re->instancetable.first; obi; obi=obi->next) {
- if(obi->flag & R_DUPLI_TRANSFORMED) {
- // compute object matrix with dupli transform, need to transform
- // obi->mat out of view space for it
- MTC_Mat4MulSerie(mat, re->viewinv, obi->mat, re->viewmat, obi->obr->ob->obmat, 0, 0, 0, 0);
- addDupliMtx(obi->obr->ob, mat);
- }
- }
-
- // Blender does not include object which have total 0 alpha materials,
- // however, the objects might have been included in the dupliMtx list,
- // so this will cause a 'Duplilist non-empty...' error after going through the renderlist.
- // To solve this, keep track of all render objects included sofar,
- // and remove from dupliMtx_list if object not found.
- // This should also help to solve some other yet undetected 'dupli..' errors,
- // but on the other hand that could also hide the real problem of course...
- map<string, Object*> renderobs;
-
- for(obr=(ObjectRen*)re->objecttable.first; obr; obr=obr->next) {
- for (int i=0; i < obr->totvlak; i++) {
-
- if ((i & 255)==0) vlr=obr->vlaknodes[i>>8].vlak; else vlr++;
-
- // ---- The materials & textures
- // in this case, probably every face has a material assigned, which can be the default material,
- // so checking that this is !0 is probably not necessary, but just in case...
- Material* matr = vlr->mat;
- if (matr) {
- // The default assigned material seems to be nameless, no MA id, an empty string.
- // Since this name is needed in yafray, make it 'blender_default'
- if (strlen(matr->id.name)==0)
- used_materials["blender_default"] = matr;
- else
- used_materials[matr->id.name] = matr;
- // textures, all active channels
- for (int m=0;m<MAX_MTEX;m++) {
- if (matr->septex & (1<<m)) continue; // only active channels
- MTex* mx = matr->mtex[m];
- // if no mtex, ignore
- if (mx==NULL) continue;
- // if no tex, ignore
- Tex* tx = mx->tex;
- if (tx==NULL) continue;
- short txtp = tx->type;
- // if texture type not available in yafray, ignore
- if ((txtp==0) ||
- (txtp==TEX_MAGIC) ||
- (txtp==TEX_PLUGIN) ||
- (txtp==TEX_ENVMAP)) continue;
- // if texture is stucci, only export if 'nor' enabled
- if ((txtp==TEX_STUCCI) && !((mx->mapto & MAP_NORM) || (mx->maptoneg & MAP_NORM))) continue;
- // In the case of an image texture, check that there is an actual image, otherwise ignore.
- // Stupid error was here (...if (txtp & TEX_IMAGE)...),
- // which happened to work sofar, but not anymore with the extended texture support..
- if ((txtp==TEX_IMAGE) && (!tx->ima)) continue;
- used_textures[tx->id.name] = mx;
- }
- }
-
- // Make list of faces per object, ignore <3 vert faces, duplicate vertex sorting done later.
- // ignore null object pointers.
- // Also make list of facetexture images (material 'TexFace').
- if (obr->ob) {
- int nv = 0; // number of vertices
- MTFace *tface;
-
- if (vlr->v4) nv=4; else if (vlr->v3) nv=3;
- if (nv) {
- renderobs[obr->ob->id.name] = obr->ob;
- all_objects[obr->ob].obr= obr;
- all_objects[obr->ob].faces.push_back(vlr);
-
- tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
- if (tface && tface->tpage) {
- Material* fmat = vlr->mat;
-
- // only save if TexFace enabled
- if(fmat && (fmat->mode & MA_FACETEXTURE))
- imagetex[tface->tpage].insert(fmat);
- }
- }
- }
-
- }
- }
-
- // now remove any objects from dupliMtx_list which are not in the renderlist
- for (map<string, vector<float> >::iterator dL=dupliMtx_list.begin();
- dL!=dupliMtx_list.end();)
- {
- string ro_name = dL->first;
- if (renderobs.find(ro_name)==renderobs.end()) {
- cout << "Object " << ro_name << " not in renderlist, removing from dupliMtx_list" << endl;
- dL->second.clear();
- ++dL;
- dupliMtx_list.erase(ro_name);
- }
- else
- ++dL;
- }
-
- // in case dupliMtx_list not empty, make sure that there is at least one source object
- // in all_objects with the name given in dupliMtx_list
- if (!dupliMtx_list.empty()) {
-
- for (map<Object*, yafrayObjectRen>::const_iterator obn=all_objects.begin();
- obn!=all_objects.end();++obn)
- {
- Object* obj = obn->first;
- string obname = obj->id.name;
- if (dupliMtx_list.find(obname)!=dupliMtx_list.end()) dup_srcob[obname] = obj;
- }
-
- // if the name reference list is empty, return now, something was seriously wrong
- if (dup_srcob.empty()) {
- // error() doesn't work to well, when switching from Blender to console at least, so use stdout instead
- cout << "ERROR: Duplilist non_empty, but no srcobs\n";
- return false;
- }
- }
-
- return true;
-}
-
-void yafrayRender_t::addDupliMtx(Object* obj, float mat[][4])
-{
- for (int i=0;i<4;i++)
- for (int j=0;j<4;j++)
- dupliMtx_list[obj->id.name].push_back(mat[i][j]);
-}
-
-
-#if 0
-
-bool yafrayRender_t::objectKnownData(Object* obj)
-{
- // if object data already known, no need to include in renderlist, otherwise save object datapointer
- if (objectData.find(obj->data)!=objectData.end()) {
- Object* orgob = objectData[obj->data];
- // first save original object matrix in dupliMtx_list, if not added yet
- if (dupliMtx_list.find(orgob->id.name)==dupliMtx_list.end()) {
- cout << "Added original matrix\n";
- addDupliMtx(orgob);
- }
- // then save matrix of linked object in dupliMtx_list, using name of ORIGINAL object
- for (int i=0;i<4;i++)
- for (int j=0;j<4;j++)
- dupliMtx_list[orgob->id.name].push_back(obj->obmat[i][j]);
- return true;
- }
- // object not known yet
- objectData[obj->data] = obj;
- return false;
-}
-#endif
-
diff --git a/source/blender/yafray/intern/yafray_Render.h b/source/blender/yafray/intern/yafray_Render.h
deleted file mode 100644
index 165cfefdbd0..00000000000
--- a/source/blender/yafray/intern/yafray_Render.h
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef __YAFRAY_RENDER_H
-#define __YAFRAY_RENDER_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "MEM_guardedalloc.h"
-#include "IMB_imbuf_types.h"
-
-#include "DNA_camera_types.h"
-#include "DNA_group_types.h"
-#include "DNA_image_types.h"
-#include "DNA_lamp_types.h"
-#include "DNA_material_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_object_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_texture_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_world_types.h"
-
-#include "BKE_global.h"
-
-#include "render_types.h"
-#include "renderdatabase.h"
-/* display_draw() needs render layer info */
-#include "renderpipeline.h"
-
-/* useful matrix & vector operations */
-#include "MTC_matrixops.h"
-#include "MTC_vectorops.h"
-
-#include "BLI_blenlib.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#ifdef __cplusplus
-#include <iostream>
-#include <iomanip>
-#include <sstream>
-#include <fstream>
-#include <map>
-#include <string>
-#include <vector>
-#include <set>
-
-class yafrayObjectRen {
- public:
- std::vector<VlakRen*> faces;
- ObjectRen *obr;
-};
-
-class yafrayRender_t
-{
- public:
- // ctor
- yafrayRender_t() {}
- // dtor
- virtual ~yafrayRender_t() {}
-
- // mtds
- bool exportScene(Render* re);
- void addDupliMtx(Object* obj, float mat[][4]);
- bool objectKnownData(Object* obj);
-
- protected:
- Render* re;
- Object* maincam_obj;
- float mainCamLens;
-
- bool hasworld;
-
- std::map<Object*, yafrayObjectRen> all_objects;
- std::map<std::string, Material*> used_materials;
- std::map<std::string, MTex*> used_textures;
- std::map<std::string, std::vector<float> > dupliMtx_list;
- std::map<std::string, Object*> dup_srcob;
- std::map<void*, Object*> objectData;
- std::map<Image*, std::set<Material*> > imagetex;
- std::map<std::string, std::string> imgtex_shader;
-
- bool getAllMatTexObs();
-
- virtual void writeTextures()=0;
- virtual void writeShader(const std::string &shader_name, Material* matr, const std::string &facetexname)=0;
- virtual void writeMaterialsAndModulators()=0;
- virtual void writeObject(Object* obj, ObjectRen *obr, const std::vector<VlakRen*> &VLR_list, const float obmat[4][4])=0;
- virtual void writeAllObjects()=0;
- virtual void writeLamps()=0;
- virtual void writeCamera()=0;
- virtual void writeAreaLamp(LampRen* lamp, int num, float iview[4][4])=0;
- virtual void writeHemilight()=0;
- virtual void writePathlight()=0;
- virtual bool writeWorld()=0;
- virtual bool writeRender()=0;
- virtual bool initExport()=0;
- virtual bool finishExport()=0;
-
- void clearAll();
-};
-
-#endif
-
-
-#endif /*__YAFRAY_RENDER_H */