// Shave and a Haircut // (c) 2019 Epic Games // US Patent 6720962 /********************************************************************** *< FILE: shaveVrayInstanceI.cpp DESCRIPTION: VRay instnace for instanced hair CREATED BY: Vladimir Dubovoy HISTORY: created 12-05-2010 *> **********************************************************************/ #include "shaveVrayInstanceI.h" #include "shaveVrayMovingTriVoxelPrim.h" #include "shaveVrayStaticTriVoxelPrim.h" shaveVrayInstanceI::shaveVrayInstanceI( shaveVrayPlugin *vplugin, VR::MaterialInterface *mtl, VR::BSDFInterface *bsdf, int renderID, VR::VolumetricInterface *volume, VR::LightList *lightList, #if defined(VRAY30) const VR::TraceTransform &baseTM, #elif defined(VRAY40) const VR::Transform &baseTM, #endif int objectID, const tchar *userAttributes, int primaryVisibility) : #if defined(VRAY30) VR::BaseMeshInstance(vplugin, vplugin, mtl, bsdf, renderID, volume, lightList, baseTM, objectID, userAttributes, primaryVisibility), #elif defined(VRAY40) VR::BaseInstance(vplugin, mtl, bsdf, renderID, volume, lightList, baseTM, objectID, userAttributes, primaryVisibility), #endif shaveVrayInstanceBase(vplugin) { _hair() = NULL; _stackid() = plugin->GetStackIndex(); _numFacesPerInst() = plugin->GetNumFacesPerInst(); _numUVSets() = plugin->GetNumUVSets(); //shaveVrayVectorListParam* uvsParam = vplugin->GetUVparam(); VR::VRayPluginParameter *uvsParam=plugin->paramList->getParam("uvs"); if(uvsParam) { _uvs() = uvsParam->getVectorList(0); //int nuvs = uvsParam->getCount(0); //_uvs() = VR::VectorList(nuvs); //for(int i = 0; i < nuvs; i++) //{ // VR::Vector v = uvsParam->operator[](i); // _uvs()[i] = v; //} } } void shaveVrayInstanceI::compileGeometry( VR::VRayRenderer *vray, #if defined(VRAY30) VR::TraceTransform *tm, #elif defined(VRAY40) const VR::Transform *tm, #endif double *times, int tmCount) { LOGMSG("SHAVE", "shaveVrayInstanceI::compileGeometry"); LOGMSGI("SHAVE", "id",stackid()); loadHair(); if(!hair()) return; #if defined(VRAY30) BaseMeshInstance::compileGeometry(vray, tm, times, tmCount); #elif defined(VRAY40) BaseInstance::compileGeometry(vray, tm, times, tmCount); #endif int num_voxels = hair()->GetNumVoxels(); VR::RayServerInterface *rayserver = vray->getRayServer(); int rendID = rayserver->getNewRenderIDArray(num_voxels); const VR::VRaySequenceData& sdata = vray->getSequenceData(); bool blurOn = sdata.params.moblur.on != 0; //tm is not animated if ( !blurOn ) { for(int i = 0; i < num_voxels; i++) { IHairVoxel* voxel = hair()->GetVoxel(i); if(voxel) { shaveVrayStaticTriVoxelPrim* vox_prim = new shaveVrayStaticTriVoxelPrim(voxel,vray,this); if(rayserver->storeStaticPrimitive(vox_prim, NULL, rendID+i )) _voxprims().push_back(vox_prim); else { delete vox_prim; LOGMSG("SHAVE", "shaveVrayInstanceI failed to store voxel prmitive on rayserver"); } } } } else { for(int i = 0; i < num_voxels; i++) { IHairVoxel* voxel = hair()->GetVoxel(i); if(voxel) { shaveVrayMovingTriVoxelPrim* vox_prim = new shaveVrayMovingTriVoxelPrim(voxel,vray,this); if(rayserver->storeMovingPrimitive(vox_prim, NULL, rendID+i)) _voxprims().push_back(vox_prim); else { delete vox_prim; LOGMSG("SHAVE", "shaveVrayInstanceI failed to store voxel prmitive on rayserver"); } } } } LOGMSG("SHAVE", "shaveVrayInstanceI::compileGeometry - OK"); } void shaveVrayInstanceI::clearGeometry(VR::VRayRenderer *vray) { LOGMSG("SHAVE", "shaveVrayInstanceI::clearGeometry"); shaveVrayInstanceBase::freeMem(); #if defined(VRAY30) BaseMeshInstance::clearGeometry(vray); #elif defined(VRAY40) BaseInstance::clearGeometry(vray); #endif //if(stack) //{ // delete stack; // stack = NULL; //} LOGMSG("SHAVE", "shaveVrayInstanceI::clearGeometry - OK"); }