From 8d2f13843efd0277e4e1671d81c81228b418e643 Mon Sep 17 00:00:00 2001 From: xkamikoo <58092037+xkamikoo@users.noreply.github.com> Date: Tue, 23 Feb 2021 00:03:44 +0100 Subject: [PATCH] Physics, first attempt. --- grk-project.vcxproj | 4 +- grk-project.vcxproj.filters | 6 + shaders/shader_bloom.frag | 1 - src/Physics.cpp | 36 ++++ src/Physics.h | 23 +++ src/main.cpp | 346 ++++++++++++++++++++++++++---------- 6 files changed, 324 insertions(+), 92 deletions(-) create mode 100644 src/Physics.cpp create mode 100644 src/Physics.h diff --git a/grk-project.vcxproj b/grk-project.vcxproj index 8bda9b1..3f9afce 100644 --- a/grk-project.vcxproj +++ b/grk-project.vcxproj @@ -32,6 +32,7 @@ + @@ -43,6 +44,7 @@ + @@ -61,7 +63,7 @@ Application true Unicode - v142 + v141 Application diff --git a/grk-project.vcxproj.filters b/grk-project.vcxproj.filters index 70ea294..6d70fd8 100644 --- a/grk-project.vcxproj.filters +++ b/grk-project.vcxproj.filters @@ -89,6 +89,9 @@ Source Files + + Source Files + @@ -121,5 +124,8 @@ Header Files + + Source Files + \ No newline at end of file diff --git a/shaders/shader_bloom.frag b/shaders/shader_bloom.frag index 5cbcaaf..da16fac 100644 --- a/shaders/shader_bloom.frag +++ b/shaders/shader_bloom.frag @@ -7,7 +7,6 @@ uniform sampler2D scene; uniform sampler2D bloomBlur; uniform vec2 screenSize; -// float FXAA_SPAN_MAX = 100.0f; //sila dzialania float FXAA_REDUCE_MUL = 1.0f/8.0f; diff --git a/src/Physics.cpp b/src/Physics.cpp new file mode 100644 index 0000000..d7ecb78 --- /dev/null +++ b/src/Physics.cpp @@ -0,0 +1,36 @@ +#include "Physics.h" + +#define PX_RELEASE(x) if(x) { x->release(); x = NULL; } + +Physics::Physics(float gravity, + PxSimulationFilterShader simulationFilterShader, + PxSimulationEventCallback *simulationEventCallback) +{ + foundation = PxCreateFoundation(PX_PHYSICS_VERSION, allocator, errorCallback); + + physics = PxCreatePhysics(PX_PHYSICS_VERSION, *foundation, PxTolerancesScale(), true); + + PxSceneDesc sceneDesc(physics->getTolerancesScale()); + sceneDesc.gravity = PxVec3(0.0f, -gravity, 0.0f); + dispatcher = PxDefaultCpuDispatcherCreate(2); + sceneDesc.cpuDispatcher = dispatcher; + sceneDesc.filterShader = simulationFilterShader; + sceneDesc.kineKineFilteringMode = PxPairFilteringMode::eKEEP; // So kin-kin contacts with be reported + sceneDesc.staticKineFilteringMode = PxPairFilteringMode::eKEEP; // So static-kin constacts will be reported + sceneDesc.simulationEventCallback = simulationEventCallback; + scene = physics->createScene(sceneDesc); +} + +Physics::~Physics() +{ + PX_RELEASE(scene); + PX_RELEASE(dispatcher); + PX_RELEASE(physics); + PX_RELEASE(foundation); +} + +void Physics::step(float dt) +{ + scene->simulate(dt); + scene->fetchResults(true); +} \ No newline at end of file diff --git a/src/Physics.h b/src/Physics.h new file mode 100644 index 0000000..ae51bde --- /dev/null +++ b/src/Physics.h @@ -0,0 +1,23 @@ +#pragma once + +#include "PxPhysicsAPI.h" +using namespace physx; + +class Physics +{ +public: + Physics(float gravity, + PxSimulationFilterShader simulationFilterShader, + PxSimulationEventCallback *simulationEventCallback); + virtual ~Physics(); + PxPhysics* physics = nullptr; + PxScene* scene = nullptr; + + void step(float dt); + +private: + PxDefaultAllocator allocator; + PxDefaultErrorCallback errorCallback; + PxFoundation* foundation = nullptr; + PxDefaultCpuDispatcher* dispatcher = nullptr; +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 5967cda..ce6f757 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,24 +1,87 @@ -#include "glew.h" -#include "freeglut.h" -#include "glm.hpp" -#include "ext.hpp" -#include +#include #include #include #include -#include "Shader_Loader.h" -#include "Render_Utils.h" -#include "Camera.h" -#include "Texture.h" - -#include "Box.cpp" - #include #include #include + +#include "glew.h" +#include "freeglut.h" +#include "glm.hpp" +#include "ext.hpp" +#include "Physics.h" +#include "Shader_Loader.h" +#include "Camera.h" +#include "Texture.h" #include "model.h" #include +static PxFilterFlags simulationFilterShader(PxFilterObjectAttributes attributes0, + PxFilterData filterData0, PxFilterObjectAttributes attributes1, PxFilterData filterData1, + PxPairFlags& pairFlags, const void* constantBlock, PxU32 constantBlockSize) +{ + pairFlags = + PxPairFlag::eCONTACT_DEFAULT | // default contact processing + PxPairFlag::eNOTIFY_CONTACT_POINTS | // contact points will be available in onContact callback + PxPairFlag::eNOTIFY_TOUCH_PERSISTS | + PxPairFlag::eNOTIFY_TOUCH_FOUND; // onContact callback will be called for this pair + + return physx::PxFilterFlag::eDEFAULT; +} + +class SimulationEventCallback : public PxSimulationEventCallback +{ +public: + void onContact(const PxContactPairHeader& pairHeader, + const PxContactPair* pairs, PxU32 nbPairs) + { + // HINT: You can check which actors are in contact + // using pairHeader.actors[0] and pairHeader.actors[1] + auto ac = pairHeader.actors[0]; + auto ac2 = pairHeader.actors[1]; + /*if (ac->userData == renderables.back() || ac2->userData == renderables.back()) + { + std::cout << "Liczba CP:" << nbPairs << std::endl; + + for (PxU32 i = 0; i < nbPairs; i++) + { + const PxContactPair& cp = pairs[i]; + + // HINT: two get the contact points, use + // PxContactPair::extractContacts + + std::vector buffer; + for (int i = 0; i < cp.contactCount; i++) + buffer.push_back(PxContactPairPoint()); + + cp.extractContacts(&buffer[0], sizeof(buffer)); + + for (int i = 0; i < buffer.size(); i++) + { + auto position = buffer[i].position; + std::cout << position.x << ' ' << position.y << ' ' << position.x << std::endl; + } + } + }*/ + } + virtual void onConstraintBreak(PxConstraintInfo* constraints, PxU32 count) {} + virtual void onWake(PxActor** actors, PxU32 count) {} + virtual void onSleep(PxActor** actors, PxU32 count) {} + virtual void onTrigger(PxTriggerPair* pairs, PxU32 count) {} + virtual void onAdvance(const PxRigidBody*const* bodyBuffer, const PxTransform* poseBuffer, const PxU32 count) {} +}; + +// Initalization of physical scene (PhysX) +SimulationEventCallback simulationEventCallback; +Physics pxScene(0.0 /* gravity (m/s^2) */, simulationFilterShader, + &simulationEventCallback); + +// fixed timestep for stable and deterministic simulation +const double physicsStepTime = 1.f / 60.f; +double physicsTimeToProcess = 0; + + int SCR_WIDTH = 1240; int SCR_HEIGHT = 720; @@ -85,6 +148,14 @@ glm::mat4 cameraMatrix, perspectiveMatrix; glm::vec3 sunPos = glm::vec3(10.0f, 0.0f, -5.0f); glm::vec3 sunPos2 = glm::vec3(25.0f, -1.0f, 10.0f); +//physics +physx::PxShape* rectangleShape; +physx::PxShape* sphereShape; +physx::PxMaterial* material; +std::vector dynamicObjects; +std::vector staticObjects; +physx::PxRigidDynamic* getActor(std::string name); + //particlepart struct Particle { glm::vec3 pos, speed; @@ -101,7 +172,6 @@ struct Particle { const int MaxParticles = 1000; Particle ParticlesContainer[MaxParticles]; int LastUsedParticle = 0; - void SortParticles() { std::sort(&ParticlesContainer[0], &ParticlesContainer[MaxParticles]); } @@ -125,7 +195,6 @@ int FindUnusedParticle() { return 0; // All particles are taken, override the first one } - struct Object { std::string name; @@ -135,6 +204,7 @@ struct Object GLuint textureID; GLuint shaderID; glm::vec3 color; + bool isDynamic; }; //Light @@ -143,7 +213,6 @@ struct Light { glm::vec3 color; float intensity; }; - struct Asteroid { glm::mat4 model; @@ -166,10 +235,14 @@ std::vector faces "skybox/back.jpg" }; - - void keyboard(unsigned char key, int x, int y) { + auto actor = getActor("Corvette"); + auto move = actor->getLinearVelocity(); + physx::PxVec3 dir = physx::PxVec3(cameraDir.x, cameraDir.y, cameraDir.z); + glm::vec3 cross = glm::cross(cameraDir, glm::vec3(0, 0, 1)); + physx::PxVec3 dirCross = physx::PxVec3(cross.x, cross.y, cross.z); + float angleSpeed = 0.1f; float moveSpeed = 0.1f; switch (key) @@ -192,17 +265,24 @@ void keyboard(unsigned char key, int x, int y) case 'w': { - cameraPos += cameraDir * moveSpeed; + actor->setLinearVelocity(move + dir); + //cameraPos += cameraDir * moveSpeed; lights[2].intensity = 0.05; lights[3].intensity = 0.05; engineLightTimer = 0; break; } - case 's': cameraPos -= cameraDir * moveSpeed; break; - case 'd': cameraPos += glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'a': cameraPos -= glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; - case 'z': cameraPos += glm::cross(cameraDir, glm::vec3(0, 0, 1)) * moveSpeed; break; - case 'x': cameraPos -= glm::cross(cameraDir, glm::vec3(0, 0, 1)) * moveSpeed; break; + case 's': actor->setLinearVelocity(move - dir); break; + //cameraPos -= cameraDir * moveSpeed; break; + case 'd': actor->setLinearVelocity(move + dirCross); break; + //cameraPos += glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; + case 'a': actor->setLinearVelocity(move - dirCross); break; + //cameraPos -= glm::cross(cameraDir, glm::vec3(0, 1, 0)) * moveSpeed; break; + case 'z': actor->setLinearVelocity(PxVec3(move.x, move.y + 3, move.z)); break; + //cameraPos += glm::cross(cameraDir, glm::vec3(0, 0, 1)) * moveSpeed; break; + case 'x': actor->setLinearVelocity(PxVec3(move.x, move.y - 3, move.z)); break; + //cameraPos -= glm::cross(cameraDir, glm::vec3(0, 0, 1)) * moveSpeed; break; + case ' ':actor->setLinearVelocity(PxVec3(0, 0, 0)); break; case 27: glutDestroyWindow(winId); break; } } @@ -284,7 +364,6 @@ void updateAsteroid() glm::mat4 createCameraMatrix() { - // Obliczanie kierunku patrzenia kamery (w plaszczyznie x-z) przy uzyciu zmiennej cameraAngle kontrolowanej przez klawisze. cameraDir = glm::vec3(cosf(cameraAngle), 0.0f, sinf(cameraAngle)); glm::vec3 up = glm::vec3(0, 1, 0); @@ -293,7 +372,6 @@ glm::mat4 createCameraMatrix() return Core::createViewMatrix(cameraPos, cameraDir, up); } - //funkcja rysujaca modele za pomoca assimpa void drawFromAssimpModel(GLuint program, std::shared_ptr model, glm::mat4 modelMatrix) { @@ -491,7 +569,6 @@ void drawBloom() renderQuad(); } -//funkcja rysujaca planety (bez obracania wokol wlasnej osi bo ksiezyce sie psuja) glm::mat4 drawPlanet(float time, glm::vec3 sunPos, glm::vec3 orbit, glm::vec3 translation, glm::vec3 scale) { glm::mat4 planetModelMatrix = glm::mat4(1.0f); @@ -502,7 +579,6 @@ glm::mat4 drawPlanet(float time, glm::vec3 sunPos, glm::vec3 orbit, glm::vec3 tr return planetModelMatrix; } -//funkcja rysujaca ksiezyce orbitujace wokol danej planety glm::mat4 drawMoon(glm::mat4 planetModelMatrix, float time, glm::vec3 orbit, glm::vec3 translation, glm::vec3 rotation, glm::vec3 scale) { glm::mat4 moonModelMatrix = glm::mat4(planetModelMatrix); @@ -523,24 +599,41 @@ Object* findObject(std::string name) return nullptr; } +physx::PxRigidDynamic* getActor(std::string name) +{ + cout << "meh " << name << std::endl; + for (int i = 0; i < dynamicObjects.size(); i++) + { + cout << ((Object*)dynamicObjects[i]->userData)->name << std::endl <userData)->name == name) + return dynamicObjects[i]; + } + return nullptr; +} + void updateObjects() { + Object* obj = findObject("Corvette"); - glm::mat4 shipModelMatrix = glm::translate(cameraPos + cameraDir * 0.7f + glm::vec3(0, -0.25f, 0)) * glm::rotate(-cameraAngle + glm::radians(90.0f), glm::vec3(0, 1, 0)) * glm::scale(glm::vec3(0.0001f)); - obj->modelM = shipModelMatrix; - obj->invModelM = glm::inverse(shipModelMatrix); + glm::mat4 shipModelMatrix = obj->modelM; + //glm::translate(cameraPos + cameraDir * 0.7f + glm::vec3(0, -0.25f, 0)) * glm::rotate(-cameraAngle + glm::radians(90.0f), glm::vec3(0, 1, 0)) * glm::scale(glm::vec3(0.0001f)); + //obj->modelM = shipModelMatrix; + obj->invModelM = glm::inverse(obj->modelM); + //glm::mat4 offset = glm::translate(shipModelMatrix, glm::vec3(0, 0, 1000)); + //cameraPos = glm::vec3(offset[3][0], offset[3][1], offset[3][2]); glm::mat4 engineLeft = glm::translate(shipModelMatrix, glm::vec3(450, 0, -1500)); lights[2].position = glm::vec3(engineLeft[3][0], engineLeft[3][1], engineLeft[3][2]); glm::mat4 engineRight = glm::translate(shipModelMatrix, glm::vec3(-450, 0, -1500)); lights[3].position = glm::vec3(engineRight[3][0], engineRight[3][1], engineRight[3][2]); - +/* obj = findObject("Space Humster"); glm::mat4 crewmateModelMatrix = glm::translate(glm::vec3(0, 1, 1)) * glm::rotate(lastTime / 10, glm::vec3(1, 0, 1)) * glm::scale(glm::vec3(0.01)); obj->modelM = crewmateModelMatrix; obj->invModelM = glm::inverse(crewmateModelMatrix); - +*/ + //earth & moon glm::mat4 earthModelMatrix = drawPlanet(lastTime / 5.0f, sunPos*glm::vec3(1.5f, 1, 1), glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(-10.5f, 0.0f, -10.5f), glm::vec3(0.5f, 0.5f, 0.5f)); glm::mat4 moonModelMatrix = drawMoon(earthModelMatrix, lastTime / 2.0f, glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0, 2, 2), glm::vec3(1.5f, 1.0f, 1.0f), glm::vec3(0.3f, 0.3f, 0.3f)); @@ -561,6 +654,50 @@ void updateObjects() obj->invModelM = glm::inverse(marsModelMatrix); } +void updatePhysics() +{ + auto actorFlags = PxActorTypeFlag::eRIGID_DYNAMIC;// | PxActorTypeFlag::eRIGID_STATIC; + PxU32 nbActors = pxScene.scene->getNbActors(actorFlags); + if (nbActors) + { + std::vector actors(nbActors); + pxScene.scene->getActors(actorFlags, (PxActor**)&actors[0], nbActors); + for (auto actor : actors) + { + // We use the userData of the objects to set up the model matrices + // of proper renderables. + if (!actor->userData) continue; + Object *obj = (Object*)actor->userData; + + // get world matrix of the object (actor) + PxMat44 transform = actor->getGlobalPose(); + auto &c0 = transform.column0; + auto &c1 = transform.column1; + auto &c2 = transform.column2; + auto &c3 = transform.column3; + + // set up the model matrix used for the rendering + obj->modelM = glm::mat4( + c0.x, c0.y, c0.z, c0.w, + c1.x, c1.y, c1.z, c1.w, + c2.x, c2.y, c2.z, c2.w, + c3.x, c3.y, c3.z, c3.w); + } + } +} + +void updateLights(GLuint program) +{ + for (int i = 0; i < lights.size(); i++) + { + std::string col = "pointLights[" + std::to_string(i) + "].color"; + std::string pos = "pointLights[" + std::to_string(i) + "].position"; + std::string ins = "pointLights[" + std::to_string(i) + "].intensity"; + glUniform3f(glGetUniformLocation(program, col.c_str()), lights[i].color.x, lights[i].color.y, lights[i].color.z); + glUniform3f(glGetUniformLocation(program, pos.c_str()), lights[i].position.x, lights[i].position.y, lights[i].position.z); + glUniform1f(glGetUniformLocation(program, ins.c_str()), lights[i].intensity); + } +} void renderScene() { @@ -570,47 +707,34 @@ void renderScene() double delta = time - lastTime; lastTime = time; + if (delta < 1.f) { + physicsTimeToProcess += delta; + while (physicsTimeToProcess > 0) { + pxScene.step(physicsStepTime); + physicsTimeToProcess -= physicsStepTime; + } + } + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glBindFramebuffer(GL_FRAMEBUFFER, FBO); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(programTex); - glUniform1i(glGetUniformLocation(programTex,"LightsCount"), lights.size()); - for (int i = 0; i < lights.size(); i++) - { - std::string col = "pointLights[" + std::to_string(i) + "].color"; - std::string pos = "pointLights[" + std::to_string(i) + "].position"; - std::string ins = "pointLights[" + std::to_string(i) + "].intensity"; - glUniform3f(glGetUniformLocation(programTex, col.c_str()), lights[i].color.x, lights[i].color.y, lights[i].color.z); - glUniform3f(glGetUniformLocation(programTex, pos.c_str()), lights[i].position.x, lights[i].position.y, lights[i].position.z); - glUniform1f(glGetUniformLocation(programTex, ins.c_str()), lights[i].intensity); - } - + updateLights(programTex); glUniform3f(glGetUniformLocation(programTex, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); - glUseProgram(programNormal); - glUniform1i(glGetUniformLocation(programNormal, "LightsCount"), lights.size()); - for (int i = 0; i < lights.size(); i++) - { - std::string col = "pointLights[" + std::to_string(i) + "].color"; - std::string pos = "pointLights[" + std::to_string(i) + "].position"; - std::string ins = "pointLights[" + std::to_string(i) + "].intensity"; - glUniform3f(glGetUniformLocation(programNormal, col.c_str()), lights[i].color.x, lights[i].color.y, lights[i].color.z); - glUniform3f(glGetUniformLocation(programNormal, pos.c_str()), lights[i].position.x, lights[i].position.y, lights[i].position.z); - glUniform1f(glGetUniformLocation(programNormal, ins.c_str()), lights[i].intensity); - } - + updateLights(programNormal); glUniform3f(glGetUniformLocation(programNormal, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); glUseProgram(programSun); glUniform3f(glGetUniformLocation(programSun, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); + updatePhysics(); updateObjects(); for (Object & obj : objects) @@ -619,24 +743,13 @@ void renderScene() //asteroidpart glUseProgram(programAsteroid); glUniform1i(glGetUniformLocation(programAsteroid, "LightsCount"), lights.size()); - for (int i = 0; i < lights.size(); i++) - { - std::string col = "pointLights[" + std::to_string(i) + "].color"; - std::string pos = "pointLights[" + std::to_string(i) + "].position"; - std::string ins = "pointLights[" + std::to_string(i) + "].intensity"; - glUniform3f(glGetUniformLocation(programAsteroid, col.c_str()), lights[i].color.x, lights[i].color.y, lights[i].color.z); - glUniform3f(glGetUniformLocation(programAsteroid, pos.c_str()), lights[i].position.x, lights[i].position.y, lights[i].position.z); - glUniform1f(glGetUniformLocation(programAsteroid, ins.c_str()), lights[i].intensity); - } - + updateLights(programAsteroid); glUniform3f(glGetUniformLocation(programAsteroid, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z); updateAsteroid(); drawAsteroids(); //particlepart glUseProgram(programParticle); - //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glm::mat4 transformation = perspectiveMatrix * cameraMatrix; int newparticles = 0; @@ -680,14 +793,10 @@ void renderScene() ); ParticlesContainer[particleIndex].speed = maindir + randomdir * spread; - - - // Very bad way to generate a random color ParticlesContainer[particleIndex].r = rand() % 100 + 100; ParticlesContainer[particleIndex].g = 0; ParticlesContainer[particleIndex].b = rand() % 100 + 50; ParticlesContainer[particleIndex].a = (rand() % 256) / 3; - ParticlesContainer[particleIndex].size = (rand() % 1000) / 50000.0f + 0.01f; } @@ -726,9 +835,7 @@ void renderScene() // Particles that just died will be put at the end of the buffer in SortParticles(); p.cameradistance = -1.0f; } - ParticlesCount++; - } } @@ -742,6 +849,63 @@ void renderScene() glutSwapBuffers(); } +glm::vec3 getScale(glm::mat4 modelMatrix) +{ + float x = glm::length(glm::vec3(modelMatrix[0][0], modelMatrix[1][0], modelMatrix[2][0])); + float y = glm::length(glm::vec3(modelMatrix[0][1], modelMatrix[1][1], modelMatrix[2][1])); + float z = glm::length(glm::vec3(modelMatrix[0][2], modelMatrix[1][2], modelMatrix[2][2])); + + return glm::vec3(x, y, z); +} + +glm::vec3 getPosition(glm::mat4 modelMatrix) +{ + return glm::vec3(modelMatrix[3][0], modelMatrix[3][1], modelMatrix[3][2]); +} + +physx::PxMat44 transformMat(glm::mat4 mat) +{ + float newMat[16] = {mat[0][0], mat[0][1], mat[0][2], mat[0][3], + mat[1][0], mat[1][1], mat[1][2], mat[1][3], + mat[2][0], mat[2][1], mat[2][2], mat[2][3], + mat[3][0], mat[3][1], mat[3][2], mat[3][3] }; + + return PxMat44(newMat); +} + +void initPhysics() +{ + material = pxScene.physics->createMaterial(0.5, 0.5, 0.5); + sphereShape = pxScene.physics->createShape(PxSphereGeometry(1), *material); + rectangleShape = pxScene.physics->createShape(PxBoxGeometry(1, 1, 1), *material); + + for (auto &obj : objects) + { + if (obj.isDynamic == true) + { + glm::vec3 pos = getPosition(obj.modelM); + dynamicObjects.emplace_back(pxScene.physics->createRigidDynamic(PxTransform(pos.x, pos.y, pos.z))); + dynamicObjects.back()->setGlobalPose(PxTransform(transformMat(obj.modelM))); + dynamicObjects.back()->attachShape(*rectangleShape); + dynamicObjects.back()->userData = &obj; + dynamicObjects.back()->setLinearVelocity(physx::PxVec3(0, 0, 0)); + dynamicObjects.back()->setAngularVelocity(physx::PxVec3(0, 0, 0)); + pxScene.scene->addActor(*dynamicObjects.back()); + } + else + { + glm::vec3 pos = getPosition(obj.modelM); + staticObjects.emplace_back(pxScene.physics->createRigidStatic(PxTransform(pos.x, pos.y, pos.z))); + staticObjects.back()->setGlobalPose(PxTransform(transformMat(obj.modelM))); + staticObjects.back()->attachShape(*sphereShape); + staticObjects.back()->userData = &obj; + pxScene.scene->addActor(*staticObjects.back()); + } + } + sphereShape->release(); + rectangleShape->release(); +} + void initAsteroids() { int amount = asteroidAmount; @@ -817,7 +981,6 @@ void initBloom() glGenFramebuffers(1, &FBO); glBindFramebuffer(GL_FRAMEBUFFER, FBO); - glGenTextures(2, colorBuffers); for (unsigned int i = 0; i < 2; i++) { @@ -865,7 +1028,6 @@ void initBloom() void initObjects() { Object obj; - //ustalanie pozycji slonc (lightPos) glm::mat4 sunModelMatrix = glm::mat4(1.0f); sunModelMatrix = glm::translate(sunModelMatrix, sunPos); sunModelMatrix = glm::scale(sunModelMatrix, glm::vec3(3.0f, 3.0f, 3.0f)); @@ -876,6 +1038,7 @@ void initObjects() obj.textureID = sunTexture; obj.shaderID = programSun; obj.color = glm::vec3(3.5f, 3.8f, 3.8f); + obj.isDynamic = false; objects.push_back(obj); glm::mat4 sunModelMatrix2 = glm::mat4(1.0f); @@ -884,6 +1047,7 @@ void initObjects() obj.modelM = sunModelMatrix2; obj.invModelM = glm::inverse(sunModelMatrix2); obj.color = glm::vec3(0.9f, 0.9f, 2.0f); + obj.isDynamic = false; objects.push_back(obj); glm::mat4 earthModelMatrix; @@ -897,6 +1061,7 @@ void initObjects() planet.textureID = earthTexture; planet.shaderID = programTex; planet.color = glm::vec3(1.0f); + planet.isDynamic = false; objects.push_back(planet); glm::mat4 marsModelMatrix; @@ -908,6 +1073,7 @@ void initObjects() planet.textureID = marsTexture; planet.shaderID = programTex; planet.color = glm::vec3(1.0f); + planet.isDynamic = false; objects.push_back(planet); Object moon; @@ -918,9 +1084,10 @@ void initObjects() moon.textureID = moonTexture; moon.shaderID = programTex; moon.color = glm::vec3(1.0f); + moon.isDynamic = false; objects.push_back(moon); - glm::mat4 crewmateModelMatrix; + glm::mat4 crewmateModelMatrix = glm::translate(glm::vec3(0, 1, 1)) * glm::rotate(lastTime / 10, glm::vec3(1, 0, 1)) * glm::scale(glm::vec3(0.01)); Object crewmateObj; crewmateObj.name = "Space Humster"; @@ -929,9 +1096,10 @@ void initObjects() crewmateObj.modelParent = crewmate; crewmateObj.shaderID = programNormal; crewmateObj.color = glm::vec3(1.0f); + crewmateObj.isDynamic = true; objects.push_back(crewmateObj); - glm::mat4 shipModelMatrix; + glm::mat4 shipModelMatrix = glm::translate(cameraPos + cameraDir * 0.7f + glm::vec3(0, -0.25f, 0)) * glm::rotate(-cameraAngle + glm::radians(90.0f), glm::vec3(0, 1, 0)) * glm::scale(glm::vec3(0.0001f));; Object ship; ship.name = "Corvette"; @@ -940,8 +1108,8 @@ void initObjects() ship.modelParent = corvette; ship.shaderID = programNormal; ship.color = glm::vec3(1.0f); + ship.isDynamic = true; objects.push_back(ship); - } void init() @@ -964,7 +1132,6 @@ void init() glUniform2f(glGetUniformLocation(programBloom, "screenSize"), 1.0f / SCR_WIDTH, 1.0f / SCR_HEIGHT); glUseProgram(0); - corvette = std::make_shared("models/Corvette-F3.obj"); crewmate = std::make_shared("models/space_humster.obj"); asteroid = std::make_shared("models/Asteroid_X.obj"); @@ -978,11 +1145,11 @@ void init() marsTexture = Core::LoadTexture("models/textures/Mars/2k_mars.png"); skyboxTexture = loadCubemap(faces); - initParticles(); initBloom(); initObjects(); initAsteroids(); + initPhysics(); Light l1; l1.position = sunPos; @@ -1012,7 +1179,14 @@ void init() void shutdown() { - + shaderLoader.DeleteProgram(programSun); + shaderLoader.DeleteProgram(programParticle); + shaderLoader.DeleteProgram(programNormal); + shaderLoader.DeleteProgram(programAsteroid); + shaderLoader.DeleteProgram(programTex); + shaderLoader.DeleteProgram(programBloom); + shaderLoader.DeleteProgram(programBlur); + shaderLoader.DeleteProgram(programSkybox); } void onReshape(int width, int height) @@ -1034,25 +1208,17 @@ int main(int argc, char** argv) SCR_WIDTH = screenWidth; SCR_HEIGHT = screenHeight; glutInit(&argc, argv); - //glutSetOption(GLUT_MULTISAMPLE, 8); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); - //glEnable(GL_MULTISAMPLE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glutInitWindowPosition(0, 0); glutInitWindowSize(SCR_WIDTH, SCR_HEIGHT); - //glutCreateWindow("GRK-PROJECT WIP"); winId = glutCreateWindow("GRK-PROJECT WIP"); glutFullScreen(); glewInit(); - init(); glutKeyboardFunc(keyboard); - //to sprawia, że obiekty ukryte przed kamerą nie są renderowane - //glEnable(GL_CULL_FACE); - //glCullFace(GL_BACK); - //glFrontFace(GL_CW); glutDisplayFunc(renderScene); glutIdleFunc(idle);