//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();
	}
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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();
                }
            }
        }

    }

}