Added the environment entity type for use as maps
This commit is contained in:
		
							parent
							
								
									bae89e65a1
								
							
						
					
					
						commit
						a1fe7c3c1a
					
				| @ -39,15 +39,15 @@ namespace nf { | ||||
| 	} | ||||
| 
 | ||||
| 	void Gamestate::onEnter() { | ||||
| 
 | ||||
| 		Error("Gamestate has no overridden onEnter function!"); | ||||
| 	} | ||||
| 
 | ||||
| 	void Gamestate::update(float deltaTime) { | ||||
| 
 | ||||
| 		Error("Gamestate has no overridden update function!"); | ||||
| 	} | ||||
| 
 | ||||
| 	void Gamestate::render(Renderer& renderer) { | ||||
| 
 | ||||
| 		Error("Gamestate has no overridden render function!"); | ||||
| 	} | ||||
| 
 | ||||
| 	Camera* Gamestate::getCamera() { | ||||
| @ -63,7 +63,7 @@ namespace nf { | ||||
| 	} | ||||
| 
 | ||||
| 	void Gamestate::onExit() { | ||||
| 
 | ||||
| 		Error("Gamestate has no overridden onExit function!"); | ||||
| 	} | ||||
| 
 | ||||
| 	void Gamestate::stop() { | ||||
|  | ||||
| @ -34,10 +34,12 @@ namespace nf { | ||||
| 			m_model = model->loadedModel; | ||||
| 		} | ||||
| 		else { | ||||
| 			bool physics = false; | ||||
| 			if (m_type != Entity::Type::DETAIL) | ||||
| 				physics = true; | ||||
| 			m_model = new Model(model, physics); | ||||
| 			bool convex = false, triangle = false; | ||||
| 			if (m_type == Entity::Type::STATIC || m_type == Entity::Type::DYNAMIC) | ||||
| 				convex = true; | ||||
| 			else if (m_type == Entity::Type::ENVIRONMENT) | ||||
| 				triangle = true; | ||||
| 			m_model = new Model(model, convex, triangle); | ||||
| 			model->alreadyLoaded = true; | ||||
| 			model->loadedModel = m_model; | ||||
| 		} | ||||
|  | ||||
| @ -24,6 +24,7 @@ namespace nf { | ||||
| 		m_err(nullptr), | ||||
| 		m_foundation(nullptr), | ||||
| 		m_pvd(nullptr), | ||||
| 		m_transport(nullptr), | ||||
| 		m_phy(nullptr), | ||||
| 		m_cooking(nullptr), | ||||
| 		m_dispacher(nullptr), | ||||
| @ -83,7 +84,7 @@ namespace nf { | ||||
| 			m_scene->setGravity(PxVec3(grav.x, grav.y, grav.z)); | ||||
| 
 | ||||
| 			unsigned int count = m_scene->getNbActors(PxActorTypeFlag::eRIGID_DYNAMIC); | ||||
| 			PxActor** actors = new PxActor * [count]; | ||||
| 			PxActor** actors = new PxActor*[count]; | ||||
| 			m_scene->getActors(PxActorTypeFlag::eRIGID_DYNAMIC, actors, count); | ||||
| 
 | ||||
| 			for (unsigned int i = 0; i < count; i++) { | ||||
| @ -96,7 +97,7 @@ namespace nf { | ||||
| 
 | ||||
| 	void PhysicsEngine::setActorVelocity(Entity* ent, const Vec3& vel) { | ||||
| 		unsigned int count = m_scene->getNbActors(PxActorTypeFlag::eRIGID_DYNAMIC); | ||||
| 		PxActor** actors = new PxActor * [count]; | ||||
| 		PxActor** actors = new PxActor*[count]; | ||||
| 		m_scene->getActors(PxActorTypeFlag::eRIGID_DYNAMIC, actors, count); | ||||
| 
 | ||||
| 		for (unsigned int i = 0; i < count; i++) { | ||||
| @ -111,7 +112,7 @@ namespace nf { | ||||
| 
 | ||||
| 	void PhysicsEngine::setActorMass(Entity* ent, float mass) { | ||||
| 		unsigned int count = m_scene->getNbActors(PxActorTypeFlag::eRIGID_DYNAMIC); | ||||
| 		PxActor** actors = new PxActor * [count]; | ||||
| 		PxActor** actors = new PxActor*[count]; | ||||
| 		m_scene->getActors(PxActorTypeFlag::eRIGID_DYNAMIC, actors, count); | ||||
| 
 | ||||
| 		for (unsigned int i = 0; i < count; i++) { | ||||
| @ -148,9 +149,8 @@ namespace nf { | ||||
| 			if (currEnt->getType() == Entity::Type::DYNAMIC) { | ||||
| 				updateEnt<PxRigidDynamic>(actors[i], t, scale); | ||||
| 			} | ||||
| 			else if (currEnt->getType() == Entity::Type::STATIC) { | ||||
| 			else | ||||
| 				updateEnt<PxRigidStatic>(actors[i], t, scale); | ||||
| 			} | ||||
| 		} | ||||
| 		delete[] actors; | ||||
| 
 | ||||
| @ -171,7 +171,7 @@ namespace nf { | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	void PhysicsEngine::addMesh(Model* model, std::vector<float>& vertices) { | ||||
| 	void PhysicsEngine::addConvexMesh(Model* model, std::vector<float>& vertices) { | ||||
| 		PxConvexMeshDesc desc; | ||||
| 		desc.points.count = (unsigned int)vertices.size() / 3; | ||||
| 		desc.points.stride = 3 * sizeof(float); | ||||
| @ -184,7 +184,25 @@ namespace nf { | ||||
| 
 | ||||
| 		PxDefaultMemoryInputData in(buf.getData(), buf.getSize()); | ||||
| 		PxConvexMesh* mesh = m_phy->createConvexMesh(in); | ||||
| 		m_meshes[model] = mesh; | ||||
| 		m_convexMeshes[model] = mesh; | ||||
| 	} | ||||
| 
 | ||||
| 	void PhysicsEngine::addTriangleMesh(Model* model, std::vector<float>& vertices, std::vector<unsigned int>& indices) { | ||||
| 		PxTriangleMeshDesc desc; | ||||
| 		desc.points.count = (unsigned int)vertices.size() / 3; | ||||
| 		desc.points.stride = sizeof(float) * 3; | ||||
| 		desc.points.data = &vertices[0]; | ||||
| 		desc.triangles.count = (unsigned int)indices.size() / 3; | ||||
| 		desc.triangles.stride = sizeof(unsigned int) * 3; | ||||
| 		desc.triangles.data = &indices[0]; | ||||
| 
 | ||||
| 		PxDefaultMemoryOutputStream buf; | ||||
| 		if (!m_cooking->cookTriangleMesh(desc, buf)) | ||||
| 			Error("Could not create triangle mesh!"); | ||||
| 
 | ||||
| 		PxDefaultMemoryInputData in(buf.getData(), buf.getSize()); | ||||
| 		PxTriangleMesh* mesh = m_phy->createTriangleMesh(in); | ||||
| 		m_triangleMeshes[model] = mesh; | ||||
| 	} | ||||
| 
 | ||||
| 	void PhysicsEngine::addActor(Entity* entity) { | ||||
| @ -196,18 +214,28 @@ namespace nf { | ||||
| 		float density = 100.0f; | ||||
| 
 | ||||
| 		//Get mesh
 | ||||
| 		if (m_meshes.find(entity->getModel()) == m_meshes.end()) | ||||
| 		PxConvexMesh* convexMesh = nullptr; | ||||
| 		PxTriangleMesh* triangleMesh = nullptr; | ||||
| 		if (m_convexMeshes.find(entity->getModel()) != m_convexMeshes.end()) | ||||
| 			convexMesh = m_convexMeshes[entity->getModel()]; | ||||
| 		else if (m_triangleMeshes.find(entity->getModel()) != m_triangleMeshes.end()) | ||||
| 			triangleMesh = m_triangleMeshes[entity->getModel()]; | ||||
| 		else | ||||
| 			Error("No physics mesh found for this entity!"); | ||||
| 		PxConvexMesh* mesh = m_meshes[entity->getModel()]; | ||||
| 
 | ||||
| 		//Dynamic or static
 | ||||
| 		if (type == Entity::Type::DYNAMIC) { | ||||
| 			PxRigidDynamic* act = PxCreateDynamic(*m_phy, PxTransform(PxIdentity), PxConvexMeshGeometry(mesh), *mat, density); | ||||
| 			PxRigidDynamic* act = PxCreateDynamic(*m_phy, PxTransform(PxIdentity), PxConvexMeshGeometry(convexMesh), *mat, density); | ||||
| 			act->userData = entity; | ||||
| 			m_scene->addActor(*act); | ||||
| 		} | ||||
| 		else if (type == Entity::Type::STATIC) { | ||||
| 			PxRigidStatic* act = PxCreateStatic(*m_phy, PxTransform(PxIdentity), PxConvexMeshGeometry(mesh), *mat); | ||||
| 			PxRigidStatic* act = PxCreateStatic(*m_phy, PxTransform(PxIdentity), PxConvexMeshGeometry(convexMesh), *mat); | ||||
| 			act->userData = entity; | ||||
| 			m_scene->addActor(*act); | ||||
| 		} | ||||
| 		else if (type == Entity::Type::ENVIRONMENT) { | ||||
| 			PxRigidStatic* act = PxCreateStatic(*m_phy, PxTransform(PxIdentity), PxTriangleMeshGeometry(triangleMesh), *mat); | ||||
| 			act->userData = entity; | ||||
| 			m_scene->addActor(*act); | ||||
| 		} | ||||
| @ -216,10 +244,18 @@ namespace nf { | ||||
| 	void PhysicsEngine::closeScene() { | ||||
| 		if (m_scene) { | ||||
| 			//Does this actually release all of them? Only if the respective shapes have been released?
 | ||||
| 			for (auto it = m_meshes.begin(); it != m_meshes.end();) { | ||||
| 			for (auto it = m_convexMeshes.begin(); it != m_convexMeshes.end();) { | ||||
| 				if (!it->first->isBaseAsset()) { | ||||
| 					it->second->release(); | ||||
| 					it = m_meshes.erase(it); | ||||
| 					it = m_convexMeshes.erase(it); | ||||
| 				} | ||||
| 				else | ||||
| 					it++; | ||||
| 			} | ||||
| 			for (auto it = m_triangleMeshes.begin(); it != m_triangleMeshes.end();) { | ||||
| 				if (!it->first->isBaseAsset()) { | ||||
| 					it->second->release(); | ||||
| 					it = m_triangleMeshes.erase(it); | ||||
| 				} | ||||
| 				else | ||||
| 					it++; | ||||
|  | ||||
| @ -13,7 +13,7 @@ | ||||
| #include "Utility.h" | ||||
| 
 | ||||
| namespace nf { | ||||
| 	Model::Model(AModel* model, bool physicsExport) : | ||||
| 	Model::Model(AModel* model, bool physicsConvex, bool physicsTriangle) : | ||||
| 		m_base(model->isBaseAsset), | ||||
| 		m_newMtl("newmtl"), | ||||
| 		m_newLine("\n") | ||||
| @ -251,8 +251,10 @@ namespace nf { | ||||
| 		m_vao->finishBufferLayout(); | ||||
| 		m_ib = new IndexBuffer(&vboIndices[0], vboIndices.size()); | ||||
| 
 | ||||
| 		if (physicsExport) | ||||
| 			Application::getApp()->getPhysicsEngine()->addMesh(this, vboPositions); | ||||
| 		if (physicsConvex) | ||||
| 			Application::getApp()->getPhysicsEngine()->addConvexMesh(this, vboPositions); | ||||
| 		else if(physicsTriangle) | ||||
| 			Application::getApp()->getPhysicsEngine()->addTriangleMesh(this, vboPositions, vboIndices); | ||||
| 	} | ||||
| 
 | ||||
| 	void Model::parseMaterials(std::unordered_map<std::string, TempMaterial*>& mats, std::vector<char>& mtl) { | ||||
|  | ||||
| @ -15,6 +15,7 @@ namespace nf { | ||||
| 		enum class Type { | ||||
| 			STATIC, | ||||
| 			DYNAMIC, | ||||
| 			ENVIRONMENT, | ||||
| 			DETAIL | ||||
| 		}; | ||||
| 
 | ||||
|  | ||||
| @ -10,7 +10,7 @@ namespace nf { | ||||
| 
 | ||||
| 	class Model : public Drawable { | ||||
| 	public: | ||||
| 		Model(AModel* model, bool physicsExport); | ||||
| 		Model(AModel* model, bool physicsConvex, bool physicsTriangle); | ||||
| 
 | ||||
| 		void render(Shader* shader, bool onlyDepth, unsigned int count); | ||||
| 		void bindMaterials(Shader* shader); | ||||
|  | ||||
| @ -21,7 +21,8 @@ namespace nf { | ||||
| 		void setActorVelocity(Entity* ent, const Vec3& vel); | ||||
| 		void setActorMass(Entity* ent, float mass); | ||||
| 		void update(float dt); | ||||
| 		void addMesh(Model* model, std::vector<float>& vertices); | ||||
| 		void addConvexMesh(Model* model, std::vector<float>& vertices); | ||||
| 		void addTriangleMesh(Model* model, std::vector<float>& vertices, std::vector<unsigned int>& indices); | ||||
| 		void addActor(Entity* entity); | ||||
| 		void closeScene(); | ||||
| 
 | ||||
| @ -41,7 +42,8 @@ namespace nf { | ||||
| 		PxDefaultCpuDispatcher* m_dispacher; | ||||
| 		PxMaterial* m_defaultMat; | ||||
| 		PxScene* m_scene; | ||||
| 		std::unordered_map<Model*, PxConvexMesh*> m_meshes; | ||||
| 		std::unordered_map<Model*, PxConvexMesh*> m_convexMeshes; | ||||
| 		std::unordered_map<Model*, PxTriangleMesh*> m_triangleMeshes; | ||||
| 
 | ||||
| 		const float m_stepSize; | ||||
| 		float m_accumulator; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Grayson Riffe (Laptop)
						Grayson Riffe (Laptop)