From 7c4fccd6847fe2743708f9b8b54d0e62193d7244 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Mon, 1 Jun 2009 12:10:30 +0000 Subject: 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. --- source/blender/CMakeLists.txt | 4 - source/blender/Makefile | 2 +- source/blender/SConscript | 3 - source/blender/render/CMakeLists.txt | 7 +- source/blender/render/SConscript | 5 - source/blender/render/intern/source/Makefile | 1 - .../blender/render/intern/source/convertblender.c | 28 - source/blender/render/intern/source/pipeline.c | 76 - source/blender/yafray/CMakeLists.txt | 35 - source/blender/yafray/Makefile | 31 - source/blender/yafray/SConscript | 9 - source/blender/yafray/YafRay_Api.h | 15 - source/blender/yafray/intern/Makefile | 43 - source/blender/yafray/intern/api.cpp | 14 - source/blender/yafray/intern/export_File.cpp | 2060 -------------------- source/blender/yafray/intern/export_File.h | 34 - source/blender/yafray/intern/export_Plugin.cpp | 1990 ------------------- source/blender/yafray/intern/export_Plugin.h | 78 - source/blender/yafray/intern/yafexternal.cpp | 155 -- source/blender/yafray/intern/yafexternal.h | 186 -- source/blender/yafray/intern/yafray_Render.cpp | 239 --- source/blender/yafray/intern/yafray_Render.h | 110 -- 22 files changed, 2 insertions(+), 5123 deletions(-) delete mode 100644 source/blender/yafray/CMakeLists.txt delete mode 100644 source/blender/yafray/Makefile delete mode 100644 source/blender/yafray/SConscript delete mode 100644 source/blender/yafray/YafRay_Api.h delete mode 100644 source/blender/yafray/intern/Makefile delete mode 100644 source/blender/yafray/intern/api.cpp delete mode 100644 source/blender/yafray/intern/export_File.cpp delete mode 100644 source/blender/yafray/intern/export_File.h delete mode 100644 source/blender/yafray/intern/export_Plugin.cpp delete mode 100644 source/blender/yafray/intern/export_Plugin.h delete mode 100644 source/blender/yafray/intern/yafexternal.cpp delete mode 100644 source/blender/yafray/intern/yafexternal.h delete mode 100644 source/blender/yafray/intern/yafray_Render.cpp delete mode 100644 source/blender/yafray/intern/yafray_Render.h (limited to 'source/blender') 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 - -#include - -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 -#include -#include -#include -#include -#include - -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 -#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(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(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(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 << "\n\n"; - return true; -} - -bool yafrayFileRender_t::writeRender() -{ - // finally export render block - ostr.str(""); - ostr << "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\n"; - ostr << "\thorr << "\" g=\"" << world->horg << "\" b=\"" << world->horb << "\" />\n"; - } - ostr << "\t\n"; - - ostr << "\n\n"; - xmlfile << ostr.str(); - return true; -} - -bool yafrayFileRender_t::finishExport() -{ - xmlfile << "\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= 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; yresult->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 dupimg; - - for (map::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 << "first << "\" >\n"; - ostr << "\t\n"; - ostr << "\t\t\n"; - ostr << "\t\t\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\n"; - ostr << "\t\t\n"; // for stucci always 0 - } - else ostr << "\t\tnoisedepth << "\" />\n"; - ostr << "\t\tstype << "\" />\n"; - ostr << "\t\t\n"; - ostr << "\t\n\n\n"; - xmlfile << ostr.str(); - break; - } - case TEX_WOOD: { - ostr.str(""); - ostr << "first << "\" >\n"; - ostr << "\t\t\n"; - // blender does not use depth value for wood, always 0 - ostr << "\t\t\n"; - float turb = (tex->stype<2) ? 0.0 : tex->turbul; - ostr << "\t\t\n"; - ostr << "\t\t\n"; - ostr << "\t\t\n"; - ts = (tex->stype & 1) ? "rings" : "bands"; //stype 1&3 ringtype - ostr << "\t\t\n"; - ostr << "\t\t\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\n"; - ostr << "\t\n\n\n"; - xmlfile << ostr.str(); - break; - } - case TEX_MARBLE: { - ostr.str(""); - ostr << "first << "\" >\n"; - ostr << "\t\n"; - ostr << "\t\tnoisedepth << "\" />\n"; - ostr << "\t\tturbul << "\" />\n"; - ostr << "\t\t\n"; - ostr << "\t\t\n"; - ostr << "\t\tstype) << "\" />\n"; - ostr << "\t\t\n"; - ts = "sin"; - if (tex->noisebasis2==1) ts="saw"; else if (tex->noisebasis2==2) ts="tri"; - ostr << "\t\t\n"; - ostr << "\t\n\n\n"; - xmlfile << ostr.str(); - break; - } - case TEX_VORONOI: { - ostr.str(""); - ostr << "first << "\" >\n"; - ostr << "\t\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\n"; - ostr << "\t\tvn_w1 << "\" />\n"; - ostr << "\t\tvn_w2 << "\" />\n"; - ostr << "\t\tvn_w3 << "\" />\n"; - ostr << "\t\tvn_w4 << "\" />\n"; - ostr << "\t\tvn_mexp << "\" />\n"; - ostr << "\t\tns_outscale << "\" />\n"; - ostr << "\t\t\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\n"; - ostr << "\t\n\n\n"; - xmlfile << ostr.str(); - break; - } - case TEX_MUSGRAVE: { - ostr.str(""); - ostr << "first << "\" >\n"; - ostr << "\t\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\n"; - ostr << "\t\t\n"; - ostr << "\t\tmg_H << "\" />\n"; - ostr << "\t\tmg_lacunarity << "\" />\n"; - ostr << "\t\tmg_octaves << "\" />\n"; - if ((tex->stype==TEX_HTERRAIN) || (tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF)) { - ostr << "\t\tmg_offset << "\" />\n"; - if ((tex->stype==TEX_RIDGEDMF) || (tex->stype==TEX_HYBRIDMF)) - ostr << "\t\tmg_gain << "\" />\n"; - } - ostr << "\t\t\n"; - ostr << "\t\tns_outscale << "\" />\n"; - ostr << "\t\n\n\n"; - xmlfile << ostr.str(); - break; - } - case TEX_DISTNOISE: { - ostr.str(""); - ostr << "first << "\" >\n"; - ostr << "\t\n"; - ostr << "\t\tdist_amount << "\" />\n"; - ostr << "\t\t\n"; - ostr << "\t\t\n"; - ostr << "\t\tnoisebasis2) << "\" />\n"; - ostr << "\t\n\n\n"; - xmlfile << ostr.str(); - break; - } - case TEX_BLEND: { - ostr.str(""); - ostr << "first << "\" >\n"; - ostr << "\t\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\n"; - if (tex->flag & TEX_FLIPBLEND) ts="on"; else ts="off"; - ostr << "\t\t\n"; - ostr << "\t\n\n\n"; - xmlfile << ostr.str(); - break; - } - case TEX_NOISE: { - ostr.str(""); - ostr << "first << "\" >\n"; - ostr << "\t\n"; - ostr << "\t\tnoisedepth << "\" />\n"; - ostr << "\t\n\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 << "id.name << "\" >\n"; - ostr << "\t\n"; - string texpath(ima->name); - adjustPath(texpath); - ostr << "\t\t\n"; - ostr << "\t\timaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n"; - ostr << "\t\n\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 << "first + "_coba" << "\" >\n"; - ostr << "\t\n"; - ostr << "\t\tfirst << "\" />\n"; - ostr << "\t\n"; - for (int i=0;itot;i++) { - ostr << "\tdata[i].pos << "\" >\n"; - ostr << "\t\tdata[i].r << "\"" << - " g=\"" << cb->data[i].g << "\"" << - " b=\"" << cb->data[i].b << "\"" << - " a=\"" << cb->data[i].a << "\" />\n"; - ostr << "\t\n"; - } - ostr << "\n\n"; - xmlfile << ostr.str(); - } - } - - } - - // If used, textures for the material 'TexFace' case - if (!imagetex.empty()) { - for (map >::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 << "id.name << "\" >\n"; - ostr << "\t\n"; - string texpath(ima->name); - adjustPath(texpath); - ostr << "\t\t\n"; - ostr << "\t\n\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 << "\n"; - ostr << "\t\n\t\n"; - for (int i=0;itot;i++) { - ostr << "\tdata[i].pos << "\" >\n"; - ostr << "\t\tdata[i].r << "\"" << - " g=\"" << cb->data[i].g << "\"" << - " b=\"" << cb->data[i].b << "\"" << - " a=\"" << cb->data[i].a << "\" />\n"; - ostr << "\t\n"; - } - ostr << "\n\n"; - xmlfile << ostr.str(); - } - cb = matr->ramp_spec; - if ((matr->mode & MA_RAMP_SPEC) && (cb!=NULL)) - { - ostr.str(""); - ostr << "\n"; - ostr << "\t\n\t\n"; - for (int i=0;itot;i++) { - ostr << "\tdata[i].pos << "\" >\n"; - ostr << "\t\tdata[i].r << "\"" << - " g=\"" << cb->data[i].g << "\"" << - " b=\"" << cb->data[i].b << "\"" << - " a=\"" << cb->data[i].a << "\" />\n"; - ostr << "\t\n"; - } - ostr << "\n\n"; - xmlfile << ostr.str(); - } - } - - ostr.str(""); - ostr << "\n"; - ostr << "\t\n"; - ostr << "\t\tr << "\" 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\n"; - ostr << "\t\tmirr << "\" g=\"" << matr->mirg << "\" b=\"" << matr->mirb << "\" />\n"; - ostr << "\t\tref << "\" />\n"; - ostr << "\t\tspec << "\" />\n"; - ostr << "\t\talpha << "\" />\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\temit * bg_mult) << "\" />\n"; - - // reflection/refraction - if ( (matr->mode & MA_RAYMIRROR) || (matr->mode & MA_RAYTRANSP) ) - ostr << "\t\tang << "\" />\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\n"; - ostr << "\t\tray_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\n"; - - // for backward compatibility, also add old 'reflected' parameter, copy of mirror_color - ostr << "\t\tmirr << "\" 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\n"; - - } - - if (matr->mode & MA_RAYTRANSP) - { - ostr << "\t\t\n"; - ostr << "\t\tfilter << "\" />\n"; - // tir on by default - ostr << "\t\t\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\n"; - // dispersion - ostr << "\t\tYF_dpwr << "\" />\n"; - ostr << "\t\tYF_dsmp << "\" />\n"; - ostr << "\t\tYF_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\tr*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\n"; - - // diffuse & specular brdf, lambert/cooktorr defaults - // diffuse - if (matr->diff_shader==MA_DIFF_ORENNAYAR) { - ostr << "\t\t\n"; - ostr << "\t\troughness << "\" />\n"; - } - else if (matr->diff_shader==MA_DIFF_TOON) { - ostr << "\t\t\n"; - ostr << "\t\tparam[0] << "\" />\n"; - ostr << "\t\tparam[1] << "\" />\n"; - } - else if (matr->diff_shader==MA_DIFF_MINNAERT) { - ostr << "\t\t\n"; - ostr << "\t\tdarkness << "\" />\n"; - } - else ostr << "\t\t\n"; - // specular - if (matr->spec_shader==MA_SPEC_PHONG) { - ostr << "\t\t\n"; - ostr << "\t\thar << "\" />\n"; - } - else if (matr->spec_shader==MA_SPEC_BLINN) { - ostr << "\t\t\n"; - ostr << "\t\trefrac << "\" />\n"; - ostr << "\t\thar << "\" />\n"; - } - else if (matr->spec_shader==MA_SPEC_TOON) { - ostr << "\t\t\n"; - ostr << "\t\tparam[2] << "\" />\n"; - ostr << "\t\tparam[3] << "\" />\n"; - } - else if (matr->spec_shader==MA_SPEC_WARDISO) { - ostr << "\t\t\n"; - ostr << "\t\trms << "\" />\n"; - ostr << "\t\trms << "\" />\n"; - } - else { - ostr << "\t\t\n"; - ostr << "\t\thar << "\" />\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\n"; - ostr << "\t\trampin_col] << "\" />\n"; - ostr << "\t\trampblend_col] << "\" />\n"; - ostr << "\t\trampfac_col << "\" />\n"; - } - // specular - if ((matr->mode & MA_RAMP_SPEC) && (matr->ramp_spec!=NULL)) { - ostr << "\t\t\n"; - ostr << "\t\trampin_spec] << "\" />\n"; - ostr << "\t\trampblend_spec] << "\" />\n"; - ostr << "\t\trampfac_spec << "\" />\n"; - } - } - - ostr << "\t\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\n"; - ostr << "\t\t\n"; - ostr << "\t\t\n"; - ostr << "\t\n"; - xmlfile << ostr.str(); - } - - for (int m2=0;m2septex & (1<mtex[m2]; - if (mtex==NULL) continue; - - // ignore null tex - Tex* tex = mtex->tex; - if (tex==NULL) continue; - - map::const_iterator mtexL = used_textures.find(string(tex->id.name)); - if (mtexL!=used_textures.end()) { - - ostr.str(""); - ostr << "\t\n"; - // when no facetex used, shader_name is created from original material name - if (facetexname.length()!=0) - ostr << "\t\tid.name << "_map" << m2 << "\" />\n"; - else - ostr << "\t\t\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\tblendtype] << "\" />\n"; - - // texture color (for use with MUL and/or no_rgb etc..) - ostr << "\t\tr << "\" g=\"" << mtex->g << "\" b=\"" << mtex->b << "\" />\n"; - - // texture contrast, brightness & color adjustment - ostr << "\t\trfac << "\" g=\"" << tex->gfac << "\" b=\"" << tex->bfac << "\" />\n"; - ostr << "\t\tcontrast << "\" />\n"; - ostr << "\t\tbright << "\" />\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\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\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\n"; - - // CMir, mirror color modulation - if (mtex->mapto & MAP_COLMIR) - ostr << "\t\t\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\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\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\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\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\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\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\n"; - } - - // colfac, controls amount of color modulation - ostr << "\t\tcolfac << "\" />\n"; - - // def_var - ostr << "\t\tdef_var << "\" />\n"; - - //varfac - ostr << "\t\tvarfac << "\" />\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\n"; - } - - // image as normalmap flag - if (tex->imaflag & TEX_NORMALMAP) ostr << "\t\t\n"; - - ostr << "\t\n"; - xmlfile << ostr.str(); - - } - } - xmlfile << "\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::const_iterator blendmat=used_materials.begin(); - blendmat!=used_materials.end();++blendmat) - { - - Material* matr = blendmat->second; - - // mapper(s) - for (int m=0;mseptex & (1<mtex[m]; - if (mtex==NULL) continue; - // ignore null tex - Tex* tex = mtex->tex; - if (tex==NULL) continue; - - map::const_iterator mtexL = used_textures.find(string(tex->id.name)); - if (mtexL!=used_textures.end()) { - ostr.str(""); - ostr << "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\n"; - - // use image name instead of texname when texture is image - if ((tex->type==TEX_IMAGE) && tex->ima) - ostr << "\t\tima->id.name << "\" />\n"; - else if ((tex->flag & TEX_COLORBAND) & (tex->coba!=NULL)) - ostr << "\t\tfirst + "_coba" << "\" />\n"; - else - ostr << "\t\tfirst << "\" />\n"; - - // texture size - ostr << "\t\tsize[0] << "\" />\n"; - ostr << "\t\tsize[1] << "\" />\n"; - ostr << "\t\tsize[2] << "\" />\n"; - - // texture offset - ostr << "\t\tofs[0] << "\" />\n"; - ostr << "\t\tofs[1] << "\" />\n"; - ostr << "\t\tofs[2] << "\" />\n"; - - // texture coordinates, have to disable 'sticky' in Blender - if (mtex->texco & TEXCO_UV) - ostr << "\t\t\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 - ostr << "\t\t\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\n"; - else if (mtex->texco & TEXCO_WINDOW) - ostr << "\t\t\n"; - else if (mtex->texco & TEXCO_NORM) - ostr << "\t\t\n"; - else if (mtex->texco & TEXCO_REFL) - ostr << "\t\t\n"; - - // texture projection axes, both image & procedural - string proj = "nxyz"; // 'n' for 'none' - ostr << "\t\tprojx] << "\" />\n"; - ostr << "\t\tprojy] << "\" />\n"; - ostr << "\t\tprojz] << "\" />\n"; - - // texture mapping parameters only relevant to image type - if (tex->type==TEX_IMAGE) { - if (mtex->mapping==MTEX_FLAT) - ostr << "\t\t\n"; - else if (mtex->mapping==MTEX_CUBE) - ostr << "\t\t\n"; - else if (mtex->mapping==MTEX_TUBE) - ostr << "\t\t\n"; - else if (mtex->mapping==MTEX_SPHERE) - ostr << "\t\t\n"; - - // repeat - ostr << "\t\txrepeat << "\" />\n"; - ostr << "\t\tyrepeat << "\" />\n"; - - // clipping - if (tex->extend==TEX_EXTEND) - ostr << "\t\t\n"; - else if (tex->extend==TEX_CLIP) - ostr << "\t\t\n"; - else if (tex->extend==TEX_CLIPCUBE) - ostr << "\t\t\n"; - else if (tex->extend==TEX_CHECKER) { - ostr << "\t\t\n"; - string ts = ""; - if (tex->flag & TEX_CHECKER_ODD) ts += "odd"; - if (tex->flag & TEX_CHECKER_EVEN) ts += " even"; - ostr << "\t\t\n"; - ostr << "\t\tcheckerdist << "\" />\n"; - } - else - ostr << "\t\t\n"; - - // crop min/max - ostr << "\t\tcropxmin << "\" />\n"; - ostr << "\t\tcropymin << "\" />\n"; - ostr << "\t\tcropxmax << "\" />\n"; - ostr << "\t\tcropymax << "\" />\n"; - - // rot90 flag - string ts = "off"; - if (tex->imaflag & TEX_IMAROT) ts = "on"; - ostr << "\t\t\n"; - } - - ostr << "\t\n"; - ostr << "\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 >::const_iterator imgtex=imagetex.begin(); - imgtex!=imagetex.end();++imgtex) - { - - for (set::const_iterator imgmat=imgtex->second.begin(); - imgmat!=imgtex->second.end();++imgmat) - { - Material* matr = *imgmat; - // mapper - ostr.str(""); - ostr << "id.name) + "_ftmap" << snum << "\" >\n"; - ostr << "\t\n"; - ostr << "\t\tfirst->id.name << "\" />\n"; - // all yafray default settings, except for texco, so no need to set others - ostr << "\t\t\n"; - ostr << "\t\n"; - ostr << "\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 &VLR_list, const float obmat[4][4]) -{ - ostr.str(""); - // transform first (not necessarily actual obj->obmat, can be duplivert see below) - ostr << "\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(re->objecttable.first); - obren; obren=static_cast(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 << "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\n"; - if (caus) - { - float tr = 1.0-face0mat->alpha; - ostr << "\t\tr*tr - << "\" g=\"" << face0mat->g*tr - << "\" b=\"" << face0mat->b*tr << "\" />\n"; - tr = face0mat->ray_mirror; - ostr << "\t\tmirr*tr - << "\" g=\"" << face0mat->mirg*tr - << "\" b=\"" << face0mat->mirb*tr << "\" />\n"; - } - ostr << "\t\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 << "\tsmoothresh << "\" 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\n"; - else - xmlfile << "\t\n"; //0 shows artefacts - } - - // now all vertices - map 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\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::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

