pFluidEmitter*pFluid::createEmitter(const pFluidEmitterDesc& desc) { NxFluidEmitterDesc eDesc ; eDesc.setToDefault(); pFactory::Instance()->copyToEmitterDesc(eDesc,desc); int valid = eDesc.isValid(); if (!valid) { xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"Emitter Description not Valid !"); return NULL; } CK3dEntity*entityReference = (CK3dEntity*)ctx()->GetObject(desc.entityReference); if (!entityReference) { xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"You must set a reference object ID in .referenceEntity"); return NULL; } eDesc.relPose.M.id(); eDesc.relPose.M.rotX(-NxHalfPiF32); eDesc.relPose.t = NxVec3(0,1.1f,0); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// NxFluidEmitter *emitter = getFluid()->createEmitter(eDesc); if (!emitter) return NULL; pFluidEmitter * result = new pFluidEmitter(); result->setEmitter(emitter); result->setFluid(this); result->setEntityReference(entityReference->GetID()); VxVector pos; if (desc.frameShape) { desc.frameShape->GetPosition(&pos); } emitter->setGlobalPosition(getFrom(pos)); emitter->userData = result; ////////////////////////////////////////////////////////////////////////// // // Render Settings : // pFluidRenderSettings *rSettings = new pFluidRenderSettings(ctx(),desc.entityReference,"pFluidEmitter"); rSettings->setToDefault(); rSettings->setEmitter(result); return result; }
void SampleVortex::createFluid() { static NxVec3 ParticleBuffer[10000]; // Set structure to pass particles, and receive them after every simulation step NxParticleData particles; //particles.maxParticles = gParticleBufferCap; particles.numParticlesPtr = &m_ParticleBufferSize; particles.bufferPos = &ParticleBuffer[0].x; particles.bufferPosByteStride = sizeof(NxVec3); // Create a fluid descriptor NxFluidDesc fluidDesc; fluidDesc.maxParticles = 5000; fluidDesc.kernelRadiusMultiplier = 1.2; fluidDesc.restParticlesPerMeter = 10; fluidDesc.motionLimitMultiplier = 3.6; fluidDesc.packetSizeMultiplier = 16; fluidDesc.collisionDistanceMultiplier = 0.12; fluidDesc.stiffness = 20; fluidDesc.viscosity = 6; fluidDesc.restDensity = 50; fluidDesc.damping = 0; fluidDesc.restitutionForStaticShapes = 0.4; fluidDesc.dynamicFrictionForStaticShapes= 0.03; fluidDesc.simulationMethod = NX_F_SPH; //NX_F_NO_PARTICLE_INTERACTION; fluidDesc.flags &= ~NX_FF_HARDWARE; fluidDesc.initialParticleData = particles; fluidDesc.particlesWriteData = particles; NxFluid* fluid = m_scene->createFluid(fluidDesc); assert(fluid != NULL); //Setup structure which wraps the buffers for particle creation. ParticleSDK* newParticles = new ParticleSDK[5000]; NxParticleData newParticleData; newParticleData.numParticlesPtr = new NxU32; newParticleData.bufferPos = &newParticles[0].position.x; newParticleData.bufferPosByteStride = sizeof(ParticleSDK); newParticleData.bufferVel = &newParticles[0].velocity.x; newParticleData.bufferVelByteStride = sizeof(ParticleSDK); newParticleData.bufferLife = &newParticles[0].lifetime; newParticleData.bufferLifeByteStride = sizeof(ParticleSDK); fluid->setParticlesWriteData(newParticleData); // create Emitter NxFluidEmitterDesc emitterDesc; emitterDesc.dimensionX = 0.05; emitterDesc.dimensionY = 0.05; emitterDesc.shape = NX_FE_ELLIPSE; emitterDesc.maxParticles = 5000; emitterDesc.type = NX_FE_CONSTANT_FLOW_RATE; emitterDesc.randomPos = NxVec3(0.05f, 0.05f, 0.05f); emitterDesc.randomAngle = 0.481710941f; emitterDesc.fluidVelocityMagnitude = 5; emitterDesc.rate = 50; emitterDesc.particleLifetime = 7; emitterDesc.repulsionCoefficient = 1; emitterDesc.flags = NX_FEF_VISUALIZATION | NX_FEF_ADD_BODY_VELOCITY | NX_FEF_ENABLED; assert(emitterDesc.isValid()); NxFluidEmitter* emitter = fluid->createEmitter(emitterDesc); assert(emitter); }