void Boid::update(void) { cohesion(owner->getBoids()); seperation(owner->getBoids()); alignment(owner->getBoids()); // Store the current position so we can use verlet integration lateron: lastPosition.x = position.x; lastPosition.y = position.y; // Basic motion: position.add(velocity); // Flip the velocity if the screenbounds are reached (yet to impletement resolveLocation) if(position.x >= SCREEN_WIDTH || position.x <= 0) velocity.x *= -1; if(position.y >= SCREEN_HEIGHT || position.y <= 0) velocity.y *= -1; }
void Player::resolveChunkIntersection(const Manifold& manifold, const AABBCollider& blockCollider) { //transform.translate(manifold.seperationVector); //std::cout << "(" << manifold.seperationVector.x << ", " << manifold.seperationVector.y << ", " << manifold.seperationVector.z << ")" << std::endl; glm::vec3 directionOfMovement(m_currentPosition - m_lastPosition); //std::cout << "(" << directionOfMovement.x << ", " << directionOfMovement.y << ", " << directionOfMovement.z << ")" << std::endl; glm::vec3 seperation(manifold.seperationVector); // Add displacement to axes that caused the collision bool collideX = false; if (directionOfMovement.x != 0) { glm::vec3 playerMinPoint(m_lastPosition.x - 0.5f + directionOfMovement.x, m_lastPosition.y - 1.0f, m_lastPosition.z - 0.5f); glm::vec3 playerMaxPoint(m_lastPosition.x + 0.5f + directionOfMovement.x, m_lastPosition.y + 1.0f, m_lastPosition.z + 0.5f); AABBCollider playerCollider(playerMinPoint, playerMaxPoint); if (AABBCollider::checkCollision(playerCollider, blockCollider)) { collideX = true; } } bool collideY = false; if (directionOfMovement.y != 0) { glm::vec3 playerMinPoint(m_lastPosition.x - 0.5f, m_lastPosition.y - 1.0f + directionOfMovement.y, m_lastPosition.z - 0.5f); glm::vec3 playerMaxPoint(m_lastPosition.x + 0.5f, m_lastPosition.y + 1.0f + directionOfMovement.y, m_lastPosition.z + 0.5f); AABBCollider playerCollider(playerMinPoint, playerMaxPoint); if (AABBCollider::checkCollision(playerCollider, blockCollider)) { collideY = true; } } bool collideZ = false; if (directionOfMovement.z != 0) { glm::vec3 playerMinPoint(m_lastPosition.x - 0.5f, m_lastPosition.y - 1.0f, m_lastPosition.z - 0.5f + directionOfMovement.z); glm::vec3 playerMaxPoint(m_lastPosition.x + 0.5f, m_lastPosition.y + 1.0f, m_lastPosition.z + 0.5f + directionOfMovement.z); AABBCollider playerCollider(playerMinPoint, playerMaxPoint); if (AABBCollider::checkCollision(playerCollider, blockCollider)) { collideZ = true; } } //// Only displace in the axes the player is moving in //if (abs(directionOfMovement.x) == 0) { // seperation.x = 0; //} //if (abs(directionOfMovement.y) == 0) { // seperation.y = 0; //} //if (abs(directionOfMovement.z) == 0) { // seperation.z = 0; //} // Only displace in the axes that caused the collision if (collideX || collideY || collideZ) { if (!collideX) { seperation.x = 0; } if (!collideY) { seperation.y = 0; } if (!collideZ) { seperation.z = 0; } } // Choose the minimum axis float32 depth = 0; int32 axis = 0; for (int32 i = 0; i < 3; i++) { if (depth == 0) { depth = seperation[i]; axis = i; } else { if (seperation[i] != 0 && (abs(seperation[i]) < abs(depth))) { depth = seperation[i]; axis = i; } } } for (int32 i = 0; i < 3; i++) { if (i == axis) { seperation[i] = depth; } else { seperation[i] = 0; } } //if (abs(seperation.x) < abs(seperation.y)) { // if (abs(seperation.x) < abs(seperation.z)) { // // min is x // seperation.y = 0; // seperation.z = 0; // } // else { // // min is z // seperation.y = 0; // seperation.x = 0; // } //} //else { // if (abs(seperation.y) < abs(seperation.z)) { // // min is y // seperation.x = 0; // seperation.z = 0; // } // else { // // min is z // seperation.y = 0; // seperation.x = 0; // } //} //glm::vec3 displacement = glm::proj(seperation, -glm::normalize(directionOfMovement)); glm::vec3 displacement = seperation; //std::cout << "(" << displacement.x << ", " << displacement.y << ", " << displacement.z << ")" << std::endl; // And just a hint of bias const static float32 bias = 0.0005f; if (abs(seperation.x) > 0) { displacement.x += signbit(seperation.x) ? -bias : bias; } if (abs(seperation.y) > 0) { displacement.y += signbit(seperation.y) ? -bias : bias; } if (abs(seperation.z) > 0) { displacement.z += signbit(seperation.z) ? -bias : bias; } //m_lastPosition = m_currentPosition; transform.translate(displacement); m_currentPosition = glm::vec3(transform.xPos, transform.yPos, transform.zPos); if (displacement.y > 0) { // Stop! m_velocityY = 0; //m_glueToGround = true; // Just a hint of bias //transform.translate(0, 0.0005f, 0); } // If im moving in the positive x //if (directionOfMovement.x > 0) { // //} //else if (directionOfMovement.x < 0) { // //} //else { // displacement.x = 0; //} // //if (manifold.seperationVector.x == 0 && manifold.seperationVector.z == 0 && manifold.seperationVector.y > 0) { // m_glueToGround = true; // // // Stop! // m_velocityY = 0; // transform.translate(0, 0.0005f, 0); // HACK WARNING, Adding a bias here so I can get it to work for the demo //} }