// Shave and a Haircut // (c) 2019 Epic Games // US Patent 6720962 /********************************************************************** *< FILE: shaveVrayInstanceBase.cpp DESCRIPTION: VRay base class for regular and insted hair VRay instance classes CREATED BY: Vladimir Dubovoy HISTORY: created 12-05-2010 *> **********************************************************************/ #include "shaveVrayInstanceBase.h" //IHairStack* shaveVrayInstanceBase::stack = NULL; IHairStack* stack = NULL; void shaveVrayInstanceBase::loadHair() { if(!stack) { //we can not do it in standalone case //shaveVrayIntListParam* dataParam = plugin->GetDataParam(); //shaveVrayIntParam* dataSizeParam = plugin->GetDataSizeParam(); bool dra_as_param = false; bool dra_as_file = false; VR::VRayPluginParameter *dataParam=plugin->paramList->getParam("draData"); VR::VRayPluginParameter *dataSizeParam=plugin->paramList->getParam("draSize"); if(dataSizeParam && dataParam /*&& dataParam->getCount(0) > 0*/) { LOGMSG("SHAVE", "shaveVrayInstance: importing DRA from memory"); VR::IntList L = dataParam->getIntList(0); //int N = dataParam->getCount(0); int N = L.count(); int size = dataSizeParam->getInt(0,0); if(N > 0 && size > 0) { dra_as_param = true; LOGMSGI("SHAVE", "shaveVrayInstance: DRA data size ", size); LOGMSGI("SHAVE", "shaveVrayInstance: DRA intlist count ", N); int extra = 0; int n = size/sizeof(int); if(size > n*sizeof(int)) { extra = size - n*sizeof(int); } LOGMSGI("SHAVE", "shaveVrayInstance: (debug) exta bytes ", extra); char* data = (char*)malloc(size); int* idata = (int*)data; int chpos = 0; long intsum = 0; for(int oo = 0; oo < N; oo++) { if(oo < n) { //int v = dataParam->getInt(oo,0.0); int v = L[oo]; idata[oo] = v; chpos += sizeof(int); intsum += v; } else { //int A = dataParam->getInt(oo,0.0); int A = L[oo]; char* AA = (char*)(&A); for(int j = 0; j < extra; j++) { data[chpos+j] = AA[j]; } intsum += A; } } ///// checksum // int sum = 0; for(int oo = 0; oo < size; oo++) { sum += (unsigned char)data[oo]; } LOGMSGI("SHAVE", "shaveVrayInstance: (debug) checksum ", (int)sum); LOGMSGI("SHAVE", "shaveVrayInstance: (debug) intsum ", (int)intsum); stack = LoadHair((void*)data,(long)size); } } if(!dra_as_param && !shaveVrayPlugin::draFile.empty()) { dra_as_file = true; LOGMSG("SHAVE", "shaveVrayInstance: importing DRA from file."); stack = LoadHair((char*)shaveVrayPlugin::draFile.ptr()); } if(!dra_as_param && !dra_as_file) { LOGMSG("SHAVE", "shaveVrayInstance: no DRA source specified."); } } if(!hair() && stack) { if(stack) { try { _hair() = stack->GetHairNodeByID(stackid(),GetSquirrel()); } catch(...) { LOGMSG("SHAVE", "shaveVrayInstance: an exception occured when accessing DRA."); } if(!hair()) LOGMSGI("SHAVE", "shaveVrayInstance: can not create Hair node (id)",stackid()); } else LOGMSG("SHAVE", "shaveVrayInstance::compileGeometry NULL stack."); } } void shaveVrayInstanceBase::freeMem() { //free primitieves here for(unsigned int i = 0; i < (unsigned int)voxprims().size(); i++) if(voxprim(i)) { delete voxprim(i); _voxprim(i) = NULL; } _voxprims().clear(); if(stack) { delete stack; stack = NULL; } }