\n"; - // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping - if (has_orco==1) { - ostr << "\t\t\t

accum - << "\" y=\"" << ver->accum - << "\" z=\"" << ver->accum << "\" />\n"; - } - else if (has_orco==2) { - orco = ver->orco; - ostr << "\t\t\t

\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

\n"; - // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping - if (has_orco==1) { - ostr << "\t\t\t

accum - << "\" y=\"" << ver->accum - << "\" z=\"" << ver->accum << "\" />\n"; - } - else if (has_orco==2) { - orco = ver->orco; - ostr << "\t\t\t

\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

\n"; - // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping - if (has_orco==1) { - ostr << "\t\t\t

accum - << "\" y=\"" << ver->accum - << "\" z=\"" << ver->accum << "\" />\n"; - } - else if (has_orco==2) { - orco = ver->orco; - ostr << "\t\t\t

\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

\n"; - // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping - if (has_orco==1) { - ostr << "\t\t\t

accum - << "\" y=\"" << ver->accum - << "\" z=\"" << ver->accum << "\" />\n"; - } - else if (has_orco==2) { - orco = ver->orco; - ostr << "\t\t\t

\n"; - } - } - xmlfile << ostr.str(); - } - xmlfile << "\t\t\n"; - - // all faces using the index list created above - xmlfile << "\t\t\n"; - for (vector::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\tflag & 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(&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(&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(&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\tuv[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(&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(&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(&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\n\t\n

\n
\n\n"; -} - - -// write all objects -void yafrayFileRender_t::writeAllObjects() -{ - - // first all objects except dupliverts (and main instance object for dups) - for (map::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 >::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;curmtxsecond.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 << "\n"; - xmlfile << ostr.str(); - - // new name from original - ostr.str(""); - ostr << "id.name << "_dup" << (curmtx>>4) << "\" original=\"" << obj->id.name << "\" >\n"; - xmlfile << ostr.str(); - xmlfile << "\t\n\t\n\t\n\n\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 << "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\n"; - ostr << "\t\n"; - ostr << "\t\n"; - ostr << "\t\n"; - - ostr << "\tr << "\" g=\"" << lamp->g << "\" b=\"" << lamp->b << "\" />\n"; - ostr << "\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 << "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\n"; - else - ostr << "\t\n"; - // 'to' for spot/photonlight, already calculated by Blender - if ((lamp->type==LA_SPOT) || (lamp->type==LA_YF_PHOTON)) { - ostr << "\t\n"; - if (has_halo) ostr << "\t\n"; - } - - // color - // rgb in LampRen is premultiplied by energy, power is compensated for that above - ostr << "\tr << "\" g=\"" << lamp->g << "\" b=\"" << lamp->b << "\" />\n"; - ostr << "\n\n"; - xmlfile << ostr.str(); - } -} - -// write main camera -void yafrayFileRender_t::writeCamera() -{ - // here Global used again - ostr.str(""); - ostr << "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 << "\tobmat[3][0] << "\"" - << " y=\"" << maincam_obj->obmat[3][1] << "\"" - << " z=\"" << maincam_obj->obmat[3][2] << "\" />\n"; - ostr << "\tobmat[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 << "\tobmat[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 << "\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 << "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 << "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 << "\n\n"; - xmlfile << ostr.str(); -} - -void yafrayFileRender_t::writePathlight() -{ - ostr.str(""); - if (re->r.GIphotons) - { - ostr << "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 << "\" >"<"<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 << "\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;imtex[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 << "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\n"; - ostr << "\ttex->imaflag & TEX_INTERPOL) ? "bilinear" : "none") << "\" />\n"; - if (wtex->tex->filtersize>1.f) ostr << "\t\n"; - ostr << "\n\n"; - xmlfile << ostr.str(); - return true; - } - } - - ostr.str(""); - ostr << "\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 << "\thorr * bg_mult) << - "\" g=\"" << (world->horg * bg_mult) << - "\" b=\"" << (world->horb * bg_mult) << "\" />\n"; - ostr << "\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 -"< &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 - -#include - -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 -#include -#include -#include -#include -#include -#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 -#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 dupimg; - - yafray::paramMap_t params; - list lparams; - for (map::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<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;itot;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 >::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 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;itot;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;itot;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;m2septex & (1<mtex[m2]; - if (mtex==NULL) continue; - // ignore null tex - Tex* tex = mtex->tex; - if (tex==NULL) continue; - - map::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 lparams; - for (map::const_iterator blendmat=used_materials.begin(); - blendmat!=used_materials.end();++blendmat) - { - Material* matr = blendmat->second; - // mapper(s) - for (int m=0;mseptex & (1<mtex[m]; - if (mtex==NULL) continue; - // ignore null tex - Tex* tex = mtex->tex; - if (tex==NULL) continue; - - map::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 - 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 >::const_iterator imgtex=imagetex.begin(); - imgtex!=imagetex.end();++imgtex) - { - - for (set::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 &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 &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(&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(&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(&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 &faces,vector &shaders,vector &faceshader, - vector &uvcoords,vector &vcol, - map &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;iactmtface, 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 &faces,/*vector &shaders,*/vector &faceshader, - vector &uvcoords,vector &vcol, - map &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 &verts, int &vidx, - map &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 &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 verts; - vector vcol; - // now all vertices - map vert_idx; // for removing duplicate verts and creating an index list - int vidx = 0; // vertex index counter - bool has_uv=false; - for (vector::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 faces; - vector shaders; - vector faceshader; - vector uvcoords; - for (vector::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(re->objecttable.first); - obren; obren=static_cast(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::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 >::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;curmtxsecond.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;imtex[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 &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 &uvcoords,ObjectRen *obr,VlakRen *vlr,MTFace* uvc, bool comple=false); - void genVcol(std::vector &vcol, ObjectRen *obr, VlakRen *vlr, bool comple=false); - void genFace(std::vector &faces,std::vector &shaders,std::vector &faceshader, - std::vector &uvcoords,std::vector &vcol, - std::map &vert_idx,ObjectRen *obr,VlakRen *vlr, - int has_orco,bool has_uv); - void genCompleFace(std::vector &faces,/*std::vector &shaders,*/std::vector &faceshader, - std::vector &uvcoords,std::vector &vcol, - std::map &vert_idx,ObjectRen *obr, VlakRen *vlr, - int has_orco,bool has_uv); - void genVertices(std::vector &verts, int &vidx, - std::map &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 -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::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::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::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::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::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::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::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::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::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::const_iterator i=dicc.begin();i!=dicc.end();++i) - if(!( (*i).second.used )) - std::cout<<"[WARNING]:Unused param "<<(*i).first<<" in "< -#include -#include -#include - -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 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 &, - 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 &verts, const std::vector &faces, - std::vector &uvcoords, std::vector &vcol, - const std::vector &shaders,const std::vector &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 &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 - -#include - -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 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;mseptex & (1<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 >::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::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 -#include -#include -#include -#include -#include -#include -#include - -class yafrayObjectRen { - public: - std::vector 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 all_objects; - std::map used_materials; - std::map used_textures; - std::map > dupliMtx_list; - std::map dup_srcob; - std::map objectData; - std::map > imagetex; - std::map 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 &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 */ -- cgit v1.2.3