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);