diff --git a/Exp1/ModelWorld.cpp b/Exp1/ModelWorld.cpp
index 9b33451..3d7ec9c 100644
--- a/Exp1/ModelWorld.cpp
+++ b/Exp1/ModelWorld.cpp
@@ -14,16 +14,6 @@ ModelWorld::ModelWorld()
camera.Position = { 0,10,20 };
}
-void ModelWorld::logicalTick(float deltaTime)
-{
- World::logicalTick(deltaTime);
-}
-
-void ModelWorld::rendererTick(float deltaTime)
-{
- World::rendererTick(deltaTime);
-}
-
void ModelWorld::cursorPosCallback(GLFWwindow* window, double xpos, double ypos)
{
static bool firstMouse = true;
diff --git a/Exp1/ModelWorld.h b/Exp1/ModelWorld.h
index 4709891..1e6bc2c 100644
--- a/Exp1/ModelWorld.h
+++ b/Exp1/ModelWorld.h
@@ -5,8 +5,6 @@ class ModelWorld : public World
{
public:
ModelWorld();
- void logicalTick(float deltaTime) override;
- void rendererTick(float deltaTime) override;
virtual void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) override;
virtual void scrollCallback(GLFWwindow* window, double xoffset, double yoffset) override;
virtual void processInput(GLFWwindow* window, float deltaTime) override;
diff --git a/Exp2/Exp2.vcxproj b/Exp2/Exp2.vcxproj
index ef5fea0..77f3cde 100644
--- a/Exp2/Exp2.vcxproj
+++ b/Exp2/Exp2.vcxproj
@@ -150,6 +150,9 @@
+
+
+
diff --git a/Exp2/Exp2.vcxproj.filters b/Exp2/Exp2.vcxproj.filters
index d6ddcad..c260086 100644
--- a/Exp2/Exp2.vcxproj.filters
+++ b/Exp2/Exp2.vcxproj.filters
@@ -27,4 +27,7 @@
头文件
+
+
+
\ No newline at end of file
diff --git a/Exp2/ModelWorld.cpp b/Exp2/ModelWorld.cpp
index 8ae6712..6d1f0fc 100644
--- a/Exp2/ModelWorld.cpp
+++ b/Exp2/ModelWorld.cpp
@@ -6,23 +6,12 @@ ModelWorld::ModelWorld()
light.lightDirection = glm::normalize(glm::vec3((cos(lightPitch) * cos(lightYaw)), (sin(lightPitch)), (cos(lightPitch) * sin(lightYaw))));
light.radiance = 3.f * lightColor;
RenderingSystem::instance().exposure = 0.45f;
+ camera.Position = { 0,5,10 };
model = std::make_shared("Models/David_Brown_25D_tractor_SF/David_Brown_25D_tractor_SF.obj");
model->setPosition({ 0,0,0 });
model->setScale(glm::vec3(0.5));
addActor(model);
-
- camera.Position = { 0,5,10 };
-}
-
-void ModelWorld::logicalTick(float deltaTime)
-{
- World::logicalTick(deltaTime);
-}
-
-void ModelWorld::rendererTick(float deltaTime)
-{
- World::rendererTick(deltaTime);
}
void ModelWorld::cursorPosCallback(GLFWwindow* window, double xpos, double ypos)
@@ -74,13 +63,14 @@ void ModelWorld::processInput(GLFWwindow* window, float deltaTime)
if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS)
camera.processKeyboard(DOWN, deltaTime);
- float speed = 0.1;
+ float speed = 10;
+ float d = speed * deltaTime;
if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS)
- model->setPosition(model->getPosition() + glm::vec3(0, 0, -speed));
+ model->setPosition(model->getPosition() + glm::vec3(0, 0, -d));
if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS)
- model->setPosition(model->getPosition() + glm::vec3(0, 0, speed));
+ model->setPosition(model->getPosition() + glm::vec3(0, 0, d));
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS)
- model->setPosition(model->getPosition() + glm::vec3(-speed, 0, 0));
+ model->setPosition(model->getPosition() + glm::vec3(-d, 0, 0));
if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS)
- model->setPosition(model->getPosition() + glm::vec3(speed, 0, 0));
+ model->setPosition(model->getPosition() + glm::vec3(d, 0, 0));
}
diff --git a/Exp2/ModelWorld.h b/Exp2/ModelWorld.h
index 4709891..1e6bc2c 100644
--- a/Exp2/ModelWorld.h
+++ b/Exp2/ModelWorld.h
@@ -5,8 +5,6 @@ class ModelWorld : public World
{
public:
ModelWorld();
- void logicalTick(float deltaTime) override;
- void rendererTick(float deltaTime) override;
virtual void cursorPosCallback(GLFWwindow* window, double xpos, double ypos) override;
virtual void scrollCallback(GLFWwindow* window, double xoffset, double yoffset) override;
virtual void processInput(GLFWwindow* window, float deltaTime) override;
diff --git a/Exp3/ParticleWorld.cpp b/Exp3/ParticleWorld.cpp
index 7b76c2c..75fe708 100644
--- a/Exp3/ParticleWorld.cpp
+++ b/Exp3/ParticleWorld.cpp
@@ -42,18 +42,18 @@ ParticleWorld::ParticleWorld()
}
{
- planet = std::make_shared(100);
- planet->setPosition({ -10,0,0 });
- planet->setFixed(true);
+ star = std::make_shared(100);
+ star->setPosition({ -10,0,0 });
+ star->setFixed(true);
- auto p1 = std::make_shared(1);
- p1->setPosition({ -15,0,0 });
- p1->setSpeed(glm::vec3(0, 0, 1) * glm::sqrt(G * planet->getMass() / glm::distance(planet->getPosition(), p1->getPosition())));
+ auto p = std::make_shared(1);
+ p->setPosition({ -15,0,0 });
+ p->setSpeed(glm::vec3(0, 0, 1) * glm::sqrt(G * star->getMass() / glm::distance(star->getPosition(), p->getPosition())));
- addActor(planet);
- addActor(p1);
+ addActor(star);
+ addActor(p);
- physicsManager.addGravitation(planet, p1, G);
+ physicsManager.addGravitation(star, p, G);
}
}
@@ -75,18 +75,6 @@ void ParticleWorld::rendererTick(float deltaTime)
}
else iter++;
}
-
- if (addNewParticle)
- {
- addNewParticle = false;
-
- auto p = std::make_shared(1);
- p->setPosition(camera.Position + glm::vec3(0, -0.3, 0));
- p->setSpeed(5.f * glm::normalize(camera.Front));
- addActor(p);
- physicsManager.addGravitation(planet, p, G);
- particles.push_back(p);
- }
}
void ParticleWorld::cursorPosCallback(GLFWwindow* window, double xpos, double ypos)
@@ -114,7 +102,14 @@ void ParticleWorld::cursorPosCallback(GLFWwindow* window, double xpos, double yp
void ParticleWorld::mouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
- addNewParticle = true;
+ {
+ auto p = std::make_shared(1);
+ p->setPosition(camera.Position + glm::vec3(0, -0.3, 0));
+ p->setSpeed(5.f * glm::normalize(camera.Front));
+ addActor(p);
+ physicsManager.addGravitation(star, p, G);
+ particles.push_back(p);
+ }
}
void ParticleWorld::scrollCallback(GLFWwindow* window, double xoffset, double yoffset)
diff --git a/Exp3/ParticleWorld.h b/Exp3/ParticleWorld.h
index 5b283af..0a0769e 100644
--- a/Exp3/ParticleWorld.h
+++ b/Exp3/ParticleWorld.h
@@ -13,13 +13,11 @@ public:
private:
std::vector> particles;
- std::shared_ptr planet;
+ std::shared_ptr star;
float G = 1;
glm::vec3 lightColor = glm::normalize(glm::vec3(0.7529, 0.7450, 0.6784));
float lightYaw = glm::radians(80.f);
float lightPitch = glm::radians(105.f);
-
- bool addNewParticle = false;
};
diff --git a/ToyEngine/ToyEngine.vcxproj b/ToyEngine/ToyEngine.vcxproj
index ea63187..49d126d 100644
--- a/ToyEngine/ToyEngine.vcxproj
+++ b/ToyEngine/ToyEngine.vcxproj
@@ -59,25 +59,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
16.0
diff --git a/ToyEngine/ToyEngine.vcxproj.filters b/ToyEngine/ToyEngine.vcxproj.filters
index 0be9677..840af3a 100644
--- a/ToyEngine/ToyEngine.vcxproj.filters
+++ b/ToyEngine/ToyEngine.vcxproj.filters
@@ -127,62 +127,63 @@
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
- Shaders
-
-
+
+
Shaders
-
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
Shaders
diff --git a/ToyEngine/src/MainWindow.cpp b/ToyEngine/src/MainWindow.cpp
index 38f8a82..3a61913 100644
--- a/ToyEngine/src/MainWindow.cpp
+++ b/ToyEngine/src/MainWindow.cpp
@@ -73,9 +73,6 @@ int MainWindow::exec(std::unique_ptr world_)
void MainWindow::processInput(GLFWwindow* window, float deltaTime)
{
- if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
- glfwSetWindowShouldClose(window, true);
-
world->processInput(window, deltaTime);
}
@@ -96,6 +93,8 @@ void MainWindow::scrollCallback(GLFWwindow* window, double xoffset, double yoffs
void MainWindow::keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
+ if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
+ glfwSetWindowShouldClose(window, true);
if (key == GLFW_KEY_TAB && action == GLFW_PRESS)
RenderingSystem::instance().setShowDebug(!RenderingSystem::instance().getShowDebug());
world->keyCallback(window, key, scancode, action, mods);
diff --git a/ToyEngine/src/Mesh.h b/ToyEngine/src/Mesh.h
index 14c9950..a3f8027 100644
--- a/ToyEngine/src/Mesh.h
+++ b/ToyEngine/src/Mesh.h
@@ -32,12 +32,12 @@ public:
GLuint textureNormal = 0;
glm::vec3 baseColor;
glm::vec2 metallicRoughness;
- unsigned int VAO;
Mesh(GladGLContext* gl, const std::vector& vertices, const std::vector& indices, const glm::mat4& model = glm::mat4(1));
void draw(Shader& shader);
void setupMesh();
private:
GladGLContext* gl;
+ unsigned int VAO;
unsigned int VBO, EBO;
};
\ No newline at end of file
diff --git a/ToyEngine/src/Model.cpp b/ToyEngine/src/Model.cpp
index 75d7642..3d0f372 100644
--- a/ToyEngine/src/Model.cpp
+++ b/ToyEngine/src/Model.cpp
@@ -60,7 +60,7 @@ Model Model::createSphere(GladGLContext* gl, const glm::vec3& baseColor, const g
mesh->drawMode = GL_TRIANGLE_STRIP;
mesh->baseColor = baseColor;
mesh->metallicRoughness = metallicRoughness;
- sphere.meshes.emplace_back(std::move(mesh));
+ sphere.meshes.emplace_back(std::make_pair(std::move(mesh), glm::mat4(1)));
return sphere;
}
@@ -79,17 +79,13 @@ Model::Model(GladGLContext* gl, std::string const& path)
void Model::draw(Shader& shader)
{
for (unsigned int i = 0; i < meshes.size(); i++)
- meshes[i]->draw(shader);
+ meshes[i].first->draw(shader);
}
void Model::setTransform(const glm::mat4& trans)
{
- auto inverse = glm::inverse(transform);
- transform = trans;
for (auto& mesh : meshes)
- mesh->model = transform * inverse * mesh->model;
- minPos = transform * inverse * glm::vec4(minPos, 1);
- maxPos = transform * inverse * glm::vec4(maxPos, 1);
+ mesh.first->model = trans * mesh.second;
}
std::pair Model::getAABB()
@@ -110,23 +106,20 @@ void Model::loadModel(std::string const& path)
return;
}
- aiMatrix4x4 transform;
- //aiMatrix4x4::Scaling(aiVector3D(10), transform);
- //aiMatrix4x4::Rotation(glm::radians(-90.f), { 1,0,0 }, transform);
- processNode(scene->mRootNode, scene, transform * scene->mRootNode->mTransformation);
+ processNode(scene->mRootNode, scene, scene->mRootNode->mTransformation);
}
void Model::processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4)
{
for (unsigned int i = 0; i < node->mNumMeshes; i++)
- if (auto mesh = processMesh(scene->mMeshes[node->mMeshes[i]], scene, mat4))
+ if (auto mesh = processMesh(scene->mMeshes[node->mMeshes[i]], scene, mat4); mesh.first)
meshes.emplace_back(std::move(mesh));
for (unsigned int i = 0; i < node->mNumChildren; i++)
processNode(node->mChildren[i], scene, mat4 * node->mChildren[i]->mTransformation);
}
-std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model)
+std::pair, glm::mat4> Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model)
{
glm::mat4 mat4 = glm::transpose(glm::make_mat4((float*)&model));
@@ -148,7 +141,7 @@ std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiM
indices.insert(indices.end(), face->mIndices, face->mIndices + face->mNumIndices);
if (vertices.empty() || indices.empty())
- return nullptr;
+ return { nullptr, mat4 };
extractBoneWeightForVertices(vertices, mesh, scene);
auto meshPtr = std::make_unique(gl, vertices, indices, mat4);
@@ -177,8 +170,7 @@ std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiM
{
}
- return meshPtr;
-
+ return std::make_pair(std::move(meshPtr), mat4);
}
diff --git a/ToyEngine/src/Model.h b/ToyEngine/src/Model.h
index 65d99be..551ab3a 100644
--- a/ToyEngine/src/Model.h
+++ b/ToyEngine/src/Model.h
@@ -21,7 +21,7 @@ class Model
{
public:
glm::mat4 transform = glm::mat4(1);
- std::vector> meshes;
+ std::vector, glm::mat4>> meshes;
std::map boneInfoMap;
int boneCount = 0;
@@ -40,7 +40,7 @@ private:
void loadModel(std::string const& path);
void processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4 = aiMatrix4x4());
- std::unique_ptr processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model);
+ std::pair, glm::mat4> processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model);
GLuint loadMaterialTextures(aiMaterial* mat, aiTextureType type);
void extractBoneWeightForVertices(std::vector& vertices, aiMesh* mesh, const aiScene* scene);
};
\ No newline at end of file
diff --git a/ToyEngine/src/Particle.cpp b/ToyEngine/src/Particle.cpp
index 695f5c6..6aea6f5 100644
--- a/ToyEngine/src/Particle.cpp
+++ b/ToyEngine/src/Particle.cpp
@@ -19,6 +19,7 @@ Particle::Particle(float mass, const std::string& path)
void Particle::logicalTick(float deltaTime)
{
+ Actor::logicalTick(deltaTime);
resultantForce = glm::vec3(0);
for (std::lock_guard lk(forcesMutex); auto & force : forces)
resultantForce += force->value;
@@ -29,8 +30,8 @@ void Particle::logicalTick(float deltaTime)
}
else
{
- //auto pos = getPosition() + speed * deltaTime + 0.5f * resultantForce / mass * deltaTime * deltaTime;
- speed += resultantForce / mass * deltaTime;
+ acceleration = resultantForce / mass;
+ speed += acceleration * deltaTime;
auto pos = getPosition() + speed * deltaTime;
setPosition(pos);
}
@@ -45,12 +46,10 @@ void Particle::draw(const RenderPassContext& context, Shader& shader)
static unsigned int vbo;
if (vao == 0)
{
- float vertices[] = {
- // positions
+ float vertices[] = {
0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f,
};
- // setup plane VAO
gl->GenVertexArrays(1, &vao);
gl->GenBuffers(1, &vbo);
gl->BindVertexArray(vao);
@@ -64,7 +63,7 @@ void Particle::draw(const RenderPassContext& context, Shader& shader)
gl->DepthMask(false);
debugShader.setUniformValue("projection", *context.projection);
debugShader.setUniformValue("view", *context.view);
- glm::mat4 modelMatrix = glm::translate(glm::mat4(1), getPosition());// *glm::scale(glm::mat4(1), glm::vec3(glm::abs(resultantForce / mass)));
+ glm::mat4 modelMatrix = glm::translate(glm::mat4(1), getPosition());
gl->BindVertexArray(vao);
for (std::lock_guard lk(forcesMutex); auto & force : forces)
{