aboutsummaryrefslogtreecommitdiff
path: root/vrayPlug/plugin/pluginMain.cpp
diff options
context:
space:
mode:
authorBen Marsh <[email protected]>2019-10-22 09:07:59 -0400
committerBen Marsh <[email protected]>2019-10-22 09:07:59 -0400
commitbd0027e737c6512397f841c22786274ed74b927f (patch)
treef7ffbdb8f3741bb7f24635616cc189cba5cb865c /vrayPlug/plugin/pluginMain.cpp
downloadshave-and-a-haircut-bd0027e737c6512397f841c22786274ed74b927f.tar.xz
shave-and-a-haircut-bd0027e737c6512397f841c22786274ed74b927f.zip
Adding Shave-and-a-Haircut 9.6
Diffstat (limited to 'vrayPlug/plugin/pluginMain.cpp')
-rw-r--r--vrayPlug/plugin/pluginMain.cpp259
1 files changed, 259 insertions, 0 deletions
diff --git a/vrayPlug/plugin/pluginMain.cpp b/vrayPlug/plugin/pluginMain.cpp
new file mode 100644
index 0000000..f225ae3
--- /dev/null
+++ b/vrayPlug/plugin/pluginMain.cpp
@@ -0,0 +1,259 @@
+// Shave and a Haircut
+// (c) 2019 Epic Games
+// US Patent 6720962
+
+#include "shaveVrayPlugin.h"
+#include "shaveVrayDesc.h"
+#include "shaveVraySharedFunctions.h"
+
+extern "C"
+{
+#include "shaveSDKFUNCS2.h"
+}
+
+using namespace VR;
+
+// defined in shaveVrayPlugin.cpp; set to true if SHAVE2init() has been called.
+extern int shaveInitCalled;
+
+struct shaveVrayParams: public VR::VRayParameterListDesc {
+public:
+ shaveVrayParams() {
+ // Cannot initialise here because this struct is initialised
+ // when the plugin is loaded before the check for V-Ray's
+ // version runs and the addParamX methods of V-Ray 3 and 4
+ // differ. This leads to a crash on MacOS. On other OSes the
+ // dll simply doesn't load.
+ }
+ void init();
+ virtual ~shaveVrayParams(){}
+};
+
+
+void shaveVrayParams::init()
+{
+ addParamInt (VR30_CONST_STR_HACK("stackId"), 0, -1);
+ addParamInt (VR30_CONST_STR_HACK("instanced"),0, -1);
+ addParamInt (VR30_CONST_STR_HACK("ownshader"),1, -1);
+ addParamInt (VR30_CONST_STR_HACK("squirrel"),0, -1);
+ addParamInt (VR30_CONST_STR_HACK("tipfade"),0, -1);
+ addParamColor (VR30_CONST_STR_HACK("spectint"), VR::Color(1.0f,1.0f,1.0f), -1);
+ addParamColor (VR30_CONST_STR_HACK("spectint2"),VR::Color(0.0f,0.0f,0.0f), -1);
+ addParamString(VR30_CONST_STR_HACK("draFile"), "",-1);
+ addParamString(VR30_CONST_STR_HACK("libPath"), "",-1);
+
+ //uvs relaated params
+ //DefVectorListParam is used for uvs list
+ addParamInt(VR30_CONST_STR_HACK("numFacesPerInst"),0,-1);
+ addParamInt(VR30_CONST_STR_HACK("numUVSets"),0,-1);
+ //If -1, then this is not a list parameter;
+ //if 0 then this is a list parameter of unspecified (arbitrary) length.
+ //If this is >0, then it is the number of required elements in the parameter.
+ addParamVector(VR30_CONST_STR_HACK("uvs"),VR::Vector(),0);
+
+ addParamInt(VR30_CONST_STR_HACK("draData"),0,0);
+ addParamInt(VR30_CONST_STR_HACK("draSize"),0,-1);
+
+ //visibility related params
+ addParamInt(VR30_CONST_STR_HACK("cameraVisibility"),1, -1);
+ addParamInt(VR30_CONST_STR_HACK("reflVisibility"),1, -1);
+ addParamInt(VR30_CONST_STR_HACK("refrVisibility"),1, -1);
+ addParamInt(VR30_CONST_STR_HACK("lightVisibility"),1, -1);
+ addParamInt(VR30_CONST_STR_HACK("GiVisibility"),1, -1);
+
+ addParamFloat(VR30_CONST_STR_HACK("selfShadow"),1.0f, -1);
+ addParamInt(VR30_CONST_STR_HACK("recvShadow"),1, -1);
+#if defined(VRAY30) || defined(VRAY40)
+ addParamInt(VR30_CONST_STR_HACK("useGlobalHairTree"),1 /*1*/, -1);
+ addParamInt(VR30_CONST_STR_HACK("dynamicHairTesselation"),0, -1);
+ addParamFloat(VR30_CONST_STR_HACK("hairTesselMaxEdgleLen"),4.0f, -1);
+#endif
+}
+
+#if defined(VRAY40)
+# define BUILT_FOR "4.0"
+#elif defined(VRAY30)
+# if VRAY_DLL_VERSION < 0x31000
+# define BUILT_FOR "3.0"
+# elif VRAY_DLL_VERSION < 0x36000
+# define BUILT_FOR "3.1"
+# else
+# define BUILT_FOR "3.6"
+# endif
+#else
+# define BUILT_FOR "2.0"
+#endif
+
+// We don't use the PLUGIN_DESC macro as we need to call the Shave cleanup function
+// when the plugin is unloaded.
+class shaveVrayPluginDesc: public VRayPluginDesc {
+ int attachCount;
+ VUtils::FastCriticalSection attachCsect;
+public:
+ shaveVrayParams shaveVrayPlugin_params;
+ shaveVrayPluginDesc(void):VRayPluginDesc(NULL), attachCount(0) {
+ parameters=&shaveVrayPlugin_params;
+ (*getNumDescs())++;
+ DescList *nd=new DescList;
+ nd->desc=this;
+ nd->next=(*getFirstDesc());
+ (*getFirstDesc())=nd;
+
+ unsigned int vr_rev = VR::getVRayRevision();
+
+ unsigned int vr_rev_max;
+ unsigned int vr_rev_min;
+#if defined(VRAY40)
+ vr_rev_min = 0x40000;
+ vr_rev_max = 0x50000;
+#elif defined(VRAY30)
+# if VRAY_DLL_VERSION < 0x31000
+ vr_rev_min = 0x30000;
+ vr_rev_max = 0x31000;
+# elif VRAY_DLL_VERSION < 0x36000
+ vr_rev_min = 0x31000;
+ vr_rev_max = 0x36000;
+# else
+ vr_rev_min = 0x31000;
+ vr_rev_max = 0x40000;
+# endif
+#else
+ vr_rev_min = 0;
+ vr_rev_max = 0x30000;
+#endif
+ if (vr_rev < vr_rev_min || vr_rev >= vr_rev_max) {
+ (*getNumDescs())=0;
+ (*getFirstDesc())=NULL;
+ printf("Skipping shave shaders for V-Ray " BUILT_FOR ".\n");fflush(stdout);
+ } else {
+ shaveVrayPlugin_params.init();
+ printf("Loaded shave shaders for V-Ray " BUILT_FOR ".\n");fflush(stdout);
+ }
+ }
+ PluginID getPluginID(void) { return shaveVrayPluginID; }
+ Plugin* newPlugin(PluginHost *host) { return new shaveVrayPlugin(this); }
+ void deletePlugin(Plugin *obj) { delete (shaveVrayPlugin*) obj; }
+ bool supportsInterface(InterfaceID id) { return (id==EXT_STATIC_GEOM_SOURCE) || (id==EXT_VRAY_PLUGIN); }
+#ifdef VRAY40
+ const tchar *getName(void) { return shaveVrayPluginName; }
+ const tchar *getDescription() const { return "Shave and a Haircut support for V-Ray"; }
+#else
+ tchar *getName(void) { return const_cast<tchar*>(shaveVrayPluginName); }
+#endif
+ const tchar *getCopyright(void) { return "(c) 2019 Epic Games"; }
+
+ void attachToHost(PluginHost *host) {
+ VUtils::FastCriticalSectionRAII lock(attachCsect);
+ attachCount++;
+ }
+
+ void detachFromHost(PluginHost *host) {
+ VRayPluginDesc::detachFromHost(host);
+
+ VUtils::FastCriticalSectionRAII lock(attachCsect);
+ attachCount--;
+ // Call Shave cleanup, but only if it has been initialized for some render before.
+ if (shaveInitCalled && attachCount==0) {
+ SHAVE2cleanup();
+ shaveInitCalled=false;
+ }
+ }
+};
+
+static shaveVrayPluginDesc desc_shaveVrayPlugin;
+
+// PLUGIN_DESC(shaveVrayPluginID, EXT_STATIC_GEOM_SOURCE, shaveVrayPluginName, shaveVrayPlugin, shaveVrayParams);
+
+PLUGIN_LIBRARY(VR30_CONST_STR_HACK("shavePlugins"), VR30_CONST_STR_HACK("shaveVrayShader plug-in."));
+
+#ifdef WIN32
+#ifdef _MANAGED
+#pragma managed(push, off)
+#endif
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ hInstance = hModule;
+
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ {
+#if 0 // this is handled in the PluginDesc constructor now
+ unsigned int vr_rev = VR::getVRayRevision();
+ //printf("vray version 0x%x \n", vr_rev);fflush(stdout);
+#ifdef VRAY30
+ if(vr_rev < 0x30000)
+ {
+ //its not a cracefull exit becuse fires dll loading error
+ //need better solution.
+ //return FALSE;
+
+ //3.0 does not fire error, while 2.0 does
+ //gr, 3.0 does as well
+ (*getNumDescs())=0;
+ (*getFirstDesc())=NULL;
+ printf("Skipping shave shaders for Vray 3.0.\n");fflush(stdout);
+ } else
+ printf("Shave shaders for Vray 3.0 loaded.\n");fflush(stdout);
+#else
+ if(vr_rev >= 0x30000)
+ {
+ //its not a cracefull exit becuse fires dll loading error
+ //need better solution.
+ //return FALSE;
+
+ (*getNumDescs())=0;
+ (*getFirstDesc())=NULL;
+ printf("Skipping shave shaders for Vray 2.0.\n");fflush(stdout);
+ } else
+ printf("Shave shaders for Vray 2.0 loaded.\n");fflush(stdout);
+#endif
+#endif
+ char* temp = getenv("TEMP");
+ char path[MAX_PATH];
+#ifdef DO_LOGS
+ sprintf(path,"%s/vray_Shave.log",temp);
+ alog = fopen(path,"w");
+ LOGMSG("DLL", "shaveVrayShader DLL loaded.")
+#endif
+ // Don't init Shave here; do that on demand in the shaveVrayPlugin::renderBegin().
+ // In this way Shave is not initialized at all if it is not used in the scene.
+ // SHAVE2init();
+ }
+ break;
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ break;
+ case DLL_PROCESS_DETACH:
+ {
+ // Do not cleanup Shave here; do that in the hostDetach() method of the plugin
+ // descriptor. This is because SHAVE2cleanup() cleans up some threads and it waits for them
+ // to complete, however calls to DllMain() are serialized and SHAVE2cleanup() may
+ // hang indefinitely as some threads attempt to call DllMain() for DLL_THREAD_DETACH.
+ // SHAVE2cleanup();
+ printf("Shave shaders for Vray unloaded.\n");fflush(stdout);
+#ifdef DO_LOGS
+ if(alog)
+ {
+ LOGMSG("DLL", "shaveVrayShader DLL unloaded.")
+ fclose(alog);
+ alog = NULL;
+ }
+#endif
+ }
+ break;
+ }
+ return TRUE;
+}
+
+
+#ifdef _MANAGED
+#pragma managed(pop)
+#endif
+#endif
+
+