//simple routine to render our particles void ParticleFluidEmitter::renderParticles() { // lock SDK buffers of *PxParticleSystem* ps for reading PxParticleFluidReadData * fd = m_pf->lockParticleFluidReadData(); // access particle data from PxParticleReadData float minX =1000,maxX = -1000,minZ = 1000,maxZ = -1000,minY = 1000,maxY = -1000; if (fd) { PxStrideIterator<const PxParticleFlags> flagsIt(fd->flagsBuffer); PxStrideIterator<const PxVec3> positionIt(fd->positionBuffer); PxStrideIterator<const PxF32> densityIt(fd->densityBuffer); for (unsigned i = 0; i < fd->validParticleRange; ++i, ++flagsIt, ++positionIt,++densityIt) { if (*flagsIt & PxParticleFlag::eVALID) { //density tells us how many neighbours a particle has. //If it has a density of 0 it has no neighbours, 1 is maximum neighbouts //we can use this to decide if the particle is seperate or part of a larger body of fluid glm::vec3 pos(positionIt->x,positionIt->y,positionIt->z); Gizmos::addAABBFilled(pos, m_size, m_colour, nullptr, false); } } // return ownership of the buffers back to the SDK fd->unlock(); } }
//simple routine to render our particles void ParticleFluidEmitter::renderParticles() { // lock SDK buffers of *PxParticleSystem* ps for reading PxParticleFluidReadData * fd = m_pf->lockParticleFluidReadData(); // access particle data from PxParticleReadData float minX =1000,maxX = -1000,minZ = 1000,maxZ = -1000,minY = 1000,maxY = -1000; if (fd) { PxStrideIterator<const PxParticleFlags> flagsIt(fd->flagsBuffer); PxStrideIterator<const PxVec3> positionIt(fd->positionBuffer); PxStrideIterator<const PxF32> densityIt(fd->densityBuffer); for (unsigned i = 0; i < fd->validParticleRange; ++i, ++flagsIt, ++positionIt,++densityIt) { if (*flagsIt & PxParticleFlag::eVALID) { //density tells us how many neighbours a particle has. //If it has a density of 0 it has no neighbours, 1 is maximum neighbouts //we can use this to decide if the particle is seperate or part of a larger body of fluid glm::vec3 pos(positionIt->x,positionIt->y,positionIt->z); //glm::vec4 colournoise = glm::vec4(((float)(rand() % 100)) / 100, ((float)(rand() % 100)) / 100, ((float)(rand() % 100)) / 100, 1); glm::vec4 colour = glm::vec4(0.196f, 0.518f, 0.749f, 1.0f); //colour.a = 1; Gizmos::addAABBFilled(pos, glm::vec3(.12, .12, .12), colour); //Gizmos::addDisk(pos, 0.1f, 6, glm::vec4(1, 0, 1, 1)); } } // return ownership of the buffers back to the SDK fd->unlock(); } }
void ParticleEmitter::Draw(RenderingEngine& _renderer) { // Lock SDK buffers of *PxParticleSystem* ps for reading PxParticleFluidReadData * fd = particleFluid->lockParticleFluidReadData(); // Access particle data from PxParticleReadData float minX = 1000, maxX = -1000, minZ = 1000, maxZ = -1000, minY = 1000, maxY = -1000; if (fd) { PxStrideIterator<const PxParticleFlags> flagsIt(fd->flagsBuffer); PxStrideIterator<const PxVec3> positionIt(fd->positionBuffer); PxStrideIterator<const PxF32> densityIt(fd->densityBuffer); for (unsigned i = 0; i < fd->validParticleRange; ++i, ++flagsIt, ++positionIt, ++densityIt) { if (*flagsIt & PxParticleFlag::eVALID) { // Density tells us how many neighbours a particle has. // If it has a density of 0 it has no neighbours, 1 is maximum neighbours // We can use this to decide if the particle is seperate or part of a larger body of fluid vec3 position(positionIt->x, positionIt->y, positionIt->z); Gizmos::AddSphere(position, restParticleDistance * 0.5f, 4, 4, vec4(1, 0, 1, 1)); } } // return ownership of the buffers back to the SDK fd->unlock(); } Gizmos::AddTransform(this->transform->worldMatrix); }
void PhsXWorld::update(void) { if (0 != m_pDynamicsWorld) { m_pDynamicsWorld->simulate(1 / 60.0f); m_pDynamicsWorld->fetchResults(true); PxU32 nbActiveTransforms; const PxActiveTransform* activeTransforms = m_pDynamicsWorld->getActiveTransforms(nbActiveTransforms); for (PxU32 i = 0; i < nbActiveTransforms; ++i) { if (activeTransforms[i].userData != NULL) { nau::scene::IScene *m_IScene = static_cast<nau::scene::IScene*>(activeTransforms[i].userData); m_IScene->setTransform(getMatFromPhysXTransform(activeTransforms[i].actor2World)); } } if (controller) { controller->move(PxVec3(0.0f, -9.81f, -0.3f), 0.2f, 1 / 60.0f, NULL); nau::scene::IScene *m_ISceneCharacter = static_cast<nau::scene::IScene*>(controller->getUserData()); mat4 mat = getMatFromPhysXTransform(controller->getActor()->getGlobalPose()); //For Pusher character mat.rotate(-90, vec3(0, 0, 1)); //mat.rotate(-90, vec3(0, 1, 0)); m_ISceneCharacter->setTransform(mat); } if (cloth) { nau::scene::IScene *m_IScene = static_cast<nau::scene::IScene*>(cloth->userData); //m_IScene->setTransform(getMatFromPhysXTransform(cloth->getGlobalPose())); std::shared_ptr<VertexData> &vd = m_IScene->getSceneObject(0)->getRenderable()->getVertexData(); int count = static_cast<int> (vd->getDataOf(VertexData::GetAttribIndex(std::string("position")))->size()); PxClothParticleData* pData = cloth->lockParticleData(); PxClothParticle* pParticles = pData->particles; std::shared_ptr<std::vector<VertexData::Attr>> points = vd->getDataOf(VertexData::GetAttribIndex(std::string("position"))); for (int i = 0; i < count; i++) { points->at(i).set(pParticles[i].pos.x, pParticles[i].pos.y, pParticles[i].pos.z); } vd->resetCompilationFlag(); vd->compile(); pData->unlock(); } if (particleSystem) { // lock SDK buffers of *PxParticleSystem* ps for reading PxParticleFluidReadData* rd = particleSystem->lockParticleFluidReadData(); // access particle data from PxParticleReadData if (rd) { PxU32 nPart = rd->nbValidParticles; PxVec4* newPositions = new PxVec4[nPart]; PxStrideIterator<const PxParticleFlags> flagsIt(rd->flagsBuffer); PxStrideIterator<const PxVec3> positionIt(rd->positionBuffer); int index = 0; for (unsigned i = 0; i < rd->validParticleRange; ++i, ++flagsIt, ++positionIt) { if (*flagsIt & PxParticleFlag::eVALID) { // access particle position const PxVec3& position = *positionIt; newPositions[index++] = PxVec4(position, 1.0f); } } // return ownership of the buffers back to the SDK nau::scene::IScene* m_IScene = static_cast<nau::scene::IScene*>(particleSystem->userData); particlePass->setPropui(Pass::INSTANCE_COUNT, nPart); particlePositionBuffer->setData(nPart * sizeof(PxVec4), newPositions); m_IScene->getSceneObject(0)->getRenderable()->getVertexData()->resetCompilationFlag(); m_IScene->getSceneObject(0)->getRenderable()->getVertexData()->compile(); rd->unlock(); if (nPart < MAXPARTICLE && iter++ % ITERSTEP == 0) { createParticles(); } } } } }